three_d/renderer/control/
fly_control.rs

1use crate::renderer::*;
2
3///
4/// A control that makes the camera fly through the 3D scene.
5///
6#[derive(Clone, Copy, Debug)]
7pub struct FlyControl {
8    /// The speed of movements.
9    pub speed: f32,
10}
11
12impl FlyControl {
13    /// Creates a new fly control with the given speed of movements.
14    pub fn new(speed: f32) -> Self {
15        Self { speed }
16    }
17
18    /// Handles the events. Must be called each frame.
19    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}