From f96079f4f9b579f17ae584a3cb722f023f1c958e Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 2 Apr 2015 14:43:15 -0700 Subject: [PATCH 1/8] fixed the getViewFUrstum warning in DEBUG mode --- interface/src/Application.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b19a7850c2..e9ef967f56 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2615,7 +2615,12 @@ glm::vec3 Application::getSunDirection() { return skyStage->getSunLight()->getDirection(); } +// FIXME, preprocessor guard this check to occur only in DEBUG builds +static QThread * activeRenderingThread = nullptr; + void Application::updateShadowMap() { + activeRenderingThread = QThread::currentThread(); + PerformanceTimer perfTimer("shadowMap"); QOpenGLFramebufferObject* fbo = DependencyManager::get()->getShadowFramebufferObject(); fbo->bind(); @@ -2765,6 +2770,7 @@ void Application::updateShadowMap() { fbo->release(); glViewport(0, 0, _glWidget->getDeviceWidth(), _glWidget->getDeviceHeight()); + activeRenderingThread = nullptr; } const GLfloat WORLD_AMBIENT_COLOR[] = { 0.525f, 0.525f, 0.6f }; @@ -2825,9 +2831,6 @@ QImage Application::renderAvatarBillboard() { return image; } -// FIXME, preprocessor guard this check to occur only in DEBUG builds -static QThread * activeRenderingThread = nullptr; - ViewFrustum* Application::getViewFrustum() { #ifdef DEBUG if (QThread::currentThread() == activeRenderingThread) { From 6f5c411a46098c208875534a5efb916351c271c3 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 3 Apr 2015 10:32:20 -0700 Subject: [PATCH 2/8] Fixing a few issues and syntax, trying to understand why the shadows are not rendering correctly --- .../src/RenderableModelEntityItem.cpp | 3 +- libraries/gpu/src/gpu/GLBackendShader.cpp | 2 +- libraries/render-utils/src/Model.cpp | 39 +++++++++++++++---- libraries/render-utils/src/Model.h | 6 ++- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index bf5ce62ff8..5618d66114 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -169,7 +169,8 @@ void RenderableModelEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("model->render"); // filter out if not needed to render if (args && (args->_renderMode == RenderArgs::SHADOW_RENDER_MODE)) { - if (movingOrAnimating) { + // if (movingOrAnimating) { + { _model->renderInScene(alpha, args); } } else { diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index bcfdc4f36c..3f794575fe 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -104,7 +104,7 @@ void makeBindings(GLBackend::GLShader* shader) { loc = glGetUniformBlockIndex(glprogram, "transformCameraBuffer"); if (loc >= 0) { glUniformBlockBinding(glprogram, loc, gpu::TRANSFORM_CAMERA_SLOT); - shader->_transformCameraSlot = gpu::TRANSFORM_OBJECT_SLOT; + shader->_transformCameraSlot = gpu::TRANSFORM_CAMERA_SLOT; } #endif } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index d04972ebee..f005234f21 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -121,18 +121,20 @@ Model::Locations Model::_normalMapLocations; Model::Locations Model::_specularMapLocations; Model::Locations Model::_normalSpecularMapLocations; Model::Locations Model::_translucentLocations; +Model::Locations Model::_shadowLocations; Model::Locations Model::_lightmapLocations; Model::Locations Model::_lightmapNormalMapLocations; Model::Locations Model::_lightmapSpecularMapLocations; Model::Locations Model::_lightmapNormalSpecularMapLocations; + Model::SkinLocations Model::_skinLocations; Model::SkinLocations Model::_skinNormalMapLocations; Model::SkinLocations Model::_skinSpecularMapLocations; Model::SkinLocations Model::_skinNormalSpecularMapLocations; -Model::SkinLocations Model::_skinShadowLocations; Model::SkinLocations Model::_skinTranslucentLocations; +Model::SkinLocations Model::_skinShadowLocations; AbstractViewStateInterface* Model::_viewState = NULL; @@ -284,8 +286,7 @@ void Model::init() { _shadowProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelShadowVertex, modelShadowPixel)); makeResult = gpu::Shader::makeProgram(*_shadowProgram, slotBindings); - Model::Locations tempShadowLoc; - initProgram(_shadowProgram, tempShadowLoc); + initProgram(_shadowProgram, _shadowLocations); _lightmapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapVertex, modelLightmapPixel)); makeResult = gpu::Shader::makeProgram(*_lightmapProgram, slotBindings); @@ -656,7 +657,9 @@ bool Model::render(float alpha, RenderMode mode, RenderArgs* args) { renderSetup(args); return renderCore(alpha, mode, args); } - + +#define WANT_DEBUG_MESHBOXES + bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { PROFILE_RANGE(__FUNCTION__); if (!_viewState) { @@ -678,7 +681,14 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { if (_transforms.empty()) { _transforms.push_back(Transform()); } - _transforms[0] = _viewState->getViewTransform(); + + if (args && args->_viewFrustum) { + _transforms[0].setTranslation(args->_viewFrustum->getPosition()); + _transforms[0].setRotation(args->_viewFrustum->getOrientation()); + } else { + _transforms[0] = _viewState->getViewTransform(); + } + // apply entity translation offset to the viewTransform in one go (it's a preTranslate because viewTransform goes from world to eye space) _transforms[0].preTranslate(-_translation); @@ -694,6 +704,9 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { GLBATCH(glCullFace)(GL_FRONT); } } + GLBATCH(glEnable)(GL_DEPTH_TEST); + GLBATCH(glDepthFunc)(GL_LEQUAL); + GLBATCH(glDepthMask)(true); // render opaque meshes with alpha testing @@ -1710,14 +1723,22 @@ void Model::startScene(RenderArgs::RenderSide renderSide) { } } -void Model::setupBatchTransform(gpu::Batch& batch) { +void Model::setupBatchTransform(gpu::Batch& batch, RenderArgs* args) { // Capture the view matrix once for the rendering of this model if (_transforms.empty()) { _transforms.push_back(Transform()); } - _transforms[0] = _viewState->getViewTransform(); + + if (args && args->_viewFrustum) { + _transforms[0].setTranslation(args->_viewFrustum->getPosition()); + _transforms[0].setRotation(args->_viewFrustum->getOrientation()); + } else { + _transforms[0] = _viewState->getViewTransform(); + } + _transforms[0].preTranslate(-_translation); + batch.setViewTransform(_transforms[0]); } @@ -1762,6 +1783,7 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { } // render opaque meshes with alpha testing + GLBATCH(glDepthMask)(true); GLBATCH(glDisable)(GL_BLEND); GLBATCH(glEnable)(GL_ALPHA_TEST); @@ -2286,6 +2308,7 @@ void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, f skinLocations = &_skinLocations; if (mode == SHADOW_RENDER_MODE) { program = _shadowProgram; + locations = &_shadowLocations; skinProgram = _skinShadowProgram; skinLocations = &_skinShadowLocations; } else if (translucent && alphaThreshold == 0.0f) { @@ -2376,7 +2399,7 @@ int Model::renderMeshesForModelsInScene(gpu::Batch& batch, RenderMode mode, bool pickPrograms(batch, mode, translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, args, locations, skinLocations); pickProgramsNeeded = false; } - model->setupBatchTransform(batch); + model->setupBatchTransform(batch, args); meshPartsRendered += model->renderMeshesFromList(list, batch, mode, translucent, alphaThreshold, args, locations, skinLocations); } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 5dbd0b03c2..f1bbf151cd 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -357,6 +357,7 @@ private: static Locations _specularMapLocations; static Locations _normalSpecularMapLocations; static Locations _translucentLocations; + static Locations _shadowLocations; static Locations _lightmapLocations; static Locations _lightmapNormalMapLocations; @@ -377,8 +378,9 @@ private: static SkinLocations _skinNormalMapLocations; static SkinLocations _skinSpecularMapLocations; static SkinLocations _skinNormalSpecularMapLocations; - static SkinLocations _skinShadowLocations; static SkinLocations _skinTranslucentLocations; + static SkinLocations _skinShadowLocations; + static void initSkinProgram(ProgramObject& program, SkinLocations& locations); static void initSkinProgram(gpu::ShaderPointer& program, SkinLocations& locations); @@ -463,7 +465,7 @@ private: bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args = NULL, bool forceRenderMeshes = false); - void setupBatchTransform(gpu::Batch& batch); + void setupBatchTransform(gpu::Batch& batch, RenderArgs* args); QVector* pickMeshList(bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned); int renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderMode mode, bool translucent, float alphaThreshold, From 423434af108a0ae4340a35e40ebc834055032f9b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 3 Apr 2015 12:34:30 -0700 Subject: [PATCH 3/8] FInd one of the issue with shadows for avatars --- interface/src/Application.cpp | 4 ++++ interface/src/avatar/Avatar.cpp | 9 ++++++-- interface/src/avatar/MyAvatar.cpp | 31 +++++++++++++++------------- libraries/render-utils/src/Model.cpp | 12 +++++++++-- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7582444305..4bf9b791fa 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2716,6 +2716,10 @@ void Application::updateShadowMap() { glLoadIdentity(); glOrtho(minima.x, maxima.x, minima.y, maxima.y, -maxima.z, -minima.z); + glm::mat4 projAgain; + glGetFloatv(GL_PROJECTION_MATRIX, (GLfloat*)&projAgain); + + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 3ea4723801..13db6d28dd 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -337,8 +337,13 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool // simple frustum check float boundingRadius = getBillboardSize(); - ViewFrustum* frustum = (renderMode == Avatar::SHADOW_RENDER_MODE) ? - Application::getInstance()->getShadowViewFrustum() : Application::getInstance()->getDisplayViewFrustum(); + + ViewFrustum* frustum = nullptr; + if (renderMode == Avatar::SHADOW_RENDER_MODE) { + frustum = Application::getInstance()->getShadowViewFrustum(); + } else { + frustum = Application::getInstance()->getDisplayViewFrustum(); + } if (frustum->sphereInFrustum(getPosition(), boundingRadius) == ViewFrustum::OUTSIDE) { return; } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f92523c58f..e4eb6e7869 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1005,22 +1005,25 @@ void MyAvatar::renderBody(ViewFrustum* renderFrustum, RenderMode renderMode, boo Camera *camera = Application::getInstance()->getCamera(); const glm::vec3 cameraPos = camera->getPosition(); - // Set near clip distance according to skeleton model dimensions if first person and there is no separate head model. - if (shouldRenderHead(cameraPos, renderMode) || !getHead()->getFaceModel().getURL().isEmpty()) { - renderFrustum->setNearClip(DEFAULT_NEAR_CLIP); - } else { - float clipDistance = _skeletonModel.getHeadClipDistance(); - if (OculusManager::isConnected()) { - // If avatar is horizontally in front of camera, increase clip distance by the amount it is in front. - glm::vec3 cameraToAvatar = _position - cameraPos; - cameraToAvatar.y = 0.0f; - glm::vec3 cameraLookAt = camera->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f); - float headOffset = glm::dot(cameraLookAt, cameraToAvatar); - if (headOffset > 0) { - clipDistance += headOffset; + // Only tweak the frustum near far if it's not shadow + if (renderMode != SHADOW_RENDER_MODE) { + // Set near clip distance according to skeleton model dimensions if first person and there is no separate head model. + if (shouldRenderHead(cameraPos, renderMode) || !getHead()->getFaceModel().getURL().isEmpty()) { + renderFrustum->setNearClip(DEFAULT_NEAR_CLIP); + } else { + float clipDistance = _skeletonModel.getHeadClipDistance(); + if (OculusManager::isConnected()) { + // If avatar is horizontally in front of camera, increase clip distance by the amount it is in front. + glm::vec3 cameraToAvatar = _position - cameraPos; + cameraToAvatar.y = 0.0f; + glm::vec3 cameraLookAt = camera->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f); + float headOffset = glm::dot(cameraLookAt, cameraToAvatar); + if (headOffset > 0) { + clipDistance += headOffset; + } } + renderFrustum->setNearClip(clipDistance); } - renderFrustum->setNearClip(clipDistance); } // Render the body's voxels and head diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index f005234f21..0a09f65e9f 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -673,7 +673,11 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { // Setup the projection matrix if (args && args->_viewFrustum) { glm::mat4 proj; - args->_viewFrustum->evalProjectionMatrix(proj); + if (mode == RenderArgs::SHADOW_RENDER_MODE) { + args->_viewFrustum->evalProjectionMatrix(proj); + } else { + args->_viewFrustum->evalProjectionMatrix(proj); + } batch.setProjectionTransform(proj); } @@ -1759,7 +1763,11 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { if (args) { glm::mat4 proj; - args->_viewFrustum->evalProjectionMatrix(proj); + if (mode == RenderArgs::SHADOW_RENDER_MODE) { + args->_viewFrustum->evalProjectionMatrix(proj); + } else { + args->_viewFrustum->evalProjectionMatrix(proj); + } gpu::Batch batch; batch.setProjectionTransform(proj); backend.render(batch); From b8db0ff2d7736b667c3d4804e22ec8bc4d4e0dc9 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 3 Apr 2015 17:05:08 -0700 Subject: [PATCH 4/8] getting ready for pr for a few syntax issues --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 3 +-- libraries/render-utils/src/Model.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 5618d66114..bf5ce62ff8 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -169,8 +169,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("model->render"); // filter out if not needed to render if (args && (args->_renderMode == RenderArgs::SHADOW_RENDER_MODE)) { - // if (movingOrAnimating) { - { + if (movingOrAnimating) { _model->renderInScene(alpha, args); } } else { diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 0a09f65e9f..ab32c89bf5 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -710,13 +710,18 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { } GLBATCH(glEnable)(GL_DEPTH_TEST); GLBATCH(glDepthFunc)(GL_LEQUAL); + if (mode == SHADOW_RENDER_MODE) { + GLBATCH(glDepthFunc)(GL_ALWAYS); + } GLBATCH(glDepthMask)(true); // render opaque meshes with alpha testing GLBATCH(glDisable)(GL_BLEND); GLBATCH(glEnable)(GL_ALPHA_TEST); - + if (mode == SHADOW_RENDER_MODE) { + GLBATCH(glDisable)(GL_ALPHA_TEST); + } if (mode == SHADOW_RENDER_MODE) { GLBATCH(glAlphaFunc)(GL_EQUAL, 0.0f); } From 2dcabb97b410e8cd1f77b05559e5d25b02ebd5c5 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 3 Apr 2015 17:10:51 -0700 Subject: [PATCH 5/8] getting ready for pr for a few syntax issues --- libraries/render-utils/src/Model.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index ab32c89bf5..9a0b05d62c 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -708,20 +708,12 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { GLBATCH(glCullFace)(GL_FRONT); } } - GLBATCH(glEnable)(GL_DEPTH_TEST); - GLBATCH(glDepthFunc)(GL_LEQUAL); - if (mode == SHADOW_RENDER_MODE) { - GLBATCH(glDepthFunc)(GL_ALWAYS); - } - GLBATCH(glDepthMask)(true); // render opaque meshes with alpha testing GLBATCH(glDisable)(GL_BLEND); GLBATCH(glEnable)(GL_ALPHA_TEST); - if (mode == SHADOW_RENDER_MODE) { - GLBATCH(glDisable)(GL_ALPHA_TEST); - } + if (mode == SHADOW_RENDER_MODE) { GLBATCH(glAlphaFunc)(GL_EQUAL, 0.0f); } @@ -1796,7 +1788,6 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { } // render opaque meshes with alpha testing - GLBATCH(glDepthMask)(true); GLBATCH(glDisable)(GL_BLEND); GLBATCH(glEnable)(GL_ALPHA_TEST); From 38d1e29a1d5888c4419b8d3624b98f0467555f4a Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 3 Apr 2015 17:16:18 -0700 Subject: [PATCH 6/8] getting ready for pr for a few syntax issues --- libraries/render-utils/src/Model.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 9a0b05d62c..313fc825f0 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -658,8 +658,6 @@ bool Model::render(float alpha, RenderMode mode, RenderArgs* args) { return renderCore(alpha, mode, args); } -#define WANT_DEBUG_MESHBOXES - bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { PROFILE_RANGE(__FUNCTION__); if (!_viewState) { From 17743c6013d0c6573c96d9c4a525765954eb68dd Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 3 Apr 2015 17:58:21 -0700 Subject: [PATCH 7/8] FIxed the broken shadows --- libraries/render-utils/src/Model.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 313fc825f0..c0cfac25eb 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -684,12 +684,7 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { _transforms.push_back(Transform()); } - if (args && args->_viewFrustum) { - _transforms[0].setTranslation(args->_viewFrustum->getPosition()); - _transforms[0].setRotation(args->_viewFrustum->getOrientation()); - } else { - _transforms[0] = _viewState->getViewTransform(); - } + _transforms[0] = _viewState->getViewTransform(); // apply entity translation offset to the viewTransform in one go (it's a preTranslate because viewTransform goes from world to eye space) _transforms[0].preTranslate(-_translation); @@ -1729,12 +1724,7 @@ void Model::setupBatchTransform(gpu::Batch& batch, RenderArgs* args) { _transforms.push_back(Transform()); } - if (args && args->_viewFrustum) { - _transforms[0].setTranslation(args->_viewFrustum->getPosition()); - _transforms[0].setRotation(args->_viewFrustum->getOrientation()); - } else { - _transforms[0] = _viewState->getViewTransform(); - } + _transforms[0] = _viewState->getViewTransform(); _transforms[0].preTranslate(-_translation); From a85daaee4117ffb6cb8241fb3b144c27c2745761 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 6 Apr 2015 10:03:47 -0700 Subject: [PATCH 8/8] COmmented the review questions in code --- libraries/render-utils/src/Model.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index c0cfac25eb..e77b8c4226 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -671,6 +671,7 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { // Setup the projection matrix if (args && args->_viewFrustum) { glm::mat4 proj; + // If for easier debug depending on the pass if (mode == RenderArgs::SHADOW_RENDER_MODE) { args->_viewFrustum->evalProjectionMatrix(proj); } else { @@ -1724,6 +1725,8 @@ void Model::setupBatchTransform(gpu::Batch& batch, RenderArgs* args) { _transforms.push_back(Transform()); } + // We should be able to use the Frustum viewpoint onstead of the "viewTransform" + // but it s still buggy in some cases, so let's s wait and fix it... _transforms[0] = _viewState->getViewTransform(); _transforms[0].preTranslate(-_translation); @@ -1748,6 +1751,7 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { if (args) { glm::mat4 proj; + // If for easier debug depending on the pass if (mode == RenderArgs::SHADOW_RENDER_MODE) { args->_viewFrustum->evalProjectionMatrix(proj); } else {