summaryrefslogtreecommitdiffstats
path: root/src/core/aspects
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-03-13 18:47:59 +0000
committerSean Harmer <sean.harmer@kdab.com>2016-03-22 10:45:28 +0000
commitb9e4053715ee12137a13bfbeef99f0a7c5635913 (patch)
tree0b97b474c9c7c28df664849c75f829947011ec5c /src/core/aspects
parent525b7bcf045c22117fb2eed49c48fdbfb445d26d (diff)
Hook up some machinery ready for testing the no cloning approach
Task-number: QTBUG-51835 Change-Id: I4520bf38acc9b8a990d3f3bce3d96f2014c5637b Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Diffstat (limited to 'src/core/aspects')
-rw-r--r--src/core/aspects/qabstractaspect.cpp51
-rw-r--r--src/core/aspects/qabstractaspect_p.h5
-rw-r--r--src/core/aspects/qaspectengine.cpp6
-rw-r--r--src/core/aspects/qaspectmanager.cpp4
-rw-r--r--src/core/aspects/qaspectmanager_p.h3
5 files changed, 61 insertions, 8 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp
index 20a393738..19ec5a1dd 100644
--- a/src/core/aspects/qabstractaspect.cpp
+++ b/src/core/aspects/qabstractaspect.cpp
@@ -181,6 +181,44 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *frontend) const
return Q_NULLPTR;
}
+QBackendNode *QAbstractAspectPrivate::createBackendNodeNoClone(const QNodeCreatedChangeBasePtr &change) const
+{
+ const QMetaObject *metaObj = change->metaObject();
+ QBackendNodeMapperPtr backendNodeMapper;
+ while (metaObj != Q_NULLPTR && backendNodeMapper.isNull()) {
+ backendNodeMapper = m_backendCreatorFunctors.value(metaObj);
+ metaObj = metaObj->superClass();
+ }
+
+ if (!backendNodeMapper)
+ return nullptr;
+
+ QBackendNode *backend = backendNodeMapper->get(change->subjectId());
+ if (backend != Q_NULLPTR)
+ return backend;
+ backend = backendNodeMapper->create(change);
+
+ // TODO: Find some place else to do all of this function from the arbiter
+ if (backend)
+ backend->initializeFromPeer(change);
+
+ // Backend could be null if the user decides that his functor should only
+ // perform some action when encountering a given type of item but doesn't need to
+ // return a QBackendNode pointer.
+ if (!backend)
+ return nullptr;
+
+ QBackendNodePrivate *backendPriv = QBackendNodePrivate::get(backend);
+ // TO DO: Find a way to specify the changes to observe
+ // Register backendNode with QChangeArbiter
+ if (m_arbiter != Q_NULLPTR) { // Unit tests may not have the arbiter registered
+ m_arbiter->registerObserver(backendPriv, backend->peerId(), AllChanges);
+ if (backend->mode() == QBackendNode::ReadWrite)
+ m_arbiter->scene()->addObservable(backendPriv, backend->peerId());
+ }
+ return backend;
+}
+
void QAbstractAspectPrivate::clearBackendNode(QNode *frontend) const
{
const QMetaObject *metaObj = frontend->metaObject();
@@ -202,7 +240,7 @@ void QAbstractAspectPrivate::clearBackendNode(QNode *frontend) const
}
}
-void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject)
+void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<QNodeCreatedChangeBasePtr> &changes)
{
qCDebug(Aspects) << Q_FUNC_INFO << "rootObject =" << rootObject;
if (rootObject == m_root)
@@ -211,8 +249,15 @@ void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject)
m_root = rootObject;
m_rootId = rootObject->id();
- QNodeVisitor visitor;
- visitor.traverse(rootObject, this, &QAbstractAspectPrivate::createBackendNode);
+ // Use old method for now, unless user explicitly requests new method
+ const auto useNewMethod = qEnvironmentVariableIsSet("QT3D_NO_CLONE");
+ if (!useNewMethod) {
+ QNodeVisitor visitor;
+ visitor.traverse(rootObject, this, &QAbstractAspectPrivate::createBackendNode);
+ } else {
+ for (const auto &change : changes)
+ createBackendNodeNoClone(change);
+ }
}
QServiceLocator *QAbstractAspectPrivate::services() const
diff --git a/src/core/aspects/qabstractaspect_p.h b/src/core/aspects/qabstractaspect_p.h
index 5536f1e1d..28e1cac2f 100644
--- a/src/core/aspects/qabstractaspect_p.h
+++ b/src/core/aspects/qabstractaspect_p.h
@@ -80,7 +80,7 @@ class QT3DCORE_PRIVATE_EXPORT QAbstractAspectPrivate
public:
QAbstractAspectPrivate();
- void setRootAndCreateNodes(QEntity *rootObject);
+ void setRootAndCreateNodes(QEntity *rootObject, const QVector<Qt3DCore::QNodeCreatedChangeBasePtr> &changes);
QServiceLocator *services() const;
QAbstractAspectJobManager *jobManager() const;
@@ -88,6 +88,9 @@ public:
QVector<QAspectJobPtr> jobsToExecute(qint64 time) Q_DECL_OVERRIDE;
QBackendNode *createBackendNode(QNode *frontend) const Q_DECL_OVERRIDE;
+ // TODO: Rename this to createBackendNode when new system is fully in place
+ QBackendNode *createBackendNodeNoClone(const QNodeCreatedChangeBasePtr &change) const Q_DECL_OVERRIDE;
+
void clearBackendNode(QNode *frontend) const;
void sceneNodeAdded(Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp
index af6798407..b76aae603 100644
--- a/src/core/aspects/qaspectengine.cpp
+++ b/src/core/aspects/qaspectengine.cpp
@@ -331,11 +331,15 @@ void QAspectEngine::setRootEntity(QEntityPtr root)
// Finally, tell the aspects about the new scene object tree. This is done
// in a blocking manner to allow the aspects to get synchronized before the
// main thread starts triggering potentially more notifications
+
+ // TODO: Pass the creation changes via the arbiter rather than relying upon
+ // an invokeMethod call.
qCDebug(Aspects) << "Begin setting scene root on aspect manager";
QMetaObject::invokeMethod(d->m_aspectThread->aspectManager(),
"setRootEntity",
Qt::BlockingQueuedConnection,
- Q_ARG(Qt3DCore::QEntity *, root.data()));
+ Q_ARG(Qt3DCore::QEntity *, root.data()),
+ Q_ARG(QVector<Qt3DCore::QNodeCreatedChangeBasePtr>, d->m_creationChanges));
qCDebug(Aspects) << "Done setting scene root on aspect manager";
d->m_aspectThread->aspectManager()->enterSimulationLoop();
diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp
index 6155fa995..74b33f866 100644
--- a/src/core/aspects/qaspectmanager.cpp
+++ b/src/core/aspects/qaspectmanager.cpp
@@ -148,7 +148,7 @@ void QAspectManager::shutdown()
// Aspects must be deleted in the Thread they were created in
}
-void QAspectManager::setRootEntity(Qt3DCore::QEntity *root)
+void QAspectManager::setRootEntity(Qt3DCore::QEntity *root, const QVector<Qt3DCore::QNodeCreatedChangeBasePtr> &changes)
{
qCDebug(Aspects) << Q_FUNC_INFO;
@@ -164,7 +164,7 @@ void QAspectManager::setRootEntity(Qt3DCore::QEntity *root)
if (m_root) {
for (QAbstractAspect *aspect : qAsConst(m_aspects))
- aspect->d_func()->setRootAndCreateNodes(m_root);
+ aspect->d_func()->setRootAndCreateNodes(m_root, changes);
}
}
diff --git a/src/core/aspects/qaspectmanager_p.h b/src/core/aspects/qaspectmanager_p.h
index 643da2311..99d29320e 100644
--- a/src/core/aspects/qaspectmanager_p.h
+++ b/src/core/aspects/qaspectmanager_p.h
@@ -52,6 +52,7 @@
//
#include <QObject>
+#include <Qt3DCore/qnodecreatedchange.h>
#include <Qt3DCore/private/qt3dcore_global_p.h>
#include <QList>
#include <QScopedPointer>
@@ -89,7 +90,7 @@ public Q_SLOTS:
void initialize();
void shutdown();
- void setRootEntity(Qt3DCore::QEntity *root);
+ void setRootEntity(Qt3DCore::QEntity *root, const QVector<Qt3DCore::QNodeCreatedChangeBasePtr> &changes);
void registerAspect(Qt3DCore::QAbstractAspect *aspect);
void exec();