From 91aff011a88f6a25939c7256ce921d1aa9caa42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 17 Jan 2022 10:02:27 +0100 Subject: [PATCH] MeshTools: make owned() properly preserve strided indices. The reference() and mutableReference() utils preserve that implicitly as MeshData::indices() now returns a strided array view containing all needed information. --- src/Magnum/MeshTools/Reference.cpp | 8 +++++- src/Magnum/MeshTools/Test/ReferenceTest.cpp | 27 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Magnum/MeshTools/Reference.cpp b/src/Magnum/MeshTools/Reference.cpp index 5473cbc5e..1f88ece16 100644 --- a/src/Magnum/MeshTools/Reference.cpp +++ b/src/Magnum/MeshTools/Reference.cpp @@ -68,7 +68,13 @@ Trade::MeshData owned(Trade::MeshData&& data) { default-constructed instances are fine. */ } else if(data.isIndexed()) { indexData = Containers::Array{NoInit, data.indexData().size()}; - indices = Trade::MeshIndexData{data.indexType(), indexData.slice(data.indexOffset(), data.indexOffset() + data.indexCount()*meshIndexTypeSize(data.indexType()))}; + indices = Trade::MeshIndexData{ + data.indexType(), + Containers::StridedArrayView1D{ + indexData, + indexData.data() + data.indexOffset(), + data.indexCount(), + data.indexStride()}}; Utility::copy(data.indexData(), indexData); } diff --git a/src/Magnum/MeshTools/Test/ReferenceTest.cpp b/src/Magnum/MeshTools/Test/ReferenceTest.cpp index da329e476..d4b077b44 100644 --- a/src/Magnum/MeshTools/Test/ReferenceTest.cpp +++ b/src/Magnum/MeshTools/Test/ReferenceTest.cpp @@ -50,6 +50,7 @@ struct ReferenceTest: TestSuite::Tester { void owned(); void ownedNoIndexData(); void ownedNoAttributeVertexData(); + void ownedStridedIndices(); void ownedArrayAttribute(); void ownedImplementationSpecificVertexFormat(); void ownedRvaluePassthrough(); @@ -67,6 +68,7 @@ ReferenceTest::ReferenceTest() { &ReferenceTest::owned, &ReferenceTest::ownedNoIndexData, &ReferenceTest::ownedNoAttributeVertexData, + &ReferenceTest::ownedStridedIndices, &ReferenceTest::ownedArrayAttribute, &ReferenceTest::ownedImplementationSpecificVertexFormat, &ReferenceTest::ownedRvaluePassthrough, @@ -207,6 +209,31 @@ void ReferenceTest::ownedNoAttributeVertexData() { CORRADE_VERIFY(!static_cast(owned.attributeData().data())); } +void ReferenceTest::ownedStridedIndices() { + const UnsignedShort indices[7]{0, 3, 0, 7, 0, 15, 0}; + Trade::MeshData stuff{MeshPrimitive::Points, + {}, indices, Trade::MeshIndexData{Containers::stridedArrayView(indices).suffix(1).every(2)}, + 16}; + + Trade::MeshData owned = MeshTools::owned(stuff); + CORRADE_COMPARE(owned.primitive(), MeshPrimitive::Points); + CORRADE_COMPARE(owned.indexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); + CORRADE_COMPARE(owned.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); + CORRADE_VERIFY(owned.isIndexed()); + CORRADE_COMPARE(owned.indexCount(), 3); + CORRADE_COMPARE(owned.indexType(), MeshIndexType::UnsignedShort); + CORRADE_COMPARE(owned.indexOffset(), 2); + CORRADE_COMPARE(owned.indexStride(), 4); + CORRADE_COMPARE(owned.vertexCount(), 16); + CORRADE_COMPARE(owned.attributeCount(), 0); + + CORRADE_COMPARE_AS(owned.indices(), + Containers::arrayView({3, 7, 15}), + TestSuite::Compare::Container); + CORRADE_COMPARE_AS(owned.indexData(), stuff.indexData(), + TestSuite::Compare::Container); +} + void ReferenceTest::ownedArrayAttribute() { const Vector3us vertexData[13]{}; /* Verify that array attributes are propagated correctly */