summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2020-05-05 11:01:30 +0300
committerAntti Määttä <antti.maatta@qt.io>2020-05-07 08:35:00 +0300
commitfa819899abd4d405da782b34abde8a23cbc2da5a (patch)
treefc0f51b9300763414f7ff8128a5512c13b694bf6
parentfcfe2c787a6429323afe974ee8d9abcf8f2747ee (diff)
Fix studio viewport rendering when scene camera is visible
The runtime contains unused viewport parameters. Remove those and fix the editor by reading the scissor rect from render list instead of render context, which contains wrong scissor rect. Task-number: QT3DS-4103 Change-Id: I8b443c3a5e8d7ac84eb211633cea2afeed6da30b Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/engine/Qt3DSRenderRuntimeBinding.cpp5
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp4
-rw-r--r--src/engine/Qt3DSRuntimeView.h1
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.cpp25
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.h5
-rw-r--r--src/runtimerender/Qt3DSRenderSubpresentation.cpp5
-rw-r--r--src/runtimerender/Qt3DSRenderer.h2
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderScene.cpp4
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderScene.h2
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp2
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.h4
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp2
12 files changed, 15 insertions, 46 deletions
diff --git a/src/engine/Qt3DSRenderRuntimeBinding.cpp b/src/engine/Qt3DSRenderRuntimeBinding.cpp
index 3d7dac8..e099e47 100644
--- a/src/engine/Qt3DSRenderRuntimeBinding.cpp
+++ b/src/engine/Qt3DSRenderRuntimeBinding.cpp
@@ -293,10 +293,7 @@ struct Qt3DSRenderScene : public Q3DStudio::IScene
TransferDirtyProperties();
m_LastRenderViewport = m_Context->GetRenderList().GetViewport();
if (m_Presentation && m_Presentation->m_Scene) {
- NVRenderRect theViewportSize(m_LastRenderViewport);
- return m_Presentation->m_Scene->PrepareForRender(
- QT3DSVec2(QT3DSF32(theViewportSize.m_Width), QT3DSF32(theViewportSize.m_Height)),
- *m_Context);
+ return m_Presentation->m_Scene->PrepareForRender(*m_Context);
}
return false;
}
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
index 78a1d17..e0176c7 100644
--- a/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
+++ b/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
@@ -210,10 +210,6 @@ struct SRenderer : public Q3DStudio::ITegraApplicationRenderEngine
m_Viewport = NVRenderRect(inX, inY, inWidth, inHeight);
m_BindingCore->m_RenderContext->SetViewport(m_Viewport);
}
- void SetApplicationViewport(const qt3ds::render::NVRenderRect &inViewport) override
- {
- m_BindingCore->m_Context->SetViewport(inViewport);
- }
void SetMatteColor(Option<QT3DSVec4> inColor) override { m_Context->SetMatteColor(inColor); }
void setMatteEnabled(bool enabled) override { m_Context->setMatteEnabled(enabled); };
diff --git a/src/engine/Qt3DSRuntimeView.h b/src/engine/Qt3DSRuntimeView.h
index cb6da7f..72d8908 100644
--- a/src/engine/Qt3DSRuntimeView.h
+++ b/src/engine/Qt3DSRuntimeView.h
@@ -132,7 +132,6 @@ protected:
public:
virtual void SetViewport(INT32 inX, INT32 inY, INT32 inWidth, INT32 inHeight) = 0;
- virtual void SetApplicationViewport(const qt3ds::render::NVRenderRect &inViewport) = 0;
virtual void ensureRenderTarget() = 0;
virtual void CheckResize(bool inForce, IPresentation &inActivePresentation) = 0;
virtual QByteArray exportShaderCache(bool binaryShaders) = 0;
diff --git a/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/runtimerender/Qt3DSRenderContextCore.cpp
index d1d0fff..44f10c0 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.cpp
+++ b/src/runtimerender/Qt3DSRenderContextCore.cpp
@@ -241,8 +241,7 @@ struct SRenderContext : public IQt3DSRenderContext
NVScopedRefCounted<IRenderList> m_RenderList;
QT3DSU32 m_FrameCount;
volatile QT3DSI32 mRefCount;
- // Viewport that this render context should use
- Option<NVRenderRect> m_Viewport;
+
QSize m_WindowDimensions;
ScaleModes::Enum m_ScaleMode;
StereoModes::Enum m_StereoMode;
@@ -501,9 +500,6 @@ struct SRenderContext : public IQt3DSRenderContext
bool GetWireframeMode() override { return m_WireframeMode; }
- void SetViewport(Option<NVRenderRect> inViewport) override { m_Viewport = inViewport; }
- Option<NVRenderRect> GetViewport() const override { return m_Viewport; }
-
IRenderWidgetContext &GetRenderWidgetContext() override
{
return m_Renderer->GetRenderWidgetContext();
@@ -556,11 +552,7 @@ struct SRenderContext : public IQt3DSRenderContext
NVRenderRect GetContextViewport() const override
{
NVRenderRect retval;
- if (m_Viewport.hasValue())
- retval = *m_Viewport;
- else
- retval = NVRenderRect(0, 0, m_WindowDimensions.width(), m_WindowDimensions.height());
-
+ retval = NVRenderRect(0, 0, m_WindowDimensions.width(), m_WindowDimensions.height());
return retval;
}
@@ -697,12 +689,8 @@ struct SRenderContext : public IQt3DSRenderContext
m_PerFrameAllocator.reset();
IRenderList &theRenderList(*m_RenderList);
theRenderList.BeginFrame();
- if (m_Viewport.hasValue()) {
- theRenderList.SetScissorTestEnabled(true);
- theRenderList.SetScissorRect(theContextViewport);
- } else {
- theRenderList.SetScissorTestEnabled(false);
- }
+ theRenderList.SetScissorRect(theContextViewport);
+ theRenderList.SetScissorTestEnabled(false);
bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation;
eastl::pair<NVRenderRect, NVRenderRect> thePresViewportAndOuterViewport =
GetPresentationViewportAndOuterViewport();
@@ -782,11 +770,10 @@ struct SRenderContext : public IQt3DSRenderContext
{
bool stereoProgressiveEnabled = GetStereoProgressiveEnabled();
// Clearing for matte / scene background
- if (m_Viewport.hasValue() || stereoProgressiveEnabled) {
+ if (stereoProgressiveEnabled) {
// With progressive stereoscopic rendering needs to be adjusted to viewport
NVRenderRect theContextViewport(GetContextViewport());
- if (stereoProgressiveEnabled)
- adjustRectToStereoMode(theContextViewport);
+ adjustRectToStereoMode(theContextViewport);
m_RenderContext->SetScissorTestEnabled(true);
m_RenderContext->SetScissorRect(theContextViewport);
} else {
diff --git a/src/runtimerender/Qt3DSRenderContextCore.h b/src/runtimerender/Qt3DSRenderContextCore.h
index 64e91c0..c239d78 100644
--- a/src/runtimerender/Qt3DSRenderContextCore.h
+++ b/src/runtimerender/Qt3DSRenderContextCore.h
@@ -184,11 +184,6 @@ namespace render {
virtual void SetWindowDimensions(const QSize &inWindowDimensions) = 0;
virtual QSize GetWindowDimensions() = 0;
- // In addition to the window dimensions which really have to be set, you can optionally
- // set the viewport which will force the entire viewer to render specifically to this
- // viewport.
- virtual void SetViewport(Option<NVRenderRect> inViewport) = 0;
- virtual Option<NVRenderRect> GetViewport() const = 0;
virtual NVRenderRect GetContextViewport() const = 0;
// Only valid between calls to Begin,End.
virtual NVRenderRect GetPresentationViewport() const = 0;
diff --git a/src/runtimerender/Qt3DSRenderSubpresentation.cpp b/src/runtimerender/Qt3DSRenderSubpresentation.cpp
index 64f08be..8b13361 100644
--- a/src/runtimerender/Qt3DSRenderSubpresentation.cpp
+++ b/src/runtimerender/Qt3DSRenderSubpresentation.cpp
@@ -68,10 +68,7 @@ namespace render {
QT3DSVec2 /*inPresScale*/,
const SRenderInstanceId instanceId)
{
- NVRenderRect theViewportSize(m_RenderContext.GetRenderList().GetViewport());
- bool wasDirty = m_Presentation.m_Scene->PrepareForRender(
- QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height),
- m_RenderContext, instanceId);
+ bool wasDirty = m_Presentation.m_Scene->PrepareForRender(m_RenderContext, instanceId);
// Always transparent
return SOffscreenRenderFlags(true, wasDirty);
}
diff --git a/src/runtimerender/Qt3DSRenderer.h b/src/runtimerender/Qt3DSRenderer.h
index 336baab..50c27c3 100644
--- a/src/runtimerender/Qt3DSRenderer.h
+++ b/src/runtimerender/Qt3DSRenderer.h
@@ -132,7 +132,7 @@ namespace render {
virtual void RenderPointsIndirect() = 0;
// Returns true if this layer or a sibling was dirty.
- virtual bool PrepareLayerForRender(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
+ virtual bool PrepareLayerForRender(SLayer &inLayer,
bool inRenderSiblings = true,
const SRenderInstanceId id = nullptr) = 0;
virtual void RenderLayer(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, bool clear,
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp b/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp
index 2dadc26..afe68d5 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp
+++ b/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp
@@ -65,7 +65,7 @@ SLayer *SScene::GetLastChild()
return child;
}
-bool SScene::PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+bool SScene::PrepareForRender(IQt3DSRenderContext &inContext,
const SRenderInstanceId id)
{
// We need to iterate through the layers in reverse order and ask them to render.
@@ -74,7 +74,7 @@ bool SScene::PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRende
if (m_FirstChild) {
wasDirty |=
- inContext.GetRenderer().PrepareLayerForRender(*m_FirstChild, inViewportDimensions,
+ inContext.GetRenderer().PrepareLayerForRender(*m_FirstChild,
true, id);
}
return wasDirty;
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderScene.h b/src/runtimerender/graphobjects/Qt3DSRenderScene.h
index 8c4d3fe..00a4591 100644
--- a/src/runtimerender/graphobjects/Qt3DSRenderScene.h
+++ b/src/runtimerender/graphobjects/Qt3DSRenderScene.h
@@ -69,7 +69,7 @@ namespace render {
inRemapper.Remap(m_FirstChild);
}
// returns true if any of the layers were dirty or if this object was dirty
- bool PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+ bool PrepareForRender(IQt3DSRenderContext &inContext,
const SRenderInstanceId id = nullptr);
void Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
RenderClearCommand command = ClearIsOptional,
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
index 300980c..a8b6a4f 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
@@ -233,11 +233,9 @@ namespace render {
}
bool Qt3DSRendererImpl::PrepareLayerForRender(SLayer &inLayer,
- const QT3DSVec2 &inViewportDimensions,
bool inRenderSiblings,
const SRenderInstanceId id)
{
- (void)inViewportDimensions;
nvvector<SLayer *> renderableLayers(m_qt3dsContext.GetPerFrameAllocator(), "LayerVector");
// Found by fair roll of the dice.
renderableLayers.reserve(4);
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h
index 99b0b51..decd7fd 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h
@@ -342,8 +342,8 @@ namespace render {
// Calls prepare layer for render
// and then do render layer.
- bool PrepareLayerForRender(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
- bool inRenderSiblings, const SRenderInstanceId id) override;
+ bool PrepareLayerForRender(SLayer &inLayer, bool inRenderSiblings,
+ const SRenderInstanceId id) override;
void RenderLayer(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
bool clear, QT3DSVec4 clearColor, bool inRenderSiblings,
const SRenderInstanceId id) override;
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp
index 26b0a3c..54cb55f 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp
@@ -1414,7 +1414,7 @@ namespace render {
NVRenderRect theViewport(theGraph.GetViewport());
NVRenderRect theScissor(theGraph.GetViewport());
if (theGraph.IsScissorTestEnabled())
- theScissor = m_Renderer.GetContext().GetScissorRect();
+ theScissor = theGraph.GetScissor();
bool wasDirty = false;
bool wasDataDirty = false;
wasDirty = m_Layer.m_Flags.IsDirty();