diff --git a/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs b/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs index a83a8ce35..03d58ef33 100644 --- a/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/SplineEditor.cs @@ -1,12 +1,12 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +using System; using System.Collections.Generic; using FlaxEngine; -using FlaxEngine.GUI; using FlaxEditor.Actions; using FlaxEditor.SceneGraph; using FlaxEditor.SceneGraph.Actors; -using FlaxEditor.CustomEditors.Elements; +using FlaxEditor.GUI.Tabs; namespace FlaxEditor.CustomEditors.Dedicated { @@ -29,42 +29,52 @@ namespace FlaxEditor.CustomEditors.Dedicated /// /// Basis for creating tangent manipulation types for bezier curves. /// - private abstract class EditTangentOptionBase + private class EditTangentOptionBase { /// /// Called when user set selected tangent mode. /// /// Current spline selected on editor viewport. /// Index of current keyframe selected on spline. - public abstract void OnSetMode(Spline spline, int index); + public virtual void OnSetMode(Spline spline, int index) + { + } /// /// Called when user select a keyframe (spline point) of current selected spline on editor viewport. /// /// Current spline selected on editor viewport. /// Index of current keyframe selected on spline. - public abstract void OnSelectKeyframe(Spline spline, int index); + public virtual void OnSelectKeyframe(Spline spline, int index) + { + } /// /// Called when user select a tangent of current keyframe selected from spline. /// /// Current spline selected on editor viewport. /// Index of current keyframe selected on spline. - public abstract void OnSelectTangent(Spline spline, int index); + public virtual void OnSelectTangent(Spline spline, int index) + { + } /// /// Called when the tangent in from current keyframe selected from spline is moved on editor viewport. /// /// Current spline selected on editor viewport. /// Index of current keyframe selected on spline. - public abstract void OnMoveTangentIn(Spline spline, int index); + public virtual void OnMoveTangentIn(Spline spline, int index) + { + } /// /// Called when the tangent out from current keyframe selected from spline is moved on editor viewport. /// /// Current spline selected on editor viewport. /// Current spline selected on editor viewport. - public abstract void OnMoveTangentOut(Spline spline, int index); + public virtual void OnMoveTangentOut(Spline spline, int index) + { + } } /// @@ -80,26 +90,6 @@ namespace FlaxEditor.CustomEditors.Dedicated SetPointSmooth(spline, index); } } - - /// - 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) - { - } } /// @@ -115,26 +105,6 @@ namespace FlaxEditor.CustomEditors.Dedicated // change the selection to tangent parent (a spline point / keyframe) SetSelectSplinePointNode(spline, index); } - - /// - 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) - { - } } /// @@ -154,11 +124,6 @@ namespace FlaxEditor.CustomEditors.Dedicated SmoothIfNotAligned(spline, index); } - /// - public override void OnSelectTangent(Spline selectedSpline, int index) - { - } - /// public override void OnMoveTangentIn(Spline spline, int index) { @@ -209,26 +174,6 @@ namespace FlaxEditor.CustomEditors.Dedicated SetTangentSmoothIn(spline, index); SetSelectTangentIn(spline, index); } - - /// - 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) - { - } } /// @@ -243,41 +188,78 @@ namespace FlaxEditor.CustomEditors.Dedicated SetTangentSmoothOut(spline, index); SetSelectTangentOut(spline, index); } + } - /// - public override void OnMoveTangentIn(Spline spline, int index) + private sealed class IconTab : Tab + { + private sealed class IconTabHeader : Tabs.TabHeader { + public IconTabHeader(Tabs tabs, Tab tab) + : base(tabs, tab) + { + } + + public override bool OnMouseUp(Float2 location, MouseButton button) + { + if (EnabledInHierarchy && Tab.Enabled) + ((IconTab)Tab)._action(); + return true; + } + + public override void Draw() + { + base.Draw(); + + var tab = (IconTab)Tab; + var enabled = EnabledInHierarchy && tab.EnabledInHierarchy; + var style = FlaxEngine.GUI.Style.Current; + var size = Size; + var textHeight = 16.0f; + var iconSize = size.Y - textHeight; + var iconRect = new Rectangle((Width - iconSize) / 2, 0, iconSize, iconSize); + if (tab._mirrorIcon) + { + iconRect.Location.X += iconRect.Size.X; + iconRect.Size.X *= -1; + } + var color = style.Foreground; + if (!enabled) + color *= 0.6f; + Render2D.DrawSprite(tab._customIcon, iconRect, color); + Render2D.DrawText(style.FontMedium, tab._customText, new Rectangle(0, iconSize, size.X, textHeight), color, TextAlignment.Center, TextAlignment.Center); + } } - /// - public override void OnMoveTangentOut(Spline spline, int index) + private readonly Action _action; + private readonly string _customText; + private readonly SpriteHandle _customIcon; + private readonly bool _mirrorIcon; + + public IconTab(Action action, string text, SpriteHandle icon, bool mirrorIcon = false) + : base(string.Empty, SpriteHandle.Invalid) { + _action = action; + _customText = text; + _customIcon = icon; + _mirrorIcon = mirrorIcon; } - /// - public override void OnSelectKeyframe(Spline spline, int index) - { - } - - /// - public override void OnSelectTangent(Spline spline, int index) + public override Tabs.TabHeader CreateHeader() { + return new IconTabHeader((Tabs)Parent, this); } } - private readonly Color HighlightedColor = FlaxEngine.GUI.Style.Current.BackgroundSelected; - private readonly Color SelectedButtonColor = FlaxEngine.GUI.Style.Current.BackgroundSelected; - private readonly Color NormalButtonColor = FlaxEngine.GUI.Style.Current.BackgroundNormal; - private EditTangentOptionBase _currentTangentMode; - private ButtonElement _freeTangentButton; - private ButtonElement _linearTangentButton; - private ButtonElement _alignedTangentButton; - private ButtonElement _smoothInTangentButton; - private ButtonElement _smoothOutTangentButton; - private ButtonElement _setLinearAllTangentsButton; - private ButtonElement _setSmoothAllTangentsButton; + private Tabs _selectedPointsTabs, _allPointsTabs; + private Tab _freeTangentTab; + private Tab _linearTangentTab; + private Tab _alignedTangentTab; + private Tab _smoothInTangentTab; + private Tab _smoothOutTangentTab; + private Tab _setLinearAllTangentsTab; + private Tab _setSmoothAllTangentsTab; private bool _tanInChanged; private bool _tanOutChanged; @@ -289,7 +271,7 @@ namespace FlaxEditor.CustomEditors.Dedicated private SplineNode.SplinePointTangentNode _selectedTangentIn; private SplineNode.SplinePointTangentNode _selectedTangentOut; - private UndoData[] selectedSplinesUndoData; + private UndoData[] _selectedSplinesUndoData; private bool HasPointSelected => _selectedPoint != null; private bool HasTangentsSelected => _selectedTangentIn != null || _selectedTangentOut != null; @@ -300,76 +282,47 @@ namespace FlaxEditor.CustomEditors.Dedicated base.Initialize(layout); _currentTangentMode = new FreeTangentMode(); + if (Values.HasDifferentTypes || !(Values[0] is Spline spline)) + return; + _selectedSpline = spline; - if (Values.HasDifferentTypes == false) + layout.Space(10); + var tabSize = 46; + var icons = Editor.Instance.Icons; + + layout.Header("Selected spline point"); + _selectedPointsTabs = new Tabs { - _selectedSpline = !Values.HasDifferentValues && Values[0] is Spline ? (Spline)Values[0] : null; + Height = tabSize, + TabsSize = new Float2(tabSize), + AutoTabsSize = true, + Parent = layout.ContainerControl, + }; + _linearTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedLinear, "Linear", icons.SplineLinear64)); + _freeTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedFree, "Free", icons.SplineFree64)); + _alignedTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedAligned, "Aligned", icons.SplineAligned64)); + _smoothInTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedSmoothIn, "Smooth In", icons.SplineSmoothIn64)); + _smoothOutTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedSmoothOut, "Smooth Out", icons.SplineSmoothIn64, true)); + _selectedPointsTabs.SelectedTabIndex = -1; - layout.Space(10); + layout.Header("All spline points"); + _allPointsTabs = new Tabs + { + Height = tabSize, + TabsSize = new Float2(tabSize), + AutoTabsSize = true, + Parent = layout.ContainerControl, + }; + _setLinearAllTangentsTab = _allPointsTabs.AddTab(new IconTab(OnSetTangentsLinear, "Set Linear Tangents", icons.SplineLinear64)); + _setSmoothAllTangentsTab = _allPointsTabs.AddTab(new IconTab(OnSetTangentsSmooth, "Set Smooth Tangents", icons.SplineAligned64)); + _allPointsTabs.SelectedTabIndex = -1; - layout.Header("Selected spline point"); - var selectedPointsGrid = layout.CustomContainer(); - selectedPointsGrid.CustomControl.SlotsHorizontally = 3; - selectedPointsGrid.CustomControl.SlotsVertically = 2; + if (_selectedSpline) + _selectedSpline.SplineUpdated += OnSplineEdited; - selectedPointsGrid.Control.Size *= new Float2(1, 2); - - _linearTangentButton = selectedPointsGrid.Button("Linear"); - _freeTangentButton = selectedPointsGrid.Button("Free"); - _alignedTangentButton = selectedPointsGrid.Button("Aligned"); - _smoothInTangentButton = selectedPointsGrid.Button("Smooth In"); - _smoothOutTangentButton = selectedPointsGrid.Button("Smooth Out"); - - _linearTangentButton.Button.BackgroundColorHighlighted = HighlightedColor; - _freeTangentButton.Button.BackgroundColorHighlighted = HighlightedColor; - _alignedTangentButton.Button.BackgroundColorHighlighted = HighlightedColor; - _smoothInTangentButton.Button.BackgroundColorHighlighted = HighlightedColor; - _smoothOutTangentButton.Button.BackgroundColorHighlighted = HighlightedColor; - - _linearTangentButton.Button.Clicked += StartEditSpline; - _freeTangentButton.Button.Clicked += StartEditSpline; - _alignedTangentButton.Button.Clicked += StartEditSpline; - _smoothInTangentButton.Button.Clicked += StartEditSpline; - _smoothOutTangentButton.Button.Clicked += StartEditSpline; - - _linearTangentButton.Button.Clicked += SetModeLinear; - _freeTangentButton.Button.Clicked += SetModeFree; - _alignedTangentButton.Button.Clicked += SetModeAligned; - _smoothInTangentButton.Button.Clicked += SetModeSmoothIn; - _smoothOutTangentButton.Button.Clicked += SetModeSmoothOut; - - _linearTangentButton.Button.Clicked += EndEditSpline; - _freeTangentButton.Button.Clicked += EndEditSpline; - _alignedTangentButton.Button.Clicked += EndEditSpline; - _smoothInTangentButton.Button.Clicked += EndEditSpline; - _smoothOutTangentButton.Button.Clicked += EndEditSpline; - - layout.Header("All spline points"); - var grid = layout.CustomContainer(); - grid.CustomControl.SlotsHorizontally = 2; - grid.CustomControl.SlotsVertically = 1; - - _setLinearAllTangentsButton = grid.Button("Set Linear Tangents"); - _setSmoothAllTangentsButton = grid.Button("Set Smooth Tangents"); - _setLinearAllTangentsButton.Button.BackgroundColorHighlighted = HighlightedColor; - _setSmoothAllTangentsButton.Button.BackgroundColorHighlighted = HighlightedColor; - - _setLinearAllTangentsButton.Button.Clicked += StartEditSpline; - _setSmoothAllTangentsButton.Button.Clicked += StartEditSpline; - - _setLinearAllTangentsButton.Button.Clicked += OnSetTangentsLinear; - _setSmoothAllTangentsButton.Button.Clicked += OnSetTangentsSmooth; - - _setLinearAllTangentsButton.Button.Clicked += EndEditSpline; - _setSmoothAllTangentsButton.Button.Clicked += EndEditSpline; - - if (_selectedSpline) - _selectedSpline.SplineUpdated += OnSplineEdited; - - SetSelectedTangentTypeAsCurrent(); - SetEditButtonsColor(); - SetEditButtonsEnabled(); - } + SetSelectedTangentTypeAsCurrent(); + UpdateEditTabsSelection(); + UpdateButtonsEnabled(); } /// @@ -381,8 +334,8 @@ namespace FlaxEditor.CustomEditors.Dedicated private void OnSplineEdited() { - SetEditButtonsColor(); - SetEditButtonsEnabled(); + UpdateEditTabsSelection(); + UpdateButtonsEnabled(); } /// @@ -394,10 +347,8 @@ namespace FlaxEditor.CustomEditors.Dedicated UpdateSelectedTangent(); if (!CanEditTangent()) - { return; - } - + var index = _lastPointSelected.Index; var currentTangentInPosition = _selectedSpline.GetSplineLocalTangent(index, true).Translation; var currentTangentOutPosition = _selectedSpline.GetSplineLocalTangent(index, false).Translation; @@ -422,7 +373,7 @@ namespace FlaxEditor.CustomEditors.Dedicated currentTangentInPosition = _selectedSpline.GetSplineLocalTangent(index, true).Translation; currentTangentOutPosition = _selectedSpline.GetSplineLocalTangent(index, false).Translation; - // update last tangents position after changes + // Update last tangents position after changes if (_selectedSpline) _lastTanInPos = currentTangentInPosition; if (_selectedSpline) @@ -447,15 +398,12 @@ namespace FlaxEditor.CustomEditors.Dedicated SetModeFree(); } - private void SetEditButtonsColor() + private void UpdateEditTabsSelection() { - if (!CanEditTangent()) + _selectedPointsTabs.Enabled = CanEditTangent(); + if (!_selectedPointsTabs.Enabled) { - _linearTangentButton.Button.BackgroundColor = NormalButtonColor; - _freeTangentButton.Button.BackgroundColor = NormalButtonColor; - _alignedTangentButton.Button.BackgroundColor = NormalButtonColor; - _smoothInTangentButton.Button.BackgroundColor = NormalButtonColor; - _smoothOutTangentButton.Button.BackgroundColor = NormalButtonColor; + _selectedPointsTabs.SelectedTabIndex = -1; return; } @@ -465,22 +413,29 @@ namespace FlaxEditor.CustomEditors.Dedicated var isSmoothIn = _currentTangentMode is SmoothInTangentMode; var isSmoothOut = _currentTangentMode is SmoothOutTangentMode; - _linearTangentButton.Button.BackgroundColor = isLinear ? SelectedButtonColor : NormalButtonColor; - _freeTangentButton.Button.BackgroundColor = isFree ? SelectedButtonColor : NormalButtonColor; - _alignedTangentButton.Button.BackgroundColor = isAligned ? SelectedButtonColor : NormalButtonColor; - _smoothInTangentButton.Button.BackgroundColor = isSmoothIn ? SelectedButtonColor : NormalButtonColor; - _smoothOutTangentButton.Button.BackgroundColor = isSmoothOut ? SelectedButtonColor : NormalButtonColor; + if (isFree) + _selectedPointsTabs.SelectedTab = _freeTangentTab; + else if (isLinear) + _selectedPointsTabs.SelectedTab = _linearTangentTab; + else if (isAligned) + _selectedPointsTabs.SelectedTab = _alignedTangentTab; + else if (isSmoothIn) + _selectedPointsTabs.SelectedTab = _smoothInTangentTab; + else if (isSmoothOut) + _selectedPointsTabs.SelectedTab = _smoothOutTangentTab; + else + _selectedPointsTabs.SelectedTabIndex = -1; } - private void SetEditButtonsEnabled() + private void UpdateButtonsEnabled() { - _linearTangentButton.Button.Enabled = CanEditTangent(); - _freeTangentButton.Button.Enabled = CanEditTangent(); - _alignedTangentButton.Button.Enabled = CanEditTangent(); - _smoothInTangentButton.Button.Enabled = CanSetTangentSmoothIn(); - _smoothOutTangentButton.Button.Enabled = CanSetTangentSmoothOut(); - _setLinearAllTangentsButton.Button.Enabled = CanSetAllTangentsLinear(); - _setSmoothAllTangentsButton.Button.Enabled = CanSetAllTangentsSmooth(); + _linearTangentTab.Enabled = CanEditTangent(); + _freeTangentTab.Enabled = CanEditTangent(); + _alignedTangentTab.Enabled = CanEditTangent(); + _smoothInTangentTab.Enabled = CanSetTangentSmoothIn(); + _smoothOutTangentTab.Enabled = CanSetTangentSmoothOut(); + _setLinearAllTangentsTab.Enabled = CanSetAllTangentsLinear(); + _setSmoothAllTangentsTab.Enabled = CanSetAllTangentsSmooth(); } private bool CanEditTangent() @@ -526,7 +481,6 @@ namespace FlaxEditor.CustomEditors.Dedicated return; _currentTangentMode = new FreeTangentMode(); _currentTangentMode.OnSetMode(_selectedSpline, _lastPointSelected.Index); - SetEditButtonsColor(); } private void SetModeAligned() @@ -562,9 +516,9 @@ namespace FlaxEditor.CustomEditors.Dedicated if (currentSelected == _selectedPoint) return; - if (currentSelected is SplineNode.SplinePointNode) + if (currentSelected is SplineNode.SplinePointNode selectedPoint) { - _selectedPoint = currentSelected as SplineNode.SplinePointNode; + _selectedPoint = selectedPoint; _lastPointSelected = _selectedPoint; _currentTangentMode.OnSelectKeyframe(_selectedSpline, _lastPointSelected.Index); } @@ -579,8 +533,8 @@ namespace FlaxEditor.CustomEditors.Dedicated } SetSelectedTangentTypeAsCurrent(); - SetEditButtonsColor(); - SetEditButtonsEnabled(); + UpdateEditTabsSelection(); + UpdateButtonsEnabled(); } private void UpdateSelectedTangent() @@ -595,7 +549,7 @@ namespace FlaxEditor.CustomEditors.Dedicated var currentSelected = Editor.Instance.SceneEditing.Selection[0]; - if (currentSelected is not SplineNode.SplinePointTangentNode) + if (currentSelected is not SplineNode.SplinePointTangentNode selectedPoint) { _selectedTangentIn = null; _selectedTangentOut = null; @@ -611,7 +565,7 @@ namespace FlaxEditor.CustomEditors.Dedicated if (currentSelected.Transform == _selectedSpline.GetSplineTangent(index, true)) { - _selectedTangentIn = currentSelected as SplineNode.SplinePointTangentNode; + _selectedTangentIn = selectedPoint; _selectedTangentOut = null; _currentTangentMode.OnSelectTangent(_selectedSpline, index); @@ -620,7 +574,7 @@ namespace FlaxEditor.CustomEditors.Dedicated if (currentSelected.Transform == _selectedSpline.GetSplineTangent(index, false)) { - _selectedTangentOut = currentSelected as SplineNode.SplinePointTangentNode; + _selectedTangentOut = selectedPoint; _selectedTangentIn = null; _currentTangentMode.OnSelectTangent(_selectedSpline, index); return; @@ -632,58 +586,91 @@ namespace FlaxEditor.CustomEditors.Dedicated private void StartEditSpline() { - var enableUndo = Presenter.Undo != null && Presenter.Undo.Enabled; - - if (!enableUndo) + if (Presenter.Undo != null && Presenter.Undo.Enabled) { - return; - } - - var splines = new List(); - - for (int i = 0; i < Values.Count; i++) - { - if (Values[i] is Spline spline) + // Capture 'before' state for undo + var splines = new List(); + for (int i = 0; i < Values.Count; i++) { - splines.Add(new UndoData + if (Values[i] is Spline spline) { - Spline = spline, - BeforeKeyframes = spline.SplineKeyframes.Clone() as BezierCurve.Keyframe[] - }); + splines.Add(new UndoData + { + Spline = spline, + BeforeKeyframes = spline.SplineKeyframes.Clone() as BezierCurve.Keyframe[] + }); + } } + _selectedSplinesUndoData = splines.ToArray(); } - - selectedSplinesUndoData = splines.ToArray(); } private void EndEditSpline() { - var enableUndo = Presenter.Undo != null && Presenter.Undo.Enabled; + // Update buttons state + UpdateEditTabsSelection(); - if (!enableUndo) + if (Presenter.Undo != null && Presenter.Undo.Enabled) { - return; + // Add undo + foreach (var splineUndoData in _selectedSplinesUndoData) + { + Presenter.Undo.AddAction(new EditSplineAction(_selectedSpline, splineUndoData.BeforeKeyframes)); + SplineNode.OnSplineEdited(splineUndoData.Spline); + Editor.Instance.Scene.MarkSceneEdited(splineUndoData.Spline.Scene); + } } + } - for (int i = 0; i < selectedSplinesUndoData.Length; i++) - { - var splineUndoData = selectedSplinesUndoData[i]; - Presenter.Undo.AddAction(new EditSplineAction(_selectedSpline, splineUndoData.BeforeKeyframes)); - SplineNode.OnSplineEdited(splineUndoData.Spline); - Editor.Instance.Scene.MarkSceneEdited(splineUndoData.Spline.Scene); - } + private void OnSetSelectedLinear() + { + StartEditSpline(); + SetModeLinear(); + EndEditSpline(); + } + + private void OnSetSelectedFree() + { + StartEditSpline(); + SetModeFree(); + EndEditSpline(); + } + + private void OnSetSelectedAligned() + { + StartEditSpline(); + SetModeAligned(); + EndEditSpline(); + } + + private void OnSetSelectedSmoothIn() + { + StartEditSpline(); + SetModeSmoothIn(); + EndEditSpline(); + } + + private void OnSetSelectedSmoothOut() + { + StartEditSpline(); + SetModeSmoothOut(); + EndEditSpline(); } private void OnSetTangentsLinear() { + StartEditSpline(); _selectedSpline.SetTangentsLinear(); _selectedSpline.UpdateSpline(); + EndEditSpline(); } private void OnSetTangentsSmooth() { + StartEditSpline(); _selectedSpline.SetTangentsSmooth(); _selectedSpline.UpdateSpline(); + EndEditSpline(); } private static bool IsFreeTangentMode(Spline spline, int index) @@ -695,7 +682,6 @@ namespace FlaxEditor.CustomEditors.Dedicated { return false; } - return true; } @@ -710,18 +696,12 @@ namespace FlaxEditor.CustomEditors.Dedicated var keyframe = spline.GetSplineKeyframe(index); var tangentIn = keyframe.TangentIn.Translation; var tangentOut = keyframe.TangentOut.Translation; - if (tangentIn.Length == 0 || tangentOut.Length == 0) - { return false; - } var angleBetweenTwoTangents = Vector3.Dot(tangentIn.Normalized, tangentOut.Normalized); - if (angleBetweenTwoTangents < -0.99f) - { return true; - } return false; } @@ -761,7 +741,7 @@ namespace FlaxEditor.CustomEditors.Dedicated { var keyframe = spline.GetSplineKeyframe(index); - // auto smooth tangent if's linear + // Auto smooth tangent if's linear if (keyframe.TangentIn.Translation.Length == 0) { var smoothRange = SplineNode.NodeSizeByDistance(spline.GetSplineTangent(index, false).Translation, 10f); @@ -780,7 +760,7 @@ namespace FlaxEditor.CustomEditors.Dedicated { var keyframe = spline.GetSplineKeyframe(index); - // auto smooth tangent if's linear + // Auto smooth tangent if's linear if (keyframe.TangentOut.Translation.Length == 0) { var smoothRange = SplineNode.NodeSizeByDistance(spline.GetSplineTangent(index, false).Translation, 10f); @@ -806,13 +786,13 @@ namespace FlaxEditor.CustomEditors.Dedicated var isFirstKeyframe = index <= 0; var smoothRange = SplineNode.NodeSizeByDistance(spline.GetSplinePoint(index), 10f); - // force smooth it's linear point + // Force smooth it's linear point if (tangentInSize == 0f) tangentInSize = smoothRange; if (tangentOutSize == 0f) tangentOutSize = smoothRange; - // try get next / last keyframe + // Try get next / last keyframe var nextKeyframe = !isLastKeyframe ? spline.GetSplineKeyframe(index + 1) : keyframe; var previousKeyframe = !isFirstKeyframe ? spline.GetSplineKeyframe(index - 1) : keyframe;