[Bf-blender-cvs] [932a211f6c0] refactor-mesh-corners-generic: Merge branch 'master' into refactor-mesh-corners-generic
Hans Goudey
noreply at git.blender.org
Thu Jan 19 23:30:36 CET 2023
Commit: 932a211f6c00100190f402036252e4f238e72f40
Author: Hans Goudey
Date: Thu Jan 19 16:15:09 2023 -0600
Branches: refactor-mesh-corners-generic
https://developer.blender.org/rB932a211f6c00100190f402036252e4f238e72f40
Merge branch 'master' into refactor-mesh-corners-generic
===================================================================
===================================================================
diff --cc source/blender/geometry/intern/mesh_merge_by_distance.cc
index d468d33e6f8,5374a6c08cd..ed37f743b29
--- a/source/blender/geometry/intern/mesh_merge_by_distance.cc
+++ b/source/blender/geometry/intern/mesh_merge_by_distance.cc
@@@ -1010,128 -1006,170 +1021,174 @@@ static void weld_poly_split_recursive(S
* done to reduce allocations.
* \return r_weld_mesh: Loop and poly members will be configured here.
*/
- static void weld_poly_loop_ctx_setup(const Span<int> corner_verts,
- const Span<int> corner_edges,
+ static void weld_poly_loop_ctx_setup_collapsed_and_split(
#ifdef USE_WELD_DEBUG
- Span<MPoly> mpoly,
- Span<MLoop> mloop,
++ const Span<int> corner_verts,
++ const Span<int> corner_edges,
+ Span<MPoly> mpoly,
#endif
- const int mvert_len,
- Span<int> vert_dest_map,
- const int remain_edge_ctx_len,
- MutableSpan<int> r_vlinks,
- WeldMesh *r_weld_mesh)
+ Span<int> vert_dest_map,
+ const int remain_edge_ctx_len,
+ WeldMesh *r_weld_mesh)
{
+ if (remain_edge_ctx_len == 0) {
+ r_weld_mesh->poly_kill_len = r_weld_mesh->wpoly.size();
+ r_weld_mesh->loop_kill_len = r_weld_mesh->wloop.size();
+
+ for (WeldPoly &wp : r_weld_mesh->wpoly) {
+ wp.flag = ELEM_COLLAPSED;
+ }
+
+ return;
+ }
+
WeldPoly *wpoly = r_weld_mesh->wpoly.data();
MutableSpan<WeldLoop> wloop = r_weld_mesh->wloop;
+
int poly_kill_len = 0;
int loop_kill_len = 0;
- Span<int> loop_map = r_weld_mesh->loop_map;
-
- if (remain_edge_ctx_len) {
-
- /* Setup Poly/Loop. */
- /* `wpoly.size()` may change during the loop,
- * so make it clear that we are only working with the original wpolys. */
- IndexRange wpoly_original_range = r_weld_mesh->wpoly.index_range();
- for (const int i : wpoly_original_range) {
- WeldPoly &wp = wpoly[i];
- const int ctx_loops_len = wp.loops.len;
- const int ctx_loops_ofs = wp.loops.offs;
-
- int poly_loop_len = wp.loop_len;
- int ctx_verts_len = 0;
- WeldLoop *wl = &wloop[ctx_loops_ofs];
- for (int l = ctx_loops_len; l--; wl++) {
- const int edge_dest = wl->edge;
- if (edge_dest == ELEM_COLLAPSED) {
- wl->flag = ELEM_COLLAPSED;
- if (poly_loop_len == 3) {
- wp.flag = ELEM_COLLAPSED;
- poly_kill_len++;
- loop_kill_len += 3;
- poly_loop_len = 0;
- break;
- }
- loop_kill_len++;
- poly_loop_len--;
+ /* Setup Poly/Loop. */
+ /* `wpoly.size()` may change during the loop,
+ * so make it clear that we are only working with the original wpolys. */
+ IndexRange wpoly_original_range = r_weld_mesh->wpoly.index_range();
+ for (const int i : wpoly_original_range) {
+ WeldPoly &wp = wpoly[i];
+ const int ctx_loops_len = wp.loops.len;
+ const int ctx_loops_ofs = wp.loops.offs;
+
+ int poly_loop_len = wp.loop_len;
+ int ctx_verts_len = 0;
+ WeldLoop *wl = &wloop[ctx_loops_ofs];
+ for (int l = ctx_loops_len; l--; wl++) {
+ const int edge_dest = wl->edge;
+ if (edge_dest == ELEM_COLLAPSED) {
+ wl->flag = ELEM_COLLAPSED;
+ if (poly_loop_len == 3) {
+ wp.flag = ELEM_COLLAPSED;
+ poly_kill_len++;
+ loop_kill_len += 3;
+ poly_loop_len = 0;
+ break;
}
- else {
- const int vert_dst = wl->vert;
- if (vert_dest_map[vert_dst] != OUT_OF_CONTEXT) {
- ctx_verts_len++;
- }
+ loop_kill_len++;
+ poly_loop_len--;
+ }
+ else {
+ const int vert_dst = wl->vert;
+ if (vert_dest_map[vert_dst] != OUT_OF_CONTEXT) {
+ ctx_verts_len++;
}
}
+ }
- if (poly_loop_len) {
- wp.loop_len = poly_loop_len;
+ if (poly_loop_len) {
+ wp.loop_len = poly_loop_len;
#ifdef USE_WELD_DEBUG
- weld_assert_poly_len(&wp, wloop);
+ weld_assert_poly_len(&wp, wloop);
#endif
- weld_poly_split_recursive(vert_dest_map,
+ weld_poly_split_recursive(vert_dest_map,
#ifdef USE_WELD_DEBUG
- corner_verts,
- corner_edges,
+ mloop,
#endif
- ctx_verts_len,
- &wp,
- r_weld_mesh,
- &poly_kill_len,
- &loop_kill_len);
- }
+ ctx_verts_len,
+ &wp,
+ r_weld_mesh,
+ &poly_kill_len,
+ &loop_kill_len);
}
+ }
+
+ r_weld_mesh->poly_kill_len = poly_kill_len;
+ r_weld_mesh->loop_kill_len = loop_kill_len;
+
+ #ifdef USE_WELD_DEBUG
+ weld_assert_poly_and_loop_kill_len(
+ r_weld_mesh, mloop, mpoly, r_weld_mesh->poly_kill_len, r_weld_mesh->loop_kill_len);
+ #endif
+ }
-static void weld_poly_find_doubles(Span<MLoop> mloop,
++static void weld_poly_find_doubles(const Span<int> corner_verts,
++ const Span<int> corner_edges,
#ifdef USE_WELD_DEBUG
- weld_assert_poly_and_loop_kill_len(
- r_weld_mesh, corner_verts, corner_edges, mpoly, poly_kill_len, loop_kill_len);
+ const Span<MPoly> mpoly,
#endif
+ const int mvert_len,
+ MutableSpan<int> r_vlinks,
+ WeldMesh *r_weld_mesh)
+ {
+ if (r_weld_mesh->poly_kill_len == r_weld_mesh->wpoly.size()) {
+ return;
+ }
+
+ WeldPoly *wpoly = r_weld_mesh->wpoly.data();
+ MutableSpan<WeldLoop> wloop = r_weld_mesh->wloop;
+ Span<int> loop_map = r_weld_mesh->loop_map;
+ int poly_kill_len = r_weld_mesh->poly_kill_len;
+ int loop_kill_len = r_weld_mesh->loop_kill_len;
+
+ /* Setup Polygon Overlap. */
+
+ r_vlinks.fill(0);
- /* Setup Polygon Overlap. */
+ for (const WeldPoly &wp : r_weld_mesh->wpoly) {
+ WeldLoopOfPolyIter iter;
- if (weld_iter_loop_of_poly_begin(iter, wp, wloop, mloop, loop_map, nullptr)) {
++ if (weld_iter_loop_of_poly_begin(
++ iter, wp, wloop, corner_verts, corner_edges, loop_map, nullptr)) {
+ while (weld_iter_loop_of_poly_next(iter)) {
+ r_vlinks[iter.v]++;
+ }
+ }
+ }
+
+ int link_len = 0;
+ for (const int i : IndexRange(mvert_len)) {
+ link_len += r_vlinks[i];
+ r_vlinks[i] = link_len;
+ }
+ r_vlinks[mvert_len] = link_len;
- r_vlinks.fill(0);
+ if (link_len) {
+ Array<int> link_poly_buffer(link_len);
- for (const WeldPoly &wp : r_weld_mesh->wpoly) {
+ /* Use a reverse for loop to ensure that indexes are assigned in ascending order. */
+ for (int i = r_weld_mesh->wpoly.size(); i--;) {
+ const WeldPoly &wp = wpoly[i];
WeldLoopOfPolyIter iter;
- if (weld_iter_loop_of_poly_begin(iter, wp, wloop, mloop, loop_map, nullptr)) {
+ if (weld_iter_loop_of_poly_begin(
+ iter, wp, wloop, corner_verts, corner_edges, loop_map, nullptr)) {
while (weld_iter_loop_of_poly_next(iter)) {
- r_vlinks[iter.v]++;
+ link_poly_buffer[--r_vlinks[iter.v]] = i;
}
}
}
- int link_len = 0;
- for (const int i : IndexRange(mvert_len)) {
- link_len += r_vlinks[i];
- r_vlinks[i] = link_len;
- }
- r_vlinks[mvert_len] = link_len;
-
- if (link_len) {
- Array<int> link_poly_buffer(link_len);
-
- /* Use a reverse for loop to ensure that indexes are assigned in ascending order. */
- for (int i = r_weld_mesh->wpoly.size(); i--;) {
- const WeldPoly &wp = wpoly[i];
- WeldLoopOfPolyIter iter;
- if (weld_iter_loop_of_poly_begin(
- iter, wp, wloop, corner_verts, corner_edges, loop_map, nullptr)) {
- while (weld_iter_loop_of_poly_next(iter)) {
- link_poly_buffer[--r_vlinks[iter.v]] = i;
- }
- }
- }
+ int polys_len_a, polys_len_b, *polys_ctx_a, *polys_ctx_b, p_ctx_a, p_ctx_b;
+ polys_len_b = p_ctx_b = 0; /* silence warnings */
- int polys_len_a, polys_len_b, *polys_ctx_a, *polys_ctx_b, p_ctx_a, p_ctx_b;
- polys_len_b = p_ctx_b = 0; /* silence warnings */
+ for (const int i : IndexRange(r_weld_mesh->wpoly.size())) {
+ const WeldPoly &wp = wpoly[i];
+ if (wp.poly_dst != OUT_OF_CONTEXT) {
+ /* No need to retest poly.
+ * (Already includes collapsed polygons). */
+ continue;
+ }
- for (const int i : IndexRange(r_weld_mesh->wpoly.size())) {
- const WeldPoly &wp = wpoly[i];
- if (wp.poly_dst != OUT_OF_CONTEXT) {
- /* No need to retest poly.
- * (Already includes collapsed polygons). */
+ WeldLoopOfPolyIter iter;
- weld_iter_loop_of_poly_begin(iter, wp, wloop, mloop, loop_map, nullptr);
++ weld_iter_loop_of_poly_begin(iter, wp, wloop, corner_verts, corner_edges, loop_map, nullptr);
+ weld_iter_loop_of_poly_next(iter);
+ const int link_a = r_vlinks[iter.v];
+ polys_len_a = r_vlinks[iter.v + 1] - link_a;
+ if (polys_len_a == 1) {
+ BLI_assert(link_poly_buffer[link_a] == i);
+ continue;
+ }
+ int wp_loop_len = wp.loop_len;
+ polys_ctx_a = &link_poly_buffer[link_a];
+ for (; polys_len_a--; polys_ctx_a++) {
+ p_ctx_a = *polys_ctx_a;
+ if (p_ctx_a == i) {
continue;
}
@@@ -1244,22 -1255,30 +1275,33 @@@ static void weld_mesh_context_create(co
/* Add +1 to allow calculation of the length of the last group. */
Array<int> v_links(mvert_len + 1);
- weld_edge_ctx_setup(v_lin
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list