Browse Source

Primitives: using MeshData instead of AbstractPrimitive.

The classes now provide better access to the data. Also fixed
SubdivideCleanBenchmark from MeshTools.
pull/279/head
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 "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<Vector4> 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<Vector4> 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<Vector4> 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));
}
}

34
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<unsigned int>{
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>{
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}) {}
}}

15
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<GLubyte> {
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();
};
}}

33
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<unsigned int>{
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>{
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
* @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<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
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<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:
/** @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<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)
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));
}
};

Loading…
Cancel
Save