From f32ea923364bb289fc1d633ab82ff8533db016c0 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 18 Mar 2021 18:23:11 +0100 Subject: [PATCH] Fix editor viewport camera orbiting issues #354 --- Source/Editor/Viewport/Cameras/FPSCamera.cs | 25 +++---- Source/Editor/Viewport/EditorGizmoViewport.cs | 2 +- Source/Editor/Viewport/EditorViewport.cs | 65 ++++++++----------- .../Editor/Viewport/PrefabWindowViewport.cs | 2 +- 4 files changed, 43 insertions(+), 51 deletions(-) diff --git a/Source/Editor/Viewport/Cameras/FPSCamera.cs b/Source/Editor/Viewport/Cameras/FPSCamera.cs index 1079b7560..374d01ccc 100644 --- a/Source/Editor/Viewport/Cameras/FPSCamera.cs +++ b/Source/Editor/Viewport/Cameras/FPSCamera.cs @@ -88,7 +88,7 @@ namespace FlaxEditor.Viewport.Cameras Editor.GetActorEditorSphere(actor, out BoundingSphere sphere); ShowSphere(ref sphere); } - + /// /// Moves the viewport to visualize selected actors. /// @@ -144,7 +144,7 @@ namespace FlaxEditor.Viewport.Cameras ShowSphere(ref mergesSphere, ref orientation); } - + private void ShowSphere(ref BoundingSphere sphere) { var q = new Quaternion(0.424461186f, -0.0940724313f, 0.0443938486f, 0.899451137f); @@ -154,18 +154,19 @@ namespace FlaxEditor.Viewport.Cameras private void ShowSphere(ref BoundingSphere sphere, ref Quaternion orientation) { Vector3 position; - if (Viewport.UseOrthographicProjection) { position = sphere.Center + Vector3.Backward * orientation * (sphere.Radius * 5.0f); Viewport.OrthographicScale = Vector3.Distance(position, sphere.Center) / 1000; } else + { position = sphere.Center - Vector3.Forward * orientation * (sphere.Radius * 2.5f); - TargetPoint = position; + } + TargetPoint = sphere.Center; MoveViewport(position, orientation); } - + /// public override void SetArcBallView(Quaternion orientation, Vector3 orbitCenter, float orbitRadius) { @@ -212,12 +213,12 @@ namespace FlaxEditor.Viewport.Cameras Viewport.GetInput(out var input); Viewport.GetPrevInput(out var prevInput); - var mainViewport = Viewport as MainEditorGizmoViewport; - bool isUsingGizmo = mainViewport != null && mainViewport.TransformGizmo.ActiveAxis != TransformGizmoBase.Axis.None; + var transformGizmo = (Viewport as EditorGizmoViewport)?.Gizmos.Active as TransformGizmoBase; + var isUsingGizmo = transformGizmo != null && transformGizmo.ActiveAxis != TransformGizmoBase.Axis.None; // Get current view properties - float yaw = Viewport.Yaw; - float pitch = Viewport.Pitch; + var yaw = Viewport.Yaw; + var pitch = Viewport.Pitch; var position = Viewport.ViewPosition; var rotation = Viewport.ViewOrientation; @@ -271,7 +272,7 @@ namespace FlaxEditor.Viewport.Cameras position += forward * (Viewport.MouseWheelZoomSpeedFactor * input.MouseWheelDelta * 25.0f); if (input.IsAltDown) { - position += forward * (Viewport.MouseSpeed * 40 * Viewport.MouseDeltaRight.ValuesSum); + position += forward * (Viewport.MouseSpeed * 40 * Viewport.MousePositionDelta.ValuesSum); } } @@ -279,7 +280,7 @@ namespace FlaxEditor.Viewport.Cameras if (input.IsOrbiting && isUsingGizmo) { centerMouse = false; - Viewport.ViewPosition += mainViewport.TransformGizmo.LastDelta.Translation; + Viewport.ViewPosition += transformGizmo.LastDelta.Translation; return; } @@ -288,7 +289,7 @@ namespace FlaxEditor.Viewport.Cameras Viewport.Pitch = pitch; if (input.IsOrbiting) { - float orbitRadius = Vector3.Distance(ref position, ref TargetPoint); + float orbitRadius = Mathf.Max(Vector3.Distance(ref position, ref TargetPoint), 0.0001f); Vector3 localPosition = Viewport.ViewDirection * (-1 * orbitRadius); Viewport.ViewPosition = TargetPoint + localPosition; } diff --git a/Source/Editor/Viewport/EditorGizmoViewport.cs b/Source/Editor/Viewport/EditorGizmoViewport.cs index ae2db1e9b..93b2c7fbe 100644 --- a/Source/Editor/Viewport/EditorGizmoViewport.cs +++ b/Source/Editor/Viewport/EditorGizmoViewport.cs @@ -62,7 +62,7 @@ namespace FlaxEditor.Viewport public bool SnapToGround => Editor.Instance.Options.Options.Input.SnapToGround.Process(Root); /// - public Vector2 MouseDelta => _mouseDeltaLeft * 1000; + public Vector2 MouseDelta => _mouseDelta * 1000; /// public bool UseSnapping => Root.GetKey(KeyboardKeys.Control); diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs index 562381805..c4e2ddce2 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -140,7 +140,7 @@ namespace FlaxEditor.Viewport private bool _isControllingMouse; private int _deltaFilteringStep; private Vector2 _startPos; - private Vector2 _mouseDeltaRightLast; + private Vector2 _mouseDeltaLast; private Vector2[] _deltaFilteringBuffer = new Vector2[FpsCameraFilteringFrames]; /// @@ -159,14 +159,9 @@ namespace FlaxEditor.Viewport protected Vector2 _viewMousePos; /// - /// The mouse delta (right button down). + /// The mouse position delta. /// - protected Vector2 _mouseDeltaRight; - - /// - /// The mouse delta (left button down). - /// - protected Vector2 _mouseDeltaLeft; + protected Vector2 _mouseDelta; // Camera @@ -213,14 +208,9 @@ namespace FlaxEditor.Viewport } /// - /// Gets the mouse movement delta for the right button (user press and move). + /// Gets the mouse movement position delta (user press and move). /// - public Vector2 MouseDeltaRight => _mouseDeltaRight; - - /// - /// Gets the mouse movement delta for the left button (user press and move). - /// - public Vector2 MouseDeltaLeft => _mouseDeltaLeft; + public Vector2 MousePositionDelta => _mouseDelta; /// /// Camera's pitch angle clamp range (in degrees). @@ -1018,6 +1008,7 @@ namespace FlaxEditor.Viewport if (_isControllingMouse) { var rmbWheel = false; + // Gather input { bool isAltDown = _input.IsAltDown; @@ -1099,23 +1090,21 @@ namespace FlaxEditor.Viewport moveDelta *= 0.3f; // Calculate smooth mouse delta not dependant on viewport size - Vector2 offset = _viewMousePos - _startPos; if (_input.IsZooming && !_input.IsMouseRightDown && !_input.IsMouseLeftDown && !_input.IsMouseMiddleDown && !_isOrtho && !rmbWheel) { offset = Vector2.Zero; } - offset.X = offset.X > 0 ? Mathf.Floor(offset.X) : Mathf.Ceil(offset.X); offset.Y = offset.Y > 0 ? Mathf.Floor(offset.Y) : Mathf.Ceil(offset.Y); - _mouseDeltaRight = offset / size; - _mouseDeltaRight.Y *= size.Y / size.X; + _mouseDelta = offset / size; + _mouseDelta.Y *= size.Y / size.X; Vector2 mouseDelta = Vector2.Zero; if (_useMouseFiltering) { // Update delta filtering buffer - _deltaFilteringBuffer[_deltaFilteringStep] = _mouseDeltaRight; + _deltaFilteringBuffer[_deltaFilteringStep] = _mouseDelta; _deltaFilteringStep++; // If the step is too far, zero @@ -1129,14 +1118,16 @@ namespace FlaxEditor.Viewport mouseDelta /= FpsCameraFilteringFrames; } else - mouseDelta = _mouseDeltaRight; + { + mouseDelta = _mouseDelta; + } if (_useMouseAcceleration) { // Accelerate the delta var currentDelta = mouseDelta; - mouseDelta += _mouseDeltaRightLast * _mouseAccelerationScale; - _mouseDeltaRightLast = currentDelta; + mouseDelta += _mouseDeltaLast * _mouseAccelerationScale; + _mouseDeltaLast = currentDelta; } // Update @@ -1161,7 +1152,20 @@ namespace FlaxEditor.Viewport } else { - _mouseDeltaRight = _mouseDeltaRightLast = Vector2.Zero; + if (_input.IsMouseLeftDown || _input.IsMouseRightDown) + { + // Calculate smooth mouse delta not dependant on viewport size + Vector2 offset = _viewMousePos - _startPos; + offset.X = offset.X > 0 ? Mathf.Floor(offset.X) : Mathf.Ceil(offset.X); + offset.Y = offset.Y > 0 ? Mathf.Floor(offset.Y) : Mathf.Ceil(offset.Y); + _mouseDelta = offset / size; + _startPos = _viewMousePos; + } + else + { + _mouseDelta = Vector2.Zero; + } + _mouseDeltaLast = Vector2.Zero; if (ContainsFocus) { @@ -1198,19 +1202,6 @@ namespace FlaxEditor.Viewport UpdateView(dt, ref moveDelta, ref mouseDelta, out _); } } - if (_input.IsMouseLeftDown) - { - // Calculate smooth mouse delta not dependant on viewport size - Vector2 offset = _viewMousePos - _startPos; - offset.X = offset.X > 0 ? Mathf.Floor(offset.X) : Mathf.Ceil(offset.X); - offset.Y = offset.Y > 0 ? Mathf.Floor(offset.Y) : Mathf.Ceil(offset.Y); - _mouseDeltaLeft = offset / size; - _startPos = _viewMousePos; - } - else - { - _mouseDeltaLeft = Vector2.Zero; - } _input.MouseWheelDelta = 0; } diff --git a/Source/Editor/Viewport/PrefabWindowViewport.cs b/Source/Editor/Viewport/PrefabWindowViewport.cs index 8cf69f974..30a58c4a2 100644 --- a/Source/Editor/Viewport/PrefabWindowViewport.cs +++ b/Source/Editor/Viewport/PrefabWindowViewport.cs @@ -342,7 +342,7 @@ namespace FlaxEditor.Viewport public bool SnapToGround => false; /// - public Vector2 MouseDelta => _mouseDeltaLeft * 1000; + public Vector2 MouseDelta => _mouseDelta * 1000; /// public bool UseSnapping => Root.GetKey(KeyboardKeys.Control);