diff --git a/Source/Editor/Options/InputOptions.cs b/Source/Editor/Options/InputOptions.cs index 82ccc21d5..ca0f38b7b 100644 --- a/Source/Editor/Options/InputOptions.cs +++ b/Source/Editor/Options/InputOptions.cs @@ -347,6 +347,14 @@ namespace FlaxEditor.Options [EditorDisplay("Viewport"), EditorOrder(1550)] public InputBinding Down = new InputBinding(KeyboardKeys.Q); + [DefaultValue(typeof(InputBinding), "C")] + [EditorDisplay("Viewport"), EditorOrder(1551)] + public InputBinding ZoomIn = new InputBinding(KeyboardKeys.C); + + [DefaultValue(typeof(InputBinding), "Z")] + [EditorDisplay("Viewport"), EditorOrder(1552)] + public InputBinding ZoomOut = new InputBinding(KeyboardKeys.Z); + [DefaultValue(typeof(InputBinding), "None")] [EditorDisplay("Viewport", "Toggle Camera Rotation"), EditorOrder(1560)] public InputBinding CameraToggleRotation = new InputBinding(KeyboardKeys.None); diff --git a/Source/Editor/Viewport/Cameras/FPSCamera.cs b/Source/Editor/Viewport/Cameras/FPSCamera.cs index 26e996c41..228994929 100644 --- a/Source/Editor/Viewport/Cameras/FPSCamera.cs +++ b/Source/Editor/Viewport/Cameras/FPSCamera.cs @@ -21,6 +21,7 @@ namespace FlaxEditor.Viewport.Cameras private Transform _startMove; private Transform _endMove; private float _moveStartTime = -1; + private float _additionalFOV; /// /// Gets a value indicating whether this viewport is animating movement. @@ -32,6 +33,15 @@ namespace FlaxEditor.Viewport.Cameras /// public Vector3 TargetPoint = new Vector3(-200); + /// + /// Additional field of view used for zooming the camera in and out. + /// + public float AdditionalZoomFOV + { + get => _additionalFOV; + private set => _additionalFOV = Mathf.Clamp(value, 5 - Viewport.FieldOfView, 160f - Viewport.FieldOfView); + } + /// /// Sets view. /// @@ -216,7 +226,7 @@ namespace FlaxEditor.Viewport.Cameras pitch += mouseDelta.Y; } - // Zoom in/out + // Zoom in/out with mouse wheel if (input.IsZooming && !input.IsRotating) { position += forward * (Viewport.MouseWheelZoomSpeedFactor * input.MouseWheelDelta * 25.0f); @@ -226,6 +236,17 @@ namespace FlaxEditor.Viewport.Cameras } } + // Zoom in and out by changing FOV + if (input.IsRotating && (input.ZoomInDown || input.ZoomOutDown)) + { + float delta = (input.ZoomInDown ? -0.8f : 0.8f); + AdditionalZoomFOV += delta; + } + else if (!input.IsRotating) + { + AdditionalZoomFOV = 0f; + } + // Move camera with the gizmo if (input.IsOrbiting && isUsingGizmo) { diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs index fa5724780..763f710c8 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -51,6 +51,16 @@ namespace FlaxEditor.Viewport /// public bool IsOrbiting; + /// + /// The zoom in state. + /// + public bool ZoomInDown; + + /// + /// The zoom out state. + /// + public bool ZoomOutDown; + /// /// The is control down flag. /// @@ -109,6 +119,10 @@ namespace FlaxEditor.Viewport IsAltDown = window.GetKey(KeyboardKeys.Alt); WasAltDownBefore = prevInput.WasAltDownBefore || prevInput.IsAltDown; + InputOptions inputOptions = Editor.Instance.Options.Options.Input; + ZoomInDown = window.GetKey(inputOptions.ZoomIn.Key); + ZoomOutDown = window.GetKey(inputOptions.ZoomOut.Key); + IsMouseRightDown = useMouse && window.GetMouseButton(MouseButton.Right); IsMouseMiddleDown = useMouse && window.GetMouseButton(MouseButton.Middle); IsMouseLeftDown = useMouse && window.GetMouseButton(MouseButton.Left); @@ -1433,7 +1447,10 @@ namespace FlaxEditor.Viewport else { float aspect = Width / Height; - Matrix.PerspectiveFov(_fieldOfView * Mathf.DegreesToRadians, aspect, _nearPlane, _farPlane, out result); + float fov = _fieldOfView; + if (_camera is FPSCamera fpsCam) + fov += fpsCam.AdditionalZoomFOV; + Matrix.PerspectiveFov(fov * Mathf.DegreesToRadians, aspect, _nearPlane, _farPlane, out result); } }