2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\r
7 GtkRadiant is free software; you can redistribute it and/or modify
\r
8 it under the terms of the GNU General Public License as published by
\r
9 the Free Software Foundation; either version 2 of the License, or
\r
10 (at your option) any later version.
\r
12 GtkRadiant is distributed in the hope that it will be useful,
\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 GNU General Public License for more details.
\r
17 You should have received a copy of the GNU General Public License
\r
18 along with GtkRadiant; if not, write to the Free Software
\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\r
22 #include "mathlib.h"
\r
25 void m4x4_identity(m4x4_t matrix)
\r
27 matrix[1] = matrix[2] = matrix[3] =
\r
28 matrix[4] = matrix[6] = matrix[7] =
\r
29 matrix[8] = matrix[9] = matrix[11] =
\r
30 matrix[12] = matrix[13] = matrix[14] = 0;
\r
32 matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1;
\r
35 void m4x4_translation_for_vec3(m4x4_t matrix, const vec3_t translation)
\r
37 matrix[1] = matrix[2] = matrix[3] =
\r
38 matrix[4] = matrix[6] = matrix[7] =
\r
39 matrix[8] = matrix[9] = matrix[11] = 0;
\r
41 matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1;
\r
43 matrix[12] = translation[0];
\r
44 matrix[13] = translation[1];
\r
45 matrix[14] = translation[2];
\r
48 void m4x4_rotation_for_vec3(m4x4_t matrix, const vec3_t euler, eulerOrder_t order)
\r
50 double cx, sx, cy, sy, cz, sz;
\r
52 cx = cos(DEG2RAD(euler[0]));
\r
53 sx = sin(DEG2RAD(euler[0]));
\r
54 cy = cos(DEG2RAD(euler[1]));
\r
55 sy = sin(DEG2RAD(euler[1]));
\r
56 cz = cos(DEG2RAD(euler[2]));
\r
57 sz = sin(DEG2RAD(euler[2]));
\r
66 matrix[0] = (vec_t)(cy*cz);
\r
67 matrix[1] = (vec_t)(cy*sz);
\r
68 matrix[2] = (vec_t)-sy;
\r
69 matrix[4] = (vec_t)(sx*sy*cz + cx*-sz);
\r
70 matrix[5] = (vec_t)(sx*sy*sz + cx*cz);
\r
71 matrix[6] = (vec_t)(sx*cy);
\r
72 matrix[8] = (vec_t)(cx*sy*cz + sx*sz);
\r
73 matrix[9] = (vec_t)(cx*sy*sz + -sx*cz);
\r
74 matrix[10] = (vec_t)(cx*cy);
\r
77 matrix[12] = matrix[13] = matrix[14] = matrix[3] = matrix[7] = matrix[11] = 0;
\r
82 m4x4_identity(matrix);
\r
83 matrix[5] =(vec_t) cx; matrix[6] =(vec_t) sx;
\r
84 matrix[9] =(vec_t)-sx; matrix[10]=(vec_t) cx;
\r
88 m4x4_identity(temp);
\r
89 temp[0] =(vec_t) cy; temp[2] =(vec_t)-sy;
\r
90 temp[8] =(vec_t) sy; temp[10]=(vec_t) cy;
\r
91 m4x4_premultiply_by_m4x4(matrix, temp);
\r
92 m4x4_identity(temp);
\r
93 temp[0] =(vec_t) cz; temp[1] =(vec_t) sz;
\r
94 temp[4] =(vec_t)-sz; temp[5] =(vec_t) cz;
\r
95 m4x4_premultiply_by_m4x4(matrix, temp);
\r
102 m4x4_identity(matrix);
\r
103 matrix[0] =(vec_t) cy; matrix[2] =(vec_t)-sy;
\r
104 matrix[8] =(vec_t) sy; matrix[10]=(vec_t) cy;
\r
108 m4x4_identity(temp);
\r
109 temp[5] =(vec_t) cx; temp[6] =(vec_t) sx;
\r
110 temp[9] =(vec_t)-sx; temp[10]=(vec_t) cx;
\r
111 m4x4_premultiply_by_m4x4(matrix, temp);
\r
112 m4x4_identity(temp);
\r
113 temp[0] =(vec_t) cz; temp[1] =(vec_t) sz;
\r
114 temp[4] =(vec_t)-sz; temp[5] =(vec_t) cz;
\r
115 m4x4_premultiply_by_m4x4(matrix, temp);
\r
120 m4x4_identity(matrix);
\r
121 matrix[0] =(vec_t) cz; matrix[1] =(vec_t) sz;
\r
122 matrix[4] =(vec_t)-sz; matrix[5] =(vec_t) cz;
\r
126 m4x4_identity(temp);
\r
127 temp[5] =(vec_t) cx; temp[6] =(vec_t) sx;
\r
128 temp[9] =(vec_t)-sx; temp[10]=(vec_t) cx;
\r
129 m4x4_premultiply_by_m4x4(matrix, temp);
\r
130 m4x4_identity(temp);
\r
131 temp[0] =(vec_t) cy; temp[2] =(vec_t)-sy;
\r
132 temp[8] =(vec_t) sy; temp[10]=(vec_t) cy;
\r
133 m4x4_premultiply_by_m4x4(matrix, temp);
\r
138 m4x4_identity(matrix);
\r
139 matrix[5] =(vec_t) cx; matrix[6] =(vec_t) sx;
\r
140 matrix[9] =(vec_t)-sx; matrix[10]=(vec_t) cx;
\r
144 m4x4_identity(temp);
\r
145 temp[0] =(vec_t) cz; temp[1] =(vec_t) sz;
\r
146 temp[4] =(vec_t)-sz; temp[5] =(vec_t) cz;
\r
147 m4x4_premultiply_by_m4x4(matrix, temp);
\r
148 m4x4_identity(temp);
\r
149 temp[0] =(vec_t) cy; temp[2] =(vec_t)-sy;
\r
150 temp[8] =(vec_t) sy; temp[10]=(vec_t) cy;
\r
151 m4x4_premultiply_by_m4x4(matrix, temp);
\r
158 | cy.cz + sx.sy.-sz + -cx.sy.0 0.cz + cx.-sz + sx.0 sy.cz + -sx.cy.-sz + cx.cy.0 |
\r
159 | cy.sz + sx.sy.cz + -cx.sy.0 0.sz + cx.cz + sx.0 sy.sz + -sx.cy.cz + cx.cy.0 |
\r
160 | cy.0 + sx.sy.0 + -cx.sy.1 0.0 + cx.0 + sx.1 sy.0 + -sx.cy.0 + cx.cy.1 |
\r
166 matrix[0] = (vec_t)(cy*cz + sx*sy*-sz);
\r
167 matrix[1] = (vec_t)(cy*sz + sx*sy*cz);
\r
168 matrix[2] = (vec_t)(-cx*sy);
\r
169 matrix[4] = (vec_t)(cx*-sz);
\r
170 matrix[5] = (vec_t)(cx*cz);
\r
171 matrix[6] = (vec_t)(sx);
\r
172 matrix[8] = (vec_t)(sy*cz + -sx*cy*-sz);
\r
173 matrix[9] = (vec_t)(sy*sz + -sx*cy*cz);
\r
174 matrix[10] = (vec_t)(cx*cy);
\r
177 matrix[12] = matrix[13] = matrix[14] = matrix[3] = matrix[7] = matrix[11] = 0;
\r
182 m4x4_identity(matrix);
\r
183 matrix[0] =(vec_t) cy; matrix[2] =(vec_t)-sy;
\r
184 matrix[8] =(vec_t) sy; matrix[10]=(vec_t) cy;
\r
188 m4x4_identity(temp);
\r
189 temp[5] =(vec_t) cx; temp[6] =(vec_t) sx;
\r
190 temp[9] =(vec_t)-sx; temp[10]=(vec_t) cx;
\r
191 m4x4_premultiply_by_m4x4(matrix, temp);
\r
192 m4x4_identity(temp);
\r
193 temp[0] =(vec_t) cz; temp[1] =(vec_t) sz;
\r
194 temp[4] =(vec_t)-sz; temp[5] =(vec_t) cz;
\r
195 m4x4_premultiply_by_m4x4(matrix, temp);
\r
204 matrix[0] = (vec_t)(cy*cz);
\r
205 matrix[4] = (vec_t)(cy*-sz);
\r
206 matrix[8] = (vec_t)sy;
\r
207 matrix[1] = (vec_t)(sx*sy*cz + cx*sz);
\r
208 matrix[5] = (vec_t)(sx*sy*-sz + cx*cz);
\r
209 matrix[9] = (vec_t)(-sx*cy);
\r
210 matrix[2] = (vec_t)(cx*-sy*cz + sx*sz);
\r
211 matrix[6] = (vec_t)(cx*-sy*-sz + sx*cz);
\r
212 matrix[10] = (vec_t)(cx*cy);
\r
215 matrix[12] = matrix[13] = matrix[14] = matrix[3] = matrix[7] = matrix[11] = 0;
\r
220 m4x4_identity(matrix);
\r
221 matrix[0] =(vec_t) cz; matrix[1] =(vec_t) sz;
\r
222 matrix[4] =(vec_t)-sz; matrix[5] =(vec_t) cz;
\r
225 m4x4_identity(temp);
\r
226 temp[0] =(vec_t) cy; temp[2] =(vec_t)-sy;
\r
227 temp[8] =(vec_t) sy; temp[10]=(vec_t) cy;
\r
228 m4x4_premultiply_by_m4x4(matrix, temp);
\r
229 m4x4_identity(temp);
\r
230 temp[5] =(vec_t) cx; temp[6] =(vec_t) sx;
\r
231 temp[9] =(vec_t)-sx; temp[10]=(vec_t) cx;
\r
232 m4x4_premultiply_by_m4x4(matrix, temp);
\r
242 void m4x4_scale_for_vec3(m4x4_t matrix, const vec3_t scale)
\r
244 matrix[1] = matrix[2] = matrix[3] =
\r
245 matrix[4] = matrix[6] = matrix[7] =
\r
246 matrix[8] = matrix[9] = matrix[11] =
\r
247 matrix[12] = matrix[13] = matrix[14] = 0;
\r
251 matrix[0] = scale[0];
\r
252 matrix[5] = scale[1];
\r
253 matrix[10] = scale[2];
\r
256 void m4x4_rotation_for_quat(m4x4_t matrix, const vec4_t rotation)
\r
258 float xx,xy,xz,xw,yy,yz,yw,zz,zw;
\r
260 xx = rotation[0] * rotation[0];
\r
261 xy = rotation[0] * rotation[1];
\r
262 xz = rotation[0] * rotation[2];
\r
263 xw = rotation[0] * rotation[3];
\r
265 yy = rotation[1] * rotation[1];
\r
266 yz = rotation[1] * rotation[2];
\r
267 yw = rotation[1] * rotation[3];
\r
269 zz = rotation[2] * rotation[2];
\r
270 zw = rotation[2] * rotation[3];
\r
272 matrix[0] = 1 - 2 * ( yy + zz );
\r
273 matrix[4] = 2 * ( xy - zw );
\r
274 matrix[8] = 2 * ( xz + yw );
\r
276 matrix[1] = 2 * ( xy + zw );
\r
277 matrix[5] = 1 - 2 * ( xx + zz );
\r
278 matrix[9] = 2 * ( yz - xw );
\r
280 matrix[2] = 2 * ( xz - yw );
\r
281 matrix[6] = 2 * ( yz + xw );
\r
282 matrix[10] = 1 - 2 * ( xx + yy );
\r
284 matrix[3] = matrix[7] = matrix[11] = matrix[12] = matrix[13] = matrix[14] = 0;
\r
288 void m4x4_rotation_for_axisangle(m4x4_t matrix, const vec3_t axis, vec_t angle)
\r
293 rotation[3] = (float)sin((float)(angle));
\r
295 rotation[0] = axis[0] * rotation[3];
\r
296 rotation[1] = axis[1] * rotation[3];
\r
297 rotation[2] = axis[2] * rotation[3];
\r
298 rotation[3] = (float)cos((float)(angle));
\r
300 m4x4_rotation_for_quat(matrix, rotation);
\r
303 void m4x4_translate_by_vec3(m4x4_t matrix, const vec3_t translation)
\r
306 m4x4_translation_for_vec3(temp, translation);
\r
307 m4x4_multiply_by_m4x4(matrix, temp);
\r
310 void m4x4_rotate_by_vec3(m4x4_t matrix, const vec3_t euler, eulerOrder_t order)
\r
313 m4x4_rotation_for_vec3(temp, euler, order);
\r
314 m4x4_multiply_by_m4x4(matrix, temp);
\r
317 void m4x4_scale_by_vec3(m4x4_t matrix, const vec3_t scale)
\r
320 m4x4_scale_for_vec3(temp, scale);
\r
321 m4x4_multiply_by_m4x4(matrix, temp);
\r
324 void m4x4_rotate_by_quat(m4x4_t matrix, const vec4_t rotation)
\r
327 m4x4_rotation_for_quat(temp, rotation);
\r
328 m4x4_multiply_by_m4x4(matrix, temp);
\r
331 void m4x4_rotate_by_axisangle(m4x4_t matrix, const vec3_t axis, vec_t angle)
\r
334 m4x4_rotation_for_axisangle(temp, axis, angle);
\r
335 m4x4_multiply_by_m4x4(matrix, temp);
\r
338 void m4x4_transform_by_vec3(m4x4_t matrix, const vec3_t translation, const vec3_t euler, eulerOrder_t order, const vec3_t scale)
\r
340 m4x4_translate_by_vec3(matrix, translation);
\r
341 m4x4_rotate_by_vec3(matrix, euler, order);
\r
342 m4x4_scale_by_vec3(matrix, scale);
\r
345 void m4x4_pivoted_rotate_by_vec3(m4x4_t matrix, const vec3_t euler, eulerOrder_t order, const vec3_t pivotpoint)
\r
348 VectorNegative(pivotpoint, vec3_temp);
\r
350 m4x4_translate_by_vec3(matrix, pivotpoint);
\r
351 m4x4_rotate_by_vec3(matrix, euler, order);
\r
352 m4x4_translate_by_vec3(matrix, vec3_temp);
\r
355 void m4x4_pivoted_scale_by_vec3(m4x4_t matrix, const vec3_t scale, const vec3_t pivotpoint)
\r
358 VectorNegative(pivotpoint, vec3_temp);
\r
360 m4x4_translate_by_vec3(matrix, pivotpoint);
\r
361 m4x4_scale_by_vec3(matrix, scale);
\r
362 m4x4_translate_by_vec3(matrix, vec3_temp);
\r
365 void m4x4_pivoted_transform_by_vec3(m4x4_t matrix, const vec3_t translation, const vec3_t euler, eulerOrder_t order, const vec3_t scale, const vec3_t pivotpoint)
\r
369 VectorAdd(pivotpoint, translation, vec3_temp);
\r
370 m4x4_translate_by_vec3(matrix, vec3_temp);
\r
371 m4x4_rotate_by_vec3(matrix, euler, order);
\r
372 m4x4_scale_by_vec3(matrix, scale);
\r
373 VectorNegative(pivotpoint, vec3_temp);
\r
374 m4x4_translate_by_vec3(matrix, vec3_temp);
\r
377 void m4x4_pivoted_rotate_by_quat(m4x4_t matrix, const vec4_t rotation, const vec3_t pivotpoint)
\r
380 VectorNegative(pivotpoint, vec3_temp);
\r
382 m4x4_translate_by_vec3(matrix, pivotpoint);
\r
383 m4x4_rotate_by_quat(matrix, rotation);
\r
384 m4x4_translate_by_vec3(matrix, vec3_temp);
\r
387 void m4x4_pivoted_rotate_by_axisangle(m4x4_t matrix, const vec3_t axis, vec_t angle, const vec3_t pivotpoint)
\r
390 VectorNegative(pivotpoint, vec3_temp);
\r
392 m4x4_translate_by_vec3(matrix, pivotpoint);
\r
393 m4x4_rotate_by_axisangle(matrix, axis, angle);
\r
394 m4x4_translate_by_vec3(matrix, vec3_temp);
\r
401 A0 = B0 * A0 + B1 * A4 + B2 * A8 + B3 * A12
\r
402 A4 = B4 * A0 + B5 * A4 + B6 * A8 + B7 * A12
\r
403 A8 = B8 * A0 + B9 * A4 + B10* A8 + B11* A12
\r
404 A12= B12* A0 + B13* A4 + B14* A8 + B15* A12
\r
406 A1 = B0 * A1 + B1 * A5 + B2 * A9 + B3 * A13
\r
407 A5 = B4 * A1 + B5 * A5 + B6 * A9 + B7 * A13
\r
408 A9 = B8 * A1 + B9 * A5 + B10* A9 + B11* A13
\r
409 A13= B12* A1 + B13* A5 + B14* A9 + B15* A13
\r
411 A2 = B0 * A2 + B1 * A6 + B2 * A10+ B3 * A14
\r
412 A6 = B4 * A2 + B5 * A6 + B6 * A10+ B7 * A14
\r
413 A10= B8 * A2 + B9 * A6 + B10* A10+ B11* A14
\r
414 A14= B12* A2 + B13* A6 + B14* A10+ B15* A14
\r
416 A3 = B0 * A3 + B1 * A7 + B2 * A11+ B3 * A15
\r
417 A7 = B4 * A3 + B5 * A7 + B6 * A11+ B7 * A15
\r
418 A11= B8 * A3 + B9 * A7 + B10* A11+ B11* A15
\r
419 A15= B12* A3 + B13* A7 + B14* A11+ B15* A15
\r
422 void m4x4_multiply_by_m4x4(m4x4_t dst, const m4x4_t src)
\r
424 vec_t dst0, dst1, dst2, dst3;
\r
428 dst0 = src[0] * dst[0] + src[1] * dst[4] + src[2] * dst[8] + src[3] * dst[12];
\r
429 dst1 = src[4] * dst[0] + src[5] * dst[4] + src[6] * dst[8] + src[7] * dst[12];
\r
430 dst2 = src[8] * dst[0] + src[9] * dst[4] + src[10]* dst[8] + src[11]* dst[12];
\r
431 dst3 = src[12]* dst[0] + src[13]* dst[4] + src[14]* dst[8] + src[15]* dst[12];
\r
432 dst[0] = dst0; dst[4] = dst1; dst[8] = dst2; dst[12]= dst3;
\r
434 dst0 = src[0] * dst[1] + src[1] * dst[5] + src[2] * dst[9] + src[3] * dst[13];
\r
435 dst1 = src[4] * dst[1] + src[5] * dst[5] + src[6] * dst[9] + src[7] * dst[13];
\r
436 dst2 = src[8] * dst[1] + src[9] * dst[5] + src[10]* dst[9] + src[11]* dst[13];
\r
437 dst3 = src[12]* dst[1] + src[13]* dst[5] + src[14]* dst[9] + src[15]* dst[13];
\r
438 dst[1] = dst0; dst[5] = dst1; dst[9] = dst2; dst[13]= dst3;
\r
440 dst0 = src[0] * dst[2] + src[1] * dst[6] + src[2] * dst[10]+ src[3] * dst[14];
\r
441 dst1 = src[4] * dst[2] + src[5] * dst[6] + src[6] * dst[10]+ src[7] * dst[14];
\r
442 dst2 = src[8] * dst[2] + src[9] * dst[6] + src[10]* dst[10]+ src[11]* dst[14];
\r
443 dst3 = src[12]* dst[2] + src[13]* dst[6] + src[14]* dst[10]+ src[15]* dst[14];
\r
444 dst[2] = dst0; dst[6] = dst1; dst[10]= dst2; dst[14]= dst3;
\r
446 dst0 = src[0] * dst[3] + src[1] * dst[7] + src[2] * dst[11]+ src[3] * dst[15];
\r
447 dst1 = src[4] * dst[3] + src[5] * dst[7] + src[6] * dst[11]+ src[7] * dst[15];
\r
448 dst2 = src[8] * dst[3] + src[9] * dst[7] + src[10]* dst[11]+ src[11]* dst[15];
\r
449 dst3 = src[12]* dst[3] + src[13]* dst[7] + src[14]* dst[11]+ src[15]* dst[15];
\r
450 dst[3] = dst0; dst[7] = dst1; dst[11]= dst2; dst[15]= dst3;
\r
455 for(int i=0;i<4;i++)
\r
457 dst1 = src[0] * p[0];
\r
458 dst1 += src[1] * p[4];
\r
459 dst1 += src[2] * p[8];
\r
460 dst1 += src[3] * p[12];
\r
461 dst2 = src[4] * p[0];
\r
462 dst2 += src[5] * p[4];
\r
463 dst2 += src[6] * p[8];
\r
464 dst2 += src[7] * p[12];
\r
465 dst3 = src[8] * p[0];
\r
466 dst3 += src[9] * p[4];
\r
467 dst3 += src[10] * p[8];
\r
468 dst3 += src[11] * p[12];
\r
469 dst4 = src[12] * p[0];
\r
470 dst4 += src[13] * p[4];
\r
471 dst4 += src[14] * p[8];
\r
472 dst4 += src[15] * p[12];
\r
487 A0 = A0 * B0 + A1 * B4 + A2 * B8 + A3 * B12
\r
488 A1 = A0 * B1 + A1 * B5 + A2 * B9 + A3 * B13
\r
489 A2 = A0 * B2 + A1 * B6 + A2 * B10+ A3 * B14
\r
490 A3 = A0 * B3 + A1 * B7 + A2 * B11+ A3 * B15
\r
492 A4 = A4 * B0 + A5 * B4 + A6 * B8 + A7 * B12
\r
493 A5 = A4 * B1 + A5 * B5 + A6 * B9 + A7 * B13
\r
494 A6 = A4 * B2 + A5 * B6 + A6 * B10+ A7 * B14
\r
495 A7 = A4 * B3 + A5 * B7 + A6 * B11+ A7 * B15
\r
497 A8 = A8 * B0 + A9 * B4 + A10* B8 + A11* B12
\r
498 A9 = A8 * B1 + A9 * B5 + A10* B9 + A11* B13
\r
499 A10= A8 * B2 + A9 * B6 + A10* B10+ A11* B14
\r
500 A11= A8 * B3 + A9 * B7 + A10* B11+ A11* B15
\r
502 A12= A12* B0 + A13* B4 + A14* B8 + A15* B12
\r
503 A13= A12* B1 + A13* B5 + A14* B9 + A15* B13
\r
504 A14= A12* B2 + A13* B6 + A14* B10+ A15* B14
\r
505 A15= A12* B3 + A13* B7 + A14* B11+ A15* B15
\r
508 void m4x4_premultiply_by_m4x4(m4x4_t dst, const m4x4_t src)
\r
510 vec_t dst0, dst1, dst2, dst3;
\r
514 dst0 = dst[0] * src[0] + dst[1] * src[4] + dst[2] * src[8] + dst[3] * src[12];
\r
515 dst1 = dst[0] * src[1] + dst[1] * src[5] + dst[2] * src[9] + dst[3] * src[13];
\r
516 dst2 = dst[0] * src[2] + dst[1] * src[6] + dst[2] * src[10]+ dst[3] * src[14];
\r
517 dst3 = dst[0] * src[3] + dst[1] * src[7] + dst[2] * src[11]+ dst[3] * src[15];
\r
518 dst[0] = dst0; dst[1] = dst1; dst[2] = dst2; dst[3]= dst3;
\r
520 dst0 = dst[4] * src[0] + dst[5] * src[4] + dst[6] * src[8] + dst[7] * src[12];
\r
521 dst1 = dst[4] * src[1] + dst[5] * src[5] + dst[6] * src[9] + dst[7] * src[13];
\r
522 dst2 = dst[4] * src[2] + dst[5] * src[6] + dst[6] * src[10]+ dst[7] * src[14];
\r
523 dst3 = dst[4] * src[3] + dst[5] * src[7] + dst[6] * src[11]+ dst[7] * src[15];
\r
524 dst[4] = dst0; dst[5] = dst1; dst[6] = dst2; dst[7]= dst3;
\r
526 dst0 = dst[8] * src[0] + dst[9] * src[4] + dst[10]* src[8] + dst[11]* src[12];
\r
527 dst1 = dst[8] * src[1] + dst[9] * src[5] + dst[10]* src[9] + dst[11]* src[13];
\r
528 dst2 = dst[8] * src[2] + dst[9] * src[6] + dst[10]* src[10]+ dst[11]* src[14];
\r
529 dst3 = dst[8] * src[3] + dst[9] * src[7] + dst[10]* src[11]+ dst[11]* src[15];
\r
530 dst[8] = dst0; dst[9] = dst1; dst[10] = dst2; dst[11]= dst3;
\r
532 dst0 = dst[12]* src[0] + dst[13]* src[4] + dst[14]* src[8] + dst[15]* src[12];
\r
533 dst1 = dst[12]* src[1] + dst[13]* src[5] + dst[14]* src[9] + dst[15]* src[13];
\r
534 dst2 = dst[12]* src[2] + dst[13]* src[6] + dst[14]* src[10]+ dst[15]* src[14];
\r
535 dst3 = dst[12]* src[3] + dst[13]* src[7] + dst[14]* src[11]+ dst[15]* src[15];
\r
536 dst[12] = dst0; dst[13] = dst1; dst[14] = dst2; dst[15]= dst3;
\r
541 for(int i=0;i<4;i++)
\r
543 dst1 = src[0] * p[0];
\r
544 dst2 = src[1] * p[0];
\r
545 dst3 = src[2] * p[0];
\r
546 dst4 = src[3] * p[0];
\r
547 dst1 += src[4] * p[1];
\r
548 dst2 += src[5] * p[1];
\r
549 dst3 += src[6] * p[1];
\r
550 dst4 += src[7] * p[1];
\r
551 dst1 += src[8] * p[2];
\r
552 dst2 += src[9] * p[2];
\r
553 dst4 += src[11] * p[2];
\r
554 dst3 += src[10] * p[2];
\r
555 dst1 += src[12] * p[3];
\r
556 dst2 += src[13] * p[3];
\r
557 dst3 += src[14] * p[3];
\r
558 dst4 += src[15] * p[3];
\r
569 void m4x4_transform_point(const m4x4_t matrix, vec3_t point)
\r
571 float out1, out2, out3;
\r
573 out1 = matrix[0] * point[0];
\r
574 out2 = matrix[1] * point[0];
\r
575 out3 = matrix[2] * point[0];
\r
576 out1 += matrix[4] * point[1];
\r
577 out2 += matrix[5] * point[1];
\r
578 out3 += matrix[6] * point[1];
\r
579 out1 += matrix[8] * point[2];
\r
580 out2 += matrix[9] * point[2];
\r
581 out3 += matrix[10] * point[2];
\r
582 out1 += matrix[12];
\r
583 out2 += matrix[13];
\r
584 out3 += matrix[14];
\r
591 void m4x4_transform_normal(const m4x4_t matrix, vec3_t normal)
\r
593 float out1, out2, out3;
\r
595 out1 = matrix[0] * normal[0];
\r
596 out2 = matrix[1] * normal[0];
\r
597 out3 = matrix[2] * normal[0];
\r
598 out1 += matrix[4] * normal[1];
\r
599 out2 += matrix[5] * normal[1];
\r
600 out3 += matrix[6] * normal[1];
\r
601 out1 += matrix[8] * normal[2];
\r
602 out2 += matrix[9] * normal[2];
\r
603 out3 += matrix[10] * normal[2];
\r
610 void m4x4_transform_vec4(const m4x4_t matrix, vec4_t vector)
\r
612 float out1, out2, out3, out4;
\r
614 out1 = matrix[0] * vector[0];
\r
615 out2 = matrix[1] * vector[0];
\r
616 out3 = matrix[2] * vector[0];
\r
617 out4 = matrix[3] * vector[0];
\r
618 out1 += matrix[4] * vector[1];
\r
619 out2 += matrix[5] * vector[1];
\r
620 out3 += matrix[6] * vector[1];
\r
621 out4 += matrix[7] * vector[1];
\r
622 out1 += matrix[8] * vector[2];
\r
623 out2 += matrix[9] * vector[2];
\r
624 out3 += matrix[10] * vector[2];
\r
625 out4 += matrix[11] * vector[2];
\r
626 out1 += matrix[12] * vector[3];
\r
627 out2 += matrix[13] * vector[3];
\r
628 out3 += matrix[14] * vector[3];
\r
629 out4 += matrix[15] * vector[3];
\r
637 void m4x4_transpose(m4x4_t matrix)
\r
640 float temp, *p1, *p2;
\r
642 for (i=1; i<4; i++) {
\r
643 for (j=0; j<i; j++) {
\r
644 p1 = matrix+(j*4+i);
\r
645 p2 = matrix+(i*4+j);
\r
653 void m4x4_orthogonal_invert(m4x4_t matrix)
\r
658 matrix[3] = matrix[12];
\r
662 matrix[7] = matrix[13];
\r
665 temp = -matrix[11];
\r
666 matrix[11] = matrix[14];
\r
671 matrix[1] = matrix[4];
\r
675 matrix[2] = matrix[8];
\r
679 matrix[6] = matrix[9];
\r
682 matrix[3] = -matrix[3];
\r
683 matrix[7] = -matrix[7];
\r
684 matrix[11] = -matrix[11];
\r
688 float m3_det( m3x3_t mat )
\r
692 det = mat[0] * ( mat[4]*mat[8] - mat[7]*mat[5] )
\r
693 - mat[1] * ( mat[3]*mat[8] - mat[6]*mat[5] )
\r
694 + mat[2] * ( mat[3]*mat[7] - mat[6]*mat[4] );
\r
700 void m3_inverse( m3x3_t mr, m3x3_t ma )
\r
702 float det = m3_det( ma );
\r
704 if ( fabs( det ) < 0.0005 )
\r
710 mr[0] = ma[4]*ma[8] - ma[5]*ma[7] / det;
\r
711 mr[1] = -( ma[1]*ma[8] - ma[7]*ma[2] ) / det;
\r
712 mr[2] = ma[1]*ma[5] - ma[4]*ma[2] / det;
\r
714 mr[3] = -( ma[3]*ma[8] - ma[5]*ma[6] ) / det;
\r
715 mr[4] = ma[0]*ma[8] - ma[6]*ma[2] / det;
\r
716 mr[5] = -( ma[0]*ma[5] - ma[3]*ma[2] ) / det;
\r
718 mr[6] = ma[3]*ma[7] - ma[6]*ma[4] / det;
\r
719 mr[7] = -( ma[0]*ma[7] - ma[6]*ma[1] ) / det;
\r
720 mr[8] = ma[0]*ma[4] - ma[1]*ma[3] / det;
\r
724 void m4_submat( m4x4_t mr, m3x3_t mb, int i, int j )
\r
726 int ti, tj, idst, jdst;
\r
728 for ( ti = 0; ti < 4; ti++ )
\r
736 for ( tj = 0; tj < 4; tj++ )
\r
744 if ( ti != i && tj != j )
\r
745 mb[idst*3 + jdst] = mr[ti*4 + tj ];
\r
750 float m4_det( m4x4_t mr )
\r
752 float det, result = 0, i = 1;
\r
756 for ( n = 0; n < 4; n++, i *= -1 )
\r
758 m4_submat( mr, msub3, 0, n );
\r
760 det = m3_det( msub3 );
\r
761 result += mr[n] * det * i;
\r
767 int m4x4_invert(m4x4_t matrix)
\r
769 float mdet = m4_det( matrix );
\r
774 if ( fabs( mdet ) < 0.0000000001 ) //% 0.0005
\r
777 memcpy(m4x4_temp, matrix, sizeof(m4x4_t));
\r
779 for ( i = 0; i < 4; i++ )
\r
780 for ( j = 0; j < 4; j++ )
\r
782 sign = 1 - ( (i +j) % 2 ) * 2;
\r
784 m4_submat( m4x4_temp, mtemp, i, j );
\r
786 matrix[i+j*4] = ( m3_det( mtemp ) * sign ) / mdet;
\r