|
2 | 2 |
|
3 | 3 | use crate::{ButtonInput, ButtonState};
|
4 | 4 | use bevy_ecs::entity::Entity;
|
| 5 | +use bevy_ecs::reflect::ReflectResource; |
| 6 | +use bevy_ecs::system::Resource; |
5 | 7 | use bevy_ecs::{
|
6 | 8 | change_detection::DetectChangesMut,
|
7 | 9 | event::{Event, EventReader},
|
8 | 10 | system::ResMut,
|
9 | 11 | };
|
10 | 12 | use bevy_math::Vec2;
|
11 |
| -use bevy_reflect::Reflect; |
| 13 | +use bevy_reflect::{std_traits::ReflectDefault, Reflect}; |
12 | 14 |
|
13 | 15 | #[cfg(feature = "serialize")]
|
14 | 16 | use bevy_reflect::{ReflectDeserialize, ReflectSerialize};
|
@@ -155,3 +157,81 @@ pub fn mouse_button_input_system(
|
155 | 157 | }
|
156 | 158 | }
|
157 | 159 | }
|
| 160 | + |
| 161 | +/// Tracks how much the mouse has moved every frame. |
| 162 | +/// |
| 163 | +/// This resource is reset to zero every frame. |
| 164 | +/// |
| 165 | +/// This resource sums the total [`MouseMotion`] events received this frame. |
| 166 | +#[derive(Resource, Debug, Clone, Copy, PartialEq, Reflect, Default)] |
| 167 | +#[reflect(Debug, Default, Resource, PartialEq)] |
| 168 | +#[cfg_attr( |
| 169 | + feature = "serialize", |
| 170 | + derive(serde::Serialize, serde::Deserialize), |
| 171 | + reflect(Serialize, Deserialize) |
| 172 | +)] |
| 173 | +pub struct AccumulatedMouseMotion { |
| 174 | + /// The change in mouse position. |
| 175 | + pub delta: Vec2, |
| 176 | +} |
| 177 | + |
| 178 | +/// Tracks how much the mouse has scrolled every frame. |
| 179 | +/// |
| 180 | +/// This resource is reset to zero every frame. |
| 181 | +/// |
| 182 | +/// This resource sums the total [`MouseWheel`] events received this frame. |
| 183 | +#[derive(Resource, Debug, Clone, Copy, PartialEq, Reflect)] |
| 184 | +#[reflect(Debug, Default, Resource, PartialEq)] |
| 185 | +#[cfg_attr( |
| 186 | + feature = "serialize", |
| 187 | + derive(serde::Serialize, serde::Deserialize), |
| 188 | + reflect(Serialize, Deserialize) |
| 189 | +)] |
| 190 | +pub struct AccumulatedMouseScroll { |
| 191 | + /// The mouse scroll unit. |
| 192 | + /// If this value changes while scrolling, then the |
| 193 | + /// result of the accumulation could be incorrect |
| 194 | + pub unit: MouseScrollUnit, |
| 195 | + /// The change in scroll position. |
| 196 | + pub delta: Vec2, |
| 197 | +} |
| 198 | + |
| 199 | +impl Default for AccumulatedMouseScroll { |
| 200 | + fn default() -> Self { |
| 201 | + Self { |
| 202 | + unit: MouseScrollUnit::Line, |
| 203 | + delta: Vec2::ZERO, |
| 204 | + } |
| 205 | + } |
| 206 | +} |
| 207 | + |
| 208 | +/// Updates the [`AccumulatedMouseMotion`] resource using the [`MouseMotion`] event. |
| 209 | +/// The value of [`AccumulatedMouseMotion`] is reset to zero every frame |
| 210 | +pub fn accumulate_mouse_motion_system( |
| 211 | + mut mouse_motion_event: EventReader<MouseMotion>, |
| 212 | + mut accumulated_mouse_motion: ResMut<AccumulatedMouseMotion>, |
| 213 | +) { |
| 214 | + let mut delta = Vec2::ZERO; |
| 215 | + for event in mouse_motion_event.read() { |
| 216 | + delta += event.delta; |
| 217 | + } |
| 218 | + accumulated_mouse_motion.delta = delta; |
| 219 | +} |
| 220 | + |
| 221 | +/// Updates the [`AccumulatedMouseScroll`] resource using the [`MouseWheel`] event. |
| 222 | +/// The value of [`AccumulatedMouseScroll`] is reset to zero every frame |
| 223 | +pub fn accumulate_mouse_scroll_system( |
| 224 | + mut mouse_scroll_event: EventReader<MouseWheel>, |
| 225 | + mut accumulated_mouse_scroll: ResMut<AccumulatedMouseScroll>, |
| 226 | +) { |
| 227 | + let mut delta = Vec2::ZERO; |
| 228 | + let mut unit = MouseScrollUnit::Line; |
| 229 | + for event in mouse_scroll_event.read() { |
| 230 | + if event.unit != unit { |
| 231 | + unit = event.unit; |
| 232 | + } |
| 233 | + delta += Vec2::new(event.x, event.y); |
| 234 | + } |
| 235 | + accumulated_mouse_scroll.delta = delta; |
| 236 | + accumulated_mouse_scroll.unit = unit; |
| 237 | +} |
0 commit comments