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:
parent
f013e3de81
commit
524d172742
|
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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]) {
|
||||
|
|
Loading…
Reference in New Issue