diff options
Diffstat (limited to 'src/quick3d/imports')
-rw-r--r-- | src/quick3d/imports/scene3d/scene3ditem.cpp | 5 | ||||
-rw-r--r-- | src/quick3d/imports/scene3d/scene3drenderer.cpp | 10 | ||||
-rw-r--r-- | src/quick3d/imports/scene3d/scene3drenderer_p.h | 4 | ||||
-rw-r--r-- | src/quick3d/imports/scene3d/scene3dsgnode.cpp | 10 | ||||
-rw-r--r-- | src/quick3d/imports/scene3d/scene3dsgnode_p.h | 2 |
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(); |