summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanne Kangas <janne.kangas@qt.io>2018-02-07 14:14:36 +0200
committerJanne Kangas <janne.kangas@qt.io>2018-02-14 11:56:18 +0000
commitac739b22fea05b31caa4b4631613e4fe26d77693 (patch)
treec0c22bf055904f9cedf047129c69782fcfc4e693
parentc58d834f39b0524b357f515b9466ce17d4f40631 (diff)
Fix scene background clear and color inheritance for subpresentation
Fix case where scene matte color was overridden with scene background color even if it was transparent, causing main render target to be never properly cleared with non-zero alpha and resulting in infinite tails for animating objects (in transparent layers). Fix case where a layer subpresentation having transparent scene color overrode parent layer color with RGBA 0000 instead of inheriting parent color. This fix sets the subpresentation scene color to be the same as parent layer background, if the subpresentation background color has not been explicitly defined as non-transparent. Change-Id: Ia7da65d52c1f43b64bf9cdfd88b290552efbda70 Task-id: QT3DS-851 Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r--src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp13
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp16
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h2
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h4
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h4
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h4
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h4
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp15
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderContextCore.cpp8
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp7
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp11
11 files changed, 78 insertions, 10 deletions
diff --git a/src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp b/src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp
index 39667e74..36f3b28c 100644
--- a/src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp
+++ b/src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp
@@ -113,6 +113,9 @@ struct Qt3DSRenderSceneSubPresRenderer : public CSubPresentationRenderer
void Render(const SOffscreenRendererEnvironment &inEnvironment,
NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
SScene::RenderClearCommand inClearBuffer) override;
+ void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor);
};
struct SSceneLoadData
@@ -795,6 +798,16 @@ void Qt3DSRenderSceneSubPresRenderer::Render(const SOffscreenRendererEnvironment
CSubPresentationRenderer::Render(inEnvironment, inRenderContext, inPresScale, inClearBuffer);
}
+void Qt3DSRenderSceneSubPresRenderer::RenderWithClear(
+ const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor)
+{
+ CSubPresentationRenderer::RenderWithClear(inEnvironment, inRenderContext,
+ inPresScale, inClearBuffer,
+ inClearColor);
+}
+
//////////////////////////////////////////////////////////////////
// Scene Manager
//////////////////////////////////////////////////////////////////
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp
index cee88e51..d510c49c 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp
@@ -104,7 +104,8 @@ void SScene::Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &
{
if ((inClearColorBuffer == SScene::ClearIsOptional && m_UseClearColor)
|| inClearColorBuffer == SScene::AlwaysClear) {
- QT3DSF32 clearColorAlpha = inContext.IsInSubPresentation() ? 0.0f : 1.0f;
+ QT3DSF32 clearColorAlpha
+ = inContext.IsInSubPresentation() && !m_UseClearColor ? 0.0f : 1.0f;
QT3DSVec4 clearColor(0.0f, 0.0f, 0.0f, clearColorAlpha);
if (m_UseClearColor) {
clearColor.x = m_ClearColor.x;
@@ -121,3 +122,16 @@ void SScene::Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &
inContext.GetRenderer().RenderLayer(*m_FirstChild, inViewportDimensions, m_UseClearColor,
m_ClearColor, true);
}
+void SScene::RenderWithClear(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+ RenderClearCommand inClearColorBuffer, QT3DSVec3 inClearColor)
+{
+ // If this scene is not using clear color, we set the color
+ // to background color from parent layer. This allows
+ // fully transparent subpresentations (both scene and layer(s) transparent)
+ // to inherit color from the layer that contains them.
+ if (!m_UseClearColor) {
+ m_ClearColor = inClearColor;
+ m_UseClearColor = true;
+ }
+ Render(inViewportDimensions, inContext, inClearColorBuffer);
+}
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h b/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h
index 42f506c9..210e49ad 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h
@@ -77,6 +77,8 @@ namespace render {
bool PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext);
void Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
RenderClearCommand command = ClearIsOptional);
+ void RenderWithClear(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+ RenderClearCommand inClearColorBuffer, QT3DSVec3 inclearColor);
};
}
}
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h
index 16132ba7..0be417a5 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h
@@ -152,6 +152,10 @@ namespace render {
virtual void Render(const SOffscreenRendererEnvironment &inEnvironment,
NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
SScene::RenderClearCommand inColorBufferNeedsClear) = 0;
+ virtual void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
+ SScene::RenderClearCommand inColorBufferNeedsClear,
+ QT3DSVec3 inclearColor) = 0;
// Implementors should implement one of the two interfaces below.
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h
index 8c46cca2..15803c34 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h
@@ -69,6 +69,10 @@ namespace render {
NVRenderContext & /*inRenderContext*/
,
QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer) override;
+ void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
+ SScene::RenderClearCommand inColorBufferNeedsClear,
+ QT3DSVec3 inclearColor) override {}
IGraphObjectPickQuery *GetGraphObjectPickQuery() override { return NULL; }
bool Pick(const QT3DSVec2 & /*inMouseCoords*/, const QT3DSVec2 & /*inViewportDimensions*/) override
{
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h
index 97371edc..89ab3d9d 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h
@@ -79,6 +79,10 @@ namespace render {
NVRenderContext & /*inRenderContext*/
,
QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer) override;
+ void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext,
+ QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer,
+ QT3DSVec3 inClearColor) override;
IGraphObjectPickQuery *GetGraphObjectPickQuery() override { return &m_PickQuery; }
bool Pick(const QT3DSVec2 & /*inMouseCoords*/, const QT3DSVec2 & /*inViewportDimensions*/) override
{
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h
index 8e285f00..010c206b 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h
@@ -59,6 +59,10 @@ public:
void Render(const SOffscreenRendererEnvironment &inEnvironment,
NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
SScene::RenderClearCommand inColorBufferNeedsClear) override;
+ void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
+ SScene::RenderClearCommand inColorBufferNeedsClear,
+ QT3DSVec3 inclearColor) override {}
IGraphObjectPickQuery *GetGraphObjectPickQuery() override
{
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp
index 50040a99..301e66df 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp
@@ -1172,10 +1172,17 @@ namespace render {
{
if (m_LayerPrepResult->IsLayerVisible()) {
if (GetOffscreenRenderer()) {
- m_LastFrameOffscreenRenderer->Render(
- CreateOffscreenRenderEnvironment(), m_Renderer.GetContext(),
- m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(),
- SScene::ClearIsOptional);
+ if (m_Layer.m_Background == LayerBackground::Color) {
+ m_LastFrameOffscreenRenderer->RenderWithClear(
+ CreateOffscreenRenderEnvironment(), m_Renderer.GetContext(),
+ m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(),
+ SScene::AlwaysClear, m_Layer.m_ClearColor);
+ } else {
+ m_LastFrameOffscreenRenderer->Render(
+ CreateOffscreenRenderEnvironment(), m_Renderer.GetContext(),
+ m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(),
+ SScene::ClearIsOptional);
+ }
} else {
RenderDepthPass(false);
Render();
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderContextCore.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderContextCore.cpp
index ecf3adbe..dbf5dbad 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderContextCore.cpp
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderContextCore.cpp
@@ -681,15 +681,12 @@ struct SRenderContext : public IQt3DSRenderContext
} else {
m_RenderContext->SetScissorTestEnabled(false);
}
- bool clearedScene = false;
{
QT3DSVec4 theClearColor;
if (m_MatteColor.hasValue())
theClearColor = m_MatteColor;
- else {
+ else
theClearColor = m_SceneColor;
- clearedScene = true;
- }
m_RenderContext->SetClearColor(theClearColor);
m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color);
}
@@ -708,7 +705,8 @@ struct SRenderContext : public IQt3DSRenderContext
m_RotationTexture = NULL;
m_RotationDepthBuffer = NULL;
}
- if (m_SceneColor.hasValue() && !clearedScene) {
+ bool clear = m_SceneColor.getValue().w == 0.0f ? false : true;
+ if (m_SceneColor.hasValue() && clear) {
m_RenderContext->SetClearColor(m_SceneColor);
m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color);
}
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp
index 98abb868..987708c2 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp
@@ -384,6 +384,13 @@ struct InstanceImpl : public IRenderPluginInstance
}
}
+ void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor)
+ {
+ Q_ASSERT(false);
+ }
+
// Implementors should implement one of the two interfaces below.
// If this renderer supports picking that can return graph objects
diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp
index b4752a2b..56d0e98d 100644
--- a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp
+++ b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp
@@ -94,6 +94,17 @@ namespace render {
m_LastRenderedEnvironment = inEnvironment;
}
+ void CSubPresentationRenderer::RenderWithClear(
+ const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor)
+ {
+ NVRenderRect theViewportSize(inRenderContext.GetViewport());
+ m_Presentation.m_Scene->RenderWithClear(
+ QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height),
+ m_RenderContext, inClearBuffer, inClearColor);
+ }
+
// You know the viewport dimensions because
Qt3DSRenderPickResult CSubPresentationRenderer::DoGraphQueryPick(
const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions, bool inPickEverything)