From 19ec453f0476baf57f6bf935ac74ffa804dd25a2 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 29 May 2022 08:18:05 +0200 Subject: [PATCH] #5963: Test the entity surfaces creation by the WindingRenderer --- libs/render/WindingRenderer.h | 14 +++++++-- test/WindingRendering.cpp | 56 ++++++++++++++++++++++++++++++++--- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/libs/render/WindingRenderer.h b/libs/render/WindingRenderer.h index a85c4ff8bf..49ddbfb265 100644 --- a/libs/render/WindingRenderer.h +++ b/libs/render/WindingRenderer.h @@ -314,6 +314,15 @@ class WindingRenderer final : _owner(owner) {} + ~EntityWindings() + { + // Remove all groups from all entities + for (auto& [key, group] : _windingMap) + { + key.first->removeRenderable(group); + } + } + void addWinding(Slot slotMappingIndex) { const auto& slot = _owner._slots[slotMappingIndex]; @@ -392,13 +401,14 @@ class WindingRenderer final : ~WindingRenderer() { - _entitySurfaces.reset(); - // Release all storage allocations for (auto& bucket : _buckets) { deallocateStorage(bucket); } + + // Clear the entities after releasing the buckets + _entitySurfaces.reset(); } bool empty() const override diff --git a/test/WindingRendering.cpp b/test/WindingRendering.cpp index 6bff743f42..70fb9e92b3 100644 --- a/test/WindingRendering.cpp +++ b/test/WindingRendering.cpp @@ -456,7 +456,19 @@ TEST(CompactWindingVertexBuffer, PolygonIndexerSize5) // Winding size == 5 EXPECT_EQ(indices[4], 84) << "Index 4 mismatch"; } -TEST_F(WindingRendererTest, WindingGroupCreation) +inline std::size_t getNumEntitySurfaces(IRenderEntity* entity) +{ + std::size_t count = 0; + + entity->foreachRenderable([&](const render::IRenderableObject::Ptr& object, Shader* shader) + { + ++count; + }); + + return count; +} + +TEST_F(WindingRendererTest, EntitySurfaceCreation) { render::GeometryStore geometryStore(syncObjectProvider, bufferObjectProvider); auto shader = GlobalRenderSystem().capture("textures/common/caulk"); @@ -466,10 +478,46 @@ TEST_F(WindingRendererTest, WindingGroupCreation) // Create a new triangle WindingRenderer render::WindingRenderer renderer(geometryStore, testObjectRenderer, shader.get()); - // A test winding - std::vector winding = generateVertices(1, 4); + // Test windings of various sizes + std::vector winding4 = generateVertices(1, 4); + std::vector winding3 = generateVertices(1, 3); + + EXPECT_EQ(getNumEntitySurfaces(entity.get()), 0) << "Entity should start with no surfaces"; + + auto winding4Slot = renderer.addWinding(winding4, entity.get()); + EXPECT_EQ(getNumEntitySurfaces(entity.get()), 1) << "Entity should have 1 surface now"; + + auto winding3Slot = renderer.addWinding(winding3, entity.get()); + EXPECT_EQ(getNumEntitySurfaces(entity.get()), 2) << "Entity should have 2 surfaces now"; + + renderer.removeWinding(winding4Slot); + EXPECT_EQ(getNumEntitySurfaces(entity.get()), 1) << "Entity should have 1 surface now"; + + renderer.removeWinding(winding3Slot); + EXPECT_EQ(getNumEntitySurfaces(entity.get()), 0) << "Entity should be empty again"; +} + +TEST_F(WindingRendererTest, EntitySurfacesRemovedInDestructor) +{ + render::GeometryStore geometryStore(syncObjectProvider, bufferObjectProvider); + auto shader = GlobalRenderSystem().capture("textures/common/caulk"); + auto entity = algorithm::createEntityByClassName("func_static"); + scene::addNodeToContainer(entity, GlobalMapModule().getRoot()); + + // Create a new triangle WindingRenderer + auto renderer = std::make_unique>(geometryStore, testObjectRenderer, shader.get()); + + // Test windings of various sizes + std::vector winding4 = generateVertices(1, 4); + std::vector winding3 = generateVertices(1, 3); + + renderer->addWinding(winding4, entity.get()); + renderer->addWinding(winding3, entity.get()); + EXPECT_EQ(getNumEntitySurfaces(entity.get()), 2) << "Entity should have 2 surfaces now"; - renderer.addWinding(winding, entity.get()); + // All entity surfaces should be removed in the WindingRenderer's destructor + renderer.reset(); + EXPECT_EQ(getNumEntitySurfaces(entity.get()), 0) << "Entity should be empty again"; } }