diff options
author | tcmal <me@aria.rip> | 2024-08-25 17:44:22 +0100 |
---|---|---|
committer | tcmal <me@aria.rip> | 2024-08-25 17:44:22 +0100 |
commit | cde43cfd5c285dc213895cebc305d9ba7f094d1a (patch) | |
tree | 426b3179b2367d8823dd6ed537ba4548214f8cd6 /stockton-types | |
parent | 1a0ac4464c2053e8b08e867c3abb77b89d951d9c (diff) |
feat(contrib): add mouse input to flycam controls
Diffstat (limited to 'stockton-types')
-rw-r--r-- | stockton-types/src/components/mod.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/stockton-types/src/components/mod.rs b/stockton-types/src/components/mod.rs index 6f127c1..f5d12e7 100644 --- a/stockton-types/src/components/mod.rs +++ b/stockton-types/src/components/mod.rs @@ -15,8 +15,17 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +use na::{Mat4, Vec4}; +use std::f32::consts::PI; + use crate::Vector3; +/// 90 degrees in radians +const R89: f32 = (PI / 180.0) * 89.0; + +/// 180 degrees in radians +const R180: f32 = PI; + #[derive(Clone, Copy, Debug, PartialEq)] pub struct Transform { /// Position of the object @@ -26,6 +35,36 @@ pub struct Transform { pub rotation: Vector3, } +impl Transform { + pub fn rotate(&mut self, vec: Vector3) { + self.rotation += vec; + + // Clamp -pi/2 < pitch < pi/2 + if self.rotation.x > R89 { + self.rotation.x = R89; + } else if self.rotation.x <= -R89 { + self.rotation.x = -R89; + } + + // -pi < yaw <= pi + if self.rotation.y <= -R180 { + self.rotation.y = R180 - self.rotation.y % -R180; + } else if self.rotation.y > 180.0 { + self.rotation.y = -R180 + self.rotation.y % R180; + } + } + + pub fn translate(&mut self, delta: Vector3) { + let rot_matrix = + Mat4::from_euler_angles(-self.rotation.x, self.rotation.y, self.rotation.z); + + let new = rot_matrix * Vec4::new(delta.x, delta.y, delta.z, 1.0); + self.position.x += new.x; + self.position.y += new.y; + self.position.z += new.z; + } +} + #[derive(Clone, Copy, Debug, PartialEq)] pub struct CameraSettings { /// FOV (radians) |