summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-11-26 11:43:11 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-11-27 05:48:47 +0000
commit7b2b4eca3d836df9aa54ef1ca7b5ee1ba9304f13 (patch)
treea050b00230294ac5cabb27b1474ee1e2b8206806
parent69c38b45ad4ecb08ebdcbf83c5e4276cd02233b1 (diff)
Scene3D: handle flipping based on the RHI backend in use
Qt3D handles flipping based on whether the RHI backend in use requires it or not. Scene3D would also flip the content (ignoring the fact that the content was already in the correct orientation). This resulted in cases where a Qt 3D scene rendered with Scene3D would be flipped while the same scene rendered on its own (with Qt3DWindow) would be correct. Change-Id: I9fc2a01f63713ed3dbafaf896dfd9457d7160653 Task-number: QTBUG-87842 Reviewed-by: Mike Krus <mike.krus@kdab.com> (cherry picked from commit af56e7966d523714a3d64c0780fc266175431fd1) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem.cpp5
-rw-r--r--src/quick3d/imports/scene3d/scene3drenderer.cpp10
-rw-r--r--src/quick3d/imports/scene3d/scene3drenderer_p.h4
-rw-r--r--src/quick3d/imports/scene3d/scene3dsgnode.cpp10
-rw-r--r--src/quick3d/imports/scene3d/scene3dsgnode_p.h2
5 files changed, 28 insertions, 3 deletions
diff --git a/src/quick3d/imports/scene3d/scene3ditem.cpp b/src/quick3d/imports/scene3d/scene3ditem.cpp
index 2510f7164..ba2b5224f 100644
--- a/src/quick3d/imports/scene3d/scene3ditem.cpp
+++ b/src/quick3d/imports/scene3d/scene3ditem.cpp
@@ -857,7 +857,10 @@ QSGNode *Scene3DItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNode
if (fboNode) {
if (!fboNode->parent())
managerNode->appendChildNode(fboNode);
- fboNode->setRect(boundingRect());
+
+ // Depending on the backend in use, we might or might not have
+ // to flip content
+ fboNode->setRect(boundingRect(), !renderer->isYUp());
}
}
diff --git a/src/quick3d/imports/scene3d/scene3drenderer.cpp b/src/quick3d/imports/scene3d/scene3drenderer.cpp
index a6ad43182..aa96f62a4 100644
--- a/src/quick3d/imports/scene3d/scene3drenderer.cpp
+++ b/src/quick3d/imports/scene3d/scene3drenderer.cpp
@@ -198,6 +198,11 @@ Scene3DSGNode *Scene3DRenderer::sgNode() const
return m_node;
}
+bool Scene3DRenderer::isYUp() const
+{
+ return m_quickRenderer ? m_quickRenderer->isYUp() : true;
+}
+
// Executed in the QtQuick render thread (which may even be the gui/main with QQuickWidget / RenderControl).
void Scene3DRenderer::shutdown()
{
@@ -595,6 +600,11 @@ void Scene3DRenderer::RHIRenderer::shutdown(Scene3DRenderer *scene3DRenderer)
releaseRHIResources();
}
+bool Scene3DRenderer::RHIRenderer::isYUp() const
+{
+ return m_rhi->isYUpInNDC();
+}
+
void Scene3DRenderer::RHIRenderer::releaseRHIResources()
{
delete m_rhiRenderTarget;
diff --git a/src/quick3d/imports/scene3d/scene3drenderer_p.h b/src/quick3d/imports/scene3d/scene3drenderer_p.h
index 72e6d34ce..a279f2a63 100644
--- a/src/quick3d/imports/scene3d/scene3drenderer_p.h
+++ b/src/quick3d/imports/scene3d/scene3drenderer_p.h
@@ -101,6 +101,7 @@ public:
bool multisample() const { return m_multisample; }
QSize boundingSize() const { return m_boundingRectSize; }
+ bool isYUp() const;
void init(Qt3DCore::QAspectEngine *aspectEngine, QRenderAspect *renderAspect);
@@ -128,6 +129,7 @@ private:
virtual void beforeRendering(Scene3DRenderer *scene3DRenderer) = 0;
virtual void beforeRenderPassRecording(Scene3DRenderer *scene3DRenderer) = 0;
virtual void shutdown(Scene3DRenderer *sceneRenderer) = 0;
+ virtual bool isYUp() const = 0;
protected:
bool m_lastMultisample = false;
@@ -148,6 +150,7 @@ private:
void beforeRendering(Scene3DRenderer *scene3DRenderer) override;
void beforeRenderPassRecording(Scene3DRenderer *scene3DRenderer) override;
void shutdown(Scene3DRenderer *sceneRenderer) override;
+ bool isYUp() const override { return true; };
private:
QScopedPointer<QOpenGLFramebufferObject> m_multisampledFBO;
@@ -165,6 +168,7 @@ private:
void beforeRendering(Scene3DRenderer *scene3DRenderer) override;
void beforeRenderPassRecording(Scene3DRenderer *scene3DRenderer) override;
void shutdown(Scene3DRenderer *sceneRenderer) override;
+ bool isYUp() const override;
private:
void releaseRHIResources();
diff --git a/src/quick3d/imports/scene3d/scene3dsgnode.cpp b/src/quick3d/imports/scene3d/scene3dsgnode.cpp
index 630cf49a9..011f0d0d3 100644
--- a/src/quick3d/imports/scene3d/scene3dsgnode.cpp
+++ b/src/quick3d/imports/scene3d/scene3dsgnode.cpp
@@ -74,11 +74,19 @@ Scene3DSGNode::~Scene3DSGNode()
// is terminated.
}
-void Scene3DSGNode::setRect(const QRectF &rect, const QRectF textureRect)
+void Scene3DSGNode::setRect(const QRectF &rect, bool mirrorVertically)
{
if (rect != m_rect) {
m_rect = rect;
// By default, map the item's bounding rect to normalized texture coordinates
+
+ QRectF textureRect = QRectF(0.0f, 1.0f, 1.0f, -1.0f);
+ if (mirrorVertically) {
+ float tmp = textureRect.top();
+ textureRect.setTop(textureRect.bottom());
+ textureRect.setBottom(tmp);
+ }
+
QSGGeometry::updateTexturedRectGeometry(&m_geometry, m_rect, textureRect);
markDirty(DirtyGeometry);
}
diff --git a/src/quick3d/imports/scene3d/scene3dsgnode_p.h b/src/quick3d/imports/scene3d/scene3dsgnode_p.h
index 4c437b4a9..b33840aaf 100644
--- a/src/quick3d/imports/scene3d/scene3dsgnode_p.h
+++ b/src/quick3d/imports/scene3d/scene3dsgnode_p.h
@@ -75,7 +75,7 @@ public:
}
QSGTexture *texture() const noexcept { return m_material.texture(); }
- void setRect(const QRectF &rect, const QRectF textureRect = QRectF(0.0f, 1.0f, 1.0f, -1.0f));
+ void setRect(const QRectF &rect, bool mirrorVertically = false);
QRectF rect() const noexcept { return m_rect; }
void show();