void indexVBO(std::vector<natVec3<>>& vertices, std::vector<natVec2<>>& uvs, std::vector<natVec3<>>& normals, std::vector<unsigned short>& out_indices) { out_indices.clear(); std::vector<natVec3<>> out_vertices(vertices); std::vector<natVec2<>> out_uvs(uvs); std::vector<natVec3<>> out_normals(normals); std::map<PackedVertex, nuShort> VertexToOutIndex; nuInt count = static_cast<nuInt>(std::min({ vertices.size(), uvs.size(), normals.size() })); for (nuInt i = 0u; i < count; ++i) { PackedVertex packed = { vertices[i], uvs[i], normals[i] }; // Try to find a similar vertex in out_XXXX nuShort index; if (getSimilarVertexIndex(packed, VertexToOutIndex, index)) { // A similar vertex is already in the VBO, use it instead ! out_indices.push_back(index); } else { // If not, it needs to be added in the output data. out_vertices.push_back(vertices[i]); out_uvs.push_back(uvs[i]); out_normals.push_back(normals[i]); unsigned short newindex = static_cast<unsigned short>(out_vertices.size()) - 1; out_indices.push_back(newindex); VertexToOutIndex[packed] = newindex; } } /*vertices.swap(out_vertices); uvs.swap(out_uvs); normals.swap(out_normals);*/ vertices.assign(out_vertices.begin(), out_vertices.end()); uvs.assign(out_uvs.begin(), out_uvs.end()); normals.assign(out_normals.begin(), out_normals.end()); }
void Mesh::applyIndexing() { vector<vec3> outVertexData; vector<vec3> outNormalData; vector<vec2> outUvData; vector<unsigned int> outIndexData; map<Vertex, unsigned int> VertexToOutIndex; bool hasUV = uvData.size() > 0; bool hasNormal = normalData.size() > 0; const vec3 zero(0.0f); unsigned int n = vertexData.size(); for (unsigned int i = 0; i < n; i++) { Vertex packed(vertexData[i], hasNormal ? normalData[i] : zero, hasUV ? uvData[i] : vec2(0.0f)); unsigned int index; bool found = getSimilarVertexIndex(packed, VertexToOutIndex, index); if (found) outIndexData.push_back(index); else { outVertexData.push_back(vertexData[i]); if(hasUV) outUvData.push_back(uvData[i]); if(hasNormal) outNormalData.push_back(normalData[i]); outIndexData.push_back(outVertexData.size() - 1); VertexToOutIndex[packed] = outVertexData.size() - 1; } } indexData.setData(outIndexData); vertexData = outVertexData; uvData = outUvData; normalData = outNormalData; }