From a7c9eff959af3b4cdf1517b1e52a0fbd19eb1357 Mon Sep 17 00:00:00 2001 From: Saas Date: Sat, 21 Mar 2026 14:49:34 +0100 Subject: [PATCH] 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); } }