Fix: "Bake" automatically calculated handles in set handle node

Because these handles are calculated lazily, we need to make sure they
are calculated before switching to a manually positioned mode.
I doubt it would ever be necessary, but theoretically this could happen
on a per-point level, to avoid calculating handles not in the selection.
This commit is contained in:
Hans Goudey 2021-07-22 17:11:26 -04:00
parent f013e3de81
commit 524d172742
2 changed files with 7 additions and 2 deletions

View File

@ -306,6 +306,7 @@ class BezierSpline final : public Spline {
blender::MutableSpan<HandleType> handle_types_right();
blender::Span<blender::float3> handle_positions_right() const;
blender::MutableSpan<blender::float3> handle_positions_right();
void ensure_auto_handles() const;
void translate(const blender::float3 &translation) override;
void transform(const blender::float4x4 &matrix) override;
@ -353,8 +354,6 @@ class BezierSpline final : public Spline {
void correct_end_tangents() const final;
void copy_settings(Spline &dst) const final;
void copy_data(Spline &dst) const final;
void ensure_auto_handles() const;
};
/**

View File

@ -101,6 +101,12 @@ static void geo_node_curve_set_handles_exec(GeoNodeExecParams params)
}
BezierSpline &bezier_spline = static_cast<BezierSpline &>(*spline);
if (ELEM(new_handle_type, BezierSpline::HandleType::Free, BezierSpline::HandleType::Align)) {
/* In this case the automatically calculated handle types need to be "baked", because
* they're possibly changing from a type that is calculated automatically to a type that
* is positioned manually. */
bezier_spline.ensure_auto_handles();
}
has_bezier_spline = true;
for (int i_point : IndexRange(bezier_spline.size())) {
if (selection[point_index]) {