diff --git a/src/Test/CMakeLists.txt b/src/Test/CMakeLists.txt index 0320aa580..341397a50 100644 --- a/src/Test/CMakeLists.txt +++ b/src/Test/CMakeLists.txt @@ -2,3 +2,4 @@ magnum_add_test(ObjectTest ObjectTest.h ObjectTest.cpp Magnum) magnum_add_test(CameraTest CameraTest.h CameraTest.cpp Magnum) magnum_add_test(SceneTest SceneTest.h SceneTest.cpp Magnum) magnum_add_test(MeshBuilderTest MeshBuilderTest.h MeshBuilderTest.cpp Magnum) +magnum_add_test(MeshBuilderBenchmark MeshBuilderBenchmark.h MeshBuilderBenchmark.cpp Magnum) diff --git a/src/Test/MeshBuilderBenchmark.cpp b/src/Test/MeshBuilderBenchmark.cpp new file mode 100644 index 000000000..bb66b777b --- /dev/null +++ b/src/Test/MeshBuilderBenchmark.cpp @@ -0,0 +1,116 @@ +/* + Copyright © 2010, 2011 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "MeshBuilderBenchmark.h" + +#include + +#include "MeshBuilder.h" +#include "Magnum.h" + +QTEST_APPLESS_MAIN(Magnum::Test::MeshBuilderBenchmark) + +namespace Magnum { namespace Test { + +/* Vertices = normals */ +static const Vector4 icoVertices[] = { + Vector4(0, -0.525731f, 0.850651f), + Vector4(0.850651f, 0, 0.525731f), + Vector4(0.850651f, 0, -0.525731f), + Vector4(-0.850651f, 0, -0.525731f), + Vector4(-0.850651f, 0, 0.525731f), + Vector4(-0.525731f, 0.850651f, 0), + Vector4(0.525731f, 0.850651f, 0), + Vector4(0.525731f, -0.850651f, 0), + Vector4(-0.525731f, -0.850651f, 0), + Vector4(0, -0.525731f, -0.850651f), + Vector4(0, 0.525731f, -0.850651f), + Vector4(0, 0.525731f, 0.850651f), +}; + +/* Vertex indices */ +static const GLubyte icoIndices[] = { + 1, 2, 6, + 1, 7, 2, + 3, 4, 5, + 4, 3, 8, + 6, 5, 11, + 5, 6, 10, + 9, 10, 2, + 10, 9, 3, + 7, 8, 9, + 8, 7, 0, + 11, 0, 1, + 0, 11, 4, + 6, 2, 10, + 1, 6, 11, + 3, 5, 10, + 5, 4, 11, + 2, 7, 9, + 7, 1, 0, + 3, 9, 8, + 4, 8, 0 +}; + +void MeshBuilderBenchmark::subdivide() { + QBENCHMARK { + MeshBuilder builder; + builder.setData(icoVertices, icoIndices, 12, 60); + + /* Subdivide 5 times */ + builder.subdivide(interpolator); + builder.subdivide(interpolator); + builder.subdivide(interpolator); + builder.subdivide(interpolator); + builder.subdivide(interpolator); + } +} + +void MeshBuilderBenchmark::subdivideAndCleanMeshAfter() { + QBENCHMARK { + MeshBuilder builder; + builder.setData(icoVertices, icoIndices, 12, 60); + + /* Subdivide 5 times */ + builder.subdivide(interpolator); + builder.subdivide(interpolator); + builder.subdivide(interpolator); + builder.subdivide(interpolator); + builder.subdivide(interpolator); + + builder.cleanMesh(); + } +} + +void MeshBuilderBenchmark::subdivideAndCleanMeshBetween() { + QBENCHMARK { + MeshBuilder builder; + builder.setData(icoVertices, icoIndices, 12, 60); + + /* Subdivide 5 times */ + builder.subdivide(interpolator); + builder.cleanMesh(); + builder.subdivide(interpolator); + builder.cleanMesh(); + builder.subdivide(interpolator); + builder.cleanMesh(); + builder.subdivide(interpolator); + builder.cleanMesh(); + builder.subdivide(interpolator); + builder.cleanMesh(); + } +} + +}} diff --git a/src/Test/MeshBuilderBenchmark.h b/src/Test/MeshBuilderBenchmark.h new file mode 100644 index 000000000..6fca88af2 --- /dev/null +++ b/src/Test/MeshBuilderBenchmark.h @@ -0,0 +1,39 @@ +#ifndef Magnum_Test_MeshBuilderBenchmark_h +#define Magnum_Test_MeshBuilderBenchmark_h +/* + Copyright © 2010, 2011 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include + +#include "Magnum.h" + +namespace Magnum { namespace Test { + +class MeshBuilderBenchmark: public QObject { + Q_OBJECT + + private slots: + void subdivide(); + void subdivideAndCleanMeshAfter(); + void subdivideAndCleanMeshBetween(); + + private: + static inline Magnum::Vector4 interpolator(const Magnum::Vector4& a, const Magnum::Vector4& b) { + return (a+b).xyz().normalized(); + } +}; + +}} +#endif