From c07af0340f873abfe4288e213d37c0ef23745577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 18 Jan 2020 19:40:16 +0100 Subject: [PATCH] MeshTools: port tests and benchmarks away from MeshData3D. --- .../MeshTools/Test/GenerateNormalsTest.cpp | 11 +++-- .../SubdivideRemoveDuplicatesBenchmark.cpp | 48 +++++++++++++++---- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/Magnum/MeshTools/Test/GenerateNormalsTest.cpp b/src/Magnum/MeshTools/Test/GenerateNormalsTest.cpp index bc80b787a..38bbd3892 100644 --- a/src/Magnum/MeshTools/Test/GenerateNormalsTest.cpp +++ b/src/Magnum/MeshTools/Test/GenerateNormalsTest.cpp @@ -37,7 +37,7 @@ #include "Magnum/MeshTools/Duplicate.h" #include "Magnum/MeshTools/GenerateNormals.h" #include "Magnum/Primitives/Cylinder.h" -#include "Magnum/Trade/MeshData3D.h" +#include "Magnum/Trade/MeshData.h" namespace Magnum { namespace MeshTools { namespace Test { namespace { @@ -331,13 +331,14 @@ void GenerateNormalsTest::smoothBeveledCube() { } void GenerateNormalsTest::smoothCylinder() { - const Trade::MeshData3D data = Primitives::cylinderSolid(1, 5, 1.0f); + const Trade::MeshData data = Primitives::cylinderSolid(1, 5, 1.0f); /* Output should be exactly the same as the cylinder normals */ CORRADE_COMPARE_AS(Containers::arrayView(generateSmoothNormals( - Containers::stridedArrayView(data.indices()), - Containers::stridedArrayView(data.positions(0)))), - Containers::arrayView(data.normals(0)), TestSuite::Compare::Container); + data.indices(), + data.attribute(Trade::MeshAttribute::Position))), + data.attribute(Trade::MeshAttribute::Normal), + TestSuite::Compare::Container); } void GenerateNormalsTest::smoothZeroAreaTriangle() { diff --git a/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp b/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp index 7e68de881..4d6f5ab50 100644 --- a/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp +++ b/src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp @@ -23,14 +23,16 @@ DEALINGS IN THE SOFTWARE. */ +#include #include +#include #include "Magnum/Math/Vector4.h" #include "Magnum/MeshTools/Duplicate.h" #include "Magnum/MeshTools/RemoveDuplicates.h" #include "Magnum/MeshTools/Subdivide.h" #include "Magnum/Primitives/Icosphere.h" -#include "Magnum/Trade/MeshData3D.h" +#include "Magnum/Trade/MeshData.h" namespace Magnum { namespace MeshTools { namespace Test { namespace { @@ -57,43 +59,69 @@ namespace { } void SubdivideRemoveDuplicatesBenchmark::subdivide() { + Trade::MeshData icosphere = Primitives::icosphereSolid(0); + CORRADE_BENCHMARK(3) { - Trade::MeshData3D icosphere = Primitives::icosphereSolid(0); + Containers::Array indices; + arrayResize(indices, Containers::NoInit, icosphere.indexCount()); + Utility::copy(icosphere.indices(), indices); + + Containers::Array positions; + arrayResize(positions, Containers::NoInit, icosphere.vertexCount()); + Utility::copy(icosphere.attribute(Trade::MeshAttribute::Position), positions); /* Subdivide 5 times */ for(std::size_t i = 0; i != 5; ++i) - MeshTools::subdivide(icosphere.indices(), icosphere.positions(0), interpolator); + MeshTools::subdivide(indices, positions, interpolator); } } void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesAfter() { + Trade::MeshData icosphere = Primitives::icosphereSolid(0); + CORRADE_BENCHMARK(3) { - Trade::MeshData3D icosphere = Primitives::icosphereSolid(0); + Containers::Array indices; + arrayResize(indices, Containers::NoInit, icosphere.indexCount()); + Utility::copy(icosphere.indices(), indices); + + Containers::Array positions; + arrayResize(positions, Containers::NoInit, icosphere.vertexCount()); + Utility::copy(icosphere.attribute(Trade::MeshAttribute::Position), positions); /* Subdivide 5 times */ for(std::size_t i = 0; i != 5; ++i) - MeshTools::subdivide(icosphere.indices(), icosphere.positions(0), interpolator); + MeshTools::subdivide(indices, positions, interpolator); /* Remove duplicates after */ - icosphere.indices() = MeshTools::duplicate(icosphere.indices(), MeshTools::removeDuplicates(icosphere.positions(0))); + arrayResize(positions, MeshTools::removeDuplicatesIndexedInPlace( + stridedArrayView(indices), stridedArrayView(positions))); } } void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesAfterInPlace() { CORRADE_BENCHMARK(3) { /* Because that's what this thing does */ - Trade::MeshData3D icosphere = Primitives::icosphereSolid(5); + Trade::MeshData icosphere = Primitives::icosphereSolid(5); } } void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesInBetween() { + Trade::MeshData icosphere = Primitives::icosphereSolid(0); + CORRADE_BENCHMARK(3) { - Trade::MeshData3D icosphere = Primitives::icosphereSolid(0); + Containers::Array indices; + arrayResize(indices, Containers::NoInit, icosphere.indexCount()); + Utility::copy(icosphere.indices(), indices); + + Containers::Array positions; + arrayResize(positions, Containers::NoInit, icosphere.vertexCount()); + Utility::copy(icosphere.attribute(Trade::MeshAttribute::Position), positions); /* Subdivide 5 times and remove duplicates during the operation */ for(std::size_t i = 0; i != 5; ++i) { - MeshTools::subdivide(icosphere.indices(), icosphere.positions(0), interpolator); - icosphere.indices() = MeshTools::duplicate(icosphere.indices(), MeshTools::removeDuplicates(icosphere.positions(0))); + MeshTools::subdivide(indices, positions, interpolator); + arrayResize(positions, MeshTools::removeDuplicatesIndexedInPlace( + stridedArrayView(indices), stridedArrayView(positions))); } } }