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

Loading…
Cancel
Save