From 8b43ff3465f0a120184657e62c89b9e6358efd72 Mon Sep 17 00:00:00 2001 From: irei1as Date: Tue, 22 Nov 2016 16:20:18 +0100 Subject: [PATCH 1/2] Update guiOffscreenCanvas.h Variables to add depth in the .cpp file. --- Engine/source/gui/core/guiOffscreenCanvas.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Engine/source/gui/core/guiOffscreenCanvas.h b/Engine/source/gui/core/guiOffscreenCanvas.h index 9807f56a7..77c388a9e 100644 --- a/Engine/source/gui/core/guiOffscreenCanvas.h +++ b/Engine/source/gui/core/guiOffscreenCanvas.h @@ -56,6 +56,9 @@ protected: bool mTargetDirty; bool mDynamicTarget; + + bool mUseDepth; + GFXTexHandle mTargetDepth; public: static Vector sList; From a7952bfe1d946c11cd15ae60613e3e1cd2a0120e Mon Sep 17 00:00:00 2001 From: irei1as Date: Tue, 22 Nov 2016 16:30:29 +0100 Subject: [PATCH 2/2] Add a fix to the depth for the target texture Fix to the named texture to have the 3d depth correctly rendered if a 3d view is inside the guiOffscreenCanvas. It's disabled by default so it shouldn't change anything to projects that use guiOffscreenCanvas without the texture (like Oculus rendering). --- Engine/source/gui/core/guiOffscreenCanvas.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Engine/source/gui/core/guiOffscreenCanvas.cpp b/Engine/source/gui/core/guiOffscreenCanvas.cpp index fc23c1369..e974873fd 100644 --- a/Engine/source/gui/core/guiOffscreenCanvas.cpp +++ b/Engine/source/gui/core/guiOffscreenCanvas.cpp @@ -18,6 +18,7 @@ GuiOffscreenCanvas::GuiOffscreenCanvas() mTargetName = "offscreenCanvas"; mTargetDirty = true; mDynamicTarget = false; + mUseDepth = false; } GuiOffscreenCanvas::~GuiOffscreenCanvas() @@ -30,6 +31,7 @@ void GuiOffscreenCanvas::initPersistFields() addField( "targetFormat", TypeGFXFormat, Offset( mTargetFormat, GuiOffscreenCanvas ), ""); addField( "targetName", TypeRealString, Offset( mTargetName, GuiOffscreenCanvas ), ""); addField( "dynamicTarget", TypeBool, Offset( mDynamicTarget, GuiOffscreenCanvas ), ""); + addField( "useDepth", TypeBool, Offset( mUseDepth, GuiOffscreenCanvas ), ""); Parent::initPersistFields(); } @@ -70,6 +72,7 @@ void GuiOffscreenCanvas::onRemove() mTarget = NULL; mTargetTexture = NULL; + mTargetDepth = NULL; Parent::onRemove(); } @@ -89,6 +92,13 @@ void GuiOffscreenCanvas::_setupTargets() mTargetTexture.set( mTargetSize.x, mTargetSize.y, mTargetFormat, &GFXDefaultRenderTargetProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ), 1, 0 ); } + // Update depth if needed + if (mUseDepth && (!mTargetDepth.isValid() || mTargetSize != mTargetDepth.getWidthHeight())) + { + mTargetDepth.set( mTargetSize.x, mTargetSize.y, GFXFormatD24S8, &GFXDefaultZTargetProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ), 1, 0 ); + mTarget->attachTexture( GFXTextureTarget::RenderSlot(GFXTextureTarget::DepthStencil), mTargetDepth ); + } + mTarget->attachTexture( GFXTextureTarget::RenderSlot(GFXTextureTarget::Color0), mTargetTexture ); mNamedTarget.setTexture(0, mTargetTexture); } @@ -97,6 +107,7 @@ void GuiOffscreenCanvas::_teardownTargets() { mNamedTarget.release(); mTargetTexture = NULL; + mTargetDepth = NULL; mTargetDirty = true; }