Browse Source

MeshTools: port tests and benchmarks away from MeshData3D.

pull/371/head
Vladimír Vondruš 6 years ago
parent
commit
c07af0340f
  1. 11
      src/Magnum/MeshTools/Test/GenerateNormalsTest.cpp
  2. 48
      src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp

11
src/Magnum/MeshTools/Test/GenerateNormalsTest.cpp

@ -37,7 +37,7 @@
#include "Magnum/MeshTools/Duplicate.h" #include "Magnum/MeshTools/Duplicate.h"
#include "Magnum/MeshTools/GenerateNormals.h" #include "Magnum/MeshTools/GenerateNormals.h"
#include "Magnum/Primitives/Cylinder.h" #include "Magnum/Primitives/Cylinder.h"
#include "Magnum/Trade/MeshData3D.h" #include "Magnum/Trade/MeshData.h"
namespace Magnum { namespace MeshTools { namespace Test { namespace { namespace Magnum { namespace MeshTools { namespace Test { namespace {
@ -331,13 +331,14 @@ void GenerateNormalsTest::smoothBeveledCube() {
} }
void GenerateNormalsTest::smoothCylinder() { 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 */ /* Output should be exactly the same as the cylinder normals */
CORRADE_COMPARE_AS(Containers::arrayView(generateSmoothNormals( CORRADE_COMPARE_AS(Containers::arrayView(generateSmoothNormals(
Containers::stridedArrayView(data.indices()), data.indices(),
Containers::stridedArrayView(data.positions(0)))), data.attribute<Vector3>(Trade::MeshAttribute::Position))),
Containers::arrayView(data.normals(0)), TestSuite::Compare::Container); data.attribute<Vector3>(Trade::MeshAttribute::Normal),
TestSuite::Compare::Container);
} }
void GenerateNormalsTest::smoothZeroAreaTriangle() { void GenerateNormalsTest::smoothZeroAreaTriangle() {

48
src/Magnum/MeshTools/Test/SubdivideRemoveDuplicatesBenchmark.cpp

@ -23,14 +23,16 @@
DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.
*/ */
#include <Corrade/Containers/GrowableArray.h>
#include <Corrade/TestSuite/Tester.h> #include <Corrade/TestSuite/Tester.h>
#include <Corrade/Utility/Algorithms.h>
#include "Magnum/Math/Vector4.h" #include "Magnum/Math/Vector4.h"
#include "Magnum/MeshTools/Duplicate.h" #include "Magnum/MeshTools/Duplicate.h"
#include "Magnum/MeshTools/RemoveDuplicates.h" #include "Magnum/MeshTools/RemoveDuplicates.h"
#include "Magnum/MeshTools/Subdivide.h" #include "Magnum/MeshTools/Subdivide.h"
#include "Magnum/Primitives/Icosphere.h" #include "Magnum/Primitives/Icosphere.h"
#include "Magnum/Trade/MeshData3D.h" #include "Magnum/Trade/MeshData.h"
namespace Magnum { namespace MeshTools { namespace Test { namespace { namespace Magnum { namespace MeshTools { namespace Test { namespace {
@ -57,43 +59,69 @@ namespace {
} }
void SubdivideRemoveDuplicatesBenchmark::subdivide() { void SubdivideRemoveDuplicatesBenchmark::subdivide() {
Trade::MeshData icosphere = Primitives::icosphereSolid(0);
CORRADE_BENCHMARK(3) { CORRADE_BENCHMARK(3) {
Trade::MeshData3D icosphere = Primitives::icosphereSolid(0); Containers::Array<UnsignedInt> indices;
arrayResize(indices, Containers::NoInit, icosphere.indexCount());
Utility::copy(icosphere.indices<UnsignedInt>(), indices);
Containers::Array<Vector3> positions;
arrayResize(positions, Containers::NoInit, icosphere.vertexCount());
Utility::copy(icosphere.attribute<Vector3>(Trade::MeshAttribute::Position), positions);
/* Subdivide 5 times */ /* Subdivide 5 times */
for(std::size_t i = 0; i != 5; ++i) 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() { void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesAfter() {
Trade::MeshData icosphere = Primitives::icosphereSolid(0);
CORRADE_BENCHMARK(3) { CORRADE_BENCHMARK(3) {
Trade::MeshData3D icosphere = Primitives::icosphereSolid(0); Containers::Array<UnsignedInt> indices;
arrayResize(indices, Containers::NoInit, icosphere.indexCount());
Utility::copy(icosphere.indices<UnsignedInt>(), indices);
Containers::Array<Vector3> positions;
arrayResize(positions, Containers::NoInit, icosphere.vertexCount());
Utility::copy(icosphere.attribute<Vector3>(Trade::MeshAttribute::Position), positions);
/* Subdivide 5 times */ /* Subdivide 5 times */
for(std::size_t i = 0; i != 5; ++i) 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 */ /* 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() { void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesAfterInPlace() {
CORRADE_BENCHMARK(3) { CORRADE_BENCHMARK(3) {
/* Because that's what this thing does */ /* Because that's what this thing does */
Trade::MeshData3D icosphere = Primitives::icosphereSolid(5); Trade::MeshData icosphere = Primitives::icosphereSolid(5);
} }
} }
void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesInBetween() { void SubdivideRemoveDuplicatesBenchmark::subdivideAndRemoveDuplicatesInBetween() {
Trade::MeshData icosphere = Primitives::icosphereSolid(0);
CORRADE_BENCHMARK(3) { CORRADE_BENCHMARK(3) {
Trade::MeshData3D icosphere = Primitives::icosphereSolid(0); Containers::Array<UnsignedInt> indices;
arrayResize(indices, Containers::NoInit, icosphere.indexCount());
Utility::copy(icosphere.indices<UnsignedInt>(), indices);
Containers::Array<Vector3> positions;
arrayResize(positions, Containers::NoInit, icosphere.vertexCount());
Utility::copy(icosphere.attribute<Vector3>(Trade::MeshAttribute::Position), positions);
/* Subdivide 5 times and remove duplicates during the operation */ /* Subdivide 5 times and remove duplicates during the operation */
for(std::size_t i = 0; i != 5; ++i) { for(std::size_t i = 0; i != 5; ++i) {
MeshTools::subdivide(icosphere.indices(), icosphere.positions(0), interpolator); MeshTools::subdivide(indices, positions, interpolator);
icosphere.indices() = MeshTools::duplicate(icosphere.indices(), MeshTools::removeDuplicates(icosphere.positions(0))); arrayResize(positions, MeshTools::removeDuplicatesIndexedInPlace(
stridedArrayView(indices), stridedArrayView(positions)));
} }
} }
} }

Loading…
Cancel
Save