diff --git a/src/MeshTools/Test/SubdivideCleanBenchmark.cpp b/src/MeshTools/Test/SubdivideCleanBenchmark.cpp index 2c52ae417..6d6ec7307 100644 --- a/src/MeshTools/Test/SubdivideCleanBenchmark.cpp +++ b/src/MeshTools/Test/SubdivideCleanBenchmark.cpp @@ -17,7 +17,6 @@ #include -#include "MeshBuilder.h" #include "Primitives/Icosphere.h" #include "MeshTools/Clean.h" #include "MeshTools/Subdivide.h" @@ -28,50 +27,47 @@ namespace Magnum { namespace MeshTools { namespace Test { void SubdivideCleanBenchmark::subdivide() { QBENCHMARK { - MeshBuilder builder; - builder.setData(Primitives::Icosahedron::vertices, Primitives::Icosahedron::indices, 12, 60); + Primitives::Icosphere<0> icosphere; /* Subdivide 5 times */ - MeshTools::subdivide(builder, interpolator); - MeshTools::subdivide(builder, interpolator); - MeshTools::subdivide(builder, interpolator); - MeshTools::subdivide(builder, interpolator); - MeshTools::subdivide(builder, interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); } } void SubdivideCleanBenchmark::subdivideAndCleanMeshAfter() { QBENCHMARK { - MeshBuilder builder; - builder.setData(Primitives::Icosahedron::vertices, Primitives::Icosahedron::indices, 12, 60); + Primitives::Icosphere<0> icosphere; /* Subdivide 5 times */ - MeshTools::subdivide(builder, interpolator); - MeshTools::subdivide(builder, interpolator); - MeshTools::subdivide(builder, interpolator); - MeshTools::subdivide(builder, interpolator); - MeshTools::subdivide(builder, interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); - MeshTools::clean(builder); + MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0)); } } void SubdivideCleanBenchmark::subdivideAndCleanMeshBetween() { QBENCHMARK { - MeshBuilder builder; - builder.setData(Primitives::Icosahedron::vertices, Primitives::Icosahedron::indices, 12, 60); + Primitives::Icosphere<0> icosphere; /* Subdivide 5 times */ - MeshTools::subdivide(builder, interpolator); - MeshTools::clean(builder); - MeshTools::subdivide(builder, interpolator); - MeshTools::clean(builder); - MeshTools::subdivide(builder, interpolator); - MeshTools::clean(builder); - MeshTools::subdivide(builder, interpolator); - MeshTools::clean(builder); - MeshTools::subdivide(builder, interpolator); - MeshTools::clean(builder); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0)); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0)); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0)); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0)); + MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator); + MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0)); } } diff --git a/src/Primitives/Cube.cpp b/src/Primitives/Cube.cpp index 989cd6000..c02887587 100644 --- a/src/Primitives/Cube.cpp +++ b/src/Primitives/Cube.cpp @@ -15,23 +15,11 @@ #include "Cube.h" -#include "Buffer.h" -#include "IndexedMesh.h" +using namespace std; namespace Magnum { namespace Primitives { -const Vector4 Cube::_vertices[] = { - Vector4(-1.0f, -1.0f, -1.0f), - Vector4( 1.0f, -1.0f, -1.0f), - Vector4(-1.0f, 1.0f, -1.0f), - Vector4( 1.0f, 1.0f, -1.0f), - Vector4(-1.0f, -1.0f, 1.0f), - Vector4( 1.0f, -1.0f, 1.0f), - Vector4(-1.0f, 1.0f, 1.0f), - Vector4( 1.0f, 1.0f, 1.0f) -}; - -const GLubyte Cube::_indices[] = { +Cube::Cube(): MeshData(Mesh::Primitive::Triangles, new vector{ 0, 1, 2, 2, 1, 3, 1, 5, 3, @@ -44,13 +32,15 @@ const GLubyte Cube::_indices[] = { 2, 7, 6, 4, 5, 1, 4, 1, 0 -}; - -void Cube::build(IndexedMesh* mesh, Buffer* vertexBuffer) { - prepareMesh(mesh); - - vertexBuffer->setData(sizeof(_vertices), _vertices, Buffer::Usage::StaticDraw); - mesh->indexBuffer()->setData(sizeof(_indices), _indices, Buffer::Usage::StaticDraw); -} +}, {new vector{ + Vector4(-1.0f, -1.0f, -1.0f), + Vector4( 1.0f, -1.0f, -1.0f), + Vector4(-1.0f, 1.0f, -1.0f), + Vector4( 1.0f, 1.0f, -1.0f), + Vector4(-1.0f, -1.0f, 1.0f), + Vector4( 1.0f, -1.0f, 1.0f), + Vector4(-1.0f, 1.0f, 1.0f), + Vector4( 1.0f, 1.0f, 1.0f) +}}, {nullptr}, {nullptr}) {} }} diff --git a/src/Primitives/Cube.h b/src/Primitives/Cube.h index 5dcc99986..bacc1829c 100644 --- a/src/Primitives/Cube.h +++ b/src/Primitives/Cube.h @@ -19,22 +19,15 @@ * @brief Class Magnum::Primitives::Cube */ -#include "AbstractPrimitive.h" +#include "Trade/MeshData.h" namespace Magnum { namespace Primitives { /** @brief %Cube primitive */ -class Cube: public AbstractPrimitive { +class Cube: public Trade::MeshData { public: - inline Mesh::Primitive primitive() const { return Mesh::Primitive::Triangles; } - inline size_t vertexCount() const { return 8; } - inline size_t indexCount() const { return 36; } - - void build(IndexedMesh* mesh, Buffer* vertexBuffer); - - private: - static const Vector4 _vertices[]; - static const IndexType _indices[]; + /** @brief Constructor */ + Cube(); }; }} diff --git a/src/Primitives/Icosphere.cpp b/src/Primitives/Icosphere.cpp index 05fe33200..e78c973c9 100644 --- a/src/Primitives/Icosphere.cpp +++ b/src/Primitives/Icosphere.cpp @@ -15,23 +15,11 @@ #include "Icosphere.h" +using namespace std; + namespace Magnum { namespace Primitives { -const Vector4 Icosahedron::vertices[] = { - 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), -}; -const GLubyte Icosahedron::indices[] = { +Icosphere<0>::Icosphere(): MeshData(Mesh::Primitive::Triangles, new vector{ 1, 2, 6, 1, 7, 2, 3, 4, 5, @@ -52,6 +40,19 @@ const GLubyte Icosahedron::indices[] = { 7, 1, 0, 3, 9, 8, 4, 8, 0 -}; +}, {new vector{ + 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) +}}, {nullptr}, {nullptr}) {} }} diff --git a/src/Primitives/Icosphere.h b/src/Primitives/Icosphere.h index 9d32de9f9..52d31b1c7 100644 --- a/src/Primitives/Icosphere.h +++ b/src/Primitives/Icosphere.h @@ -16,63 +16,43 @@ */ /** @file - * @brief Class Magnum::Primitives::Icosahedron, Magnum::Primitives::Icosphere + * @brief Class Magnum::Primitives::Icosphere */ -#include "AbstractPrimitive.h" -#include "SizeTraits.h" +#include "Trade/MeshData.h" #include "MeshTools/Subdivide.h" #include "MeshTools/Clean.h" namespace Magnum { namespace Primitives { +template class Icosphere; + /** -@brief Icosahedron +@brief %Icosphere primitive with zero subdivisions @todo Use own computed (and more precise) icosahedron data, not these stolen from Blender. */ -class Icosahedron { +template<> class Icosphere<0>: public Trade::MeshData { public: - static const Vector4 vertices[]; /**< @brief Vertices */ - static const GLubyte indices[]; /**< @brief Indices */ + /** @brief Constructor */ + Icosphere(); }; /** * @brief %Icosphere primitive * @tparam subdivisions Number of subdivisions */ -template class Icosphere: public AbstractPrimitive::value*20*3>::value>::SizeType> { +template class Icosphere: public Icosphere<0> { public: + /** @brief Constructor */ Icosphere() { - if(vertexCount() == 0) subdivide(); - } - - inline Mesh::Primitive primitive() const { return Mesh::Primitive::Triangles; } - inline size_t vertexCount() const { return builder()->vertexCount(); } - inline size_t indexCount() const { return builder()->indexCount(); } - - inline void build(IndexedMesh* mesh, Buffer* vertexBuffer) { - /* mesh is prepared by the builder, no need to call prepareMesh */ - builder()->build(mesh, vertexBuffer, Buffer::Usage::StaticDraw, Buffer::Usage::StaticDraw); - } - - private: - static MeshBuilder* builder() { - static MeshBuilder* _builder = nullptr; - if(!_builder) _builder = new MeshBuilder(); - return _builder; - } - - static void subdivide() { - builder()->setData(Icosahedron::vertices, Icosahedron::indices, 12, 60); - for(size_t i = 0; i != subdivisions; ++i) - MeshTools::subdivide(*builder(), [](const Vector4& a, const Vector4& b) { + MeshTools::subdivide(*indices(), *vertices(0), [](const Vector4& a, const Vector4& b) { return (a+b).xyz().normalized(); }); - if(subdivisions) MeshTools::clean(*builder()); + MeshTools::clean(*indices(), *vertices(0)); } };