diff --git a/Engine/source/T3D/lightFlareData.cpp b/Engine/source/T3D/lightFlareData.cpp index 5ce430755..84058f6c8 100644 --- a/Engine/source/T3D/lightFlareData.cpp +++ b/Engine/source/T3D/lightFlareData.cpp @@ -277,8 +277,8 @@ bool LightFlareData::_testVisibility(const SceneRenderState *state, LightFlareSt // the last result. const Point3F &lightPos = flareState->lightMat.getPosition(); const RectI &viewport = RectI(Point2I(0, 0), GFX->getViewport().extent); + MatrixF camProjMatrix = state->getSceneManager()->getNonClipProjection(); - MatrixF camProjMatrix = projMatrix = state->getSceneManager()->getNonClipProjection(); bool onScreen = MathUtils::mProjectWorldToScreen( lightPos, outLightPosSS, viewport, GFX->getWorldMatrix(), camProjMatrix ); // It is onscreen, so raycast as a simple occlusion test. diff --git a/Engine/source/gui/3d/guiTSControl.cpp b/Engine/source/gui/3d/guiTSControl.cpp index 8e2fb3a25..1bd5f154c 100644 --- a/Engine/source/gui/3d/guiTSControl.cpp +++ b/Engine/source/gui/3d/guiTSControl.cpp @@ -624,6 +624,7 @@ void GuiTSCtrl::onRender(Point2I offset, const RectI &updateRect) // Use the view matrix determined from the control object myTransforms[0] = mLastCameraQuery.cameraMatrix; myTransforms[1] = mLastCameraQuery.cameraMatrix; + mLastCameraQuery.headMatrix = mLastCameraQuery.cameraMatrix; // override head QuatF qrot = mLastCameraQuery.cameraMatrix; Point3F pos = mLastCameraQuery.cameraMatrix.getPosition(); diff --git a/Engine/source/postFx/postEffectManager.h b/Engine/source/postFx/postEffectManager.h index 0ef72a586..f06e6b76a 100644 --- a/Engine/source/postFx/postEffectManager.h +++ b/Engine/source/postFx/postEffectManager.h @@ -127,6 +127,7 @@ public: const PFXFrameState &getFrameState() const { return mFrameState[mFrameStateSwitch]; } const PFXFrameState &getLastFrameState() const { return mFrameState[!mFrameStateSwitch]; } + void setFrameState(const PFXFrameState& newState) { mFrameState[mFrameStateSwitch] = newState; } void setFrameMatrices( const MatrixF &worldToCamera, const MatrixF &cameraToScreen ); // For ManagedSingleton. diff --git a/Engine/source/scene/reflector.cpp b/Engine/source/scene/reflector.cpp index 951cce010..5993f0e26 100644 --- a/Engine/source/scene/reflector.cpp +++ b/Engine/source/scene/reflector.cpp @@ -39,6 +39,7 @@ #include "math/mathUtils.h" #include "math/util/frustum.h" #include "gfx/screenshot.h" +#include "postFx/postEffectManager.h" extern ColorI gCanvasClearColor; @@ -603,6 +604,8 @@ void PlaneReflector::updateReflection( const ReflectParams ¶ms ) { // Store previous values RectI originalVP = GFX->getViewport(); + MatrixF origNonClipProjection = gClientSceneGraph->getNonClipProjection(); + PFXFrameState origPFXState = PFXMGR->getFrameState(); const FovPort *currentFovPort = GFX->getStereoFovPort(); MatrixF inverseEyeTransforms[2]; @@ -655,6 +658,8 @@ void PlaneReflector::updateReflection( const ReflectParams ¶ms ) // Restore previous values GFX->setFrustum(gfxFrustum); GFX->setViewport(originalVP); + gClientSceneGraph->setNonClipProjection(origNonClipProjection); + PFXMGR->setFrameState(origPFXState); } else { diff --git a/Engine/source/scene/sceneManager.cpp b/Engine/source/scene/sceneManager.cpp index 5ed8f2669..53c8eb045 100644 --- a/Engine/source/scene/sceneManager.cpp +++ b/Engine/source/scene/sceneManager.cpp @@ -41,6 +41,8 @@ // For player object bounds workaround. #include "T3D/player.h" +#include "postFx/postEffectManager.h" + extern bool gEditingMission; @@ -239,6 +241,10 @@ void SceneManager::renderScene( SceneRenderState* renderState, U32 objectMask, S MatrixF originalWorld = GFX->getWorldMatrix(); Frustum originalFrustum = GFX->getFrustum(); + // Save PFX & SceneManager projections + MatrixF origNonClipProjection = renderState->getSceneManager()->getNonClipProjection(); + PFXFrameState origPFXState = PFXMGR->getFrameState(); + const FovPort *currentFovPort = GFX->getStereoFovPort(); const MatrixF *eyeTransforms = GFX->getStereoEyeTransforms(); const MatrixF *worldEyeTransforms = GFX->getInverseStereoEyeTransforms(); @@ -255,7 +261,9 @@ void SceneManager::renderScene( SceneRenderState* renderState, U32 objectMask, S SceneCameraState cameraStateLeft = SceneCameraState::fromGFX(); SceneRenderState renderStateLeft( this, renderState->getScenePassType(), cameraStateLeft ); + renderStateLeft.getSceneManager()->setNonClipProjection(GFX->getProjectionMatrix()); renderStateLeft.setSceneRenderStyle(SRS_SideBySide); + PFXMGR->setFrameMatrices(GFX->getWorldMatrix(), GFX->getProjectionMatrix()); renderSceneNoLights( &renderStateLeft, objectMask, baseObject, baseZone ); // left @@ -274,7 +282,9 @@ void SceneManager::renderScene( SceneRenderState* renderState, U32 objectMask, S SceneCameraState cameraStateRight = SceneCameraState::fromGFX(); SceneRenderState renderStateRight( this, renderState->getScenePassType(), cameraStateRight ); + renderStateRight.getSceneManager()->setNonClipProjection(GFX->getProjectionMatrix()); renderStateRight.setSceneRenderStyle(SRS_SideBySide); + PFXMGR->setFrameMatrices(GFX->getWorldMatrix(), GFX->getProjectionMatrix()); renderSceneNoLights( &renderStateRight, objectMask, baseObject, baseZone ); // right @@ -283,6 +293,9 @@ void SceneManager::renderScene( SceneRenderState* renderState, U32 objectMask, S GFX->endField(); // Restore previous values + renderState->getSceneManager()->setNonClipProjection(origNonClipProjection); + PFXMGR->setFrameState(origPFXState); + GFX->setWorldMatrix(originalWorld); GFX->setFrustum(originalFrustum); GFX->setViewport(originalVP);