From aa3dd14bfcdcdd1e1f698d0cbcd345b95872aae6 Mon Sep 17 00:00:00 2001 From: Ruan Lucas <79365912+RuanLucasGD@users.noreply.github.com> Date: Thu, 10 Aug 2023 22:24:55 -0400 Subject: [PATCH 1/6] add locked focus --- Source/Editor/Options/InputOptions.cs | 4 ++ .../Viewport/MainEditorGizmoViewport.cs | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/Source/Editor/Options/InputOptions.cs b/Source/Editor/Options/InputOptions.cs index 4f2b40514..225f79b83 100644 --- a/Source/Editor/Options/InputOptions.cs +++ b/Source/Editor/Options/InputOptions.cs @@ -60,6 +60,10 @@ namespace FlaxEditor.Options [EditorDisplay("Common"), EditorOrder(200)] public InputBinding FocusSelection = new InputBinding(KeyboardKeys.F); + [DefaultValue(typeof(InputBinding), "F")] + [EditorDisplay("Common"), EditorOrder(200)] + public InputBinding LockFocusSelection = new InputBinding(KeyboardKeys.F, KeyboardKeys.Shift); + [DefaultValue(typeof(InputBinding), "Ctrl+F")] [EditorDisplay("Common"), EditorOrder(210)] public InputBinding Search = new InputBinding(KeyboardKeys.F, KeyboardKeys.Control); diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index 48cd4fd98..78e5cbf56 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -133,6 +133,7 @@ namespace FlaxEditor.Viewport } } + private bool _lockedFocus; private readonly ViewportDebugDrawData _debugDrawData = new ViewportDebugDrawData(32); private StaticModel _previewStaticModel; private int _previewModelEntryIndex; @@ -386,11 +387,40 @@ namespace FlaxEditor.Viewport InputActions.Add(options => options.TranslateMode, () => TransformGizmo.ActiveMode = TransformGizmoBase.Mode.Translate); InputActions.Add(options => options.RotateMode, () => TransformGizmo.ActiveMode = TransformGizmoBase.Mode.Rotate); InputActions.Add(options => options.ScaleMode, () => TransformGizmo.ActiveMode = TransformGizmoBase.Mode.Scale); + + InputActions.Add(options => options.LockFocusSelection, LockFocusSelection); InputActions.Add(options => options.FocusSelection, FocusSelection); InputActions.Add(options => options.RotateSelection, RotateSelection); InputActions.Add(options => options.Delete, _editor.SceneEditing.Delete); } + public override void Update(float deltaTime) + { + base.Update(deltaTime); + + var hasSelections = TransformGizmo.SelectedParents.Count != 0; + var requestUnlockFocus = FlaxEngine.Input.Mouse.GetButtonDown(MouseButton.Right) || FlaxEngine.Input.Mouse.GetButtonDown(MouseButton.Left); + + if ((IsFocused && requestUnlockFocus) || !hasSelections) + { + UnlockFocusSelection(); + } + + if (_lockedFocus) + { + BoundingSphere selectionBounds = BoundingSphere.Empty; + for (int i = 0; i < TransformGizmo.SelectedParents.Count; i++) + { + TransformGizmo.SelectedParents[i].GetEditorSphere(out var sphere); + BoundingSphere.Merge(ref selectionBounds, ref sphere, out selectionBounds); + } + + var focusDistance = Mathf.Max(selectionBounds.Radius * 2f, 100f); + var viewportPosition = selectionBounds.Center + (-ViewDirection * focusDistance); + ViewPosition = viewportPosition; + } + } + /// /// Overrides the selection outline effect or restored the default one. /// @@ -753,6 +783,22 @@ namespace FlaxEditor.Viewport FocusSelection(ref orientation); } + /// + /// Lock focus on the current selection gizmo. + /// + public void LockFocusSelection() + { + _lockedFocus = true; + } + + /// + /// Unlock focus on the current selection. + /// + public void UnlockFocusSelection() + { + _lockedFocus = false; + } + /// /// Focuses the viewport on the current selection of the gizmo. /// From f2072028d4e5a488296784f14d1ca7dee6d8775e Mon Sep 17 00:00:00 2001 From: Ruan Lucas <79365912+RuanLucasGD@users.noreply.github.com> Date: Thu, 10 Aug 2023 22:31:03 -0400 Subject: [PATCH 2/6] change default key --- Source/Editor/Options/InputOptions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Editor/Options/InputOptions.cs b/Source/Editor/Options/InputOptions.cs index 225f79b83..e0a51622b 100644 --- a/Source/Editor/Options/InputOptions.cs +++ b/Source/Editor/Options/InputOptions.cs @@ -60,7 +60,7 @@ namespace FlaxEditor.Options [EditorDisplay("Common"), EditorOrder(200)] public InputBinding FocusSelection = new InputBinding(KeyboardKeys.F); - [DefaultValue(typeof(InputBinding), "F")] + [DefaultValue(typeof(InputBinding), "Shift+F")] [EditorDisplay("Common"), EditorOrder(200)] public InputBinding LockFocusSelection = new InputBinding(KeyboardKeys.F, KeyboardKeys.Shift); From 645977f14824623b409601cfd6d96c127e4bc339 Mon Sep 17 00:00:00 2001 From: Ruan Lucas <79365912+RuanLucasGD@users.noreply.github.com> Date: Thu, 10 Aug 2023 22:41:48 -0400 Subject: [PATCH 3/6] add scroll to focus --- Source/Editor/Viewport/MainEditorGizmoViewport.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index 78e5cbf56..90a5b8f22 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -134,6 +134,7 @@ namespace FlaxEditor.Viewport } private bool _lockedFocus; + private float _lockedFocusOffset; private readonly ViewportDebugDrawData _debugDrawData = new ViewportDebugDrawData(32); private StaticModel _previewStaticModel; private int _previewModelEntryIndex; @@ -408,7 +409,7 @@ namespace FlaxEditor.Viewport if (_lockedFocus) { - BoundingSphere selectionBounds = BoundingSphere.Empty; + var selectionBounds = BoundingSphere.Empty; for (int i = 0; i < TransformGizmo.SelectedParents.Count; i++) { TransformGizmo.SelectedParents[i].GetEditorSphere(out var sphere); @@ -416,7 +417,14 @@ namespace FlaxEditor.Viewport } var focusDistance = Mathf.Max(selectionBounds.Radius * 2f, 100f); - var viewportPosition = selectionBounds.Center + (-ViewDirection * focusDistance); + + if (IsFocused) + { + _lockedFocusOffset += -FlaxEngine.Input.Mouse.ScrollDelta * focusDistance; + } + + var viewportPosition = selectionBounds.Center + (-ViewDirection * (focusDistance + _lockedFocusOffset)); + ViewPosition = viewportPosition; } } @@ -797,6 +805,7 @@ namespace FlaxEditor.Viewport public void UnlockFocusSelection() { _lockedFocus = false; + _lockedFocusOffset = 0f; } /// From db806ad500a9c07cdd318654d0f76b26f58b4c76 Mon Sep 17 00:00:00 2001 From: Ruan Lucas <79365912+RuanLucasGD@users.noreply.github.com> Date: Fri, 11 Aug 2023 08:28:28 -0400 Subject: [PATCH 4/6] fix for large worlds --- Source/Editor/Viewport/MainEditorGizmoViewport.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index 90a5b8f22..a40ff5369 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -134,7 +134,7 @@ namespace FlaxEditor.Viewport } private bool _lockedFocus; - private float _lockedFocusOffset; + private double _lockedFocusOffset; private readonly ViewportDebugDrawData _debugDrawData = new ViewportDebugDrawData(32); private StaticModel _previewStaticModel; private int _previewModelEntryIndex; @@ -416,7 +416,7 @@ namespace FlaxEditor.Viewport BoundingSphere.Merge(ref selectionBounds, ref sphere, out selectionBounds); } - var focusDistance = Mathf.Max(selectionBounds.Radius * 2f, 100f); + var focusDistance = Mathf.Max(selectionBounds.Radius * 2d, 100d); if (IsFocused) { From be33fc6018fb4241f7848b876e3bed8efff2c173 Mon Sep 17 00:00:00 2001 From: Ruan Lucas <79365912+RuanLucasGD@users.noreply.github.com> Date: Fri, 11 Aug 2023 22:31:12 -0400 Subject: [PATCH 5/6] improv scroll locked focus --- Source/Editor/Viewport/MainEditorGizmoViewport.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index a40ff5369..3132faf39 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -420,7 +420,8 @@ namespace FlaxEditor.Viewport if (IsFocused) { - _lockedFocusOffset += -FlaxEngine.Input.Mouse.ScrollDelta * focusDistance; + var viewportFocusDistance = Vector3.Distance(ViewPosition, selectionBounds.Center) / 10f; + _lockedFocusOffset -= FlaxEngine.Input.Mouse.ScrollDelta * viewportFocusDistance; } var viewportPosition = selectionBounds.Center + (-ViewDirection * (focusDistance + _lockedFocusOffset)); From 95fdcf01bea08b91eed198c22f396576ed58ece1 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 14 Aug 2023 18:53:11 +0200 Subject: [PATCH 6/6] Codestyle fix --- .../Viewport/MainEditorGizmoViewport.cs | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index 3132faf39..8d7039dc6 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -388,45 +388,40 @@ namespace FlaxEditor.Viewport InputActions.Add(options => options.TranslateMode, () => TransformGizmo.ActiveMode = TransformGizmoBase.Mode.Translate); InputActions.Add(options => options.RotateMode, () => TransformGizmo.ActiveMode = TransformGizmoBase.Mode.Rotate); InputActions.Add(options => options.ScaleMode, () => TransformGizmo.ActiveMode = TransformGizmoBase.Mode.Scale); - InputActions.Add(options => options.LockFocusSelection, LockFocusSelection); InputActions.Add(options => options.FocusSelection, FocusSelection); InputActions.Add(options => options.RotateSelection, RotateSelection); InputActions.Add(options => options.Delete, _editor.SceneEditing.Delete); } + /// public override void Update(float deltaTime) { base.Update(deltaTime); - var hasSelections = TransformGizmo.SelectedParents.Count != 0; + var selection = TransformGizmo.SelectedParents; var requestUnlockFocus = FlaxEngine.Input.Mouse.GetButtonDown(MouseButton.Right) || FlaxEngine.Input.Mouse.GetButtonDown(MouseButton.Left); - - if ((IsFocused && requestUnlockFocus) || !hasSelections) + if (TransformGizmo.SelectedParents.Count == 0 || (requestUnlockFocus && ContainsFocus)) { UnlockFocusSelection(); } - - if (_lockedFocus) + else if (_lockedFocus) { var selectionBounds = BoundingSphere.Empty; - for (int i = 0; i < TransformGizmo.SelectedParents.Count; i++) + for (int i = 0; i < selection.Count; i++) { - TransformGizmo.SelectedParents[i].GetEditorSphere(out var sphere); + selection[i].GetEditorSphere(out var sphere); BoundingSphere.Merge(ref selectionBounds, ref sphere, out selectionBounds); } - var focusDistance = Mathf.Max(selectionBounds.Radius * 2d, 100d); - - if (IsFocused) + if (ContainsFocus) { var viewportFocusDistance = Vector3.Distance(ViewPosition, selectionBounds.Center) / 10f; _lockedFocusOffset -= FlaxEngine.Input.Mouse.ScrollDelta * viewportFocusDistance; } - var viewportPosition = selectionBounds.Center + (-ViewDirection * (focusDistance + _lockedFocusOffset)); - - ViewPosition = viewportPosition; + var focusDistance = Mathf.Max(selectionBounds.Radius * 2d, 100d); + ViewPosition = selectionBounds.Center + (-ViewDirection * (focusDistance + _lockedFocusOffset)); } }