5 void Matrix4x4_Copy (matrix4x4_t *out, matrix4x4_t *in)
10 void Matrix4x4_Concat (matrix4x4_t *out, const matrix4x4_t *in1, const matrix4x4_t *in2)
12 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];
13 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];
14 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];
15 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];
16 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];
17 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];
18 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];
19 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];
20 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];
21 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];
22 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];
23 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];
24 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];
25 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];
26 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];
27 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];
30 void Matrix4x4_Transpose (matrix4x4_t *out, const matrix4x4_t *in1)
32 out->m[0][0] = in1->m[0][0];
33 out->m[0][1] = in1->m[1][0];
34 out->m[0][2] = in1->m[2][0];
35 out->m[0][3] = in1->m[3][0];
36 out->m[1][0] = in1->m[0][1];
37 out->m[1][1] = in1->m[1][1];
38 out->m[1][2] = in1->m[2][1];
39 out->m[1][3] = in1->m[3][1];
40 out->m[2][0] = in1->m[0][2];
41 out->m[2][1] = in1->m[1][2];
42 out->m[2][2] = in1->m[2][2];
43 out->m[2][3] = in1->m[3][2];
44 out->m[3][0] = in1->m[0][3];
45 out->m[3][1] = in1->m[1][3];
46 out->m[3][2] = in1->m[2][3];
47 out->m[3][3] = in1->m[3][3];
50 void Matrix4x4_CreateIdentity (matrix4x4_t *out)
70 void Matrix4x4_CreateTranslate (matrix4x4_t *out, float x, float y, float z)
90 void Matrix4x4_CreateRotate (matrix4x4_t *out, float angle, float x, float y, float z)
96 len = 1.0f / sqrt(len);
101 angle *= M_PI / 180.0;
105 out->m[0][0]=x * x + c * (1 - x * x);
106 out->m[0][1]=x * y * (1 - c) + z * s;
107 out->m[0][2]=z * x * (1 - c) - y * s;
109 out->m[1][0]=x * y * (1 - c) - z * s;
110 out->m[1][1]=y * y + c * (1 - y * y);
111 out->m[1][2]=y * z * (1 - c) + x * s;
113 out->m[2][0]=z * x * (1 - c) + y * s;
114 out->m[2][1]=y * z * (1 - c) - x * s;
115 out->m[2][2]=z * z + c * (1 - z * z);
123 void Matrix4x4_CreateScale (matrix4x4_t *out, float x)
143 void Matrix4x4_CreateScale3 (matrix4x4_t *out, float x, float y, float z)
163 void Matrix4x4_ToVectors(const matrix4x4_t *in, vec3_t vx, vec3_t vy, vec3_t vz, vec3_t t)
179 void Matrix4x4_ToVectors4(const matrix4x4_t *in, vec4_t vx, vec4_t vy, vec4_t vz, vec4_t t)
199 void Matrix4x4_FromVectors(matrix4x4_t *out, const vec3_t vx, const vec3_t vy, const vec3_t vz, const vec3_t t)
201 out->m[0][0] = vx[0];
202 out->m[0][1] = vy[0];
203 out->m[0][2] = vz[0];
205 out->m[1][0] = vx[1];
206 out->m[1][1] = vy[1];
207 out->m[1][2] = vz[1];
209 out->m[2][0] = vx[2];
210 out->m[2][1] = vy[2];
211 out->m[2][2] = vz[2];
219 void Matrix4x4_FromVectors4(matrix4x4_t *out, const vec4_t vx, const vec4_t vy, const vec4_t vz, const vec4_t t)
221 out->m[0][0] = vx[0];
222 out->m[0][1] = vy[0];
223 out->m[0][2] = vz[0];
225 out->m[1][0] = vx[1];
226 out->m[1][1] = vy[1];
227 out->m[1][2] = vz[1];
229 out->m[2][0] = vx[2];
230 out->m[2][1] = vy[2];
231 out->m[2][2] = vz[2];
233 out->m[3][0] = vx[3];
234 out->m[3][1] = vy[3];
235 out->m[3][2] = vz[3];
239 void Matrix4x4_Transform (const matrix4x4_t *in, const vec3_t v, vec3_t out)
241 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + in->m[0][3];
242 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + in->m[1][3];
243 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + in->m[2][3];
246 void Matrix4x4_Transform4 (const matrix4x4_t *in, const vec4_t v, vec4_t out)
248 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];
249 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];
250 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];
251 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];
254 void Matrix4x4_Untransform (const matrix4x4_t *in, const vec3_t v, vec3_t out)
257 t[0] = v[0] - in->m[0][3];
258 t[1] = v[1] - in->m[1][3];
259 t[2] = v[2] - in->m[2][3];
260 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0];
261 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1];
262 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2];
265 void Matrix4x4_Untransform4 (const matrix4x4_t *in, const vec4_t v, vec4_t out)
268 t[0] = v[0] - in->m[0][3];
269 t[1] = v[1] - in->m[1][3];
270 t[2] = v[2] - in->m[2][3];
271 t[3] = v[3] - in->m[3][3];
272 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0] + t[3] * in->m[3][0];
273 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1] + t[3] * in->m[3][1];
274 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2] + t[3] * in->m[3][2];
275 out[3] = t[0] * in->m[0][3] + t[1] * in->m[1][3] + t[2] * in->m[2][3] + t[3] * in->m[3][3];
279 void Matrix4x4_ConcatTranslate (matrix4x4_t *out, float x, float y, float z)
281 matrix4x4_t base, temp;
282 Matrix4x4_Copy(out, &base);
283 Matrix4x4_CreateTranslate(&temp, x, y, z);
284 Matrix4x4_Concat(out, &base, &temp);
288 void Matrix4x4_ConcatRotate (matrix4x4_t *out, float angle, float x, float y, float z)
290 matrix4x4_t base, temp;
291 Matrix4x4_Copy(out, &base);
292 Matrix4x4_CreateRotate(&temp, angle, x, y, z);
293 Matrix4x4_Concat(out, &base, &temp);
297 void Matrix4x4_ConcatScale (matrix4x4_t *out, float x)
299 matrix4x4_t base, temp;
300 Matrix4x4_Copy(out, &base);
301 Matrix4x4_CreateScale(&temp, x);
302 Matrix4x4_Concat(out, &base, &temp);
306 void Matrix4x4_ConcatScale3 (matrix4x4_t *out, float x, float y, float z)
308 matrix4x4_t base, temp;
309 Matrix4x4_Copy(out, &base);
310 Matrix4x4_CreateScale3(&temp, x, y, z);
311 Matrix4x4_Concat(out, &base, &temp);