Geometry Nodes: Simplify code in duplicate elements face mode

This node splits all faces to duplicate each time. Corner edges and
vertices are just ordered sequences of indices. Most likely, due to
historical reasons, this was overlooked and as a result the code became
so complex with potential simplicity. The problem was found in a
benchmark of #109174. The code in the lambda could not be optimized.

Timings improved by about 30%, from 154 to 120 ms.

Pull Request: https://projects.blender.org/blender/blender/pulls/109222
This commit is contained in:
Iliya Katueshenock
2023-06-22 13:45:43 +02:00
committed by Hans Goudey
parent dddc69d0be
commit a711c5004c

View File

@@ -538,7 +538,6 @@ static void duplicate_faces(GeometrySet &geometry_set,
const int src_corner = source[i_loops];
loop_mapping[loop_index] = src_corner;
vert_mapping[loop_index] = corner_verts[src_corner];
new_edges[loop_index] = edges[corner_edges[src_corner]];
edge_mapping[loop_index] = corner_edges[src_corner];
new_edges[loop_index][0] = loop_index;
if (i_loops + 1 != source.size()) {
@@ -547,13 +546,13 @@ static void duplicate_faces(GeometrySet &geometry_set,
else {
new_edges[loop_index][1] = new_poly_offsets[poly_index];
}
new_corner_verts[loop_index] = loop_index;
new_corner_edges[loop_index] = loop_index;
loop_index++;
}
poly_index++;
}
}
std::iota(new_corner_verts.begin(), new_corner_verts.end(), 0);
std::iota(new_corner_edges.begin(), new_corner_edges.end(), 0);
new_mesh->tag_loose_verts_none();
new_mesh->tag_loose_edges_none();