|
|
|
|
@ -58,6 +58,11 @@ struct InterleaveTest: Corrade::TestSuite::Tester {
|
|
|
|
|
void isInterleavedUnordered(); |
|
|
|
|
void isInterleavedAttributeAcrossStride(); |
|
|
|
|
|
|
|
|
|
void interleavedData(); |
|
|
|
|
void interleavedDataNoAttributes(); |
|
|
|
|
void interleavedDataNoVertices(); |
|
|
|
|
void interleavedDataNotInterleaved(); |
|
|
|
|
|
|
|
|
|
void interleavedLayout(); |
|
|
|
|
void interleavedLayoutExtra(); |
|
|
|
|
void interleavedLayoutExtraAliased(); |
|
|
|
|
@ -100,6 +105,11 @@ InterleaveTest::InterleaveTest() {
|
|
|
|
|
&InterleaveTest::isInterleavedUnordered, |
|
|
|
|
&InterleaveTest::isInterleavedAttributeAcrossStride, |
|
|
|
|
|
|
|
|
|
&InterleaveTest::interleavedData, |
|
|
|
|
&InterleaveTest::interleavedDataNoAttributes, |
|
|
|
|
&InterleaveTest::interleavedDataNoVertices, |
|
|
|
|
&InterleaveTest::interleavedDataNotInterleaved, |
|
|
|
|
|
|
|
|
|
&InterleaveTest::interleavedLayout, |
|
|
|
|
&InterleaveTest::interleavedLayoutExtra, |
|
|
|
|
&InterleaveTest::interleavedLayoutExtraAliased, |
|
|
|
|
@ -337,6 +347,76 @@ void InterleaveTest::isInterleavedAttributeAcrossStride() {
|
|
|
|
|
CORRADE_VERIFY(!MeshTools::isInterleaved(data2)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void InterleaveTest::interleavedData() { |
|
|
|
|
Containers::Array<char> vertexData{100 + 3*40}; |
|
|
|
|
Containers::StridedArrayView1D<Vector3> normals{vertexData, |
|
|
|
|
reinterpret_cast<Vector3*>(vertexData.data() + 100 + 24), 3, 40}; |
|
|
|
|
Containers::StridedArrayView1D<Vector2> positions{vertexData, |
|
|
|
|
reinterpret_cast<Vector2*>(vertexData.data() + 100 + 5), 3, 40}; |
|
|
|
|
|
|
|
|
|
Trade::MeshData data{MeshPrimitive::Triangles, std::move(vertexData), { |
|
|
|
|
Trade::MeshAttributeData{Trade::MeshAttribute::Normal, normals}, |
|
|
|
|
Trade::MeshAttributeData{Trade::MeshAttribute::Position, positions} |
|
|
|
|
}}; |
|
|
|
|
|
|
|
|
|
CORRADE_VERIFY(MeshTools::isInterleaved(data)); |
|
|
|
|
Containers::StridedArrayView2D<const char> interleaved = MeshTools::interleavedData(data); |
|
|
|
|
CORRADE_COMPARE(interleaved.data(), positions.data()); |
|
|
|
|
CORRADE_COMPARE(interleaved.size()[0], 3); |
|
|
|
|
CORRADE_COMPARE(interleaved.size()[1], 31); |
|
|
|
|
CORRADE_COMPARE(interleaved.stride()[0], 40); |
|
|
|
|
CORRADE_COMPARE(interleaved.stride()[1], 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void InterleaveTest::interleavedDataNoAttributes() { |
|
|
|
|
char a[1]; |
|
|
|
|
Trade::MeshData data{MeshPrimitive::Lines, {}, a, {}, 15}; |
|
|
|
|
CORRADE_VERIFY(MeshTools::isInterleaved(data)); |
|
|
|
|
Containers::StridedArrayView2D<const char> interleaved = MeshTools::interleavedData(data); |
|
|
|
|
CORRADE_COMPARE(interleaved.data(), static_cast<void*>(a)); |
|
|
|
|
CORRADE_COMPARE(interleaved.size()[0], 15); |
|
|
|
|
CORRADE_COMPARE(interleaved.size()[1], 0); |
|
|
|
|
CORRADE_COMPARE(interleaved.stride()[0], 0); |
|
|
|
|
CORRADE_COMPARE(interleaved.stride()[1], 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void InterleaveTest::interleavedDataNoVertices() { |
|
|
|
|
struct Vertex { |
|
|
|
|
Vector3 normal; |
|
|
|
|
Vector3 position; |
|
|
|
|
}; |
|
|
|
|
Vertex a[1]; |
|
|
|
|
Trade::MeshData data{MeshPrimitive::Triangles, {}, a, { |
|
|
|
|
Trade::MeshAttributeData{Trade::MeshAttribute::Normal, |
|
|
|
|
Containers::stridedArrayView(a, &a[0].normal, 0, sizeof(Vertex))}, |
|
|
|
|
Trade::MeshAttributeData{Trade::MeshAttribute::Position, |
|
|
|
|
Containers::stridedArrayView(a, &a[0].position, 0, sizeof(Vertex))} |
|
|
|
|
}}; |
|
|
|
|
|
|
|
|
|
CORRADE_VERIFY(MeshTools::isInterleaved(data)); |
|
|
|
|
Containers::StridedArrayView2D<const char> interleaved = MeshTools::interleavedData(data); |
|
|
|
|
CORRADE_COMPARE(interleaved.data(), static_cast<void*>(a)); |
|
|
|
|
CORRADE_COMPARE(interleaved.size()[0], 0); |
|
|
|
|
CORRADE_COMPARE(interleaved.size()[1], sizeof(Vertex)); |
|
|
|
|
CORRADE_COMPARE(interleaved.stride()[0], sizeof(Vertex)); |
|
|
|
|
CORRADE_COMPARE(interleaved.stride()[1], 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void InterleaveTest::interleavedDataNotInterleaved() { |
|
|
|
|
Containers::Array<char> vertexData{100 + 3*20}; |
|
|
|
|
Trade::MeshAttributeData positions{Trade::MeshAttribute::Position, |
|
|
|
|
Containers::arrayCast<Vector2>(vertexData.suffix(100).prefix(3*8))}; |
|
|
|
|
Trade::MeshAttributeData normals{Trade::MeshAttribute::Normal, |
|
|
|
|
Containers::arrayCast<Vector3>(vertexData.suffix(100).suffix(3*8))}; |
|
|
|
|
|
|
|
|
|
Trade::MeshData data{MeshPrimitive::Triangles, std::move(vertexData), {positions, normals}}; |
|
|
|
|
|
|
|
|
|
std::ostringstream out; |
|
|
|
|
Error redirectError{&out}; |
|
|
|
|
MeshTools::interleavedData(data); |
|
|
|
|
CORRADE_COMPARE(out.str(), "MeshTools::interleavedData(): the mesh is not interleaved\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void InterleaveTest::interleavedLayout() { |
|
|
|
|
Containers::Array<char> indexData{6}; |
|
|
|
|
Containers::Array<char> vertexData{3*20}; |
|
|
|
|
|