Browse Source

Using TypeTraits in MeshBuilder.

Slightly reduced code size (removed repeated code), also ensuring that
the right (unsigned) type is used for indexing.
pull/279/head
Vladimír Vondruš 15 years ago
parent
commit
3c9f6681b9
  1. 54
      src/MeshBuilder.h

54
src/MeshBuilder.h

@ -94,7 +94,7 @@ template<class Vertex> class MeshBuilder {
/** /**
* @brief Set mesh data * @brief Set mesh data
* @param vertices Vertices * @param vertexData Vertex data
* @param indices Vertex indices * @param indices Vertex indices
* @param vertexCount Vertex count * @param vertexCount Vertex count
* @param indexCount Index count * @param indexCount Index count
@ -102,18 +102,20 @@ template<class Vertex> class MeshBuilder {
* Replaces mesh builder data with given data. Type of indices is * Replaces mesh builder data with given data. Type of indices is
* detected from given pointer. * detected from given pointer.
*/ */
inline void setData(const Vertex* vertices, const GLubyte* indices, GLsizei vertexCount, GLsizei indexCount) { template<class IndexType> void setData(const Vertex* vertexData, const IndexType* indices, GLsizei vertexCount, GLsizei indexCount) {
setData<GLubyte>(vertices, indices, vertexCount, indexCount, GL_UNSIGNED_BYTE); clear();
}
/** @copydoc setData() */ /* Map vertex indices to vertex pointers */
inline void setData(const Vertex* vertices, const GLushort* indices, GLsizei vertexCount, GLsizei indexCount) { std::vector<Vertex> vertices;
setData<GLushort>(vertices, indices, vertexCount, indexCount, GL_UNSIGNED_SHORT); vertices.reserve(vertexCount);
} /* Using TypeTraits::IndexType to ensure we have allowed type for indexing */
for(typename TypeTraits<IndexType>::IndexType i = 0; i != vertexCount; ++i)
addVertex(Vertex(vertexData[i]));
/** @copydoc setData() */ /* Faces array */
inline void setData(const Vertex* vertices, const GLuint* indices, GLsizei vertexCount, GLsizei indexCount) { _faces.reserve(indexCount/3);
setData<GLuint>(vertices, indices, vertexCount, indexCount, GL_UNSIGNED_INT); for(size_t i = 0; i < indexCount; i += 3)
addFace(indices[i], indices[i+1], indices[i+2]);
} }
/** @brief Add vertex */ /** @brief Add vertex */
@ -266,11 +268,11 @@ template<class Vertex> class MeshBuilder {
*/ */
void build(IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage) { void build(IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage) {
if(_faces.size()*3 <= 0xFF) if(_faces.size()*3 <= 0xFF)
buildInternal<GLubyte>(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage, GL_UNSIGNED_BYTE); buildInternal<GLubyte>(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage);
else if(_faces.size()*3 <= 0xFFFF) else if(_faces.size()*3 <= 0xFFFF)
buildInternal<GLushort>(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage, GL_UNSIGNED_SHORT); buildInternal<GLushort>(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage);
else else
buildInternal<GLuint>(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage, GL_UNSIGNED_INT); buildInternal<GLuint>(mesh, vertexBuffer, vertexBufferUsage, indexBufferUsage);
} }
/** /**
@ -310,24 +312,10 @@ template<class Vertex> class MeshBuilder {
HashedVertex(VertexPointer oldVertexPointer, VertexPointer newVertexPointer): oldVertexPointer(oldVertexPointer), newVertexPointer(newVertexPointer) {} HashedVertex(VertexPointer oldVertexPointer, VertexPointer newVertexPointer): oldVertexPointer(oldVertexPointer), newVertexPointer(newVertexPointer) {}
}; };
template<class IndexType> void setData(const Vertex* vertexData, const IndexType* indices, GLsizei vertexCount, GLsizei indexCount, GLenum indexType) { template<class IndexType> void buildInternal(IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage) {
clear(); /* Compress face array to index array. Using TypeTraits::IndexType
to ensure we have allowed type for indexing */
/* Map vertex indices to vertex pointers */ std::vector<typename TypeTraits<IndexType>::IndexType> indices;
std::vector<Vertex> vertices;
vertices.reserve(vertexCount);
for(IndexType i = 0; i != vertexCount; ++i)
addVertex(Vertex(vertexData[i]));
/* Faces array */
_faces.reserve(indexCount/3);
for(IndexType i = 0; i < indexCount; i += 3)
addFace(indices[i], indices[i+1], indices[i+2]);
}
template<class IndexType> void buildInternal(IndexedMesh* mesh, Buffer* vertexBuffer, Buffer::Usage vertexBufferUsage, Buffer::Usage indexBufferUsage, GLenum indexType) {
/* Compress face array to index array */
std::vector<IndexType> indices;
indices.reserve(_faces.size()*3); indices.reserve(_faces.size()*3);
for(auto it = _faces.cbegin(); it != _faces.cend(); ++it) { for(auto it = _faces.cbegin(); it != _faces.cend(); ++it) {
indices.push_back(it->vertices[0]); indices.push_back(it->vertices[0]);
@ -339,7 +327,7 @@ template<class Vertex> class MeshBuilder {
mesh->setPrimitive(Mesh::Triangles); mesh->setPrimitive(Mesh::Triangles);
mesh->setVertexCount(_vertices.size()); mesh->setVertexCount(_vertices.size());
mesh->setIndexCount(indices.size()); mesh->setIndexCount(indices.size());
mesh->setIndexType(indexType); mesh->setIndexType(TypeTraits<IndexType>::glType());
vertexBuffer->setData(sizeof(Vertex)*_vertices.size(), _vertices.data(), vertexBufferUsage); vertexBuffer->setData(sizeof(Vertex)*_vertices.size(), _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