Skip to main content

three_d/renderer/control/
fly_control.rs

1use super::*;
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(
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}