summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-08-30 11:41:18 +0200
committerMike Krus <mike.krus@kdab.com>2019-09-16 10:39:23 +0200
commit6a9609f8956ccc528da8b7acee2d7a3d195b2b2d (patch)
treed12aef2a869a8572fb48163bc7db0def2c52abc5
parentc89997143cd6e51916924b71c8b0bf8705480a67 (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>
-rw-r--r--src/core/aspects/qabstractaspect.cpp89
-rw-r--r--src/core/aspects/qabstractaspect_p.h25
-rw-r--r--src/core/aspects/qaspectengine.cpp22
-rw-r--r--src/core/aspects/qaspectengine_p.h1
-rw-r--r--src/core/aspects/qaspectmanager.cpp89
-rw-r--r--src/core/aspects/qaspectmanager_p.h7
-rw-r--r--src/core/core.pri2
-rw-r--r--src/core/nodes/qnode.cpp7
-rw-r--r--src/core/qchangearbiter.cpp20
-rw-r--r--src/core/qchangearbiter_p.h4
-rw-r--r--src/core/qsceneobserverinterface.cpp52
-rw-r--r--src/core/qsceneobserverinterface_p.h81
-rw-r--r--tests/auto/core/nodes/tst_nodes.cpp161
-rw-r--r--tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp78
-rw-r--r--tests/auto/render/boundingsphere/tst_boundingsphere.cpp20
-rw-r--r--tests/auto/render/commons/testaspect.cpp8
-rw-r--r--tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp7
-rw-r--r--tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp7
-rw-r--r--tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp19
-rw-r--r--tests/auto/render/qcamera/tst_qcamera.cpp19
-rw-r--r--tests/auto/render/raycastingjob/tst_raycastingjob.cpp19
-rw-r--r--tests/auto/render/renderviewbuilder/tst_renderviewbuilder.cpp7
-rw-r--r--tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp11
-rw-r--r--tests/auto/render/updatemeshtrianglelistjob/tst_updatemeshtrianglelistjob.cpp19
-rw-r--r--tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp19
-rw-r--r--tests/benchmarks/render/jobs/tst_bench_jobs.cpp11
-rw-r--r--tests/benchmarks/render/layerfiltering/tst_bench_layerfiltering.cpp11
-rw-r--r--tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp11
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();