smooth point on set linear point to free

This commit is contained in:
Ruan Lucas
2023-07-20 09:36:05 -04:00
parent e40c0be00d
commit 902a3c1eed

View File

@@ -61,6 +61,15 @@ namespace FlaxEditor.CustomEditors.Dedicated
/// </summary>
private sealed class FreeTangentMode : EditTangentOptionBase
{
/// <inheritdoc/>
public override void OnSetMode(Spline spline, int index)
{
if (IsLinearTangentMode(spline, index))
{
SetPointSmooth(spline, index);
}
}
/// <inheritdoc/>
public override void OnMoveTangentIn(Spline spline, int index) { }
@@ -72,9 +81,6 @@ namespace FlaxEditor.CustomEditors.Dedicated
/// <inheritdoc/>
public override void OnSelectTangent(Spline spline, int index) { }
/// <inheritdoc/>
public override void OnSetMode(Spline spline, int index) { }
}
/// <summary>
@@ -82,18 +88,6 @@ namespace FlaxEditor.CustomEditors.Dedicated
/// </summary>
private sealed class LinearTangentMode : EditTangentOptionBase
{
/// <inheritdoc/>
public override void OnMoveTangentIn(Spline spline, int index) { }
/// <inheritdoc/>
public override void OnMoveTangentOut(Spline spline, int index) { }
/// <inheritdoc/>
public override void OnSelectKeyframe(Spline spline, int index) { }
/// <inheritdoc/>
public override void OnSelectTangent(Spline spline, int index) { }
/// <inheritdoc/>
public override void OnSetMode(Spline spline, int index)
{
@@ -108,6 +102,18 @@ namespace FlaxEditor.CustomEditors.Dedicated
}
}
/// <inheritdoc/>
public override void OnMoveTangentIn(Spline spline, int index) { }
/// <inheritdoc/>
public override void OnMoveTangentOut(Spline spline, int index) { }
/// <inheritdoc/>
public override void OnSelectKeyframe(Spline spline, int index) { }
/// <inheritdoc/>
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);
}
}
}