summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/qchangearbiter.cpp15
-rw-r--r--src/core/qchangearbiter_p.h1
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem.cpp7
3 files changed, 20 insertions, 3 deletions
diff --git a/src/core/qchangearbiter.cpp b/src/core/qchangearbiter.cpp
index e5745b017..3672777de 100644
--- a/src/core/qchangearbiter.cpp
+++ b/src/core/qchangearbiter.cpp
@@ -171,12 +171,21 @@ void QChangeArbiter::removeLockingChangeQueue(QChangeArbiter::QChangeQueue *queu
void QChangeArbiter::syncChanges()
{
- const std::lock_guard<QRecursiveMutex> locker(m_mutex);;
- for (QChangeArbiter::QChangeQueue *changeQueue : qAsConst(m_changeQueues))
+ const std::lock_guard<QRecursiveMutex> locker(m_mutex);
+
+ bool hasChanges = false;
+ for (QChangeArbiter::QChangeQueue *changeQueue : qAsConst(m_changeQueues)) {
+ hasChanges |= !changeQueue->empty();
distributeQueueChanges(changeQueue);
+ }
- for (QChangeQueue *changeQueue : qAsConst(m_lockingChangeQueues))
+ for (QChangeQueue *changeQueue : qAsConst(m_lockingChangeQueues)) {
+ hasChanges |= !changeQueue->empty();
distributeQueueChanges(changeQueue);
+ }
+
+ if (hasChanges)
+ emit syncedChanges();
}
void QChangeArbiter::setScene(QScene *scene)
diff --git a/src/core/qchangearbiter_p.h b/src/core/qchangearbiter_p.h
index 483b46575..e32fe7da4 100644
--- a/src/core/qchangearbiter_p.h
+++ b/src/core/qchangearbiter_p.h
@@ -138,6 +138,7 @@ public:
Q_SIGNALS:
void receivedChange();
+ void syncedChanges();
protected:
typedef std::vector<QSceneChangePtr> QChangeQueue;
diff --git a/src/quick3d/imports/scene3d/scene3ditem.cpp b/src/quick3d/imports/scene3d/scene3ditem.cpp
index 586de9938..a720b8aa0 100644
--- a/src/quick3d/imports/scene3d/scene3ditem.cpp
+++ b/src/quick3d/imports/scene3d/scene3ditem.cpp
@@ -886,8 +886,15 @@ QSGNode *Scene3DItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNode
updateWindowSurface();
managerNode->init();
// Note: ChangeArbiter is only set after aspect was registered
+
+ // This allows Scene3DItem to know when it needs to re-render as a result of frontend nodes receiving a change.
QObject::connect(renderAspectPriv->m_aspectManager->changeArbiter(), &Qt3DCore::QChangeArbiter::receivedChange,
this, [this] { m_dirty = true; }, Qt::DirectConnection);
+
+ // This allows Scene3DItem to know when it needs to re-render as a result of backend nodes receiving a change.
+ // For e.g. nodes being created/destroyed.
+ QObject::connect(renderAspectPriv->m_aspectManager->changeArbiter(), &Qt3DCore::QChangeArbiter::syncedChanges,
+ this, [this] { m_dirty = true; }, Qt::QueuedConnection);
}
const bool usesFBO = m_compositingMode == FBO;