Skip to content

Commit

Permalink
#5963: Test the entity surfaces creation by the WindingRenderer
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed May 29, 2022
1 parent b14e0c7 commit 19ec453
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 6 deletions.
14 changes: 12 additions & 2 deletions libs/render/WindingRenderer.h
Expand Up @@ -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];
Expand Down Expand Up @@ -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
Expand Down
56 changes: 52 additions & 4 deletions test/WindingRendering.cpp
Expand Up @@ -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");
Expand All @@ -466,10 +478,46 @@ TEST_F(WindingRendererTest, WindingGroupCreation)
// Create a new triangle WindingRenderer
render::WindingRenderer<render::WindingIndexer_Triangles> renderer(geometryStore, testObjectRenderer, shader.get());

// A test winding
std::vector<render::RenderVertex> winding = generateVertices(1, 4);
// Test windings of various sizes
std::vector<render::RenderVertex> winding4 = generateVertices(1, 4);
std::vector<render::RenderVertex> 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<render::WindingRenderer<render::WindingIndexer_Triangles>>(geometryStore, testObjectRenderer, shader.get());

// Test windings of various sizes
std::vector<render::RenderVertex> winding4 = generateVertices(1, 4);
std::vector<render::RenderVertex> 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";
}

}

0 comments on commit 19ec453

Please sign in to comment.