Browse Source

MeshTools: preserve morph target ID in interleavedLayout().

And thus in all APIs that use it, or rely on related helpers.
pull/623/head
Vladimír Vondruš 3 years ago
parent
commit
6b7b5f426b
  1. 3
      src/Magnum/MeshTools/Implementation/remapAttributeData.h
  2. 6
      src/Magnum/MeshTools/Interleave.cpp
  3. 58
      src/Magnum/MeshTools/Test/InterleaveTest.cpp

3
src/Magnum/MeshTools/Implementation/remapAttributeData.h

@ -45,7 +45,8 @@ inline Trade::MeshAttributeData remapAttributeData(const Trade::MeshAttributeDat
vertexData.data() + attribute.offset(originalVertexData),
vertexCount,
attribute.stride()},
attribute.arraySize()};
attribute.arraySize(),
attribute.morphTargetId()};
}
}}}

6
src/Magnum/MeshTools/Interleave.cpp

@ -188,7 +188,8 @@ Containers::Array<Trade::MeshAttributeData> interleavedLayout(Trade::MeshData&&
attributeData[i] = Trade::MeshAttributeData{
attributeData[i].name(), attributeData[i].format(),
offset, 0, std::ptrdiff_t(stride), attributeData[i].arraySize()};
offset, 0, std::ptrdiff_t(stride),
attributeData[i].arraySize(), attributeData[i].morphTargetId()};
if(!interleaved) offset += attributeSize(attributeData[i]);
}
@ -210,7 +211,8 @@ Containers::Array<Trade::MeshAttributeData> interleavedLayout(Trade::MeshData&&
attributeData[attributeIndex++] = Trade::MeshAttributeData{
extra[i].name(), extra[i].format(),
offset, 0, std::ptrdiff_t(stride), extra[i].arraySize()};
offset, 0, std::ptrdiff_t(stride),
extra[i].arraySize(), extra[i].morphTargetId()};
offset += attributeSize(extra[i]);
}

58
src/Magnum/MeshTools/Test/InterleaveTest.cpp

@ -730,16 +730,19 @@ void InterleaveTest::interleavedDataImplementationSpecificVertexFormat() {
void InterleaveTest::interleavedLayout() {
Containers::Array<char> indexData{6};
Containers::Array<char> vertexData{3*24};
Containers::Array<char> vertexData{3*32};
const Trade::MeshAttributeData attributeData[]{
Trade::MeshAttributeData{Trade::MeshAttribute::Position,
Containers::arrayCast<Vector2>(vertexData.prefix(3*8))},
Trade::MeshAttributeData{Trade::MeshAttribute::Normal,
Containers::arrayCast<Vector3>(vertexData.slice(3*8, 3*20))},
Containers::arrayCast<Vector3>(vertexData.sliceSize(3*8, 3*12))},
/* Array attribute to verify it's correctly propagated */
Trade::MeshAttributeData{Trade::meshAttributeCustom(42),
VertexFormat::Short, Containers::StridedArrayView2D<char>{vertexData.exceptPrefix(3*20), {3, 4}}, 2}
VertexFormat::Short, Containers::StridedArrayView2D<char>{vertexData.sliceSize(3*20, 3*4), {3, 4}}, 2},
/* Morph target to verify it's correctly propagated */
Trade::MeshAttributeData{Trade::MeshAttribute::Position,
Containers::arrayCast<Vector2>(vertexData.sliceSize(3*24, 3*8)), 76},
};
Trade::MeshIndexData indices{Containers::arrayCast<UnsignedShort>(indexData)};
@ -754,24 +757,36 @@ void InterleaveTest::interleavedLayout() {
CORRADE_VERIFY(MeshTools::isInterleaved(layout));
CORRADE_COMPARE(layout.primitive(), MeshPrimitive::TriangleFan);
CORRADE_VERIFY(!layout.isIndexed()); /* Indices are not preserved */
CORRADE_COMPARE(layout.attributeCount(), 3);
CORRADE_COMPARE(layout.attributeCount(), 4);
CORRADE_COMPARE(layout.attributeName(0), Trade::MeshAttribute::Position);
CORRADE_COMPARE(layout.attributeName(1), Trade::MeshAttribute::Normal);
CORRADE_COMPARE(layout.attributeName(2), Trade::meshAttributeCustom(42));
CORRADE_COMPARE(layout.attributeName(3), Trade::MeshAttribute::Position);
CORRADE_COMPARE(layout.attributeFormat(0), VertexFormat::Vector2);
CORRADE_COMPARE(layout.attributeFormat(1), VertexFormat::Vector3);
CORRADE_COMPARE(layout.attributeFormat(2), VertexFormat::Short);
CORRADE_COMPARE(layout.attributeStride(0), 24);
CORRADE_COMPARE(layout.attributeStride(1), 24);
CORRADE_COMPARE(layout.attributeStride(2), 24);
CORRADE_COMPARE(layout.attributeFormat(3), VertexFormat::Vector2);
CORRADE_COMPARE(layout.attributeStride(0), 32);
CORRADE_COMPARE(layout.attributeStride(1), 32);
CORRADE_COMPARE(layout.attributeStride(2), 32);
CORRADE_COMPARE(layout.attributeStride(3), 32);
CORRADE_COMPARE(layout.attributeOffset(0), 0);
CORRADE_COMPARE(layout.attributeOffset(1), 8);
CORRADE_COMPARE(layout.attributeOffset(2), 20);
CORRADE_COMPARE(layout.attributeOffset(3), 24);
CORRADE_COMPARE(layout.attributeArraySize(0), 0);
CORRADE_COMPARE(layout.attributeArraySize(1), 0);
CORRADE_COMPARE(layout.attributeArraySize(2), 2);
CORRADE_COMPARE(layout.attributeArraySize(3), 0);
CORRADE_COMPARE(layout.attributeMorphTargetId(0), -1);
CORRADE_COMPARE(layout.attributeMorphTargetId(1), -1);
CORRADE_COMPARE(layout.attributeMorphTargetId(2), -1);
CORRADE_COMPARE(layout.attributeMorphTargetId(3), 76);
CORRADE_COMPARE(layout.vertexCount(), 10);
/* Needs to be like this so we can modify the data */
CORRADE_COMPARE(layout.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned);
CORRADE_VERIFY(layout.vertexData());
CORRADE_COMPARE(layout.vertexData().size(), 10*24);
CORRADE_COMPARE(layout.vertexData().size(), 10*32);
}
void InterleaveTest::interleavedLayoutImplementationSpecificVertexFormat() {
@ -807,32 +822,45 @@ void InterleaveTest::interleavedLayoutExtra() {
Trade::MeshAttributeData{1},
Trade::MeshAttributeData{Trade::MeshAttribute::Color,
VertexFormat::Vector3, nullptr},
Trade::MeshAttributeData{4}
Trade::MeshAttributeData{4},
/* Morph target to verify it's correctly propagated */
Trade::MeshAttributeData{Trade::MeshAttribute::Color,
VertexFormat::Vector4, nullptr, 0, 27},
});
CORRADE_VERIFY(MeshTools::isInterleaved(layout));
CORRADE_COMPARE(layout.attributeCount(), 4);
CORRADE_COMPARE(layout.attributeCount(), 5);
CORRADE_COMPARE(layout.attributeName(0), Trade::MeshAttribute::Position);
CORRADE_COMPARE(layout.attributeName(1), Trade::MeshAttribute::Normal);
CORRADE_COMPARE(layout.attributeName(2), Trade::meshAttributeCustom(15));
CORRADE_COMPARE(layout.attributeName(3), Trade::MeshAttribute::Color);
CORRADE_COMPARE(layout.attributeName(4), Trade::MeshAttribute::Color);
CORRADE_COMPARE(layout.attributeFormat(0), VertexFormat::Vector2);
CORRADE_COMPARE(layout.attributeFormat(1), VertexFormat::Vector3);
CORRADE_COMPARE(layout.attributeFormat(2), VertexFormat::UnsignedByte);
CORRADE_COMPARE(layout.attributeFormat(3), VertexFormat::Vector3);
CORRADE_COMPARE(layout.attributeStride(0), 44);
CORRADE_COMPARE(layout.attributeStride(1), 44);
CORRADE_COMPARE(layout.attributeStride(2), 44);
CORRADE_COMPARE(layout.attributeStride(3), 44);
CORRADE_COMPARE(layout.attributeFormat(4), VertexFormat::Vector4);
CORRADE_COMPARE(layout.attributeStride(0), 60);
CORRADE_COMPARE(layout.attributeStride(1), 60);
CORRADE_COMPARE(layout.attributeStride(2), 60);
CORRADE_COMPARE(layout.attributeStride(3), 60);
CORRADE_COMPARE(layout.attributeStride(4), 60);
CORRADE_COMPARE(layout.attributeOffset(0), 0);
CORRADE_COMPARE(layout.attributeOffset(1), 8);
CORRADE_COMPARE(layout.attributeOffset(2), 21);
CORRADE_COMPARE(layout.attributeOffset(3), 28);
CORRADE_COMPARE(layout.attributeOffset(4), 44);
CORRADE_COMPARE(layout.attributeArraySize(0), 0);
CORRADE_COMPARE(layout.attributeArraySize(1), 0);
CORRADE_COMPARE(layout.attributeArraySize(2), 6);
CORRADE_COMPARE(layout.attributeArraySize(3), 0);
CORRADE_COMPARE(layout.attributeArraySize(4), 0);
CORRADE_COMPARE(layout.attributeMorphTargetId(0), -1);
CORRADE_COMPARE(layout.attributeMorphTargetId(1), -1);
CORRADE_COMPARE(layout.attributeMorphTargetId(2), -1);
CORRADE_COMPARE(layout.attributeMorphTargetId(3), -1);
CORRADE_COMPARE(layout.attributeMorphTargetId(4), 27);
CORRADE_COMPARE(layout.vertexCount(), 7);
CORRADE_COMPARE(layout.vertexData().size(), 7*44);
CORRADE_COMPARE(layout.vertexData().size(), 7*60);
}
void InterleaveTest::interleavedLayoutExtraAliased() {

Loading…
Cancel
Save