diff options
-rw-r--r-- | src/core/qchangearbiter.cpp | 15 | ||||
-rw-r--r-- | src/core/qchangearbiter_p.h | 1 | ||||
-rw-r--r-- | src/quick3d/imports/scene3d/scene3ditem.cpp | 7 |
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; |