summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/aspects/qaspectengine.cpp36
-rw-r--r--src/core/aspects/qaspectengine.h3
-rw-r--r--src/core/aspects/qaspectengine_p.h3
3 files changed, 22 insertions, 20 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);