[Bf-blender-cvs] [1183baecbd3] temp-geometry-nodes-extrude-mesh: Fix issues in face mode

Hans Goudey noreply at git.blender.org
Mon Dec 27 23:55:08 CET 2021


Commit: 1183baecbd3ca882086e27eb70bbca19e1fb14b5
Author: Hans Goudey
Date:   Mon Dec 27 16:55:00 2021 -0600
Branches: temp-geometry-nodes-extrude-mesh
https://developer.blender.org/rB1183baecbd3ca882086e27eb70bbca19e1fb14b5

Fix issues in face mode

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

M	source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc

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

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 589cd9e5fed..fb4d7ced8ed 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -149,13 +149,6 @@ static void extrude_mesh_vertices(MeshComponent &component,
   BKE_mesh_normals_tag_dirty(&mesh);
 }
 
-// Array<Vector<int>> selected_edges_of_verts(mesh.totvert);
-// for (const int i : selection) {
-//   const MEdge &edge = mesh.medge[i];
-//   selected_edges_of_verts[edge.v1].append(i);
-//   selected_edges_of_verts[edge.v2].append(i);
-// }
-
 static void extrude_mesh_edges(MeshComponent &component,
                                const Field<bool> &selection_field,
                                const Field<float3> &offset_field)
@@ -217,6 +210,10 @@ static void extrude_mesh_edges(MeshComponent &component,
   MutableSpan<MLoop> loops{mesh.mloop, mesh.totloop};
   MutableSpan<MLoop> new_loops = loops.take_back(new_loop_size);
 
+  for (MVert &vert : new_verts) {
+    vert.flag = 0;
+  }
+
   for (const int i : extrude_edges.index_range()) {
     MEdge &edge = extrude_edges[i];
     edge.v1 = extrude_vert_orig_indices[i];
@@ -322,6 +319,35 @@ static void extrude_mesh_edges(MeshComponent &component,
   BKE_mesh_normals_tag_dirty(&mesh);
 }
 
+static IndexMask index_mask_from_selection(const VArray<bool> &selection,
+                                           Vector<int64_t> &r_indices)
+{
+  if (selection.is_single()) {
+    if (selection.get_internal_single()) {
+      return IndexMask(selection.size());
+    }
+    return IndexMask(0);
+  }
+
+  if (selection.is_span()) {
+    Span<bool> span = selection.get_internal_span();
+    for (const int i : span.index_range()) {
+      if (span[i]) {
+        r_indices.append(i);
+      }
+    }
+  }
+  else {
+    for (const int i : selection.index_range()) {
+      if (selection[i]) {
+        r_indices.append(i);
+      }
+    }
+  }
+
+  return IndexMask(r_indices);
+}
+
 static void extrude_mesh_faces(MeshComponent &component,
                                const Field<bool> &selection_field,
                                const Field<float3> &offset_field)
@@ -332,35 +358,25 @@ static void extrude_mesh_faces(MeshComponent &component,
   Span<MPoly> orig_polys{mesh.mpoly, mesh.totpoly};
   Span<MLoop> orig_loops{mesh.mloop, mesh.totloop};
 
-  GeometryComponentFieldContext edge_context{component, ATTR_DOMAIN_FACE};
-  FieldEvaluator edge_evaluator{edge_context, mesh.totpoly};
-  edge_evaluator.add(selection_field);
-  edge_evaluator.evaluate();
-  const IndexMask poly_selection = edge_evaluator.get_evaluated_as_mask(0);
+  GeometryComponentFieldContext poly_context{component, ATTR_DOMAIN_FACE};
+  FieldEvaluator poly_evaluator{poly_context, mesh.totpoly};
+  poly_evaluator.add(selection_field);
+  poly_evaluator.evaluate();
+  const VArray<bool> &poly_selection_varray = poly_evaluator.get_evaluated<bool>(0);
+  const IndexMask poly_selection = poly_evaluator.get_evaluated_as_mask(0);
+
+  Vector<int64_t> int_selection_indices;
+  const VArray<bool> point_selection_varray = component.attribute_try_adapt_domain(
+      poly_selection_varray, ATTR_DOMAIN_FACE, ATTR_DOMAIN_POINT);
+  const IndexMask point_selection = index_mask_from_selection(point_selection_varray,
+                                                              int_selection_indices);
 
   Array<float3> offsets(orig_vert_size);
   GeometryComponentFieldContext point_context{component, ATTR_DOMAIN_POINT};
-  FieldEvaluator point_evaluator{point_context, orig_vert_size}; /* TODO: Better poly_selection. */
+  FieldEvaluator point_evaluator{point_context, &point_selection};
   point_evaluator.add_with_destination(offset_field, offsets.as_mutable_span());
   point_evaluator.evaluate();
 
-  // Array<Vector<int>> edge_to_poly_map(orig_edge_size);
-  // for (const int i : IndexRange(orig_poly_size)) {
-  //   const MPoly &poly = orig_polys[i];
-  //   for (const MLoop &loop : Span{mesh.mloop + poly.loopstart, poly.totloop}) {
-  //     edge_to_poly_map[loop.e].append(i);
-  //   }
-  // }
-
-  /* Counts the number of selected faces connected to each edge. */
-  // Array<int> edges_to_split(orig_edge_size, 0);
-  // for (const int i : poly_selection) {
-  //   const MPoly &poly = orig_polys[i];
-  //   for (const MLoop &loop : orig_loops.slice(poly.loopstart, poly.totloop)) {
-  //     edges_to_split[loop.e]++;
-  //   }
-  // }
-
   Array<int> edge_neighbor_count(orig_edge_size, 0);
   for (const int i : poly_selection) {
     const MPoly &poly = orig_polys[i];
@@ -428,6 +444,10 @@ static void extrude_mesh_faces(MeshComponent &component,
   MutableSpan<MLoop> loops{mesh.mloop, mesh.totloop};
   MutableSpan<MLoop> new_loops = loops.take_back(new_loop_size);
 
+  for (MVert &vert : new_verts) {
+    vert.flag = 0;
+  }
+
   for (const int i : connect_edges.index_range()) {
     MEdge &edge = connect_edges[i];
     edge.v1 = new_vert_orig_indices[i];
@@ -565,10 +585,15 @@ static void extrude_mesh_faces(MeshComponent &component,
     return true;
   });
 
-  threading::parallel_for(new_verts.index_range(), 1024, [&](const IndexRange range) {
+  threading::parallel_for(point_selection.index_range(), 1024, [&](const IndexRange range) {
     for (const int i : range) {
-      const float3 offset = offsets[new_vert_orig_indices[i]];
-      add_v3_v3(new_verts[i].co, offset);
+      const int orig_vert_index = point_selection[i];
+      const int new_vert_index = new_vert_indices[orig_vert_index];
+      const float3 offset = offsets[orig_vert_index];
+      /* If the vertex is used by a selected edge, it will have been duplicated and only the new
+       * vertex should use the offset. Otherwise the vertex might still need an offset, but it was
+       * reused on the inside of a set of extruded faces. */
+      add_v3_v3(verts[(new_vert_index != -1) ? new_vert_index : orig_vert_index].co, offset);
     }
   });
 
@@ -592,6 +617,7 @@ static void extrude_mesh(MeshComponent &component,
       extrude_mesh_faces(component, selection, offset);
       break;
   }
+  BKE_mesh_calc_normals(component.get_for_write());
   BLI_assert(BKE_mesh_is_valid(component.get_for_write()));
 }



More information about the Bf-blender-cvs mailing list