[Bf-blender-cvs] [d90281c725b] refactor-mesh-corners-generic: Fix several failing tests

Hans Goudey noreply at git.blender.org
Sun Dec 11 07:36:37 CET 2022


Commit: d90281c725bd1757e00a51becb5693aaf056dc72
Author: Hans Goudey
Date:   Sun Dec 11 00:36:31 2022 -0600
Branches: refactor-mesh-corners-generic
https://developer.blender.org/rBd90281c725bd1757e00a51becb5693aaf056dc72

Fix several failing tests

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

M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/blenkernel/intern/mesh_calc_edges.cc
M	source/blender/blenkernel/intern/mesh_mapping.cc
M	source/blender/blenkernel/intern/mesh_normals.cc
M	source/blender/modifiers/intern/MOD_array.c
M	source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc
M	source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc

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

diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc
index b40b5afb98f..6a9f4b05027 100644
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@ -512,6 +512,12 @@ static int customdata_compare(
       }
       /* At this point `l1` and `l2` have the same name and type, so they should be compared. */
 
+      if (StringRef(l1->name) == ".corner_edge") {
+        /* TODO(Hans): This attribute wasn't tested before loops were refactored into separate
+         * corner edges and corner verts arrays. Remove after updating tests. */
+        continue;
+      }
+
       switch (l1->type) {
         /* We're order-agnostic for edges here. */
         case CD_MEDGE: {
diff --git a/source/blender/blenkernel/intern/mesh_calc_edges.cc b/source/blender/blenkernel/intern/mesh_calc_edges.cc
index b95a93adda1..1651347c44c 100644
--- a/source/blender/blenkernel/intern/mesh_calc_edges.cc
+++ b/source/blender/blenkernel/intern/mesh_calc_edges.cc
@@ -104,9 +104,9 @@ static void add_polygon_edges_to_hash_maps(Mesh *mesh,
     for (const MPoly &poly : polys) {
       const IndexRange corners(poly.loopstart, poly.totloop);
       int corner_prev = corners.last();
-      for (const int corner : corners) {
+      for (const int next_corner : corners) {
         /* Can only be the same when the mesh data is invalid. */
-        const int vert = corner_verts[corner];
+        const int vert = corner_verts[next_corner];
         const int vert_prev = corner_verts[corner_prev];
         if (vert_prev != vert) {
           OrderedEdge ordered_edge{vert_prev, vert};
@@ -115,7 +115,7 @@ static void add_polygon_edges_to_hash_maps(Mesh *mesh,
             edge_map.lookup_or_add(ordered_edge, {nullptr});
           }
         }
-        corner_prev = corner;
+        corner_prev = next_corner;
       }
     }
   });
@@ -161,17 +161,17 @@ static void update_edge_indices_in_poly_loops(Mesh *mesh,
                                               uint32_t parallel_mask)
 {
   const Span<MPoly> polys = mesh->polys();
-  MutableSpan<int> corner_verts = mesh->corner_verts_for_write();
+  const Span<int> corner_verts = mesh->corner_verts();
   MutableSpan<int> corner_edges = mesh->corner_edges_for_write();
   threading::parallel_for(IndexRange(mesh->totpoly), 100, [&](IndexRange range) {
     for (const int poly_index : range) {
       const MPoly &poly = polys[poly_index];
       const IndexRange corners(poly.loopstart, poly.totloop);
 
-      int corner_prev = corners.last();
-      for (const int corner : corners) {
-        const int vert = corner_verts[corner];
-        const int vert_prev = corner_verts[corner_prev];
+      int prev_corner = corners.last();
+      for (const int next_corner : corners) {
+        const int vert = corner_verts[next_corner];
+        const int vert_prev = corner_verts[prev_corner];
 
         int edge_index;
         if (vert_prev != vert) {
@@ -186,8 +186,8 @@ static void update_edge_indices_in_poly_loops(Mesh *mesh,
            * T76514. */
           edge_index = 0;
         }
-        corner_edges[corner_prev] = edge_index;
-        corner_prev = corner;
+        corner_edges[prev_corner] = edge_index;
+        prev_corner = next_corner;
       }
     }
   });
@@ -239,6 +239,10 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool keep_existing_edges, const bool select
   }
 
   /* Create new edges. */
+  if (!CustomData_get_layer_named(&mesh->ldata, CD_PROP_INT32, ".corner_edge")) {
+    CustomData_add_layer_named(
+        &mesh->ldata, CD_PROP_INT32, CD_CONSTRUCT, nullptr, mesh->totloop, ".corner_edge");
+  }
   MutableSpan<MEdge> new_edges{
       static_cast<MEdge *>(MEM_calloc_arrayN(new_totedge, sizeof(MEdge), __func__)), new_totedge};
   calc_edges::serialize_and_initialize_deduplicated_edges(edge_maps, new_edges);
diff --git a/source/blender/blenkernel/intern/mesh_mapping.cc b/source/blender/blenkernel/intern/mesh_mapping.cc
index 05c2021e647..5266561a092 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.cc
+++ b/source/blender/blenkernel/intern/mesh_mapping.cc
@@ -714,21 +714,20 @@ static void poly_edge_loop_islands_calc(const MEdge *medge,
 
     while (ps_curr_idx != ps_end_idx) {
       const MPoly *mp;
-      int corner_i;
-      int j;
 
       poly = poly_stack[ps_curr_idx++];
       BLI_assert(poly_groups[poly] == poly_group_id);
 
       mp = &mpoly[poly];
-      for (corner_i = mp->loopstart, j = mp->totloop; j--;) {
+      for (const int64_t corner_i : blender::IndexRange(mp->loopstart, mp->totloop)) {
         /* loop over poly users */
         const int me_idx = corner_edges[corner_i];
         const MEdge *me = &medge[me_idx];
         const MeshElemMap *map_ele = &edge_poly_map[me_idx];
         const int *p = map_ele->indices;
         int i = map_ele->count;
-        if (!edge_boundary_check(mp, corner_i, me, i, mpoly, map_ele, edge_boundary_check_data)) {
+        if (!edge_boundary_check(
+                mp, int(corner_i), me, i, mpoly, map_ele, edge_boundary_check_data)) {
           for (; i--; p++) {
             /* if we meet other non initialized its a bug */
             BLI_assert(ELEM(poly_groups[*p], 0, poly_group_id));
diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc
index 1d6c73944db..3569c7b3a1d 100644
--- a/source/blender/blenkernel/intern/mesh_normals.cc
+++ b/source/blender/blenkernel/intern/mesh_normals.cc
@@ -315,7 +315,7 @@ static void calculate_normals_poly_and_vert(const Span<float3> positions,
             const float fac = saacos(-dot_v3v3(edvec_prev, edvec_next));
             const float vnor_add[3] = {pnor[0] * fac, pnor[1] * fac, pnor[2] * fac};
 
-            float *vnor = vert_normals[corner_verts[i_curr]];
+            float *vnor = vert_normals[poly_verts[i_curr]];
             add_v3_v3_atomic(vnor, vnor_add);
             v_curr = v_next;
             copy_v3_v3(edvec_prev, edvec_next);
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index d00283c1392..a5636b91d41 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -425,8 +425,6 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd,
   unit_m4(offset);
   const MEdge *src_edges = BKE_mesh_edges(mesh);
   const MPoly *src_polys = BKE_mesh_polys(mesh);
-  const int *src_corner_verts = BKE_mesh_corner_verts(mesh);
-  const int *src_corner_edges = BKE_mesh_corner_edges(mesh);
 
   if (amd->offset_type & MOD_ARR_OFF_CONST) {
     add_v3_v3(offset[3], amd->offset);
@@ -556,8 +554,6 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd,
     memcpy(result_edges, src_edges, sizeof(MEdge) * mesh->totedge);
   }
   if (!CustomData_has_layer(&mesh->pdata, CD_MPOLY)) {
-    memcpy(result_corner_verts, src_corner_verts, sizeof(int) * mesh->totloop);
-    memcpy(result_corner_edges, src_corner_edges, sizeof(int) * mesh->totloop);
     memcpy(result_polys, src_polys, sizeof(MPoly) * mesh->totpoly);
   }
 
@@ -614,8 +610,8 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd,
     /* adjust loop vertex and edge indices */
     const int chunk_corner_start = c * chunk_nloops;
     for (i = 0; i < chunk_nloops; i++) {
-      result_corner_verts[chunk_corner_start] += c * chunk_nverts;
-      result_corner_edges[chunk_corner_start] += c * chunk_nedges;
+      result_corner_verts[chunk_corner_start + i] += c * chunk_nverts;
+      result_corner_edges[chunk_corner_start + i] += c * chunk_nedges;
     }
 
     /* Handle merge between chunk n and n-1 */
diff --git a/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc b/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc
index ccd9606a72d..ced1711ddea 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc
@@ -125,8 +125,8 @@ static Mesh *hull_from_bullet(const Mesh *mesh, Span<float3> coords)
     face.loopstart = j;
     face.totloop = len;
     for (const int k : IndexRange(len)) {
-      mesh_corner_verts[dst_corner_i] = mesh_corner_verts[loops[k]];
-      mesh_corner_edges[dst_corner_i] = mesh_corner_edges[loops[k]];
+      mesh_corner_verts[dst_corner_i] = corner_verts[loops[k]];
+      mesh_corner_edges[dst_corner_i] = corner_edges[loops[k]];
       dst_corner_i++;
     }
     j += len;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
index 19423cc361f..da932f9e816 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -325,7 +325,7 @@ static void fill_quad_consistent_direction(const Span<int> other_poly_verts,
 {
   /* Find the loop on the polygon connected to the new quad that uses the duplicate edge. */
   bool start_with_connecting_edge = true;
-  for (const int i : other_poly_verts.index_range()) {
+  for (const int i : other_poly_edges.index_range()) {
     if (other_poly_edges[i] == edge_connected_to_poly) {
       start_with_connecting_edge = other_poly_verts[i] == vert_connected_to_poly_1;
       break;
@@ -464,8 +464,8 @@ static void extrude_mesh_edges(Mesh &mesh,
     /* When there was a single polygon connected to the new polygon, we can use the old one to keep
      * the face direction consistent. When there is more than one connected edge, the new face
      * direction is totally arbitrary and the only goal for the behavior is to be deterministic. */
-    Span<int> connected_poly_verts;
-    Span<int> connected_poly_edges;
+    Span<int> connected_poly_verts = {};
+    Span<int> connected_poly_edges = {};
     if (connected_polys.size() == 1) {
       const MPoly &connected_poly = polys[connected_polys.first()];
       connected_poly_verts = corner_verts.slice(connected_poly.loopstart, connected_poly.totloop);
@@ -568,14 +568,13 @@ static void extrude_mesh_edges(Mesh &mesh,
                * polygons that share an edge with the extruded edge. */
               for (const int i_connected_poly : connected_polys.index_range()) {
           

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list