diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-03-13 18:47:59 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-03-22 10:45:28 +0000 |
commit | b9e4053715ee12137a13bfbeef99f0a7c5635913 (patch) | |
tree | 0b97b474c9c7c28df664849c75f829947011ec5c /src/core/aspects | |
parent | 525b7bcf045c22117fb2eed49c48fdbfb445d26d (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.cpp | 51 | ||||
-rw-r--r-- | src/core/aspects/qabstractaspect_p.h | 5 | ||||
-rw-r--r-- | src/core/aspects/qaspectengine.cpp | 6 | ||||
-rw-r--r-- | src/core/aspects/qaspectmanager.cpp | 4 | ||||
-rw-r--r-- | src/core/aspects/qaspectmanager_p.h | 3 |
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(); |