diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-08-11 09:09:51 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-08-16 06:26:46 +0000 |
commit | 68f8d0e6e174643a1d0c529aff0fe3d377ea9ed4 (patch) | |
tree | 4b25860a55bc894450155c01a9d59e61bbc4ee73 /tests | |
parent | 783440e2b1e21b13699f0dd20bb8065f65d8e5b0 (diff) |
Entity: fix -> properly clear childrenHandles vector
When cleanup is called that means an Entity needs to be recycled for reuse
later on. The children handles vector wasn't cleared which resulted in it
containing invalid handles when the Entity element was reused. In turn that
eventually resulted in asserts in the handle manager when that Entity was
released again (which explains crashes with the QSceneLoader changing
sources).
Change-Id: Ic2e69132e4a5186f92936593ddcf3da72a7e1446
Task-number: QTBUG-54889
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/render/entity/tst_entity.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/tests/auto/render/entity/tst_entity.cpp b/tests/auto/render/entity/tst_entity.cpp index 627891375..0bd3a6054 100644 --- a/tests/auto/render/entity/tst_entity.cpp +++ b/tests/auto/render/entity/tst_entity.cpp @@ -28,9 +28,12 @@ #include <QtTest/QtTest> #include <Qt3DRender/private/entity_p.h> +#include <Qt3DRender/private/nodemanagers_p.h> +#include <Qt3DRender/private/managers_p.h> #include <Qt3DRender/QCameraLens> #include <Qt3DCore/QPropertyUpdatedChange> +#include <Qt3DCore/QPropertyNodeAddedChange> #include <Qt3DCore/QComponentAddedChange> #include <Qt3DCore/QComponentRemovedChange> #include <Qt3DCore/QTransform> @@ -94,9 +97,11 @@ private slots: QFETCH(QList<QComponent*>, components); TestRenderer renderer; + NodeManagers nodeManagers; Qt3DRender::Render::Entity entity; Qt3DCore::QEntity dummyFrontendEntity; entity.setRenderer(&renderer); + entity.setNodeManagers(&nodeManagers); // THEN QVERIFY(entity.componentUuid<Transform>().isNull()); @@ -108,6 +113,7 @@ private slots: QVERIFY(entity.componentsUuid<Layer>().isEmpty()); QVERIFY(entity.componentsUuid<ShaderData>().isEmpty()); QVERIFY(!entity.isBoundingVolumeDirty()); + QVERIFY(entity.childrenHandles().isEmpty()); // WHEN Q_FOREACH (QComponent *component, components) { @@ -115,6 +121,15 @@ private slots: entity.sceneChangeEvent(addChange); } + Qt3DCore::QEntity dummyFrontendEntityChild; + // Create nodes in the backend manager + nodeManagers.renderNodesManager()->getOrCreateResource(dummyFrontendEntity.id()); + nodeManagers.renderNodesManager()->getOrCreateResource(dummyFrontendEntityChild.id()); + // Send children added event to entity + const auto addEntityChange = QPropertyNodeAddedChangePtr::create(dummyFrontendEntity.id(), &dummyFrontendEntityChild); + entity.sceneChangeEvent(addEntityChange); + + // THEN QVERIFY(!entity.componentUuid<Transform>().isNull()); QVERIFY(!entity.componentUuid<CameraLens>().isNull()); @@ -125,6 +140,7 @@ private slots: QVERIFY(!entity.componentsUuid<Layer>().isEmpty()); QVERIFY(!entity.componentsUuid<ShaderData>().isEmpty()); QVERIFY(entity.isBoundingVolumeDirty()); + QVERIFY(!entity.childrenHandles().isEmpty()); QVERIFY(renderer.dirtyBits() != 0); bool containsAll = entity.containsComponentsOfType<Transform, CameraLens, Material, GeometryRenderer, ObjectPicker, ComputeCommand>(); QVERIFY(containsAll); @@ -142,6 +158,7 @@ private slots: QVERIFY(entity.componentsUuid<Layer>().isEmpty()); QVERIFY(entity.componentsUuid<ShaderData>().isEmpty()); QVERIFY(!entity.isBoundingVolumeDirty()); + QVERIFY(entity.childrenHandles().isEmpty()); containsAll = entity.containsComponentsOfType<Transform, CameraLens, Material, GeometryRenderer, ObjectPicker, ComputeCommand>(); QVERIFY(!containsAll); } |