summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-03-19 23:32:47 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2023-03-19 23:32:47 +0000
commit40cc01f79c6308b2e4b64fab73cb27d4221a648e (patch)
tree5d4ee7b206b43076a62a1e49b0ab439f3369566d
parentAdd defaulted Vertex equality operator (diff)
downloadilt-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
-rw-r--r--assetFactory/factoryMesh.cpp38
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);