5 void Matrix4x4_Copy (matrix4x4_t *out, matrix4x4_t *in)
10 void Matrix4x4_CopyRotateOnly (matrix4x4_t *out, matrix4x4_t *in)
12 out->m[0][0] = in->m[0][0];
13 out->m[0][1] = in->m[0][1];
14 out->m[0][2] = in->m[0][2];
16 out->m[1][0] = in->m[1][0];
17 out->m[1][1] = in->m[1][1];
18 out->m[1][2] = in->m[1][2];
20 out->m[2][0] = in->m[2][0];
21 out->m[2][1] = in->m[2][1];
22 out->m[2][2] = in->m[2][2];
30 void Matrix4x4_CopyTranslateOnly (matrix4x4_t *out, matrix4x4_t *in)
35 out->m[0][3] = in->m[0][3];
39 out->m[1][3] = in->m[0][3];
43 out->m[2][3] = in->m[0][3];
50 void Matrix4x4_FromMatrix3x4 (matrix4x4_t *out, matrix3x4_t *in)
52 out->m[0][0] = in->m[0][0];
53 out->m[0][1] = in->m[0][1];
54 out->m[0][2] = in->m[0][2];
55 out->m[0][3] = in->m[0][3];
56 out->m[1][0] = in->m[1][0];
57 out->m[1][1] = in->m[1][1];
58 out->m[1][2] = in->m[1][2];
59 out->m[1][3] = in->m[1][3];
60 out->m[2][0] = in->m[2][0];
61 out->m[2][1] = in->m[2][1];
62 out->m[2][2] = in->m[2][2];
63 out->m[2][3] = in->m[2][3];
70 void Matrix4x4_Concat (matrix4x4_t *out, const matrix4x4_t *in1, const matrix4x4_t *in2)
72 out->m[0][0] = in1->m[0][0] * in2->m[0][0] + in1->m[0][1] * in2->m[1][0] + in1->m[0][2] * in2->m[2][0] + in1->m[0][3] * in2->m[3][0];
73 out->m[0][1] = in1->m[0][0] * in2->m[0][1] + in1->m[0][1] * in2->m[1][1] + in1->m[0][2] * in2->m[2][1] + in1->m[0][3] * in2->m[3][1];
74 out->m[0][2] = in1->m[0][0] * in2->m[0][2] + in1->m[0][1] * in2->m[1][2] + in1->m[0][2] * in2->m[2][2] + in1->m[0][3] * in2->m[3][2];
75 out->m[0][3] = in1->m[0][0] * in2->m[0][3] + in1->m[0][1] * in2->m[1][3] + in1->m[0][2] * in2->m[2][3] + in1->m[0][3] * in2->m[3][3];
76 out->m[1][0] = in1->m[1][0] * in2->m[0][0] + in1->m[1][1] * in2->m[1][0] + in1->m[1][2] * in2->m[2][0] + in1->m[1][3] * in2->m[3][0];
77 out->m[1][1] = in1->m[1][0] * in2->m[0][1] + in1->m[1][1] * in2->m[1][1] + in1->m[1][2] * in2->m[2][1] + in1->m[1][3] * in2->m[3][1];
78 out->m[1][2] = in1->m[1][0] * in2->m[0][2] + in1->m[1][1] * in2->m[1][2] + in1->m[1][2] * in2->m[2][2] + in1->m[1][3] * in2->m[3][2];
79 out->m[1][3] = in1->m[1][0] * in2->m[0][3] + in1->m[1][1] * in2->m[1][3] + in1->m[1][2] * in2->m[2][3] + in1->m[1][3] * in2->m[3][3];
80 out->m[2][0] = in1->m[2][0] * in2->m[0][0] + in1->m[2][1] * in2->m[1][0] + in1->m[2][2] * in2->m[2][0] + in1->m[2][3] * in2->m[3][0];
81 out->m[2][1] = in1->m[2][0] * in2->m[0][1] + in1->m[2][1] * in2->m[1][1] + in1->m[2][2] * in2->m[2][1] + in1->m[2][3] * in2->m[3][1];
82 out->m[2][2] = in1->m[2][0] * in2->m[0][2] + in1->m[2][1] * in2->m[1][2] + in1->m[2][2] * in2->m[2][2] + in1->m[2][3] * in2->m[3][2];
83 out->m[2][3] = in1->m[2][0] * in2->m[0][3] + in1->m[2][1] * in2->m[1][3] + in1->m[2][2] * in2->m[2][3] + in1->m[2][3] * in2->m[3][3];
84 out->m[3][0] = in1->m[3][0] * in2->m[0][0] + in1->m[3][1] * in2->m[1][0] + in1->m[3][2] * in2->m[2][0] + in1->m[3][3] * in2->m[3][0];
85 out->m[3][1] = in1->m[3][0] * in2->m[0][1] + in1->m[3][1] * in2->m[1][1] + in1->m[3][2] * in2->m[2][1] + in1->m[3][3] * in2->m[3][1];
86 out->m[3][2] = in1->m[3][0] * in2->m[0][2] + in1->m[3][1] * in2->m[1][2] + in1->m[3][2] * in2->m[2][2] + in1->m[3][3] * in2->m[3][2];
87 out->m[3][3] = in1->m[3][0] * in2->m[0][3] + in1->m[3][1] * in2->m[1][3] + in1->m[3][2] * in2->m[2][3] + in1->m[3][3] * in2->m[3][3];
90 void Matrix4x4_Transpose (matrix4x4_t *out, const matrix4x4_t *in1)
93 scale = 3.0 / (in1->m[0][0] * in1->m[0][0]
94 + in1->m[0][1] * in1->m[0][1]
95 + in1->m[0][2] * in1->m[0][2]
96 + in1->m[1][0] * in1->m[1][0]
97 + in1->m[1][1] * in1->m[1][1]
98 + in1->m[1][2] * in1->m[1][2]
99 + in1->m[2][0] * in1->m[2][0]
100 + in1->m[2][1] * in1->m[2][1]
101 + in1->m[2][2] * in1->m[2][2]);
102 out->m[0][0] = in1->m[0][0] * scale;
103 out->m[0][1] = in1->m[1][0] * scale;
104 out->m[0][2] = in1->m[2][0] * scale;
105 out->m[0][3] = in1->m[3][0];
106 out->m[1][0] = in1->m[0][1] * scale;
107 out->m[1][1] = in1->m[1][1] * scale;
108 out->m[1][2] = in1->m[2][1] * scale;
109 out->m[1][3] = in1->m[3][1];
110 out->m[2][0] = in1->m[0][2] * scale;
111 out->m[2][1] = in1->m[1][2] * scale;
112 out->m[2][2] = in1->m[2][2] * scale;
113 out->m[2][3] = in1->m[3][2];
114 out->m[3][0] = in1->m[0][3];
115 out->m[3][1] = in1->m[1][3];
116 out->m[3][2] = in1->m[2][3];
117 out->m[3][3] = in1->m[3][3];
120 void Matrix4x4_CreateIdentity (matrix4x4_t *out)
140 void Matrix4x4_CreateTranslate (matrix4x4_t *out, float x, float y, float z)
160 void Matrix4x4_CreateRotate (matrix4x4_t *out, float angle, float x, float y, float z)
166 len = 1.0f / sqrt(len);
171 angle *= M_PI / 180.0;
175 out->m[0][0]=x * x + c * (1 - x * x);
176 out->m[0][1]=x * y * (1 - c) + z * s;
177 out->m[0][2]=z * x * (1 - c) - y * s;
179 out->m[1][0]=x * y * (1 - c) - z * s;
180 out->m[1][1]=y * y + c * (1 - y * y);
181 out->m[1][2]=y * z * (1 - c) + x * s;
183 out->m[2][0]=z * x * (1 - c) + y * s;
184 out->m[2][1]=y * z * (1 - c) - x * s;
185 out->m[2][2]=z * z + c * (1 - z * z);
193 void Matrix4x4_CreateScale (matrix4x4_t *out, float x)
213 void Matrix4x4_CreateScale3 (matrix4x4_t *out, float x, float y, float z)
233 void Matrix4x4_ToVectors(const matrix4x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
249 void Matrix4x4_FromVectors(matrix4x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
251 out->m[0][0] = vx[0];
252 out->m[0][1] = vy[0];
253 out->m[0][2] = vz[0];
255 out->m[1][0] = vx[1];
256 out->m[1][1] = vy[1];
257 out->m[1][2] = vz[1];
259 out->m[2][0] = vx[2];
260 out->m[2][1] = vy[2];
261 out->m[2][2] = vz[2];
269 void Matrix4x4_Transform (const matrix4x4_t *in, const float v[3], float out[3])
271 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + in->m[0][3];
272 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + in->m[1][3];
273 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + in->m[2][3];
276 void Matrix4x4_Transform4 (const matrix4x4_t *in, const float v[4], float out[4])
278 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + v[3] * in->m[0][3];
279 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + v[3] * in->m[1][3];
280 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + v[3] * in->m[2][3];
281 out[3] = v[0] * in->m[3][0] + v[1] * in->m[3][1] + v[2] * in->m[3][2] + v[3] * in->m[3][3];
284 void Matrix4x4_SimpleUntransform (const matrix4x4_t *in, const float v[3], float out[3])
287 t[0] = v[0] - in->m[0][3];
288 t[1] = v[1] - in->m[1][3];
289 t[2] = v[2] - in->m[2][3];
290 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0];
291 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1];
292 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2];
296 void Matrix4x4_ConcatTranslate (matrix4x4_t *out, float x, float y, float z)
298 matrix4x4_t base, temp;
299 Matrix4x4_Copy(out, &base);
300 Matrix4x4_CreateTranslate(&temp, x, y, z);
301 Matrix4x4_Concat(out, &base, &temp);
305 void Matrix4x4_ConcatRotate (matrix4x4_t *out, float angle, float x, float y, float z)
307 matrix4x4_t base, temp;
308 Matrix4x4_Copy(out, &base);
309 Matrix4x4_CreateRotate(&temp, angle, x, y, z);
310 Matrix4x4_Concat(out, &base, &temp);
314 void Matrix4x4_ConcatScale (matrix4x4_t *out, float x)
316 matrix4x4_t base, temp;
317 Matrix4x4_Copy(out, &base);
318 Matrix4x4_CreateScale(&temp, x);
319 Matrix4x4_Concat(out, &base, &temp);
323 void Matrix4x4_ConcatScale3 (matrix4x4_t *out, float x, float y, float z)
325 matrix4x4_t base, temp;
326 Matrix4x4_Copy(out, &base);
327 Matrix4x4_CreateScale3(&temp, x, y, z);
328 Matrix4x4_Concat(out, &base, &temp);
338 void Matrix3x4_Copy (matrix3x4_t *out, matrix3x4_t *in)
343 void Matrix3x4_CopyRotateOnly (matrix3x4_t *out, matrix3x4_t *in)
345 out->m[0][0] = in->m[0][0];
346 out->m[0][1] = in->m[0][1];
347 out->m[0][2] = in->m[0][2];
349 out->m[1][0] = in->m[1][0];
350 out->m[1][1] = in->m[1][1];
351 out->m[1][2] = in->m[1][2];
353 out->m[2][0] = in->m[2][0];
354 out->m[2][1] = in->m[2][1];
355 out->m[2][2] = in->m[2][2];
359 void Matrix3x4_CopyTranslateOnly (matrix3x4_t *out, matrix3x4_t *in)
364 out->m[0][3] = in->m[0][3];
368 out->m[1][3] = in->m[0][3];
372 out->m[2][3] = in->m[0][3];
375 void Matrix3x4_FromMatrix4x4 (matrix3x4_t *out, matrix4x4_t *in)
377 out->m[0][0] = in->m[0][0];
378 out->m[0][1] = in->m[0][1];
379 out->m[0][2] = in->m[0][2];
380 out->m[0][3] = in->m[0][3];
381 out->m[1][0] = in->m[1][0];
382 out->m[1][1] = in->m[1][1];
383 out->m[1][2] = in->m[1][2];
384 out->m[1][3] = in->m[1][3];
385 out->m[2][0] = in->m[2][0];
386 out->m[2][1] = in->m[2][1];
387 out->m[2][2] = in->m[2][2];
388 out->m[2][3] = in->m[2][3];
391 void Matrix3x4_Concat (matrix3x4_t *out, const matrix3x4_t *in1, const matrix3x4_t *in2)
393 out->m[0][0] = in1->m[0][0] * in2->m[0][0] + in1->m[0][1] * in2->m[1][0] + in1->m[0][2] * in2->m[2][0];
394 out->m[0][1] = in1->m[0][0] * in2->m[0][1] + in1->m[0][1] * in2->m[1][1] + in1->m[0][2] * in2->m[2][1];
395 out->m[0][2] = in1->m[0][0] * in2->m[0][2] + in1->m[0][1] * in2->m[1][2] + in1->m[0][2] * in2->m[2][2];
396 out->m[0][3] = in1->m[0][0] * in2->m[0][3] + in1->m[0][1] * in2->m[1][3] + in1->m[0][2] * in2->m[2][3] + in1->m[0][3];
397 out->m[1][0] = in1->m[1][0] * in2->m[0][0] + in1->m[1][1] * in2->m[1][0] + in1->m[1][2] * in2->m[2][0];
398 out->m[1][1] = in1->m[1][0] * in2->m[0][1] + in1->m[1][1] * in2->m[1][1] + in1->m[1][2] * in2->m[2][1];
399 out->m[1][2] = in1->m[1][0] * in2->m[0][2] + in1->m[1][1] * in2->m[1][2] + in1->m[1][2] * in2->m[2][2];
400 out->m[1][3] = in1->m[1][0] * in2->m[0][3] + in1->m[1][1] * in2->m[1][3] + in1->m[1][2] * in2->m[2][3] + in1->m[1][3];
401 out->m[2][0] = in1->m[2][0] * in2->m[0][0] + in1->m[2][1] * in2->m[1][0] + in1->m[2][2] * in2->m[2][0];
402 out->m[2][1] = in1->m[2][0] * in2->m[0][1] + in1->m[2][1] * in2->m[1][1] + in1->m[2][2] * in2->m[2][1];
403 out->m[2][2] = in1->m[2][0] * in2->m[0][2] + in1->m[2][1] * in2->m[1][2] + in1->m[2][2] * in2->m[2][2];
404 out->m[2][3] = in1->m[2][0] * in2->m[0][3] + in1->m[2][1] * in2->m[1][3] + in1->m[2][2] * in2->m[2][3] + in1->m[2][3];
407 void Matrix3x4_Transpose3x3 (matrix3x4_t *out, const matrix3x4_t *in1)
410 scale = 3.0 / (in1->m[0][0] * in1->m[0][0]
411 + in1->m[0][1] * in1->m[0][1]
412 + in1->m[0][2] * in1->m[0][2]
413 + in1->m[1][0] * in1->m[1][0]
414 + in1->m[1][1] * in1->m[1][1]
415 + in1->m[1][2] * in1->m[1][2]
416 + in1->m[2][0] * in1->m[2][0]
417 + in1->m[2][1] * in1->m[2][1]
418 + in1->m[2][2] * in1->m[2][2]);
419 out->m[0][0] = in1->m[0][0] * scale;
420 out->m[0][1] = in1->m[1][0] * scale;
421 out->m[0][2] = in1->m[2][0] * scale;
423 out->m[1][0] = in1->m[0][1] * scale;
424 out->m[1][1] = in1->m[1][1] * scale;
425 out->m[1][2] = in1->m[2][1] * scale;
427 out->m[2][0] = in1->m[0][2] * scale;
428 out->m[2][1] = in1->m[1][2] * scale;
429 out->m[2][2] = in1->m[2][2] * scale;
433 void Matrix3x4_CreateIdentity (matrix3x4_t *out)
449 void Matrix3x4_CreateTranslate (matrix3x4_t *out, float x, float y, float z)
465 void Matrix3x4_CreateRotate (matrix3x4_t *out, float angle, float x, float y, float z)
471 len = 1.0f / sqrt(len);
476 angle *= M_PI / 180.0;
480 out->m[0][0]=x * x + c * (1 - x * x);
481 out->m[0][1]=x * y * (1 - c) + z * s;
482 out->m[0][2]=z * x * (1 - c) - y * s;
484 out->m[1][0]=x * y * (1 - c) - z * s;
485 out->m[1][1]=y * y + c * (1 - y * y);
486 out->m[1][2]=y * z * (1 - c) + x * s;
488 out->m[2][0]=z * x * (1 - c) + y * s;
489 out->m[2][1]=y * z * (1 - c) - x * s;
490 out->m[2][2]=z * z + c * (1 - z * z);
494 void Matrix3x4_CreateScale (matrix3x4_t *out, float x)
510 void Matrix3x4_CreateScale3 (matrix3x4_t *out, float x, float y, float z)
526 void Matrix3x4_ToVectors(const matrix3x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
542 void Matrix3x4_FromVectors(matrix3x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
544 out->m[0][0] = vx[0];
545 out->m[0][1] = vy[0];
546 out->m[0][2] = vz[0];
548 out->m[1][0] = vx[1];
549 out->m[1][1] = vy[1];
550 out->m[1][2] = vz[1];
552 out->m[2][0] = vx[2];
553 out->m[2][1] = vy[2];
554 out->m[2][2] = vz[2];
558 void Matrix3x4_Transform (const matrix3x4_t *in, const float v[3], float out[3])
560 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + in->m[0][3];
561 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + in->m[1][3];
562 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + in->m[2][3];
565 void Matrix3x4_SimpleUntransform (const matrix3x4_t *in, const float v[3], float out[3])
568 t[0] = v[0] - in->m[0][3];
569 t[1] = v[1] - in->m[1][3];
570 t[2] = v[2] - in->m[2][3];
571 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0];
572 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1];
573 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2];
577 void Matrix3x4_ConcatTranslate (matrix3x4_t *out, float x, float y, float z)
579 matrix3x4_t base, temp;
580 Matrix3x4_Copy(out, &base);
581 Matrix3x4_CreateTranslate(&temp, x, y, z);
582 Matrix3x4_Concat(out, &base, &temp);
586 void Matrix3x4_ConcatRotate (matrix3x4_t *out, float angle, float x, float y, float z)
588 matrix3x4_t base, temp;
589 Matrix3x4_Copy(out, &base);
590 Matrix3x4_CreateRotate(&temp, angle, x, y, z);
591 Matrix3x4_Concat(out, &base, &temp);
595 void Matrix3x4_ConcatScale (matrix3x4_t *out, float x)
597 matrix3x4_t base, temp;
598 Matrix3x4_Copy(out, &base);
599 Matrix3x4_CreateScale(&temp, x);
600 Matrix3x4_Concat(out, &base, &temp);
604 void Matrix3x4_ConcatScale3 (matrix3x4_t *out, float x, float y, float z)
606 matrix3x4_t base, temp;
607 Matrix3x4_Copy(out, &base);
608 Matrix3x4_CreateScale3(&temp, x, y, z);
609 Matrix3x4_Concat(out, &base, &temp);