three_d/renderer/control/
fly_control.rs1use super::*;
2
3#[derive(Clone, Copy, Debug)]
7pub struct FlyControl {
8 pub speed: f32,
10}
11
12impl FlyControl {
13 pub fn new(speed: f32) -> Self {
15 Self { speed }
16 }
17
18 pub fn handle_events(
20 &mut self,
21 camera: &mut three_d_asset::Camera,
22 events: &mut [Event],
23 ) -> bool {
24 let mut change = false;
25 for event in events.iter_mut() {
26 match event {
27 Event::MouseMotion {
28 delta,
29 button,
30 handled,
31 ..
32 } if !*handled => {
33 if Some(MouseButton::Left) == *button {
34 camera.yaw(radians(delta.0 * std::f32::consts::PI / 1800.0));
35 camera.pitch(radians(delta.1 * std::f32::consts::PI / 1800.0));
36 *handled = true;
37 change = true;
38 }
39 if Some(MouseButton::Right) == *button {
40 let right = camera.right_direction();
41 let up = right.cross(camera.view_direction());
42 camera.translate(-right * delta.0 * self.speed + up * delta.1 * self.speed);
43 *handled = true;
44 change = true;
45 }
46 }
47 Event::MouseWheel { delta, handled, .. } if !*handled => {
48 let v = camera.view_direction() * self.speed * delta.1;
49 camera.translate(v);
50 *handled = true;
51 change = true;
52 }
53 _ => {}
54 }
55 }
56 change
57 }
58}