[Bf-blender-cvs] [94ce0ac547f] refactor-mesh-remove-pointers: Fix mesh merge

Hans Goudey noreply at git.blender.org
Mon Aug 1 02:53:02 CEST 2022


Commit: 94ce0ac547f685fbf2d8c5375ab2e1f80adaef05
Author: Hans Goudey
Date:   Sun Jul 31 19:52:53 2022 -0500
Branches: refactor-mesh-remove-pointers
https://developer.blender.org/rB94ce0ac547f685fbf2d8c5375ab2e1f80adaef05

Fix mesh merge

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

M	source/blender/blenkernel/intern/mesh_merge.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/modifiers/intern/MOD_array.c

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

diff --git a/source/blender/blenkernel/intern/mesh_merge.c b/source/blender/blenkernel/intern/mesh_merge.c
index 0983f56743a..cdf7114021c 100644
--- a/source/blender/blenkernel/intern/mesh_merge.c
+++ b/source/blender/blenkernel/intern/mesh_merge.c
@@ -44,8 +44,7 @@ static int cddm_poly_compare(const MLoop *mloop_array,
   bool compare_completed = false;
   bool same_loops = false;
 
-  const MLoop *mloop_source;
-  const MLoop *mloop_target;
+  const MLoop *mloop_source, *mloop_target;
 
   BLI_assert(ELEM(direct_reverse, 1, -1));
 
@@ -204,10 +203,10 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
   const int totedge = mesh->totedge;
   const int totloop = mesh->totloop;
   const int totpoly = mesh->totpoly;
-  const MVert *vertices = BKE_mesh_vertices(mesh);
-  const MEdge *edges = BKE_mesh_edges(mesh);
-  const MPoly *polygons = BKE_mesh_polygons(mesh);
-  const MLoop *loops = BKE_mesh_loops(mesh);
+  const MVert *src_vertices = BKE_mesh_vertices(mesh);
+  const MEdge *src_edges = BKE_mesh_edges(mesh);
+  const MPoly *src_polygons = BKE_mesh_polygons(mesh);
+  const MLoop *src_loops = BKE_mesh_loops(mesh);
 
   const int totvert_final = totvert - tot_vtargetmap;
 
@@ -263,7 +262,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
   STACK_INIT(mpoly, totpoly);
 
   /* fill newv with destination vertex indices */
-  mv = vertices;
+  mv = src_vertices;
   c = 0;
   for (i = 0; i < totvert; i++, mv++) {
     if (vtargetmap[i] == -1) {
@@ -290,7 +289,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
    */
 
   /* now go through and fix edges and faces */
-  med = edges;
+  med = src_edges;
   c = 0;
   for (i = 0; i < totedge; i++, med++) {
     const uint v1 = (vtargetmap[med->v1] != -1) ? vtargetmap[med->v1] : med->v1;
@@ -325,12 +324,12 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
     /* Duplicates allowed because our compare function is not pure equality */
     BLI_gset_flag_set(poly_gset, GHASH_FLAG_ALLOW_DUPES);
 
-    mp = polygons;
+    mp = src_polygons;
     mpgh = poly_keys;
     for (i = 0; i < totpoly; i++, mp++, mpgh++) {
       mpgh->poly_index = i;
       mpgh->totloops = mp->totloop;
-      ml = loops + mp->loopstart;
+      ml = src_loops + mp->loopstart;
       mpgh->hash_sum = mpgh->hash_xor = 0;
       for (j = 0; j < mp->totloop; j++, ml++) {
         mpgh->hash_sum += ml->v;
@@ -342,17 +341,17 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
     /* Can we optimize by reusing an old `pmap`? How do we know an old `pmap` is stale? */
     /* When called by `MOD_array.c` the `cddm` has just been created, so it has no valid `pmap`. */
     BKE_mesh_vert_poly_map_create(
-        &poly_map, &poly_map_mem, polygons, loops, totvert, totpoly, totloop);
+        &poly_map, &poly_map_mem, src_polygons, src_loops, totvert, totpoly, totloop);
   } /* done preparing for fast poly compare */
 
   BLI_bitmap *vert_tag = BLI_BITMAP_NEW(mesh->totvert, __func__);
 
-  mp = polygons;
-  mv = vertices;
+  mp = src_polygons;
+  mv = src_vertices;
   for (i = 0; i < totpoly; i++, mp++) {
     MPoly *mp_new;
 
-    ml = loops + mp->loopstart;
+    ml = src_loops + mp->loopstart;
 
     /* check faces with all vertices merged */
     bool all_vertices_merged = true;
@@ -385,7 +384,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
 
         /* Use poly_gset for fast (although not 100% certain) identification of same poly */
         /* First, make up a poly_summary structure */
-        ml = loops + mp->loopstart;
+        ml = src_loops + mp->loopstart;
         pkey.hash_sum = pkey.hash_xor = 0;
         pkey.totloops = 0;
         for (j = 0; j < mp->totloop; j++, ml++) {
@@ -403,17 +402,17 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
            */
 
           /* Consider current loop again */
-          ml = loops + mp->loopstart;
+          ml = src_loops + mp->loopstart;
           /* Consider the target of the loop's first vert */
           v_target = vtargetmap[ml->v];
           /* Now see if v_target belongs to a poly that shares all vertices with source poly,
            * in same order, or reverse order */
 
           for (i_poly = 0; i_poly < poly_map[v_target].count; i_poly++) {
-            const MPoly *target_poly = polygons + *(poly_map[v_target].indices + i_poly);
+            const MPoly *target_poly = src_polygons + *(poly_map[v_target].indices + i_poly);
 
-            if (cddm_poly_compare(loops, mp, target_poly, vtargetmap, +1) ||
-                cddm_poly_compare(loops, mp, target_poly, vtargetmap, -1)) {
+            if (cddm_poly_compare(src_loops, mp, target_poly, vtargetmap, +1) ||
+                cddm_poly_compare(src_loops, mp, target_poly, vtargetmap, -1)) {
               found = true;
               break;
             }
@@ -431,7 +430,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
      * or they were all merged, but targets do not make up an identical poly,
      * the poly is retained.
      */
-    ml = loops + mp->loopstart;
+    ml = src_loops + mp->loopstart;
 
     c = 0;
     MLoop *last_valid_ml = NULL;
@@ -443,9 +442,9 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
       const uint mlv = (vtargetmap[ml->v] != -1) ? vtargetmap[ml->v] : ml->v;
 #ifndef NDEBUG
       {
-        MLoop *next_ml = loops + mp->loopstart + ((j + 1) % mp->totloop);
+        const MLoop *next_ml = src_loops + mp->loopstart + ((j + 1) % mp->totloop);
         uint next_mlv = (vtargetmap[next_ml->v] != -1) ? vtargetmap[next_ml->v] : next_ml->v;
-        med = edges + ml->e;
+        med = src_edges + ml->e;
         uint v1 = (vtargetmap[med->v1] != -1) ? vtargetmap[med->v1] : med->v1;
         uint v2 = (vtargetmap[med->v2] != -1) ? vtargetmap[med->v2] : med->v2;
         BLI_assert((mlv == v1 && next_mlv == v2) || (mlv == v2 && next_mlv == v1));
@@ -470,7 +469,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
           else {
             const int new_eidx = STACK_SIZE(medge);
             STACK_PUSH(olde, olde[last_valid_ml->e]);
-            STACK_PUSH(medge, edges[last_valid_ml->e]);
+            STACK_PUSH(medge, src_edges[last_valid_ml->e]);
             medge[new_eidx].v1 = last_valid_ml->v;
             medge[new_eidx].v2 = ml->v;
             /* DO NOT change newe mapping,
@@ -524,7 +523,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
       else {
         const int new_eidx = STACK_SIZE(medge);
         STACK_PUSH(olde, olde[last_valid_ml->e]);
-        STACK_PUSH(medge, edges[last_valid_ml->e]);
+        STACK_PUSH(medge, src_edges[last_valid_ml->e]);
         medge[new_eidx].v1 = last_valid_ml->v;
         medge[new_eidx].v2 = first_valid_ml->v;
         /* DO NOT change newe mapping,
@@ -592,8 +591,8 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh,
   MLoop *new_ml = mloop;
   for (i = 0; i < result->totloop; i++, new_ml++) {
     /* Edge remapping has already be done in main loop handling part above. */
-    BLI_assert(newv[ml->v] != -1);
-    new_ml->v = newv[ml->v];
+    BLI_assert(newv[new_ml->v] != -1);
+    new_ml->v = newv[new_ml->v];
 
     CustomData_copy_data(&mesh->ldata, &result->ldata, oldl[i], i, 1);
   }
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 147fe072018..4d822296529 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -2063,7 +2063,8 @@ static int psys_map_index_on_dm(Mesh *mesh,
       /* modify the original weights to become
        * weights for the derived mesh face */
       OrigSpaceFace *osface = CustomData_get_layer(&mesh->fdata, CD_ORIGSPACE);
-      const MFace *mface = &CustomData_get_layer(&mesh->fdata, CD_MFACE)[i];
+      const MFace *mfaces = CustomData_get_layer(&mesh->fdata, CD_MFACE);
+      const MFace *mface = &mfaces[i];
 
       if (osface == NULL) {
         mapfw[0] = mapfw[1] = mapfw[2] = mapfw[3] = 0.0f;
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index 2d1611d0631..a6b9ada9a04 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -307,7 +307,7 @@ static void mesh_merge_transform(Mesh *result,
   }
 
   /* remap the vertex groups if necessary */
-  if (CustomData_has_layer(&result->vdata, CD_MDEFORMVERT)) {
+  if (BKE_mesh_deform_verts(result) != NULL) {
     MDeformVert *dvert = BKE_mesh_deform_verts_for_write(result);
     BKE_object_defgroup_index_map_apply(&dvert[cap_verts_index], cap_nverts, remap, remap_len);
   }
@@ -356,7 +356,7 @@ static void mesh_merge_transform(Mesh *result,
 
 static Mesh *arrayModifier_doArray(ArrayModifierData *amd,
                                    const ModifierEvalContext *ctx,
-                                   Mesh *mesh)
+                                   const Mesh *mesh)
 {
   MEdge *me;
   MLoop *ml;



More information about the Bf-blender-cvs mailing list