Skip to main content

windows_numerics/
matrix4x4.rs

1use super::*;
2
3impl Matrix4x4 {
4    /// Returns a matrix that translates by `(x, y, z)`.
5    pub const fn translation(x: f32, y: f32, z: f32) -> Self {
6        Self {
7            m11: 1.0,
8            m12: 0.0,
9            m13: 0.0,
10            m14: 0.0,
11            m21: 0.0,
12            m22: 1.0,
13            m23: 0.0,
14            m24: 0.0,
15            m31: 0.0,
16            m32: 0.0,
17            m33: 1.0,
18            m34: 0.0,
19            m41: x,
20            m42: y,
21            m43: z,
22            m44: 1.0,
23        }
24    }
25    /// Returns a matrix that rotates by `degree` degrees about the y-axis.
26    #[cfg(feature = "std")]
27    pub fn rotation_y(degree: f32) -> Self {
28        let (sin, cos) = degree.to_radians().sin_cos();
29        Self {
30            m11: cos,
31            m12: 0.0,
32            m13: -sin,
33            m14: 0.0,
34            m21: 0.0,
35            m22: 1.0,
36            m23: 0.0,
37            m24: 0.0,
38            m31: sin,
39            m32: 0.0,
40            m33: cos,
41            m34: 0.0,
42            m41: 0.0,
43            m42: 0.0,
44            m43: 0.0,
45            m44: 1.0,
46        }
47    }
48    /// Returns a perspective projection matrix for the given `depth`. A
49    /// non-positive `depth` produces no perspective foreshortening.
50    pub fn perspective_projection(depth: f32) -> Self {
51        let projection = if depth > 0.0 { -1.0 / depth } else { 0.0 };
52        Self {
53            m11: 1.0,
54            m12: 0.0,
55            m13: 0.0,
56            m14: 0.0,
57            m21: 0.0,
58            m22: 1.0,
59            m23: 0.0,
60            m24: 0.0,
61            m31: 0.0,
62            m32: 0.0,
63            m33: 1.0,
64            m34: projection,
65            m41: 0.0,
66            m42: 0.0,
67            m43: 0.0,
68            m44: 1.0,
69        }
70    }
71    fn impl_add(&self, rhs: &Self) -> Self {
72        Self {
73            m11: self.m11 + rhs.m11,
74            m12: self.m12 + rhs.m12,
75            m13: self.m13 + rhs.m13,
76            m14: self.m14 + rhs.m14,
77            m21: self.m21 + rhs.m21,
78            m22: self.m22 + rhs.m22,
79            m23: self.m23 + rhs.m23,
80            m24: self.m24 + rhs.m24,
81            m31: self.m31 + rhs.m31,
82            m32: self.m32 + rhs.m32,
83            m33: self.m33 + rhs.m33,
84            m34: self.m34 + rhs.m34,
85            m41: self.m41 + rhs.m41,
86            m42: self.m42 + rhs.m42,
87            m43: self.m43 + rhs.m43,
88            m44: self.m44 + rhs.m44,
89        }
90    }
91    fn impl_sub(&self, rhs: &Self) -> Self {
92        Self {
93            m11: self.m11 - rhs.m11,
94            m12: self.m12 - rhs.m12,
95            m13: self.m13 - rhs.m13,
96            m14: self.m14 - rhs.m14,
97            m21: self.m21 - rhs.m21,
98            m22: self.m22 - rhs.m22,
99            m23: self.m23 - rhs.m23,
100            m24: self.m24 - rhs.m24,
101            m31: self.m31 - rhs.m31,
102            m32: self.m32 - rhs.m32,
103            m33: self.m33 - rhs.m33,
104            m34: self.m34 - rhs.m34,
105            m41: self.m41 - rhs.m41,
106            m42: self.m42 - rhs.m42,
107            m43: self.m43 - rhs.m43,
108            m44: self.m44 - rhs.m44,
109        }
110    }
111    fn impl_mul(&self, rhs: &Self) -> Self {
112        Self {
113            m11: self.m11 * rhs.m11 + self.m12 * rhs.m21 + self.m13 * rhs.m31 + self.m14 * rhs.m41,
114            m12: self.m11 * rhs.m12 + self.m12 * rhs.m22 + self.m13 * rhs.m32 + self.m14 * rhs.m42,
115            m13: self.m11 * rhs.m13 + self.m12 * rhs.m23 + self.m13 * rhs.m33 + self.m14 * rhs.m43,
116            m14: self.m11 * rhs.m14 + self.m12 * rhs.m24 + self.m13 * rhs.m34 + self.m14 * rhs.m44,
117            m21: self.m21 * rhs.m11 + self.m22 * rhs.m21 + self.m23 * rhs.m31 + self.m24 * rhs.m41,
118            m22: self.m21 * rhs.m12 + self.m22 * rhs.m22 + self.m23 * rhs.m32 + self.m24 * rhs.m42,
119            m23: self.m21 * rhs.m13 + self.m22 * rhs.m23 + self.m23 * rhs.m33 + self.m24 * rhs.m43,
120            m24: self.m21 * rhs.m14 + self.m22 * rhs.m24 + self.m23 * rhs.m34 + self.m24 * rhs.m44,
121            m31: self.m31 * rhs.m11 + self.m32 * rhs.m21 + self.m33 * rhs.m31 + self.m34 * rhs.m41,
122            m32: self.m31 * rhs.m12 + self.m32 * rhs.m22 + self.m33 * rhs.m32 + self.m34 * rhs.m42,
123            m33: self.m31 * rhs.m13 + self.m32 * rhs.m23 + self.m33 * rhs.m33 + self.m34 * rhs.m43,
124            m34: self.m31 * rhs.m14 + self.m32 * rhs.m24 + self.m33 * rhs.m34 + self.m34 * rhs.m44,
125            m41: self.m41 * rhs.m11 + self.m42 * rhs.m21 + self.m43 * rhs.m31 + self.m44 * rhs.m41,
126            m42: self.m41 * rhs.m12 + self.m42 * rhs.m22 + self.m43 * rhs.m32 + self.m44 * rhs.m42,
127            m43: self.m41 * rhs.m13 + self.m42 * rhs.m23 + self.m43 * rhs.m33 + self.m44 * rhs.m43,
128            m44: self.m41 * rhs.m14 + self.m42 * rhs.m24 + self.m43 * rhs.m34 + self.m44 * rhs.m44,
129        }
130    }
131    fn impl_mul_f32(&self, rhs: f32) -> Self {
132        Self {
133            m11: self.m11 * rhs,
134            m12: self.m12 * rhs,
135            m13: self.m13 * rhs,
136            m14: self.m14 * rhs,
137            m21: self.m21 * rhs,
138            m22: self.m22 * rhs,
139            m23: self.m23 * rhs,
140            m24: self.m24 * rhs,
141            m31: self.m31 * rhs,
142            m32: self.m32 * rhs,
143            m33: self.m33 * rhs,
144            m34: self.m34 * rhs,
145            m41: self.m41 * rhs,
146            m42: self.m42 * rhs,
147            m43: self.m43 * rhs,
148            m44: self.m44 * rhs,
149        }
150    }
151}
152
153impl core::ops::Add<Self> for Matrix4x4 {
154    type Output = Self;
155    fn add(self, rhs: Self) -> Self {
156        self.impl_add(&rhs)
157    }
158}
159impl core::ops::Add<&Self> for Matrix4x4 {
160    type Output = Self;
161    fn add(self, rhs: &Self) -> Self {
162        self.impl_add(rhs)
163    }
164}
165impl core::ops::Add<Matrix4x4> for &Matrix4x4 {
166    type Output = Matrix4x4;
167    fn add(self, rhs: Matrix4x4) -> Matrix4x4 {
168        self.impl_add(&rhs)
169    }
170}
171impl core::ops::Add<&Matrix4x4> for &Matrix4x4 {
172    type Output = Matrix4x4;
173    fn add(self, rhs: &Matrix4x4) -> Matrix4x4 {
174        self.impl_add(rhs)
175    }
176}
177impl core::ops::Sub<Self> for Matrix4x4 {
178    type Output = Self;
179    fn sub(self, rhs: Self) -> Self {
180        self.impl_sub(&rhs)
181    }
182}
183impl core::ops::Sub<&Self> for Matrix4x4 {
184    type Output = Self;
185    fn sub(self, rhs: &Self) -> Self {
186        self.impl_sub(rhs)
187    }
188}
189impl core::ops::Sub<Matrix4x4> for &Matrix4x4 {
190    type Output = Matrix4x4;
191    fn sub(self, rhs: Matrix4x4) -> Matrix4x4 {
192        self.impl_sub(&rhs)
193    }
194}
195impl core::ops::Sub<&Matrix4x4> for &Matrix4x4 {
196    type Output = Matrix4x4;
197    fn sub(self, rhs: &Matrix4x4) -> Matrix4x4 {
198        self.impl_sub(rhs)
199    }
200}
201impl core::ops::Mul<Self> for Matrix4x4 {
202    type Output = Self;
203    fn mul(self, rhs: Self) -> Self {
204        self.impl_mul(&rhs)
205    }
206}
207impl core::ops::Mul<&Self> for Matrix4x4 {
208    type Output = Self;
209    fn mul(self, rhs: &Self) -> Self {
210        self.impl_mul(rhs)
211    }
212}
213impl core::ops::Mul<Matrix4x4> for &Matrix4x4 {
214    type Output = Matrix4x4;
215    fn mul(self, rhs: Matrix4x4) -> Matrix4x4 {
216        self.impl_mul(&rhs)
217    }
218}
219impl core::ops::Mul<&Matrix4x4> for &Matrix4x4 {
220    type Output = Matrix4x4;
221    fn mul(self, rhs: &Matrix4x4) -> Matrix4x4 {
222        self.impl_mul(rhs)
223    }
224}
225impl core::ops::Mul<f32> for Matrix4x4 {
226    type Output = Self;
227    fn mul(self, rhs: f32) -> Self {
228        self.impl_mul_f32(rhs)
229    }
230}
231impl core::ops::Mul<f32> for &Matrix4x4 {
232    type Output = Matrix4x4;
233    fn mul(self, rhs: f32) -> Matrix4x4 {
234        self.impl_mul_f32(rhs)
235    }
236}