summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-01-31 09:33:36 +0100
committerPaul Lemire <paul.lemire@kdab.com>2020-01-31 10:56:42 +0100
commit32755ab5cca668c82b43bbe8b2e907e4f7dd7720 (patch)
tree429eab1c820b0f649ebc6a48d2d1aa9724d80a64 /tests
parent980eedb9e33c2c14e3781ee7bda46ba512071f90 (diff)
Fix stale Entity caches
Make sure we mark the internal state as dirty when Entities get cleaned up. We could otherwise end up with stale caches referencing Entity's that have been cleaned up (referencing null bounding volumes ...) Change-Id: Ia2d2c67f8635e28690f33c0a7d4c9ff1de0eb471 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/render/entity/tst_entity.cpp47
-rw-r--r--tests/auto/render/scene2d/tst_scene2d.cpp2
2 files changed, 37 insertions, 12 deletions
diff --git a/tests/auto/render/entity/tst_entity.cpp b/tests/auto/render/entity/tst_entity.cpp
index e3b8e756e..2eeca2b39 100644
--- a/tests/auto/render/entity/tst_entity.cpp
+++ b/tests/auto/render/entity/tst_entity.cpp
@@ -123,11 +123,13 @@ private slots:
TestRenderer renderer;
NodeManagers nodeManagers;
Qt3DRender::Render::Entity entity;
- Qt3DCore::QEntity dummyFrontendEntity;
entity.setRenderer(&renderer);
entity.setNodeManagers(&nodeManagers);
// THEN
+ QCOMPARE(renderer.dirtyBits(), 0);
+
+ // THEN
QVERIFY(entity.componentUuid<Transform>().isNull());
QVERIFY(entity.componentUuid<CameraLens>().isNull());
QVERIFY(entity.componentUuid<Material>().isNull());
@@ -141,20 +143,16 @@ private slots:
QVERIFY(!entity.isBoundingVolumeDirty());
QVERIFY(entity.childrenHandles().isEmpty());
QVERIFY(entity.layerIds().isEmpty());
+ QCOMPARE(entity.renderer(), &renderer);
+
+ QCOMPARE(renderer.dirtyBits(), 0);
// WHEN
for (QComponent *component : components)
EntityPrivate::get(&entity)->componentAdded(component);
- Qt3DCore::QEntity dummyFrontendEntityChild;
- // Create nodes in the backend manager
- nodeManagers.renderNodesManager()->getOrCreateResource(dummyFrontendEntity.id());
- nodeManagers.renderNodesManager()->getOrCreateResource(dummyFrontendEntityChild.id());
-
-// TODOSYNC clean up
-// // Send children added event to entity
-// const auto addEntityChange = QPropertyNodeAddedChangePtr::create(dummyFrontendEntity.id(), &dummyFrontendEntityChild);
-// entity.sceneChangeEvent(addEntityChange);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
// THEN
QVERIFY(!entity.componentUuid<Transform>().isNull());
@@ -170,7 +168,7 @@ private slots:
QVERIFY(entity.isBoundingVolumeDirty());
QVERIFY(entity.childrenHandles().isEmpty());
QVERIFY(!entity.layerIds().isEmpty());
- QVERIFY(renderer.dirtyBits() != 0);
+ QCOMPARE(renderer.dirtyBits(), 0);
bool containsAll = entity.containsComponentsOfType<Transform,
CameraLens, Material, GeometryRenderer, ObjectPicker, ComputeCommand, Armature>();
QVERIFY(containsAll);
@@ -195,6 +193,9 @@ private slots:
containsAll = entity.containsComponentsOfType<Transform,
CameraLens, Material, GeometryRenderer, ObjectPicker, ComputeCommand, Armature>();
QVERIFY(!containsAll);
+
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
}
void checkEntityReparenting()
@@ -217,6 +218,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN
auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) {
Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id());
@@ -238,6 +242,9 @@ private slots:
QCOMPARE(backendB->childrenHandles().count(), 1);
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN - reparent C to A
frontendEntityC.setParent(&frontendEntityA);
sendParentChange(frontendEntityC);
@@ -251,6 +258,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN - reparent B to null.
frontendEntityB.setParent(static_cast<Qt3DCore::QNode *>(nullptr));
sendParentChange(frontendEntityB);
@@ -264,6 +274,9 @@ private slots:
QVERIFY(!backendA->childrenHandles().contains(backendB->handle()));
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
}
void checkEntityCleanup()
@@ -298,6 +311,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN - cleaning up a child
backendC->cleanup();
@@ -312,6 +328,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN (cleaning up parent)
backendA->cleanup();
@@ -324,6 +343,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN
backendB->cleanup();
@@ -335,6 +357,9 @@ private slots:
QVERIFY(backendA->parent() == nullptr);
QVERIFY(backendB->parent() == nullptr);
QVERIFY(backendC->parent() == nullptr);
+
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
}
void shouldHandleSingleComponentEvents_data()
diff --git a/tests/auto/render/scene2d/tst_scene2d.cpp b/tests/auto/render/scene2d/tst_scene2d.cpp
index fcb4c0908..ecade18fc 100644
--- a/tests/auto/render/scene2d/tst_scene2d.cpp
+++ b/tests/auto/render/scene2d/tst_scene2d.cpp
@@ -209,6 +209,7 @@ private Q_SLOTS:
QScopedPointer<TestWindow> testWindow(new TestWindow());
Scene2DSharedObjectPtr sharedObject(new Scene2DSharedObject(nullptr));
+ TestRenderer renderer;
QScopedPointer<Scene2D> scene2d(new Scene2D());
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
@@ -218,7 +219,6 @@ private Q_SLOTS:
Qt3DRender::QBuffer *dataBuffer =new Qt3DRender::QBuffer();
QScopedPointer<Qt3DCore::QEntity> entity(new Qt3DCore::QEntity());
entity->addComponent(geometryRenderer);
- TestRenderer renderer;
renderer.setNodeManagers(nodeManagers.data());
scene2d->setRenderer(&renderer);
scene2d->setEnabled(true);