diff --git a/src/Magnum/MeshTools/Implementation/remapAttributeData.h b/src/Magnum/MeshTools/Implementation/remapAttributeData.h index 127c011fe..6a87f94c4 100644 --- a/src/Magnum/MeshTools/Implementation/remapAttributeData.h +++ b/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()}; } }}} diff --git a/src/Magnum/MeshTools/Interleave.cpp b/src/Magnum/MeshTools/Interleave.cpp index 52daf9197..198739e8c 100644 --- a/src/Magnum/MeshTools/Interleave.cpp +++ b/src/Magnum/MeshTools/Interleave.cpp @@ -188,7 +188,8 @@ Containers::Array 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 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]); } diff --git a/src/Magnum/MeshTools/Test/InterleaveTest.cpp b/src/Magnum/MeshTools/Test/InterleaveTest.cpp index d72a0cbc5..8a16b7d62 100644 --- a/src/Magnum/MeshTools/Test/InterleaveTest.cpp +++ b/src/Magnum/MeshTools/Test/InterleaveTest.cpp @@ -730,16 +730,19 @@ void InterleaveTest::interleavedDataImplementationSpecificVertexFormat() { void InterleaveTest::interleavedLayout() { Containers::Array indexData{6}; - Containers::Array vertexData{3*24}; + Containers::Array vertexData{3*32}; const Trade::MeshAttributeData attributeData[]{ Trade::MeshAttributeData{Trade::MeshAttribute::Position, Containers::arrayCast(vertexData.prefix(3*8))}, Trade::MeshAttributeData{Trade::MeshAttribute::Normal, - Containers::arrayCast(vertexData.slice(3*8, 3*20))}, + Containers::arrayCast(vertexData.sliceSize(3*8, 3*12))}, /* Array attribute to verify it's correctly propagated */ Trade::MeshAttributeData{Trade::meshAttributeCustom(42), - VertexFormat::Short, Containers::StridedArrayView2D{vertexData.exceptPrefix(3*20), {3, 4}}, 2} + VertexFormat::Short, Containers::StridedArrayView2D{vertexData.sliceSize(3*20, 3*4), {3, 4}}, 2}, + /* Morph target to verify it's correctly propagated */ + Trade::MeshAttributeData{Trade::MeshAttribute::Position, + Containers::arrayCast(vertexData.sliceSize(3*24, 3*8)), 76}, }; Trade::MeshIndexData indices{Containers::arrayCast(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() {