NW4F G3d
Loading...
Searching...
No Matches
g3d_Matrix44-inl.h
Go to the documentation of this file.
1#include <nw/g3d/math/g3d_MathCommon.h>
2#include <nw/g3d/math/g3d_Vector3.h>
3#include <nw/g3d/math/g3d_Vector4.h>
4#include <nw/g3d/math/g3d_Matrix34.h>
5#include <nw/g3d/math/g3d_Quaternion.h>
6
7namespace nw { namespace g3d { namespace math {
8
11 float m00, float m01, float m02, float m03,
12 float m10, float m11, float m12, float m13,
13 float m20, float m21, float m22, float m23,
14 float m30, float m31, float m32, float m33)
15{
16 return Mtx44().Set(
17 m00, m01, m02, m03,
18 m10, m11, m12, m13,
19 m20, m21, m22, m23,
20 m30, m31, m32, m33);
21}
22
24Mtx44* Mtx44::Cast(float* a)
25{
26 return reinterpret_cast<Mtx44*>(a);
27}
28
30const Mtx44* Mtx44::Cast(const float* a)
31{
32 return reinterpret_cast<const Mtx44*>(a);
33}
34
37 float m00, float m01, float m02, float m03,
38 float m10, float m11, float m12, float m13,
39 float m20, float m21, float m22, float m23,
40 float m30, float m31, float m32, float m33)
41{
42 v[0].Set(m00, m01, m02, m03);
43 v[1].Set(m10, m11, m12, m13);
44 v[2].Set(m20, m21, m22, m23);
45 v[3].Set(m30, m31, m32, m33);
46 return *this;
47}
48
50Mtx44& Mtx44::Set(const float* a)
51{
53 for (int i = 0; i < DIM; ++i)
54 {
55 this->a[i] = a[i];
56 }
57 return *this;
58}
59
61Mtx44& Mtx44::Set(const Mtx44& m)
62{
63 for (int i = 0; i < DIM_MAJOR; ++i)
64 {
65 v[i].Set(m.v[i]);
66 }
67 return *this;
68}
69
71Mtx44& Mtx44::Set(const Vec4& x, const Vec4& y, const Vec4& z, const Vec4& w)
72{
73 Set(x.x, y.x, z.x, w.x, x.y, y.y, z.y, w.y, x.z, y.z, z.z, w.z, x.w, y.w, z.w, w.w);
74 return *this;
75}
76
79{
80 for (int i = 0; i < DIM; ++i)
81 {
82 a[i] = 0.0f;
83 }
84 return *this;
85}
86
89{
90 v[0].Set(1.0f, 0.0f, 0.0f, 0.0f);
91 v[1].Set(0.0f, 1.0f, 0.0f, 0.0f);
92 v[2].Set(0.0f, 0.0f, 1.0f, 0.0f);
93 v[3].Set(0.0f, 0.0f, 0.0f, 1.0f);
94 return *this;
95}
96
98Mtx44& Mtx44::Neg(const Mtx44& m)
99{
100 for (int i = 0; i < DIM; ++i)
101 {
102 a[i] = -m.a[i];
103 }
104 return *this;
105}
106
107//--------------------------------------------------------------------------------------------------
108
110Mtx44& Mtx44::Add(const Mtx44& lhs, const Mtx44& rhs)
111{
112 for (int i = 0; i < DIM; ++i)
113 {
114 a[i] = lhs.a[i] + rhs.a[i];
115 }
116 return *this;
117}
118
120Mtx44& Mtx44::Sub(const Mtx44& lhs, const Mtx44& rhs)
121{
122 for (int i = 0; i < DIM; ++i)
123 {
124 a[i] = lhs.a[i] - rhs.a[i];
125 }
126 return *this;
127}
128
130Mtx44& Mtx44::Mul(const Mtx44& lhs, const Mtx44& rhs)
131{
132 Mtx44 out;
133
134 out.m00 = lhs.m00 * rhs.m00 + lhs.m01 * rhs.m10 + lhs.m02 * rhs.m20 + lhs.m03 * rhs.m30;
135 out.m01 = lhs.m00 * rhs.m01 + lhs.m01 * rhs.m11 + lhs.m02 * rhs.m21 + lhs.m03 * rhs.m31;
136 out.m02 = lhs.m00 * rhs.m02 + lhs.m01 * rhs.m12 + lhs.m02 * rhs.m22 + lhs.m03 * rhs.m32;
137 out.m03 = lhs.m00 * rhs.m03 + lhs.m01 * rhs.m13 + lhs.m02 * rhs.m23 + lhs.m03 * rhs.m33;
138 out.m10 = lhs.m10 * rhs.m00 + lhs.m11 * rhs.m10 + lhs.m12 * rhs.m20 + lhs.m13 * rhs.m30;
139 out.m11 = lhs.m10 * rhs.m01 + lhs.m11 * rhs.m11 + lhs.m12 * rhs.m21 + lhs.m13 * rhs.m31;
140 out.m12 = lhs.m10 * rhs.m02 + lhs.m11 * rhs.m12 + lhs.m12 * rhs.m22 + lhs.m13 * rhs.m32;
141 out.m13 = lhs.m10 * rhs.m03 + lhs.m11 * rhs.m13 + lhs.m12 * rhs.m23 + lhs.m13 * rhs.m33;
142 out.m20 = lhs.m20 * rhs.m00 + lhs.m21 * rhs.m10 + lhs.m22 * rhs.m20 + lhs.m23 * rhs.m30;
143 out.m21 = lhs.m20 * rhs.m01 + lhs.m21 * rhs.m11 + lhs.m22 * rhs.m21 + lhs.m23 * rhs.m31;
144 out.m22 = lhs.m20 * rhs.m02 + lhs.m21 * rhs.m12 + lhs.m22 * rhs.m22 + lhs.m23 * rhs.m32;
145 out.m23 = lhs.m20 * rhs.m03 + lhs.m21 * rhs.m13 + lhs.m22 * rhs.m23 + lhs.m23 * rhs.m33;
146 out.m30 = lhs.m30 * rhs.m00 + lhs.m31 * rhs.m10 + lhs.m32 * rhs.m20 + lhs.m33 * rhs.m30;
147 out.m31 = lhs.m30 * rhs.m01 + lhs.m31 * rhs.m11 + lhs.m32 * rhs.m21 + lhs.m33 * rhs.m31;
148 out.m32 = lhs.m30 * rhs.m02 + lhs.m31 * rhs.m12 + lhs.m32 * rhs.m22 + lhs.m33 * rhs.m32;
149 out.m33 = lhs.m30 * rhs.m03 + lhs.m31 * rhs.m13 + lhs.m32 * rhs.m23 + lhs.m33 * rhs.m33;
150
151 return *this = out;
152}
153
155Mtx44& Mtx44::Mul(const Mtx44& lhs, float rhs)
156{
157 for (int i = 0; i < DIM; ++i)
158 {
159 a[i] = lhs.a[i] * rhs;
160 }
161 return *this;
162}
163
165Mtx44& Mtx44::Mul(const Mtx44& lhs, const Mtx34& rhs)
166{
167#if defined( __ghs__ )
168 const int ROW = 16;
169
170 f32x2 f0 = __PSQ_LX(&rhs, 0, 0, 0);
171 f32x2 f1 = __PSQ_LX(&rhs, 16, 0, 0);
172 f32x2 f2 = __PSQ_LX(&rhs, 32, 0, 0);
173 f32x2 f4 = __PSQ_LX(&rhs, 8, 0, 0);
174 f32x2 f5 = __PSQ_LX(&rhs, 24, 0, 0);
175 f32x2 f6 = __PSQ_LX(&rhs, 40, 0, 0);
176 f32x2 f7 = { 0, 1 };
177
178 f32x2 f8, f9, f10;
179
180 f8 = __PSQ_LX(&lhs, 0 * ROW + 0, 0, 0);
181 f9 = __PS_MULS0(f0, f8);
182 f10 = __PS_MULS0(f4, f8);
183 f9 = __PS_MADDS1(f1, f8, f9);
184 f10 = __PS_MADDS1(f5, f8, f10);
185 f8 = __PSQ_LX(&lhs, 0 * ROW + 8, 0, 0);
186 f9 = __PS_MADDS0(f2, f8, f9);
187 f10 = __PS_MADDS0(f6, f8, f10);
188 f10 = __PS_MADDS1(f7, f8, f10);
189 __PSQ_STX(this, 0 * ROW + 0, f9, 0, 0);
190 __PSQ_STX(this, 0 * ROW + 8, f10, 0, 0);
191
192 f8 = __PSQ_LX(&lhs, 1 * ROW + 0, 0, 0);
193 f9 = __PS_MULS0(f0, f8);
194 f10 = __PS_MULS0(f4, f8);
195 f9 = __PS_MADDS1(f1, f8, f9);
196 f10 = __PS_MADDS1(f5, f8, f10);
197 f8 = __PSQ_LX(&lhs, 1 * ROW + 8, 0, 0);
198 f9 = __PS_MADDS0(f2, f8, f9);
199 f10 = __PS_MADDS0(f6, f8, f10);
200 f10 = __PS_MADDS1(f7, f8, f10);
201 __PSQ_STX(this, 1 * ROW + 0, f9, 0, 0);
202 __PSQ_STX(this, 1 * ROW + 8, f10, 0, 0);
203
204 f8 = __PSQ_LX(&lhs, 2 * ROW + 0, 0, 0);
205 f9 = __PS_MULS0(f0, f8);
206 f10 = __PS_MULS0(f4, f8);
207 f9 = __PS_MADDS1(f1, f8, f9);
208 f10 = __PS_MADDS1(f5, f8, f10);
209 f8 = __PSQ_LX(&lhs, 2 * ROW + 8, 0, 0);
210 f9 = __PS_MADDS0(f2, f8, f9);
211 f10 = __PS_MADDS0(f6, f8, f10);
212 f10 = __PS_MADDS1(f7, f8, f10);
213 __PSQ_STX(this, 2 * ROW + 0, f9, 0, 0);
214 __PSQ_STX(this, 2 * ROW + 8, f10, 0, 0);
215
216 f8 = __PSQ_LX(&lhs, 3 * ROW + 0, 0, 0);
217 f9 = __PS_MULS0(f0, f8);
218 f10 = __PS_MULS0(f4, f8);
219 f9 = __PS_MADDS1(f1, f8, f9);
220 f10 = __PS_MADDS1(f5, f8, f10);
221 f8 = __PSQ_LX(&lhs, 3 * ROW + 8, 0, 0);
222 f9 = __PS_MADDS0(f2, f8, f9);
223 f10 = __PS_MADDS0(f6, f8, f10);
224 f10 = __PS_MADDS1(f7, f8, f10);
225 __PSQ_STX(this, 3 * ROW + 0, f9, 0, 0);
226 __PSQ_STX(this, 3 * ROW + 8, f10, 0, 0);
227
228 return *this;
229#else
230 Mtx44 out;
231 out.m00 = lhs.m00 * rhs.m00 + lhs.m01 * rhs.m10 + lhs.m02 * rhs.m20;
232 out.m01 = lhs.m00 * rhs.m01 + lhs.m01 * rhs.m11 + lhs.m02 * rhs.m21;
233 out.m02 = lhs.m00 * rhs.m02 + lhs.m01 * rhs.m12 + lhs.m02 * rhs.m22;
234 out.m03 = lhs.m00 * rhs.m03 + lhs.m01 * rhs.m13 + lhs.m02 * rhs.m23 + lhs.m03;
235 out.m10 = lhs.m10 * rhs.m00 + lhs.m11 * rhs.m10 + lhs.m12 * rhs.m20;
236 out.m11 = lhs.m10 * rhs.m01 + lhs.m11 * rhs.m11 + lhs.m12 * rhs.m21;
237 out.m12 = lhs.m10 * rhs.m02 + lhs.m11 * rhs.m12 + lhs.m12 * rhs.m22;
238 out.m13 = lhs.m10 * rhs.m03 + lhs.m11 * rhs.m13 + lhs.m12 * rhs.m23 + lhs.m13;
239 out.m20 = lhs.m20 * rhs.m00 + lhs.m21 * rhs.m10 + lhs.m22 * rhs.m20;
240 out.m21 = lhs.m20 * rhs.m01 + lhs.m21 * rhs.m11 + lhs.m22 * rhs.m21;
241 out.m22 = lhs.m20 * rhs.m02 + lhs.m21 * rhs.m12 + lhs.m22 * rhs.m22;
242 out.m23 = lhs.m20 * rhs.m03 + lhs.m21 * rhs.m13 + lhs.m22 * rhs.m23 + lhs.m23;
243 out.m30 = lhs.m30 * rhs.m00 + lhs.m31 * rhs.m10 + lhs.m32 * rhs.m20;
244 out.m31 = lhs.m30 * rhs.m01 + lhs.m31 * rhs.m11 + lhs.m32 * rhs.m21;
245 out.m32 = lhs.m30 * rhs.m02 + lhs.m31 * rhs.m12 + lhs.m32 * rhs.m22;
246 out.m33 = lhs.m30 * rhs.m03 + lhs.m31 * rhs.m13 + lhs.m32 * rhs.m23 + lhs.m33;
247
248 return *this = out;
249#endif
250}
251
253Mtx44& Mtx44::Mul(const Mtx34& lhs, const Mtx44& rhs)
254{
255#if defined( __ghs__ )
256 const int ROW = 16;
257
258 f32x2 f0 = __PSQ_LX(&rhs, 0, 0, 0);
259 f32x2 f1 = __PSQ_LX(&rhs, 16, 0, 0);
260 f32x2 f2 = __PSQ_LX(&rhs, 32, 0, 0);
261 f32x2 f3 = __PSQ_LX(&rhs, 48, 0, 0);
262 f32x2 f4 = __PSQ_LX(&rhs, 8, 0, 0);
263 f32x2 f5 = __PSQ_LX(&rhs, 24, 0, 0);
264 f32x2 f6 = __PSQ_LX(&rhs, 40, 0, 0);
265 f32x2 f7 = __PSQ_LX(&rhs, 56, 0, 0);
266
267 f32x2 f8, f9, f10;
268
269 f8 = __PSQ_LX(&lhs, 0 * ROW + 0, 0, 0);
270 f9 = __PS_MULS0(f0, f8);
271 f10 = __PS_MULS0(f4, f8);
272 f9 = __PS_MADDS1(f1, f8, f9);
273 f10 = __PS_MADDS1(f5, f8, f10);
274 f8 = __PSQ_LX(&lhs, 0 * ROW + 8, 0, 0);
275 f9 = __PS_MADDS0(f2, f8, f9);
276 f10 = __PS_MADDS0(f6, f8, f10);
277 f9 = __PS_MADDS1(f3, f8, f9);
278 f10 = __PS_MADDS1(f7, f8, f10);
279 __PSQ_STX(this, 0 * ROW + 0, f9, 0, 0);
280 __PSQ_STX(this, 0 * ROW + 8, f10, 0, 0);
281
282 f8 = __PSQ_LX(&lhs, 1 * ROW + 0, 0, 0);
283 f9 = __PS_MULS0(f0, f8);
284 f10 = __PS_MULS0(f4, f8);
285 f9 = __PS_MADDS1(f1, f8, f9);
286 f10 = __PS_MADDS1(f5, f8, f10);
287 f8 = __PSQ_LX(&lhs, 1 * ROW + 8, 0, 0);
288 f9 = __PS_MADDS0(f2, f8, f9);
289 f10 = __PS_MADDS0(f6, f8, f10);
290 f9 = __PS_MADDS1(f3, f8, f9);
291 f10 = __PS_MADDS1(f7, f8, f10);
292 __PSQ_STX(this, 1 * ROW + 0, f9, 0, 0);
293 __PSQ_STX(this, 1 * ROW + 8, f10, 0, 0);
294
295 f8 = __PSQ_LX(&lhs, 2 * ROW + 0, 0, 0);
296 f9 = __PS_MULS0(f0, f8);
297 f10 = __PS_MULS0(f4, f8);
298 f9 = __PS_MADDS1(f1, f8, f9);
299 f10 = __PS_MADDS1(f5, f8, f10);
300 f8 = __PSQ_LX(&lhs, 2 * ROW + 8, 0, 0);
301 f9 = __PS_MADDS0(f2, f8, f9);
302 f10 = __PS_MADDS0(f6, f8, f10);
303 f9 = __PS_MADDS1(f3, f8, f9);
304 f10 = __PS_MADDS1(f7, f8, f10);
305 __PSQ_STX(this, 2 * ROW + 0, f9, 0, 0);
306 __PSQ_STX(this, 2 * ROW + 8, f10, 0, 0);
307
308 __PSQ_STX(this, 3 * ROW + 0, f3, 0, 0);
309 __PSQ_STX(this, 3 * ROW + 8, f7, 0, 0);
310
311 return *this;
312#else
313 Mtx44 out;
314 out.m00 = lhs.m00 * rhs.m00 + lhs.m01 * rhs.m10 + lhs.m02 * rhs.m20 + lhs.m03 * rhs.m30;
315 out.m01 = lhs.m00 * rhs.m01 + lhs.m01 * rhs.m11 + lhs.m02 * rhs.m21 + lhs.m03 * rhs.m31;
316 out.m02 = lhs.m00 * rhs.m02 + lhs.m01 * rhs.m12 + lhs.m02 * rhs.m22 + lhs.m03 * rhs.m32;
317 out.m03 = lhs.m00 * rhs.m03 + lhs.m01 * rhs.m13 + lhs.m02 * rhs.m23 + lhs.m03 * rhs.m33;
318 out.m10 = lhs.m10 * rhs.m00 + lhs.m11 * rhs.m10 + lhs.m12 * rhs.m20 + lhs.m13 * rhs.m30;
319 out.m11 = lhs.m10 * rhs.m01 + lhs.m11 * rhs.m11 + lhs.m12 * rhs.m21 + lhs.m13 * rhs.m31;
320 out.m12 = lhs.m10 * rhs.m02 + lhs.m11 * rhs.m12 + lhs.m12 * rhs.m22 + lhs.m13 * rhs.m32;
321 out.m13 = lhs.m10 * rhs.m03 + lhs.m11 * rhs.m13 + lhs.m12 * rhs.m23 + lhs.m13 * rhs.m33;
322 out.m20 = lhs.m20 * rhs.m00 + lhs.m21 * rhs.m10 + lhs.m22 * rhs.m20 + lhs.m23 * rhs.m30;
323 out.m21 = lhs.m20 * rhs.m01 + lhs.m21 * rhs.m11 + lhs.m22 * rhs.m21 + lhs.m23 * rhs.m31;
324 out.m22 = lhs.m20 * rhs.m02 + lhs.m21 * rhs.m12 + lhs.m22 * rhs.m22 + lhs.m23 * rhs.m32;
325 out.m23 = lhs.m20 * rhs.m03 + lhs.m21 * rhs.m13 + lhs.m22 * rhs.m23 + lhs.m23 * rhs.m33;
326 out.m30 = rhs.m30;
327 out.m31 = rhs.m31;
328 out.m32 = rhs.m32;
329 out.m33 = rhs.m33;
330
331 return *this = out;
332#endif
333}
334
336Mtx44& Mtx44::Div(const Mtx44& lhs, float rhs)
337{
338 float rcp = Math::Rcp(rhs);
339 this->Mul(lhs, rcp);
340 return *this;
341}
342
344float Mtx44::Det(const Mtx44& m)
345{
346 float det =
347 m.m00 * m.m11 * m.m22 * m.m33 + m.m00 * m.m12 * m.m23 * m.m31 + m.m00 * m.m13 * m.m21 * m.m32 +
348 m.m01 * m.m10 * m.m23 * m.m32 + m.m01 * m.m12 * m.m20 * m.m33 + m.m01 * m.m13 * m.m22 * m.m30 +
349 m.m02 * m.m10 * m.m21 * m.m33 + m.m02 * m.m11 * m.m23 * m.m30 + m.m02 * m.m13 * m.m20 * m.m31 +
350 m.m03 * m.m10 * m.m22 * m.m31 + m.m03 * m.m11 * m.m20 * m.m32 + m.m03 * m.m12 * m.m21 * m.m30 -
351 m.m00 * m.m11 * m.m23 * m.m32 - m.m00 * m.m12 * m.m21 * m.m33 - m.m00 * m.m13 * m.m22 * m.m31 -
352 m.m01 * m.m10 * m.m22 * m.m33 - m.m01 * m.m12 * m.m23 * m.m30 - m.m01 * m.m13 * m.m20 * m.m32 -
353 m.m02 * m.m10 * m.m23 * m.m31 - m.m02 * m.m11 * m.m20 * m.m33 - m.m02 * m.m13 * m.m21 * m.m30 -
354 m.m03 * m.m10 * m.m21 * m.m32 - m.m03 * m.m11 * m.m22 * m.m30 - m.m03 * m.m12 * m.m20 * m.m31;
355 return det;
356}
357
360{
361 Mtx44 out;
362 out.m00 = m.m11 * m.m22 * m.m33 + m.m12 * m.m23 * m.m31 + m.m13 * m.m21 * m.m32 - m.m11 * m.m23 * m.m32 - m.m12 * m.m21 * m.m33 - m.m13 * m.m22 * m.m31;
363 out.m01 = m.m01 * m.m23 * m.m32 + m.m02 * m.m21 * m.m33 + m.m03 * m.m22 * m.m31 - m.m01 * m.m22 * m.m33 - m.m02 * m.m23 * m.m31 - m.m03 * m.m21 * m.m32;
364 out.m02 = m.m01 * m.m12 * m.m33 + m.m02 * m.m13 * m.m31 + m.m03 * m.m11 * m.m32 - m.m01 * m.m13 * m.m32 - m.m02 * m.m11 * m.m33 - m.m03 * m.m12 * m.m31;
365 out.m03 = m.m01 * m.m13 * m.m22 + m.m02 * m.m11 * m.m23 + m.m03 * m.m12 * m.m21 - m.m01 * m.m12 * m.m23 - m.m02 * m.m13 * m.m21 - m.m03 * m.m11 * m.m22;
366 out.m10 = m.m10 * m.m23 * m.m32 + m.m12 * m.m20 * m.m33 + m.m13 * m.m22 * m.m30 - m.m10 * m.m22 * m.m33 - m.m12 * m.m23 * m.m30 - m.m13 * m.m20 * m.m32;
367 out.m11 = m.m00 * m.m22 * m.m33 + m.m02 * m.m23 * m.m30 + m.m03 * m.m20 * m.m32 - m.m00 * m.m23 * m.m32 - m.m02 * m.m20 * m.m33 - m.m03 * m.m22 * m.m30;
368 out.m12 = m.m00 * m.m13 * m.m32 + m.m02 * m.m10 * m.m33 + m.m03 * m.m12 * m.m30 - m.m00 * m.m12 * m.m33 - m.m02 * m.m13 * m.m30 - m.m03 * m.m10 * m.m32;
369 out.m13 = m.m00 * m.m12 * m.m23 + m.m02 * m.m13 * m.m20 + m.m03 * m.m10 * m.m22 - m.m00 * m.m13 * m.m22 - m.m02 * m.m10 * m.m23 - m.m03 * m.m12 * m.m20;
370 out.m20 = m.m10 * m.m21 * m.m33 + m.m11 * m.m23 * m.m30 + m.m13 * m.m20 * m.m31 - m.m10 * m.m23 * m.m31 - m.m11 * m.m20 * m.m33 - m.m13 * m.m21 * m.m30;
371 out.m21 = m.m00 * m.m23 * m.m31 + m.m01 * m.m20 * m.m33 + m.m03 * m.m21 * m.m30 - m.m00 * m.m21 * m.m33 - m.m01 * m.m23 * m.m30 - m.m03 * m.m20 * m.m31;
372 out.m22 = m.m00 * m.m11 * m.m33 + m.m01 * m.m13 * m.m30 + m.m03 * m.m10 * m.m31 - m.m00 * m.m13 * m.m31 - m.m01 * m.m10 * m.m33 - m.m03 * m.m11 * m.m30;
373 out.m23 = m.m00 * m.m13 * m.m21 + m.m01 * m.m10 * m.m23 + m.m03 * m.m11 * m.m20 - m.m00 * m.m11 * m.m23 - m.m01 * m.m13 * m.m20 - m.m03 * m.m10 * m.m21;
374 out.m30 = m.m10 * m.m22 * m.m31 + m.m11 * m.m20 * m.m32 + m.m12 * m.m21 * m.m30 - m.m10 * m.m21 * m.m32 - m.m11 * m.m22 * m.m30 - m.m12 * m.m20 * m.m31;
375 out.m31 = m.m00 * m.m21 * m.m32 + m.m01 * m.m22 * m.m30 + m.m02 * m.m20 * m.m31 - m.m00 * m.m22 * m.m31 - m.m01 * m.m20 * m.m32 - m.m02 * m.m21 * m.m30;
376 out.m32 = m.m00 * m.m12 * m.m31 + m.m01 * m.m10 * m.m32 + m.m02 * m.m11 * m.m30 - m.m00 * m.m11 * m.m32 - m.m01 * m.m12 * m.m30 - m.m02 * m.m10 * m.m31;
377 out.m33 = m.m00 * m.m11 * m.m22 + m.m01 * m.m12 * m.m20 + m.m02 * m.m10 * m.m21 - m.m00 * m.m12 * m.m21 - m.m01 * m.m10 * m.m22 - m.m02 * m.m11 * m.m20;
378 return *this = out;
379}
380
382Mtx44& Mtx44::Inverse(float* pDet, const Mtx44& m)
383{
384 float det = Det(m);
385 *pDet = det;
386 Adjugate(m);
387 Div(*this, det);
388 return *this;
389}
390
392Mtx44& Mtx44::Perspective(float fovy, float aspect, float n, float f)
393{
394 const float angle = fovy * 0.5f;
395
396 const float cot = Math::Rcp(Math::Tan(angle));
397 const float rcpAspect = Math::Rcp(aspect);
398
399 m[0][0] = cot * rcpAspect;
400 m[0][1] = 0.0f;
401 m[0][2] = 0.0f;
402 m[0][3] = 0.0f;
403
404 m[1][0] = 0.0f;
405 m[1][1] = cot;
406 m[1][2] = 0.0f;
407 m[1][3] = 0.0f;
408
409 m[2][0] = 0.0f;
410 m[2][1] = 0.0f;
411
412 const float tmp = -Math::Rcp((f - n));
413 m[2][2] = (f + n) * tmp;
414 m[2][3] = 2 * f * n * tmp;
415
416 m[3][0] = 0.0f;
417 m[3][1] = 0.0f;
418 m[3][2] = -1.0f;
419 m[3][3] = 0.0f;
420
421 return *this;
422}
423
425Mtx44& Mtx44::Ortho(float l, float r, float b, float t, float n, float f)
426{
427 float tmp1 = Math::Rcp(r - l);
428 float tmp2 = Math::Rcp(t - b);
429 float tmp3 = Math::Rcp(f - n);
430 float m00, m03, m11, m13, m22, m23;
431
432 m00 = 2.0f * tmp1;
433 m03 = -(r + l) * tmp1;
434
435 m11 = 2.0f * tmp2;
436 m13 = -(t + b) * tmp2;
437
438 m22 = -2.0f * tmp3;
439 m23 = -(f + n) * tmp3;
440
441 m[0][1] = 0.0f;
442 m[0][2] = 0.0f;
443
444 m[1][0] = 0.0f;
445 m[1][2] = 0.0f;
446
447 m[2][0] = 0.0f;
448 m[2][1] = 0.0f;
449
450 m[3][0] = 0.0f;
451 m[3][1] = 0.0f;
452 m[3][2] = 0.0f;
453 m[3][3] = 1.0f;
454
455 m[0][0] = m00;
456 m[0][3] = m03;
457 m[1][1] = m11;
458 m[1][3] = m13;
459 m[2][2] = m22;
460 m[2][3] = m23;
461
462 return *this;
463}
464
465} } } // namespace nw::g3d::math
Definition g3d_MathCommon.h:9
static float Tan(float rad)
Definition g3d_MathCommon-inl.h:205
static float Rcp(float x)
Definition g3d_MathCommon-inl.h:139
Definition g3d_Matrix34.h:34
Definition g3d_Matrix44.h:37
Mtx44 & Set(const float *a)
Definition g3d_Matrix44-inl.h:50
Mtx44 & Zero()
Definition g3d_Matrix44-inl.h:78
Mtx44 & Mul(const Mtx44 &lhs, const Mtx34 &rhs)
Definition g3d_Matrix44-inl.h:165
Mtx44 & Perspective(float fovy, float aspect, float n, float f)
Definition g3d_Matrix44-inl.h:392
Mtx44 & Sub(const Mtx44 &lhs, const Mtx44 &rhs)
Definition g3d_Matrix44-inl.h:120
Mtx44 & Ortho(float l, float r, float b, float t, float n, float f)
Definition g3d_Matrix44-inl.h:425
Mtx44 & Set(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33)
Definition g3d_Matrix44-inl.h:36
Mtx44 & Mul(const Mtx34 &lhs, const Mtx44 &rhs)
Definition g3d_Matrix44-inl.h:253
Mtx44 & Mul(const Mtx44 &lhs, const Mtx44 &rhs)
Definition g3d_Matrix44-inl.h:130
Mtx44 & Div(const Mtx44 &lhs, float rhs)
Definition g3d_Matrix44-inl.h:336
static float Det(const Mtx44 &m)
Definition g3d_Matrix44-inl.h:344
static const Mtx44 * Cast(const float *a)
Definition g3d_Matrix44-inl.h:30
Mtx44 & Set(const Vec4 &x, const Vec4 &y, const Vec4 &z, const Vec4 &w)
Definition g3d_Matrix44-inl.h:71
Mtx44 & Set(const Mtx44 &m)
Definition g3d_Matrix44-inl.h:61
Mtx44 & Inverse(float *pDet, const Mtx44 &m)
Definition g3d_Matrix44-inl.h:382
static Mtx44 Make(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33)
Definition g3d_Matrix44-inl.h:10
Mtx44 & Neg(const Mtx44 &m)
Definition g3d_Matrix44-inl.h:98
Mtx44 & Adjugate(const Mtx44 &m)
Definition g3d_Matrix44-inl.h:359
static Mtx44 * Cast(float *a)
Definition g3d_Matrix44-inl.h:24
Mtx44 & Mul(const Mtx44 &lhs, float rhs)
Definition g3d_Matrix44-inl.h:155
Mtx44 & Add(const Mtx44 &lhs, const Mtx44 &rhs)
Definition g3d_Matrix44-inl.h:110
Mtx44 & Identity()
Definition g3d_Matrix44-inl.h:88
Definition g3d_Vector4.h:26
Vec4 & Set(const Vec4 &v)
Definition g3d_Vector4-inl.h:45
Vec4 & Set(float x, float y, float z, float w)
Definition g3d_Vector4-inl.h:24
#define NW_G3D_ASSERT_NOT_NULL(exp)
Definition g3d_assert.h:20
#define NW_G3D_MATH_INLINE
Definition g3d_defs.h:69
Definition g3d_MathCommon.h:6
Definition g3d_GfxManage.cpp:10
Vec4 v[DIM_MAJOR]
Definition g3d_Matrix44.h:26
float a[DIM]
Definition g3d_Matrix44.h:24
@ DIM
Definition g3d_Matrix44.h:13
@ DIM_MAJOR
Definition g3d_Matrix44.h:13