From 0d2035af8620fcdb5964b96a7ffa9e125074415d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 7 Dec 2011 21:35:34 +0100 Subject: [PATCH] Using SizeBaseCall in MeshBuilder::build(). --- src/MeshBuilder.h | 48 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/MeshBuilder.h b/src/MeshBuilder.h index 4db09d0de..7703b0f41 100644 --- a/src/MeshBuilder.h +++ b/src/MeshBuilder.h @@ -26,6 +26,7 @@ #include "Buffer.h" #include "IndexedMesh.h" +#include "SizeTraits.h" namespace Magnum { @@ -273,13 +274,8 @@ template class MeshBuilder { * them. * @note The mesh is @b not cleaned before building. */ - void build(IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage) { - if(_faces.size()*3 <= 0xFF) - buildInternal(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage); - else if(_faces.size()*3 <= 0xFFFF) - buildInternal(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage); - else - buildInternal(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage); + inline void build(IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage) { + SizeBasedCall(_faces.size()*3)(this, mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage); } /** @@ -319,26 +315,28 @@ template class MeshBuilder { HashedVertex(VertexPointer oldVertexPointer, VertexPointer newVertexPointer): oldVertexPointer(oldVertexPointer), newVertexPointer(newVertexPointer) {} }; - template void buildInternal(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 */ - std::vector::IndexType> indices; - 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]); - } + struct InternalBuilder { + template static void run(MeshBuilder* 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 */ + std::vector::IndexType> indices; + indices.reserve(builder->_faces.size()*3); + for(auto it = builder->_faces.cbegin(); it != builder->_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(_vertices.size()); - mesh->setIndexCount(indices.size()); - mesh->setIndexType(TypeTraits::glType()); + /* Update mesh parameters and fill it with data */ + mesh->setPrimitive(Mesh::Triangles); + mesh->setVertexCount(builder->_vertices.size()); + mesh->setIndexCount(indices.size()); + mesh->setIndexType(TypeTraits::glType()); - vertexBuffer->setData(sizeof(Vertex)*_vertices.size(), _vertices.data(), vertexBufferUsage); - mesh->indexBuffer()->setData(sizeof(IndexType)*indices.size(), indices.data(), indexBufferUsage); - } + vertexBuffer->setData(sizeof(Vertex)*builder->_vertices.size(), builder->_vertices.data(), vertexBufferUsage); + mesh->indexBuffer()->setData(sizeof(IndexType)*indices.size(), indices.data(), indexBufferUsage); + } + }; }; }