5 void Matrix4x4_Copy (matrix4x4_t *out, const matrix4x4_t *in)
10 void Matrix4x4_CopyRotateOnly (matrix4x4_t *out, const 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, const matrix4x4_t *in)
35 out->m[0][3] = in->m[0][3];
39 out->m[1][3] = in->m[1][3];
43 out->m[2][3] = in->m[2][3];
50 void Matrix4x4_Concat (matrix4x4_t *out, const matrix4x4_t *in1, const matrix4x4_t *in2)
52 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];
53 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];
54 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];
55 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];
56 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];
57 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];
58 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];
59 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];
60 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];
61 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];
62 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];
63 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];
64 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];
65 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];
66 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];
67 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];
70 void Matrix4x4_Transpose (matrix4x4_t *out, const matrix4x4_t *in1)
72 out->m[0][0] = in1->m[0][0];
73 out->m[0][1] = in1->m[1][0];
74 out->m[0][2] = in1->m[2][0];
75 out->m[0][3] = in1->m[3][0];
76 out->m[1][0] = in1->m[0][1];
77 out->m[1][1] = in1->m[1][1];
78 out->m[1][2] = in1->m[2][1];
79 out->m[1][3] = in1->m[3][1];
80 out->m[2][0] = in1->m[0][2];
81 out->m[2][1] = in1->m[1][2];
82 out->m[2][2] = in1->m[2][2];
83 out->m[2][3] = in1->m[3][2];
84 out->m[3][0] = in1->m[0][3];
85 out->m[3][1] = in1->m[1][3];
86 out->m[3][2] = in1->m[2][3];
87 out->m[3][3] = in1->m[3][3];
90 void Matrix4x4_Transpose3x3 (matrix4x4_t *out, const matrix4x4_t *in1)
92 out->m[0][0] = in1->m[0][0];
93 out->m[0][1] = in1->m[1][0];
94 out->m[0][2] = in1->m[2][0];
95 out->m[1][0] = in1->m[0][1];
96 out->m[1][1] = in1->m[1][1];
97 out->m[1][2] = in1->m[2][1];
98 out->m[2][0] = in1->m[0][2];
99 out->m[2][1] = in1->m[1][2];
100 out->m[2][2] = in1->m[2][2];
102 out->m[0][3] = in1->m[0][3];
103 out->m[1][3] = in1->m[1][3];
104 out->m[2][3] = in1->m[2][3];
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_Invert_Simple (matrix4x4_t *out, const matrix4x4_t *in1)
113 // we only support uniform scaling, so assume the first row is enough
114 // (note the lack of sqrt here, because we're trying to undo the scaling,
115 // this means multiplying by the inverse scale twice - squaring it, which
116 // makes the sqrt a waste of time)
118 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]);
120 double scale = 3.0 / sqrt
121 (in1->m[0][0] * in1->m[0][0] + in1->m[0][1] * in1->m[0][1] + in1->m[0][2] * in1->m[0][2]
122 + in1->m[1][0] * in1->m[1][0] + in1->m[1][1] * in1->m[1][1] + in1->m[1][2] * in1->m[1][2]
123 + in1->m[2][0] * in1->m[2][0] + in1->m[2][1] * in1->m[2][1] + in1->m[2][2] * in1->m[2][2]);
127 // invert the rotation by transposing and multiplying by the squared
128 // recipricol of the input matrix scale as described above
129 out->m[0][0] = in1->m[0][0] * scale;
130 out->m[0][1] = in1->m[1][0] * scale;
131 out->m[0][2] = in1->m[2][0] * scale;
132 out->m[1][0] = in1->m[0][1] * scale;
133 out->m[1][1] = in1->m[1][1] * scale;
134 out->m[1][2] = in1->m[2][1] * scale;
135 out->m[2][0] = in1->m[0][2] * scale;
136 out->m[2][1] = in1->m[1][2] * scale;
137 out->m[2][2] = in1->m[2][2] * scale;
139 // invert the translate
140 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]);
141 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]);
142 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]);
144 // don't know if there's anything worth doing here
151 void Matrix4x4_CreateIdentity (matrix4x4_t *out)
171 void Matrix4x4_CreateTranslate (matrix4x4_t *out, float x, float y, float z)
191 void Matrix4x4_CreateRotate (matrix4x4_t *out, float angle, float x, float y, float z)
197 len = 1.0f / sqrt(len);
202 angle *= -M_PI / 180.0;
206 out->m[0][0]=x * x + c * (1 - x * x);
207 out->m[0][1]=x * y * (1 - c) + z * s;
208 out->m[0][2]=z * x * (1 - c) - y * s;
210 out->m[1][0]=x * y * (1 - c) - z * s;
211 out->m[1][1]=y * y + c * (1 - y * y);
212 out->m[1][2]=y * z * (1 - c) + x * s;
214 out->m[2][0]=z * x * (1 - c) + y * s;
215 out->m[2][1]=y * z * (1 - c) - x * s;
216 out->m[2][2]=z * z + c * (1 - z * z);
224 void Matrix4x4_CreateScale (matrix4x4_t *out, float x)
244 void Matrix4x4_CreateScale3 (matrix4x4_t *out, float x, float y, float z)
264 void Matrix4x4_CreateFromQuakeEntity(matrix4x4_t *out, float x, float y, float z, float pitch, float yaw, float roll, float scale)
266 double angle, sr, sp, sy, cr, cp, cy;
268 angle = yaw * (M_PI*2 / 360);
271 angle = pitch * (M_PI*2 / 360);
274 angle = roll * (M_PI*2 / 360);
277 out->m[0][0] = (cp*cy) * scale;
278 out->m[0][1] = (sr*sp*cy+cr*-sy) * scale;
279 out->m[0][2] = (cr*sp*cy+-sr*-sy) * scale;
281 out->m[1][0] = (cp*sy) * scale;
282 out->m[1][1] = (sr*sp*sy+cr*cy) * scale;
283 out->m[1][2] = (cr*sp*sy+-sr*cy) * scale;
285 out->m[2][0] = (-sp) * scale;
286 out->m[2][1] = (sr*cp) * scale;
287 out->m[2][2] = (cr*cp) * scale;
295 void Matrix4x4_ToVectors(const matrix4x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
311 void Matrix4x4_FromVectors(matrix4x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
313 out->m[0][0] = vx[0];
314 out->m[0][1] = vy[0];
315 out->m[0][2] = vz[0];
317 out->m[1][0] = vx[1];
318 out->m[1][1] = vy[1];
319 out->m[1][2] = vz[1];
321 out->m[2][0] = vx[2];
322 out->m[2][1] = vy[2];
323 out->m[2][2] = vz[2];
331 void Matrix4x4_Transform (const matrix4x4_t *in, const float v[3], float out[3])
333 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2] + in->m[0][3];
334 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2] + in->m[1][3];
335 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2] + in->m[2][3];
338 void Matrix4x4_Transform4 (const matrix4x4_t *in, const float v[4], float out[4])
340 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];
341 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];
342 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];
343 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];
346 void Matrix4x4_Transform3x3 (const matrix4x4_t *in, const float v[3], float out[3])
348 out[0] = v[0] * in->m[0][0] + v[1] * in->m[0][1] + v[2] * in->m[0][2];
349 out[1] = v[0] * in->m[1][0] + v[1] * in->m[1][1] + v[2] * in->m[1][2];
350 out[2] = v[0] * in->m[2][0] + v[1] * in->m[2][1] + v[2] * in->m[2][2];
354 void Matrix4x4_SimpleUntransform (const matrix4x4_t *in, const float v[3], float out[3])
357 t[0] = v[0] - in->m[0][3];
358 t[1] = v[1] - in->m[1][3];
359 t[2] = v[2] - in->m[2][3];
360 out[0] = t[0] * in->m[0][0] + t[1] * in->m[1][0] + t[2] * in->m[2][0];
361 out[1] = t[0] * in->m[0][1] + t[1] * in->m[1][1] + t[2] * in->m[2][1];
362 out[2] = t[0] * in->m[0][2] + t[1] * in->m[1][2] + t[2] * in->m[2][2];
367 void Matrix4x4_ConcatTranslate (matrix4x4_t *out, float x, float y, float z)
369 matrix4x4_t base, temp;
371 Matrix4x4_CreateTranslate(&temp, x, y, z);
372 Matrix4x4_Concat(out, &base, &temp);
376 void Matrix4x4_ConcatRotate (matrix4x4_t *out, float angle, float x, float y, float z)
378 matrix4x4_t base, temp;
380 Matrix4x4_CreateRotate(&temp, angle, x, y, z);
381 Matrix4x4_Concat(out, &base, &temp);
385 void Matrix4x4_ConcatScale (matrix4x4_t *out, float x)
387 matrix4x4_t base, temp;
389 Matrix4x4_CreateScale(&temp, x);
390 Matrix4x4_Concat(out, &base, &temp);
394 void Matrix4x4_ConcatScale3 (matrix4x4_t *out, float x, float y, float z)
396 matrix4x4_t base, temp;
398 Matrix4x4_CreateScale3(&temp, x, y, z);
399 Matrix4x4_Concat(out, &base, &temp);