diff options
Diffstat (limited to 'src/core/aspects/qaspectengine.cpp')
-rw-r--r-- | src/core/aspects/qaspectengine.cpp | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp index 5ac6f8c5d..eefe020cb 100644 --- a/src/core/aspects/qaspectengine.cpp +++ b/src/core/aspects/qaspectengine.cpp @@ -116,7 +116,7 @@ QAspectEngine::QAspectEngine(QObject *parent) QAspectEngine::~QAspectEngine() { Q_D(QAspectEngine); - shutdown(); + setRootEntity(Q_NULLPTR); delete d->m_aspectThread; delete d->m_postman; delete d->m_scene; @@ -128,44 +128,39 @@ void QAspectEnginePrivate::initNodeTree(QNode *node) visitor.traverse(node, this, &QAspectEnginePrivate::initNode, &QAspectEnginePrivate::initEntity); } -void QAspectEngine::initialize() +void QAspectEnginePrivate::initialize() { - Q_D(QAspectEngine); - QChangeArbiter *arbiter = d->m_aspectThread->aspectManager()->changeArbiter(); - d->m_scene->setArbiter(arbiter); + QChangeArbiter *arbiter = m_aspectThread->aspectManager()->changeArbiter(); + m_scene->setArbiter(arbiter); QChangeArbiter::createUnmanagedThreadLocalChangeQueue(arbiter); QMetaObject::invokeMethod(arbiter, "setPostman", - Q_ARG(Qt3DCore::QAbstractPostman*, d->m_postman)); + Q_ARG(Qt3DCore::QAbstractPostman*, m_postman)); QMetaObject::invokeMethod(arbiter, "setScene", - Q_ARG(Qt3DCore::QScene*, d->m_scene)); + Q_ARG(Qt3DCore::QScene*, m_scene)); } -void QAspectEngine::shutdown() +void QAspectEnginePrivate::shutdown() { - Q_D(QAspectEngine); qCDebug(Aspects) << Q_FUNC_INFO; - // Unset the root entity - setRootEntity(Q_NULLPTR); - // Cleanup the scene before quitting the backend - d->m_scene->setArbiter(Q_NULLPTR); - QChangeArbiter *arbiter = d->m_aspectThread->aspectManager()->changeArbiter(); + m_scene->setArbiter(Q_NULLPTR); + QChangeArbiter *arbiter = m_aspectThread->aspectManager()->changeArbiter(); QChangeArbiter::destroyUnmanagedThreadLocalChangeQueue(arbiter); // Tell the aspect thread to exit // This will return only after the aspectManager has // exited its exec loop - d->m_aspectThread->aspectManager()->quit(); + m_aspectThread->aspectManager()->quit(); // Wait for thread to exit - d->m_aspectThread->wait(); + m_aspectThread->wait(); qCDebug(Aspects) << Q_FUNC_INFO << "deleting aspects"; // Deletes aspects in the same thread as the one they were created in - qDeleteAll(d->m_aspects); + qDeleteAll(m_aspects); qCDebug(Aspects) << Q_FUNC_INFO << "Shutdown complete"; } @@ -265,15 +260,22 @@ void QAspectEngine::setRootEntity(QEntity *root) if (d->m_root == root) return; + const bool shutdownNeeded = d->m_root; + // Set the new root object. This will cause the old tree to be deleted // and the deletion of the old frontend tree will cause the backends to // free any related resources d->m_root.reset(root); + if (shutdownNeeded) + d->shutdown(); + // Do we actually have a new scene? if (!d->m_root) return; + d->initialize(); + // The aspect engine takes ownership of the scene root. We also set the // parent of the scene root to be the engine static_cast<QObject *>(d->m_root.data())->setParent(this); |