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 "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