1use super::*;
2
3impl Matrix4x4 {
4 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 #[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 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}