summaryrefslogtreecommitdiffstats
path: root/src/core/aspects
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-01-20 16:33:53 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-01-22 14:29:34 +0000
commit86177b98e27a9d376e35039454986ff7de8f3104 (patch)
tree6ac256365641f538128666917f0b5090d873320a /src/core/aspects
parent31e4d157c6b0af0c04546af643707a3811583455 (diff)
QAspectEngine/QAbstractAspects: get rid of setData
Getting rid of set data and the refactoring on setting the surface implies that: - Given the FrameGraph configuration, there may be several RenderViews each having a different RenderSurfaceSelector/Window - This means that the Renderer/QRenderAspect can't know about the surface before reading the scene - This means that the Renderer may be dealing with more than 1 window - This means that initialization, render and shutdown procedures will have to be updated accordingly Therefore the Renderer was refactored to: - Be initialized without knowing about a surface - For each RenderView, check the surface and if different from the previous one: * Make the context current with it * Create the appropriate glHelpers (as Surfaces may have != formats) TO DO: - Fix picking - Fix windows exposition - Fix shutdown / detection of all windows beging closed Change-Id: I49d070b05f46be4b26cfb57e494feba145d1da9c Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/core/aspects')
-rw-r--r--src/core/aspects/qabstractaspect.h2
-rw-r--r--src/core/aspects/qaspectengine.cpp20
-rw-r--r--src/core/aspects/qaspectengine.h1
-rw-r--r--src/core/aspects/qaspectmanager.cpp17
-rw-r--r--src/core/aspects/qaspectmanager_p.h2
5 files changed, 8 insertions, 34 deletions
diff --git a/src/core/aspects/qabstractaspect.h b/src/core/aspects/qabstractaspect.h
index e5842aa08..aa3404f1c 100644
--- a/src/core/aspects/qabstractaspect.h
+++ b/src/core/aspects/qabstractaspect.h
@@ -75,7 +75,7 @@ private:
virtual QVector<QAspectJobPtr> jobsToExecute(qint64 time) = 0;
- virtual void onInitialize(const QVariantMap &data) = 0;
+ virtual void onInitialize() = 0;
virtual void onCleanup() = 0;
virtual void onStartup();
diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp
index 3aa2b0f95..7eb26e1d6 100644
--- a/src/core/aspects/qaspectengine.cpp
+++ b/src/core/aspects/qaspectengine.cpp
@@ -165,27 +165,16 @@ void QAspectEnginePrivate::shutdown()
qCDebug(Aspects) << Q_FUNC_INFO << "Shutdown complete";
}
-// Main thread
-void QAspectEngine::setData(const QVariantMap &data)
-{
- Q_D(QAspectEngine);
- // Note: setData in the AspectManager is called in the main thread
- // which in turns calls onInitialize on each aspects in the main thread
- // We should keep the call to onInitialize in the main thread
- QMetaObject::invokeMethod(d->m_aspectThread->aspectManager(),
- "setData",
- Qt::BlockingQueuedConnection,
- Q_ARG(const QVariantMap &, data));
-}
-
/*!
* Registers a new \a aspect to the AspectManager.
- * Passing as a QObject* as abstracts like AbstractAspect
- * cannot be registered as a meta type.
*/
void QAspectEngine::registerAspect(QAbstractAspect *aspect)
{
Q_D(QAspectEngine);
+ // The aspect is moved to the AspectThread
+ // AspectManager::registerAspect is called in the context
+ // of the AspectThread. This is turns call aspect->onInitialize
+ // still in the same AspectThread context
aspect->moveToThread(d->m_aspectThread);
d->m_aspects << aspect;
QMetaObject::invokeMethod(d->m_aspectThread->aspectManager(),
@@ -265,6 +254,7 @@ void QAspectEngine::setRootEntity(QEntity *root)
if (!d->m_root)
return;
+ // Set postman/scene/arbiter ...
d->initialize();
// The aspect engine takes ownership of the scene root. We also set the
diff --git a/src/core/aspects/qaspectengine.h b/src/core/aspects/qaspectengine.h
index b472e4130..bc9ee1bc6 100644
--- a/src/core/aspects/qaspectengine.h
+++ b/src/core/aspects/qaspectengine.h
@@ -62,7 +62,6 @@ public:
void setRootEntity(QEntity *root);
QSharedPointer<QEntity> rootEntity() const;
- void setData(const QVariantMap &data);
void registerAspect(QAbstractAspect *aspect);
void registerAspect(const QString &name);
diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp
index 80faef768..01441df53 100644
--- a/src/core/aspects/qaspectmanager.cpp
+++ b/src/core/aspects/qaspectmanager.cpp
@@ -130,15 +130,6 @@ void QAspectManager::setRootEntity(Qt3DCore::QEntity *root)
}
}
-// Should be called after aspects are registered
-void QAspectManager::setData(const QVariantMap &data)
-{
- qCDebug(Aspects) << Q_FUNC_INFO;
- m_data = data;
- Q_FOREACH (QAbstractAspect *aspect, m_aspects)
- aspect->onInitialize(m_data);
-}
-
/*!
* Registers a new \a aspect.
*/
@@ -153,7 +144,8 @@ void QAspectManager::registerAspect(QAbstractAspect *aspect)
QAbstractAspectPrivate::get(aspect)->m_arbiter = m_changeArbiter;
// Register sceneObserver with the QChangeArbiter
m_changeArbiter->registerSceneObserver(aspect->d_func());
- aspect->onInitialize(m_data);
+ // Initialize the aspect in the main thread
+ aspect->onInitialize();
}
else {
qCWarning(Aspects) << "Failed to register aspect";
@@ -161,11 +153,6 @@ void QAspectManager::registerAspect(QAbstractAspect *aspect)
qCDebug(Aspects) << "Completed registering aspect";
}
-QVariantMap QAspectManager::data() const
-{
- return m_data;
-}
-
void QAspectManager::exec()
{
// Gentlemen, start your engines
diff --git a/src/core/aspects/qaspectmanager_p.h b/src/core/aspects/qaspectmanager_p.h
index 88ceceb29..cc3b91fff 100644
--- a/src/core/aspects/qaspectmanager_p.h
+++ b/src/core/aspects/qaspectmanager_p.h
@@ -84,9 +84,7 @@ public Q_SLOTS:
void shutdown();
void setRootEntity(Qt3DCore::QEntity *root);
- void setData(const QVariantMap &data);
void registerAspect(Qt3DCore::QAbstractAspect *aspect);
- QVariantMap data() const;
void exec();
void quit();