Fix errors on using spline editor in Prefab window

#2383
This commit is contained in:
Wojtek Figat
2024-04-05 16:37:11 +02:00
parent ae79f3ef0b
commit 7578e1dbe3
3 changed files with 49 additions and 32 deletions

View File

@@ -31,6 +31,11 @@ namespace FlaxEditor.CustomEditors.Dedicated
/// </summary>
private class EditTangentOptionBase
{
/// <summary>
/// Spline editor reference.
/// </summary>
public SplineEditor Editor;
/// <summary>
/// Called when user set selected tangent mode.
/// </summary>
@@ -103,7 +108,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
SetKeyframeLinear(spline, index);
// change the selection to tangent parent (a spline point / keyframe)
SetSelectSplinePointNode(spline, index);
Editor.SetSelectSplinePointNode(spline, index);
}
}
@@ -172,7 +177,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
public override void OnSetMode(Spline spline, int index)
{
SetTangentSmoothIn(spline, index);
SetSelectTangentIn(spline, index);
Editor.SetSelectTangentIn(spline, index);
}
}
@@ -186,7 +191,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
public override void OnSetMode(Spline spline, int index)
{
SetTangentSmoothOut(spline, index);
SetSelectTangentOut(spline, index);
Editor.SetSelectTangentOut(spline, index);
}
}
@@ -281,7 +286,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
{
base.Initialize(layout);
_currentTangentMode = new FreeTangentMode();
_currentTangentMode = new FreeTangentMode { Editor = this };
if (Values.HasDifferentTypes || !(Values[0] is Spline spline))
return;
_selectedSpline = spline;
@@ -471,7 +476,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
{
if (_currentTangentMode is LinearTangentMode)
return;
_currentTangentMode = new LinearTangentMode();
_currentTangentMode = new LinearTangentMode { Editor = this };
_currentTangentMode.OnSetMode(_selectedSpline, _lastPointSelected.Index);
}
@@ -479,7 +484,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
{
if (_currentTangentMode is FreeTangentMode)
return;
_currentTangentMode = new FreeTangentMode();
_currentTangentMode = new FreeTangentMode { Editor = this };
_currentTangentMode.OnSetMode(_selectedSpline, _lastPointSelected.Index);
}
@@ -487,7 +492,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
{
if (_currentTangentMode is AlignedTangentMode)
return;
_currentTangentMode = new AlignedTangentMode();
_currentTangentMode = new AlignedTangentMode { Editor = this };
_currentTangentMode.OnSetMode(_selectedSpline, _lastPointSelected.Index);
}
@@ -495,7 +500,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
{
if (_currentTangentMode is SmoothInTangentMode)
return;
_currentTangentMode = new SmoothInTangentMode();
_currentTangentMode = new SmoothInTangentMode { Editor = this };
_currentTangentMode.OnSetMode(_selectedSpline, _lastPointSelected.Index);
}
@@ -503,17 +508,34 @@ namespace FlaxEditor.CustomEditors.Dedicated
{
if (_currentTangentMode is SmoothOutTangentMode)
return;
_currentTangentMode = new SmoothOutTangentMode();
_currentTangentMode = new SmoothOutTangentMode { Editor = this };
_currentTangentMode.OnSetMode(_selectedSpline, _lastPointSelected.Index);
}
private List<SceneGraphNode> GetSelection()
{
if (Presenter.Owner is Windows.Assets.PrefabWindow prefabWindow)
return prefabWindow.Selection;
return Editor.Instance.SceneEditing.Selection;
}
private void Select(SceneGraphNode node)
{
if (Presenter.Owner is Windows.Assets.PrefabWindow prefabWindow)
{
prefabWindow.Select(node);
return;
}
Editor.Instance.SceneEditing.Select(node);
}
private void UpdateSelectedPoint()
{
// works only if select one spline
if (_selectedSpline)
{
var currentSelected = Editor.Instance.SceneEditing.Selection[0];
var selection = GetSelection();
var currentSelected = selection.Count != 0 ? selection[0] : null;
if (currentSelected == _selectedPoint)
return;
if (currentSelected is SplineNode.SplinePointNode selectedPoint)
@@ -540,15 +562,14 @@ namespace FlaxEditor.CustomEditors.Dedicated
private void UpdateSelectedTangent()
{
// works only if select one spline
if (_lastPointSelected == null || Editor.Instance.SceneEditing.SelectionCount != 1)
var selection = GetSelection();
if (_lastPointSelected == null || selection.Count != 1)
{
_selectedTangentIn = null;
_selectedTangentOut = null;
return;
}
var currentSelected = Editor.Instance.SceneEditing.Selection[0];
var currentSelected = selection[0];
if (currentSelected is not SplineNode.SplinePointTangentNode selectedPoint)
{
_selectedTangentIn = null;
@@ -568,10 +589,8 @@ namespace FlaxEditor.CustomEditors.Dedicated
_selectedTangentIn = selectedPoint;
_selectedTangentOut = null;
_currentTangentMode.OnSelectTangent(_selectedSpline, index);
return;
}
if (currentSelected.Transform == _selectedSpline.GetSplineTangent(index, false))
{
_selectedTangentOut = selectedPoint;
@@ -833,7 +852,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
return null;
}
private static SplineNode.SplinePointTangentNode GetSplineTangentOutNode(Spline spline, int index)
private SplineNode.SplinePointTangentNode GetSplineTangentOutNode(Spline spline, int index)
{
var point = GetSplinePointNode(spline, index);
var tangentOut = spline.GetSplineTangent(index, false);
@@ -851,19 +870,19 @@ namespace FlaxEditor.CustomEditors.Dedicated
return null;
}
private static void SetSelectSplinePointNode(Spline spline, int index)
private void SetSelectSplinePointNode(Spline spline, int index)
{
Editor.Instance.SceneEditing.Select(GetSplinePointNode(spline, index));
Select(GetSplinePointNode(spline, index));
}
private static void SetSelectTangentIn(Spline spline, int index)
private void SetSelectTangentIn(Spline spline, int index)
{
Editor.Instance.SceneEditing.Select(GetSplineTangentInNode(spline, index));
Select(GetSplineTangentInNode(spline, index));
}
private static void SetSelectTangentOut(Spline spline, int index)
private void SetSelectTangentOut(Spline spline, int index)
{
Editor.Instance.SceneEditing.Select(GetSplineTangentOutNode(spline, index));
Select(GetSplineTangentOutNode(spline, index));
}
}
}

View File

@@ -49,12 +49,14 @@ namespace FlaxEditor.SceneGraph.Actors
{
get
{
var actor = (Spline)_node.Actor;
return actor.GetSplineTransform(Index);
var actor = (Spline)_node?.Actor;
return actor?.GetSplineTransform(Index) ?? Transform.Identity;
}
set
{
var actor = (Spline)_node.Actor;
var actor = (Spline)_node?.Actor;
if (actor == null)
return;
actor.SetSplineTransform(Index, value);
OnSplineEdited(actor);
}

View File

@@ -91,15 +91,11 @@ namespace FlaxEditor.SceneGraph.Actors
private void OnAddMeshCollider(EditorWindow window)
{
// Allow collider to be added to evey static model selection
SceneGraphNode[] selection = Array.Empty<SceneGraphNode>();
var selection = Array.Empty<SceneGraphNode>();
if (window is SceneTreeWindow)
{
selection = Editor.Instance.SceneEditing.Selection.ToArray();
}
else if (window is PrefabWindow prefabWindow)
{
selection = prefabWindow.Selection.ToArray();
}
var createdNodes = new List<SceneGraphNode>();
foreach (var node in selection)