Browse Source

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.
pull/547/head
Vladimír Vondruš 4 years ago
parent
commit
91aff011a8
  1. 8
      src/Magnum/MeshTools/Reference.cpp
  2. 27
      src/Magnum/MeshTools/Test/ReferenceTest.cpp

8
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<char>{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<const void>{
indexData,
indexData.data() + data.indexOffset(),
data.indexCount(),
data.indexStride()}};
Utility::copy(data.indexData(), indexData);
}

27
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<const void*>(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<UnsignedShort>(),
Containers::arrayView<UnsignedShort>({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 */

Loading…
Cancel
Save