summaryrefslogtreecommitdiffstats
path: root/tests/auto/render
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2019-04-03 21:20:53 +0100
committerMike Krus <mike.krus@kdab.com>2019-05-25 09:28:33 +0100
commit861a73b5328334ebf076d3dd6b2ad6c17bdc0700 (patch)
treeeecd01b77c76c4376813b59da63484bd866af813 /tests/auto/render
parentd108987a6ce9087908a14396ac90c8d9bb0860cb (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')
-rw-r--r--tests/auto/render/boundingsphere/tst_boundingsphere.cpp2
-rw-r--r--tests/auto/render/entity/tst_entity.cpp52
-rw-r--r--tests/auto/render/layerfiltering/tst_layerfiltering.cpp1
-rw-r--r--tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp2
-rw-r--r--tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp3
-rw-r--r--tests/auto/render/qcamera/tst_qcamera.cpp1
-rw-r--r--tests/auto/render/raycastingjob/tst_raycastingjob.cpp2
-rw-r--r--tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp1
8 files changed, 64 insertions, 0 deletions
diff --git a/tests/auto/render/boundingsphere/tst_boundingsphere.cpp b/tests/auto/render/boundingsphere/tst_boundingsphere.cpp
index b35c6d31a..40d992347 100644
--- a/tests/auto/render/boundingsphere/tst_boundingsphere.cpp
+++ b/tests/auto/render/boundingsphere/tst_boundingsphere.cpp
@@ -123,6 +123,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::UpdateWorldTransformJob updateWorldTransform;
updateWorldTransform.setRoot(test->sceneRoot());
+ updateWorldTransform.setManagers(test->nodeManagers());
updateWorldTransform.run();
// For each buffer
@@ -144,6 +145,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::ExpandBoundingVolumeJob expandBVolume;
expandBVolume.setRoot(test->sceneRoot());
+ expandBVolume.setManagers(test->nodeManagers());
expandBVolume.run();
Qt3DRender::Render::UpdateMeshTriangleListJob updateTriangleList;
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)
diff --git a/tests/auto/render/layerfiltering/tst_layerfiltering.cpp b/tests/auto/render/layerfiltering/tst_layerfiltering.cpp
index 9b8636f49..8c72829e0 100644
--- a/tests/auto/render/layerfiltering/tst_layerfiltering.cpp
+++ b/tests/auto/render/layerfiltering/tst_layerfiltering.cpp
@@ -640,6 +640,7 @@ private Q_SLOTS:
Qt3DRender::Render::UpdateTreeEnabledJob updateTreeEnabledJob;
updateTreeEnabledJob.setRoot(backendRoot);
+ updateTreeEnabledJob.setManagers(aspect->nodeManagers());
updateTreeEnabledJob.run();
// WHEN
diff --git a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
index 497e620a7..d7903b8f7 100644
--- a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
+++ b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
@@ -114,6 +114,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::UpdateWorldTransformJob updateWorldTransform;
updateWorldTransform.setRoot(test->sceneRoot());
+ updateWorldTransform.setManagers(test->nodeManagers());
updateWorldTransform.run();
// For each buffer
@@ -135,6 +136,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::ExpandBoundingVolumeJob expandBVolume;
expandBVolume.setRoot(test->sceneRoot());
+ expandBVolume.setManagers(test->nodeManagers());
expandBVolume.run();
Qt3DRender::Render::UpdateMeshTriangleListJob updateTriangleList;
diff --git a/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp b/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp
index 7bb3c16a7..c8d862b2e 100644
--- a/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp
+++ b/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp
@@ -253,10 +253,12 @@ private Q_SLOTS:
Qt3DRender::Render::UpdateTreeEnabledJob updateTreeEnabledJob;
updateTreeEnabledJob.setRoot(backendRoot);
+ updateTreeEnabledJob.setManagers(aspect->nodeManagers());
updateTreeEnabledJob.run();
Qt3DRender::Render::UpdateWorldTransformJob updateWorldTransform;
updateWorldTransform.setRoot(backendRoot);
+ updateWorldTransform.setManagers(aspect->nodeManagers());
updateWorldTransform.run();
Qt3DRender::Render::CalculateBoundingVolumeJob calcBVolume;
@@ -270,6 +272,7 @@ private Q_SLOTS:
Qt3DRender::Render::ExpandBoundingVolumeJob expandBVolume;
expandBVolume.setRoot(backendRoot);
+ expandBVolume.setManagers(aspect->nodeManagers());
expandBVolume.run();
// WHEN
diff --git a/tests/auto/render/qcamera/tst_qcamera.cpp b/tests/auto/render/qcamera/tst_qcamera.cpp
index 7aef2af7d..fb2d3ea64 100644
--- a/tests/auto/render/qcamera/tst_qcamera.cpp
+++ b/tests/auto/render/qcamera/tst_qcamera.cpp
@@ -106,6 +106,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::UpdateWorldTransformJob updateWorldTransform;
updateWorldTransform.setRoot(test->sceneRoot());
+ updateWorldTransform.setManagers(test->nodeManagers());
updateWorldTransform.run();
}
diff --git a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
index 411bb9160..9477947ac 100644
--- a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
+++ b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
@@ -113,6 +113,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::UpdateWorldTransformJob updateWorldTransform;
updateWorldTransform.setRoot(test->sceneRoot());
+ updateWorldTransform.setManagers(test->nodeManagers());
updateWorldTransform.run();
// For each buffer
@@ -134,6 +135,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::ExpandBoundingVolumeJob expandBVolume;
expandBVolume.setRoot(test->sceneRoot());
+ expandBVolume.setManagers(test->nodeManagers());
expandBVolume.run();
Qt3DRender::Render::UpdateMeshTriangleListJob updateTriangleList;
diff --git a/tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp b/tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp
index 4bab46423..e38d6ba08 100644
--- a/tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp
+++ b/tests/auto/render/updateshaderdatatransformjob/tst_updateshaderdatatransformjob.cpp
@@ -95,6 +95,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::UpdateWorldTransformJob updateWorldTransform;
updateWorldTransform.setRoot(test->sceneRoot());
+ updateWorldTransform.setManagers(test->nodeManagers());
updateWorldTransform.run();
}