From 11ed44c13c227c73d9b2ec416aed54b00bda2a0a Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 18 Nov 2014 09:49:02 +0200 Subject: Support larger custom meshes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vertex index was limited to unsigned short, meaning even slightly complex meshes couldn't be used. Changed to unsigned int. Also removed unused vertex indexer methods. Change-Id: Iebe62bd3a501dc79ee2857cca28ac0d05bd4a55e Reviewed-by: Tomi Korpipää --- src/datavisualization/utils/vertexindexer.cpp | 85 +++------------------------ 1 file changed, 7 insertions(+), 78 deletions(-) (limited to 'src/datavisualization/utils/vertexindexer.cpp') diff --git a/src/datavisualization/utils/vertexindexer.cpp b/src/datavisualization/utils/vertexindexer.cpp index c34203da..90528d05 100644 --- a/src/datavisualization/utils/vertexindexer.cpp +++ b/src/datavisualization/utils/vertexindexer.cpp @@ -24,45 +24,11 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION int unique_vertices = 0; -// Returns true if v1 can be considered equal to v2 -bool VertexIndexer::is_near(float v1, float v2) -{ - return qAbs(v1 - v2) < 0.01f; -} - -// Searches through all already exported vertices for a similar one. -// Similar = same position + same UVs + same normal -bool VertexIndexer::getSimilarVertexIndex(const QVector3D &in_vertex, - const QVector2D &in_uv, - const QVector3D &in_normal, - QVector &out_vertices, - QVector &out_uvs, - QVector &out_normals, - unsigned short &result) -{ - // Linear search - for (int i = 0; i < out_vertices.size(); i++) { - if (is_near(in_vertex.x() , out_vertices[i].x()) - && is_near(in_vertex.y() , out_vertices[i].y()) - && is_near(in_vertex.z() , out_vertices[i].z()) - && is_near(in_uv.x() , out_uvs [i].x()) - && is_near(in_uv.y() , out_uvs [i].y()) - && is_near(in_normal.x() , out_normals [i].x()) - && is_near(in_normal.y() , out_normals [i].y()) - && is_near(in_normal.z() , out_normals [i].z())) { - result = i; - return true; - } - } - // No other vertex could be used instead - return false; -} - bool VertexIndexer::getSimilarVertexIndex_fast(const PackedVertex &packed, - QMap &VertexToOutIndex, - unsigned short &result) + QMap &VertexToOutIndex, + GLuint &result) { - QMap::iterator it = VertexToOutIndex.find(packed); + QMap::iterator it = VertexToOutIndex.find(packed); if (it == VertexToOutIndex.end()) { return false; } else { @@ -74,20 +40,20 @@ bool VertexIndexer::getSimilarVertexIndex_fast(const PackedVertex &packed, void VertexIndexer::indexVBO(const QVector &in_vertices, const QVector &in_uvs, const QVector &in_normals, - QVector &out_indices, + QVector &out_indices, QVector &out_vertices, QVector &out_uvs, QVector &out_normals) { unique_vertices = 0; - QMap VertexToOutIndex; + QMap VertexToOutIndex; // For each input vertex for (int i = 0; i < in_vertices.size(); i++) { PackedVertex packed = {in_vertices[i], in_uvs[i], in_normals[i]}; // Try to find a similar vertex in out_XXXX - unsigned short index; + GLuint index; bool found = getSimilarVertexIndex_fast(packed, VertexToOutIndex, index); if (found) { @@ -97,48 +63,11 @@ void VertexIndexer::indexVBO(const QVector &in_vertices, out_vertices.append(in_vertices[i]); out_uvs.append(in_uvs[i]); out_normals.append(in_normals[i]); - unsigned short newindex = (unsigned short)out_vertices.size() - 1; + GLuint newindex = (GLuint)out_vertices.size() - 1; out_indices.append(newindex); VertexToOutIndex[packed] = newindex; } } } -void VertexIndexer::indexVBO_TBN(const QVector &in_vertices, - const QVector &in_uvs, - const QVector &in_normals, - const QVector &in_tangents, - const QVector &in_bitangents, - QVector &out_indices, - QVector &out_vertices, - QVector &out_uvs, - QVector &out_normals, - QVector &out_tangents, - QVector &out_bitangents) -{ - unique_vertices = 0; - // For each input vertex - for (int i = 0; i < in_vertices.size(); i++) { - // Try to find a similar vertex in out_XXXX - unsigned short index; - bool found = getSimilarVertexIndex(in_vertices[i], in_uvs[i], in_normals[i], - out_vertices, out_uvs, out_normals, index); - - if (found) { - out_indices.append(index); - // Average the tangents and the bitangents - out_tangents[index] += in_tangents[i]; - out_bitangents[index] += in_bitangents[i]; - } else { - unique_vertices++; - out_vertices.append(in_vertices[i]); - out_uvs.append(in_uvs[i]); - out_normals.append(in_normals[i]); - out_tangents.append(in_tangents[i]); - out_bitangents.append(in_bitangents[i]); - out_indices.append((unsigned short)out_vertices.size() - 1); - } - } -} - QT_END_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3