[Bf-blender-cvs] [1fb364491ba] master: Geometry Nodes: Set Spline Type Node Field Update

guitargeek noreply at git.blender.org
Fri Oct 1 19:01:47 CEST 2021


Commit: 1fb364491bad983a47665b58ec3ea471bfe7d207
Author: guitargeek
Date:   Fri Oct 1 11:59:29 2021 -0500
Branches: master
https://developer.blender.org/rB1fb364491bad983a47665b58ec3ea471bfe7d207

Geometry Nodes: Set Spline Type Node Field Update

This update of the Set Spline Type node allows for a bool field to be
used as the selection of the affected splines.

Differential Revision: https://developer.blender.org/D12522

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/NOD_static_types.h
M	source/blender/nodes/geometry/nodes/legacy/node_geo_curve_spline_type.cc
A	source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 15d49072518..5c16f393041 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -525,6 +525,7 @@ geometry_node_categories = [
         NodeItem("GeometryNodeCurveFill"),
         NodeItem("GeometryNodeCurveTrim"),
         NodeItem("GeometryNodeCurveLength"),
+        NodeItem("GeometryNodeCurveSplineType"),
         NodeItem("GeometryNodeSplineLength"),
         NodeItem("GeometryNodeCurveSubdivide"),
         NodeItem("GeometryNodeCurveParameter"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 2f9204e6705..8dbb6046e3b 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1510,7 +1510,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_PROXIMITY 1096
 #define GEO_NODE_CURVE_SUBDIVIDE 1097
 #define GEO_NODE_INPUT_SPLINE_LENGTH 1098
-
+#define GEO_NODE_CURVE_SPLINE_TYPE 1099
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index c2846b7f6c8..8da66a99e6b 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5713,6 +5713,7 @@ static void registerGeometryNodes()
   register_node_type_geo_legacy_attribute_randomize();
   register_node_type_geo_legacy_material_assign();
   register_node_type_geo_legacy_select_by_material();
+  register_node_type_geo_legacy_curve_spline_type();
   register_node_type_geo_legacy_curve_reverse();
   register_node_type_geo_legacy_curve_subdivide();
 
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index bd8dd237d8c..9bfbc807409 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -209,6 +209,7 @@ set(SRC
   geometry/nodes/node_geo_curve_resample.cc
   geometry/nodes/node_geo_curve_reverse.cc
   geometry/nodes/node_geo_curve_sample.cc
+  geometry/nodes/node_geo_curve_spline_type.cc
   geometry/nodes/node_geo_curve_subdivide.cc
   geometry/nodes/node_geo_curve_to_mesh.cc
   geometry/nodes/node_geo_curve_trim.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 61ab923fd22..a5f00fedc33 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -33,6 +33,7 @@ void register_node_type_geo_legacy_attribute_proximity(void);
 void register_node_type_geo_legacy_attribute_randomize(void);
 void register_node_type_geo_legacy_material_assign(void);
 void register_node_type_geo_legacy_select_by_material(void);
+void register_node_type_geo_legacy_curve_spline_type(void);
 void register_node_type_geo_legacy_curve_reverse(void);
 void register_node_type_geo_legacy_curve_subdivide(void);
 
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index c454fe55f57..1ea1eb76983 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -335,6 +335,7 @@ DefNode(GeometryNode, GEO_NODE_CURVE_PRIMITIVE_QUADRILATERAL, def_geo_curve_prim
 DefNode(GeometryNode, GEO_NODE_CURVE_PRIMITIVE_SPIRAL, 0, "CURVE_PRIMITIVE_SPIRAL", CurveSpiral, "Curve Spiral", "")
 DefNode(GeometryNode, GEO_NODE_CURVE_PRIMITIVE_STAR, 0, "CURVE_PRIMITIVE_STAR", CurveStar, "Star", "")
 DefNode(GeometryNode, GEO_NODE_CURVE_RESAMPLE, def_geo_curve_resample, "CURVE_RESAMPLE", CurveResample, "Resample Curve", "")
+DefNode(GeometryNode, GEO_NODE_CURVE_SPLINE_TYPE, def_geo_curve_spline_type, "CURVE_SPLINE_TYPE", CurveSplineType, "Set Spline Type", "")
 DefNode(GeometryNode, GEO_NODE_CURVE_REVERSE, 0, "CURVE_REVERSE", CurveReverse, "Curve Reverse", "")
 DefNode(GeometryNode, GEO_NODE_CURVE_SAMPLE, def_geo_curve_sample, "CURVE_SAMPLE", CurveSample, "Curve Sample", "")
 DefNode(GeometryNode, GEO_NODE_CURVE_SUBDIVIDE, 0, "CURVE_SUBDIVIDE", CurveSubdivide, "Curve Subdivide", "")
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_curve_spline_type.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_curve_spline_type.cc
index 0ef107fd8a4..44522e990d9 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_curve_spline_type.cc
+++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_curve_spline_type.cc
@@ -25,21 +25,21 @@
 
 namespace blender::nodes {
 
-static void geo_node_curve_spline_type_declare(NodeDeclarationBuilder &b)
+static void geo_node_legacy_curve_spline_type_declare(NodeDeclarationBuilder &b)
 {
   b.add_input<decl::Geometry>("Curve");
   b.add_input<decl::String>("Selection");
   b.add_output<decl::Geometry>("Curve");
 }
 
-static void geo_node_curve_spline_type_layout(uiLayout *layout,
-                                              bContext *UNUSED(C),
-                                              PointerRNA *ptr)
+static void geo_node_legacy_curve_spline_type_layout(uiLayout *layout,
+                                                     bContext *UNUSED(C),
+                                                     PointerRNA *ptr)
 {
   uiItemR(layout, ptr, "spline_type", 0, "", ICON_NONE);
 }
 
-static void geo_node_curve_spline_type_init(bNodeTree *UNUSED(tree), bNode *node)
+static void geo_node_legacy_curve_spline_type_init(bNodeTree *UNUSED(tree), bNode *node)
 {
   NodeGeometryCurveSplineType *data = (NodeGeometryCurveSplineType *)MEM_callocN(
       sizeof(NodeGeometryCurveSplineType), __func__);
@@ -238,7 +238,7 @@ static SplinePtr convert_to_nurbs(const Spline &input)
   return {};
 }
 
-static void geo_node_curve_spline_type_exec(GeoNodeExecParams params)
+static void geo_node_legacy_curve_spline_type_exec(GeoNodeExecParams params)
 {
   const NodeGeometryCurveSplineType *storage =
       (const NodeGeometryCurveSplineType *)params.node().storage;
@@ -284,19 +284,19 @@ static void geo_node_curve_spline_type_exec(GeoNodeExecParams params)
 
 }  // namespace blender::nodes
 
-void register_node_type_geo_curve_spline_type()
+void register_node_type_geo_legacy_curve_spline_type()
 {
   static bNodeType ntype;
   geo_node_type_base(
       &ntype, GEO_NODE_LEGACY_CURVE_SPLINE_TYPE, "Set Spline Type", NODE_CLASS_GEOMETRY, 0);
-  ntype.declare = blender::nodes::geo_node_curve_spline_type_declare;
-  ntype.geometry_node_execute = blender::nodes::geo_node_curve_spline_type_exec;
-  node_type_init(&ntype, blender::nodes::geo_node_curve_spline_type_init);
+  ntype.declare = blender::nodes::geo_node_legacy_curve_spline_type_declare;
+  ntype.geometry_node_execute = blender::nodes::geo_node_legacy_curve_spline_type_exec;
+  node_type_init(&ntype, blender::nodes::geo_node_legacy_curve_spline_type_init);
   node_type_storage(&ntype,
                     "NodeGeometryCurveSplineType",
                     node_free_standard_storage,
                     node_copy_standard_storage);
-  ntype.draw_buttons = blender::nodes::geo_node_curve_spline_type_layout;
+  ntype.draw_buttons = blender::nodes::geo_node_legacy_curve_spline_type_layout;
 
   nodeRegisterType(&ntype);
 }
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_curve_spline_type.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc
similarity index 84%
copy from source/blender/nodes/geometry/nodes/legacy/node_geo_curve_spline_type.cc
copy to source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc
index 0ef107fd8a4..ec72154db13 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_curve_spline_type.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc
@@ -28,7 +28,7 @@ namespace blender::nodes {
 static void geo_node_curve_spline_type_declare(NodeDeclarationBuilder &b)
 {
   b.add_input<decl::Geometry>("Curve");
-  b.add_input<decl::String>("Selection");
+  b.add_input<decl::Bool>("Selection").default_value(true).hide_value().supports_field();
   b.add_output<decl::Geometry>("Curve");
 }
 
@@ -245,41 +245,47 @@ static void geo_node_curve_spline_type_exec(GeoNodeExecParams params)
   const GeometryNodeSplineType output_type = (const GeometryNodeSplineType)storage->spline_type;
 
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
-  geometry_set = bke::geometry_set_realize_instances(geometry_set);
-  if (!geometry_set.has_curve()) {
-    params.set_output("Curve", geometry_set);
-    return;
-  }
+  Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
 
-  const CurveComponent *curve_component = geometry_set.get_component_for_read<CurveComponent>();
-  const CurveEval &curve = *curve_component->get_for_read();
-
-  const std::string selection_name = params.extract_input<std::string>("Selection");
-  GVArray_Typed<bool> selection = curve_component->attribute_get_for_read(
-      selection_name, ATTR_DOMAIN_CURVE, true);
-
-  std::unique_ptr<CurveEval> new_curve = std::make_unique<CurveEval>();
-  for (const int i : curve.splines().index_range()) {
-    if (selection[i]) {
-      switch (output_type) {
-        case GEO_NODE_SPLINE_TYPE_POLY:
-          new_curve->add_spline(convert_to_poly_spline(*curve.splines()[i]));
-          break;
-        case GEO_NODE_SPLINE_TYPE_BEZIER:
-          new_curve->add_spline(convert_to_bezier(*curve.splines()[i], params));
-          break;
-        case GEO_NODE_SPLINE_TYPE_NURBS:
-          new_curve->add_spline(convert_to_nurbs(*curve.splines()[i]));
-          break;
-      }
+  geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
+    if (!geometry_set.has_curve()) {
+      return;
     }
-    else {
-      new_curve->add_spline(curve.splines()[i]->copy());
+
+    const CurveComponent *curve_component = geometry_set.get_component_for_read<CurveComponent>();
+    const CurveEval &curve = *curve_component->get_for_read();
+    GeometryComponentFieldContext field_context{*curve_component, ATTR_DOMAIN_CURVE};
+    const int domain_size = curve_component->attribute_domain_size(ATTR_DOMAIN_CURVE);
+
+    fn::FieldEvaluator selection_evaluator{field_context, domain_size};
+    selection_evaluator.add(selection_field);
+    selection_eval

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list