summaryrefslogtreecommitdiffstats
path: root/src/quick3d/imports
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick3d/imports')
-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();