From 902a3c1eed974f9ca1ef58c47cc5c7cf013b9b83 Mon Sep 17 00:00:00 2001 From: Ruan Lucas <79365912+RuanLucasGD@users.noreply.github.com> Date: Thu, 20 Jul 2023 09:36:05 -0400 Subject: [PATCH] smooth point on set linear point to free --- .../CustomEditors/Dedicated/SplineEditor.cs | 88 ++++++++++--------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs b/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs index e26a05f69..4df665b15 100644 --- a/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs @@ -61,6 +61,15 @@ namespace FlaxEditor.CustomEditors.Dedicated /// private sealed class FreeTangentMode : EditTangentOptionBase { + /// + public override void OnSetMode(Spline spline, int index) + { + if (IsLinearTangentMode(spline, index)) + { + SetPointSmooth(spline, index); + } + } + /// public override void OnMoveTangentIn(Spline spline, int index) { } @@ -72,9 +81,6 @@ namespace FlaxEditor.CustomEditors.Dedicated /// public override void OnSelectTangent(Spline spline, int index) { } - - /// - public override void OnSetMode(Spline spline, int index) { } } /// @@ -82,18 +88,6 @@ namespace FlaxEditor.CustomEditors.Dedicated /// private sealed class LinearTangentMode : EditTangentOptionBase { - /// - public override void OnMoveTangentIn(Spline spline, int index) { } - - /// - public override void OnMoveTangentOut(Spline spline, int index) { } - - /// - public override void OnSelectKeyframe(Spline spline, int index) { } - - /// - public override void OnSelectTangent(Spline spline, int index) { } - /// public override void OnSetMode(Spline spline, int index) { @@ -108,6 +102,18 @@ namespace FlaxEditor.CustomEditors.Dedicated } } + /// + public override void OnMoveTangentIn(Spline spline, int index) { } + + /// + public override void OnMoveTangentOut(Spline spline, int index) { } + + /// + public override void OnSelectKeyframe(Spline spline, int index) { } + + /// + public override void OnSelectTangent(Spline spline, int index) { } + private void SetKeyframeLinear(Spline spline, int index) { var tangentIn = spline.GetSplineTangent(index, true); @@ -160,32 +166,6 @@ namespace FlaxEditor.CustomEditors.Dedicated } } - private void SetPointSmooth(Spline spline, int index) - { - var keyframe = spline.GetSplineKeyframe(index); - var tangentIn = keyframe.TangentIn; - var tangentOut = keyframe.TangentOut; - var tangentInSize = tangentIn.Translation.Length; - var tangentOutSize = tangentOut.Translation.Length; - - var isLastKeyframe = index >= spline.SplinePointsCount - 1; - var isFirstKeyframe = index <= 0; - - // force smooth it's linear point - if (tangentInSize == 0f && !isFirstKeyframe) tangentInSize = 100; - if (tangentOutSize == 0f && !isLastKeyframe) tangentOutSize = 100; - - var nextKeyframe = !isLastKeyframe ? spline.GetSplineKeyframe(index + 1) : keyframe; - var previousKeyframe = !isFirstKeyframe ? spline.GetSplineKeyframe(index - 1) : keyframe; - - // calc form from Spline.cpp -> SetTangentsSmooth - var slop = (keyframe.Value.Translation - previousKeyframe.Value.Translation + nextKeyframe.Value.Translation - keyframe.Value.Translation).Normalized; - - keyframe.TangentIn.Translation = -slop * tangentInSize; - keyframe.TangentOut.Translation = slop * tangentOutSize; - spline.SetSplineKeyframe(index, keyframe); - } - private void SetPointAligned(Spline spline, int index, bool isIn) { var keyframe = spline.GetSplineKeyframe(index); @@ -480,5 +460,31 @@ namespace FlaxEditor.CustomEditors.Dedicated return false; } + + private static void SetPointSmooth(Spline spline, int index) + { + var keyframe = spline.GetSplineKeyframe(index); + var tangentIn = keyframe.TangentIn; + var tangentOut = keyframe.TangentOut; + var tangentInSize = tangentIn.Translation.Length; + var tangentOutSize = tangentOut.Translation.Length; + + var isLastKeyframe = index >= spline.SplinePointsCount - 1; + var isFirstKeyframe = index <= 0; + + // force smooth it's linear point + if (tangentInSize == 0f && !isFirstKeyframe) tangentInSize = 100; + if (tangentOutSize == 0f && !isLastKeyframe) tangentOutSize = 100; + + var nextKeyframe = !isLastKeyframe ? spline.GetSplineKeyframe(index + 1) : keyframe; + var previousKeyframe = !isFirstKeyframe ? spline.GetSplineKeyframe(index - 1) : keyframe; + + // calc form from Spline.cpp -> SetTangentsSmooth + var slop = (keyframe.Value.Translation - previousKeyframe.Value.Translation + nextKeyframe.Value.Translation - keyframe.Value.Translation).Normalized; + + keyframe.TangentIn.Translation = -slop * tangentInSize; + keyframe.TangentOut.Translation = slop * tangentOutSize; + spline.SetSplineKeyframe(index, keyframe); + } } }