fromsoftware_shared/
matrix.rs

1/// Defines some helper methods around dealing with math
2use std::ops::{Add, Mul, Sub};
3
4use nalgebra::RowVector4;
5use nalgebra_glm::{Mat4, Vec3};
6
7#[repr(C, align(16))]
8#[derive(Debug, Clone, Copy)]
9pub struct FSVector4(pub f32, pub f32, pub f32, pub f32);
10
11impl Sub<FSVector4> for FSVector4 {
12    type Output = FSVector4;
13
14    fn sub(self, rhs: FSVector4) -> Self::Output {
15        FSVector4(
16            self.0 - rhs.0,
17            self.1 - rhs.1,
18            self.2 - rhs.2,
19            self.3 - rhs.3,
20        )
21    }
22}
23
24impl Add<FSVector4> for FSVector4 {
25    type Output = FSVector4;
26
27    fn add(self, rhs: FSVector4) -> Self::Output {
28        FSVector4(
29            self.0 - rhs.0,
30            self.1 - rhs.1,
31            self.2 - rhs.2,
32            self.3 - rhs.3,
33        )
34    }
35}
36
37#[repr(C)]
38#[derive(Debug, Clone, Copy)]
39pub struct FSVector3(pub f32, pub f32, pub f32);
40impl From<FSVector3> for Vec3 {
41    fn from(val: FSVector3) -> Self {
42        Vec3::new(val.0, val.1, val.2)
43    }
44}
45
46#[repr(C)]
47#[derive(Debug, Clone)]
48pub struct FSMatrix4x4(pub FSVector4, pub FSVector4, pub FSVector4, pub FSVector4);
49
50impl From<FSMatrix4x4> for Mat4 {
51    fn from(val: FSMatrix4x4) -> Self {
52        Mat4::from_rows(&[
53            RowVector4::new(val.0 .0, val.0 .1, val.0 .2, val.0 .3),
54            RowVector4::new(val.1 .0, val.1 .1, val.1 .2, val.1 .3),
55            RowVector4::new(val.2 .0, val.2 .1, val.2 .2, val.2 .3),
56            RowVector4::new(val.3 .0, val.3 .1, val.3 .2, val.3 .3),
57        ])
58    }
59}
60
61impl From<Mat4> for FSMatrix4x4 {
62    fn from(value: Mat4) -> Self {
63        Self(
64            FSVector4(value.m11, value.m12, value.m13, value.m14),
65            FSVector4(value.m21, value.m22, value.m23, value.m24),
66            FSVector4(value.m31, value.m32, value.m33, value.m34),
67            FSVector4(value.m41, value.m42, value.m43, value.m44),
68        )
69    }
70}
71
72impl Mul<Mat4> for FSMatrix4x4 {
73    type Output = FSMatrix4x4;
74
75    fn mul(self, rhs: Mat4) -> Self::Output {
76        let lhs: Mat4 = self.clone().into();
77
78        (lhs * rhs).into()
79    }
80}