veloren_voxygen/
key_state.rs

1use vek::Vec2;
2
3pub struct KeyState {
4    pub right: bool,
5    pub left: bool,
6    pub up: bool,
7    pub down: bool,
8    pub swim_up: bool,
9    pub swim_down: bool,
10    pub fly: bool,
11    pub auto_walk: bool,
12    pub speed_mul: f32,
13    pub trade: bool,
14    pub analog_matrix: Vec2<f32>,
15}
16
17impl Default for KeyState {
18    fn default() -> Self {
19        Self {
20            right: false,
21            left: false,
22            up: false,
23            down: false,
24            swim_up: false,
25            swim_down: false,
26            fly: false,
27            auto_walk: false,
28            speed_mul: 1.0,
29            trade: false,
30            analog_matrix: Vec2::zero(),
31        }
32    }
33}
34
35impl KeyState {
36    pub fn dir_vec(&self) -> Vec2<f32> {
37        let dir = if self.analog_matrix == Vec2::zero() {
38            Vec2::<f32>::new(
39                if self.right { 1.0 } else { 0.0 } + if self.left { -1.0 } else { 0.0 },
40                if self.up || self.auto_walk { 1.0 } else { 0.0 }
41                    + if self.down { -1.0 } else { 0.0 },
42            )
43            .try_normalized()
44            .unwrap_or_default()
45        } else {
46            self.analog_matrix
47        } * self.speed_mul;
48
49        if dir.magnitude_squared() <= 1.0 {
50            dir
51        } else {
52            dir.normalized()
53        }
54    }
55}