diff options
Diffstat (limited to 'tests/auto')
9 files changed, 202 insertions, 2 deletions
diff --git a/tests/auto/core/qentity/tst_qentity.cpp b/tests/auto/core/qentity/tst_qentity.cpp index d7847342b..04f695953 100644 --- a/tests/auto/core/qentity/tst_qentity.cpp +++ b/tests/auto/core/qentity/tst_qentity.cpp @@ -73,7 +73,7 @@ class MyQComponent : public Qt3DCore::QComponent { Q_OBJECT public: - explicit MyQComponent(Qt3DCore::QNode *parent = 0) + explicit MyQComponent(Qt3DCore::QNode *parent = nullptr) : QComponent(parent) {} }; @@ -90,7 +90,7 @@ public: class MyEntity : public Qt3DCore::QEntity { public: - explicit MyEntity(Qt3DCore::QNode *parent = 0) + explicit MyEntity(Qt3DCore::QNode *parent = nullptr) : QEntity(parent) {} }; @@ -622,6 +622,8 @@ void tst_Entity::checkCloning_data() Qt3DCore::QEntity *grandChild = new MyEntity(entityWithNestedChildren); QVector<QNodeId> childIds = {child->id(), grandChild->id()}; QTest::newRow("entityWithNestedChildren") << entityWithNestedChildren << childIds << 4; + + Q_UNUSED(dummy); } } 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 0588a14e9..08d08404c 100644 --- a/tests/auto/render/entity/tst_entity.cpp +++ b/tests/auto/render/entity/tst_entity.cpp @@ -30,6 +30,8 @@ #include <Qt3DRender/private/entity_p.h> #include <Qt3DRender/private/nodemanagers_p.h> #include <Qt3DRender/private/managers_p.h> +#include <Qt3DRender/private/entityvisitor_p.h> +#include <Qt3DRender/private/entityaccumulator_p.h> #include <Qt3DRender/QCameraLens> #include <Qt3DCore/QPropertyUpdatedChange> @@ -69,6 +71,24 @@ QVector<QNodeId> layersUuid(Entity *entity) { return entity->componentsUuid<Laye QVector<QNodeId> shadersUuid(Entity *entity) { return entity->componentsUuid<ShaderData>(); } QVector<QNodeId> environmentLightsUuid(Entity *entity) { return entity->componentsUuid<EnvironmentLight>(); } +class CompleteVisitor : public EntityVisitor +{ +public: + CompleteVisitor(NodeManagers *manager) : EntityVisitor(manager) { } + + int count = 0; + Operation visit(Entity *) { count++; return Continue; } +}; + +class EnabledVisitor : public EntityVisitor +{ +public: + EnabledVisitor(NodeManagers *manager) : EntityVisitor(manager) { } + + int count = 0; + Operation visit(Entity *e) { count++; return e->isEnabled() ? Continue : Prune; } +}; + class tst_RenderEntity : public QObject { Q_OBJECT @@ -419,6 +439,172 @@ 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); + } + + void visitor() + { + // 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 + CompleteVisitor v1(&nodeManagers); + EnabledVisitor v2(&nodeManagers); + CompleteVisitor v3(&nodeManagers); + v3.setPruneDisabled(true); + v1.apply(backendA); + v2.apply(backendA); + v3.apply(backendA); + + // THEN + QCOMPARE(v1.count, 3); + QCOMPARE(v2.count, 1); // nodes disabled by default but the first one is still visited before visitation finds out it's disabled + QCOMPARE(v3.count, 0); // nodes disabled by default + } + + void accumulator() + { + // 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 + EntityAccumulator v1(&nodeManagers); + EntityAccumulator v2([](Entity *e) { return e->isEnabled(); }, &nodeManagers); + const auto r1 = v1.apply(backendA); + const auto r2 = v2.apply(backendA); + + // THEN + QCOMPARE(r1.count(), 3); + QCOMPARE(r2.count(), 0); + } }; 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 cd82d69d8..1d5d56cf9 100644 --- a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp +++ b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp @@ -117,6 +117,7 @@ void runRequiredJobs(Qt3DRender::TestAspect *test) Qt3DRender::Render::UpdateWorldTransformJob updateWorldTransform; updateWorldTransform.setRoot(test->sceneRoot()); + updateWorldTransform.setManagers(test->nodeManagers()); updateWorldTransform.run(); // For each buffer @@ -138,6 +139,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(); } |