diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-08-30 11:41:18 +0200 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2019-09-16 10:39:23 +0200 |
commit | 6a9609f8956ccc528da8b7acee2d7a3d195b2b2d (patch) | |
tree | d12aef2a869a8572fb48163bc7db0def2c52abc5 | |
parent | c89997143cd6e51916924b71c8b0bf8705480a67 (diff) |
Use direct access to remove backend nodes
- Stop using messages
- Remove QSceneObserverInterface
- Ensure backend node creation/destruction is done at the right time
Change-Id: I470825af344ab65bf05e93fc149b61d1b9eefc96
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
28 files changed, 360 insertions, 466 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp index 3a6ffd211..866a0ce25 100644 --- a/src/core/aspects/qabstractaspect.cpp +++ b/src/core/aspects/qabstractaspect.cpp @@ -191,12 +191,6 @@ void QAbstractAspect::unregisterBackendType(const QMetaObject &obj) d->m_backendCreatorFunctors.remove(&obj); } -void QAbstractAspectPrivate::sceneNodeRemoved(QSceneChangePtr &change) -{ - QNodeDestroyedChangePtr destructionChange = qSharedPointerCast<QNodeDestroyedChange>(change); - clearBackendNode(destructionChange); -} - QVariant QAbstractAspect::executeCommand(const QStringList &args) { Q_UNUSED(args); @@ -215,9 +209,9 @@ void QAbstractAspect::syncDirtyFrontEndNodes(const QVector<QNode *> &nodes) d->syncDirtyFrontEndNodes(nodes); } -QAbstractAspectPrivate::BackendNodeMapperAndInfo QAbstractAspectPrivate::mapperForNode(QNode *n) const +QAbstractAspectPrivate::BackendNodeMapperAndInfo QAbstractAspectPrivate::mapperForNode(const QMetaObject *metaObj) const { - const QMetaObject *metaObj = n->metaObject(); + Q_ASSERT(metaObj); BackendNodeMapperAndInfo info; while (metaObj != nullptr && info.first.isNull()) { @@ -230,7 +224,8 @@ QAbstractAspectPrivate::BackendNodeMapperAndInfo QAbstractAspectPrivate::mapperF void QAbstractAspectPrivate::syncDirtyFrontEndNodes(const QVector<QNode *> &nodes) { for (auto node: qAsConst(nodes)) { - const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(node); + const QMetaObject *metaObj = QNodePrivate::get(node)->m_typeInfo; + const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj); const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first; if (!backendNodeMapper) @@ -300,35 +295,37 @@ void QAbstractAspectPrivate::sendPropertyMessages(QNode *node, QBackendNode *bac } } -QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *node) const +QBackendNode *QAbstractAspectPrivate::createBackendNode(const NodeTreeChange &change) const { - const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(node); + const QMetaObject *metaObj = change.metaObj; + const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj); const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first; if (!backendNodeMapper) return nullptr; - QBackendNode *backend = backendNodeMapper->get(node->id()); + QBackendNode *backend = backendNodeMapper->get(change.id); if (backend != nullptr) return backend; - QNodeCreatedChangeBasePtr change; + QNode *node = change.node; + QNodeCreatedChangeBasePtr creationChange; const bool supportsSyncing = backendNodeMapperInfo.second & SupportsSyncing; if (supportsSyncing) { // All objects modified to use syncing should only use the id in the creation functor QNodeCreatedChangeBase changeObj(node); - change = QNodeCreatedChangeBasePtr(&changeObj, [](QNodeCreatedChangeBase *) {}); - backend = backendNodeMapper->create(change); + creationChange = QNodeCreatedChangeBasePtr(&changeObj, [](QNodeCreatedChangeBase *) {}); + backend = backendNodeMapper->create(creationChange); } else { - change = node->createNodeCreationChange(); - backend = backendNodeMapper->create(change); + creationChange = node->createNodeCreationChange(); + backend = backendNodeMapper->create(creationChange); } if (!backend) return nullptr; // TODO: Find some place else to do all of this function from the arbiter - backend->setPeerId(node->id()); + backend->setPeerId(change.id); // 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 @@ -341,7 +338,7 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *node) const // Register backendNode with QChangeArbiter if (m_arbiter != nullptr) { // Unit tests may not have the arbiter registered qCDebug(Nodes) << q_func()->objectName() << "Creating backend node for node id" - << node->id() << "of type" << node->metaObject()->className(); + << node->id() << "of type" << QNodePrivate::get(node)->m_typeInfo->className(); m_arbiter->registerObserver(backendPriv, backend->peerId(), AllChanges); if (backend->mode() == QBackendNode::ReadWrite) m_arbiter->scene()->addObservable(backendPriv, backend->peerId()); @@ -350,44 +347,34 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *node) const if (supportsSyncing) syncDirtyFrontEndNode(node, backend, true); else - backend->initializeFromPeer(change); + backend->initializeFromPeer(creationChange); return backend; } -void QAbstractAspectPrivate::clearBackendNode(const QNodeDestroyedChangePtr &change) const +void QAbstractAspectPrivate::clearBackendNode(const NodeTreeChange &change) const { - // Each QNodeDestroyedChange may contain info about a whole sub-tree of nodes that - // are being destroyed. Iterate over them and process each in turn - const auto subTree = change->subtreeIdsAndTypes(); - for (const auto &idAndType : subTree) { - const QMetaObject *metaObj = idAndType.type; - QBackendNodeMapperPtr backendNodeMapper; - - // Find backend node mapper for this type - while (metaObj != nullptr && backendNodeMapper.isNull()) { - backendNodeMapper = m_backendCreatorFunctors.value(metaObj).first; - metaObj = metaObj->superClass(); - } + const QMetaObject *metaObj = change.metaObj; + const BackendNodeMapperAndInfo backendNodeMapperInfo = mapperForNode(metaObj); + const QBackendNodeMapperPtr backendNodeMapper = backendNodeMapperInfo.first; - if (!backendNodeMapper) - continue; + if (!backendNodeMapper) + return; - // Request the mapper to destroy the corresponding backend node - QBackendNode *backend = backendNodeMapper->get(idAndType.id); - if (backend) { - qCDebug(Nodes) << q_func()->objectName() << "Deleting backend node for node id" - << idAndType.id << "of type" << idAndType.type->className(); - QBackendNodePrivate *backendPriv = QBackendNodePrivate::get(backend); - m_arbiter->unregisterObserver(backendPriv, backend->peerId()); - if (backend->mode() == QBackendNode::ReadWrite) - m_arbiter->scene()->removeObservable(backendPriv, backend->peerId()); - backendNodeMapper->destroy(idAndType.id); - } + // Request the mapper to destroy the corresponding backend node + QBackendNode *backend = backendNodeMapper->get(change.id); + if (backend) { + qCDebug(Nodes) << "Deleting backend node for node id" + << change.id << "of type" << metaObj->className(); + QBackendNodePrivate *backendPriv = QBackendNodePrivate::get(backend); + m_arbiter->unregisterObserver(backendPriv, backend->peerId()); + if (backend->mode() == QBackendNode::ReadWrite) + m_arbiter->scene()->removeObservable(backendPriv, backend->peerId()); + backendNodeMapper->destroy(change.id); } } -void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<QNode *> &nodes) +void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<NodeTreeChange> &nodesChanges) { qCDebug(Aspects) << Q_FUNC_INFO << "rootObject =" << rootObject; if (rootObject == m_root) @@ -396,14 +383,10 @@ void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QV m_root = rootObject; m_rootId = rootObject->id(); - createNodes(nodes); + for (const NodeTreeChange &change : nodesChanges) + createBackendNode(change); } -void QAbstractAspectPrivate::createNodes(const QVector<QNode *> &nodes) -{ - for (const auto node : nodes) - createBackendNode(node); -} QServiceLocator *QAbstractAspectPrivate::services() const { diff --git a/src/core/aspects/qabstractaspect_p.h b/src/core/aspects/qabstractaspect_p.h index 8085a4405..8bd26cf00 100644 --- a/src/core/aspects/qabstractaspect_p.h +++ b/src/core/aspects/qabstractaspect_p.h @@ -56,7 +56,6 @@ #include <Qt3DCore/private/qaspectjobproviderinterface_p.h> #include <Qt3DCore/private/qbackendnode_p.h> -#include <Qt3DCore/private/qsceneobserverinterface_p.h> #include <Qt3DCore/private/qt3dcore_global_p.h> #include <QtCore/private/qobject_p.h> @@ -101,31 +100,39 @@ private: } // Debug +struct NodeTreeChange +{ + enum NodeTreeChangeType { + Added = 0, + Removed = 1 + }; + Qt3DCore::QNodeId id; + const QMetaObject *metaObj; + NodeTreeChangeType type; + Qt3DCore::QNode *node; +}; + class Q_3DCORE_PRIVATE_EXPORT QAbstractAspectPrivate : public QObjectPrivate - , public QSceneObserverInterface , public QAspectJobProviderInterface { public: QAbstractAspectPrivate(); ~QAbstractAspectPrivate(); - void setRootAndCreateNodes(QEntity *rootObject, const QVector<QNode *> &nodes); - void createNodes(const QVector<QNode *> &nodes); + void setRootAndCreateNodes(QEntity *rootObject, const QVector<NodeTreeChange> &nodesTreeChanges); QServiceLocator *services() const; QAbstractAspectJobManager *jobManager() const; QVector<QAspectJobPtr> jobsToExecute(qint64 time) override; - QBackendNode *createBackendNode(QNode *node) const; - void clearBackendNode(const QNodeDestroyedChangePtr &change) const; + QBackendNode *createBackendNode(const NodeTreeChange &change) const; + void clearBackendNode(const NodeTreeChange &change) const; void syncDirtyFrontEndNodes(const QVector<QNode *> &nodes); virtual void syncDirtyFrontEndNode(QNode *node, QBackendNode *backend, bool firstTime) const; void sendPropertyMessages(QNode *node, QBackendNode *backend) const; - void sceneNodeRemoved(Qt3DCore::QSceneChangePtr &e) override; - virtual void onEngineAboutToShutdown(); // TODO: Make these public in 5.8 @@ -140,7 +147,7 @@ public: SupportsSyncing = 1 << 0 }; using BackendNodeMapperAndInfo = QPair<QBackendNodeMapperPtr, NodeMapperInfo>; - BackendNodeMapperAndInfo mapperForNode(QNode *n) const; + BackendNodeMapperAndInfo mapperForNode(const QMetaObject *metaObj) const; QEntity *m_root; QNodeId m_rootId; diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp index 41662e2a3..6d1a8ca30 100644 --- a/src/core/aspects/qaspectengine.cpp +++ b/src/core/aspects/qaspectengine.cpp @@ -89,6 +89,23 @@ QVector<Qt3DCore::QNode *> getNodesForCreation(Qt3DCore::QNode *root) return nodes; } +QVector<Qt3DCore::QNode *> getNodesForRemoval(Qt3DCore::QNode *root) +{ + using namespace Qt3DCore; + + QVector<QNode *> nodes; + QNodeVisitor visitor; + visitor.traverse(root, [&nodes](QNode *node) { + nodes.append(node); + + // Mark this node as having been handled for destruction so we don't + // repeat it unnecessarily in an O(n^2) manner + QNodePrivate::get(node)->m_hasBackendNode = false; + }); + + return nodes; +} + } namespace Qt3DCore { @@ -152,6 +169,11 @@ void QAspectEnginePrivate::addNode(QNode *node) m_aspectManager->addNodes(getNodesForCreation(node)); } +void QAspectEnginePrivate::removeNode(QNode *node) +{ + m_aspectManager->removeNodes(getNodesForRemoval(node)); +} + /*! * \class Qt3DCore::QAspectEngine * \inheaderfile Qt3DCore/QAspectEngine diff --git a/src/core/aspects/qaspectengine_p.h b/src/core/aspects/qaspectengine_p.h index 3e68a2caa..c83940435 100644 --- a/src/core/aspects/qaspectengine_p.h +++ b/src/core/aspects/qaspectengine_p.h @@ -106,6 +106,7 @@ public: void initNode(QNode *node); void initEntity(QEntity *entity); void addNode(QNode *node); + void removeNode(QNode *node); static QAspectEnginePrivate *get(QAspectEngine *engine); }; diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp index b6e6122a1..6bca77a9e 100644 --- a/src/core/aspects/qaspectmanager.cpp +++ b/src/core/aspects/qaspectmanager.cpp @@ -61,6 +61,7 @@ #include <Qt3DCore/private/qtickclock_p.h> #include <Qt3DCore/private/qtickclockservice_p.h> #include <Qt3DCore/private/qnodevisitor_p.h> +#include <Qt3DCore/private/qnode_p.h> #include <QtCore/QCoreApplication> @@ -224,9 +225,6 @@ void QAspectManager::shutdown() { qCDebug(Aspects) << Q_FUNC_INFO; - for (QAbstractAspect *aspect : qAsConst(m_aspects)) - m_changeArbiter->unregisterSceneObserver(aspect->d_func()); - // Aspects must be deleted in the Thread they were created in } @@ -246,15 +244,71 @@ void QAspectManager::setRootEntity(Qt3DCore::QEntity *root, const QVector<QNode m_root = root; if (m_root) { + + QVector<NodeTreeChange> nodeTreeChanges; + nodeTreeChanges.reserve(nodes.size()); + + for (QNode *n : nodes) { + nodeTreeChanges.push_back({ + n->id(), + QNodePrivate::get(n)->m_typeInfo, + NodeTreeChange::Added, + n + }); + } + for (QAbstractAspect *aspect : qAsConst(m_aspects)) - aspect->d_func()->setRootAndCreateNodes(m_root, nodes); + aspect->d_func()->setRootAndCreateNodes(m_root, nodeTreeChanges); } } + +// Main Thread -> immediately following node insertion void QAspectManager::addNodes(const QVector<QNode *> &nodes) { - for (QAbstractAspect *aspect : qAsConst(m_aspects)) - aspect->d_func()->createNodes(nodes); + // We record the nodes added information, which we will actually use when + // processFrame is called (later but within the same loop of the even loop + // as this call) The idea is we want to avoid modifying the backend tree if + // the Renderer hasn't allowed processFrame to continue yet + + QVector<NodeTreeChange> treeChanges; + treeChanges.reserve(nodes.size()); + + for (QNode *node : nodes) { + treeChanges.push_back({ node->id(), + QNodePrivate::get(node)->m_typeInfo, + NodeTreeChange::Added, + node }); + } + + m_nodeTreeChanges += treeChanges; +} + +// Main Thread -> immediately following node destruction (call from QNode dtor) +void QAspectManager::removeNodes(const QVector<QNode *> &nodes) +{ + // We record the nodes removed information, which we will actually use when + // processFrame is called (later but within the same loop of the even loop + // as this call) The idea is we want to avoid modifying the backend tree if + // the Renderer hasn't allowed processFrame to continue yet The drawback is + // that when processFrame is processed, the QNode* pointer might be invalid by + // that point. Therefore we record all we need to remove the object. + + for (QNode *node : nodes) { + // In addition, we check if we contain an Added change for a given node + // that is now about to be destroyed. If so we remove the Added change + // entirely + + m_nodeTreeChanges.erase(std::remove_if(m_nodeTreeChanges.begin(), + m_nodeTreeChanges.end(), + [&node] (const NodeTreeChange &change) { return change.id == node->id(); }), + m_nodeTreeChanges.end()); + + m_nodeTreeChanges.push_back({ node->id(), + QNodePrivate::get(node)->m_typeInfo, + NodeTreeChange::Removed, + nullptr }); + } } /*! @@ -271,8 +325,6 @@ void QAspectManager::registerAspect(QAbstractAspect *aspect) QAbstractAspectPrivate::get(aspect)->m_aspectManager = this; QAbstractAspectPrivate::get(aspect)->m_jobManager = m_jobManager; QAbstractAspectPrivate::get(aspect)->m_arbiter = m_changeArbiter; - // Register sceneObserver with the QChangeArbiter - m_changeArbiter->registerSceneObserver(aspect->d_func()); // Allow the aspect to do some work now that it is registered aspect->onRegistered(); @@ -295,7 +347,6 @@ void QAspectManager::unregisterAspect(Qt3DCore::QAbstractAspect *aspect) qCDebug(Aspects) << "Unregistering aspect"; Q_ASSERT(aspect); aspect->onUnregistered(); - m_changeArbiter->unregisterSceneObserver(aspect->d_func()); QAbstractAspectPrivate::get(aspect)->m_arbiter = nullptr; QAbstractAspectPrivate::get(aspect)->m_jobManager = nullptr; QAbstractAspectPrivate::get(aspect)->m_aspectManager = nullptr; @@ -377,6 +428,26 @@ void QAspectManager::processFrame() changeArbiterStats.threadId = reinterpret_cast<quint64>(QThread::currentThreadId()); changeArbiterStats.startTime = QThreadPooler::m_jobsStatTimer.nsecsElapsed(); #endif + + // Add and Remove Nodes + const QVector<NodeTreeChange> nodeTreeChanges = std::move(m_nodeTreeChanges); + for (const NodeTreeChange &change : nodeTreeChanges) { + // Buckets ensure that even if we have intermingled node added / removed + // buckets, we preserve the order of the sequences + + for (QAbstractAspect *aspect : qAsConst(m_aspects)) { + switch (change.type) { + case NodeTreeChange::Added: + aspect->d_func()->createBackendNode(change); + break; + case NodeTreeChange::Removed: + aspect->d_func()->clearBackendNode(change); + break; + } + } + } + + // Sync property updates const auto dirtyFrontEndNodes = m_changeArbiter->takeDirtyFrontEndNodes(); if (dirtyFrontEndNodes.size()) for (QAbstractAspect *aspect : qAsConst(m_aspects)) diff --git a/src/core/aspects/qaspectmanager_p.h b/src/core/aspects/qaspectmanager_p.h index e984244ff..b39ad1f89 100644 --- a/src/core/aspects/qaspectmanager_p.h +++ b/src/core/aspects/qaspectmanager_p.h @@ -73,14 +73,14 @@ class QScheduler; class QChangeArbiter; class QAbstractAspect; class QAbstractAspectJobManager; -class QSceneObserverInterface; class QServiceLocator; +struct NodeTreeChange; class Q_3DCORE_PRIVATE_EXPORT QAspectManager : public QObject { Q_OBJECT public: - explicit QAspectManager(QObject *parent = 0); + explicit QAspectManager(QObject *parent = nullptr); ~QAspectManager(); void setRunMode(QAspectEngine::RunMode mode); @@ -96,6 +96,7 @@ public Q_SLOTS: void setRootEntity(Qt3DCore::QEntity *root, const QVector<QNode *> &nodes); void addNodes(const QVector<QNode *> &nodes); + void removeNodes(const QVector<QNode *> &nodes); void registerAspect(Qt3DCore::QAbstractAspect *aspect); void unregisterAspect(Qt3DCore::QAbstractAspect *aspect); @@ -119,7 +120,7 @@ private: bool m_mainLoopRunning; bool m_simulationLoopRunning; QAspectEngine::RunMode m_driveMode; - + QVector<NodeTreeChange> m_nodeTreeChanges; }; } // namespace Qt3DCore diff --git a/src/core/core.pri b/src/core/core.pri index d65fc87e4..ea95ab10d 100644 --- a/src/core/core.pri +++ b/src/core/core.pri @@ -5,7 +5,6 @@ HEADERS += \ $$PWD/qtickclock_p.h \ $$PWD/qscheduler_p.h \ $$PWD/corelogging_p.h \ - $$PWD/qsceneobserverinterface_p.h \ $$PWD/qpostman_p.h \ $$PWD/qobservableinterface_p.h \ $$PWD/qobserverinterface_p.h \ @@ -23,6 +22,5 @@ SOURCES += \ $$PWD/qobservableinterface.cpp \ $$PWD/qobserverinterface.cpp \ $$PWD/qlockableobserverinterface.cpp \ - $$PWD/qsceneobserverinterface.cpp \ $$PWD/qpostman.cpp \ $$PWD/qscene.cpp diff --git a/src/core/nodes/qnode.cpp b/src/core/nodes/qnode.cpp index 5f9468124..b41f5b3e2 100644 --- a/src/core/nodes/qnode.cpp +++ b/src/core/nodes/qnode.cpp @@ -149,11 +149,8 @@ void QNodePrivate::notifyDestructionChangesAndRemoveFromScene() } // Tell the backend we are about to be destroyed - if (m_hasBackendNode) { - const QDestructionIdAndTypeCollector collector(q); - const auto destroyedChange = QNodeDestroyedChangePtr::create(q, collector.subtreeIdsAndTypes()); - notifyObservers(destroyedChange); - } + if (m_hasBackendNode && m_scene && m_scene->engine()) + QAspectEnginePrivate::get(m_scene->engine())->removeNode(q); // We unset the scene from the node as its backend node was/is about to be destroyed QNodeVisitor visitor; diff --git a/src/core/qchangearbiter.cpp b/src/core/qchangearbiter.cpp index 34e773f59..60cdc3bd2 100644 --- a/src/core/qchangearbiter.cpp +++ b/src/core/qchangearbiter.cpp @@ -49,7 +49,6 @@ #include <Qt3DCore/private/qabstractaspectjobmanager_p.h> #include <Qt3DCore/private/qpostman_p.h> #include <Qt3DCore/private/qscene_p.h> -#include <Qt3DCore/private/qsceneobserverinterface_p.h> #include <mutex> @@ -117,11 +116,8 @@ void QChangeArbiter::distributeQueueChanges(QChangeQueue *changeQueue) if (change.isNull()) continue; - if (change->type() == NodeCreated) { + if (change->type() == NodeCreated || change->type() == NodeDeleted) { Q_ASSERT(false); // messages no longer used - } else if (change->type() == NodeDeleted) { - for (QSceneObserverInterface *observer : qAsConst(m_sceneObservers)) - observer->sceneNodeRemoved(change); } const QNodeId nodeId = change->subjectId(); @@ -207,13 +203,6 @@ void QChangeArbiter::registerObserver(QObserverInterface *observer, observerList.append(QObserverPair(changeFlags, observer)); } -// Called from the QAspectThread context, no need to lock -void QChangeArbiter::registerSceneObserver(QSceneObserverInterface *observer) -{ - if (!m_sceneObservers.contains(observer)) - m_sceneObservers << observer; -} - void QChangeArbiter::unregisterObserver(QObserverInterface *observer, QNodeId nodeId) { const std::lock_guard<QRecursiveMutex> locker(m_mutex);; @@ -229,13 +218,6 @@ void QChangeArbiter::unregisterObserver(QObserverInterface *observer, QNodeId no } } -// Called from the QAspectThread context, no need to lock -void QChangeArbiter::unregisterSceneObserver(QSceneObserverInterface *observer) -{ - if (observer != nullptr) - m_sceneObservers.removeOne(observer); -} - void QChangeArbiter::sceneChangeEvent(const QSceneChangePtr &e) { // qCDebug(ChangeArbiter) << Q_FUNC_INFO << QThread::currentThread(); diff --git a/src/core/qchangearbiter_p.h b/src/core/qchangearbiter_p.h index 48fc4ca8c..0a6196756 100644 --- a/src/core/qchangearbiter_p.h +++ b/src/core/qchangearbiter_p.h @@ -104,9 +104,6 @@ public: void unregisterObserver(QObserverInterface *observer, QNodeId nodeId); - void registerSceneObserver(QSceneObserverInterface *observer); - void unregisterSceneObserver(QSceneObserverInterface *observer); - void sceneChangeEvent(const QSceneChangePtr &e) override; // QLockableObserverInterface impl void sceneChangeEventWithLock(const QSceneChangePtr &e) override; // QLockableObserverInterface impl void sceneChangeEventWithLock(const QSceneChangeList &e) override; // QLockableObserverInterface impl @@ -149,7 +146,6 @@ private: // The lists of observers indexed by observable (QNodeId). // m_nodeObservations is for observables in the main thread's object tree QHash<QNodeId, QObserverList> m_nodeObservations; - QList<QSceneObserverInterface *> m_sceneObservers; // Each thread has a TLS ChangeQueue so we never need to lock whilst // receiving a QSceneChange. diff --git a/src/core/qsceneobserverinterface.cpp b/src/core/qsceneobserverinterface.cpp deleted file mode 100644 index 784ff654e..000000000 --- a/src/core/qsceneobserverinterface.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsceneobserverinterface_p.h" - -QT_BEGIN_NAMESPACE - -namespace Qt3DCore { - -QSceneObserverInterface::~QSceneObserverInterface() -{ -} - -} // Qt3D - -QT_END_NAMESPACE diff --git a/src/core/qsceneobserverinterface_p.h b/src/core/qsceneobserverinterface_p.h deleted file mode 100644 index db6c68b73..000000000 --- a/src/core/qsceneobserverinterface_p.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QT3DCORE_QSCENEOBSERVERINTERFACE_P_H -#define QT3DCORE_QSCENEOBSERVERINTERFACE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of other Qt classes. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <Qt3DCore/qscenechange.h> - -#include <Qt3DCore/private/qt3dcore_global_p.h> - -QT_BEGIN_NAMESPACE - -namespace Qt3DCore { - -class QChangeArbiter; - -class Q_3DCORE_PRIVATE_EXPORT QSceneObserverInterface -{ -public: - virtual ~QSceneObserverInterface(); - -private: - virtual void sceneNodeRemoved(QSceneChangePtr &e) = 0; - - friend class QChangeArbiter; -}; - -} // Qt3D - -QT_END_NAMESPACE - -Q_DECLARE_METATYPE(Qt3DCore::QSceneObserverInterface *) // LCOV_EXCL_LINE - -#endif // QT3DCORE_QSCENEOBSERVERINTERFACE_P_H diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp index ec07c158d..150df3ef0 100644 --- a/tests/auto/core/nodes/tst_nodes.cpp +++ b/tests/auto/core/nodes/tst_nodes.cpp @@ -831,8 +831,8 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() QCoreApplication::processEvents(); // THEN - QCOMPARE(spy.events.size(), 3); - // 1 node removed change, 1 node destroyed change + QCOMPARE(spy.events.size(), 2); + // 1 node removed change // 1 node added to children change QVERIFY(Qt3DCore::QNodePrivate::get(newParent.data())->m_hasBackendNode == true); QVERIFY(Qt3DCore::QNodePrivate::get(child)->m_hasBackendNode == true); @@ -846,30 +846,11 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() QCOMPARE(event->removedNodeId(), child->id()); QCOMPARE(event->metaObject(), child->metaObject()); - // CHECK event 2 is a Node Destroyed - QVERIFY(spy.events.first().wasLocked()); - const Qt3DCore::QNodeDestroyedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeDestroyedChange>(); - QCOMPARE(event2->type(), Qt3DCore::NodeDeleted); - QCOMPARE(event2->subtreeIdsAndTypes().size(), 1); - QCOMPARE(event2->subtreeIdsAndTypes().first().id, child->id()); - -// // CHECK event 3 and 4 are Node Created events -// const Qt3DCore::QNodeCreatedChangeBasePtr event3 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeCreatedChangeBase>(); -// const Qt3DCore::QNodeCreatedChangeBasePtr event4 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeCreatedChangeBase>(); - -// QCOMPARE(event3->type(), Qt3DCore::NodeCreated); -// QCOMPARE(event3->parentId(), root->id()); -// QCOMPARE(event3->subjectId(), newParent->id()); - -// QCOMPARE(event4->type(), Qt3DCore::NodeCreated); -// QCOMPARE(event4->parentId(), newParent->id()); -// QCOMPARE(event4->subjectId(), child->id()); - - const Qt3DCore::QPropertyNodeAddedChangePtr event5 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event5->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event5->addedNodeId(), newParent->id()); - QCOMPARE(event5->metaObject(), newParent->metaObject()); - QCOMPARE(event5->subjectId(), root->id()); + const Qt3DCore::QPropertyNodeAddedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); + QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(event2->addedNodeId(), newParent->id()); + QCOMPARE(event2->metaObject(), newParent->metaObject()); + QCOMPARE(event2->subjectId(), root->id()); } // WHEN -> Changing parent to node with existing backend @@ -913,8 +894,8 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() QCoreApplication::processEvents(); // THEN - QCOMPARE(spy.events.size(), 3); - // 1 node removed change, 1 node destroyed change, + QCOMPARE(spy.events.size(), 2); + // 1 node removed change // 1 node added to children change { // CHECK event 1 is a Node Removed event @@ -925,30 +906,11 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() QCOMPARE(event->removedNodeId(), child->id()); QCOMPARE(event->metaObject(), child->metaObject()); - // CHECK event 2 is a Node Destroyed - QVERIFY(spy.events.first().wasLocked()); - const Qt3DCore::QNodeDestroyedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeDestroyedChange>(); - QCOMPARE(event2->type(), Qt3DCore::NodeDeleted); - QCOMPARE(event2->subtreeIdsAndTypes().size(), 1); - QCOMPARE(event2->subtreeIdsAndTypes().first().id, child->id()); - -// // CHECK event 3 and 4 are Node Created events -// const Qt3DCore::QNodeCreatedChangeBasePtr event3 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeCreatedChangeBase>(); -// const Qt3DCore::QNodeCreatedChangeBasePtr event4 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeCreatedChangeBase>(); - -// QCOMPARE(event3->type(), Qt3DCore::NodeCreated); -// QCOMPARE(event3->parentId(), root->id()); -// QCOMPARE(event3->subjectId(), newParent2->id()); - -// QCOMPARE(event4->type(), Qt3DCore::NodeCreated); -// QCOMPARE(event4->parentId(), newParent2->id()); -// QCOMPARE(event4->subjectId(), child->id()); - - const Qt3DCore::QPropertyNodeAddedChangePtr event5 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event5->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event5->addedNodeId(), newParent2->id()); - QCOMPARE(event5->metaObject(), newParent2->metaObject()); - QCOMPARE(event5->subjectId(), root->id()); + const Qt3DCore::QPropertyNodeAddedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); + QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(event2->addedNodeId(), newParent2->id()); + QCOMPARE(event2->metaObject(), newParent2->metaObject()); + QCOMPARE(event2->subjectId(), root->id()); } } @@ -997,38 +959,17 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDown() QVERIFY(Qt3DCore::QNodePrivate::get(child1)->m_hasBackendNode); QVERIFY(Qt3DCore::QNodePrivate::get(child2)->m_hasBackendNode); - // 1st event: dummyParent creation -// const auto event1 = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeCreatedChangeBase>(); -// QVERIFY(!event1.isNull()); -// QCOMPARE(event1->type(), Qt3DCore::NodeCreated); -// QCOMPARE(event1->parentId(), parentWithBackend->id()); -// QCOMPARE(event1->subjectId(), dummyParent->id()); - -// // 2nd event: child2 creation (even though we constructed child1 first) -// const auto event2 = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeCreatedChangeBase>(); -// QVERIFY(!event2.isNull()); -// QCOMPARE(event2->type(), Qt3DCore::NodeCreated); -// QCOMPARE(event2->parentId(), dummyParent->id()); -// QCOMPARE(event2->subjectId(), child2->id()); - - // 3rd event: dummyParent added to parent - const auto event3 = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event3->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event3->addedNodeId(), dummyParent->id()); - QCOMPARE(event3->subjectId(), parentWithBackend->id()); - - // 4th event: child1 creation -// const auto event4 = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeCreatedChangeBase>(); -// QVERIFY(!event4.isNull()); -// QCOMPARE(event4->type(), Qt3DCore::NodeCreated); -// QCOMPARE(event4->parentId(), parentWithBackend->id()); -// QCOMPARE(event4->subjectId(), child1->id()); - - // 5th event: child 1 added to parent - const auto event5 = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event5->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event5->addedNodeId(), child1->id()); - QCOMPARE(event5->subjectId(), parentWithBackend->id()); + // 1st event: dummyParent added to parent + const auto event = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); + QCOMPARE(event->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(event->addedNodeId(), dummyParent->id()); + QCOMPARE(event->subjectId(), parentWithBackend->id()); + + // 2nd event: child 1 added to parent + const auto event2 = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); + QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(event2->addedNodeId(), child1->id()); + QCOMPARE(event2->subjectId(), parentWithBackend->id()); } } @@ -1060,21 +1001,13 @@ void tst_Nodes::removingSingleChildNodeFromNode() QVERIFY(child->parent() == nullptr); QVERIFY(root->children().count() == 0); - QCOMPARE(spy.events.size(), 2); + QCOMPARE(spy.events.size(), 1); QVERIFY(spy.events.first().wasLocked()); const Qt3DCore::QPropertyNodeRemovedChangePtr removalEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>(); QCOMPARE(removalEvent->subjectId(), root->id()); QCOMPARE(removalEvent->removedNodeId(), child->id()); QCOMPARE(removalEvent->metaObject(), child->metaObject()); - - QVERIFY(spy.events.first().wasLocked()); - const Qt3DCore::QNodeDestroyedChangePtr destructionEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeDestroyedChange>(); - QCOMPARE(destructionEvent->type(), Qt3DCore::NodeDeleted); - QCOMPARE(destructionEvent->subjectId(), child->id()); - QCOMPARE(destructionEvent->subtreeIdsAndTypes().size(), 1); - QCOMPARE(destructionEvent->subtreeIdsAndTypes().first().id, child->id()); - QCOMPARE(destructionEvent->subtreeIdsAndTypes().first().type, child->metaObject()); } void tst_Nodes::removingMultipleChildNodesFromNode() @@ -1109,24 +1042,15 @@ void tst_Nodes::removingMultipleChildNodesFromNode() // THEN QVERIFY(root->children().count() == 0); - QCOMPARE(spy.events.size(), 20); + QCOMPARE(spy.events.size(), 10); int i = 0; for (const ObserverSpy::ChangeRecord &r : qAsConst(spy.events)) { QVERIFY(r.wasLocked()); - const Qt3DCore::QNodeId childId = childIds.at(i / 2); - if (i % 2 == 0) { - Qt3DCore::QPropertyNodeRemovedChangePtr additionEvent = r.change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(additionEvent->subjectId(), root->id()); - QCOMPARE(additionEvent->removedNodeId(), childId); - QCOMPARE(additionEvent->metaObject(), &MyQNode::staticMetaObject); - } else { - const Qt3DCore::QNodeDestroyedChangePtr event = r.change().dynamicCast<Qt3DCore::QNodeDestroyedChange>(); - QCOMPARE(event->subjectId(), childId); - QCOMPARE(event->subtreeIdsAndTypes().count(), 1); - QCOMPARE(event->subtreeIdsAndTypes().first().id, childId); - QCOMPARE(event->subtreeIdsAndTypes().first().type, &MyQNode::staticMetaObject); - QCOMPARE(event->type(), Qt3DCore::NodeDeleted); - } + const Qt3DCore::QNodeId childId = childIds.at(i); + Qt3DCore::QPropertyNodeRemovedChangePtr additionEvent = r.change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>(); + QCOMPARE(additionEvent->subjectId(), root->id()); + QCOMPARE(additionEvent->removedNodeId(), childId); + QCOMPARE(additionEvent->metaObject(), &MyQNode::staticMetaObject); ++i; } } @@ -1238,28 +1162,7 @@ void tst_Nodes::checkParentingQEntityToQNode() QVERIFY(Qt3DCore::QNodePrivate::get(childEntity)->m_hasBackendNode); QVERIFY(Qt3DCore::QNodePrivate::get(childNode)->m_hasBackendNode); - - // Ensure first event is subTreeRoot creation -// const Qt3DCore::QNodeCreatedChangeBasePtr firstEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeCreatedChangeBase>(); -// QVERIFY(!firstEvent.isNull()); -// QCOMPARE(firstEvent->subjectId(), subTreeRoot->id()); -// QCOMPARE(firstEvent->parentId(), root->id()); - -// // Ensure 2nd event is childEntity creation -// const Qt3DCore::QNodeCreatedChangeBasePtr secondEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeCreatedChangeBase>(); -// QVERIFY(!secondEvent.isNull()); -// QCOMPARE(secondEvent->subjectId(), childEntity->id()); -// QCOMPARE(secondEvent->parentId(), subTreeRoot->id()); - -// // Ensure 3rd event is childNode creation -// const Qt3DCore::QNodeCreatedChangeBasePtr thirdEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeCreatedChangeBase>(); -// QVERIFY(!thirdEvent.isNull()); -// QCOMPARE(thirdEvent->subjectId(), childNode->id()); -// QCOMPARE(thirdEvent->parentId(), subTreeRoot->id()); - - // WHEN we reparent the childEntity to the childNode (QNode) - spy.events.clear(); childEntity->setParent(childNode); QCoreApplication::processEvents(); diff --git a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp index 79790d467..e54193398 100644 --- a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp +++ b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp @@ -43,7 +43,6 @@ #include <Qt3DCore/qentity.h> #include <Qt3DCore/qcomponent.h> #include <Qt3DCore/qbackendnode.h> -#include <Qt3DCore/private/qsceneobserverinterface_p.h> #include <Qt3DCore/private/qnode_p.h> #include <Qt3DCore/private/qbackendnode_p.h> #include <QThread> @@ -350,38 +349,6 @@ private: bool m_allowFrontendNotifications; }; -class tst_SceneObserver : public Qt3DCore::QSceneObserverInterface -{ - // QSceneObserverInterface interface -public: -// void sceneNodeAdded(Qt3DCore::QSceneChangePtr &e) -// { -// QVERIFY(!e.isNull()); -// QVERIFY(e->type() == Qt3DCore::NodeCreated); -// m_lastChange = e; -// } - - void sceneNodeRemoved(Qt3DCore::QSceneChangePtr &e) - { - QVERIFY(!e.isNull()); - QVERIFY((e->type() == Qt3DCore::NodeDeleted)); - m_lastChange = e; - } - - void sceneNodeUpdated(Qt3DCore::QSceneChangePtr &e) - { - m_lastChange = e; - } - - Qt3DCore::QSceneChangePtr lastChange() const - { - return m_lastChange; - } - -private: - Qt3DCore::QSceneChangePtr m_lastChange; -}; - void tst_QChangeArbiter::registerObservers() { // GIVEN @@ -452,20 +419,11 @@ void tst_QChangeArbiter::registerSceneObserver() observers << s; } - QList<tst_SceneObserver *> sceneObservers; - for (int i = 0; i < 5; i++) { - tst_SceneObserver *s = new tst_SceneObserver(); - arbiter->registerSceneObserver(s); - sceneObservers << s; - } - arbiter->syncChanges(); // THEN for (tst_SimpleObserver *o : qAsConst(observers)) QVERIFY(o->lastChange().isNull()); - for (tst_SceneObserver *s : qAsConst(sceneObservers)) - QVERIFY(s->lastChange().isNull()); // WHEN child->setParent(root); @@ -476,10 +434,6 @@ void tst_QChangeArbiter::registerSceneObserver() QVERIFY(!o->lastChange().isNull()); QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded); } -// for (tst_SceneObserver *s : qAsConst(sceneObservers)) { -// QVERIFY(!s->lastChange().isNull()); -// QVERIFY(s->lastChange()->type() == Qt3DCore::NodeCreated); -// } // WHEN root->sendComponentAddedNotification(&dummyComponent); @@ -490,10 +444,6 @@ void tst_QChangeArbiter::registerSceneObserver() QVERIFY(!o->lastChange().isNull()); QVERIFY(o->lastChange()->type() == Qt3DCore::ComponentAdded); } -// for (tst_SceneObserver *s : qAsConst(sceneObservers)) { -// QVERIFY(!s->lastChange().isNull()); -// QVERIFY(s->lastChange()->type() == Qt3DCore::NodeCreated); -// } Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data()); } @@ -585,20 +535,11 @@ void tst_QChangeArbiter::unregisterSceneObservers() observers << s; } - QList<tst_SceneObserver *> sceneObservers; - for (int i = 0; i < 5; i++) { - tst_SceneObserver *s = new tst_SceneObserver(); - arbiter->registerSceneObserver(s); - sceneObservers << s; - } - arbiter->syncChanges(); // THEN for (tst_SimpleObserver *o : qAsConst(observers)) QVERIFY(o->lastChange().isNull()); - for (tst_SceneObserver *s : qAsConst(sceneObservers)) - QVERIFY(s->lastChange().isNull()); // WHEN child->setParent(root); @@ -609,10 +550,6 @@ void tst_QChangeArbiter::unregisterSceneObservers() QVERIFY(!o->lastChange().isNull()); QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded); } -// for (tst_SceneObserver *s : qAsConst(sceneObservers)) { -// QVERIFY(!s->lastChange().isNull()); -// QVERIFY(s->lastChange()->type() == Qt3DCore::NodeCreated); -// } // WHEN root->sendComponentAddedNotification(&dummyComponent); @@ -623,10 +560,6 @@ void tst_QChangeArbiter::unregisterSceneObservers() QVERIFY(!o->lastChange().isNull()); QVERIFY(o->lastChange()->type() == Qt3DCore::ComponentAdded); } -// for (tst_SceneObserver *s : qAsConst(sceneObservers)) { -// QVERIFY(!s->lastChange().isNull()); -// QVERIFY(s->lastChange()->type() == Qt3DCore::NodeCreated); -// } // WHEN child->setParent(Q_NODE_NULLPTR); @@ -637,13 +570,6 @@ void tst_QChangeArbiter::unregisterSceneObservers() QVERIFY(!o->lastChange().isNull()); QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueRemoved); } - for (tst_SceneObserver *s : qAsConst(sceneObservers)) { - QVERIFY(!s->lastChange().isNull()); - QVERIFY(s->lastChange()->type() == Qt3DCore::NodeDeleted); - } - - for (tst_SceneObserver *s : qAsConst(sceneObservers)) - arbiter->unregisterSceneObserver(s); // WHEN child->setParent(root); @@ -654,10 +580,6 @@ void tst_QChangeArbiter::unregisterSceneObservers() QVERIFY(!o->lastChange().isNull()); QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded); } - for (tst_SceneObserver *s : qAsConst(sceneObservers)) { - QVERIFY(!s->lastChange().isNull()); - QVERIFY(s->lastChange()->type() == Qt3DCore::NodeDeleted); - } Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data()); } diff --git a/tests/auto/render/boundingsphere/tst_boundingsphere.cpp b/tests/auto/render/boundingsphere/tst_boundingsphere.cpp index 5f4f26d50..98993209a 100644 --- a/tests/auto/render/boundingsphere/tst_boundingsphere.cpp +++ b/tests/auto/render/boundingsphere/tst_boundingsphere.cpp @@ -96,6 +96,23 @@ QVector<Qt3DCore::QNode *> getNodesForCreation(Qt3DCore::QNode *root) return nodes; } +QVector<Qt3DCore::NodeTreeChange> nodeTreeChangesForNodes(const QVector<Qt3DCore::QNode *> nodes) +{ + QVector<Qt3DCore::NodeTreeChange> nodeTreeChanges; + nodeTreeChanges.reserve(nodes.size()); + + for (Qt3DCore::QNode *n : nodes) { + nodeTreeChanges.push_back({ + n->id(), + Qt3DCore::QNodePrivate::get(n)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + n + }); + } + + return nodeTreeChanges; +} + class TestAspect : public Qt3DRender::QRenderAspect { public: @@ -106,7 +123,8 @@ public: QRenderAspect::onRegistered(); const QVector<Qt3DCore::QNode *> nodes = getNodesForCreation(root); - d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodes); + const QVector<Qt3DCore::NodeTreeChange> nodeTreeChanges = nodeTreeChangesForNodes(nodes); + d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodeTreeChanges); Render::Entity *rootEntity = nodeManagers()->lookupResource<Render::Entity, Render::EntityManager>(rootEntityId()); Q_ASSERT(rootEntity); diff --git a/tests/auto/render/commons/testaspect.cpp b/tests/auto/render/commons/testaspect.cpp index 8be6a7833..87ffc56d7 100644 --- a/tests/auto/render/commons/testaspect.cpp +++ b/tests/auto/render/commons/testaspect.cpp @@ -37,6 +37,7 @@ #include "testaspect.h" #include <Qt3DCore/private/qnodevisitor_p.h> #include <Qt3DCore/private/qnode_p.h> +#include <Qt3DCore/private/qaspectmanager_p.h> QT_BEGIN_NAMESPACE @@ -76,7 +77,12 @@ TestAspect::TestAspect(Qt3DCore::QNode *root) const QVector<Qt3DCore::QNode *> nodes = getNodesForCreation(root); for (Qt3DCore::QNode *node : nodes) - d_func()->createBackendNode(node); + d_func()->createBackendNode({ + node->id(), + Qt3DCore::QNodePrivate::get(node)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + node + }); } TestAspect::~TestAspect() diff --git a/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp b/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp index 80a6ae519..25262a772 100644 --- a/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp +++ b/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp @@ -81,7 +81,12 @@ public: }); for (const auto node: nodes) - d_func()->createBackendNode(node); + d_func()->createBackendNode({ + node->id(), + Qt3DCore::QNodePrivate::get(node)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + node + }); } ~TestAspect() diff --git a/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp b/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp index c088cb84f..236faa8f0 100644 --- a/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp +++ b/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp @@ -76,7 +76,12 @@ public: }); for (const auto node: nodes) - d_func()->createBackendNode(node); + d_func()->createBackendNode({ + node->id(), + Qt3DCore::QNodePrivate::get(node)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + node + }); const auto handles = nodeManagers()->techniqueManager()->activeHandles(); for (const auto &handle: handles) { diff --git a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp index a6b09d179..a8ffa9712 100644 --- a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp +++ b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp @@ -91,6 +91,23 @@ QVector<Qt3DCore::QNode *> getNodesForCreation(Qt3DCore::QNode *root) return nodes; } +QVector<Qt3DCore::NodeTreeChange> nodeTreeChangesForNodes(const QVector<Qt3DCore::QNode *> nodes) +{ + QVector<Qt3DCore::NodeTreeChange> nodeTreeChanges; + nodeTreeChanges.reserve(nodes.size()); + + for (Qt3DCore::QNode *n : nodes) { + nodeTreeChanges.push_back({ + n->id(), + Qt3DCore::QNodePrivate::get(n)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + n + }); + } + + return nodeTreeChanges; +} + class TestAspect : public Qt3DRender::QRenderAspect { public: @@ -101,7 +118,7 @@ public: QRenderAspect::onRegistered(); const QVector<Qt3DCore::QNode *> nodes = getNodesForCreation(root); - d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodes); + d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodeTreeChangesForNodes(nodes)); Render::Entity *rootEntity = nodeManagers()->lookupResource<Render::Entity, Render::EntityManager>(rootEntityId()); Q_ASSERT(rootEntity); diff --git a/tests/auto/render/qcamera/tst_qcamera.cpp b/tests/auto/render/qcamera/tst_qcamera.cpp index 214305e53..4d424a420 100644 --- a/tests/auto/render/qcamera/tst_qcamera.cpp +++ b/tests/auto/render/qcamera/tst_qcamera.cpp @@ -80,6 +80,23 @@ QVector<Qt3DCore::QNode *> getNodesForCreation(Qt3DCore::QNode *root) return nodes; } +QVector<Qt3DCore::NodeTreeChange> nodeTreeChangesForNodes(const QVector<Qt3DCore::QNode *> nodes) +{ + QVector<Qt3DCore::NodeTreeChange> nodeTreeChanges; + nodeTreeChanges.reserve(nodes.size()); + + for (Qt3DCore::QNode *n : nodes) { + nodeTreeChanges.push_back({ + n->id(), + Qt3DCore::QNodePrivate::get(n)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + n + }); + } + + return nodeTreeChanges; +} + class TestAspect : public Qt3DRender::QRenderAspect { public: @@ -90,7 +107,7 @@ public: QRenderAspect::onRegistered(); const QVector<Qt3DCore::QNode *> nodes = getNodesForCreation(root); - d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodes); + d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodeTreeChangesForNodes(nodes)); Render::Entity *rootEntity = nodeManagers()->lookupResource<Render::Entity, Render::EntityManager>(rootEntityId()); Q_ASSERT(rootEntity); diff --git a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp index d44596abc..bc4f2910e 100644 --- a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp +++ b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp @@ -88,6 +88,23 @@ QVector<Qt3DCore::QNode *> getNodesForCreation(Qt3DCore::QNode *root) return nodes; } +QVector<Qt3DCore::NodeTreeChange> nodeTreeChangesForNodes(const QVector<Qt3DCore::QNode *> nodes) +{ + QVector<Qt3DCore::NodeTreeChange> nodeTreeChanges; + nodeTreeChanges.reserve(nodes.size()); + + for (Qt3DCore::QNode *n : nodes) { + nodeTreeChanges.push_back({ + n->id(), + Qt3DCore::QNodePrivate::get(n)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + n + }); + } + + return nodeTreeChanges; +} + class TestAspect : public Qt3DRender::QRenderAspect { public: @@ -98,7 +115,7 @@ public: QRenderAspect::onRegistered(); const QVector<Qt3DCore::QNode *> nodes = getNodesForCreation(root); - d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodes); + d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodeTreeChangesForNodes(nodes)); Render::Entity *rootEntity = nodeManagers()->lookupResource<Render::Entity, Render::EntityManager>(rootEntityId()); Q_ASSERT(rootEntity); diff --git a/tests/auto/render/renderviewbuilder/tst_renderviewbuilder.cpp b/tests/auto/render/renderviewbuilder/tst_renderviewbuilder.cpp index 18c3b3f36..22a461e4a 100644 --- a/tests/auto/render/renderviewbuilder/tst_renderviewbuilder.cpp +++ b/tests/auto/render/renderviewbuilder/tst_renderviewbuilder.cpp @@ -78,7 +78,12 @@ public: }); for (const auto node: nodes) - d_func()->createBackendNode(node); + d_func()->createBackendNode({ + node->id(), + Qt3DCore::QNodePrivate::get(node)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + node + }); } ~TestAspect() diff --git a/tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp b/tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp index 0c3b579de..287a17b84 100644 --- a/tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp +++ b/tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp @@ -320,16 +320,21 @@ public: TestAspect(Qt3DCore::QNode *root) : Qt3DRender::QRenderAspect() { - QVector<Qt3DCore::QNode *> nodes; + QVector<Qt3DCore::NodeTreeChange> nodes; Qt3DCore::QNodeVisitor v; v.traverse(root, [&nodes](Qt3DCore::QNode *node) { Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(node); d->m_typeInfo = const_cast<QMetaObject*>(Qt3DCore::QNodePrivate::findStaticMetaObject(node->metaObject())); d->m_hasBackendNode = true; - nodes << node; + nodes.push_back({ + node->id(), + Qt3DCore::QNodePrivate::get(node)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + node + }); }); - for (const auto node: nodes) + for (const auto &node: nodes) d_func()->createBackendNode(node); } diff --git a/tests/auto/render/updatemeshtrianglelistjob/tst_updatemeshtrianglelistjob.cpp b/tests/auto/render/updatemeshtrianglelistjob/tst_updatemeshtrianglelistjob.cpp index 71576d495..df24a5ca6 100644 --- a/tests/auto/render/updatemeshtrianglelistjob/tst_updatemeshtrianglelistjob.cpp +++ b/tests/auto/render/updatemeshtrianglelistjob/tst_updatemeshtrianglelistjob.cpp @@ -69,6 +69,23 @@ QVector<Qt3DCore::QNode *> getNodesForCreation(Qt3DCore::QNode *root) return nodes; } +QVector<Qt3DCore::NodeTreeChange> nodeTreeChangesForNodes(const QVector<Qt3DCore::QNode *> nodes) +{ + QVector<Qt3DCore::NodeTreeChange> nodeTreeChanges; + nodeTreeChanges.reserve(nodes.size()); + + for (Qt3DCore::QNode *n : nodes) { + nodeTreeChanges.push_back({ + n->id(), + Qt3DCore::QNodePrivate::get(n)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + n + }); + } + + return nodeTreeChanges; +} + class TestAspect : public Qt3DRender::QRenderAspect { public: @@ -79,7 +96,7 @@ public: Qt3DRender::QRenderAspect::onRegistered(); const QVector<Qt3DCore::QNode *> nodes = getNodesForCreation(root); - d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodes); + d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodeTreeChangesForNodes(nodes)); Qt3DRender::Render::Entity *rootEntity = nodeManagers()->lookupResource<Qt3DRender::Render::Entity, Render::EntityManager>(rootEntityId()); Q_ASSERT(rootEntity); diff --git a/tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp b/tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp index 4fe1794dc..0d900a202 100644 --- a/tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp +++ b/tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp @@ -70,6 +70,23 @@ QVector<Qt3DCore::QNode *> getNodesForCreation(Qt3DCore::QNode *root) return nodes; } +QVector<Qt3DCore::NodeTreeChange> nodeTreeChangesForNodes(const QVector<Qt3DCore::QNode *> nodes) +{ + QVector<Qt3DCore::NodeTreeChange> nodeTreeChanges; + nodeTreeChanges.reserve(nodes.size()); + + for (Qt3DCore::QNode *n : nodes) { + nodeTreeChanges.push_back({ + n->id(), + Qt3DCore::QNodePrivate::get(n)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + n + }); + } + + return nodeTreeChanges; +} + class TestAspect : public Qt3DRender::QRenderAspect { public: @@ -80,7 +97,7 @@ public: Qt3DRender::QRenderAspect::onRegistered(); const QVector<Qt3DCore::QNode *> nodes = getNodesForCreation(root); - d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodes); + d_func()->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(root), nodeTreeChangesForNodes(nodes)); Qt3DRender::Render::Entity *rootEntity = nodeManagers()->lookupResource<Qt3DRender::Render::Entity, Render::EntityManager>(rootEntityId()); Q_ASSERT(rootEntity); diff --git a/tests/benchmarks/render/jobs/tst_bench_jobs.cpp b/tests/benchmarks/render/jobs/tst_bench_jobs.cpp index 35b7e0184..b611f3cdc 100644 --- a/tests/benchmarks/render/jobs/tst_bench_jobs.cpp +++ b/tests/benchmarks/render/jobs/tst_bench_jobs.cpp @@ -123,16 +123,21 @@ namespace Qt3DRender { void onRootEntityChanged(Qt3DCore::QEntity *root) { if (!m_window) { - QVector<Qt3DCore::QNode *> nodes; + QVector<Qt3DCore::NodeTreeChange> nodes; Qt3DCore::QNodeVisitor v; v.traverse(root, [&nodes](Qt3DCore::QNode *node) { Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(node); d->m_typeInfo = const_cast<QMetaObject*>(Qt3DCore::QNodePrivate::findStaticMetaObject(node->metaObject())); d->m_hasBackendNode = true; - nodes << node; + nodes.push_back({ + node->id(), + Qt3DCore::QNodePrivate::get(node)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + node + }); }); - for (const auto node: nodes) + for (const auto &node: nodes) d_func()->createBackendNode(node); static_cast<Qt3DRender::Render::Renderer *>(d_func()->m_renderer)->m_renderSceneRoot = diff --git a/tests/benchmarks/render/layerfiltering/tst_bench_layerfiltering.cpp b/tests/benchmarks/render/layerfiltering/tst_bench_layerfiltering.cpp index 279655715..5523457be 100644 --- a/tests/benchmarks/render/layerfiltering/tst_bench_layerfiltering.cpp +++ b/tests/benchmarks/render/layerfiltering/tst_bench_layerfiltering.cpp @@ -55,16 +55,21 @@ public: Qt3DCore::QAbstractAspectPrivate::get(this)->m_jobManager = m_jobManager.data(); QRenderAspect::onRegistered(); - QVector<Qt3DCore::QNode *> nodes; + QVector<Qt3DCore::NodeTreeChange> nodes; Qt3DCore::QNodeVisitor v; v.traverse(root, [&nodes](Qt3DCore::QNode *node) { Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(node); d->m_typeInfo = const_cast<QMetaObject*>(Qt3DCore::QNodePrivate::findStaticMetaObject(node->metaObject())); d->m_hasBackendNode = true; - nodes << node; + nodes.push_back({ + node->id(), + Qt3DCore::QNodePrivate::get(node)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + node + }); }); - for (const auto node: nodes) + for (const auto &node: nodes) d_func()->createBackendNode(node); } diff --git a/tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp b/tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp index 0bb1f6cf9..210d82dcf 100644 --- a/tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp +++ b/tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp @@ -56,16 +56,21 @@ public: Qt3DCore::QAbstractAspectPrivate::get(this)->m_jobManager = m_jobManager.data(); QRenderAspect::onRegistered(); - QVector<Qt3DCore::QNode *> nodes; + QVector<Qt3DCore::NodeTreeChange> nodes; Qt3DCore::QNodeVisitor v; v.traverse(root, [&nodes](Qt3DCore::QNode *node) { Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(node); d->m_typeInfo = const_cast<QMetaObject*>(Qt3DCore::QNodePrivate::findStaticMetaObject(node->metaObject())); d->m_hasBackendNode = true; - nodes << node; + nodes.push_back({ + node->id(), + Qt3DCore::QNodePrivate::get(node)->m_typeInfo, + Qt3DCore::NodeTreeChange::Added, + node + }); }); - for (const auto node: nodes) + for (const auto &node: nodes) d_func()->createBackendNode(node); const auto handles = nodeManagers()->techniqueManager()->activeHandles(); |