|
@@ -353,10 +353,12 @@ static FovPort CalculateFovPortForCanvas(const RectI viewport, const CameraQuery
|
|
|
return fovPort;
|
|
|
}
|
|
|
|
|
|
-void GuiTSCtrl::_internalRender(RectI viewport, Frustum &frustum)
|
|
|
+void GuiTSCtrl::_internalRender(RectI guiViewport, RectI renderViewport, Frustum &frustum)
|
|
|
{
|
|
|
GFXTransformSaver saver;
|
|
|
- Point2I renderSize = viewport.extent;
|
|
|
+ Point2I renderSize = renderViewport.extent;
|
|
|
+ GFXTarget *origTarget = GFX->getActiveRenderTarget();
|
|
|
+ S32 origStereoTarget = GFX->getCurrentStereoTarget();
|
|
|
|
|
|
if (mForceFOV != 0)
|
|
|
mLastCameraQuery.fov = mDegToRad(mForceFOV);
|
|
@@ -380,7 +382,9 @@ void GuiTSCtrl::_internalRender(RectI viewport, Frustum &frustum)
|
|
|
mLastCameraQuery);
|
|
|
}
|
|
|
|
|
|
- GFX->setViewport(viewport);
|
|
|
+ GFX->setActiveRenderTarget(origTarget);
|
|
|
+ GFX->setCurrentStereoTarget(origStereoTarget);
|
|
|
+ GFX->setViewport(renderViewport);
|
|
|
|
|
|
// Clear the zBuffer so GUI doesn't hose object rendering accidentally
|
|
|
GFX->clear(GFXClearZBuffer, ColorI(20, 20, 20), 1.0f, 0);
|
|
@@ -410,7 +414,7 @@ void GuiTSCtrl::_internalRender(RectI viewport, Frustum &frustum)
|
|
|
|
|
|
mSaveProjection = GFX->getProjectionMatrix();
|
|
|
mSaveModelview = GFX->getWorldMatrix();
|
|
|
- mSaveViewport = viewport;
|
|
|
+ mSaveViewport = guiViewport;
|
|
|
mSaveWorldToScreenScale = GFX->getWorldToScreenScale();
|
|
|
mSaveFrustum = GFX->getFrustum();
|
|
|
mSaveFrustum.setTransform(mLastCameraQuery.cameraMatrix);
|
|
@@ -422,7 +426,7 @@ void GuiTSCtrl::_internalRender(RectI viewport, Frustum &frustum)
|
|
|
// Give the post effect manager the worldToCamera, and cameraToScreen matrices
|
|
|
PFXMGR->setFrameMatrices(mSaveModelview, mSaveProjection);
|
|
|
|
|
|
- renderWorld(viewport);
|
|
|
+ renderWorld(guiViewport);
|
|
|
|
|
|
DebugDrawer* debugDraw = DebugDrawer::get();
|
|
|
if (mRenderStyle == RenderStyleStereoSideBySide && debugDraw->willDraw())
|
|
@@ -445,97 +449,6 @@ void GuiTSCtrl::_internalRender(RectI viewport, Frustum &frustum)
|
|
|
debugDraw->render();
|
|
|
}
|
|
|
|
|
|
- // Render the canvas overlay if its available
|
|
|
- if (mStereoCanvas.getPointer() && mStereoGuiTarget.getPointer() && mStereoCanvas->size() != 0)
|
|
|
- {
|
|
|
- GFXDEBUGEVENT_SCOPE(StereoGui_Render, ColorI(255, 0, 0));
|
|
|
- MatrixF proj(1);
|
|
|
-
|
|
|
- Frustum originalFrustum = frustum;
|
|
|
- GFXTextureObject *texObject = mStereoGuiTarget->getTexture(0);
|
|
|
- const FovPort *currentFovPort = GFX->getStereoFovPort();
|
|
|
- const MatrixF *eyeTransforms = GFX->getStereoEyeTransforms();
|
|
|
- const Point3F *eyeOffset = GFX->getStereoEyeOffsets();
|
|
|
- Frustum gfxFrustum = originalFrustum;
|
|
|
-
|
|
|
- GFX->setClipRect(viewport);
|
|
|
- GFX->setViewport(viewport);
|
|
|
- GFX->setFrustum(frustum);
|
|
|
-
|
|
|
- MatrixF eyeWorldTrans(1);
|
|
|
- if (mLastCameraQuery.currentEye != -1)
|
|
|
- {
|
|
|
- eyeWorldTrans.setPosition(Point3F(eyeOffset[mLastCameraQuery.currentEye].x, eyeOffset[mLastCameraQuery.currentEye].y, eyeOffset[mLastCameraQuery.currentEye].z));
|
|
|
- }
|
|
|
- MatrixF eyeWorld(1);
|
|
|
- eyeWorld.mul(eyeWorldTrans);
|
|
|
- eyeWorld.inverse();
|
|
|
-
|
|
|
- GFX->setWorldMatrix(eyeWorld);
|
|
|
- GFX->setViewMatrix(MatrixF::Identity);
|
|
|
-
|
|
|
- if (!mStereoOverlayVB.getPointer())
|
|
|
- {
|
|
|
- mStereoOverlayVB.set(GFX, 4, GFXBufferTypeStatic);
|
|
|
- GFXVertexPCT *verts = mStereoOverlayVB.lock(0, 4);
|
|
|
-
|
|
|
- F32 texLeft = 0.0f;
|
|
|
- F32 texRight = 1.0f;
|
|
|
- F32 texTop = 1.0f;
|
|
|
- F32 texBottom = 0.0f;
|
|
|
-
|
|
|
- F32 rectRatio = gfxFrustum.getWidth() / gfxFrustum.getHeight();
|
|
|
- F32 rectWidth = gfxFrustum.getWidth() * TS_OVERLAY_SCREEN_WIDTH;
|
|
|
- F32 rectHeight = rectWidth * rectRatio;
|
|
|
-
|
|
|
- F32 screenLeft = -rectWidth * 0.5;
|
|
|
- F32 screenRight = rectWidth * 0.5;
|
|
|
- F32 screenTop = -rectHeight * 0.5;
|
|
|
- F32 screenBottom = rectHeight * 0.5;
|
|
|
-
|
|
|
- const F32 fillConv = 0.0f;
|
|
|
- const F32 frustumDepthAdjusted = gfxFrustum.getNearDist() + 0.012;
|
|
|
- verts[0].point.set(screenLeft - fillConv, frustumDepthAdjusted, screenTop - fillConv);
|
|
|
- verts[1].point.set(screenRight - fillConv, frustumDepthAdjusted, screenTop - fillConv);
|
|
|
- verts[2].point.set(screenLeft - fillConv, frustumDepthAdjusted, screenBottom - fillConv);
|
|
|
- verts[3].point.set(screenRight - fillConv, frustumDepthAdjusted, screenBottom - fillConv);
|
|
|
-
|
|
|
- verts[0].color = verts[1].color = verts[2].color = verts[3].color = ColorI(255, 255, 255, 255);
|
|
|
-
|
|
|
- verts[0].texCoord.set(texLeft, texTop);
|
|
|
- verts[1].texCoord.set(texRight, texTop);
|
|
|
- verts[2].texCoord.set(texLeft, texBottom);
|
|
|
- verts[3].texCoord.set(texRight, texBottom);
|
|
|
-
|
|
|
- mStereoOverlayVB.unlock();
|
|
|
- }
|
|
|
-
|
|
|
- if (!mStereoGuiSB.getPointer())
|
|
|
- {
|
|
|
- // DrawBitmapStretchSR
|
|
|
- GFXStateBlockDesc bitmapStretchSR;
|
|
|
- bitmapStretchSR.setCullMode(GFXCullNone);
|
|
|
- bitmapStretchSR.setZReadWrite(false, false);
|
|
|
- bitmapStretchSR.setBlend(true, GFXBlendSrcAlpha, GFXBlendInvSrcAlpha);
|
|
|
- bitmapStretchSR.samplersDefined = true;
|
|
|
-
|
|
|
- bitmapStretchSR.samplers[0] = GFXSamplerStateDesc::getClampLinear();
|
|
|
- bitmapStretchSR.samplers[0].minFilter = GFXTextureFilterPoint;
|
|
|
- bitmapStretchSR.samplers[0].mipFilter = GFXTextureFilterPoint;
|
|
|
- bitmapStretchSR.samplers[0].magFilter = GFXTextureFilterPoint;
|
|
|
-
|
|
|
- mStereoGuiSB = GFX->createStateBlock(bitmapStretchSR);
|
|
|
- }
|
|
|
-
|
|
|
- GFX->setPrimitiveBuffer(NULL);
|
|
|
- GFX->setVertexBuffer(mStereoOverlayVB);
|
|
|
- GFX->setStateBlock(mStereoGuiSB);
|
|
|
- GFX->setTexture(0, texObject);
|
|
|
- GFX->setupGenericShaders(GFXDevice::GSModColorTexture);
|
|
|
- GFX->drawPrimitive(GFXTriangleStrip, 0, 2);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
saver.restore();
|
|
|
}
|
|
|
|
|
@@ -659,7 +572,7 @@ void GuiTSCtrl::onRender(Point2I offset, const RectI &updateRect)
|
|
|
// Allow render size to originate from the render target
|
|
|
if (mLastCameraQuery.stereoTargets[0])
|
|
|
{
|
|
|
- renderSize = mLastCameraQuery.stereoViewports[0].extent;
|
|
|
+ renderSize = mLastCameraQuery.stereoTargets[0]->getSize();
|
|
|
renderingToTarget = true;
|
|
|
}
|
|
|
|
|
@@ -667,7 +580,7 @@ void GuiTSCtrl::onRender(Point2I offset, const RectI &updateRect)
|
|
|
MathUtils::makeFovPortFrustum(&frustum, mLastCameraQuery.ortho, mLastCameraQuery.nearPlane, mLastCameraQuery.farPlane, mLastCameraQuery.fovPort[0]);
|
|
|
|
|
|
GFX->activateStereoTarget(-1);
|
|
|
- _internalRender(RectI(updateRect.point, updateRect.extent), frustum);
|
|
|
+ _internalRender(RectI(updateRect.point, updateRect.extent), RectI(Point2I(0,0), renderSize), frustum);
|
|
|
|
|
|
// Notify device we've rendered the right, thus the last stereo frame.
|
|
|
GFX->getDeviceEventSignal().trigger(GFXDevice::deRightStereoFrameRendered);
|
|
@@ -726,17 +639,21 @@ void GuiTSCtrl::onRender(Point2I offset, const RectI &updateRect)
|
|
|
frustum.update();
|
|
|
GFX->activateStereoTarget(0);
|
|
|
mLastCameraQuery.currentEye = 0;
|
|
|
- _internalRender(RectI(Point2I(0, 0), mLastCameraQuery.stereoTargets[0]->getSize()), frustum);
|
|
|
+ GFX->beginField();
|
|
|
+ _internalRender(RectI(Point2I(0, 0), mLastCameraQuery.stereoTargets[0]->getSize()), RectI(Point2I(0, 0), mLastCameraQuery.stereoTargets[0]->getSize()), frustum);
|
|
|
GFX->getDeviceEventSignal().trigger(GFXDevice::deLeftStereoFrameRendered);
|
|
|
+ GFX->endField();
|
|
|
|
|
|
// Right
|
|
|
GFX->activateStereoTarget(1);
|
|
|
mLastCameraQuery.currentEye = 1;
|
|
|
MathUtils::makeFovPortFrustum(&frustum, mLastCameraQuery.ortho, mLastCameraQuery.nearPlane, mLastCameraQuery.farPlane, mLastCameraQuery.fovPort[1]);
|
|
|
mLastCameraQuery.cameraMatrix = myTransforms[1];
|
|
|
- frustum.update();
|
|
|
- _internalRender(RectI(Point2I(0, 0), mLastCameraQuery.stereoTargets[1]->getSize()), frustum);
|
|
|
- GFX->getDeviceEventSignal().trigger(GFXDevice::deRightStereoFrameRendered);
|
|
|
+ frustum.update();
|
|
|
+ GFX->beginField();
|
|
|
+ _internalRender(RectI(Point2I(0, 0), mLastCameraQuery.stereoTargets[1]->getSize()), RectI(Point2I(0, 0), mLastCameraQuery.stereoTargets[0]->getSize()), frustum);
|
|
|
+ GFX->getDeviceEventSignal().trigger(GFXDevice::deRightStereoFrameRendered);
|
|
|
+ GFX->endField();
|
|
|
|
|
|
mLastCameraQuery.cameraMatrix = origMatrix;
|
|
|
|
|
@@ -805,7 +722,7 @@ void GuiTSCtrl::onRender(Point2I offset, const RectI &updateRect)
|
|
|
tempRect.point.y = screensize.y - (tempRect.point.y + tempRect.extent.y);
|
|
|
#endif
|
|
|
|
|
|
- _internalRender(tempRect, frustum);
|
|
|
+ _internalRender(tempRect, tempRect, frustum);
|
|
|
}
|
|
|
|
|
|
// TODO: Some render to sort of overlay system?
|