|
|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|