[Bf-blender-cvs] [a7efec6a949] temp-geometry-nodes-extrude-mesh: Cleanup, add selection outputs to all modes, simplify naming

Hans Goudey noreply at git.blender.org
Thu Dec 30 19:59:07 CET 2021


Commit: a7efec6a949079341af4ae665689057097a803c5
Author: Hans Goudey
Date:   Thu Dec 30 12:59:00 2021 -0600
Branches: temp-geometry-nodes-extrude-mesh
https://developer.blender.org/rBa7efec6a949079341af4ae665689057097a803c5

Cleanup, add selection outputs to all modes, simplify naming

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

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 1b063afd98a..6d948612488 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -42,8 +42,8 @@ static void node_declare(NodeDeclarationBuilder &b)
   b.add_input<decl::Bool>(N_("Selection")).default_value(true).supports_field().hide_value();
   b.add_input<decl::Vector>(N_("Offset")).supports_field().subtype(PROP_TRANSLATION);
   b.add_output<decl::Geometry>("Mesh");
-  b.add_output<decl::Bool>(N_("Side Faces")).field_source();
-  b.add_output<decl::Bool>(N_("Top Faces")).field_source();
+  b.add_output<decl::Bool>(N_("Top")).field_source();
+  b.add_output<decl::Bool>(N_("Side")).field_source();
 }
 
 static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -60,17 +60,28 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
   node->storage = data;
 }
 
-static void node_update(bNodeTree *tree, bNode *node)
+struct AttributeOutputs {
+  StrongAnonymousAttributeID top_id;
+  StrongAnonymousAttributeID side_id;
+};
+
+static void save_selection_as_attribute(MeshComponent &component,
+                                        const AnonymousAttributeID *id,
+                                        const AttributeDomain domain,
+                                        const IndexMask selection)
 {
-  const NodeGeometryExtrudeMesh &storage = node_storage(*node);
-  const GeometryNodeExtrudeMeshMode mode = static_cast<GeometryNodeExtrudeMeshMode>(storage.mode);
+  BLI_assert(!component.attribute_exists(id));
 
-  bNodeSocket *mesh = (bNodeSocket *)node->outputs.first;
-  bNodeSocket *side_faces = mesh->next;
-  bNodeSocket *top_faces = side_faces->next;
+  OutputAttribute_Typed<bool> attribute = component.attribute_try_get_for_output_only<bool>(
+      id, domain);
+  if (selection.is_range()) {
+    attribute.as_span().slice(selection.as_range()).fill(true);
+  }
+  else {
+    attribute.as_span().fill_indices(selection, true);
+  }
 
-  nodeSetSocketAvailability(tree, side_faces, mode == GEO_NODE_EXTRUDE_MESH_FACES);
-  nodeSetSocketAvailability(tree, top_faces, mode == GEO_NODE_EXTRUDE_MESH_FACES);
+  attribute.save();
 }
 
 static void expand_mesh_size(Mesh &mesh,
@@ -108,9 +119,12 @@ static void expand_mesh_size(Mesh &mesh,
 
 static void extrude_mesh_vertices(MeshComponent &component,
                                   const Field<bool> &selection_field,
-                                  const Field<float3> &offset_field)
+                                  const Field<float3> &offset_field,
+                                  const AttributeOutputs &attribute_outputs)
 {
   Mesh &mesh = *component.get_for_write();
+  const int orig_vert_size = mesh.totvert;
+  const int orig_edge_size = mesh.totedge;
 
   GeometryComponentFieldContext context{component, ATTR_DOMAIN_POINT};
   FieldEvaluator evaluator{context, mesh.totvert};
@@ -120,19 +134,19 @@ static void extrude_mesh_vertices(MeshComponent &component,
   const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
   const VArray<float3> offsets = evaluator.get_evaluated<float3>(0);
 
-  const int orig_vert_size = mesh.totvert;
   expand_mesh_size(mesh, selection.size(), selection.size(), 0, 0);
 
-  MutableSpan<MVert> verts{mesh.mvert, mesh.totvert};
-  MutableSpan<MEdge> edges{mesh.medge, mesh.totedge};
-  MutableSpan<MVert> new_verts = verts.take_back(selection.size());
-  MutableSpan<MEdge> new_edges = edges.take_back(selection.size());
+  const IndexRange new_vert_range{orig_vert_size, selection.size()};
+  const IndexRange new_edge_range{orig_edge_size, selection.size()};
+
+  MutableSpan<MVert> new_verts = bke::mesh_verts(mesh).slice(new_vert_range);
+  MutableSpan<MEdge> new_edges = bke::mesh_edges(mesh).slice(new_edge_range);
 
   for (const int i_selection : selection.index_range()) {
     MEdge &edge = new_edges[i_selection];
     edge.v1 = selection[i_selection];
     edge.v2 = orig_vert_size + i_selection;
-    edge.flag |= ME_LOOSEEDGE;
+    edge.flag = ME_LOOSEEDGE;
   }
 
   component.attribute_foreach([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
@@ -164,6 +178,15 @@ static void extrude_mesh_vertices(MeshComponent &component,
     });
   });
 
+  if (attribute_outputs.top_id) {
+    save_selection_as_attribute(
+        component, attribute_outputs.top_id.get(), ATTR_DOMAIN_POINT, new_vert_range);
+  }
+  if (attribute_outputs.side_id) {
+    save_selection_as_attribute(
+        component, attribute_outputs.side_id.get(), ATTR_DOMAIN_EDGE, new_edge_range);
+  }
+
   BKE_mesh_runtime_clear_cache(&mesh);
   BKE_mesh_normals_tag_dirty(&mesh);
 
@@ -173,11 +196,13 @@ static void extrude_mesh_vertices(MeshComponent &component,
 
 static void extrude_mesh_edges(MeshComponent &component,
                                const Field<bool> &selection_field,
-                               const Field<float3> &offset_field)
+                               const Field<float3> &offset_field,
+                               const AttributeOutputs &attribute_outputs)
 {
   Mesh &mesh = *component.get_for_write();
   const int orig_vert_size = mesh.totvert;
   Span<MEdge> orig_edges{mesh.medge, mesh.totedge};
+  Span<MPoly> orig_polys{mesh.mpoly, mesh.totpoly};
   const int orig_loop_size = mesh.totloop;
 
   GeometryComponentFieldContext edge_context{component, ATTR_DOMAIN_EDGE};
@@ -212,21 +237,22 @@ static void extrude_mesh_edges(MeshComponent &component,
   point_evaluator.evaluate();
 
   const IndexRange extrude_vert_range{orig_vert_size, extrude_vert_orig_indices.size()};
-  const int extrude_edge_offset = orig_edges.size();
-  const int extrude_edge_size = extrude_vert_range.size();
-  const int duplicate_edge_offset = orig_edges.size() + extrude_vert_range.size();
-  const int duplicate_edge_size = selection.size();
-  const int new_edge_size = extrude_edge_size + duplicate_edge_size;
+  const IndexRange extrude_edge_range{orig_edges.size(), extrude_vert_range.size()};
+  const IndexRange duplicate_edge_range{extrude_edge_range.one_after_last(), selection.size()};
   const int new_poly_size = selection.size();
   const int new_loop_size = new_poly_size * 4;
 
-  expand_mesh_size(mesh, extrude_vert_range.size(), new_edge_size, new_poly_size, new_loop_size);
+  expand_mesh_size(mesh,
+                   extrude_vert_range.size(),
+                   extrude_edge_range.size() + duplicate_edge_range.size(),
+                   new_poly_size,
+                   new_loop_size);
 
   MutableSpan<MVert> verts{mesh.mvert, mesh.totvert};
   MutableSpan<MVert> new_verts = verts.slice(extrude_vert_range);
   MutableSpan<MEdge> edges{mesh.medge, mesh.totedge};
-  MutableSpan<MEdge> extrude_edges = edges.slice(extrude_edge_offset, extrude_edge_size);
-  MutableSpan<MEdge> duplicate_edges = edges.slice(duplicate_edge_offset, duplicate_edge_size);
+  MutableSpan<MEdge> extrude_edges = edges.slice(extrude_edge_range);
+  MutableSpan<MEdge> duplicate_edges = edges.slice(duplicate_edge_range);
   MutableSpan<MPoly> polys{mesh.mpoly, mesh.totpoly};
   MutableSpan<MPoly> new_polys = polys.take_back(selection.size());
   MutableSpan<MLoop> loops{mesh.mloop, mesh.totloop};
@@ -285,13 +311,13 @@ static void extrude_mesh_edges(MeshComponent &component,
     poly_loops[0].v = orig_edge.v1;
     poly_loops[0].e = orig_edge_index;
     poly_loops[1].v = orig_edge.v2;
-    poly_loops[1].e = extrude_edge_offset + extrude_edge_index_2;
+    poly_loops[1].e = extrude_edge_range.start() + extrude_edge_index_2;
     /* The first vertex of the duplicate edge is the extrude edge that isn't used yet. */
     poly_loops[2].v = extrude_edge_1.v1 == orig_edge.v2 ? extrude_edge_2.v1 : extrude_edge_2.v2;
-    poly_loops[2].e = duplicate_edge_offset + i;
+    poly_loops[2].e = duplicate_edge_range.start() + i;
 
     poly_loops[3].v = extrude_edge_2.v1 == orig_edge.v1 ? extrude_edge_1.v1 : extrude_edge_1.v2;
-    poly_loops[3].e = extrude_edge_offset + extrude_edge_index_1;
+    poly_loops[3].e = extrude_edge_range.start() + extrude_edge_index_1;
   }
 
   component.attribute_foreach([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
@@ -318,7 +344,7 @@ static void extrude_mesh_edges(MeshComponent &component,
       attribute_math::convert_to_static_type(meta_data.data_type, [&](auto dummy) {
         using T = decltype(dummy);
         MutableSpan<T> data = attribute.as_span().typed<T>();
-        MutableSpan<T> duplicate_data = data.slice(duplicate_edge_offset, duplicate_edge_size);
+        MutableSpan<T> duplicate_data = data.slice(duplicate_edge_range);
 
         for (const int i : selection.index_range()) {
           duplicate_data[i] = data[selection[i]];
@@ -337,6 +363,17 @@ static void extrude_mesh_edges(MeshComponent &component,
     }
   });
 
+  if (attribute_outputs.top_id) {
+    save_selection_as_attribute(
+        component, attribute_outputs.top_id.get(), ATTR_DOMAIN_EDGE, duplicate_edge_range);
+  }
+  if (attribute_outputs.side_id) {
+    save_selection_as_attribute(component,
+                                attribute_outputs.side_id.get(),
+                                ATTR_DOMAIN_FACE,
+                                IndexRange(orig_polys.size(), new_poly_size));
+  }
+
   BKE_mesh_runtime_clear_cache(&mesh);
   BKE_mesh_normals_tag_dirty(&mesh);
 
@@ -373,15 +410,10 @@ static IndexMask index_mask_from_selection(const VArray<bool> &selection,
   return IndexMask(r_indices);
 }
 
-struct FaceExtrudeAttributeOutputs {
-  StrongAnonymousAttributeID top_faces_id;
-  StrongAnonymousAttributeID side_faces_id;
-};
-
 static void extrude_mesh_faces(MeshComponent &component,
                                const Field<bool> &selection_field,
                                const Field<float3> &offset_field,
-                               FaceExtrudeAttributeOutputs &attribute_outputs)
+                               const AttributeOutputs &attribute_outputs)
 {
   Mesh &mesh = *component.get_for_write();
   const int orig_vert_size = mesh.totvert;
@@ -465,27 +497,31 @@ static void extrude_mes

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list