diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/aspects/qaspectengine.cpp | 36 | ||||
-rw-r--r-- | src/core/aspects/qaspectengine.h | 3 | ||||
-rw-r--r-- | src/core/aspects/qaspectengine_p.h | 3 | ||||
-rw-r--r-- | src/quick3d/imports/scene3d/scene3ditem.cpp | 1 | ||||
-rw-r--r-- | src/quick3d/quick3d/qqmlaspectengine.cpp | 1 | ||||
-rw-r--r-- | src/render/frontend/qwindow.cpp | 1 |
6 files changed, 22 insertions, 23 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); diff --git a/src/core/aspects/qaspectengine.h b/src/core/aspects/qaspectengine.h index ef30a2a56..b472e4130 100644 --- a/src/core/aspects/qaspectengine.h +++ b/src/core/aspects/qaspectengine.h @@ -59,9 +59,6 @@ public: explicit QAspectEngine(QObject *parent = 0); ~QAspectEngine(); - void initialize(); - void shutdown(); - void setRootEntity(QEntity *root); QSharedPointer<QEntity> rootEntity() const; diff --git a/src/core/aspects/qaspectengine_p.h b/src/core/aspects/qaspectengine_p.h index 71f8bd8fc..030c3de13 100644 --- a/src/core/aspects/qaspectengine_p.h +++ b/src/core/aspects/qaspectengine_p.h @@ -77,6 +77,9 @@ public: QSharedPointer<QEntity> m_root; QList<QAbstractAspect*> m_aspects; + void initialize(); + void shutdown(); + void initNodeTree(QNode *node); void initNode(QNode *node); void initEntity(QEntity *entity); diff --git a/src/quick3d/imports/scene3d/scene3ditem.cpp b/src/quick3d/imports/scene3d/scene3ditem.cpp index b8f590d84..ef839ae87 100644 --- a/src/quick3d/imports/scene3d/scene3ditem.cpp +++ b/src/quick3d/imports/scene3d/scene3ditem.cpp @@ -479,7 +479,6 @@ Scene3DItem::Scene3DItem(QQuickItem *parent) m_aspectEngine->setData(data); m_aspectEngine->registerAspect(m_renderAspect); - m_aspectEngine->initialize(); } Scene3DItem::~Scene3DItem() diff --git a/src/quick3d/quick3d/qqmlaspectengine.cpp b/src/quick3d/quick3d/qqmlaspectengine.cpp index c6c2a6b3d..cf2372ca5 100644 --- a/src/quick3d/quick3d/qqmlaspectengine.cpp +++ b/src/quick3d/quick3d/qqmlaspectengine.cpp @@ -77,7 +77,6 @@ void QQmlAspectEngine::setSource(const QUrl &source) Q_D(QQmlAspectEngine); if (d->m_component) { - d->m_aspectEngine->shutdown(); d->m_aspectEngine->setRootEntity(Q_NULLPTR); d->m_component = Q_NULLPTR; } diff --git a/src/render/frontend/qwindow.cpp b/src/render/frontend/qwindow.cpp index d5033c312..07db56bba 100644 --- a/src/render/frontend/qwindow.cpp +++ b/src/render/frontend/qwindow.cpp @@ -173,7 +173,6 @@ void QWindow::show() data.insert(QStringLiteral("eventSource"), QVariant::fromValue(this)); d->m_engine->setData(data); - d->m_engine->initialize(); d->m_root->addComponent(d->m_frameGraph); d->m_engine->setRootEntity(d->m_root); |