Browse Source

MeshBuilder: reworked index builder.

Moved code which doesn't depend on index type outside this templated
function for smaller size of generated code.
vectorfields
Vladimír Vondruš 15 years ago
parent
commit
36213f13c4
  1. 26
      src/MeshBuilder.h

26
src/MeshBuilder.h

@ -274,8 +274,11 @@ template<class Vertex> class MeshBuilder {
* them.
* @note The mesh is @b not cleaned before building.
*/
inline void build(IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage) {
SizeBasedCall<InternalBuilder>(_vertices.size())(this, mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage);
void build(IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage) {
mesh->setPrimitive(Mesh::Triangles);
mesh->setVertexCount(_vertices.size());
vertexBuffer->setData(sizeof(Vertex)*_vertices.size(), _vertices.data(), vertexBufferUsage);
SizeBasedCall<IndexBuilder>(_vertices.size())(mesh, _faces, indexBufferUsage);
}
/**
@ -315,25 +318,22 @@ template<class Vertex> class MeshBuilder {
HashedVertex(VertexPointer oldVertexPointer, VertexPointer newVertexPointer): oldVertexPointer(oldVertexPointer), newVertexPointer(newVertexPointer) {}
};
struct InternalBuilder {
template<class IndexType> static void run(MeshBuilder<Vertex>* builder, IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage) {
/* Compress face array to index array. Using TypeTraits::IndexType
to ensure we have allowed type for indexing */
struct IndexBuilder {
template<class IndexType> static void run(IndexedMesh* mesh, const std::vector<Face>& faces, Buffer::Usage indexBufferUsage) {
/* Compress face array to index array. Using
TypeTraits::IndexType to ensure we have allowed type for
indexing */
std::vector<typename TypeTraits<IndexType>::IndexType> indices;
indices.reserve(builder->_faces.size()*3);
for(auto it = builder->_faces.cbegin(); it != builder->_faces.cend(); ++it) {
indices.reserve(faces.size()*3);
for(auto it = faces.cbegin(); it != faces.cend(); ++it) {
indices.push_back(it->vertices[0]);
indices.push_back(it->vertices[1]);
indices.push_back(it->vertices[2]);
}
/* Update mesh parameters and fill it with data */
mesh->setPrimitive(Mesh::Triangles);
mesh->setVertexCount(builder->_vertices.size());
/* Update mesh parameters and fill index buffer */
mesh->setIndexCount(indices.size());
mesh->setIndexType(TypeTraits<IndexType>::glType());
vertexBuffer->setData(sizeof(Vertex)*builder->_vertices.size(), builder->_vertices.data(), vertexBufferUsage);
mesh->indexBuffer()->setData(sizeof(IndexType)*indices.size(), indices.data(), indexBufferUsage);
}
};

Loading…
Cancel
Save