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);
+ }
}
}