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
This commit is contained in:
Johnny Matthews 2021-11-12 06:44:41 -06:00
parent a47359ff36
commit 3fe735d371
1 changed files with 26 additions and 2 deletions

View File

@ -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()