mirror of
https://github.com/storytold/storyteller-bevy.git
synced 2026-10-28 08:58:07 +00:00
fix mouse motion delta counting
This commit is contained in:
@@ -100,6 +100,7 @@ fn camera_control_kinematic(
|
|||||||
Lifecycle::Stop => any_stopped = true,
|
Lifecycle::Stop => any_stopped = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
match motion {
|
match motion {
|
||||||
Pan(delta) => do_pan(proj, &window, *delta, &mut xform, &mut controller),
|
Pan(delta) => do_pan(proj, &window, *delta, &mut xform, &mut controller),
|
||||||
Zoom(delta) => do_zoom(&window, *delta, &mut xform, &mut controller),
|
Zoom(delta) => do_zoom(&window, *delta, &mut xform, &mut controller),
|
||||||
|
|||||||
+31
-10
@@ -12,6 +12,19 @@ pub struct StudioInputPlugin;
|
|||||||
impl Plugin for StudioInputPlugin {
|
impl Plugin for StudioInputPlugin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
app.add_event::<InputAction>();
|
app.add_event::<InputAction>();
|
||||||
|
|
||||||
|
|
||||||
|
// Reading each frame of the mouse delta allows
|
||||||
|
// to get rid of the bug that delta is counted from the last reading,
|
||||||
|
// which leads to camera jumps if you move the mouse between clicks
|
||||||
|
app.add_systems(
|
||||||
|
PreUpdate,
|
||||||
|
read_mouse_delta
|
||||||
|
.in_set(StudioInputSystem)
|
||||||
|
.after(bevy::input::InputSystem),
|
||||||
|
);
|
||||||
|
app.init_resource::<LastFrameMouseDelta>();
|
||||||
|
|
||||||
app.add_systems(
|
app.add_systems(
|
||||||
PreUpdate,
|
PreUpdate,
|
||||||
(
|
(
|
||||||
@@ -22,7 +35,8 @@ impl Plugin for StudioInputPlugin {
|
|||||||
send_undo_event
|
send_undo_event
|
||||||
)
|
)
|
||||||
.in_set(StudioInputSystem)
|
.in_set(StudioInputSystem)
|
||||||
.after(bevy::input::InputSystem),
|
.after(bevy::input::InputSystem)
|
||||||
|
.after(read_mouse_delta),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -71,6 +85,7 @@ impl From<Selection> for Action {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: Make the bindings of raw device inputs to InputActions configurable
|
// TODO: Make the bindings of raw device inputs to InputActions configurable
|
||||||
|
|
||||||
fn translate_selection_events(keyboard: Res<Input<KeyCode>>, mut input: EventWriter<InputAction>) {
|
fn translate_selection_events(keyboard: Res<Input<KeyCode>>, mut input: EventWriter<InputAction>) {
|
||||||
@@ -98,14 +113,14 @@ fn translate_debug_toggle(keyboard: Res<Input<KeyCode>>, mut input: EventWriter<
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn translate_dcc_camera_events(
|
fn translate_dcc_camera_events(
|
||||||
mouse_motion: EventReader<MouseMotion>,
|
mouse_motion: Res<LastFrameMouseDelta>,
|
||||||
mouse_buttons: Res<Input<MouseButton>>,
|
mouse_buttons: Res<Input<MouseButton>>,
|
||||||
keyboard: Res<Input<KeyCode>>,
|
keyboard: Res<Input<KeyCode>>,
|
||||||
mut input: EventWriter<InputAction>,
|
mut input: EventWriter<InputAction>,
|
||||||
) {
|
) {
|
||||||
|
let delta = mouse_motion.get();
|
||||||
// Camera Pan
|
// Camera Pan
|
||||||
if mouse_buttons.pressed(MouseButton::Middle) {
|
if mouse_buttons.pressed(MouseButton::Middle) {
|
||||||
let delta = read_mouse_delta(mouse_motion);
|
|
||||||
let lifecycle = if mouse_buttons.just_pressed(MouseButton::Middle) {
|
let lifecycle = if mouse_buttons.just_pressed(MouseButton::Middle) {
|
||||||
Lifecycle::Start
|
Lifecycle::Start
|
||||||
} else {
|
} else {
|
||||||
@@ -123,7 +138,6 @@ fn translate_dcc_camera_events(
|
|||||||
// Camera Orbit/Zoom
|
// Camera Orbit/Zoom
|
||||||
else if keyboard.any_pressed([KeyCode::AltLeft, KeyCode::AltRight]) {
|
else if keyboard.any_pressed([KeyCode::AltLeft, KeyCode::AltRight]) {
|
||||||
if mouse_buttons.any_pressed([MouseButton::Left, MouseButton::Right]) {
|
if mouse_buttons.any_pressed([MouseButton::Left, MouseButton::Right]) {
|
||||||
let delta = read_mouse_delta(mouse_motion);
|
|
||||||
let lifecycle =
|
let lifecycle =
|
||||||
if mouse_buttons.any_just_pressed([MouseButton::Left, MouseButton::Right]) {
|
if mouse_buttons.any_just_pressed([MouseButton::Left, MouseButton::Right]) {
|
||||||
Lifecycle::Start
|
Lifecycle::Start
|
||||||
@@ -169,7 +183,6 @@ fn translate_dcc_camera_events(
|
|||||||
Lifecycle::Ongoing
|
Lifecycle::Ongoing
|
||||||
};
|
};
|
||||||
|
|
||||||
let delta = read_mouse_delta(mouse_motion);
|
|
||||||
input.send(InputAction(lifecycle, CameraMotion::Rotate(delta).into()));
|
input.send(InputAction(lifecycle, CameraMotion::Rotate(delta).into()));
|
||||||
}
|
}
|
||||||
// Stop Camera Rotation
|
// Stop Camera Rotation
|
||||||
@@ -187,7 +200,6 @@ fn translate_dcc_camera_events(
|
|||||||
Lifecycle::Ongoing
|
Lifecycle::Ongoing
|
||||||
};
|
};
|
||||||
|
|
||||||
let delta = read_mouse_delta(mouse_motion);
|
|
||||||
input.send(InputAction(lifecycle, CameraMotion::Rotate(delta).into()));
|
input.send(InputAction(lifecycle, CameraMotion::Rotate(delta).into()));
|
||||||
}
|
}
|
||||||
// Stop Camera Rotation
|
// Stop Camera Rotation
|
||||||
@@ -287,11 +299,20 @@ fn translate_fps_camera_events(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[derive(Resource, Default)]
|
||||||
fn read_mouse_delta(mut mouse_motion: EventReader<MouseMotion>) -> Vec2 {
|
pub struct LastFrameMouseDelta(pub Vec2);
|
||||||
mouse_motion
|
|
||||||
|
impl LastFrameMouseDelta {
|
||||||
|
fn get(&self) -> Vec2 {
|
||||||
|
self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_mouse_delta(mut mouse_motion: EventReader<MouseMotion>, mut last_delta: ResMut<LastFrameMouseDelta>) {
|
||||||
|
let delta = mouse_motion
|
||||||
.read()
|
.read()
|
||||||
.fold(Vec2::ZERO, |accum, current| accum + current.delta)
|
.fold(Vec2::ZERO, |accum, current| accum + current.delta);
|
||||||
|
last_delta.0 = delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user