From cd0964be479770a197716528a26583e375e3a67e Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Tue, 2 Jun 2026 16:41:07 -0600 Subject: [PATCH 01/13] Added a MouseScrollPixelsPerLine Resource --- crates/bevy_input/src/mouse.rs | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/crates/bevy_input/src/mouse.rs b/crates/bevy_input/src/mouse.rs index 902e0bf8a8f83..6af95369c1887 100644 --- a/crates/bevy_input/src/mouse.rs +++ b/crates/bevy_input/src/mouse.rs @@ -139,16 +139,24 @@ pub enum MouseScrollUnit { Pixel, } -impl MouseScrollUnit { - /// An approximate conversion factor to account for the difference between - /// [`MouseScrollUnit::Line`] and [`MouseScrollUnit::Pixel`]. - /// - /// Each line corresponds to many pixels; this must be corrected for in order to ensure that - /// mouse wheel controls are scaled properly regardless of the provided input events for the end user. - /// - /// This value is correct for Microsoft Edge, but its validity has not been broadly tested. - /// Please file an issue if you find that this differs on certain platforms or hardware! - pub const SCROLL_UNIT_CONVERSION_FACTOR: f32 = 100.; +/// Describes the quantity of [`MouseScrollUnit::Pixel`]s per [`MouseScrollUnit::Line`] +#[derive(Debug, Clone, Copy, PartialEq, Resource)] +#[cfg_attr( + feature = "bevy_reflect", + derive(Reflect), + reflect(Debug, PartialEq, Clone) +)] +#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr( + all(feature = "serialize", feature = "bevy_reflect"), + reflect(Serialize, Deserialize) +)] +pub struct MouseScrollPixelsPerLine(f32); + +impl Default for MouseScrollPixelsPerLine { + fn default() -> Self { + MouseScrollPixelsPerLine(100.0) + } } /// A mouse wheel event. From 5e22ce95b07e12c06e159236655c27b9fc1d16b5 Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Tue, 2 Jun 2026 17:16:34 -0600 Subject: [PATCH 02/13] impl Deref for MouseScrollPixelsPerLine --- crates/bevy_input/src/lib.rs | 3 ++- crates/bevy_input/src/mouse.rs | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/bevy_input/src/lib.rs b/crates/bevy_input/src/lib.rs index 66f4cdb250f32..8cd24dca289e0 100644 --- a/crates/bevy_input/src/lib.rs +++ b/crates/bevy_input/src/lib.rs @@ -80,7 +80,7 @@ use keyboard::{keyboard_input_system, Key, KeyCode, KeyboardFocusLost, KeyboardI use mouse::{ accumulate_mouse_motion_system, accumulate_mouse_scroll_system, mouse_button_input_system, AccumulatedMouseMotion, AccumulatedMouseScroll, MouseButton, MouseButtonInput, MouseMotion, - MouseWheel, + MouseWheel, MouseScrollPixelsPerLine }; #[cfg(feature = "touch")] @@ -122,6 +122,7 @@ impl Plugin for InputPlugin { .add_message::() .init_resource::() .init_resource::() + .init_resource::() .init_resource::>() .add_systems( PreUpdate, diff --git a/crates/bevy_input/src/mouse.rs b/crates/bevy_input/src/mouse.rs index 6af95369c1887..c1d3d763fa208 100644 --- a/crates/bevy_input/src/mouse.rs +++ b/crates/bevy_input/src/mouse.rs @@ -159,6 +159,13 @@ impl Default for MouseScrollPixelsPerLine { } } +impl core::ops::Deref for MouseScrollPixelsPerLine { + type Target = f32; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + /// A mouse wheel event. /// /// This event is the translated version of the `WindowEvent::MouseWheel` from the `winit` crate. From 49e67de940a75498f2a2e6b72c731af03048394b Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Tue, 2 Jun 2026 17:17:03 -0600 Subject: [PATCH 03/13] Fix instances of SCROLL_UNIT_CONVERSION_FACTOR I missed --- crates/bevy_camera_controller/src/free_camera.rs | 8 ++++---- crates/bevy_camera_controller/src/pan_camera.rs | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/bevy_camera_controller/src/free_camera.rs b/crates/bevy_camera_controller/src/free_camera.rs index 8d18d0e673b6b..986faf9f33171 100644 --- a/crates/bevy_camera_controller/src/free_camera.rs +++ b/crates/bevy_camera_controller/src/free_camera.rs @@ -20,7 +20,8 @@ use bevy_camera::Camera; use bevy_ecs::prelude::*; use bevy_input::keyboard::KeyCode; use bevy_input::mouse::{ - AccumulatedMouseMotion, AccumulatedMouseScroll, MouseButton, MouseScrollUnit, + AccumulatedMouseMotion, AccumulatedMouseScroll, MouseButton, MouseScrollPixelsPerLine, + MouseScrollUnit, }; use bevy_input::touch::Touches; use bevy_input::ButtonInput; @@ -267,6 +268,7 @@ pub fn run_freecamera_controller( mut windows: Query<(&Window, &mut CursorOptions)>, accumulated_mouse_motion: Res, accumulated_mouse_scroll: Res, + mouse_scroll_conversion: Res, touch_input: Res, mouse_button_input: Res>, key_input: Res>, @@ -304,9 +306,7 @@ pub fn run_freecamera_controller( let scroll = match accumulated_mouse_scroll.unit { MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y, - MouseScrollUnit::Pixel => { - accumulated_mouse_scroll.delta.y / MouseScrollUnit::SCROLL_UNIT_CONVERSION_FACTOR - } + MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / mouse_scroll_conversion, }; // By using exponentiation we ensure that this scales up and down smoothly // regardless of the amount of scrolling processed per frame diff --git a/crates/bevy_camera_controller/src/pan_camera.rs b/crates/bevy_camera_controller/src/pan_camera.rs index 03338e90b5e83..412fb1285ff4a 100644 --- a/crates/bevy_camera_controller/src/pan_camera.rs +++ b/crates/bevy_camera_controller/src/pan_camera.rs @@ -167,6 +167,7 @@ fn run_pancamera_controller( time: Res>, key_input: Res>, accumulated_mouse_scroll: Res, + mouse_scroll_conversion: Res, mut query: Query<(&mut Transform, &mut PanCamera), With>, ) { let dt = time.delta_secs(); @@ -242,9 +243,7 @@ fn run_pancamera_controller( // (with mouse wheel) let mouse_scroll = match accumulated_mouse_scroll.unit { MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y, - MouseScrollUnit::Pixel => { - accumulated_mouse_scroll.delta.y / MouseScrollUnit::SCROLL_UNIT_CONVERSION_FACTOR - } + MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / mouse_scroll_conversion, }; zoom_amount += mouse_scroll * controller.zoom_speed; From bb1a2a22e2fb48ab890d0079cc692be151a13de7 Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Tue, 2 Jun 2026 17:38:00 -0600 Subject: [PATCH 04/13] Fix bad imports --- crates/bevy_camera_controller/src/free_camera.rs | 2 +- crates/bevy_camera_controller/src/pan_camera.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bevy_camera_controller/src/free_camera.rs b/crates/bevy_camera_controller/src/free_camera.rs index 986faf9f33171..1f4997d4c2674 100644 --- a/crates/bevy_camera_controller/src/free_camera.rs +++ b/crates/bevy_camera_controller/src/free_camera.rs @@ -306,7 +306,7 @@ pub fn run_freecamera_controller( let scroll = match accumulated_mouse_scroll.unit { MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y, - MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / mouse_scroll_conversion, + MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / **mouse_scroll_conversion, }; // By using exponentiation we ensure that this scales up and down smoothly // regardless of the amount of scrolling processed per frame diff --git a/crates/bevy_camera_controller/src/pan_camera.rs b/crates/bevy_camera_controller/src/pan_camera.rs index 412fb1285ff4a..22f5a9fb7164c 100644 --- a/crates/bevy_camera_controller/src/pan_camera.rs +++ b/crates/bevy_camera_controller/src/pan_camera.rs @@ -9,7 +9,7 @@ use bevy_app::{App, Plugin, RunFixedMainLoop, RunFixedMainLoopSystems}; use bevy_camera::{Camera, RenderTarget}; use bevy_ecs::prelude::*; use bevy_input::keyboard::KeyCode; -use bevy_input::mouse::{AccumulatedMouseScroll, MouseButton, MouseScrollUnit}; +use bevy_input::mouse::{AccumulatedMouseScroll, MouseButton, MouseScrollUnit, MouseScrollPixelsPerLine}; use bevy_input::ButtonInput; use bevy_math::{Vec2, Vec3}; use bevy_picking::events::{Drag, DragEnd, DragStart, Pointer}; @@ -243,7 +243,7 @@ fn run_pancamera_controller( // (with mouse wheel) let mouse_scroll = match accumulated_mouse_scroll.unit { MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y, - MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / mouse_scroll_conversion, + MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / **mouse_scroll_conversion, }; zoom_amount += mouse_scroll * controller.zoom_speed; From 91c801e658bf064775d2e938c3be1f91eaf4dd93 Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Tue, 2 Jun 2026 18:15:29 -0600 Subject: [PATCH 05/13] cargo fmt --- crates/bevy_camera_controller/src/pan_camera.rs | 4 +++- crates/bevy_input/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/bevy_camera_controller/src/pan_camera.rs b/crates/bevy_camera_controller/src/pan_camera.rs index 22f5a9fb7164c..734bd15cea3fa 100644 --- a/crates/bevy_camera_controller/src/pan_camera.rs +++ b/crates/bevy_camera_controller/src/pan_camera.rs @@ -9,7 +9,9 @@ use bevy_app::{App, Plugin, RunFixedMainLoop, RunFixedMainLoopSystems}; use bevy_camera::{Camera, RenderTarget}; use bevy_ecs::prelude::*; use bevy_input::keyboard::KeyCode; -use bevy_input::mouse::{AccumulatedMouseScroll, MouseButton, MouseScrollUnit, MouseScrollPixelsPerLine}; +use bevy_input::mouse::{ + AccumulatedMouseScroll, MouseButton, MouseScrollPixelsPerLine, MouseScrollUnit, +}; use bevy_input::ButtonInput; use bevy_math::{Vec2, Vec3}; use bevy_picking::events::{Drag, DragEnd, DragStart, Pointer}; diff --git a/crates/bevy_input/src/lib.rs b/crates/bevy_input/src/lib.rs index 8cd24dca289e0..e9e35eeab485c 100644 --- a/crates/bevy_input/src/lib.rs +++ b/crates/bevy_input/src/lib.rs @@ -80,7 +80,7 @@ use keyboard::{keyboard_input_system, Key, KeyCode, KeyboardFocusLost, KeyboardI use mouse::{ accumulate_mouse_motion_system, accumulate_mouse_scroll_system, mouse_button_input_system, AccumulatedMouseMotion, AccumulatedMouseScroll, MouseButton, MouseButtonInput, MouseMotion, - MouseWheel, MouseScrollPixelsPerLine + MouseScrollPixelsPerLine, MouseWheel, }; #[cfg(feature = "touch")] From eb47af58410f68cd7c0ef2849970129d550b6c9c Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Tue, 2 Jun 2026 21:29:10 -0600 Subject: [PATCH 06/13] Fix projection_zoom example --- examples/camera/projection_zoom.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/camera/projection_zoom.rs b/examples/camera/projection_zoom.rs index 0c9512a94d5de..31c8568c8f943 100644 --- a/examples/camera/projection_zoom.rs +++ b/examples/camera/projection_zoom.rs @@ -3,7 +3,9 @@ use std::{f32::consts::PI, ops::Range}; use bevy::{ - camera::ScalingMode, input::mouse::AccumulatedMouseScroll, input::mouse::MouseScrollUnit, + camera::ScalingMode, + input::mouse::MouseScrollUnit, + input::mouse::{AccumulatedMouseScroll, MouseScrollPixelsPerLine}, prelude::*, }; @@ -138,6 +140,7 @@ fn zoom( camera: Single<&mut Projection, With>, camera_settings: Res, mouse_wheel_input: Res, + scroll_conversion: Res, ) { // Usually, you won't need to handle both types of projection, // but doing so makes for a more complete example. @@ -145,9 +148,7 @@ fn zoom( // Get a scroll amount proportional to the kind of input that generated it. let scroll = match mouse_wheel_input.unit { MouseScrollUnit::Line => mouse_wheel_input.delta.y, - MouseScrollUnit::Pixel => { - mouse_wheel_input.delta.y / MouseScrollUnit::SCROLL_UNIT_CONVERSION_FACTOR - } + MouseScrollUnit::Pixel => mouse_wheel_input.delta.y / **scroll_conversion, }; match *camera.into_inner() { From 1a5452bfbfb120c0785ea39438308ef15bd3c4e4 Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Thu, 4 Jun 2026 07:17:15 -0600 Subject: [PATCH 07/13] Add helper functions --- .../bevy_camera_controller/src/free_camera.rs | 2 +- .../bevy_camera_controller/src/pan_camera.rs | 2 +- crates/bevy_input/src/mouse.rs | 59 +++++++++++++++++-- examples/camera/projection_zoom.rs | 6 +- 4 files changed, 57 insertions(+), 12 deletions(-) diff --git a/crates/bevy_camera_controller/src/free_camera.rs b/crates/bevy_camera_controller/src/free_camera.rs index 1f4997d4c2674..ae740d78a0f59 100644 --- a/crates/bevy_camera_controller/src/free_camera.rs +++ b/crates/bevy_camera_controller/src/free_camera.rs @@ -306,7 +306,7 @@ pub fn run_freecamera_controller( let scroll = match accumulated_mouse_scroll.unit { MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y, - MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / **mouse_scroll_conversion, + MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / *mouse_scroll_conversion, }; // By using exponentiation we ensure that this scales up and down smoothly // regardless of the amount of scrolling processed per frame diff --git a/crates/bevy_camera_controller/src/pan_camera.rs b/crates/bevy_camera_controller/src/pan_camera.rs index 734bd15cea3fa..9ae11c9e9bda0 100644 --- a/crates/bevy_camera_controller/src/pan_camera.rs +++ b/crates/bevy_camera_controller/src/pan_camera.rs @@ -245,7 +245,7 @@ fn run_pancamera_controller( // (with mouse wheel) let mouse_scroll = match accumulated_mouse_scroll.unit { MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y, - MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / **mouse_scroll_conversion, + MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / *mouse_scroll_conversion, }; zoom_amount += mouse_scroll * controller.zoom_speed; diff --git a/crates/bevy_input/src/mouse.rs b/crates/bevy_input/src/mouse.rs index c1d3d763fa208..610d7307890e5 100644 --- a/crates/bevy_input/src/mouse.rs +++ b/crates/bevy_input/src/mouse.rs @@ -1,5 +1,7 @@ //! The mouse input functionality. +use core::ops::{Div, Mul}; + use crate::{touch::TouchPhase, ButtonInput, ButtonState}; #[cfg(feature = "bevy_reflect")] use bevy_ecs::prelude::ReflectMessage; @@ -11,6 +13,8 @@ use bevy_ecs::{ system::ResMut, }; use bevy_math::Vec2; +use derive_more::{Deref, DerefMut}; + #[cfg(feature = "bevy_reflect")] use { bevy_ecs::reflect::ReflectResource, @@ -140,7 +144,7 @@ pub enum MouseScrollUnit { } /// Describes the quantity of [`MouseScrollUnit::Pixel`]s per [`MouseScrollUnit::Line`] -#[derive(Debug, Clone, Copy, PartialEq, Resource)] +#[derive(Debug, Clone, Copy, PartialEq, Resource, Deref, DerefMut)] #[cfg_attr( feature = "bevy_reflect", derive(Reflect), @@ -159,13 +163,33 @@ impl Default for MouseScrollPixelsPerLine { } } -impl core::ops::Deref for MouseScrollPixelsPerLine { - type Target = f32; - fn deref(&self) -> &Self::Target { - &self.0 +impl Mul for MouseScrollPixelsPerLine { + type Output = f32; + fn mul(self, rhs: f32) -> Self::Output { + self.0 * rhs + } +} + +impl Div for MouseScrollPixelsPerLine { + type Output = f32; + fn div(self, rhs: f32) -> Self::Output { + self.0 * rhs + } +} + +impl Mul for Vec2 { + type Output = Vec2; + fn mul(self, rhs: MouseScrollPixelsPerLine) -> Self::Output { + self * rhs.0 } } +impl Div for Vec2 { + type Output = Vec2; + fn div(self, rhs: MouseScrollPixelsPerLine) -> Self::Output { + self / rhs.0 + } +} /// A mouse wheel event. /// /// This event is the translated version of the `WindowEvent::MouseWheel` from the `winit` crate. @@ -269,6 +293,31 @@ impl Default for AccumulatedMouseScroll { } } +impl AccumulatedMouseScroll { + /// Converts the units to [`MouseScrollUnit::Line`] + pub fn to_lines(&self, conversion_ratio: &MouseScrollPixelsPerLine) -> Self { + if self.unit == MouseScrollUnit::Line { + AccumulatedMouseScroll { + unit: MouseScrollUnit::Line, + delta: self.delta / *conversion_ratio, + } + } else { + *self + } + } + /// Converts the units to [`MouseScrollUnit::Pixel`] + pub fn to_pixels(&self, conversion_ratio: &MouseScrollPixelsPerLine) -> Self { + if self.unit == MouseScrollUnit::Pixel { + AccumulatedMouseScroll { + unit: MouseScrollUnit::Line, + delta: self.delta * *conversion_ratio, + } + } else { + *self + } + } +} + /// Updates the [`AccumulatedMouseMotion`] resource using the [`MouseMotion`] event. /// The value of [`AccumulatedMouseMotion`] is reset to zero every frame pub fn accumulate_mouse_motion_system( diff --git a/examples/camera/projection_zoom.rs b/examples/camera/projection_zoom.rs index 31c8568c8f943..3797249f33ca5 100644 --- a/examples/camera/projection_zoom.rs +++ b/examples/camera/projection_zoom.rs @@ -4,7 +4,6 @@ use std::{f32::consts::PI, ops::Range}; use bevy::{ camera::ScalingMode, - input::mouse::MouseScrollUnit, input::mouse::{AccumulatedMouseScroll, MouseScrollPixelsPerLine}, prelude::*, }; @@ -146,10 +145,7 @@ fn zoom( // but doing so makes for a more complete example. // Get a scroll amount proportional to the kind of input that generated it. - let scroll = match mouse_wheel_input.unit { - MouseScrollUnit::Line => mouse_wheel_input.delta.y, - MouseScrollUnit::Pixel => mouse_wheel_input.delta.y / **scroll_conversion, - }; + let scroll = mouse_wheel_input.to_lines(&scroll_conversion).delta.y; match *camera.into_inner() { Projection::Orthographic(ref mut orthographic) => { From 2dde0e4ae38ffc2108a4b6d77cfe36fddb3b310c Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Thu, 4 Jun 2026 16:33:36 -0600 Subject: [PATCH 08/13] Fix wrong Mul implementation --- crates/bevy_input/src/mouse.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/bevy_input/src/mouse.rs b/crates/bevy_input/src/mouse.rs index 610d7307890e5..13cac1793a800 100644 --- a/crates/bevy_input/src/mouse.rs +++ b/crates/bevy_input/src/mouse.rs @@ -163,17 +163,17 @@ impl Default for MouseScrollPixelsPerLine { } } -impl Mul for MouseScrollPixelsPerLine { +impl Mul for f32 { type Output = f32; - fn mul(self, rhs: f32) -> Self::Output { - self.0 * rhs + fn mul(self, rhs: MouseScrollPixelsPerLine) -> Self::Output { + self * rhs.0 } } -impl Div for MouseScrollPixelsPerLine { +impl Div for f32 { type Output = f32; - fn div(self, rhs: f32) -> Self::Output { - self.0 * rhs + fn div(self, rhs: MouseScrollPixelsPerLine) -> Self::Output { + self * rhs.0 } } From 345304d2ca1ba5e91f4648adc653163d8b9794e9 Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Thu, 4 Jun 2026 16:41:46 -0600 Subject: [PATCH 09/13] Fix Div function --- crates/bevy_input/src/mouse.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_input/src/mouse.rs b/crates/bevy_input/src/mouse.rs index 13cac1793a800..2d72eb91a0994 100644 --- a/crates/bevy_input/src/mouse.rs +++ b/crates/bevy_input/src/mouse.rs @@ -173,7 +173,7 @@ impl Mul for f32 { impl Div for f32 { type Output = f32; fn div(self, rhs: MouseScrollPixelsPerLine) -> Self::Output { - self * rhs.0 + self / rhs.0 } } From 92da56856c0c81f31e384c2efddca59ba409a684 Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Fri, 5 Jun 2026 20:30:15 -0600 Subject: [PATCH 10/13] Fix incorrect variables and replace match cases with methods --- crates/bevy_camera_controller/src/free_camera.rs | 5 +---- crates/bevy_camera_controller/src/pan_camera.rs | 5 +---- crates/bevy_input/src/mouse.rs | 6 +++--- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/crates/bevy_camera_controller/src/free_camera.rs b/crates/bevy_camera_controller/src/free_camera.rs index ae740d78a0f59..957718db8f09f 100644 --- a/crates/bevy_camera_controller/src/free_camera.rs +++ b/crates/bevy_camera_controller/src/free_camera.rs @@ -304,10 +304,7 @@ pub fn run_freecamera_controller( return; } - let scroll = match accumulated_mouse_scroll.unit { - MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y, - MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / *mouse_scroll_conversion, - }; + let scroll = accumulated_mouse_scroll.to_lines(mouse_scroll_conversion); // By using exponentiation we ensure that this scales up and down smoothly // regardless of the amount of scrolling processed per frame state.speed_multiplier *= exp(config.scroll_factor * scroll); diff --git a/crates/bevy_camera_controller/src/pan_camera.rs b/crates/bevy_camera_controller/src/pan_camera.rs index 9ae11c9e9bda0..7bf5fe72a5c8f 100644 --- a/crates/bevy_camera_controller/src/pan_camera.rs +++ b/crates/bevy_camera_controller/src/pan_camera.rs @@ -243,10 +243,7 @@ fn run_pancamera_controller( } // (with mouse wheel) - let mouse_scroll = match accumulated_mouse_scroll.unit { - MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y, - MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / *mouse_scroll_conversion, - }; + let mouse_scroll = accumulated_mouse_scroll.to_lines(mouse_scroll_conversion); zoom_amount += mouse_scroll * controller.zoom_speed; controller.zoom_factor = diff --git a/crates/bevy_input/src/mouse.rs b/crates/bevy_input/src/mouse.rs index 2d72eb91a0994..708075d8efeb7 100644 --- a/crates/bevy_input/src/mouse.rs +++ b/crates/bevy_input/src/mouse.rs @@ -296,7 +296,7 @@ impl Default for AccumulatedMouseScroll { impl AccumulatedMouseScroll { /// Converts the units to [`MouseScrollUnit::Line`] pub fn to_lines(&self, conversion_ratio: &MouseScrollPixelsPerLine) -> Self { - if self.unit == MouseScrollUnit::Line { + if self.unit == MouseScrollUnit::Pixel { AccumulatedMouseScroll { unit: MouseScrollUnit::Line, delta: self.delta / *conversion_ratio, @@ -307,9 +307,9 @@ impl AccumulatedMouseScroll { } /// Converts the units to [`MouseScrollUnit::Pixel`] pub fn to_pixels(&self, conversion_ratio: &MouseScrollPixelsPerLine) -> Self { - if self.unit == MouseScrollUnit::Pixel { + if self.unit == MouseScrollUnit::Line { AccumulatedMouseScroll { - unit: MouseScrollUnit::Line, + unit: MouseScrollUnit::Pixel, delta: self.delta * *conversion_ratio, } } else { From b6153467db9e020f79535fd335197adc79d19271 Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Fri, 5 Jun 2026 20:42:55 -0600 Subject: [PATCH 11/13] More simple error fixes --- crates/bevy_camera_controller/src/free_camera.rs | 2 +- crates/bevy_camera_controller/src/pan_camera.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_camera_controller/src/free_camera.rs b/crates/bevy_camera_controller/src/free_camera.rs index 957718db8f09f..51978e8ec22ad 100644 --- a/crates/bevy_camera_controller/src/free_camera.rs +++ b/crates/bevy_camera_controller/src/free_camera.rs @@ -304,7 +304,7 @@ pub fn run_freecamera_controller( return; } - let scroll = accumulated_mouse_scroll.to_lines(mouse_scroll_conversion); + let scroll = accumulated_mouse_scroll.to_lines(&mouse_scroll_conversion).delta.y; // By using exponentiation we ensure that this scales up and down smoothly // regardless of the amount of scrolling processed per frame state.speed_multiplier *= exp(config.scroll_factor * scroll); diff --git a/crates/bevy_camera_controller/src/pan_camera.rs b/crates/bevy_camera_controller/src/pan_camera.rs index 7bf5fe72a5c8f..c0d18925f7558 100644 --- a/crates/bevy_camera_controller/src/pan_camera.rs +++ b/crates/bevy_camera_controller/src/pan_camera.rs @@ -243,7 +243,7 @@ fn run_pancamera_controller( } // (with mouse wheel) - let mouse_scroll = accumulated_mouse_scroll.to_lines(mouse_scroll_conversion); + let mouse_scroll = accumulated_mouse_scroll.to_lines(&mouse_scroll_conversion).delta.y; zoom_amount += mouse_scroll * controller.zoom_speed; controller.zoom_factor = From 3f4b5c090c0d97ed3eb63cefb01384e415f34d6d Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Fri, 5 Jun 2026 20:47:22 -0600 Subject: [PATCH 12/13] cargo fmt --- crates/bevy_camera_controller/src/free_camera.rs | 5 ++++- crates/bevy_camera_controller/src/pan_camera.rs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/bevy_camera_controller/src/free_camera.rs b/crates/bevy_camera_controller/src/free_camera.rs index 51978e8ec22ad..a1b6c5a2d472d 100644 --- a/crates/bevy_camera_controller/src/free_camera.rs +++ b/crates/bevy_camera_controller/src/free_camera.rs @@ -304,7 +304,10 @@ pub fn run_freecamera_controller( return; } - let scroll = accumulated_mouse_scroll.to_lines(&mouse_scroll_conversion).delta.y; + let scroll = accumulated_mouse_scroll + .to_lines(&mouse_scroll_conversion) + .delta + .y; // By using exponentiation we ensure that this scales up and down smoothly // regardless of the amount of scrolling processed per frame state.speed_multiplier *= exp(config.scroll_factor * scroll); diff --git a/crates/bevy_camera_controller/src/pan_camera.rs b/crates/bevy_camera_controller/src/pan_camera.rs index c0d18925f7558..38d8b6bc85b50 100644 --- a/crates/bevy_camera_controller/src/pan_camera.rs +++ b/crates/bevy_camera_controller/src/pan_camera.rs @@ -243,7 +243,10 @@ fn run_pancamera_controller( } // (with mouse wheel) - let mouse_scroll = accumulated_mouse_scroll.to_lines(&mouse_scroll_conversion).delta.y; + let mouse_scroll = accumulated_mouse_scroll + .to_lines(&mouse_scroll_conversion) + .delta + .y; zoom_amount += mouse_scroll * controller.zoom_speed; controller.zoom_factor = From 266b98daee0740abff33fd74ade9edbc0670877d Mon Sep 17 00:00:00 2001 From: Azural Champagne Date: Fri, 5 Jun 2026 20:59:01 -0600 Subject: [PATCH 13/13] remove unnesesary imports CI... --- crates/bevy_camera_controller/src/free_camera.rs | 1 - crates/bevy_camera_controller/src/pan_camera.rs | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/bevy_camera_controller/src/free_camera.rs b/crates/bevy_camera_controller/src/free_camera.rs index a1b6c5a2d472d..94c04eed668bf 100644 --- a/crates/bevy_camera_controller/src/free_camera.rs +++ b/crates/bevy_camera_controller/src/free_camera.rs @@ -21,7 +21,6 @@ use bevy_ecs::prelude::*; use bevy_input::keyboard::KeyCode; use bevy_input::mouse::{ AccumulatedMouseMotion, AccumulatedMouseScroll, MouseButton, MouseScrollPixelsPerLine, - MouseScrollUnit, }; use bevy_input::touch::Touches; use bevy_input::ButtonInput; diff --git a/crates/bevy_camera_controller/src/pan_camera.rs b/crates/bevy_camera_controller/src/pan_camera.rs index 38d8b6bc85b50..209fcdad088ab 100644 --- a/crates/bevy_camera_controller/src/pan_camera.rs +++ b/crates/bevy_camera_controller/src/pan_camera.rs @@ -9,9 +9,7 @@ use bevy_app::{App, Plugin, RunFixedMainLoop, RunFixedMainLoopSystems}; use bevy_camera::{Camera, RenderTarget}; use bevy_ecs::prelude::*; use bevy_input::keyboard::KeyCode; -use bevy_input::mouse::{ - AccumulatedMouseScroll, MouseButton, MouseScrollPixelsPerLine, MouseScrollUnit, -}; +use bevy_input::mouse::{AccumulatedMouseScroll, MouseButton, MouseScrollPixelsPerLine}; use bevy_input::ButtonInput; use bevy_math::{Vec2, Vec3}; use bevy_picking::events::{Drag, DragEnd, DragStart, Pointer};