three_d/renderer/control/
fly_control.rs1use crate::renderer::*;
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(&mut self, camera: &mut Camera, events: &mut [Event]) -> bool {
20 let mut change = false;
21 for event in events.iter_mut() {
22 match event {
23 Event::MouseMotion {
24 delta,
25 button,
26 handled,
27 ..
28 } => {
29 if !*handled {
30 if Some(MouseButton::Left) == *button {
31 camera.yaw(radians(delta.0 * std::f32::consts::PI / 1800.0));
32 camera.pitch(radians(delta.1 * std::f32::consts::PI / 1800.0));
33 *handled = true;
34 change = true;
35 }
36 if Some(MouseButton::Right) == *button {
37 let right = camera.right_direction();
38 let up = right.cross(camera.view_direction());
39 camera.translate(
40 -right * delta.0 * self.speed + up * delta.1 * self.speed,
41 );
42 *handled = true;
43 change = true;
44 }
45 }
46 }
47 Event::MouseWheel { delta, handled, .. } => {
48 if !*handled {
49 let v = camera.view_direction() * self.speed * delta.1;
50 camera.translate(v);
51 *handled = true;
52 change = true;
53 }
54 }
55 _ => {}
56 }
57 }
58 change
59 }
60}