diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-01-31 09:33:36 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-01-31 10:56:42 +0100 |
commit | 32755ab5cca668c82b43bbe8b2e907e4f7dd7720 (patch) | |
tree | 429eab1c820b0f649ebc6a48d2d1aa9724d80a64 /tests | |
parent | 980eedb9e33c2c14e3781ee7bda46ba512071f90 (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.cpp | 47 | ||||
-rw-r--r-- | tests/auto/render/scene2d/tst_scene2d.cpp | 2 |
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); |