diff --git a/Source/Editor/Options/ViewportOptions.cs b/Source/Editor/Options/ViewportOptions.cs index 26caa2694..c934fc348 100644 --- a/Source/Editor/Options/ViewportOptions.cs +++ b/Source/Editor/Options/ViewportOptions.cs @@ -46,11 +46,18 @@ namespace FlaxEditor.Options [EditorDisplay("Defaults"), EditorOrder(112), Tooltip("The default maximum movement speed for the viewport camera.")] public float MaxMovementSpeed { get; set; } = 64f; + /// + /// Gets or sets the default camera easing mode. + /// + [DefaultValue(true)] + [EditorDisplay("Defaults"), EditorOrder(120), Tooltip("The default camera easing mode.")] + public bool UseCameraEasing { get; set; } = true; + /// /// Gets or sets the degree to which the camera will be eased when using camera flight in the editor window. /// [DefaultValue(3.0f), Limit(1.0f, 8.0f)] - [EditorDisplay("Defaults"), EditorOrder(120), Tooltip("The default degree to which the camera will be eased when using camera flight in the editor window.")] + [EditorDisplay("Defaults"), EditorOrder(121), Tooltip("The default degree to which the camera will be eased when using camera flight in the editor window (ignored if camera easing degree is enabled).")] public float CameraEasingDegree { get; set; } = 3.0f; /// @@ -79,7 +86,7 @@ namespace FlaxEditor.Options /// [DefaultValue(false)] [EditorDisplay("Defaults"), EditorOrder(160), Tooltip("The default camera orthographic mode.")] - public bool OrthographicProjection { get; set; } = false; + public bool UseOrthographicProjection { get; set; } = false; /// /// Gets or sets the default camera orthographic scale (if camera uses orthographic mode). @@ -100,7 +107,7 @@ namespace FlaxEditor.Options /// [DefaultValue(true)] [EditorDisplay("Defaults"), EditorOrder(190), Tooltip("The default relative panning mode. Uses distance between camera and target to determine panning speed.")] - public bool RelativePanning { get; set; } = true; + public bool UseRelativePanning { get; set; } = true; /// /// Gets or sets the default panning speed (ignored if relative panning is speed enabled). diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs index f83d9eb98..de4311452 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -187,13 +187,14 @@ namespace FlaxEditor.Viewport private float _farPlane; private float _orthoSize; private bool _isOrtho; + private bool _useCameraEasing; private float _cameraEasingDegree; private float _panningSpeed; private bool _relativePanning; private bool _invertPanning; private float _linearMovementProgress; - private float _easedMovementProgress; + private float _easedMovementProgress = 0.0f; /// /// Speed of the mouse. @@ -238,6 +239,15 @@ namespace FlaxEditor.Viewport set => _maxMovementSpeed = value; } + /// + /// Gets or sets the camera easing mode. + /// + public bool UseCameraEasing + { + get => _useCameraEasing; + set => _useCameraEasing = value; + } + /// /// Gets the mouse movement position delta (user press and move). /// @@ -490,6 +500,8 @@ namespace FlaxEditor.Viewport _minMovementSpeed = float.Parse(cachedState); if (_editor.ProjectCache.TryGetCustomData("CameraMaxMovementSpeedValue", out cachedState)) _maxMovementSpeed = float.Parse(cachedState); + if (_editor.ProjectCache.TryGetCustomData("UseCameraEasingState", out cachedState)) + _useCameraEasing = bool.Parse(cachedState); if (_editor.ProjectCache.TryGetCustomData("CameraPanningSpeedValue", out cachedState)) _panningSpeed = float.Parse(cachedState); if (_editor.ProjectCache.TryGetCustomData("CameraInvertPanningState", out cachedState)) @@ -584,6 +596,19 @@ namespace FlaxEditor.Viewport }; cameraCM.VisibleChanged += control => maxCamSpeedValue.Value = _maxMovementSpeed; + // Camera easing + { + var useCameraEasing = cameraCM.AddButton("Camera Easing"); + useCameraEasing.CloseMenuOnClick = false; + var useCameraEasingValue = new CheckBox(xLocationForExtras, 2, _useCameraEasing) + { + Parent = useCameraEasing + }; + + useCameraEasingValue.StateChanged += OnCameraEasingToggled; + cameraCM.VisibleChanged += control => useCameraEasingValue.Checked = _useCameraEasing; + } + // Panning speed { var panningSpeed = cameraCM.AddButton("Panning Speed"); @@ -875,11 +900,12 @@ namespace FlaxEditor.Viewport _minMovementSpeed = options.Viewport.MinMovementSpeed; _movementSpeed = options.Viewport.MovementSpeed; _maxMovementSpeed = options.Viewport.MaxMovementSpeed; + _useCameraEasing = options.Viewport.UseCameraEasing; _panningSpeed = options.Viewport.PanningSpeed; _invertPanning = options.Viewport.InvertPanning; - _relativePanning = options.Viewport.RelativePanning; + _relativePanning = options.Viewport.UseRelativePanning; - _isOrtho = options.Viewport.OrthographicProjection; + _isOrtho = options.Viewport.UseOrthographicProjection; _orthoSize = options.Viewport.OrthographicScale; _fieldOfView = options.Viewport.FieldOfView; _nearPlane = options.Viewport.NearPlane; @@ -920,6 +946,14 @@ namespace FlaxEditor.Viewport OnCameraMovementProgressChanged(); _editor.ProjectCache.SetCustomData("CameraMaxMovementSpeedValue", _maxMovementSpeed.ToString()); } + + private void OnCameraEasingToggled(Control control) + { + _useCameraEasing = !_useCameraEasing; + + OnCameraMovementProgressChanged(); + _editor.ProjectCache.SetCustomData("UseCameraEasingState", _useCameraEasing.ToString()); + } private void OnPanningSpeedChanged(FloatValueBox control) { @@ -1056,6 +1090,8 @@ namespace FlaxEditor.Viewport ? 0.0f : Mathf.Remap(_movementSpeed, _minMovementSpeed, _maxMovementSpeed, 0.0f, 1.0f); + if (!_useCameraEasing) + return; _easedMovementProgress = InterpInverseEaseInOut(0.0f, 1.0f, _linearMovementProgress, _cameraEasingDegree); } @@ -1065,9 +1101,20 @@ namespace FlaxEditor.Viewport /// The difference in camera speed adjustment as a fraction of 1. protected void AdjustCameraMoveSpeed(float speedDelta) { - _easedMovementProgress = Mathf.Clamp(_easedMovementProgress + speedDelta, 0.0f, 1.0f); - var easedSpeed = Mathf.InterpEaseInOut(_minMovementSpeed, _maxMovementSpeed, _easedMovementProgress, _cameraEasingDegree); - MovementSpeed = Mathf.Round(easedSpeed * 100) / 100; + float speed; + + if (_useCameraEasing) + { + _easedMovementProgress = Mathf.Clamp(_easedMovementProgress + speedDelta, 0.0f, 1.0f); + speed = Mathf.InterpEaseInOut(_minMovementSpeed, _maxMovementSpeed, _easedMovementProgress, _cameraEasingDegree); + } + else + { + _linearMovementProgress = Mathf.Clamp(_linearMovementProgress + speedDelta, 0.0f, 1.0f); + speed = Mathf.Lerp(_minMovementSpeed, _maxMovementSpeed, _linearMovementProgress); + } + + MovementSpeed = Mathf.Round(speed * 100) / 100; } private void OnEditorOptionsChanged(EditorOptions options)