summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMäättä Antti <antti.maatta@qt.io>2018-02-15 11:53:52 +0200
committerTomi Korpipää <tomi.korpipaa@qt.io>2018-02-16 10:29:12 +0000
commit9a68c0640cf2ced193ad113068af62416be3440f (patch)
tree887a5cd92c961497177f0e6ab11345f21e695836
parent5cf14bf70bb2dbb53be169e16c7f36c6d40fcf32 (diff)
Fix rendering same subpresentation to multiple layers
Add instancing support to layer rendering. Task-number: QT3DS-531 Change-Id: Ibb52951f0ae01c568d43d752b1f26ad49c626325 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.cpp32
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.cpp28
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/GraphObjects/Qt3DSRenderScene.h10
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOffscreenRenderManager.h16
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSOldNBustedRenderPlugin.h19
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderSubpresentation.h17
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/Qt3DSRenderer.h14
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Include/q3dsqmlrender.h22
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.cpp88
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImpl.h20
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderData.cpp7
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/RendererImpl/Qt3DSRendererImplLayerRenderPreparationData.cpp2
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOffscreenRenderManager.cpp4
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSOldNBustedRenderPlugin.cpp6
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderPlugin.cpp16
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Source/Qt3DSRenderSubpresentation.cpp15
-rw-r--r--src/Runtime/Source/Qt3DSRuntimeRender/Source/q3dsqmlrender.cpp8
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<SLayer *>(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<qt3ds::QT3DSVec3> 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<SLayer *>(&inParent));
- if (theIter != m_LayerToRenderMap.end()) {
+ TInstanceRenderMap::iterator theIter =
+ m_InstanceRenderMap.find(static_cast<SRenderInstanceId>(&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<SLayer *> 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<SLayer *> 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<SLayerRenderData *>(theIter->second.mPtr);
SLayerRenderData *theRenderData = QT3DS_NEW(m_Context->GetAllocator(), SLayerRenderData)(
const_cast<SLayer &>(*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<SShaderDefaultMaterialKey, SShaderGeneratorGeneratedShader *> TShaderMap;
typedef nvhash_map<CRegisteredString, NVScopedRefCounted<NVRenderConstantBuffer>>
TStrConstanBufMap;
- typedef nvhash_map<const SLayer *, NVScopedRefCounted<SLayerRenderData>> TLayerRenderMap;
+ typedef nvhash_map<SRenderInstanceId, NVScopedRefCounted<SLayerRenderData>,
+ eastl::hash<SRenderInstanceId>> TInstanceRenderMap;
typedef nvvector<SLayerRenderData *> TLayerRenderList;
typedef nvvector<Qt3DSRenderPickResult> TPickResultArray;
@@ -267,7 +268,7 @@ namespace render {
NVScopedRefCounted<NVRenderFrameBuffer> 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<SCuboidRect> 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<QT3DSVec2>
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);