6 void Matrix4x4_Copy (matrix4x4_t *out, const matrix4x4_t *in)
11 void Matrix4x4_CopyRotateOnly (matrix4x4_t *out, const matrix4x4_t *in)
13 out->m[0][0] = in->m[0][0];
14 out->m[0][1] = in->m[0][1];
15 out->m[0][2] = in->m[0][2];
17 out->m[1][0] = in->m[1][0];
18 out->m[1][1] = in->m[1][1];
19 out->m[1][2] = in->m[1][2];
21 out->m[2][0] = in->m[2][0];
22 out->m[2][1] = in->m[2][1];
23 out->m[2][2] = in->m[2][2];
31 void Matrix4x4_CopyTranslateOnly (matrix4x4_t *out, const matrix4x4_t *in)
36 out->m[0][3] = in->m[0][3];
40 out->m[1][3] = in->m[0][3];
44 out->m[2][3] = in->m[0][3];
51 void Matrix4x4_FromMatrix3x4 (matrix4x4_t *out, const matrix3x4_t *in)
53 out->m[0][0] = in->m[0][0];
54 out->m[0][1] = in->m[0][1];
55 out->m[0][2] = in->m[0][2];
56 out->m[0][3] = in->m[0][3];
57 out->m[1][0] = in->m[1][0];
58 out->m[1][1] = in->m[1][1];
59 out->m[1][2] = in->m[1][2];
60 out->m[1][3] = in->m[1][3];
61 out->m[2][0] = in->m[2][0];
62 out->m[2][1] = in->m[2][1];
63 out->m[2][2] = in->m[2][2];
64 out->m[2][3] = in->m[2][3];
71 void Matrix4x4_Concat (matrix4x4_t *out, const matrix4x4_t *in1, const matrix4x4_t *in2)
73 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];
74 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];
75 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];
76 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];
77 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];
78 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];
79 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];
80 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];
81 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];
82 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];
83 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];
84 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];
85 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];
86 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];
87 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];
88 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];
91 void Matrix4x4_Transpose (matrix4x4_t *out, const matrix4x4_t *in1)
93 out->m[0][0] = in1->m[0][0];
94 out->m[0][1] = in1->m[1][0];
95 out->m[0][2] = in1->m[2][0];
96 out->m[0][3] = in1->m[3][0];
97 out->m[1][0] = in1->m[0][1];
98 out->m[1][1] = in1->m[1][1];
99 out->m[1][2] = in1->m[2][1];
100 out->m[1][3] = in1->m[3][1];
101 out->m[2][0] = in1->m[0][2];
102 out->m[2][1] = in1->m[1][2];
103 out->m[2][2] = in1->m[2][2];
104 out->m[2][3] = in1->m[3][2];
105 out->m[3][0] = in1->m[0][3];
106 out->m[3][1] = in1->m[1][3];
107 out->m[3][2] = in1->m[2][3];
108 out->m[3][3] = in1->m[3][3];
111 void Matrix4x4_Transpose3x3 (matrix4x4_t *out, const matrix4x4_t *in1)
113 out->m[0][0] = in1->m[0][0];
114 out->m[0][1] = in1->m[1][0];
115 out->m[0][2] = in1->m[2][0];
116 out->m[1][0] = in1->m[0][1];
117 out->m[1][1] = in1->m[1][1];
118 out->m[1][2] = in1->m[2][1];
119 out->m[2][0] = in1->m[0][2];
120 out->m[2][1] = in1->m[1][2];
121 out->m[2][2] = in1->m[2][2];
123 out->m[0][3] = in1->m[0][3];
124 out->m[1][3] = in1->m[1][3];
125 out->m[2][3] = in1->m[2][3];
126 out->m[3][0] = in1->m[0][3];
127 out->m[3][1] = in1->m[1][3];
128 out->m[3][2] = in1->m[2][3];
129 out->m[3][3] = in1->m[3][3];
132 void Matrix4x4_Invert_Simple (matrix4x4_t *out, const matrix4x4_t *in1)
134 // we only support uniform scaling, so assume the first row is enough
135 // (note the lack of sqrt here, because we're trying to undo the scaling,
136 // this means multiplying by the inverse scale twice - squaring it, which
137 // makes the sqrt a waste of time)
139 double scale = 1.0 / (in1->m[0][0] * in1->m[0][0] + in1->m[0][1] * in1->m[0][1] + in1->m[0][2] * in1->m[0][2]);
141 double scale = 3.0 / sqrt
142 (in1->m[0][0] * in1->m[0][0] + in1->m[0][1] * in1->m[0][1] + in1->m[0][2] * in1->m[0][2]
143 + in1->m[1][0] * in1->m[1][0] + in1->m[1][1] * in1->m[1][1] + in1->m[1][2] * in1->m[1][2]
144 + in1->m[2][0] * in1->m[2][0] + in1->m[2][1] * in1->m[2][1] + in1->m[2][2] * in1->m[2][2]);
148 // invert the rotation by transposing and multiplying by the squared
149 // recipricol of the input matrix scale as described above
150 out->m[0][0] = in1->m[0][0] * scale;
151 out->m[0][1] = in1->m[1][0] * scale;
152 out->m[0][2] = in1->m[2][0] * scale;
153 out->m[1][0] = in1->m[0][1] * scale;
154 out->m[1][1] = in1->m[1][1] * scale;
155 out->m[1][2] = in1->m[2][1] * scale;
156 out->m[2][0] = in1->m[0][2] * scale;
157 out->m[2][1] = in1->m[1][2] * scale;
158 out->m[2][2] = in1->m[2][2] * scale;
160 // invert the translate
161 out->m[0][3] = -(in1->m[0][3] * out->m[0][0] + in1->m[1][3] * out->m[0][1] + in1->m[2][3] * out->m[0][2]);
162 out->m[1][3] = -(in1->m[0][3] * out->m[1][0] + in1->m[1][3] * out->m[1][1] + in1->m[2][3] * out->m[1][2]);
163 out->m[2][3] = -(in1->m[0][3] * out->m[2][0] + in1->m[1][3] * out->m[2][1] + in1->m[2][3] * out->m[2][2]);
165 // don't know if there's anything worth doing here
172 void Matrix4x4_CreateIdentity (matrix4x4_t *out)
192 void Matrix4x4_CreateTranslate (matrix4x4_t *out, float x, float y, float z)
212 void Matrix4x4_CreateRotate (matrix4x4_t *out, float angle, float x, float y, float z)
218 len = 1.0f / sqrt(len);
223 angle *= -M_PI / 180.0;
227 out->m[0][0]=x * x + c * (1 - x * x);
228 out->m[0][1]=x * y * (1 - c) + z * s;
229 out->m[0][2]=z * x * (1 - c) - y * s;
231 out->m[1][0]=x * y * (1 - c) - z * s;
232 out->m[1][1]=y * y + c * (1 - y * y);
233 out->m[1][2]=y * z * (1 - c) + x * s;
235 out->m[2][0]=z * x * (1 - c) + y * s;
236 out->m[2][1]=y * z * (1 - c) - x * s;
237 out->m[2][2]=z * z + c * (1 - z * z);
245 void Matrix4x4_CreateScale (matrix4x4_t *out, float x)
265 void Matrix4x4_CreateScale3 (matrix4x4_t *out, float x, float y, float z)
285 void Matrix4x4_CreateFromQuakeEntity(matrix4x4_t *out, float x, float y, float z, float pitch, float yaw, float roll, float scale)
287 double angle, sr, sp, sy, cr, cp, cy;
289 angle = yaw * (M_PI*2 / 360);
292 angle = pitch * (M_PI*2 / 360);
295 angle = roll * (M_PI*2 / 360);
298 out->m[0][0] = (cp*cy) * scale;
299 out->m[0][1] = (sr*sp*cy+cr*-sy) * scale;
300 out->m[0][2] = (cr*sp*cy+-sr*-sy) * scale;
302 out->m[1][0] = (cp*sy) * scale;
303 out->m[1][1] = (sr*sp*sy+cr*cy) * scale;
304 out->m[1][2] = (cr*sp*sy+-sr*cy) * scale;
306 out->m[2][0] = (-sp) * scale;
307 out->m[2][1] = (sr*cp) * scale;
308 out->m[2][2] = (cr*cp) * scale;
316 void Matrix4x4_ToVectors(const matrix4x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
332 void Matrix4x4_FromVectors(matrix4x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
334 out->m[0][0] = vx[0];
335 out->m[0][1] = vy[0];
336 out->m[0][2] = vz[0];
338 out->m[1][0] = vx[1];
339 out->m[1][1] = vy[1];
340 out->m[1][2] = vz[1];
342 out->m[2][0] = vx[2];
343 out->m[2][1] = vy[2];
344 out->m[2][2] = vz[2];
352 void Matrix4x4_Transform (const matrix4x4_t *in, const float v[3], float out[3])
354 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + in->m[0][3];
355 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + in->m[1][3];
356 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + in->m[2][3];
359 void Matrix4x4_Transform4 (const matrix4x4_t *in, const float v[4], float out[4])
361 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];
362 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];
363 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];
364 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];
368 void Matrix4x4_SimpleUntransform (const matrix4x4_t *in, const float v[3], float out[3])
371 t[0] = v[0] - in->m[0][3];
372 t[1] = v[1] - in->m[1][3];
373 t[2] = v[2] - in->m[2][3];
374 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0];
375 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1];
376 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2];
381 void Matrix4x4_ConcatTranslate (matrix4x4_t *out, float x, float y, float z)
383 matrix4x4_t base, temp;
385 Matrix4x4_CreateTranslate(&temp, x, y, z);
386 Matrix4x4_Concat(out, &base, &temp);
390 void Matrix4x4_ConcatRotate (matrix4x4_t *out, float angle, float x, float y, float z)
392 matrix4x4_t base, temp;
394 Matrix4x4_CreateRotate(&temp, angle, x, y, z);
395 Matrix4x4_Concat(out, &base, &temp);
399 void Matrix4x4_ConcatScale (matrix4x4_t *out, float x)
401 matrix4x4_t base, temp;
403 Matrix4x4_CreateScale(&temp, x);
404 Matrix4x4_Concat(out, &base, &temp);
408 void Matrix4x4_ConcatScale3 (matrix4x4_t *out, float x, float y, float z)
410 matrix4x4_t base, temp;
412 Matrix4x4_CreateScale3(&temp, x, y, z);
413 Matrix4x4_Concat(out, &base, &temp);
416 void Matrix4x4_Print (const matrix4x4_t *in)
418 Con_Printf("%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n"
419 , in->m[0][0], in->m[0][1], in->m[0][2], in->m[0][3]
420 , in->m[1][0], in->m[1][1], in->m[1][2], in->m[1][3]
421 , in->m[2][0], in->m[2][1], in->m[2][2], in->m[2][3]
422 , in->m[3][0], in->m[3][1], in->m[3][2], in->m[3][3]);
431 void Matrix3x4_Copy (matrix3x4_t *out, const matrix3x4_t *in)
436 void Matrix3x4_CopyRotateOnly (matrix3x4_t *out, const matrix3x4_t *in)
438 out->m[0][0] = in->m[0][0];
439 out->m[0][1] = in->m[0][1];
440 out->m[0][2] = in->m[0][2];
442 out->m[1][0] = in->m[1][0];
443 out->m[1][1] = in->m[1][1];
444 out->m[1][2] = in->m[1][2];
446 out->m[2][0] = in->m[2][0];
447 out->m[2][1] = in->m[2][1];
448 out->m[2][2] = in->m[2][2];
452 void Matrix3x4_CopyTranslateOnly (matrix3x4_t *out, const matrix3x4_t *in)
457 out->m[0][3] = in->m[0][3];
461 out->m[1][3] = in->m[0][3];
465 out->m[2][3] = in->m[0][3];
468 void Matrix3x4_FromMatrix4x4 (matrix3x4_t *out, const matrix4x4_t *in)
470 out->m[0][0] = in->m[0][0];
471 out->m[0][1] = in->m[0][1];
472 out->m[0][2] = in->m[0][2];
473 out->m[0][3] = in->m[0][3];
474 out->m[1][0] = in->m[1][0];
475 out->m[1][1] = in->m[1][1];
476 out->m[1][2] = in->m[1][2];
477 out->m[1][3] = in->m[1][3];
478 out->m[2][0] = in->m[2][0];
479 out->m[2][1] = in->m[2][1];
480 out->m[2][2] = in->m[2][2];
481 out->m[2][3] = in->m[2][3];
484 void Matrix3x4_Concat (matrix3x4_t *out, const matrix3x4_t *in1, const matrix3x4_t *in2)
486 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];
487 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];
488 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];
489 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];
490 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];
491 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];
492 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];
493 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];
494 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];
495 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];
496 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];
497 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];
500 void Matrix3x4_Transpose3x3 (matrix3x4_t *out, const matrix3x4_t *in1)
502 out->m[0][0] = in1->m[0][0];
503 out->m[0][1] = in1->m[1][0];
504 out->m[0][2] = in1->m[2][0];
506 out->m[1][0] = in1->m[0][1];
507 out->m[1][1] = in1->m[1][1];
508 out->m[1][2] = in1->m[2][1];
510 out->m[2][0] = in1->m[0][2];
511 out->m[2][1] = in1->m[1][2];
512 out->m[2][2] = in1->m[2][2];
516 void Matrix3x4_Invert_Simple (matrix3x4_t *out, const matrix3x4_t *in1)
518 // we only support uniform scaling, so assume the first row is enough
519 // (note the lack of sqrt here, because we're trying to undo the scaling,
520 // this means multiplying by the inverse scale twice - squaring it, which
521 // makes the sqrt a waste of time)
523 double scale = 1.0 / (in1->m[0][0] * in1->m[0][0] + in1->m[0][1] * in1->m[0][1] + in1->m[0][2] * in1->m[0][2]);
525 double scale = 3.0 / sqrt
526 (in1->m[0][0] * in1->m[0][0] + in1->m[0][1] * in1->m[0][1] + in1->m[0][2] * in1->m[0][2]
527 + in1->m[1][0] * in1->m[1][0] + in1->m[1][1] * in1->m[1][1] + in1->m[1][2] * in1->m[1][2]
528 + in1->m[2][0] * in1->m[2][0] + in1->m[2][1] * in1->m[2][1] + in1->m[2][2] * in1->m[2][2]);
532 // invert the rotation by transposing and multiplying by the squared
533 // recipricol of the input matrix scale as described above
534 out->m[0][0] = in1->m[0][0] * scale;
535 out->m[0][1] = in1->m[1][0] * scale;
536 out->m[0][2] = in1->m[2][0] * scale;
537 out->m[1][0] = in1->m[0][1] * scale;
538 out->m[1][1] = in1->m[1][1] * scale;
539 out->m[1][2] = in1->m[2][1] * scale;
540 out->m[2][0] = in1->m[0][2] * scale;
541 out->m[2][1] = in1->m[1][2] * scale;
542 out->m[2][2] = in1->m[2][2] * scale;
544 // invert the translate
545 out->m[0][3] = -(in1->m[0][3] * out->m[0][0] + in1->m[1][3] * out->m[0][1] + in1->m[2][3] * out->m[0][2]);
546 out->m[1][3] = -(in1->m[0][3] * out->m[1][0] + in1->m[1][3] * out->m[1][1] + in1->m[2][3] * out->m[1][2]);
547 out->m[2][3] = -(in1->m[0][3] * out->m[2][0] + in1->m[1][3] * out->m[2][1] + in1->m[2][3] * out->m[2][2]);
551 void Matrix3x4_CreateIdentity (matrix3x4_t *out)
567 void Matrix3x4_CreateTranslate (matrix3x4_t *out, float x, float y, float z)
583 void Matrix3x4_CreateRotate (matrix3x4_t *out, float angle, float x, float y, float z)
589 len = 1.0f / sqrt(len);
594 angle *= M_PI / 180.0;
598 out->m[0][0]=x * x + c * (1 - x * x);
599 out->m[0][1]=x * y * (1 - c) + z * s;
600 out->m[0][2]=z * x * (1 - c) - y * s;
602 out->m[1][0]=x * y * (1 - c) - z * s;
603 out->m[1][1]=y * y + c * (1 - y * y);
604 out->m[1][2]=y * z * (1 - c) + x * s;
606 out->m[2][0]=z * x * (1 - c) + y * s;
607 out->m[2][1]=y * z * (1 - c) - x * s;
608 out->m[2][2]=z * z + c * (1 - z * z);
612 void Matrix3x4_CreateScale (matrix3x4_t *out, float x)
628 void Matrix3x4_CreateScale3 (matrix3x4_t *out, float x, float y, float z)
644 void Matrix3x4_CreateFromQuakeEntity(matrix3x4_t *out, float x, float y, float z, float pitch, float yaw, float roll, float scale)
646 double angle, sr, sp, sy, cr, cp, cy;
648 angle = yaw * (M_PI*2 / 360);
651 angle = pitch * (M_PI*2 / 360);
654 angle = roll * (M_PI*2 / 360);
657 out->m[0][0] = (cp*cy) * scale;
658 out->m[0][1] = (sr*sp*cy+cr*-sy) * scale;
659 out->m[0][2] = (cr*sp*cy+-sr*-sy) * scale;
661 out->m[1][0] = (cp*sy) * scale;
662 out->m[1][1] = (sr*sp*sy+cr*cy) * scale;
663 out->m[1][2] = (cr*sp*sy+-sr*cy) * scale;
665 out->m[2][0] = (-sp) * scale;
666 out->m[2][1] = (sr*cp) * scale;
667 out->m[2][2] = (cr*cp) * scale;
671 void Matrix3x4_ToVectors(const matrix3x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
687 void Matrix3x4_FromVectors(matrix3x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
689 out->m[0][0] = vx[0];
690 out->m[0][1] = vy[0];
691 out->m[0][2] = vz[0];
693 out->m[1][0] = vx[1];
694 out->m[1][1] = vy[1];
695 out->m[1][2] = vz[1];
697 out->m[2][0] = vx[2];
698 out->m[2][1] = vy[2];
699 out->m[2][2] = vz[2];
703 void Matrix3x4_Transform (const matrix3x4_t *in, const float v[3], float out[3])
705 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + in->m[0][3];
706 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + in->m[1][3];
707 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + in->m[2][3];
710 void Matrix3x4_SimpleUntransform (const matrix3x4_t *in, const float v[3], float out[3])
713 t[0] = v[0] - in->m[0][3];
714 t[1] = v[1] - in->m[1][3];
715 t[2] = v[2] - in->m[2][3];
716 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0];
717 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1];
718 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2];
722 void Matrix3x4_ConcatTranslate (matrix3x4_t *out, float x, float y, float z)
724 matrix3x4_t base, temp;
726 Matrix3x4_CreateTranslate(&temp, x, y, z);
727 Matrix3x4_Concat(out, &base, &temp);
731 void Matrix3x4_ConcatRotate (matrix3x4_t *out, float angle, float x, float y, float z)
733 matrix3x4_t base, temp;
735 Matrix3x4_CreateRotate(&temp, angle, x, y, z);
736 Matrix3x4_Concat(out, &base, &temp);
740 void Matrix3x4_ConcatScale (matrix3x4_t *out, float x)
742 matrix3x4_t base, temp;
744 Matrix3x4_CreateScale(&temp, x);
745 Matrix3x4_Concat(out, &base, &temp);
749 void Matrix3x4_ConcatScale3 (matrix3x4_t *out, float x, float y, float z)
751 matrix3x4_t base, temp;
753 Matrix3x4_CreateScale3(&temp, x, y, z);
754 Matrix3x4_Concat(out, &base, &temp);
757 void Matrix3x4_Print (const matrix3x4_t *in)
759 Con_Printf("%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n"
760 , in->m[0][0], in->m[0][1], in->m[0][2], in->m[0][3]
761 , in->m[1][0], in->m[1][1], in->m[1][2], in->m[1][3]
762 , in->m[2][0], in->m[2][1], in->m[2][2], in->m[2][3]);