[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