summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem.cpp1
-rw-r--r--src/quick3d/quick3d/qqmlaspectengine.cpp1
-rw-r--r--src/render/frontend/qwindow.cpp1
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);