From a7c9eff959af3b4cdf1517b1e52a0fbd19eb1357 Mon Sep 17 00:00:00 2001 From: Saas Date: Sat, 21 Mar 2026 14:49:34 +0100 Subject: [PATCH 1/2] add zooming in and out (FOV) in editor viewport using C and Z --- Source/Editor/Options/InputOptions.cs | 8 +++++++ Source/Editor/Viewport/Cameras/FPSCamera.cs | 23 ++++++++++++++++++++- Source/Editor/Viewport/EditorViewport.cs | 19 ++++++++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/Source/Editor/Options/InputOptions.cs b/Source/Editor/Options/InputOptions.cs index 9b15c0c09..899822dab 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 2182c2f55..7c628aa7f 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -50,6 +50,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. /// @@ -108,6 +118,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); @@ -1428,7 +1442,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); } } From e71f43ea793d4ddceeb6197655ee77d03ffafa2b Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 12 May 2026 18:19:10 +0200 Subject: [PATCH 2/2] Fix additional FOV to be included in Direction Gizmo #4016 --- Source/Editor/Gizmo/DirectionGizmo.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/Editor/Gizmo/DirectionGizmo.cs b/Source/Editor/Gizmo/DirectionGizmo.cs index b76cd0607..aedfe73d0 100644 --- a/Source/Editor/Gizmo/DirectionGizmo.cs +++ b/Source/Editor/Gizmo/DirectionGizmo.cs @@ -222,7 +222,10 @@ internal class DirectionGizmo : ContainerControl else { // This could be some actual math expression, not that hack - var fov = _owner.Viewport.FieldOfView / 60.0f; + float fov = _owner.Viewport.FieldOfView; + if (_owner.Viewport.ViewportCamera is Viewport.Cameras.FPSCamera fpsCam) + fov += fpsCam.AdditionalZoomFOV; + fov /= 60.0f; float scaleAt30 = 0.1f, scaleAt60 = 1.0f, scaleAt120 = 1.5f, scaleAt180 = 3.0f; heightNormalization /= Mathf.Lerp(scaleAt30, scaleAt60, fov); heightNormalization /= Mathf.Lerp(scaleAt60, scaleAt120, Mathf.Saturate(fov - 1));