From 9a68c0640cf2ced193ad113068af62416be3440f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A4=C3=A4tt=C3=A4=20Antti?= Date: Thu, 15 Feb 2018 11:53:52 +0200 Subject: Fix rendering same subpresentation to multiple layers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add instancing support to layer rendering. Task-number: QT3DS-531 Change-Id: Ibb52951f0ae01c568d43d752b1f26ad49c626325 Reviewed-by: Tomi Korpipää Reviewed-by: Miikka Heikkinen --- .../Engine/Source/Qt3DSRenderRuntimeBinding.cpp | 32 +++++--- .../GraphObjects/Qt3DSRenderScene.cpp | 28 ++++--- .../GraphObjects/Qt3DSRenderScene.h | 10 ++- .../Include/Qt3DSOffscreenRenderManager.h | 16 ++-- .../Include/Qt3DSOldNBustedRenderPlugin.h | 19 +++-- .../Include/Qt3DSRenderSubpresentation.h | 17 +++-- .../Qt3DSRuntimeRender/Include/Qt3DSRenderer.h | 14 ++-- .../Qt3DSRuntimeRender/Include/q3dsqmlrender.h | 22 ++++-- .../RendererImpl/Qt3DSRendererImpl.cpp | 88 +++++++++++----------- .../RendererImpl/Qt3DSRendererImpl.h | 20 +++-- .../Qt3DSRendererImplLayerRenderData.cpp | 7 +- ...Qt3DSRendererImplLayerRenderPreparationData.cpp | 2 +- .../Source/Qt3DSOffscreenRenderManager.cpp | 4 +- .../Source/Qt3DSOldNBustedRenderPlugin.cpp | 6 +- .../Source/Qt3DSRenderPlugin.cpp | 16 ++-- .../Source/Qt3DSRenderSubpresentation.cpp | 15 ++-- .../Qt3DSRuntimeRender/Source/q3dsqmlrender.cpp | 8 +- 17 files changed, 191 insertions(+), 133 deletions(-) diff --git a/src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp b/src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp index 36f3b28c..781499e6 100644 --- a/src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp +++ b/src/Runtime/Source/Engine/Source/Qt3DSRenderRuntimeBinding.cpp @@ -109,13 +109,16 @@ struct Qt3DSRenderSceneSubPresRenderer : public CSubPresentationRenderer } QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext.GetAllocator()) SOffscreenRenderFlags NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, - QT3DSVec2 inPresScale) override; + QT3DSVec2 inPresScale, + const SRenderInstanceId instanceId) override; void Render(const SOffscreenRendererEnvironment &inEnvironment, - NVRenderContext &inRenderContext, QT3DSVec2 inPresScale, - SScene::RenderClearCommand inClearBuffer) override; + NVRenderContext &inRenderContext, QT3DSVec2 inPresScale, + SScene::RenderClearCommand inClearBuffer, + const SRenderInstanceId instanceId) override; void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment, NVRenderContext &inRenderContext, QT3DSVec2 inPresScale, - SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor); + SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor, + const SRenderInstanceId instanceId) override; }; struct SSceneLoadData @@ -191,7 +194,7 @@ struct Qt3DSRenderScene : public Q3DStudio::IScene if (m_Presentation && m_Presentation->m_Scene) { for (SLayer *theLayer = m_Presentation->m_Scene->m_FirstChild; theLayer; theLayer = static_cast(theLayer->m_NextSibling)) { - m_Context->GetRenderer().ReleaseLayerRenderResources(*theLayer); + m_Context->GetRenderer().ReleaseLayerRenderResources(*theLayer, nullptr); } } } @@ -785,27 +788,32 @@ struct Qt3DSRenderScene : public Q3DStudio::IScene SOffscreenRenderFlags Qt3DSRenderSceneSubPresRenderer::NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, - QT3DSVec2 inPresScale) + QT3DSVec2 inPresScale, + const SRenderInstanceId instanceId) { m_Scene.TransferDirtyProperties(); - return CSubPresentationRenderer::NeedsRender(inEnvironment, inPresScale); + return CSubPresentationRenderer::NeedsRender(inEnvironment, inPresScale, instanceId); } void Qt3DSRenderSceneSubPresRenderer::Render(const SOffscreenRendererEnvironment &inEnvironment, - NVRenderContext &inRenderContext, QT3DSVec2 inPresScale, - SScene::RenderClearCommand inClearBuffer) + NVRenderContext &inRenderContext, + QT3DSVec2 inPresScale, + SScene::RenderClearCommand inClearBuffer, + const SRenderInstanceId instanceId) { - CSubPresentationRenderer::Render(inEnvironment, inRenderContext, inPresScale, inClearBuffer); + CSubPresentationRenderer::Render(inEnvironment, inRenderContext, inPresScale, inClearBuffer, + instanceId); } void Qt3DSRenderSceneSubPresRenderer::RenderWithClear( const SOffscreenRendererEnvironment &inEnvironment, NVRenderContext &inRenderContext, QT3DSVec2 inPresScale, - SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor) + SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor, + const SRenderInstanceId id) { CSubPresentationRenderer::RenderWithClear(inEnvironment, inRenderContext, inPresScale, inClearBuffer, - inClearColor); + inClearColor, id); } ////////////////////////////////////////////////////////////////// diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp index d510c49c..d23eb916 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp @@ -87,20 +87,22 @@ SDataInput *SScene::GetLastDataInput() return child; } -bool SScene::PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext) +bool SScene::PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext, + const SRenderInstanceId id) { // We need to iterate through the layers in reverse order and ask them to render. bool wasDirty = m_Dirty; m_Dirty = false; - if (m_FirstChild) - wasDirty = - inContext.GetRenderer().PrepareLayerForRender(*m_FirstChild, inViewportDimensions, true) - || wasDirty; + if (m_FirstChild) { + wasDirty |= + inContext.GetRenderer().PrepareLayerForRender(*m_FirstChild, inViewportDimensions, + true, id); + } return wasDirty; } void SScene::Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext, - RenderClearCommand inClearColorBuffer) + RenderClearCommand inClearColorBuffer, const SRenderInstanceId id) { if ((inClearColorBuffer == SScene::ClearIsOptional && m_UseClearColor) || inClearColorBuffer == SScene::AlwaysClear) { @@ -118,12 +120,16 @@ void SScene::Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext & &NVRenderContext::SetClearColor, clearColor); inContext.GetRenderContext().Clear(qt3ds::render::NVRenderClearValues::Color); } - if (m_FirstChild) + if (m_FirstChild) { inContext.GetRenderer().RenderLayer(*m_FirstChild, inViewportDimensions, m_UseClearColor, - m_ClearColor, true); + m_ClearColor, true, id); + } } -void SScene::RenderWithClear(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext, - RenderClearCommand inClearColorBuffer, QT3DSVec3 inClearColor) +void SScene::RenderWithClear(const QT3DSVec2 &inViewportDimensions, + IQt3DSRenderContext &inContext, + RenderClearCommand inClearColorBuffer, + QT3DSVec3 inClearColor, + const SRenderInstanceId id) { // If this scene is not using clear color, we set the color // to background color from parent layer. This allows @@ -133,5 +139,5 @@ void SScene::RenderWithClear(const QT3DSVec2 &inViewportDimensions, IQt3DSRender m_ClearColor = inClearColor; m_UseClearColor = true; } - Render(inViewportDimensions, inContext, inClearColorBuffer); + Render(inViewportDimensions, inContext, inClearColorBuffer, id); } diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h b/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h index 210e49ad..86ef8aa4 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h +++ b/src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h @@ -39,6 +39,7 @@ namespace render { struct SLayer; struct SPresentation; struct SDataInput; + typedef void *SRenderInstanceId; struct SScene : public SGraphObject { @@ -74,11 +75,14 @@ namespace render { inRemapper.Remap(m_FirstDataInput); } // returns true if any of the layers were dirty or if this object was dirty - bool PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext); + bool PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext, + const SRenderInstanceId id = nullptr); void Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext, - RenderClearCommand command = ClearIsOptional); + RenderClearCommand command = ClearIsOptional, + const SRenderInstanceId id = nullptr); void RenderWithClear(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext, - RenderClearCommand inClearColorBuffer, QT3DSVec3 inclearColor); + RenderClearCommand inClearColorBuffer, + QT3DSVec3 inclearColor, const SRenderInstanceId id = nullptr); }; } } diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h index 0be417a5..e3a269c9 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h @@ -126,6 +126,8 @@ namespace render { } }; + typedef void *SRenderInstanceId; + class IOffscreenRenderer : public NVRefCounted { protected: @@ -140,7 +142,8 @@ namespace render { // Returns true of this object needs to be rendered, false if this object is not dirty virtual SOffscreenRenderFlags NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, - QT3DSVec2 inPresentationScaleFactor) = 0; + QT3DSVec2 inPresentationScaleFactor, + const SRenderInstanceId instanceId) = 0; // Returns true if the rendered result image has transparency, or false // if it should be treated as a completely opaque image. // It is the IOffscreenRenderer's job to clear any buffers (color, depth, stencil) that it @@ -151,17 +154,19 @@ namespace render { // scaled. virtual void Render(const SOffscreenRendererEnvironment &inEnvironment, NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, - SScene::RenderClearCommand inColorBufferNeedsClear) = 0; + SScene::RenderClearCommand inColorBufferNeedsClear, + const SRenderInstanceId instanceId) = 0; virtual void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment, NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, SScene::RenderClearCommand inColorBufferNeedsClear, - QT3DSVec3 inclearColor) = 0; + QT3DSVec3 inclearColor, + const SRenderInstanceId instanceId) = 0; // Implementors should implement one of the two interfaces below. // If this renderer supports picking that can return graph objects // then return an interface here. - virtual IGraphObjectPickQuery *GetGraphObjectPickQuery() = 0; + virtual IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId instanceId) = 0; // If you *don't* support the GraphObjectPickIterator interface, then you should implement // this interface @@ -169,7 +174,8 @@ namespace render { // If you return true, then we will assume that you swallowed the pick and will continue no // further. // else we will assume you did not and will continue the picking algorithm. - virtual bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions) = 0; + virtual bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions, + const SRenderInstanceId instanceId) = 0; }; struct SOffscreenRenderResult diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h index 15803c34..48841347 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h @@ -64,17 +64,22 @@ namespace render { SOffscreenRendererEnvironment GetDesiredEnvironment(QT3DSVec2 inPresScale) override; virtual SOffscreenRenderFlags - NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, QT3DSVec2 inPresScale) override; + NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, QT3DSVec2 inPresScale, + const SRenderInstanceId instanceId) override; void Render(const SOffscreenRendererEnvironment &inEnvironment, - NVRenderContext & /*inRenderContext*/ - , - QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer) override; + NVRenderContext & /*inRenderContext*/, + QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer, + const SRenderInstanceId instanceId) 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 + QT3DSVec3 inclearColor, const SRenderInstanceId instanceId) override {} + IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId instanceId) override + { + return NULL; + } + bool Pick(const QT3DSVec2 & /*inMouseCoords*/, const QT3DSVec2 & /*inViewportDimensions*/, + const SRenderInstanceId instanceId) override { return false; } diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h index 89ab3d9d..6a01290d 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h @@ -74,17 +74,20 @@ namespace render { SOffscreenRendererEnvironment GetDesiredEnvironment(QT3DSVec2 inPresScale) override; virtual SOffscreenRenderFlags - NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, QT3DSVec2 inPresScale) override; + NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, QT3DSVec2 inPresScale, + const SRenderInstanceId instanceId) override; void Render(const SOffscreenRendererEnvironment &inEnvironment, - NVRenderContext & /*inRenderContext*/ - , - QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer) override; + NVRenderContext & /*inRenderContext*/, + QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer, + const SRenderInstanceId instanceId) 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 + QT3DSVec3 inClearColor, + const SRenderInstanceId instanceId) override; + IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId) override { return &m_PickQuery; } + bool Pick(const QT3DSVec2 & /*inMouseCoords*/, const QT3DSVec2 & /*inViewportDimensions*/, + const SRenderInstanceId) override { return false; } diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderer.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderer.h index 391a71f2..24f09021 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderer.h +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderer.h @@ -51,6 +51,7 @@ namespace render { struct SLight; struct SLayer; class IBufferManager; + typedef void *SRenderInstanceId; using qt3ds::foundation::NVConstDataRef; @@ -127,9 +128,11 @@ namespace render { // Returns true if this layer or a sibling was dirty. virtual bool PrepareLayerForRender(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, - bool inRenderSiblings = true) = 0; + bool inRenderSiblings = true, + const SRenderInstanceId id = nullptr) = 0; virtual void RenderLayer(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, bool clear, - QT3DSVec3 clearColor, bool inRenderSiblings = true) = 0; + QT3DSVec3 clearColor, bool inRenderSiblings = true, + const SRenderInstanceId id = nullptr) = 0; // Studio option to disable picking against sub renderers. This allows better interaction // in studio. @@ -139,8 +142,9 @@ namespace render { // in some cases and just pick everything in other things. virtual void PickRenderPlugins(bool inPick) = 0; virtual Qt3DSRenderPickResult Pick(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, - const QT3DSVec2 &inMouseCoords, bool inPickSiblings = true, - bool inPickEverything = false) = 0; + const QT3DSVec2 &inMouseCoords, bool inPickSiblings = true, + bool inPickEverything = false, + const SRenderInstanceId id = nullptr) = 0; // Return the relative hit position, in UV space, of a mouse pick against this object. // We need the node in order to figure out which layer rendered this object. @@ -216,7 +220,7 @@ namespace render { const QT3DSVec3 &inWorldPoint) = 0; // Called before a layer goes completely out of scope to release any rendering resources // related to the layer. - virtual void ReleaseLayerRenderResources(SLayer &inLayer) = 0; + virtual void ReleaseLayerRenderResources(SLayer &inLayer, const SRenderInstanceId id) = 0; // render a screen aligned 2D text virtual void RenderText2D(QT3DSF32 x, QT3DSF32 y, qt3ds::foundation::Option inColor, diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h b/src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h index 010c206b..07fb1a9e 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h @@ -54,24 +54,30 @@ public: // Returns true of this object needs to be rendered, false if this object is not dirty SOffscreenRenderFlags NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, - QT3DSVec2 inPresentationScaleFactor) override; + QT3DSVec2 inPresentationScaleFactor, + const SRenderInstanceId instanceId) override; void Render(const SOffscreenRendererEnvironment &inEnvironment, - NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, - SScene::RenderClearCommand inColorBufferNeedsClear) override; + NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, + SScene::RenderClearCommand inColorBufferNeedsClear, + const SRenderInstanceId instanceId) override; void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment, - NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, - SScene::RenderClearCommand inColorBufferNeedsClear, - QT3DSVec3 inclearColor) override {} + NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, + SScene::RenderClearCommand inColorBufferNeedsClear, + QT3DSVec3 inclearColor, + const SRenderInstanceId instanceId) override {} - IGraphObjectPickQuery *GetGraphObjectPickQuery() override + IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId instanceId) override { + Q_UNUSED(instanceId) return nullptr; } - bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions) override + bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions, + const SRenderInstanceId instanceId) override { Q_UNUSED(inMouseCoords) Q_UNUSED(inViewportDimensions) + Q_UNUSED(instanceId) return false; } static const char *GetRendererName() { return "qml-render"; } diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.cpp index d8fe3a64..94fe815d 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.cpp @@ -88,6 +88,13 @@ namespace render { SEndlType Endl; + static SRenderInstanceId combineLayerAndId(const SLayer *layer, const SRenderInstanceId id) + { + uint64_t x = (uint64_t)layer; + x += 31u * (uint64_t)id; + return (SRenderInstanceId)x; + } + Qt3DSRendererImpl::Qt3DSRendererImpl(IQt3DSRenderContext &ctx) : m_qt3dsContext(ctx) , m_Context(ctx.GetRenderContext()) @@ -105,7 +112,7 @@ namespace render { , m_LayerBlendTexture(ctx.GetResourceManager()) , m_BlendFB(NULL) #endif - , m_LayerToRenderMap(ctx.GetAllocator(), "Qt3DSRendererImpl::m_LayerToRenderMap") + , m_InstanceRenderMap(ctx.GetAllocator(), "Qt3DSRendererImpl::m_InstanceRenderMap") , m_LastFrameLayers(ctx.GetAllocator(), "Qt3DSRendererImpl::m_LastFrameLayers") , mRefCount(0) , m_LastPickResults(ctx.GetAllocator(), "Qt3DSRendererImpl::m_LastPickResults") @@ -128,7 +135,7 @@ namespace render { NVDelete(m_Context->GetAllocator(), iter->second); m_Shaders.clear(); - m_LayerToRenderMap.clear(); + m_InstanceRenderMap.clear(); m_ConstantBuffers.clear(); } @@ -139,9 +146,9 @@ namespace render { void Qt3DSRendererImpl::ChildrenUpdated(SNode &inParent) { if (inParent.m_Type == GraphObjectTypes::Layer) { - TLayerRenderMap::iterator theIter = - m_LayerToRenderMap.find(static_cast(&inParent)); - if (theIter != m_LayerToRenderMap.end()) { + TInstanceRenderMap::iterator theIter = + m_InstanceRenderMap.find(static_cast(&inParent)); + if (theIter != m_InstanceRenderMap.end()) { theIter->second->m_CamerasAndLights.clear(); theIter->second->m_RenderableNodes.clear(); } @@ -182,8 +189,9 @@ namespace render { } bool Qt3DSRendererImpl::PrepareLayerForRender(SLayer &inLayer, - const QT3DSVec2 &inViewportDimensions, - bool inRenderSiblings) + const QT3DSVec2 &inViewportDimensions, + bool inRenderSiblings, + const SRenderInstanceId id) { (void)inViewportDimensions; nvvector renderableLayers(m_qt3dsContext.GetPerFrameAllocator(), "LayerVector"); @@ -199,7 +207,7 @@ namespace render { iter != end; ++iter) { // Store the previous state of if we were rendering a layer. SLayer *theLayer = *iter; - SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer); + SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer, id); if (theRenderData) { theRenderData->PrepareForRender(); @@ -213,7 +221,8 @@ namespace render { } void Qt3DSRendererImpl::RenderLayer(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, - bool clear, QT3DSVec3 clearColor, bool inRenderSiblings) + bool clear, QT3DSVec3 clearColor, bool inRenderSiblings, + const SRenderInstanceId id) { (void)inViewportDimensions; nvvector renderableLayers(m_qt3dsContext.GetPerFrameAllocator(), "LayerVector"); @@ -228,7 +237,7 @@ namespace render { end = renderableLayers.rend(); iter != end; ++iter) { SLayer *theLayer = *iter; - SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer); + SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer, id); SLayerRenderPreparationResult &prepRes(*theRenderData->m_LayerPrepResult); LayerBlendTypes::Enum layerBlend = prepRes.GetLayer()->GetLayerBlend(); #ifdef ADVANCED_BLEND_SW_FALLBACK @@ -270,7 +279,7 @@ namespace render { iter != end; ++iter) { // Store the previous state of if we were rendering a layer. SLayer *theLayer = *iter; - SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer); + SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer, id); if (theRenderData) { if (theRenderData->m_LayerPrepResult->IsLayerVisible()) @@ -291,17 +300,19 @@ namespace render { return NULL; } - SLayerRenderData *Qt3DSRendererImpl::GetOrCreateLayerRenderDataForNode(const SNode &inNode) + SLayerRenderData *Qt3DSRendererImpl::GetOrCreateLayerRenderDataForNode(const SNode &inNode, + const SRenderInstanceId id) { const SLayer *theLayer = GetLayerForNode(inNode); if (theLayer) { - TLayerRenderMap::const_iterator theIter = m_LayerToRenderMap.find(theLayer); - if (theIter != m_LayerToRenderMap.end()) + TInstanceRenderMap::const_iterator theIter + = m_InstanceRenderMap.find(combineLayerAndId(theLayer, id)); + if (theIter != m_InstanceRenderMap.end()) return const_cast(theIter->second.mPtr); SLayerRenderData *theRenderData = QT3DS_NEW(m_Context->GetAllocator(), SLayerRenderData)( const_cast(*theLayer), *this); - m_LayerToRenderMap.insert(make_pair(theLayer, theRenderData)); + m_InstanceRenderMap.insert(make_pair(combineLayerAndId(theLayer, id), theRenderData)); // create a profiler if enabled if (IsLayerGpuProfilingEnabled() && theRenderData) @@ -607,7 +618,7 @@ namespace render { *thePickResult.m_FirstSubObject); QT3DSVec2 theMouseCoords = mouseAndViewport.first; QT3DSVec2 theViewportDimensions = mouseAndViewport.second; - IGraphObjectPickQuery *theQuery = theSubRenderer->GetGraphObjectPickQuery(); + IGraphObjectPickQuery *theQuery = theSubRenderer->GetGraphObjectPickQuery(this); if (theQuery) { Qt3DSRenderPickResult theInnerPickResult = theQuery->Pick(theMouseCoords, theViewportDimensions, inPickEverything); @@ -629,7 +640,7 @@ namespace render { // itself. So no matter what, if we get to here the pick was consumed. thePickResult.m_WasPickConsumed = true; bool wasPickConsumed = - theSubRenderer->Pick(theMouseCoords, theViewportDimensions); + theSubRenderer->Pick(theMouseCoords, theViewportDimensions, this); if (wasPickConsumed) { thePickResult.m_HitObject = NULL; foundValidResult = true; @@ -645,7 +656,7 @@ namespace render { Qt3DSRenderPickResult Qt3DSRendererImpl::Pick(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, const QT3DSVec2 &inMouseCoords, bool inPickSiblings, - bool inPickEverything) + bool inPickEverything, const SRenderInstanceId id) { m_LastPickResults.clear(); @@ -655,8 +666,9 @@ namespace render { // vector itself. do { if (theLayer->m_Flags.IsActive()) { - TLayerRenderMap::iterator theIter = m_LayerToRenderMap.find(theLayer); - if (theIter != m_LayerToRenderMap.end()) { + TInstanceRenderMap::iterator theIter + = m_InstanceRenderMap.find(combineLayerAndId(theLayer, id)); + if (theIter != m_InstanceRenderMap.end()) { m_LastPickResults.clear(); GetLayerHitObjectList(*theIter->second, inViewportDimensions, inMouseCoords, inPickEverything, m_LastPickResults, @@ -790,26 +802,12 @@ namespace render { } Qt3DSRenderPickResult - Qt3DSRendererImpl::PickOffscreenLayer(SLayer &inLayer, const QT3DSVec2 & /*inViewportDimensions*/ + Qt3DSRendererImpl::PickOffscreenLayer(SLayer &/*inLayer*/, const QT3DSVec2 & /*inViewportDimensions*/ , const QT3DSVec2 & /*inMouseCoords*/ , bool /*inPickEverything*/) { - if (inLayer.m_Flags.IsActive()) { - TLayerRenderMap::iterator theIter = m_LayerToRenderMap.find(&inLayer); - if (theIter != m_LayerToRenderMap.end()) { - /* - m_LastPickResults.clear(); - GetLayerHitObjectList( *theIter->second, inViewportDimensions, inMouseCoords, - m_LastPickResults, m_FrameTemporaryAllocator ); - SPickResultProcessResult retval( ProcessPickResultList() ); - if ( retval.m_WasPickConsumed ) - return retval;*/ - } else { - // QT3DS_ASSERT( false ); - } - } return Qt3DSRenderPickResult(); } @@ -1032,17 +1030,18 @@ namespace render { return GetWorldToPixelScaleFactor(*theData->m_Camera, inWorldPoint, *theData); } - void Qt3DSRendererImpl::ReleaseLayerRenderResources(SLayer &inLayer) + void Qt3DSRendererImpl::ReleaseLayerRenderResources(SLayer &inLayer, const SRenderInstanceId id) { - TLayerRenderMap::iterator theIter = m_LayerToRenderMap.find(&inLayer); - if (theIter != m_LayerToRenderMap.end()) { + TInstanceRenderMap::iterator theIter + = m_InstanceRenderMap.find(combineLayerAndId(&inLayer, id)); + if (theIter != m_InstanceRenderMap.end()) { TLayerRenderList::iterator theLastFrm = eastl::find( m_LastFrameLayers.begin(), m_LastFrameLayers.end(), theIter->second.mPtr); if (theLastFrm != m_LastFrameLayers.end()) { theIter->second->ResetForFrame(); m_LastFrameLayers.erase(theLastFrm); } - m_LayerToRenderMap.erase(theIter); + m_InstanceRenderMap.erase(theIter); } } @@ -1318,7 +1317,7 @@ namespace render { } } else { IGraphObjectPickQuery *theQuery = - inLayerRenderData.m_LastFrameOffscreenRenderer->GetGraphObjectPickQuery(); + inLayerRenderData.m_LastFrameOffscreenRenderer->GetGraphObjectPickQuery(this); if (theQuery) { Qt3DSRenderPickResult theResult = theQuery->Pick(inPresCoords, inViewportDimensions, inPickEverything); @@ -1329,7 +1328,8 @@ namespace render { } } else inLayerRenderData.m_LastFrameOffscreenRenderer->Pick(inPresCoords, - inViewportDimensions); + inViewportDimensions, + this); } } } @@ -1867,14 +1867,14 @@ namespace render { return; char messageLine[1024]; - TLayerRenderMap::const_iterator theIter; + TInstanceRenderMap::const_iterator theIter; QT3DSF32 startY = y; - for (theIter = m_LayerToRenderMap.begin(); theIter != m_LayerToRenderMap.end(); theIter++) { + for (theIter = m_InstanceRenderMap.begin(); theIter != m_InstanceRenderMap.end(); theIter++) { QT3DSF32 startX = x; const SLayerRenderData *theLayerRenderData = theIter->second; - const SLayer *theLayer = theIter->first; + const SLayer *theLayer = &theLayerRenderData->m_Layer; if (theLayer->m_Flags.IsActive() && theLayerRenderData->m_LayerProfilerGpu.mPtr) { const IRenderProfiler::TStrIDVec &idList = diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.h b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.h index 2d31c66f..5218d268 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.h +++ b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.h @@ -155,7 +155,8 @@ namespace render { typedef nvhash_map TShaderMap; typedef nvhash_map> TStrConstanBufMap; - typedef nvhash_map> TLayerRenderMap; + typedef nvhash_map, + eastl::hash> TInstanceRenderMap; typedef nvvector TLayerRenderList; typedef nvvector TPickResultArray; @@ -267,7 +268,7 @@ namespace render { NVScopedRefCounted m_BlendFB; #endif // Allocator for temporary data that is cleared after every layer. - TLayerRenderMap m_LayerToRenderMap; + TInstanceRenderMap m_InstanceRenderMap; TLayerRenderList m_LastFrameLayers; volatile QT3DSI32 mRefCount; @@ -315,24 +316,27 @@ namespace render { // Calls prepare layer for render // and then do render layer. bool PrepareLayerForRender(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, - bool inRenderSiblings) override; + bool inRenderSiblings, const SRenderInstanceId id) override; void RenderLayer(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, - bool clear, QT3DSVec3 clearColor, bool inRenderSiblings) override; + bool clear, QT3DSVec3 clearColor, bool inRenderSiblings, + const SRenderInstanceId id) override; void ChildrenUpdated(SNode &inParent) override; QT3DSF32 GetTextScale(const SText &inText) override; SCamera *GetCameraForNode(const SNode &inNode) const override; Option GetCameraBounds(const SGraphObject &inObject) override; virtual SLayer *GetLayerForNode(const SNode &inNode) const; - SLayerRenderData *GetOrCreateLayerRenderDataForNode(const SNode &inNode); + SLayerRenderData *GetOrCreateLayerRenderDataForNode(const SNode &inNode, + const SRenderInstanceId id = nullptr); void BeginFrame() override; void EndFrame() override; void PickRenderPlugins(bool inPick) override { m_PickRenderPlugins = inPick; } Qt3DSRenderPickResult Pick(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, - const QT3DSVec2 &inMouseCoords, bool inPickSiblings, - bool inPickEverything) override; + const QT3DSVec2 &inMouseCoords, bool inPickSiblings, + bool inPickEverything, + const SRenderInstanceId id) override; virtual Option FacePosition(SNode &inNode, NVBounds3 inBounds, const QT3DSMat44 &inGlobalTransform, @@ -372,7 +376,7 @@ namespace render { const QT3DSVec3 &inWorldPoint, SLayerRenderData &inRenderData); - void ReleaseLayerRenderResources(SLayer &inLayer) override; + void ReleaseLayerRenderResources(SLayer &inLayer, const SRenderInstanceId id) override; void RenderQuad(const QT3DSVec2 inDimensions, const QT3DSMat44 &inMVP, NVRenderTexture2D &inQuadTexture) override; diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp index 301e66df..81ba30f2 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp @@ -1176,12 +1176,12 @@ namespace render { m_LastFrameOffscreenRenderer->RenderWithClear( CreateOffscreenRenderEnvironment(), m_Renderer.GetContext(), m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(), - SScene::AlwaysClear, m_Layer.m_ClearColor); + SScene::AlwaysClear, m_Layer.m_ClearColor, &m_Layer); } else { m_LastFrameOffscreenRenderer->Render( CreateOffscreenRenderEnvironment(), m_Renderer.GetContext(), m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(), - SScene::ClearIsOptional); + SScene::ClearIsOptional, &m_Layer); } } else { RenderDepthPass(false); @@ -1268,7 +1268,8 @@ namespace render { // progressive AA algorithm. if (thePrepResult.m_Flags.WasLayerDataDirty() || thePrepResult.m_Flags.WasDirty() - || m_Renderer.IsLayerCachingEnabled() == false) { + || m_Renderer.IsLayerCachingEnabled() == false + || thePrepResult.m_Flags.ShouldRenderToTexture()) { m_ProgressiveAAPassIndex = 0; m_NonDirtyTemporalAAPassIndex = 0; needsRender = true; diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderPreparationData.cpp index a259311f..c6ea43dd 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderPreparationData.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderPreparationData.cpp @@ -1395,7 +1395,7 @@ namespace render { theViewport); SOffscreenRenderFlags theResult = m_LastFrameOffscreenRenderer->NeedsRender( CreateOffscreenRenderEnvironment(), - m_Renderer.GetQt3DSContext().GetPresentationScaleFactor()); + m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(), &m_Layer); wasDataDirty = wasDataDirty || theResult.m_HasChangedSinceLastFrame; } } diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOffscreenRenderManager.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOffscreenRenderManager.cpp index 8eaf36db..d05888ba 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOffscreenRenderManager.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOffscreenRenderManager.cpp @@ -361,7 +361,7 @@ struct SOffscreenRenderManager : public IOffscreenRenderManager theContext.SetScissorTestEnabled(false); theData.m_Renderer->Render(theDesiredEnvironment, theContext, thePresScaleFactor, - SScene::AlwaysClear); + SScene::AlwaysClear, this); if (theSampleCount > 1) { CResourceTexture2D theResult(*m_ResourceManager, theData.m_Texture); @@ -443,7 +443,7 @@ struct SOffscreenRenderManager : public IOffscreenRenderManager SOffscreenRunnable)(*this, theData, theDesiredEnvironment)); SOffscreenRenderFlags theFlags = - theData.m_Renderer->NeedsRender(theDesiredEnvironment, thePresScaleFactor); + theData.m_Renderer->NeedsRender(theDesiredEnvironment, thePresScaleFactor, this); theData.m_HasTransparency = theFlags.m_HasTransparency; theData.m_HasChangedSinceLastFrame = theFlags.m_HasChangedSinceLastFrame; if (theData.m_Texture) { diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOldNBustedRenderPlugin.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOldNBustedRenderPlugin.cpp index 76792b3b..4028373b 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOldNBustedRenderPlugin.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOldNBustedRenderPlugin.cpp @@ -95,7 +95,8 @@ namespace render { SOffscreenRenderFlags COldNBustedPluginRenderer::NeedsRender(const SOffscreenRendererEnvironment & /*inEnvironment*/, - QT3DSVec2 /*inPresScale*/) + QT3DSVec2 /*inPresScale*/, + const SRenderInstanceId) { return SOffscreenRenderFlags(true, true); } @@ -104,7 +105,8 @@ namespace render { // if it should be treated as a completely opaque image. void COldNBustedPluginRenderer::Render(const SOffscreenRendererEnvironment &inEnvironment, NVRenderContext &inRenderContext, QT3DSVec2 /*inPresScale*/, - SScene::RenderClearCommand /*inClearColorBuffer*/) + SScene::RenderClearCommand /*inClearColorBuffer*/, + const SRenderInstanceId) { inRenderContext.PushPropertySet(); diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp index 987708c2..367dffc0 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp @@ -328,7 +328,8 @@ struct InstanceImpl : public IRenderPluginInstance // Returns true of this object needs to be rendered, false if this object is not dirty SOffscreenRenderFlags NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, - QT3DSVec2 inPresentationScaleFactor) override + QT3DSVec2 inPresentationScaleFactor, + const SRenderInstanceId instanceId) override { if (m_Dirty) { m_Dirty = false; @@ -362,8 +363,9 @@ struct InstanceImpl : public IRenderPluginInstance // If we do so, the scale factor tells the subpresentation renderer how much the system has // scaled. void Render(const SOffscreenRendererEnvironment &inEnvironment, - NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, - SScene::RenderClearCommand inColorBufferNeedsClear) override + NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, + SScene::RenderClearCommand inColorBufferNeedsClear, + const SRenderInstanceId instanceId) override { m_RenderContext = &inRenderContext; if (m_Class.RenderInstance) { @@ -386,7 +388,8 @@ struct InstanceImpl : public IRenderPluginInstance void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment, NVRenderContext &inRenderContext, QT3DSVec2 inPresScale, - SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor) + SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor, + const SRenderInstanceId id) { Q_ASSERT(false); } @@ -395,7 +398,7 @@ struct InstanceImpl : public IRenderPluginInstance // If this renderer supports picking that can return graph objects // then return an interface here. - IGraphObjectPickQuery *GetGraphObjectPickQuery() override { return NULL; } + IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId) override { return NULL; } // If you *don't* support the GraphObjectPickIterator interface, then you should implement this // interface @@ -403,7 +406,8 @@ struct InstanceImpl : public IRenderPluginInstance // If you return true, then we will assume that you swallowed the pick and will continue no // further. // else we will assume you did not and will continue the picking algorithm. - bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions) override + bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions, + const SRenderInstanceId instanceId) override { if (m_Class.Pick) { if (m_RenderContext) { diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp index 56d0e98d..172d4079 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp @@ -68,13 +68,14 @@ namespace render { SOffscreenRenderFlags CSubPresentationRenderer::NeedsRender(const SOffscreenRendererEnvironment & /*inEnvironment*/, - QT3DSVec2 /*inPresScale*/) + QT3DSVec2 /*inPresScale*/, + const SRenderInstanceId instanceId) { bool hasTransparency = m_Presentation.m_Scene->m_UseClearColor ? false : true; NVRenderRect theViewportSize(m_RenderContext.GetRenderList().GetViewport()); bool wasDirty = m_Presentation.m_Scene->PrepareForRender( QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height), - m_RenderContext); + m_RenderContext, instanceId); return SOffscreenRenderFlags(hasTransparency, wasDirty); } @@ -82,7 +83,8 @@ namespace render { // if it should be treated as a completely opaque image. void CSubPresentationRenderer::Render(const SOffscreenRendererEnvironment &inEnvironment, NVRenderContext &inRenderContext, QT3DSVec2, - SScene::RenderClearCommand inClearColorBuffer) + SScene::RenderClearCommand inClearColorBuffer, + const SRenderInstanceId instanceId) { SSubPresentationHelper theHelper( m_RenderContext, @@ -90,19 +92,20 @@ namespace render { NVRenderRect theViewportSize(inRenderContext.GetViewport()); m_Presentation.m_Scene->Render( QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height), - m_RenderContext, inClearColorBuffer); + m_RenderContext, inClearColorBuffer, instanceId); m_LastRenderedEnvironment = inEnvironment; } void CSubPresentationRenderer::RenderWithClear( const SOffscreenRendererEnvironment &inEnvironment, NVRenderContext &inRenderContext, QT3DSVec2 inPresScale, - SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor) + SScene::RenderClearCommand inClearBuffer, QT3DSVec3 inClearColor, + const SRenderInstanceId id) { NVRenderRect theViewportSize(inRenderContext.GetViewport()); m_Presentation.m_Scene->RenderWithClear( QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height), - m_RenderContext, inClearBuffer, inClearColor); + m_RenderContext, inClearBuffer, inClearColor, id); } // You know the viewport dimensions because diff --git a/src/Runtime/Source/Qt3DSRuntimeRender/Source/q3dsqmlrender.cpp b/src/Runtime/Source/Qt3DSRuntimeRender/Source/q3dsqmlrender.cpp index a29ea604..cb1af6fc 100644 --- a/src/Runtime/Source/Qt3DSRuntimeRender/Source/q3dsqmlrender.cpp +++ b/src/Runtime/Source/Qt3DSRuntimeRender/Source/q3dsqmlrender.cpp @@ -83,7 +83,8 @@ SOffscreenRendererEnvironment Q3DSQmlRender::GetDesiredEnvironment(QT3DSVec2 inP } SOffscreenRenderFlags Q3DSQmlRender::NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, - QT3DSVec2 inPresentationScaleFactor) + QT3DSVec2 inPresentationScaleFactor, + const SRenderInstanceId instanceId) { Q_UNUSED(inEnvironment); Q_UNUSED(inPresentationScaleFactor); @@ -96,8 +97,9 @@ SOffscreenRenderFlags Q3DSQmlRender::NeedsRender(const SOffscreenRendererEnviron } void Q3DSQmlRender::Render(const SOffscreenRendererEnvironment &inEnvironment, - NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, - SScene::RenderClearCommand inColorBufferNeedsClear) + NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor, + SScene::RenderClearCommand inColorBufferNeedsClear, + const SRenderInstanceId instanceId) { Q_UNUSED(inEnvironment); Q_UNUSED(inPresentationScaleFactor); -- cgit v1.2.3