[Bf-blender-cvs] [8d4791d92de] temp-geometry-nodes-expandable-geometry-socket-prototype: support array input/output in extrude node

Jacques Lucke noreply at git.blender.org
Fri Aug 6 13:29:06 CEST 2021


Commit: 8d4791d92de980941f0ca1293ecdd06fc6b53525
Author: Jacques Lucke
Date:   Fri Aug 6 13:28:49 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rB8d4791d92de980941f0ca1293ecdd06fc6b53525

support array input/output in extrude node

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

M	source/blender/blenkernel/intern/node.cc
M	source/blender/nodes/geometry/nodes/node_geo_extrude.cc

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

diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 1326717353b..4a5fb2e4e47 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5200,6 +5200,7 @@ static void registerGeometryNodes()
   register_node_type_geo_curve_trim();
   register_node_type_geo_delete_geometry();
   register_node_type_geo_edge_split();
+  register_node_type_geo_extrude();
   register_node_type_geo_geometry_expander();
   register_node_type_geo_input_material();
   register_node_type_geo_is_viewport();
diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude.cc
index 67645b060dc..20a093fabef 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude.cc
@@ -30,19 +30,17 @@
 
 static bNodeSocketTemplate geo_node_extrude_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
-    {SOCK_STRING, N_("Distance")},
+    {SOCK_BOOLEAN, N_("Individual")},
     {SOCK_FLOAT, N_("Distance"), 0.0f, 0, 0, 0, FLT_MIN, FLT_MAX, PROP_DISTANCE},
-    {SOCK_STRING, N_("Inset")},
     {SOCK_FLOAT, N_("Inset"), 0.0f, 0, 0, 0, FLT_MIN, FLT_MAX, PROP_DISTANCE},
-    {SOCK_BOOLEAN, N_("Individual")},
-    {SOCK_STRING, N_("Selection")},
-    {SOCK_STRING, N_("Top Face")},
-    {SOCK_STRING, N_("Side Face")},
+    {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")},
     {-1, ""},
 };
 
@@ -54,20 +52,6 @@ static void geo_node_extrude_layout(uiLayout *layout, bContext *UNUSED(C), Point
   uiItemR(layout, ptr, "inset_mode", 0, nullptr, ICON_NONE);
 }
 
-static void geo_node_extrude_init(bNodeTree *UNUSED(tree), bNode *node)
-{
-  node->custom1 = GEO_NODE_ATTRIBUTE_INPUT_FLOAT;
-  node->custom2 = GEO_NODE_ATTRIBUTE_INPUT_FLOAT;
-}
-
-static void geo_node_extrude_update(bNodeTree *UNUSED(ntree), bNode *node)
-{
-  blender::nodes::update_attribute_input_socket_availabilities(
-      *node, "Distance", (GeometryNodeAttributeInputMode)node->custom1, true);
-  blender::nodes::update_attribute_input_socket_availabilities(
-      *node, "Inset", (GeometryNodeAttributeInputMode)node->custom2, true);
-}
-
 using blender::Span;
 
 static Mesh *extrude_mesh(const Mesh *mesh,
@@ -138,15 +122,18 @@ static void geo_node_extrude_exec(GeoNodeExecParams params)
 
   geometry_set = geometry_set_realize_instances(geometry_set);
 
+  Array<bool> top_faces;
+  Array<bool> side_faces;
+
   MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
   if (mesh_component.has_mesh()) {
     const bool default_selection = true;
-    GVArray_Typed<bool> selection_attribute = params.get_input_attribute<bool>(
-        "Selection", mesh_component, ATTR_DOMAIN_FACE, default_selection);
-    VArray_Span<bool> selection{selection_attribute};
     const Mesh *input_mesh = mesh_component.get_for_read();
-    // const float distance = params.extract_input<float>("Distance");
-    // const float inset = params.extract_input<float>("Inset");
+
+    Array<bool> selection_array = params.extract_input<Array<bool>>("Selection");
+    fn::GVArray_For_RepeatedGSpan selection_repeated{input_mesh->totpoly,
+                                                     selection_array.as_span()};
+    fn::GVArray_Span<bool> selection{selection_repeated};
 
     AttributeDomain attribute_domain = ATTR_DOMAIN_POINT;
     const bool inset_individual_faces = params.extract_input<bool>("Individual");
@@ -154,16 +141,15 @@ static void geo_node_extrude_exec(GeoNodeExecParams params)
     if (inset_individual_faces) {
       attribute_domain = ATTR_DOMAIN_FACE;
     }
+    const int domain_size = mesh_component.attribute_domain_size(attribute_domain);
 
-    const float default_distance = 0;
-    GVArray_Typed<float> distance_attribute = params.get_input_attribute<float>(
-        "Distance", mesh_component, attribute_domain, default_distance);
-    VArray_Span<float> distance{distance_attribute};
+    Array<float> distances_array = params.extract_input<Array<float>>("Distance");
+    fn::GVArray_For_RepeatedGSpan distances_repeated{domain_size, distances_array.as_span()};
+    fn::GVArray_Span<float> distance{distances_repeated};
 
-    const float default_inset = 0;
-    GVArray_Typed<float> inset_attribute = params.get_input_attribute<float>(
-        "Inset", mesh_component, attribute_domain, default_inset);
-    VArray_Span<float> inset{inset_attribute};
+    Array<float> insets_array = params.extract_input<Array<float>>("Inset");
+    fn::GVArray_For_RepeatedGSpan insets_repeated{domain_size, insets_array.as_span()};
+    fn::GVArray_Span<float> inset{insets_repeated};
 
     bool *selection_top_faces_out = nullptr;
     bool *selection_all_faces_out = nullptr;
@@ -177,39 +163,26 @@ static void geo_node_extrude_exec(GeoNodeExecParams params)
                                 &selection_all_faces_out);
 
     const AttributeDomain result_face_domain = ATTR_DOMAIN_FACE;
-    std::string selection_top_faces_out_attribute_name = params.get_input<std::string>("Top Face");
-    std::string selection_side_faces_out_attribute_name = params.get_input<std::string>(
-        "Side Face");
     geometry_set.replace_mesh(result);
 
     MeshComponent &result_mesh_component = geometry_set.get_component_for_write<MeshComponent>();
-    if (!selection_top_faces_out_attribute_name.empty()) {
-
-      OutputAttribute_Typed<bool> selection_top_faces_out_attribute =
-          result_mesh_component.attribute_try_get_for_output_only<bool>(
-              selection_top_faces_out_attribute_name, result_face_domain);
-      Span<bool> selection_faces_top_out_span(selection_top_faces_out, result->totpoly);
-      selection_top_faces_out_attribute->set_all(selection_faces_top_out_span);
-      selection_top_faces_out_attribute.save();
-    }
-    if (!selection_side_faces_out_attribute_name.empty()) {
-      OutputAttribute_Typed<bool> selection_side_faces_out_attribute =
-          result_mesh_component.attribute_try_get_for_output_only<bool>(
-              selection_side_faces_out_attribute_name, result_face_domain);
-      for (const int i : selection_side_faces_out_attribute->index_range()) {
-        if (selection_top_faces_out[i]) {
-          selection_all_faces_out[i] = false;
-        }
+
+    for (const int i : IndexRange(result->totpoly)) {
+      if (selection_top_faces_out[i]) {
+        selection_all_faces_out[i] = false;
       }
-      Span<bool> selection_faces_sides_out_span(selection_all_faces_out, result->totpoly);
-      selection_side_faces_out_attribute->set_all(selection_faces_sides_out_span);
-      selection_side_faces_out_attribute.save();
     }
+
+    top_faces = Span(selection_top_faces_out, result->totpoly);
+    side_faces = Span(selection_all_faces_out, result->totpoly);
+
     MEM_freeN(selection_top_faces_out);
     MEM_freeN(selection_all_faces_out);
   }
 
   params.set_output("Geometry", std::move(geometry_set));
+  params.set_output("Top Face", std::move(top_faces));
+  params.set_output("Side Face", std::move(side_faces));
 }
 }  // namespace blender::nodes
 
@@ -219,8 +192,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);
-  node_type_init(&ntype, geo_node_extrude_init);
-  node_type_update(&ntype, geo_node_extrude_update);
   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