fromsoftware_shared/
matrix.rs1use 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}