From d51ad4213c2d201753f449ad725bf20eed8a2862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 24 Jan 2023 12:12:24 +0100 Subject: [PATCH] MeshTools: fix generateIndices() to work with attribute-less meshes. The vertex count has to be explicitly propagated to the output in that case because it can't be figured out from any attributes in this case. --- doc/changelog.dox | 2 ++ src/Magnum/MeshTools/GenerateIndices.cpp | 2 +- src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index b75ee3151..8dd0ffb94 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -841,6 +841,8 @@ See also: usually just didn't remove any duplicate whatsoever while `--remove-duplicates-fuzzy` did, no matter how ridiculously low epsilon was used. +- Fixed @ref MeshTools::generateIndices() to work correctly with + attribute-less @ref Trade::MeshData instances - @ref Platform::EmscriptenApplication randomly created antialiased contexts due to an uninitialized variable in its @ref Platform::EmscriptenApplication::GLConfiguration "GLConfiguration" diff --git a/src/Magnum/MeshTools/GenerateIndices.cpp b/src/Magnum/MeshTools/GenerateIndices.cpp index e53dc1db5..f68ff66c9 100644 --- a/src/Magnum/MeshTools/GenerateIndices.cpp +++ b/src/Magnum/MeshTools/GenerateIndices.cpp @@ -321,7 +321,7 @@ Trade::MeshData generateIndices(Trade::MeshData&& data) { Trade::MeshIndexData indices{MeshIndexType::UnsignedInt, indexData}; return Trade::MeshData{primitive, std::move(indexData), indices, - std::move(vertexData), std::move(attributeData)}; + std::move(vertexData), std::move(attributeData), vertexCount}; } Trade::MeshData generateIndices(const Trade::MeshData& data) { diff --git a/src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp b/src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp index 774ee41d5..cb554d88b 100644 --- a/src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp +++ b/src/Magnum/MeshTools/Test/GenerateIndicesTest.cpp @@ -67,6 +67,7 @@ struct GenerateIndicesTest: TestSuite::Tester { void generateIndicesMeshData(); void generateIndicesMeshDataMove(); + void generateIndicesMeshDataNoAttributes(); void generateIndicesMeshDataIndexed(); void generateIndicesMeshDataInvalidPrimitive(); }; @@ -196,6 +197,7 @@ GenerateIndicesTest::GenerateIndicesTest() { Containers::arraySize(MeshDataData)); addTests({&GenerateIndicesTest::generateIndicesMeshDataMove, + &GenerateIndicesTest::generateIndicesMeshDataNoAttributes, &GenerateIndicesTest::generateIndicesMeshDataIndexed, &GenerateIndicesTest::generateIndicesMeshDataInvalidPrimitive}); } @@ -688,6 +690,19 @@ void GenerateIndicesTest::generateIndicesMeshDataMove() { CORRADE_COMPARE(out.vertexData().data(), static_cast(vertices.data())); } +void GenerateIndicesTest::generateIndicesMeshDataNoAttributes() { + Trade::MeshData out = generateIndices(Trade::MeshData{MeshPrimitive::TriangleStrip, 4}); + CORRADE_VERIFY(out.isIndexed()); + CORRADE_COMPARE(out.indexType(), MeshIndexType::UnsignedInt); + CORRADE_COMPARE_AS(out.indices(), + Containers::arrayView({ + 0, 1, 2, + 2, 1, 3, /* Reversed */ + }), TestSuite::Compare::Container); + CORRADE_COMPARE(out.vertexCount(), 4); + CORRADE_COMPARE(out.attributeCount(), 0); +} + void GenerateIndicesTest::generateIndicesMeshDataIndexed() { CORRADE_SKIP_IF_NO_ASSERT();