diff options
author | Mike Krus <mike.krus@kdab.com> | 2019-04-03 21:20:53 +0100 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2019-05-25 09:28:33 +0100 |
commit | 861a73b5328334ebf076d3dd6b2ad6c17bdc0700 (patch) | |
tree | eecd01b77c76c4376813b59da63484bd866af813 /tests/auto/render/entity/tst_entity.cpp | |
parent | d108987a6ce9087908a14396ac90c8d9bb0860cb (diff) |
Iterate on child handles
Resolving list of handles as list of node pointers introduces
extra heap memory allocation (via QVector) which can cause locking with
high number of threads.
Added Entity::traverse() methods to apply a functor to all entitied
in a sub-tree.
Change-Id: I239ab30ac8ac53ba83666a147015d58465d76eb2
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'tests/auto/render/entity/tst_entity.cpp')
-rw-r--r-- | tests/auto/render/entity/tst_entity.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/auto/render/entity/tst_entity.cpp b/tests/auto/render/entity/tst_entity.cpp index 123a648d6..5cc3cddc3 100644 --- a/tests/auto/render/entity/tst_entity.cpp +++ b/tests/auto/render/entity/tst_entity.cpp @@ -419,6 +419,58 @@ private slots: qDeleteAll(components); } + + void traversal() { + // GIVEN + TestRenderer renderer; + NodeManagers nodeManagers; + Qt3DCore::QEntity frontendEntityA, frontendEntityB, frontendEntityC; + + auto entityCreator = [&nodeManagers, &renderer](const Qt3DCore::QEntity &frontEndEntity) { + HEntity renderNodeHandle = nodeManagers.renderNodesManager()->getOrAcquireHandle(frontEndEntity.id()); + Entity *entity = nodeManagers.renderNodesManager()->data(renderNodeHandle); + entity->setNodeManagers(&nodeManagers); + entity->setHandle(renderNodeHandle); + entity->setRenderer(&renderer); + return entity; + }; + + auto backendA = entityCreator(frontendEntityA); + auto backendB = entityCreator(frontendEntityB); + auto backendC = entityCreator(frontendEntityC); + + auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) { + const auto parentChange = QPropertyUpdatedChangePtr::create(entity.id()); + parentChange->setPropertyName("parentEntityUpdated"); + auto parent = entity.parentEntity(); + parentChange->setValue(QVariant::fromValue(parent ? parent->id() : Qt3DCore::QNodeId())); + + Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id()); + backendEntity->sceneChangeEvent(parentChange); + }; + + // reparent B to A and C to B. + frontendEntityB.setParent(&frontendEntityA); + sendParentChange(frontendEntityB); + frontendEntityC.setParent(&frontendEntityB); + sendParentChange(frontendEntityC); + + auto rebuildHierarchy = [](Entity *backend) { + backend->clearEntityHierarchy(); + backend->rebuildEntityHierarchy(); + }; + rebuildHierarchy(backendA); + rebuildHierarchy(backendB); + rebuildHierarchy(backendC); + + // WHEN + int visitCount = 0; + auto counter = [&visitCount](const Entity *) { ++visitCount; }; + backendA->traverse(counter); + + // THEN + QCOMPARE(visitCount, 3); + } }; QTEST_APPLESS_MAIN(tst_RenderEntity) |