[Bf-blender-cvs] [a9b193f6635] refactor-mesh-corners-generic: Merge branch 'refactor-mesh-position-generic' into refactor-mesh-corners-generic

Hans Goudey noreply at git.blender.org
Thu Dec 8 20:17:49 CET 2022


Commit: a9b193f66350fd11f07f4adf589d393f9e816887
Author: Hans Goudey
Date:   Thu Dec 8 12:39:18 2022 -0600
Branches: refactor-mesh-corners-generic
https://developer.blender.org/rBa9b193f66350fd11f07f4adf589d393f9e816887

Merge branch 'refactor-mesh-position-generic' into refactor-mesh-corners-generic

===================================================================



===================================================================

diff --cc source/blender/blenkernel/intern/data_transfer.cc
index da645e82fad,267e9a386a5..be9eeb699ad
--- a/source/blender/blenkernel/intern/data_transfer.cc
+++ b/source/blender/blenkernel/intern/data_transfer.cc
@@@ -1572,14 -1570,9 +1572,14 @@@ bool BKE_object_data_transfer_ex(struc
  
        if (mdef && vg_idx != -1 && !weights[LDATA]) {
          weights[LDATA] = static_cast<float *>(
-             MEM_mallocN(sizeof(*weights[LDATA]) * (size_t)num_loops_dst, __func__));
+             MEM_mallocN(sizeof(*weights[LDATA]) * size_t(num_loops_dst), __func__));
 -        BKE_defvert_extract_vgroup_to_loopweights(
 -            mdef, vg_idx, num_verts_dst, loops_dst, num_loops_dst, invert_vgroup, weights[LDATA]);
 +        BKE_defvert_extract_vgroup_to_loopweights(mdef,
 +                                                  vg_idx,
 +                                                  num_verts_dst,
 +                                                  corner_verts_dst,
 +                                                  num_loops_dst,
 +                                                  invert_vgroup,
 +                                                  weights[LDATA]);
        }
  
        if (data_transfer_layersmapping_generate(&lay_map,
diff --cc source/blender/blenkernel/intern/mesh_remap.cc
index cd1709e3fcb,e6a6f16400a..24d31ca1e1b
--- a/source/blender/blenkernel/intern/mesh_remap.cc
+++ b/source/blender/blenkernel/intern/mesh_remap.cc
@@@ -1430,10 -1426,11 +1428,10 @@@ void BKE_mesh_remap_calc_loops_from_mes
                                    num_loops_src);
      if (use_from_vert) {
        loop_to_poly_map_src = static_cast<int *>(
-           MEM_mallocN(sizeof(*loop_to_poly_map_src) * (size_t)num_loops_src, __func__));
+           MEM_mallocN(sizeof(*loop_to_poly_map_src) * size_t(num_loops_src), __func__));
        poly_cents_src = static_cast<float(*)[3]>(
-           MEM_mallocN(sizeof(*poly_cents_src) * (size_t)num_polys_src, __func__));
+           MEM_mallocN(sizeof(*poly_cents_src) * size_t(num_polys_src), __func__));
        for (pidx_src = 0, mp_src = polys_src; pidx_src < num_polys_src; pidx_src++, mp_src++) {
 -        ml_src = &loops_src[mp_src->loopstart];
          for (plidx_src = 0, lidx_src = mp_src->loopstart; plidx_src < mp_src->totloop;
               plidx_src++, lidx_src++) {
            loop_to_poly_map_src[lidx_src] = pidx_src;
diff --cc source/blender/geometry/intern/mesh_merge_by_distance.cc
index 721b5ae8f27,d9713abd3b5..19398ff5b53
--- a/source/blender/geometry/intern/mesh_merge_by_distance.cc
+++ b/source/blender/geometry/intern/mesh_merge_by_distance.cc
@@@ -729,9 -750,13 +761,14 @@@ static bool weld_iter_loop_of_poly_next
    return false;
  }
  
+ /**
+  * Alloc Weld Polygons and Weld Loops.
+  *
+  * \return r_weld_mesh: Loop and poly members will be allocated here.
+  */
  static void weld_poly_loop_ctx_alloc(Span<MPoly> mpoly,
 -                                     Span<MLoop> mloop,
 +                                     const Span<int> corner_verts,
 +                                     const Span<int> corner_edges,
                                       Span<int> vert_dest_map,
                                       Span<int> edge_dest_map,
                                       WeldMesh *r_weld_mesh)
@@@ -964,9 -986,16 +1001,17 @@@ static void weld_poly_split_recursive(S
  #endif
  }
  
+ /**
+  * Alloc Weld Polygons and Weld Loops.
+  *
+  * \param remain_edge_ctx_len: Context weld edges that won't be destroyed by merging or collapsing.
+  * \param r_vlinks: An uninitialized buffer used to compute groups of WeldPolys attached to each
+  *                  weld target vertex. It doesn't need to be passed as a parameter but this is
+  *                  done to reduce allocations.
+  * \return r_weld_mesh: Loop and poly members will be configured here.
+  */
 -static void weld_poly_loop_ctx_setup(Span<MLoop> mloop,
 +static void weld_poly_loop_ctx_setup(const Span<int> corner_verts,
 +                                     const Span<int> corner_edges,
- 
  #ifdef USE_WELD_DEBUG
                                       Span<MPoly> mpoly,
  #endif
@@@ -1050,10 -1076,9 +1094,10 @@@
  
      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)) {
-           v_links[iter.v].len++;
+           r_vlinks[iter.v]++;
          }
        }
      }
@@@ -1067,13 -1093,13 +1112,14 @@@
      if (link_len) {
        Array<int> link_poly_buffer(link_len);
  
-       for (const int i : IndexRange(r_weld_mesh->wpoly.size())) {
+       /* 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)) {
-             link_poly_buffer[v_links[iter.v].ofs++] = i;
+             link_poly_buffer[--r_vlinks[iter.v]] = i;
            }
          }
        }
@@@ -1095,13 -1116,12 +1136,13 @@@
          }
  
          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);
-         struct WeldGroup *link_a = &v_links[iter.v];
-         polys_len_a = link_a->len;
+         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->ofs] == i);
+           BLI_assert(link_poly_buffer[link_a] == i);
            continue;
          }
          int wp_loop_len = wp.loop_len;
@@@ -1200,14 -1219,13 +1242,15 @@@ static void weld_mesh_context_create(co
    Array<int> edge_ctx_map(edges.size());
    Vector<WeldEdge> wedge = weld_edge_ctx_alloc(edges, vert_dest_map, edge_dest_map, edge_ctx_map);
  
-   Array<WeldGroup> v_links(mvert_len, {0, 0});
+   /* Add +1 to allow calculation of the length of the last group. */
+   Array<int> v_links(mvert_len + 1);
    weld_edge_ctx_setup(v_links, edge_dest_map, wedge, &r_weld_mesh->edge_kill_len);
  
 -  weld_poly_loop_ctx_alloc(polys, loops, vert_dest_map, edge_dest_map, r_weld_mesh);
 +  weld_poly_loop_ctx_alloc(
 +      polys, corner_verts, corner_edges, vert_dest_map, edge_dest_map, r_weld_mesh);
  
 -  weld_poly_loop_ctx_setup(loops,
 +  weld_poly_loop_ctx_setup(corner_verts,
 +                           corner_edges,
  #ifdef USE_WELD_DEBUG
                             polys,
  
@@@ -1453,9 -1479,10 +1505,9 @@@ static Mesh *create_merged_mesh(const M
      if (poly_ctx == OUT_OF_CONTEXT) {
        int mp_loop_len = mp.totloop;
        CustomData_copy_data(&mesh.ldata, &result->ldata, mp.loopstart, loop_cur, mp_loop_len);
 -      loop_cur += mp_loop_len;
 -      for (; mp_loop_len--; r_ml++) {
 -        r_ml->v = vert_final_map[r_ml->v];
 -        r_ml->e = edge_final_map[r_ml->e];
 +      for (; mp_loop_len--; loop_cur++) {
-         dst_corner_verts[loop_cur] = vert_final[dst_corner_verts[loop_cur]];
-         dst_corner_edges[loop_cur] = edge_final[dst_corner_edges[loop_cur]];
++        dst_corner_verts[loop_cur] = vert_final_map[dst_corner_verts[loop_cur]];
++        dst_corner_edges[loop_cur] = edge_final_map[dst_corner_edges[loop_cur]];
        }
      }
      else {
@@@ -1477,8 -1499,11 +1529,8 @@@
        while (weld_iter_loop_of_poly_next(iter)) {
          customdata_weld(
              &mesh.ldata, &result->ldata, group_buffer.data(), iter.group_len, loop_cur);
-         dst_corner_verts[loop_cur] = vert_final[iter.v];
-         dst_corner_edges[loop_cur] = edge_final[iter.e];
 -        int v = vert_final_map[iter.v];
 -        int e = edge_final_map[iter.e];
 -        r_ml->v = v;
 -        r_ml->e = e;
 -        r_ml++;
++        dst_corner_verts[loop_cur] = vert_final_map[iter.v];
++        dst_corner_edges[loop_cur] = edge_final_map[iter.e];
          loop_cur++;
        }
      }
@@@ -1510,8 -1530,11 +1562,8 @@@
      }
      while (weld_iter_loop_of_poly_next(iter)) {
        customdata_weld(&mesh.ldata, &result->ldata, group_buffer.data(), iter.group_len, loop_cur);
-       dst_corner_verts[loop_cur] = vert_final[iter.v];
-       dst_corner_edges[loop_cur] = edge_final[iter.e];
 -      int v = vert_final_map[iter.v];
 -      int e = edge_final_map[iter.e];
 -      r_ml->v = v;
 -      r_ml->e = e;
 -      r_ml++;
++      dst_corner_verts[loop_cur] = vert_final_map[iter.v];
++      dst_corner_edges[loop_cur] = edge_final_map[iter.e];
        loop_cur++;
      }
  
diff --cc source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
index 49b684bfcfc,b69d5d2f29b..fc5492e2e6f
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
@@@ -369,12 -369,11 +369,12 @@@ static void calculate_cone_edges(const 
  }
  
  static void calculate_cone_faces(const ConeConfig &config,
 -                                 MutableSpan<MLoop> loops,
 +                                 MutableSpan<int> corner_verts,
 +                                 MutableSpan<int> corner_edges,
                                   MutableSpan<MPoly> polys)
  {
-   int rings_poly_start;
-   int rings_loop_start;
+   int rings_poly_start = 0;
+   int rings_loop_start = 0;
    if (config.top_has_center_vert) {
      rings_poly_start = config.circle_segments;
      rings_loop_start = config.circle_segments * 3;



More information about the Bf-blender-cvs mailing list