[Bf-blender-cvs] [bfa882c2f47] temp-geometry-nodes-expandable-geometry-socket-prototype: improve extrude node

Jacques Lucke noreply at git.blender.org
Fri Aug 6 14:36:29 CEST 2021


Commit: bfa882c2f47f78cdb4b937fc94c1d87f0cc31972
Author: Jacques Lucke
Date:   Fri Aug 6 14:36:17 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rBbfa882c2f47f78cdb4b937fc94c1d87f0cc31972

improve extrude node

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

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

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude.cc
index 20a093fabef..69099d88397 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude.cc
@@ -31,27 +31,19 @@
 static bNodeSocketTemplate geo_node_extrude_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
     {SOCK_BOOLEAN, N_("Individual")},
+    {SOCK_BOOLEAN, N_("Selection"), 1, 0, 0, 0, 0, 1, PROP_NONE, SOCK_HIDE_VALUE},
     {SOCK_FLOAT, N_("Distance"), 0.0f, 0, 0, 0, FLT_MIN, FLT_MAX, PROP_DISTANCE},
     {SOCK_FLOAT, N_("Inset"), 0.0f, 0, 0, 0, FLT_MIN, FLT_MAX, PROP_DISTANCE},
-    {SOCK_BOOLEAN, N_("Selection"), 1},
     {-1, ""},
 };
 
 static bNodeSocketTemplate geo_node_extrude_out[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
-    {SOCK_BOOLEAN, N_("Top Face")},
-    {SOCK_BOOLEAN, N_("Side Face")},
+    {SOCK_BOOLEAN, N_("Top Face"), 0, 0, 0, 0, 0, 0, PROP_NONE, SOCK_IS_ATTRIBUTE_OUTPUT},
+    {SOCK_BOOLEAN, N_("Side Face"), 0, 0, 0, 0, 0, 0, PROP_NONE, SOCK_IS_ATTRIBUTE_OUTPUT},
     {-1, ""},
 };
 
-static void geo_node_extrude_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
-{
-  uiLayoutSetPropSep(layout, true);
-  uiLayoutSetPropDecorate(layout, false);
-  uiItemR(layout, ptr, "distance_mode", 0, nullptr, ICON_NONE);
-  uiItemR(layout, ptr, "inset_mode", 0, nullptr, ICON_NONE);
-}
-
 using blender::Span;
 
 static Mesh *extrude_mesh(const Mesh *mesh,
@@ -101,6 +93,7 @@ static Mesh *extrude_mesh(const Mesh *mesh,
   }
   BM_tag_new_faces(bm, &op);
   BMO_op_exec(bm, &op);
+  BMO_op_finish(bm, &op);
 
   CustomData_MeshMasks cd_mask_extra = {CD_MASK_ORIGINDEX, CD_MASK_ORIGINDEX, CD_MASK_ORIGINDEX};
 
@@ -118,6 +111,8 @@ static Mesh *extrude_mesh(const Mesh *mesh,
 namespace blender::nodes {
 static void geo_node_extrude_exec(GeoNodeExecParams params)
 {
+  const bNode &node = params.node();
+  const bNodeTree &ntree = params.ntree();
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
 
   geometry_set = geometry_set_realize_instances(geometry_set);
@@ -127,7 +122,6 @@ static void geo_node_extrude_exec(GeoNodeExecParams params)
 
   MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
   if (mesh_component.has_mesh()) {
-    const bool default_selection = true;
     const Mesh *input_mesh = mesh_component.get_for_read();
 
     Array<bool> selection_array = params.extract_input<Array<bool>>("Selection");
@@ -162,7 +156,6 @@ static void geo_node_extrude_exec(GeoNodeExecParams params)
                                 &selection_top_faces_out,
                                 &selection_all_faces_out);
 
-    const AttributeDomain result_face_domain = ATTR_DOMAIN_FACE;
     geometry_set.replace_mesh(result);
 
     MeshComponent &result_mesh_component = geometry_set.get_component_for_write<MeshComponent>();
@@ -176,6 +169,19 @@ static void geo_node_extrude_exec(GeoNodeExecParams params)
     top_faces = Span(selection_top_faces_out, result->totpoly);
     side_faces = Span(selection_all_faces_out, result->totpoly);
 
+    if (should_add_output_attribute(node, "Top Face")) {
+      std::string attribute_name = get_local_attribute_name(ntree.id.name, node.name, "Top Face");
+      fn::GVArray_For_Span varray{top_faces.as_span()};
+      result_mesh_component.attribute_try_create(
+          attribute_name, ATTR_DOMAIN_FACE, CD_PROP_BOOL, AttributeInitVArray{&varray});
+    }
+    if (should_add_output_attribute(node, "Side Face")) {
+      std::string attribute_name = get_local_attribute_name(ntree.id.name, node.name, "Side Face");
+      fn::GVArray_For_Span varray{side_faces.as_span()};
+      result_mesh_component.attribute_try_create(
+          attribute_name, ATTR_DOMAIN_FACE, CD_PROP_BOOL, AttributeInitVArray{&varray});
+    }
+
     MEM_freeN(selection_top_faces_out);
     MEM_freeN(selection_all_faces_out);
   }
@@ -192,7 +198,6 @@ void register_node_type_geo_extrude()
 
   geo_node_type_base(&ntype, GEO_NODE_EXTRUDE, "Extrude", NODE_CLASS_GEOMETRY, 0);
   node_type_socket_templates(&ntype, geo_node_extrude_in, geo_node_extrude_out);
-  ntype.draw_buttons = geo_node_extrude_layout;
   ntype.geometry_node_execute = blender::nodes::geo_node_extrude_exec;
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list