Fix lens flare in side-by-side view

This commit is contained in:
James Urquhart 2016-05-21 19:52:41 +01:00
parent c6d2456a7c
commit 784f6f92d8
5 changed files with 21 additions and 1 deletions

View file

@ -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.

View file

@ -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();

View file

@ -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.

View file

@ -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 &params )
{
// 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 &params )
// Restore previous values
GFX->setFrustum(gfxFrustum);
GFX->setViewport(originalVP);
gClientSceneGraph->setNonClipProjection(origNonClipProjection);
PFXMGR->setFrameState(origPFXState);
}
else
{

View file

@ -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);