From cde43cfd5c285dc213895cebc305d9ba7f094d1a Mon Sep 17 00:00:00 2001 From: tcmal Date: Sun, 25 Aug 2024 17:44:22 +0100 Subject: feat(contrib): add mouse input to flycam controls --- stockton-types/src/components/mod.rs | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'stockton-types/src/components/mod.rs') 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 . */ +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) -- cgit v1.2.3