summaryrefslogtreecommitdiffstats
path: root/src/quick3d/imports/scene3d/scene3drenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick3d/imports/scene3d/scene3drenderer.cpp')
-rw-r--r--src/quick3d/imports/scene3d/scene3drenderer.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/quick3d/imports/scene3d/scene3drenderer.cpp b/src/quick3d/imports/scene3d/scene3drenderer.cpp
index bc75e0861..bc4dbd362 100644
--- a/src/quick3d/imports/scene3d/scene3drenderer.cpp
+++ b/src/quick3d/imports/scene3d/scene3drenderer.cpp
@@ -57,6 +57,7 @@
#include <scene3ditem_p.h>
#include <scene3dlogging_p.h>
#include <scene3dsgnode_p.h>
+#include <scene3dview_p.h>
QT_BEGIN_NAMESPACE
@@ -159,6 +160,7 @@ Scene3DRenderer::Scene3DRenderer(Scene3DItem *item, Qt3DCore::QAspectEngine *asp
, m_needsShutdown(true)
, m_forceRecreate(false)
, m_shouldRender(false)
+ , m_dirtyViews(false)
, m_allowRendering(0)
{
Q_CHECK_PTR(m_item);
@@ -313,9 +315,23 @@ void Scene3DRenderer::beforeSynchronize()
m_texture.reset(m_window->createTextureFromId(m_finalFBO->texture(), m_finalFBO->size(), QQuickWindow::TextureHasAlphaChannel));
}
+ // We can render either the Scene3D or the Scene3DView but not both
+ // at the same time
+ Q_ASSERT((m_node == nullptr || m_views.empty()) ||
+ (m_node != nullptr && m_views.empty()) ||
+ (m_node == nullptr && !m_views.empty()));
+
// Set texture on node
if (m_node && (!m_node->texture() || generateNewTexture))
m_node->setTexture(m_texture.data());
+
+ // Set textures on Scene3DView
+ if (m_dirtyViews || generateNewTexture) {
+ for (Scene3DView *view : qAsConst(m_views))
+ if (!view->texture() || generateNewTexture)
+ view->setTexture(m_texture.data());
+ m_dirtyViews = false;
+ }
}
if (m_aspectEngine->rootEntity() != m_item->entity()) {
@@ -326,6 +342,9 @@ void Scene3DRenderer::beforeSynchronize()
if (m_node)
m_node->markDirty(QSGNode::DirtyMaterial);
+ for (Scene3DView *view : qAsConst(m_views))
+ view->markSGNodeDirty();
+
m_item->update();
}
}
@@ -340,6 +359,13 @@ void Scene3DRenderer::setCompositingMode(Scene3DItem::CompositingMode mode)
m_compositingMode = mode;
}
+// Main Thread, Render Thread locked
+void Scene3DRenderer::setScene3DViews(const QVector<Scene3DView *> views)
+{
+ m_views = views;
+ m_dirtyViews = true;
+}
+
void Scene3DRenderer::setSGNode(Scene3DSGNode *node)
{
m_node = node;