Browse Source

Primitives: using MeshData instead of AbstractPrimitive.

The classes now provide better access to the data. Also fixed
SubdivideCleanBenchmark from MeshTools.
vectorfields
Vladimír Vondruš 14 years ago
parent
commit
7dae98ded1
  1. 52
      src/MeshTools/Test/SubdivideCleanBenchmark.cpp
  2. 34
      src/Primitives/Cube.cpp
  3. 15
      src/Primitives/Cube.h
  4. 33
      src/Primitives/Icosphere.cpp
  5. 44
      src/Primitives/Icosphere.h

52
src/MeshTools/Test/SubdivideCleanBenchmark.cpp

@ -17,7 +17,6 @@
#include <QtTest/QTest> #include <QtTest/QTest>
#include "MeshBuilder.h"
#include "Primitives/Icosphere.h" #include "Primitives/Icosphere.h"
#include "MeshTools/Clean.h" #include "MeshTools/Clean.h"
#include "MeshTools/Subdivide.h" #include "MeshTools/Subdivide.h"
@ -28,50 +27,47 @@ namespace Magnum { namespace MeshTools { namespace Test {
void SubdivideCleanBenchmark::subdivide() { void SubdivideCleanBenchmark::subdivide() {
QBENCHMARK { QBENCHMARK {
MeshBuilder<Vector4> builder; Primitives::Icosphere<0> icosphere;
builder.setData(Primitives::Icosahedron::vertices, Primitives::Icosahedron::indices, 12, 60);
/* Subdivide 5 times */ /* Subdivide 5 times */
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
} }
} }
void SubdivideCleanBenchmark::subdivideAndCleanMeshAfter() { void SubdivideCleanBenchmark::subdivideAndCleanMeshAfter() {
QBENCHMARK { QBENCHMARK {
MeshBuilder<Vector4> builder; Primitives::Icosphere<0> icosphere;
builder.setData(Primitives::Icosahedron::vertices, Primitives::Icosahedron::indices, 12, 60);
/* Subdivide 5 times */ /* Subdivide 5 times */
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::clean(builder); MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0));
} }
} }
void SubdivideCleanBenchmark::subdivideAndCleanMeshBetween() { void SubdivideCleanBenchmark::subdivideAndCleanMeshBetween() {
QBENCHMARK { QBENCHMARK {
MeshBuilder<Vector4> builder; Primitives::Icosphere<0> icosphere;
builder.setData(Primitives::Icosahedron::vertices, Primitives::Icosahedron::indices, 12, 60);
/* Subdivide 5 times */ /* Subdivide 5 times */
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::clean(builder); MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0));
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::clean(builder); MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0));
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::clean(builder); MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0));
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::clean(builder); MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0));
MeshTools::subdivide(builder, interpolator); MeshTools::subdivide(*icosphere.indices(), *icosphere.vertices(0), interpolator);
MeshTools::clean(builder); MeshTools::clean(*icosphere.indices(), *icosphere.vertices(0));
} }
} }

34
src/Primitives/Cube.cpp

@ -15,23 +15,11 @@
#include "Cube.h" #include "Cube.h"
#include "Buffer.h" using namespace std;
#include "IndexedMesh.h"
namespace Magnum { namespace Primitives { namespace Magnum { namespace Primitives {
const Vector4 Cube::_vertices[] = { Cube::Cube(): MeshData(Mesh::Primitive::Triangles, new vector<unsigned int>{
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[] = {
0, 1, 2, 0, 1, 2,
2, 1, 3, 2, 1, 3,
1, 5, 3, 1, 5, 3,
@ -44,13 +32,15 @@ const GLubyte Cube::_indices[] = {
2, 7, 6, 2, 7, 6,
4, 5, 1, 4, 5, 1,
4, 1, 0 4, 1, 0
}; }, {new vector<Vector4>{
Vector4(-1.0f, -1.0f, -1.0f),
void Cube::build(IndexedMesh* mesh, Buffer* vertexBuffer) { Vector4( 1.0f, -1.0f, -1.0f),
prepareMesh(mesh); Vector4(-1.0f, 1.0f, -1.0f),
Vector4( 1.0f, 1.0f, -1.0f),
vertexBuffer->setData(sizeof(_vertices), _vertices, Buffer::Usage::StaticDraw); Vector4(-1.0f, -1.0f, 1.0f),
mesh->indexBuffer()->setData(sizeof(_indices), _indices, Buffer::Usage::StaticDraw); Vector4( 1.0f, -1.0f, 1.0f),
} Vector4(-1.0f, 1.0f, 1.0f),
Vector4( 1.0f, 1.0f, 1.0f)
}}, {nullptr}, {nullptr}) {}
}} }}

15
src/Primitives/Cube.h

@ -19,22 +19,15 @@
* @brief Class Magnum::Primitives::Cube * @brief Class Magnum::Primitives::Cube
*/ */
#include "AbstractPrimitive.h" #include "Trade/MeshData.h"
namespace Magnum { namespace Primitives { namespace Magnum { namespace Primitives {
/** @brief %Cube primitive */ /** @brief %Cube primitive */
class Cube: public AbstractPrimitive<GLubyte> { class Cube: public Trade::MeshData {
public: public:
inline Mesh::Primitive primitive() const { return Mesh::Primitive::Triangles; } /** @brief Constructor */
inline size_t vertexCount() const { return 8; } Cube();
inline size_t indexCount() const { return 36; }
void build(IndexedMesh* mesh, Buffer* vertexBuffer);
private:
static const Vector4 _vertices[];
static const IndexType _indices[];
}; };
}} }}

33
src/Primitives/Icosphere.cpp

@ -15,23 +15,11 @@
#include "Icosphere.h" #include "Icosphere.h"
using namespace std;
namespace Magnum { namespace Primitives { namespace Magnum { namespace Primitives {
const Vector4 Icosahedron::vertices[] = { Icosphere<0>::Icosphere(): MeshData(Mesh::Primitive::Triangles, new vector<unsigned int>{
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[] = {
1, 2, 6, 1, 2, 6,
1, 7, 2, 1, 7, 2,
3, 4, 5, 3, 4, 5,
@ -52,6 +40,19 @@ const GLubyte Icosahedron::indices[] = {
7, 1, 0, 7, 1, 0,
3, 9, 8, 3, 9, 8,
4, 8, 0 4, 8, 0
}; }, {new vector<Vector4>{
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}) {}
}} }}

44
src/Primitives/Icosphere.h

@ -16,63 +16,43 @@
*/ */
/** @file /** @file
* @brief Class Magnum::Primitives::Icosahedron, Magnum::Primitives::Icosphere * @brief Class Magnum::Primitives::Icosphere
*/ */
#include "AbstractPrimitive.h" #include "Trade/MeshData.h"
#include "SizeTraits.h"
#include "MeshTools/Subdivide.h" #include "MeshTools/Subdivide.h"
#include "MeshTools/Clean.h" #include "MeshTools/Clean.h"
namespace Magnum { namespace Primitives { namespace Magnum { namespace Primitives {
template<size_t subdivisions> class Icosphere;
/** /**
@brief Icosahedron @brief %Icosphere primitive with zero subdivisions
@todo Use own computed (and more precise) icosahedron data, not these stolen @todo Use own computed (and more precise) icosahedron data, not these stolen
from Blender. from Blender.
*/ */
class Icosahedron { template<> class Icosphere<0>: public Trade::MeshData {
public: public:
static const Vector4 vertices[]; /**< @brief Vertices */ /** @brief Constructor */
static const GLubyte indices[]; /**< @brief Indices */ Icosphere();
}; };
/** /**
* @brief %Icosphere primitive * @brief %Icosphere primitive
* @tparam subdivisions Number of subdivisions * @tparam subdivisions Number of subdivisions
*/ */
template<size_t subdivisions> class Icosphere: public AbstractPrimitive<typename SizeTraits<Log<256, Pow<4, subdivisions>::value*20*3>::value>::SizeType> { template<size_t subdivisions> class Icosphere: public Icosphere<0> {
public: public:
/** @brief Constructor */
Icosphere() { 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<Vector4>* builder() {
static MeshBuilder<Vector4>* _builder = nullptr;
if(!_builder) _builder = new MeshBuilder<Vector4>();
return _builder;
}
static void subdivide() {
builder()->setData(Icosahedron::vertices, Icosahedron::indices, 12, 60);
for(size_t i = 0; i != subdivisions; ++i) 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(); return (a+b).xyz().normalized();
}); });
if(subdivisions) MeshTools::clean(*builder()); MeshTools::clean(*indices(), *vertices(0));
} }
}; };

Loading…
Cancel
Save