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)
138 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]);
140 // invert the rotation by transposing and multiplying by the squared
141 // recipricol of the input matrix scale as described above
142 out->m[0][0] = in1->m[0][0] * scale;
143 out->m[0][1] = in1->m[1][0] * scale;
144 out->m[0][2] = in1->m[2][0] * scale;
145 out->m[1][0] = in1->m[0][1] * scale;
146 out->m[1][1] = in1->m[1][1] * scale;
147 out->m[1][2] = in1->m[2][1] * scale;
148 out->m[2][0] = in1->m[0][2] * scale;
149 out->m[2][1] = in1->m[1][2] * scale;
150 out->m[2][2] = in1->m[2][2] * scale;
152 // invert the translate
153 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]);
154 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]);
155 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]);
157 // don't know if there's anything worth doing here
164 void Matrix4x4_CreateIdentity (matrix4x4_t *out)
184 void Matrix4x4_CreateTranslate (matrix4x4_t *out, float x, float y, float z)
204 void Matrix4x4_CreateRotate (matrix4x4_t *out, float angle, float x, float y, float z)
210 len = 1.0f / sqrt(len);
215 angle *= M_PI / 180.0;
219 out->m[0][0]=x * x + c * (1 - x * x);
220 out->m[0][1]=x * y * (1 - c) + z * s;
221 out->m[0][2]=z * x * (1 - c) - y * s;
223 out->m[1][0]=x * y * (1 - c) - z * s;
224 out->m[1][1]=y * y + c * (1 - y * y);
225 out->m[1][2]=y * z * (1 - c) + x * s;
227 out->m[2][0]=z * x * (1 - c) + y * s;
228 out->m[2][1]=y * z * (1 - c) - x * s;
229 out->m[2][2]=z * z + c * (1 - z * z);
237 void Matrix4x4_CreateScale (matrix4x4_t *out, float x)
257 void Matrix4x4_CreateScale3 (matrix4x4_t *out, float x, float y, float z)
277 void Matrix4x4_CreateFromQuakeEntity(matrix4x4_t *out, float x, float y, float z, float pitch, float yaw, float roll, float scale)
279 double angle, sr, sp, sy, cr, cp, cy;
281 angle = yaw * (M_PI*2 / 360);
284 angle = pitch * (M_PI*2 / 360);
287 angle = roll * (M_PI*2 / 360);
290 out->m[0][0] = cp*cy * scale;
291 out->m[0][1] = sr*sp*cy+cr*-sy * scale;
292 out->m[0][2] = cr*sp*cy+-sr*-sy * scale;
294 out->m[1][0] = cp*sy * scale;
295 out->m[1][1] = sr*sp*sy+cr*cy * scale;
296 out->m[1][2] = cr*sp*sy+-sr*cy * scale;
298 out->m[2][0] = -sp * scale;
299 out->m[2][1] = sr*cp * scale;
300 out->m[2][2] = cr*cp * scale;
308 void Matrix4x4_ToVectors(const matrix4x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
324 void Matrix4x4_FromVectors(matrix4x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
326 out->m[0][0] = vx[0];
327 out->m[0][1] = vy[0];
328 out->m[0][2] = vz[0];
330 out->m[1][0] = vx[1];
331 out->m[1][1] = vy[1];
332 out->m[1][2] = vz[1];
334 out->m[2][0] = vx[2];
335 out->m[2][1] = vy[2];
336 out->m[2][2] = vz[2];
344 void Matrix4x4_Transform (const matrix4x4_t *in, const float v[3], float out[3])
346 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + in->m[0][3];
347 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + in->m[1][3];
348 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + in->m[2][3];
351 void Matrix4x4_Transform4 (const matrix4x4_t *in, const float v[4], float out[4])
353 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];
354 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];
355 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];
356 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];
360 void Matrix4x4_SimpleUntransform (const matrix4x4_t *in, const float v[3], float out[3])
363 t[0] = v[0] - in->m[0][3];
364 t[1] = v[1] - in->m[1][3];
365 t[2] = v[2] - in->m[2][3];
366 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0];
367 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1];
368 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2];
373 void Matrix4x4_ConcatTranslate (matrix4x4_t *out, float x, float y, float z)
375 matrix4x4_t base, temp;
376 Matrix4x4_Copy(out, &base);
377 Matrix4x4_CreateTranslate(&temp, x, y, z);
378 Matrix4x4_Concat(out, &base, &temp);
382 void Matrix4x4_ConcatRotate (matrix4x4_t *out, float angle, float x, float y, float z)
384 matrix4x4_t base, temp;
385 Matrix4x4_Copy(out, &base);
386 Matrix4x4_CreateRotate(&temp, angle, x, y, z);
387 Matrix4x4_Concat(out, &base, &temp);
391 void Matrix4x4_ConcatScale (matrix4x4_t *out, float x)
393 matrix4x4_t base, temp;
394 Matrix4x4_Copy(out, &base);
395 Matrix4x4_CreateScale(&temp, x);
396 Matrix4x4_Concat(out, &base, &temp);
400 void Matrix4x4_ConcatScale3 (matrix4x4_t *out, float x, float y, float z)
402 matrix4x4_t base, temp;
403 Matrix4x4_Copy(out, &base);
404 Matrix4x4_CreateScale3(&temp, x, y, z);
405 Matrix4x4_Concat(out, &base, &temp);
415 void Matrix3x4_Copy (matrix3x4_t *out, const matrix3x4_t *in)
420 void Matrix3x4_CopyRotateOnly (matrix3x4_t *out, const matrix3x4_t *in)
422 out->m[0][0] = in->m[0][0];
423 out->m[0][1] = in->m[0][1];
424 out->m[0][2] = in->m[0][2];
426 out->m[1][0] = in->m[1][0];
427 out->m[1][1] = in->m[1][1];
428 out->m[1][2] = in->m[1][2];
430 out->m[2][0] = in->m[2][0];
431 out->m[2][1] = in->m[2][1];
432 out->m[2][2] = in->m[2][2];
436 void Matrix3x4_CopyTranslateOnly (matrix3x4_t *out, const matrix3x4_t *in)
441 out->m[0][3] = in->m[0][3];
445 out->m[1][3] = in->m[0][3];
449 out->m[2][3] = in->m[0][3];
452 void Matrix3x4_FromMatrix4x4 (matrix3x4_t *out, const matrix4x4_t *in)
454 out->m[0][0] = in->m[0][0];
455 out->m[0][1] = in->m[0][1];
456 out->m[0][2] = in->m[0][2];
457 out->m[0][3] = in->m[0][3];
458 out->m[1][0] = in->m[1][0];
459 out->m[1][1] = in->m[1][1];
460 out->m[1][2] = in->m[1][2];
461 out->m[1][3] = in->m[1][3];
462 out->m[2][0] = in->m[2][0];
463 out->m[2][1] = in->m[2][1];
464 out->m[2][2] = in->m[2][2];
465 out->m[2][3] = in->m[2][3];
468 void Matrix3x4_Concat (matrix3x4_t *out, const matrix3x4_t *in1, const matrix3x4_t *in2)
470 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];
471 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];
472 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];
473 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];
474 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];
475 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];
476 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];
477 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];
478 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];
479 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];
480 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];
481 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];
484 void Matrix3x4_Transpose3x3 (matrix3x4_t *out, const matrix3x4_t *in1)
486 out->m[0][0] = in1->m[0][0];
487 out->m[0][1] = in1->m[1][0];
488 out->m[0][2] = in1->m[2][0];
490 out->m[1][0] = in1->m[0][1];
491 out->m[1][1] = in1->m[1][1];
492 out->m[1][2] = in1->m[2][1];
494 out->m[2][0] = in1->m[0][2];
495 out->m[2][1] = in1->m[1][2];
496 out->m[2][2] = in1->m[2][2];
500 void Matrix3x4_Invert_Simple (matrix3x4_t *out, const matrix3x4_t *in1)
502 // we only support uniform scaling, so assume the first row is enough
503 // (note the lack of sqrt here, because we're trying to undo the scaling,
504 // this means multiplying by the inverse scale twice - squaring it, which
505 // makes the sqrt a waste of time)
506 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]);
508 // invert the rotation by transposing and multiplying by the squared
509 // recipricol of the input matrix scale as described above
510 out->m[0][0] = in1->m[0][0] * scale;
511 out->m[0][1] = in1->m[1][0] * scale;
512 out->m[0][2] = in1->m[2][0] * scale;
513 out->m[1][0] = in1->m[0][1] * scale;
514 out->m[1][1] = in1->m[1][1] * scale;
515 out->m[1][2] = in1->m[2][1] * scale;
516 out->m[2][0] = in1->m[0][2] * scale;
517 out->m[2][1] = in1->m[1][2] * scale;
518 out->m[2][2] = in1->m[2][2] * scale;
520 // invert the translate
521 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]);
522 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]);
523 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]);
527 void Matrix3x4_CreateIdentity (matrix3x4_t *out)
543 void Matrix3x4_CreateTranslate (matrix3x4_t *out, float x, float y, float z)
559 void Matrix3x4_CreateRotate (matrix3x4_t *out, float angle, float x, float y, float z)
565 len = 1.0f / sqrt(len);
570 angle *= M_PI / 180.0;
574 out->m[0][0]=x * x + c * (1 - x * x);
575 out->m[0][1]=x * y * (1 - c) + z * s;
576 out->m[0][2]=z * x * (1 - c) - y * s;
578 out->m[1][0]=x * y * (1 - c) - z * s;
579 out->m[1][1]=y * y + c * (1 - y * y);
580 out->m[1][2]=y * z * (1 - c) + x * s;
582 out->m[2][0]=z * x * (1 - c) + y * s;
583 out->m[2][1]=y * z * (1 - c) - x * s;
584 out->m[2][2]=z * z + c * (1 - z * z);
588 void Matrix3x4_CreateScale (matrix3x4_t *out, float x)
604 void Matrix3x4_CreateScale3 (matrix3x4_t *out, float x, float y, float z)
620 void Matrix3x4_CreateFromQuakeEntity(matrix3x4_t *out, float x, float y, float z, float pitch, float yaw, float roll, float scale)
622 double angle, sr, sp, sy, cr, cp, cy;
624 angle = yaw * (M_PI*2 / 360);
627 angle = pitch * (M_PI*2 / 360);
630 angle = roll * (M_PI*2 / 360);
633 out->m[0][0] = cp*cy * scale;
634 out->m[0][1] = sr*sp*cy+cr*-sy * scale;
635 out->m[0][2] = cr*sp*cy+-sr*-sy * scale;
637 out->m[1][0] = cp*sy * scale;
638 out->m[1][1] = sr*sp*sy+cr*cy * scale;
639 out->m[1][2] = cr*sp*sy+-sr*cy * scale;
641 out->m[2][0] = -sp * scale;
642 out->m[2][1] = sr*cp * scale;
643 out->m[2][2] = cr*cp * scale;
647 void Matrix3x4_ToVectors(const matrix3x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
663 void Matrix3x4_FromVectors(matrix3x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
665 out->m[0][0] = vx[0];
666 out->m[0][1] = vy[0];
667 out->m[0][2] = vz[0];
669 out->m[1][0] = vx[1];
670 out->m[1][1] = vy[1];
671 out->m[1][2] = vz[1];
673 out->m[2][0] = vx[2];
674 out->m[2][1] = vy[2];
675 out->m[2][2] = vz[2];
679 void Matrix3x4_Transform (const matrix3x4_t *in, const float v[3], float out[3])
681 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + in->m[0][3];
682 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + in->m[1][3];
683 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + in->m[2][3];
686 void Matrix3x4_SimpleUntransform (const matrix3x4_t *in, const float v[3], float out[3])
689 t[0] = v[0] - in->m[0][3];
690 t[1] = v[1] - in->m[1][3];
691 t[2] = v[2] - in->m[2][3];
692 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0];
693 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1];
694 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2];
698 void Matrix3x4_ConcatTranslate (matrix3x4_t *out, float x, float y, float z)
700 matrix3x4_t base, temp;
701 Matrix3x4_Copy(out, &base);
702 Matrix3x4_CreateTranslate(&temp, x, y, z);
703 Matrix3x4_Concat(out, &base, &temp);
707 void Matrix3x4_ConcatRotate (matrix3x4_t *out, float angle, float x, float y, float z)
709 matrix3x4_t base, temp;
710 Matrix3x4_Copy(out, &base);
711 Matrix3x4_CreateRotate(&temp, angle, x, y, z);
712 Matrix3x4_Concat(out, &base, &temp);
716 void Matrix3x4_ConcatScale (matrix3x4_t *out, float x)
718 matrix3x4_t base, temp;
719 Matrix3x4_Copy(out, &base);
720 Matrix3x4_CreateScale(&temp, x);
721 Matrix3x4_Concat(out, &base, &temp);
725 void Matrix3x4_ConcatScale3 (matrix3x4_t *out, float x, float y, float z)
727 matrix3x4_t base, temp;
728 Matrix3x4_Copy(out, &base);
729 Matrix3x4_CreateScale3(&temp, x, y, z);
730 Matrix3x4_Concat(out, &base, &temp);