summaryrefslogtreecommitdiffstats
path: root/tests/auto/render/entity
diff options
context:
space:
mode:
authorJim Albamont <jim.albamont@kdab.com>2019-09-13 10:20:37 -0700
committerJim Albamont <jim.albamont@kdab.com>2019-09-20 00:37:31 -0700
commit41968b79393df2cb2c859f76b92922c7c5dbc3b1 (patch)
treee0086b688cd56c26009e26e28214b9628f68e9d8 /tests/auto/render/entity
parentde4c982ceeb2abcdec8b214fd95e6e5d5d72b9ff (diff)
Remove backend entity hierarchy rebuilding jobs
We no longer need to have a special job to rebuild the entity hierarchy as parent nodes can now always be resolved on the backend either at creation time or while reparenting. The NodePostConstructorInit ensure that all backend nodes are created from the top down so a node can always find it's parent. Change-Id: I9dcfb64b62e2e02b89b1ae59efb41f25dfc09eae Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'tests/auto/render/entity')
-rw-r--r--tests/auto/render/entity/tst_entity.cpp218
1 files changed, 102 insertions, 116 deletions
diff --git a/tests/auto/render/entity/tst_entity.cpp b/tests/auto/render/entity/tst_entity.cpp
index 7e5150a77..463fbbb79 100644
--- a/tests/auto/render/entity/tst_entity.cpp
+++ b/tests/auto/render/entity/tst_entity.cpp
@@ -182,7 +182,6 @@ private slots:
entity.cleanup();
// THEN
- QVERIFY(entity.parentEntityId().isNull());
QVERIFY(entity.componentUuid<Transform>().isNull());
QVERIFY(entity.componentUuid<CameraLens>().isNull());
QVERIFY(entity.componentUuid<Material>().isNull());
@@ -201,29 +200,18 @@ private slots:
QVERIFY(!containsAll);
}
- void checkRebuildingEntityHierarchy()
+ void checkEntityReparenting()
{
// GIVEN
TestRenderer renderer;
NodeManagers nodeManagers;
Qt3DCore::QEntity frontendEntityA, frontendEntityB, frontendEntityC;
- auto entityCreator = [&nodeManagers, &renderer](const Qt3DCore::QEntity &frontEndEntity) {
- Entity *entity = nodeManagers.renderNodesManager()->getOrCreateResource(frontEndEntity.id());
- entity->setNodeManagers(&nodeManagers);
- entity->setRenderer(&renderer);
- return entity;
- };
-
- auto backendA = entityCreator(frontendEntityA);
- auto backendB = entityCreator(frontendEntityB);
- auto backendC = entityCreator(frontendEntityC);
+ auto backendA = createEntity(renderer, nodeManagers, frontendEntityA);
+ auto backendB = createEntity(renderer, nodeManagers, frontendEntityB);
+ auto backendC = createEntity(renderer, nodeManagers, frontendEntityC);
// THEN
- QVERIFY(backendA->parentEntityId().isNull());
- QVERIFY(backendB->parentEntityId().isNull());
- QVERIFY(backendC->parentEntityId().isNull());
-
QVERIFY(backendA->parent() == nullptr);
QVERIFY(backendB->parent() == nullptr);
QVERIFY(backendC->parent() == nullptr);
@@ -233,9 +221,6 @@ private slots:
QVERIFY(backendC->childrenHandles().isEmpty());
// WHEN
- renderer.clearDirtyBits(0);
- QVERIFY(renderer.dirtyBits() == 0);
-
auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) {
Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id());
backendEntity->syncFromFrontEnd(&entity, false);
@@ -248,68 +233,111 @@ private slots:
sendParentChange(frontendEntityC);
// THEN
- QVERIFY(renderer.dirtyBits() & AbstractRenderer::EntityHierarchyDirty);
+ QVERIFY(backendA->parent() == nullptr);
+ QVERIFY(backendB->parent() == backendA);
+ QVERIFY(backendC->parent() == backendB);
- QVERIFY(backendA->parentEntityId().isNull());
- QVERIFY(backendB->parentEntityId() == frontendEntityA.id());
- QVERIFY(backendC->parentEntityId() == frontendEntityB.id());
+ QCOMPARE(backendA->childrenHandles().count(), 1);
+ QCOMPARE(backendB->childrenHandles().count(), 1);
+ QVERIFY(backendC->childrenHandles().isEmpty());
+ // WHEN - reparent C to A
+ frontendEntityC.setParent(&frontendEntityA);
+ sendParentChange(frontendEntityC);
+
+ // THEN
+ QVERIFY(backendA->parent() == nullptr);
+ QVERIFY(backendB->parent() == backendA);
+ QVERIFY(backendC->parent() == backendA);
+
+ QCOMPARE(backendA->childrenHandles().size(), 2);
+ QVERIFY(backendB->childrenHandles().isEmpty());
+ QVERIFY(backendC->childrenHandles().isEmpty());
+
+ // WHEN - reparent B to null.
+ frontendEntityB.setParent(static_cast<Qt3DCore::QNode *>(nullptr));
+ sendParentChange(frontendEntityB);
+
+ // THEN
QVERIFY(backendA->parent() == nullptr);
QVERIFY(backendB->parent() == nullptr);
- QVERIFY(backendC->parent() == nullptr);
+ QVERIFY(backendC->parent() == backendA);
- QVERIFY(backendA->childrenHandles().isEmpty());
+ QCOMPARE(backendA->childrenHandles().count(), 1);
+ QVERIFY(!backendA->childrenHandles().contains(backendB->handle()));
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ }
+
+ void checkEntityCleanup()
+ {
+ // GIVEN
+ TestRenderer renderer;
+ NodeManagers nodeManagers;
+ Qt3DCore::QEntity frontendEntityA, frontendEntityB, frontendEntityC;
+
+ auto backendA = createEntity(renderer, nodeManagers, frontendEntityA);
+ auto backendB = createEntity(renderer, nodeManagers, frontendEntityB);
+ auto backendC = createEntity(renderer, nodeManagers, frontendEntityC);
// WHEN
- auto rebuildHierarchy = [](Entity *backend) {
- backend->clearEntityHierarchy();
- backend->rebuildEntityHierarchy();
+ auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) {
+ Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id());
+ backendEntity->syncFromFrontEnd(&entity, false);
};
- rebuildHierarchy(backendA);
- rebuildHierarchy(backendB);
- rebuildHierarchy(backendC);
+
+ // reparent B and C to A.
+ frontendEntityB.setParent(&frontendEntityA);
+ sendParentChange(frontendEntityB);
+ frontendEntityC.setParent(&frontendEntityA);
+ sendParentChange(frontendEntityC);
// THEN
QVERIFY(backendA->parent() == nullptr);
QVERIFY(backendB->parent() == backendA);
- QVERIFY(backendC->parent() == backendB);
+ QVERIFY(backendC->parent() == backendA);
- QVERIFY(!backendA->childrenHandles().isEmpty());
- QVERIFY(!backendB->childrenHandles().isEmpty());
+ QCOMPARE(backendA->childrenHandles().count(), 2);
+ QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
- // WHEN - reparent B to null.
- frontendEntityB.setParent(static_cast<Qt3DCore::QNode *>(nullptr));
- sendParentChange(frontendEntityB);
- rebuildHierarchy(backendA);
- rebuildHierarchy(backendB);
- rebuildHierarchy(backendC);
+ // WHEN - cleaning up a child
+ backendC->cleanup();
+
+ // THEN - the child's parent should be null and it
+ // should be removed from its parent's list of children
+ QVERIFY(backendA->parent() == nullptr);
+ QVERIFY(backendB->parent() == backendA);
+ QVERIFY(backendC->parent() == nullptr);
+
+ QCOMPARE(backendA->childrenHandles().count(), 1);
+ QVERIFY(!backendA->childrenHandles().contains(backendC->handle()));
+ QVERIFY(backendB->childrenHandles().isEmpty());
+ QVERIFY(backendC->childrenHandles().isEmpty());
- QVERIFY(backendA->parentEntityId().isNull());
- QVERIFY(backendB->parentEntityId().isNull());
- QVERIFY(backendC->parentEntityId() == frontendEntityB.id());
+ // WHEN (cleaning up parent)
+ backendA->cleanup();
+ // THEN (it's children's parent should be set to null)
QVERIFY(backendA->parent() == nullptr);
QVERIFY(backendB->parent() == nullptr);
- QVERIFY(backendC->parent() == backendB);
+ QVERIFY(backendC->parent() == nullptr);
QVERIFY(backendA->childrenHandles().isEmpty());
- QVERIFY(!backendB->childrenHandles().isEmpty());
+ QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
- // WHEN - cleanup
- backendA->cleanup();
+ // WHEN
backendB->cleanup();
- backendC->cleanup();
- // THEN
- QVERIFY(backendA->parentEntityId().isNull());
- QVERIFY(backendB->parentEntityId().isNull());
- QVERIFY(backendC->parentEntityId().isNull());
+ // THEN nothing should change
+ QVERIFY(backendA->childrenHandles().isEmpty());
+ QVERIFY(backendB->childrenHandles().isEmpty());
+ QVERIFY(backendC->childrenHandles().isEmpty());
- QVERIFY(renderer.dirtyBits() != 0);
+ QVERIFY(backendA->parent() == nullptr);
+ QVERIFY(backendB->parent() == nullptr);
+ QVERIFY(backendC->parent() == nullptr);
}
void shouldHandleSingleComponentEvents_data()
@@ -441,19 +469,9 @@ private slots:
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);
- entity->syncFromFrontEnd(&frontEndEntity, true);
- return entity;
- };
-
- auto backendA = entityCreator(frontendEntityA);
- auto backendB = entityCreator(frontendEntityB);
- auto backendC = entityCreator(frontendEntityC);
+ auto backendA = createEntity(renderer, nodeManagers, frontendEntityA);
+ auto backendB = createEntity(renderer, nodeManagers, frontendEntityB);
+ auto backendC = createEntity(renderer, nodeManagers, frontendEntityC);
auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) {
Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id());
@@ -466,14 +484,6 @@ private slots:
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; };
@@ -494,19 +504,9 @@ private slots:
frontendEntityB.setEnabled(false);
frontendEntityC.setEnabled(false);
- 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);
- entity->syncFromFrontEnd(&frontEndEntity, true);
- return entity;
- };
-
- auto backendA = entityCreator(frontendEntityA);
- auto backendB = entityCreator(frontendEntityB);
- auto backendC = entityCreator(frontendEntityC);
+ auto backendA = createEntity(renderer, nodeManagers, frontendEntityA);
+ auto backendB = createEntity(renderer, nodeManagers, frontendEntityB);
+ auto backendC = createEntity(renderer, nodeManagers, frontendEntityC);
auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) {
Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id());
@@ -519,14 +519,6 @@ private slots:
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);
@@ -553,19 +545,9 @@ private slots:
frontendEntityB.setEnabled(false);
frontendEntityC.setEnabled(false);
- 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);
- entity->syncFromFrontEnd(&frontEndEntity, true);
- return entity;
- };
-
- auto backendA = entityCreator(frontendEntityA);
- auto backendB = entityCreator(frontendEntityB);
- auto backendC = entityCreator(frontendEntityC);
+ auto backendA = createEntity(renderer, nodeManagers, frontendEntityA);
+ auto backendB = createEntity(renderer, nodeManagers, frontendEntityB);
+ auto backendC = createEntity(renderer, nodeManagers, frontendEntityC);
auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) {
Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id());
@@ -578,14 +560,6 @@ private slots:
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);
@@ -596,6 +570,18 @@ private slots:
QCOMPARE(r1.count(), 3);
QCOMPARE(r2.count(), 0);
}
+
+private:
+ Entity *createEntity(TestRenderer &renderer, NodeManagers &nodeManagers, 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);
+ entity->syncFromFrontEnd(&frontEndEntity, true);
+ return entity;
+ }
+
};
QTEST_APPLESS_MAIN(tst_RenderEntity)