aboutsummaryrefslogtreecommitdiff
path: root/stockton-types
diff options
context:
space:
mode:
authortcmal <me@aria.rip>2024-08-25 17:44:22 +0100
committertcmal <me@aria.rip>2024-08-25 17:44:22 +0100
commitcde43cfd5c285dc213895cebc305d9ba7f094d1a (patch)
tree426b3179b2367d8823dd6ed537ba4548214f8cd6 /stockton-types
parent1a0ac4464c2053e8b08e867c3abb77b89d951d9c (diff)
feat(contrib): add mouse input to flycam controls
Diffstat (limited to 'stockton-types')
-rw-r--r--stockton-types/src/components/mod.rs39
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)