Merge branch 'blender-v5.0-release'

This commit is contained in:
Sergey Sharybin
2025-10-15 16:14:19 +02:00
3 changed files with 90 additions and 17 deletions

View File

@@ -210,6 +210,25 @@ static IndexMask mask_first_distinct_edges(const Span<int2> edges,
});
}
static void map_edge_to_span_index(const Span<int2> edges,
const Span<EdgeMap> edge_maps,
const uint32_t parallel_mask,
const OffsetIndices<int> edge_offsets,
MutableSpan<int> indices)
{
threading::parallel_for_each(edge_maps.index_range(), [&](const int map_i) {
int edge_map_iter = 0;
for (const int edge_i : edges.index_range()) {
const int edge_map = calc_edges::edge_to_hash_map_i(edges[edge_i], parallel_mask);
if (map_i != edge_map) {
continue;
}
indices[edge_offsets[edge_map][edge_map_iter]] = edge_i;
edge_map_iter++;
}
});
}
} // namespace calc_edges
void mesh_calc_edges(Mesh &mesh,
@@ -269,6 +288,8 @@ void mesh_calc_edges(Mesh &mesh,
corner_edges.fill(-1);
#endif
const int result_edges_num = edge_offsets.total_size();
const OffsetIndices<int> faces = mesh.faces();
const Span<int2> original_edges = mesh.edges();
const Span<int> corner_verts = mesh.corner_verts();
@@ -277,13 +298,20 @@ void mesh_calc_edges(Mesh &mesh,
* that case. TODO: make this optional. */
calc_edges::update_edge_indices_in_face_loops(
faces, corner_verts, edge_maps, parallel_mask, edge_offsets, corner_edges);
Array<int> edge_map_to_result_index(result_edges_num);
#ifndef NDEBUG
edge_map_to_result_index.as_mutable_span().fill(-1);
#endif
calc_edges::map_edge_to_span_index(
original_edges, edge_maps, parallel_mask, edge_offsets, edge_map_to_result_index);
array_utils::gather(edge_map_to_result_index.as_span(), corner_edges.as_span(), corner_edges);
BLI_assert(!corner_edges.contains(-1));
BLI_assert(BKE_mesh_is_valid(&mesh));
return;
}
const int result_edges_num = edge_offsets.total_size();
IndexMaskMemory memory;
IndexRange back_range_of_new_edges;
IndexMask src_to_dst_mask;
@@ -322,18 +350,11 @@ void mesh_calc_edges(Mesh &mesh,
if (original_edges_are_distinct) {
/* TODO: Do we can group edges by .low vertex? Or by hash, but with Span<int> of edges by
* group?... */
threading::parallel_for_each(edge_maps.index_range(), [&](const int map_i) {
int edge_map_iter = 0;
for (const int edge_i : IndexRange(mesh.edges_num)) {
const int edge_map = calc_edges::edge_to_hash_map_i(original_edges[edge_i],
parallel_mask);
if (map_i != edge_map) {
continue;
}
edge_map_to_result_index[edge_offsets[edge_map][edge_map_iter]] = edge_i;
edge_map_iter++;
}
});
calc_edges::map_edge_to_span_index(original_edges.take_front(mesh.edges_num),
edge_maps,
parallel_mask,
edge_offsets,
edge_map_to_result_index);
}
else {
src_to_dst_mask.foreach_index(