diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-03-19 23:32:47 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-03-19 23:32:47 +0000 |
commit | 40cc01f79c6308b2e4b64fab73cb27d4221a648e (patch) | |
tree | 5d4ee7b206b43076a62a1e49b0ab439f3369566d /assetFactory | |
parent | Add defaulted Vertex equality operator (diff) | |
download | ilt-40cc01f79c6308b2e4b64fab73cb27d4221a648e.tar.bz2 ilt-40cc01f79c6308b2e4b64fab73cb27d4221a648e.tar.xz ilt-40cc01f79c6308b2e4b64fab73cb27d4221a648e.zip |
Dedupe vertices during asset factory mesh build
This calls Vertex::== far too many times, but it's not (yet) enough to be a problem
Diffstat (limited to 'assetFactory')
-rw-r--r-- | assetFactory/factoryMesh.cpp | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/assetFactory/factoryMesh.cpp b/assetFactory/factoryMesh.cpp index 6cca388..8869efd 100644 --- a/assetFactory/factoryMesh.cpp +++ b/assetFactory/factoryMesh.cpp @@ -16,23 +16,31 @@ FactoryMesh::createMesh() const std::vector<Vertex> vertices; std::vector<unsigned int> indices; for (const auto & face : mesh.faces()) { - const auto smooth = mesh.property(mesh.smoothFaceProperty, face); - const auto colour = mesh.color(face); - auto hrange = mesh.fh_range(face); - const unsigned int start = static_cast<unsigned int>(vertices.size()); - for (const auto & heh : hrange) { + const auto & smooth = mesh.property(mesh.smoothFaceProperty, face); + const auto & colour = mesh.color(face); + + std::vector<unsigned int> faceIndices; + for (const auto & heh : mesh.fh_range(face)) { const auto & vertex = mesh.to_vertex_handle(heh); - const auto textureUV = mesh.texcoord2D(heh); - vertices.emplace_back(mesh.point(vertex), textureUV, - smooth ? mesh.property(mesh.vertex_normals_pph(), vertex) - : mesh.property(mesh.face_normals_pph(), face), - colour); + const auto & textureUV = mesh.texcoord2D(heh); + const auto & point = mesh.point(vertex); + const auto & normal = smooth ? mesh.property(mesh.vertex_normals_pph(), vertex) + : mesh.property(mesh.face_normals_pph(), face); + Vertex outVertex {point, textureUV, normal, colour}; + if (const auto existingItr = std::find(vertices.rbegin(), vertices.rend(), outVertex); + existingItr != vertices.rend()) { + faceIndices.push_back(static_cast<unsigned int>(std::distance(existingItr, vertices.rend()) - 1)); + } + else { + faceIndices.push_back(static_cast<unsigned int>(vertices.size())); + vertices.emplace_back(outVertex); + } } - const auto vcount = std::distance(hrange.begin(), hrange.end()); - for (unsigned int i = 2; i < vcount; i++) { - indices.push_back(start); - indices.push_back(start + i - 1); - indices.push_back(start + i); + + for (unsigned int i = 2; i < faceIndices.size(); i++) { + indices.push_back(faceIndices[0]); + indices.push_back(faceIndices[i - 1]); + indices.push_back(faceIndices[i]); } } return std::make_shared<Mesh>(vertices, indices); |