[Bf-blender-cvs] [3fe735d371f] master: Geometry Nodes: Add Outer Points Selection to Star

Johnny Matthews noreply at git.blender.org
Fri Nov 12 13:45:12 CET 2021


Commit: 3fe735d371f4acd64a1be0e83ebb1b517e8b681a
Author: Johnny Matthews
Date:   Fri Nov 12 06:44:41 2021 -0600
Branches: master
https://developer.blender.org/rB3fe735d371f4acd64a1be0e83ebb1b517e8b681a

Geometry Nodes: Add Outer Points Selection to Star

Adds a boolean field output containing a selection of the
points of the star that are controlled by the outer radius
of the star.

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

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

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

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc
index 7f682b198b3..9004681c246 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc
@@ -42,6 +42,9 @@ static void geo_node_curve_primitive_star_declare(NodeDeclarationBuilder &b)
       .subtype(PROP_ANGLE)
       .description(N_("The counterclockwise rotation of the inner set of points"));
   b.add_output<decl::Geometry>(N_("Curve"));
+  b.add_output<decl::Bool>(N_("Outer Points"))
+      .field_source()
+      .description(N_("An attribute field with a selection of the outer points"));
 }
 
 static std::unique_ptr<CurveEval> create_star_curve(const float inner_radius,
@@ -66,9 +69,22 @@ static std::unique_ptr<CurveEval> create_star_curve(const float inner_radius,
   spline->attributes.reallocate(spline->size());
   curve->add_spline(std::move(spline));
   curve->attributes.reallocate(curve->splines().size());
+
   return curve;
 }
 
+static void create_selection_output(CurveComponent &component,
+                                    StrongAnonymousAttributeID &r_attribute)
+{
+  OutputAttribute_Typed<bool> attribute = component.attribute_try_get_for_output_only<bool>(
+      r_attribute.get(), ATTR_DOMAIN_POINT);
+  MutableSpan<bool> selection = attribute.as_span();
+  for (int i : selection.index_range()) {
+    selection[i] = i % 2 == 0;
+  }
+  attribute.save();
+}
+
 static void geo_node_curve_primitive_star_exec(GeoNodeExecParams params)
 {
   std::unique_ptr<CurveEval> curve = create_star_curve(
@@ -76,9 +92,17 @@ static void geo_node_curve_primitive_star_exec(GeoNodeExecParams params)
       std::max(params.extract_input<float>("Outer Radius"), 0.0f),
       params.extract_input<float>("Twist"),
       std::max(params.extract_input<int>("Points"), 3));
-  params.set_output("Curve", GeometrySet::create_with_curve(curve.release()));
-}
+  GeometrySet output = GeometrySet::create_with_curve(curve.release());
 
+  if (params.output_is_required("Outer Points")) {
+    StrongAnonymousAttributeID attribute_output("Outer Points");
+    create_selection_output(output.get_component_for_write<CurveComponent>(), attribute_output);
+    params.set_output("Outer Points",
+                      AnonymousAttributeFieldInput::Create<bool>(
+                          std::move(attribute_output), params.attribute_producer_name()));
+  }
+  params.set_output("Curve", std::move(output));
+}
 }  // namespace blender::nodes
 
 void register_node_type_geo_curve_primitive_star()



More information about the Bf-blender-cvs mailing list