summaryrefslogtreecommitdiffstats
path: root/tests/auto/render/entity
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-06-03 12:29:29 +0200
committerLiang Qi <liang.qi@qt.io>2019-06-03 12:29:52 +0200
commit4eee1ab5a51ac482e2252e2e85c0fe624d5d4bad (patch)
tree71fb24fc69b2f77e08a57c56011ee5b72f23a52a /tests/auto/render/entity
parent79aa74b5d9df52605a8833e3853b422ca8e7a651 (diff)
parent666a645d1edc98dfea92fdaf7eaeed10c86dbc56 (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.cpp186
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)