diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-06-03 12:29:29 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2019-06-03 12:29:52 +0200 |
commit | 4eee1ab5a51ac482e2252e2e85c0fe624d5d4bad (patch) | |
tree | 71fb24fc69b2f77e08a57c56011ee5b72f23a52a /tests/auto/render/entity | |
parent | 79aa74b5d9df52605a8833e3853b422ca8e7a651 (diff) | |
parent | 666a645d1edc98dfea92fdaf7eaeed10c86dbc56 (diff) |
Merge remote-tracking branch 'origin/5.13' into dev
Conflicts:
src/render/renderers/opengl/renderer/renderer.cpp
tests/auto/render/textures/tst_textures.cpp
Change-Id: I4da0eafe7ddd4dd822c3dcb5f5fa826653a335b4
Diffstat (limited to 'tests/auto/render/entity')
-rw-r--r-- | tests/auto/render/entity/tst_entity.cpp | 186 |
1 files changed, 186 insertions, 0 deletions
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) |