From e6715ad095b10283cac12d5a4bea05892c3df9dd Mon Sep 17 00:00:00 2001
From: Ruan Lucas <79365912+RuanLucasGD@users.noreply.github.com>
Date: Thu, 20 Jul 2023 13:05:56 -0400
Subject: [PATCH] add methods to auto select tangents or points on change edit
mode on spline editor
---
.../CustomEditors/Dedicated/SplineEditor.cs | 69 ++++++++++++++++---
1 file changed, 61 insertions(+), 8 deletions(-)
diff --git a/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs b/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs
index 8c3d03b2b..6d954949c 100644
--- a/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs
+++ b/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs
@@ -3,6 +3,7 @@
using FlaxEngine;
using FlaxEngine.GUI;
using FlaxEditor.Actions;
+using FlaxEditor.SceneGraph;
using FlaxEditor.SceneGraph.Actors;
using FlaxEditor.CustomEditors.Elements;
@@ -93,13 +94,8 @@ namespace FlaxEditor.CustomEditors.Dedicated
{
SetKeyframeLinear(spline, index);
- // if has a tangent selected, change the selection to tangent parent (a spline point / keyframe)
- var currentSelection = Editor.Instance.SceneEditing.Selection;
- if (currentSelection.Count == 1 && currentSelection[0] is SplineNode.SplinePointTangentNode)
- {
- var selectedTangentNode = currentSelection[0] as SplineNode.SplinePointTangentNode;
- Editor.Instance.SceneEditing.Select(selectedTangentNode.ParentNode);
- }
+ // change the selection to tangent parent (a spline point / keyframe)
+ SetSelectSplinePointNode(spline, index);
}
///
@@ -197,7 +193,6 @@ namespace FlaxEditor.CustomEditors.Dedicated
if (keyframe.TangentIn.Translation.Length == 0)
{
var isLastKeyframe = index == spline.SplinePointsCount - 1;
- var isFirstKeyframe = index == 0;
if (!isLastKeyframe)
{
@@ -211,6 +206,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
keyframe.TangentOut.Translation = Vector3.Zero;
spline.SetSplineKeyframe(index, keyframe);
+ SetSelectTangentIn(spline, index);
}
///
@@ -254,6 +250,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
keyframe.TangentIn.Translation = Vector3.Zero;
spline.SetSplineKeyframe(index, keyframe);
+ SetSelectTangentOut(spline, index);
}
///
@@ -618,5 +615,61 @@ namespace FlaxEditor.CustomEditors.Dedicated
keyframe.TangentOut.Translation = slop * tangentOutSize;
spline.SetSplineKeyframe(index, keyframe);
}
+
+ private static SplineNode.SplinePointNode GetSplinePointNode(Spline spline, int index)
+ {
+ return (SplineNode.SplinePointNode)SceneGraphFactory.FindNode(spline.ID).ChildNodes[index];
+ }
+
+ private static SplineNode.SplinePointTangentNode GetSplineTangentInNode(Spline spline, int index)
+ {
+ var point = GetSplinePointNode(spline, index);
+ var tangentIn = spline.GetSplineTangent(index, true);
+ var tangentNodes = point.ChildNodes;
+
+ // find tangent in node comparing all child nodes position
+ for (int i = 0; i < tangentNodes.Count; i++)
+ {
+ if (tangentNodes[i].Transform.Translation == tangentIn.Translation)
+ {
+ return (SplineNode.SplinePointTangentNode)tangentNodes[i];
+ }
+ }
+
+ return null;
+ }
+
+ private static SplineNode.SplinePointTangentNode GetSplineTangentOutNode(Spline spline, int index)
+ {
+ var point = GetSplinePointNode(spline, index);
+ var tangentOut = spline.GetSplineTangent(index, false);
+ var tangentNodes = point.ChildNodes;
+
+ // find tangent out node comparing all child nodes position
+ for (int i = 0; i < tangentNodes.Count; i++)
+ {
+ if (tangentNodes[i].Transform.Translation == tangentOut.Translation)
+ {
+ return (SplineNode.SplinePointTangentNode)tangentNodes[i];
+ }
+ }
+
+ return null;
+ }
+
+ private static void SetSelectSplinePointNode(Spline spline, int index)
+ {
+ Editor.Instance.SceneEditing.Select(GetSplinePointNode(spline, index));
+ }
+
+ private static void SetSelectTangentIn(Spline spline, int index)
+ {
+ Editor.Instance.SceneEditing.Select(GetSplineTangentInNode(spline, index));
+ }
+
+ private static void SetSelectTangentOut(Spline spline, int index)
+ {
+ Editor.Instance.SceneEditing.Select(GetSplineTangentOutNode(spline, index));
+ }
}
}