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:
parent
a47359ff36
commit
3fe735d371
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user