diff --git a/src/Magnum/MeshTools/Test/FlipNormalsTest.cpp b/src/Magnum/MeshTools/Test/FlipNormalsTest.cpp index cade8733e..9f2049fc4 100644 --- a/src/Magnum/MeshTools/Test/FlipNormalsTest.cpp +++ b/src/Magnum/MeshTools/Test/FlipNormalsTest.cpp @@ -24,7 +24,9 @@ */ #include +#include #include +#include #include #include "Magnum/Math/Vector3.h" @@ -36,44 +38,69 @@ struct FlipNormalsTest: TestSuite::Tester { explicit FlipNormalsTest(); void wrongIndexCount(); - void flipFaceWinding(); + template void flipFaceWinding(); void flipNormals(); + + template void flipNormalsFaceWinding(); }; FlipNormalsTest::FlipNormalsTest() { addTests({&FlipNormalsTest::wrongIndexCount, - &FlipNormalsTest::flipFaceWinding, - &FlipNormalsTest::flipNormals}); + &FlipNormalsTest::flipFaceWinding, + &FlipNormalsTest::flipFaceWinding, + &FlipNormalsTest::flipFaceWinding, + &FlipNormalsTest::flipNormals, + + &FlipNormalsTest::flipNormalsFaceWinding, + &FlipNormalsTest::flipNormalsFaceWinding, + &FlipNormalsTest::flipNormalsFaceWinding}); } void FlipNormalsTest::wrongIndexCount() { std::stringstream ss; Error redirectError{&ss}; - std::vector indices{0, 1}; - MeshTools::flipFaceWinding(indices); + UnsignedByte indices[2]; + MeshTools::flipFaceWindingInPlace(Containers::stridedArrayView(indices)); CORRADE_COMPARE(ss.str(), "MeshTools::flipNormals(): index count is not divisible by 3!\n"); } -void FlipNormalsTest::flipFaceWinding() { - std::vector indices{0, 1, 2, - 3, 4, 5}; - MeshTools::flipFaceWinding(indices); +template void FlipNormalsTest::flipFaceWinding() { + setTestCaseTemplateName(Math::TypeTraits::name()); + + T indices[]{0, 1, 2, 3, 4, 5}; + MeshTools::flipFaceWindingInPlace(indices); - CORRADE_COMPARE(indices, (std::vector{0, 2, 1, - 3, 5, 4})); + CORRADE_COMPARE_AS(Containers::arrayView(indices), + Containers::arrayView({0, 2, 1, 3, 5, 4}), + TestSuite::Compare::Container); } void FlipNormalsTest::flipNormals() { - std::vector normals{Vector3::xAxis(), - Vector3::yAxis(), - Vector3::zAxis()}; - MeshTools::flipNormals(normals); - - CORRADE_COMPARE(normals, (std::vector{-Vector3::xAxis(), - -Vector3::yAxis(), - -Vector3::zAxis()})); + Vector3 normals[]{Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis()}; + MeshTools::flipNormalsInPlace(normals); + + CORRADE_COMPARE_AS(Containers::arrayView(normals), + Containers::arrayView({ + -Vector3::xAxis(), -Vector3::yAxis(), -Vector3::zAxis() + }), TestSuite::Compare::Container); +} + +template void FlipNormalsTest::flipNormalsFaceWinding() { + setTestCaseTemplateName(Math::TypeTraits::name()); + + T indices[]{0, 1, 2, 3, 4, 5}; + Vector3 normals[]{Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis()}; + MeshTools::flipNormalsInPlace(indices, normals); + + CORRADE_COMPARE_AS(Containers::arrayView(indices), + Containers::arrayView({0, 2, 1, 3, 5, 4}), + TestSuite::Compare::Container); + CORRADE_COMPARE_AS(Containers::arrayView(normals), + Containers::arrayView({ + -Vector3::xAxis(), -Vector3::yAxis(), -Vector3::zAxis() + }), TestSuite::Compare::Container); } }}}} diff --git a/src/Magnum/MeshTools/Test/TipsifyTest.cpp b/src/Magnum/MeshTools/Test/TipsifyTest.cpp index 15e571479..fbf3ae9e0 100644 --- a/src/Magnum/MeshTools/Test/TipsifyTest.cpp +++ b/src/Magnum/MeshTools/Test/TipsifyTest.cpp @@ -28,6 +28,7 @@ #include #include "Magnum/Magnum.h" +#include "Magnum/Math/TypeTraits.h" #include "Magnum/MeshTools/Tipsify.h" #include "Magnum/MeshTools/Implementation/Tipsify.h" @@ -37,7 +38,7 @@ struct TipsifyTest: TestSuite::Tester { explicit TipsifyTest(); void buildAdjacency(); - void tipsify(); + template void tipsify(); void oneDegenerateTriangle(); }; @@ -85,7 +86,9 @@ constexpr std::size_t VertexCount = 19; TipsifyTest::TipsifyTest() { addTests({&TipsifyTest::buildAdjacency, - &TipsifyTest::tipsify, + &TipsifyTest::tipsify, + &TipsifyTest::tipsify, + &TipsifyTest::tipsify, &TipsifyTest::oneDegenerateTriangle}); } @@ -134,11 +137,15 @@ void TipsifyTest::buildAdjacency() { }), TestSuite::Compare::Container); } -void TipsifyTest::tipsify() { - std::vector indices{std::begin(Indices), std::end(Indices)}; - MeshTools::tipsify(indices, VertexCount, 3); +template void TipsifyTest::tipsify() { + setTestCaseTemplateName(Math::TypeTraits::name()); - CORRADE_COMPARE(indices, (std::vector{ + T indices[Containers::arraySize(Indices)]; + for(std::size_t i = 0; i != Containers::arraySize(Indices); ++i) + indices[i] = Indices[i]; + MeshTools::tipsifyInPlace(indices, VertexCount, 3); + + CORRADE_COMPARE_AS(Containers::arrayView(indices), Containers::arrayView({ 4, 1, 0, 9, 5, 4, 1, 4, 5, @@ -158,16 +165,18 @@ void TipsifyTest::tipsify() { 2, 1, 5, 14, 15, 11, /* from dead-end vertex stack */ 16, 17, 18 /* arbitrary vertex */ - })); + }), TestSuite::Compare::Container); } void TipsifyTest::oneDegenerateTriangle() { /* There used to be an OOB access (neighbors[++ti]) caught by ASan, this triggers it */ - std::vector indices{0, 0, 0}; - MeshTools::tipsify(indices, 1, 2); + UnsignedInt indices[]{0, 0, 0}; + MeshTools::tipsifyInPlace(indices, 1, 2); - CORRADE_COMPARE(indices, (std::vector{0, 0, 0})); + CORRADE_COMPARE_AS(Containers::arrayView(indices), + Containers::arrayView({0, 0, 0}), + TestSuite::Compare::Container); } }}}}