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), vertexData.data() + attribute.offset(originalVertexData),
vertexCount, vertexCount,
attribute.stride()}, 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] = Trade::MeshAttributeData{
attributeData[i].name(), attributeData[i].format(), 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]); if(!interleaved) offset += attributeSize(attributeData[i]);
} }
@ -210,7 +211,8 @@ Containers::Array<Trade::MeshAttributeData> interleavedLayout(Trade::MeshData&&
attributeData[attributeIndex++] = Trade::MeshAttributeData{ attributeData[attributeIndex++] = Trade::MeshAttributeData{
extra[i].name(), extra[i].format(), 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]); offset += attributeSize(extra[i]);
} }

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

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

Loading…
Cancel
Save