[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-physics / third-party / bullet3 / src / BulletCollision / Gimpact / gim_linear_math.h
1 #ifndef GIM_LINEAR_H_INCLUDED
2 #define GIM_LINEAR_H_INCLUDED
3
4 /*! \file gim_linear_math.h
5 *\author Francisco Leon Najera
6 Type Independant Vector and matrix operations.
7 */
8 /*
9 -----------------------------------------------------------------------------
10 This source file is part of GIMPACT Library.
11
12 For the latest info, see http://gimpact.sourceforge.net/
13
14 Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
15 email: projectileman@yahoo.com
16
17  This library is free software; you can redistribute it and/or
18  modify it under the terms of EITHER:
19    (1) The GNU Lesser General Public License as published by the Free
20        Software Foundation; either version 2.1 of the License, or (at
21        your option) any later version. The text of the GNU Lesser
22        General Public License is included with this library in the
23        file GIMPACT-LICENSE-LGPL.TXT.
24    (2) The BSD-style license that is included with this library in
25        the file GIMPACT-LICENSE-BSD.TXT.
26    (3) The zlib/libpng license that is included with this library in
27        the file GIMPACT-LICENSE-ZLIB.TXT.
28
29  This library is distributed in the hope that it will be useful,
30  but WITHOUT ANY WARRANTY; without even the implied warranty of
31  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
32  GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
33
34 -----------------------------------------------------------------------------
35 */
36
37 #include "gim_math.h"
38 #include "gim_geom_types.h"
39
40 //! Zero out a 2D vector
41 #define VEC_ZERO_2(a)           \
42         {                           \
43                 (a)[0] = (a)[1] = 0.0f; \
44         }
45
46 //! Zero out a 3D vector
47 #define VEC_ZERO(a)                      \
48         {                                    \
49                 (a)[0] = (a)[1] = (a)[2] = 0.0f; \
50         }
51
52 /// Zero out a 4D vector
53 #define VEC_ZERO_4(a)                             \
54         {                                             \
55                 (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f; \
56         }
57
58 /// Vector copy
59 #define VEC_COPY_2(b, a) \
60         {                    \
61                 (b)[0] = (a)[0]; \
62                 (b)[1] = (a)[1]; \
63         }
64
65 /// Copy 3D vector
66 #define VEC_COPY(b, a)   \
67         {                    \
68                 (b)[0] = (a)[0]; \
69                 (b)[1] = (a)[1]; \
70                 (b)[2] = (a)[2]; \
71         }
72
73 /// Copy 4D vector
74 #define VEC_COPY_4(b, a) \
75         {                    \
76                 (b)[0] = (a)[0]; \
77                 (b)[1] = (a)[1]; \
78                 (b)[2] = (a)[2]; \
79                 (b)[3] = (a)[3]; \
80         }
81
82 /// VECTOR SWAP
83 #define VEC_SWAP(b, a)                    \
84         {                                     \
85                 GIM_SWAP_NUMBERS((b)[0], (a)[0]); \
86                 GIM_SWAP_NUMBERS((b)[1], (a)[1]); \
87                 GIM_SWAP_NUMBERS((b)[2], (a)[2]); \
88         }
89
90 /// Vector difference
91 #define VEC_DIFF_2(v21, v2, v1)       \
92         {                                 \
93                 (v21)[0] = (v2)[0] - (v1)[0]; \
94                 (v21)[1] = (v2)[1] - (v1)[1]; \
95         }
96
97 /// Vector difference
98 #define VEC_DIFF(v21, v2, v1)         \
99         {                                 \
100                 (v21)[0] = (v2)[0] - (v1)[0]; \
101                 (v21)[1] = (v2)[1] - (v1)[1]; \
102                 (v21)[2] = (v2)[2] - (v1)[2]; \
103         }
104
105 /// Vector difference
106 #define VEC_DIFF_4(v21, v2, v1)       \
107         {                                 \
108                 (v21)[0] = (v2)[0] - (v1)[0]; \
109                 (v21)[1] = (v2)[1] - (v1)[1]; \
110                 (v21)[2] = (v2)[2] - (v1)[2]; \
111                 (v21)[3] = (v2)[3] - (v1)[3]; \
112         }
113
114 /// Vector sum
115 #define VEC_SUM_2(v21, v2, v1)        \
116         {                                 \
117                 (v21)[0] = (v2)[0] + (v1)[0]; \
118                 (v21)[1] = (v2)[1] + (v1)[1]; \
119         }
120
121 /// Vector sum
122 #define VEC_SUM(v21, v2, v1)          \
123         {                                 \
124                 (v21)[0] = (v2)[0] + (v1)[0]; \
125                 (v21)[1] = (v2)[1] + (v1)[1]; \
126                 (v21)[2] = (v2)[2] + (v1)[2]; \
127         }
128
129 /// Vector sum
130 #define VEC_SUM_4(v21, v2, v1)        \
131         {                                 \
132                 (v21)[0] = (v2)[0] + (v1)[0]; \
133                 (v21)[1] = (v2)[1] + (v1)[1]; \
134                 (v21)[2] = (v2)[2] + (v1)[2]; \
135                 (v21)[3] = (v2)[3] + (v1)[3]; \
136         }
137
138 /// scalar times vector
139 #define VEC_SCALE_2(c, a, b)   \
140         {                          \
141                 (c)[0] = (a) * (b)[0]; \
142                 (c)[1] = (a) * (b)[1]; \
143         }
144
145 /// scalar times vector
146 #define VEC_SCALE(c, a, b)     \
147         {                          \
148                 (c)[0] = (a) * (b)[0]; \
149                 (c)[1] = (a) * (b)[1]; \
150                 (c)[2] = (a) * (b)[2]; \
151         }
152
153 /// scalar times vector
154 #define VEC_SCALE_4(c, a, b)   \
155         {                          \
156                 (c)[0] = (a) * (b)[0]; \
157                 (c)[1] = (a) * (b)[1]; \
158                 (c)[2] = (a) * (b)[2]; \
159                 (c)[3] = (a) * (b)[3]; \
160         }
161
162 /// accumulate scaled vector
163 #define VEC_ACCUM_2(c, a, b)    \
164         {                           \
165                 (c)[0] += (a) * (b)[0]; \
166                 (c)[1] += (a) * (b)[1]; \
167         }
168
169 /// accumulate scaled vector
170 #define VEC_ACCUM(c, a, b)      \
171         {                           \
172                 (c)[0] += (a) * (b)[0]; \
173                 (c)[1] += (a) * (b)[1]; \
174                 (c)[2] += (a) * (b)[2]; \
175         }
176
177 /// accumulate scaled vector
178 #define VEC_ACCUM_4(c, a, b)    \
179         {                           \
180                 (c)[0] += (a) * (b)[0]; \
181                 (c)[1] += (a) * (b)[1]; \
182                 (c)[2] += (a) * (b)[2]; \
183                 (c)[3] += (a) * (b)[3]; \
184         }
185
186 /// Vector dot product
187 #define VEC_DOT_2(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1])
188
189 /// Vector dot product
190 #define VEC_DOT(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1] + (a)[2] * (b)[2])
191
192 /// Vector dot product
193 #define VEC_DOT_4(a, b) ((a)[0] * (b)[0] + (a)[1] * (b)[1] + (a)[2] * (b)[2] + (a)[3] * (b)[3])
194
195 /// vector impact parameter (squared)
196 #define VEC_IMPACT_SQ(bsq, direction, position)              \
197         {                                                        \
198                 GREAL _llel_ = VEC_DOT(direction, position);         \
199                 bsq = VEC_DOT(position, position) - _llel_ * _llel_; \
200         }
201
202 /// vector impact parameter
203 #define VEC_IMPACT(bsq, direction, position)     \
204         {                                            \
205                 VEC_IMPACT_SQ(bsq, direction, position); \
206                 GIM_SQRT(bsq, bsq);                      \
207         }
208
209 /// Vector length
210 #define VEC_LENGTH_2(a, l)           \
211         {                                \
212                 GREAL _pp = VEC_DOT_2(a, a); \
213                 GIM_SQRT(_pp, l);            \
214         }
215
216 /// Vector length
217 #define VEC_LENGTH(a, l)           \
218         {                              \
219                 GREAL _pp = VEC_DOT(a, a); \
220                 GIM_SQRT(_pp, l);          \
221         }
222
223 /// Vector length
224 #define VEC_LENGTH_4(a, l)           \
225         {                                \
226                 GREAL _pp = VEC_DOT_4(a, a); \
227                 GIM_SQRT(_pp, l);            \
228         }
229
230 /// Vector inv length
231 #define VEC_INV_LENGTH_2(a, l)       \
232         {                                \
233                 GREAL _pp = VEC_DOT_2(a, a); \
234                 GIM_INV_SQRT(_pp, l);        \
235         }
236
237 /// Vector inv length
238 #define VEC_INV_LENGTH(a, l)       \
239         {                              \
240                 GREAL _pp = VEC_DOT(a, a); \
241                 GIM_INV_SQRT(_pp, l);      \
242         }
243
244 /// Vector inv length
245 #define VEC_INV_LENGTH_4(a, l)       \
246         {                                \
247                 GREAL _pp = VEC_DOT_4(a, a); \
248                 GIM_INV_SQRT(_pp, l);        \
249         }
250
251 /// distance between two points
252 #define VEC_DISTANCE(_len, _va, _vb) \
253         {                                \
254                 vec3f _tmp_;                 \
255                 VEC_DIFF(_tmp_, _vb, _va);   \
256                 VEC_LENGTH(_tmp_, _len);     \
257         }
258
259 /// Vector length
260 #define VEC_CONJUGATE_LENGTH(a, l)                                 \
261         {                                                              \
262                 GREAL _pp = 1.0 - a[0] * a[0] - a[1] * a[1] - a[2] * a[2]; \
263                 GIM_SQRT(_pp, l);                                          \
264         }
265
266 /// Vector length
267 #define VEC_NORMALIZE(a)           \
268         {                              \
269                 GREAL len;                 \
270                 VEC_INV_LENGTH(a, len);    \
271                 if (len < G_REAL_INFINITY) \
272                 {                          \
273                         a[0] *= len;           \
274                         a[1] *= len;           \
275                         a[2] *= len;           \
276                 }                          \
277         }
278
279 /// Set Vector size
280 #define VEC_RENORMALIZE(a, newlen) \
281         {                              \
282                 GREAL len;                 \
283                 VEC_INV_LENGTH(a, len);    \
284                 if (len < G_REAL_INFINITY) \
285                 {                          \
286                         len *= newlen;         \
287                         a[0] *= len;           \
288                         a[1] *= len;           \
289                         a[2] *= len;           \
290                 }                          \
291         }
292
293 /// Vector cross
294 #define VEC_CROSS(c, a, b)                        \
295         {                                             \
296                 c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1]; \
297                 c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2]; \
298                 c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0]; \
299         }
300
301 /*! Vector perp -- assumes that n is of unit length
302  * accepts vector v, subtracts out any component parallel to n */
303 #define VEC_PERPENDICULAR(vp, v, n)    \
304         {                                  \
305                 GREAL dot = VEC_DOT(v, n);     \
306                 vp[0] = (v)[0] - dot * (n)[0]; \
307                 vp[1] = (v)[1] - dot * (n)[1]; \
308                 vp[2] = (v)[2] - dot * (n)[2]; \
309         }
310
311 /*! Vector parallel -- assumes that n is of unit length */
312 #define VEC_PARALLEL(vp, v, n)     \
313         {                              \
314                 GREAL dot = VEC_DOT(v, n); \
315                 vp[0] = (dot) * (n)[0];    \
316                 vp[1] = (dot) * (n)[1];    \
317                 vp[2] = (dot) * (n)[2];    \
318         }
319
320 /*! Same as Vector parallel --  n can have any length
321  * accepts vector v, subtracts out any component perpendicular to n */
322 #define VEC_PROJECT(vp, v, n)         \
323         {                                 \
324                 GREAL scalar = VEC_DOT(v, n); \
325                 scalar /= VEC_DOT(n, n);      \
326                 vp[0] = (scalar) * (n)[0];    \
327                 vp[1] = (scalar) * (n)[1];    \
328                 vp[2] = (scalar) * (n)[2];    \
329         }
330
331 /*! accepts vector v*/
332 #define VEC_UNPROJECT(vp, v, n)          \
333         {                                    \
334                 GREAL scalar = VEC_DOT(v, n);    \
335                 scalar = VEC_DOT(n, n) / scalar; \
336                 vp[0] = (scalar) * (n)[0];       \
337                 vp[1] = (scalar) * (n)[1];       \
338                 vp[2] = (scalar) * (n)[2];       \
339         }
340
341 /*! Vector reflection -- assumes n is of unit length
342  Takes vector v, reflects it against reflector n, and returns vr */
343 #define VEC_REFLECT(vr, v, n)                  \
344         {                                          \
345                 GREAL dot = VEC_DOT(v, n);             \
346                 vr[0] = (v)[0] - 2.0 * (dot) * (n)[0]; \
347                 vr[1] = (v)[1] - 2.0 * (dot) * (n)[1]; \
348                 vr[2] = (v)[2] - 2.0 * (dot) * (n)[2]; \
349         }
350
351 /*! Vector blending
352 Takes two vectors a, b, blends them together with two scalars */
353 #define VEC_BLEND_AB(vr, sa, a, sb, b)         \
354         {                                          \
355                 vr[0] = (sa) * (a)[0] + (sb) * (b)[0]; \
356                 vr[1] = (sa) * (a)[1] + (sb) * (b)[1]; \
357                 vr[2] = (sa) * (a)[2] + (sb) * (b)[2]; \
358         }
359
360 /*! Vector blending
361 Takes two vectors a, b, blends them together with s <=1 */
362 #define VEC_BLEND(vr, a, b, s) VEC_BLEND_AB(vr, (1 - s), a, s, b)
363
364 #define VEC_SET3(a, b, op, c) \
365         a[0] = b[0] op c[0];      \
366         a[1] = b[1] op c[1];      \
367         a[2] = b[2] op c[2];
368
369 //! Finds the bigger cartesian coordinate from a vector
370 #define VEC_MAYOR_COORD(vec, maxc)                                          \
371         {                                                                       \
372                 GREAL A[] = {fabs(vec[0]), fabs(vec[1]), fabs(vec[2])};             \
373                 maxc = A[0] > A[1] ? (A[0] > A[2] ? 0 : 2) : (A[1] > A[2] ? 1 : 2); \
374         }
375
376 //! Finds the 2 smallest cartesian coordinates from a vector
377 #define VEC_MINOR_AXES(vec, i0, i1) \
378         {                               \
379                 VEC_MAYOR_COORD(vec, i0);   \
380                 i0 = (i0 + 1) % 3;          \
381                 i1 = (i0 + 1) % 3;          \
382         }
383
384 #define VEC_EQUAL(v1, v2) (v1[0] == v2[0] && v1[1] == v2[1] && v1[2] == v2[2])
385
386 #define VEC_NEAR_EQUAL(v1, v2) (GIM_NEAR_EQUAL(v1[0], v2[0]) && GIM_NEAR_EQUAL(v1[1], v2[1]) && GIM_NEAR_EQUAL(v1[2], v2[2]))
387
388 /// Vector cross
389 #define X_AXIS_CROSS_VEC(dst, src) \
390         {                              \
391                 dst[0] = 0.0f;             \
392                 dst[1] = -src[2];          \
393                 dst[2] = src[1];           \
394         }
395
396 #define Y_AXIS_CROSS_VEC(dst, src) \
397         {                              \
398                 dst[0] = src[2];           \
399                 dst[1] = 0.0f;             \
400                 dst[2] = -src[0];          \
401         }
402
403 #define Z_AXIS_CROSS_VEC(dst, src) \
404         {                              \
405                 dst[0] = -src[1];          \
406                 dst[1] = src[0];           \
407                 dst[2] = 0.0f;             \
408         }
409
410 /// initialize matrix
411 #define IDENTIFY_MATRIX_3X3(m) \
412         {                          \
413                 m[0][0] = 1.0;         \
414                 m[0][1] = 0.0;         \
415                 m[0][2] = 0.0;         \
416                                \
417                 m[1][0] = 0.0;         \
418                 m[1][1] = 1.0;         \
419                 m[1][2] = 0.0;         \
420                                \
421                 m[2][0] = 0.0;         \
422                 m[2][1] = 0.0;         \
423                 m[2][2] = 1.0;         \
424         }
425
426 /*! initialize matrix */
427 #define IDENTIFY_MATRIX_4X4(m) \
428         {                          \
429                 m[0][0] = 1.0;         \
430                 m[0][1] = 0.0;         \
431                 m[0][2] = 0.0;         \
432                 m[0][3] = 0.0;         \
433                                \
434                 m[1][0] = 0.0;         \
435                 m[1][1] = 1.0;         \
436                 m[1][2] = 0.0;         \
437                 m[1][3] = 0.0;         \
438                                \
439                 m[2][0] = 0.0;         \
440                 m[2][1] = 0.0;         \
441                 m[2][2] = 1.0;         \
442                 m[2][3] = 0.0;         \
443                                \
444                 m[3][0] = 0.0;         \
445                 m[3][1] = 0.0;         \
446                 m[3][2] = 0.0;         \
447                 m[3][3] = 1.0;         \
448         }
449
450 /*! initialize matrix */
451 #define ZERO_MATRIX_4X4(m) \
452         {                      \
453                 m[0][0] = 0.0;     \
454                 m[0][1] = 0.0;     \
455                 m[0][2] = 0.0;     \
456                 m[0][3] = 0.0;     \
457                            \
458                 m[1][0] = 0.0;     \
459                 m[1][1] = 0.0;     \
460                 m[1][2] = 0.0;     \
461                 m[1][3] = 0.0;     \
462                            \
463                 m[2][0] = 0.0;     \
464                 m[2][1] = 0.0;     \
465                 m[2][2] = 0.0;     \
466                 m[2][3] = 0.0;     \
467                            \
468                 m[3][0] = 0.0;     \
469                 m[3][1] = 0.0;     \
470                 m[3][2] = 0.0;     \
471                 m[3][3] = 0.0;     \
472         }
473
474 /*! matrix rotation  X */
475 #define ROTX_CS(m, cosine, sine)        \
476         {                                   \
477                 /* rotation about the x-axis */ \
478                                         \
479                 m[0][0] = 1.0;                  \
480                 m[0][1] = 0.0;                  \
481                 m[0][2] = 0.0;                  \
482                 m[0][3] = 0.0;                  \
483                                         \
484                 m[1][0] = 0.0;                  \
485                 m[1][1] = (cosine);             \
486                 m[1][2] = (sine);               \
487                 m[1][3] = 0.0;                  \
488                                         \
489                 m[2][0] = 0.0;                  \
490                 m[2][1] = -(sine);              \
491                 m[2][2] = (cosine);             \
492                 m[2][3] = 0.0;                  \
493                                         \
494                 m[3][0] = 0.0;                  \
495                 m[3][1] = 0.0;                  \
496                 m[3][2] = 0.0;                  \
497                 m[3][3] = 1.0;                  \
498         }
499
500 /*! matrix rotation  Y */
501 #define ROTY_CS(m, cosine, sine)        \
502         {                                   \
503                 /* rotation about the y-axis */ \
504                                         \
505                 m[0][0] = (cosine);             \
506                 m[0][1] = 0.0;                  \
507                 m[0][2] = -(sine);              \
508                 m[0][3] = 0.0;                  \
509                                         \
510                 m[1][0] = 0.0;                  \
511                 m[1][1] = 1.0;                  \
512                 m[1][2] = 0.0;                  \
513                 m[1][3] = 0.0;                  \
514                                         \
515                 m[2][0] = (sine);               \
516                 m[2][1] = 0.0;                  \
517                 m[2][2] = (cosine);             \
518                 m[2][3] = 0.0;                  \
519                                         \
520                 m[3][0] = 0.0;                  \
521                 m[3][1] = 0.0;                  \
522                 m[3][2] = 0.0;                  \
523                 m[3][3] = 1.0;                  \
524         }
525
526 /*! matrix rotation  Z */
527 #define ROTZ_CS(m, cosine, sine)        \
528         {                                   \
529                 /* rotation about the z-axis */ \
530                                         \
531                 m[0][0] = (cosine);             \
532                 m[0][1] = (sine);               \
533                 m[0][2] = 0.0;                  \
534                 m[0][3] = 0.0;                  \
535                                         \
536                 m[1][0] = -(sine);              \
537                 m[1][1] = (cosine);             \
538                 m[1][2] = 0.0;                  \
539                 m[1][3] = 0.0;                  \
540                                         \
541                 m[2][0] = 0.0;                  \
542                 m[2][1] = 0.0;                  \
543                 m[2][2] = 1.0;                  \
544                 m[2][3] = 0.0;                  \
545                                         \
546                 m[3][0] = 0.0;                  \
547                 m[3][1] = 0.0;                  \
548                 m[3][2] = 0.0;                  \
549                 m[3][3] = 1.0;                  \
550         }
551
552 /*! matrix copy */
553 #define COPY_MATRIX_2X2(b, a) \
554         {                         \
555                 b[0][0] = a[0][0];    \
556                 b[0][1] = a[0][1];    \
557                               \
558                 b[1][0] = a[1][0];    \
559                 b[1][1] = a[1][1];    \
560         }
561
562 /*! matrix copy */
563 #define COPY_MATRIX_2X3(b, a) \
564         {                         \
565                 b[0][0] = a[0][0];    \
566                 b[0][1] = a[0][1];    \
567                 b[0][2] = a[0][2];    \
568                               \
569                 b[1][0] = a[1][0];    \
570                 b[1][1] = a[1][1];    \
571                 b[1][2] = a[1][2];    \
572         }
573
574 /*! matrix copy */
575 #define COPY_MATRIX_3X3(b, a) \
576         {                         \
577                 b[0][0] = a[0][0];    \
578                 b[0][1] = a[0][1];    \
579                 b[0][2] = a[0][2];    \
580                               \
581                 b[1][0] = a[1][0];    \
582                 b[1][1] = a[1][1];    \
583                 b[1][2] = a[1][2];    \
584                               \
585                 b[2][0] = a[2][0];    \
586                 b[2][1] = a[2][1];    \
587                 b[2][2] = a[2][2];    \
588         }
589
590 /*! matrix copy */
591 #define COPY_MATRIX_4X4(b, a) \
592         {                         \
593                 b[0][0] = a[0][0];    \
594                 b[0][1] = a[0][1];    \
595                 b[0][2] = a[0][2];    \
596                 b[0][3] = a[0][3];    \
597                               \
598                 b[1][0] = a[1][0];    \
599                 b[1][1] = a[1][1];    \
600                 b[1][2] = a[1][2];    \
601                 b[1][3] = a[1][3];    \
602                               \
603                 b[2][0] = a[2][0];    \
604                 b[2][1] = a[2][1];    \
605                 b[2][2] = a[2][2];    \
606                 b[2][3] = a[2][3];    \
607                               \
608                 b[3][0] = a[3][0];    \
609                 b[3][1] = a[3][1];    \
610                 b[3][2] = a[3][2];    \
611                 b[3][3] = a[3][3];    \
612         }
613
614 /*! matrix transpose */
615 #define TRANSPOSE_MATRIX_2X2(b, a) \
616         {                              \
617                 b[0][0] = a[0][0];         \
618                 b[0][1] = a[1][0];         \
619                                    \
620                 b[1][0] = a[0][1];         \
621                 b[1][1] = a[1][1];         \
622         }
623
624 /*! matrix transpose */
625 #define TRANSPOSE_MATRIX_3X3(b, a) \
626         {                              \
627                 b[0][0] = a[0][0];         \
628                 b[0][1] = a[1][0];         \
629                 b[0][2] = a[2][0];         \
630                                    \
631                 b[1][0] = a[0][1];         \
632                 b[1][1] = a[1][1];         \
633                 b[1][2] = a[2][1];         \
634                                    \
635                 b[2][0] = a[0][2];         \
636                 b[2][1] = a[1][2];         \
637                 b[2][2] = a[2][2];         \
638         }
639
640 /*! matrix transpose */
641 #define TRANSPOSE_MATRIX_4X4(b, a) \
642         {                              \
643                 b[0][0] = a[0][0];         \
644                 b[0][1] = a[1][0];         \
645                 b[0][2] = a[2][0];         \
646                 b[0][3] = a[3][0];         \
647                                    \
648                 b[1][0] = a[0][1];         \
649                 b[1][1] = a[1][1];         \
650                 b[1][2] = a[2][1];         \
651                 b[1][3] = a[3][1];         \
652                                    \
653                 b[2][0] = a[0][2];         \
654                 b[2][1] = a[1][2];         \
655                 b[2][2] = a[2][2];         \
656                 b[2][3] = a[3][2];         \
657                                    \
658                 b[3][0] = a[0][3];         \
659                 b[3][1] = a[1][3];         \
660                 b[3][2] = a[2][3];         \
661                 b[3][3] = a[3][3];         \
662         }
663
664 /*! multiply matrix by scalar */
665 #define SCALE_MATRIX_2X2(b, s, a) \
666         {                             \
667                 b[0][0] = (s)*a[0][0];    \
668                 b[0][1] = (s)*a[0][1];    \
669                                   \
670                 b[1][0] = (s)*a[1][0];    \
671                 b[1][1] = (s)*a[1][1];    \
672         }
673
674 /*! multiply matrix by scalar */
675 #define SCALE_MATRIX_3X3(b, s, a) \
676         {                             \
677                 b[0][0] = (s)*a[0][0];    \
678                 b[0][1] = (s)*a[0][1];    \
679                 b[0][2] = (s)*a[0][2];    \
680                                   \
681                 b[1][0] = (s)*a[1][0];    \
682                 b[1][1] = (s)*a[1][1];    \
683                 b[1][2] = (s)*a[1][2];    \
684                                   \
685                 b[2][0] = (s)*a[2][0];    \
686                 b[2][1] = (s)*a[2][1];    \
687                 b[2][2] = (s)*a[2][2];    \
688         }
689
690 /*! multiply matrix by scalar */
691 #define SCALE_MATRIX_4X4(b, s, a) \
692         {                             \
693                 b[0][0] = (s)*a[0][0];    \
694                 b[0][1] = (s)*a[0][1];    \
695                 b[0][2] = (s)*a[0][2];    \
696                 b[0][3] = (s)*a[0][3];    \
697                                   \
698                 b[1][0] = (s)*a[1][0];    \
699                 b[1][1] = (s)*a[1][1];    \
700                 b[1][2] = (s)*a[1][2];    \
701                 b[1][3] = (s)*a[1][3];    \
702                                   \
703                 b[2][0] = (s)*a[2][0];    \
704                 b[2][1] = (s)*a[2][1];    \
705                 b[2][2] = (s)*a[2][2];    \
706                 b[2][3] = (s)*a[2][3];    \
707                                   \
708                 b[3][0] = s * a[3][0];    \
709                 b[3][1] = s * a[3][1];    \
710                 b[3][2] = s * a[3][2];    \
711                 b[3][3] = s * a[3][3];    \
712         }
713
714 /*! multiply matrix by scalar */
715 #define SCALE_VEC_MATRIX_2X2(b, svec, a) \
716         {                                    \
717                 b[0][0] = svec[0] * a[0][0];     \
718                 b[1][0] = svec[0] * a[1][0];     \
719                                          \
720                 b[0][1] = svec[1] * a[0][1];     \
721                 b[1][1] = svec[1] * a[1][1];     \
722         }
723
724 /*! multiply matrix by scalar. Each columns is scaled by each scalar vector component */
725 #define SCALE_VEC_MATRIX_3X3(b, svec, a) \
726         {                                    \
727                 b[0][0] = svec[0] * a[0][0];     \
728                 b[1][0] = svec[0] * a[1][0];     \
729                 b[2][0] = svec[0] * a[2][0];     \
730                                          \
731                 b[0][1] = svec[1] * a[0][1];     \
732                 b[1][1] = svec[1] * a[1][1];     \
733                 b[2][1] = svec[1] * a[2][1];     \
734                                          \
735                 b[0][2] = svec[2] * a[0][2];     \
736                 b[1][2] = svec[2] * a[1][2];     \
737                 b[2][2] = svec[2] * a[2][2];     \
738         }
739
740 /*! multiply matrix by scalar */
741 #define SCALE_VEC_MATRIX_4X4(b, svec, a) \
742         {                                    \
743                 b[0][0] = svec[0] * a[0][0];     \
744                 b[1][0] = svec[0] * a[1][0];     \
745                 b[2][0] = svec[0] * a[2][0];     \
746                 b[3][0] = svec[0] * a[3][0];     \
747                                          \
748                 b[0][1] = svec[1] * a[0][1];     \
749                 b[1][1] = svec[1] * a[1][1];     \
750                 b[2][1] = svec[1] * a[2][1];     \
751                 b[3][1] = svec[1] * a[3][1];     \
752                                          \
753                 b[0][2] = svec[2] * a[0][2];     \
754                 b[1][2] = svec[2] * a[1][2];     \
755                 b[2][2] = svec[2] * a[2][2];     \
756                 b[3][2] = svec[2] * a[3][2];     \
757                                          \
758                 b[0][3] = svec[3] * a[0][3];     \
759                 b[1][3] = svec[3] * a[1][3];     \
760                 b[2][3] = svec[3] * a[2][3];     \
761                 b[3][3] = svec[3] * a[3][3];     \
762         }
763
764 /*! multiply matrix by scalar */
765 #define ACCUM_SCALE_MATRIX_2X2(b, s, a) \
766         {                                   \
767                 b[0][0] += (s)*a[0][0];         \
768                 b[0][1] += (s)*a[0][1];         \
769                                         \
770                 b[1][0] += (s)*a[1][0];         \
771                 b[1][1] += (s)*a[1][1];         \
772         }
773
774 /*! multiply matrix by scalar */
775 #define ACCUM_SCALE_MATRIX_3X3(b, s, a) \
776         {                                   \
777                 b[0][0] += (s)*a[0][0];         \
778                 b[0][1] += (s)*a[0][1];         \
779                 b[0][2] += (s)*a[0][2];         \
780                                         \
781                 b[1][0] += (s)*a[1][0];         \
782                 b[1][1] += (s)*a[1][1];         \
783                 b[1][2] += (s)*a[1][2];         \
784                                         \
785                 b[2][0] += (s)*a[2][0];         \
786                 b[2][1] += (s)*a[2][1];         \
787                 b[2][2] += (s)*a[2][2];         \
788         }
789
790 /*! multiply matrix by scalar */
791 #define ACCUM_SCALE_MATRIX_4X4(b, s, a) \
792         {                                   \
793                 b[0][0] += (s)*a[0][0];         \
794                 b[0][1] += (s)*a[0][1];         \
795                 b[0][2] += (s)*a[0][2];         \
796                 b[0][3] += (s)*a[0][3];         \
797                                         \
798                 b[1][0] += (s)*a[1][0];         \
799                 b[1][1] += (s)*a[1][1];         \
800                 b[1][2] += (s)*a[1][2];         \
801                 b[1][3] += (s)*a[1][3];         \
802                                         \
803                 b[2][0] += (s)*a[2][0];         \
804                 b[2][1] += (s)*a[2][1];         \
805                 b[2][2] += (s)*a[2][2];         \
806                 b[2][3] += (s)*a[2][3];         \
807                                         \
808                 b[3][0] += (s)*a[3][0];         \
809                 b[3][1] += (s)*a[3][1];         \
810                 b[3][2] += (s)*a[3][2];         \
811                 b[3][3] += (s)*a[3][3];         \
812         }
813
814 /*! matrix product */
815 /*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
816 #define MATRIX_PRODUCT_2X2(c, a, b)                      \
817         {                                                    \
818                 c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0]; \
819                 c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1]; \
820                                                          \
821                 c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0]; \
822                 c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1]; \
823         }
824
825 /*! matrix product */
826 /*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
827 #define MATRIX_PRODUCT_3X3(c, a, b)                                          \
828         {                                                                        \
829                 c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]; \
830                 c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]; \
831                 c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2]; \
832                                                                              \
833                 c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0]; \
834                 c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1]; \
835                 c[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2]; \
836                                                                              \
837                 c[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0]; \
838                 c[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1]; \
839                 c[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2]; \
840         }
841
842 /*! matrix product */
843 /*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
844 #define MATRIX_PRODUCT_4X4(c, a, b)                                                              \
845         {                                                                                            \
846                 c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0] + a[0][3] * b[3][0]; \
847                 c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1] + a[0][3] * b[3][1]; \
848                 c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2] + a[0][3] * b[3][2]; \
849                 c[0][3] = a[0][0] * b[0][3] + a[0][1] * b[1][3] + a[0][2] * b[2][3] + a[0][3] * b[3][3]; \
850                                                                                                  \
851                 c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0] + a[1][3] * b[3][0]; \
852                 c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1] + a[1][3] * b[3][1]; \
853                 c[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2] + a[1][3] * b[3][2]; \
854                 c[1][3] = a[1][0] * b[0][3] + a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3] * b[3][3]; \
855                                                                                                  \
856                 c[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0] + a[2][3] * b[3][0]; \
857                 c[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1] + a[2][3] * b[3][1]; \
858                 c[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2] + a[2][3] * b[3][2]; \
859                 c[2][3] = a[2][0] * b[0][3] + a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3] * b[3][3]; \
860                                                                                                  \
861                 c[3][0] = a[3][0] * b[0][0] + a[3][1] * b[1][0] + a[3][2] * b[2][0] + a[3][3] * b[3][0]; \
862                 c[3][1] = a[3][0] * b[0][1] + a[3][1] * b[1][1] + a[3][2] * b[2][1] + a[3][3] * b[3][1]; \
863                 c[3][2] = a[3][0] * b[0][2] + a[3][1] * b[1][2] + a[3][2] * b[2][2] + a[3][3] * b[3][2]; \
864                 c[3][3] = a[3][0] * b[0][3] + a[3][1] * b[1][3] + a[3][2] * b[2][3] + a[3][3] * b[3][3]; \
865         }
866
867 /*! matrix times vector */
868 #define MAT_DOT_VEC_2X2(p, m, v)                \
869         {                                           \
870                 p[0] = m[0][0] * v[0] + m[0][1] * v[1]; \
871                 p[1] = m[1][0] * v[0] + m[1][1] * v[1]; \
872         }
873
874 /*! matrix times vector */
875 #define MAT_DOT_VEC_3X3(p, m, v)                                 \
876         {                                                            \
877                 p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2]; \
878                 p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2]; \
879                 p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2]; \
880         }
881
882 /*! matrix times vector
883 v is a vec4f
884 */
885 #define MAT_DOT_VEC_4X4(p, m, v)                                                  \
886         {                                                                             \
887                 p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3]; \
888                 p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3]; \
889                 p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3]; \
890                 p[3] = m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]; \
891         }
892
893 /*! matrix times vector
894 v is a vec3f
895 and m is a mat4f<br>
896 Last column is added as the position
897 */
898 #define MAT_DOT_VEC_3X4(p, m, v)                                           \
899         {                                                                      \
900                 p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3]; \
901                 p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3]; \
902                 p[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3]; \
903         }
904
905 /*! vector transpose times matrix */
906 /*! p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
907 #define VEC_DOT_MAT_3X3(p, v, m)                                 \
908         {                                                            \
909                 p[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0]; \
910                 p[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1]; \
911                 p[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2]; \
912         }
913
914 /*! affine matrix times vector */
915 /** The matrix is assumed to be an affine matrix, with last two
916  * entries representing a translation */
917 #define MAT_DOT_VEC_2X3(p, m, v)                          \
918         {                                                     \
919                 p[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2]; \
920                 p[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2]; \
921         }
922
923 //! Transform a plane
924 #define MAT_TRANSFORM_PLANE_4X4(pout, m, plane)                                         \
925         {                                                                                   \
926                 pout[0] = m[0][0] * plane[0] + m[0][1] * plane[1] + m[0][2] * plane[2];         \
927                 pout[1] = m[1][0] * plane[0] + m[1][1] * plane[1] + m[1][2] * plane[2];         \
928                 pout[2] = m[2][0] * plane[0] + m[2][1] * plane[1] + m[2][2] * plane[2];         \
929                 pout[3] = m[0][3] * pout[0] + m[1][3] * pout[1] + m[2][3] * pout[2] + plane[3]; \
930         }
931
932 /** inverse transpose of matrix times vector
933  *
934  * This macro computes inverse transpose of matrix m,
935  * and multiplies vector v into it, to yeild vector p
936  *
937  * DANGER !!! Do Not use this on normal vectors!!!
938  * It will leave normals the wrong length !!!
939  * See macro below for use on normals.
940  */
941 #define INV_TRANSP_MAT_DOT_VEC_2X2(p, m, v)                                 \
942         {                                                                       \
943                 GREAL det;                                                          \
944                                                                             \
945                 det = m[0][0] * m[1][1] - m[0][1] * m[1][0];                        \
946                 p[0] = m[1][1] * v[0] - m[1][0] * v[1];                             \
947                 p[1] = -m[0][1] * v[0] + m[0][0] * v[1];                            \
948                                                                             \
949                 /* if matrix not singular, and not orthonormal, then renormalize */ \
950                 if ((det != 1.0f) && (det != 0.0f))                                 \
951                 {                                                                   \
952                         det = 1.0f / det;                                               \
953                         p[0] *= det;                                                    \
954                         p[1] *= det;                                                    \
955                 }                                                                   \
956         }
957
958 /** transform normal vector by inverse transpose of matrix
959  * and then renormalize the vector
960  *
961  * This macro computes inverse transpose of matrix m,
962  * and multiplies vector v into it, to yeild vector p
963  * Vector p is then normalized.
964  */
965 #define NORM_XFORM_2X2(p, m, v)                                           \
966         {                                                                     \
967                 GREAL len;                                                        \
968                                                                           \
969                 /* do nothing if off-diagonals are zero and diagonals are       \
970     * equal */      \
971                 if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) \
972                 {                                                                 \
973                         p[0] = m[1][1] * v[0] - m[1][0] * v[1];                       \
974                         p[1] = -m[0][1] * v[0] + m[0][0] * v[1];                      \
975                                                                           \
976                         len = p[0] * p[0] + p[1] * p[1];                              \
977                         GIM_INV_SQRT(len, len);                                       \
978                         p[0] *= len;                                                  \
979                         p[1] *= len;                                                  \
980                 }                                                                 \
981                 else                                                              \
982                 {                                                                 \
983                         VEC_COPY_2(p, v);                                             \
984                 }                                                                 \
985         }
986
987 /** outer product of vector times vector transpose
988  *
989  * The outer product of vector v and vector transpose t yeilds
990  * dyadic matrix m.
991  */
992 #define OUTER_PRODUCT_2X2(m, v, t) \
993         {                              \
994                 m[0][0] = v[0] * t[0];     \
995                 m[0][1] = v[0] * t[1];     \
996                                    \
997                 m[1][0] = v[1] * t[0];     \
998                 m[1][1] = v[1] * t[1];     \
999         }
1000
1001 /** outer product of vector times vector transpose
1002  *
1003  * The outer product of vector v and vector transpose t yeilds
1004  * dyadic matrix m.
1005  */
1006 #define OUTER_PRODUCT_3X3(m, v, t) \
1007         {                              \
1008                 m[0][0] = v[0] * t[0];     \
1009                 m[0][1] = v[0] * t[1];     \
1010                 m[0][2] = v[0] * t[2];     \
1011                                    \
1012                 m[1][0] = v[1] * t[0];     \
1013                 m[1][1] = v[1] * t[1];     \
1014                 m[1][2] = v[1] * t[2];     \
1015                                    \
1016                 m[2][0] = v[2] * t[0];     \
1017                 m[2][1] = v[2] * t[1];     \
1018                 m[2][2] = v[2] * t[2];     \
1019         }
1020
1021 /** outer product of vector times vector transpose
1022  *
1023  * The outer product of vector v and vector transpose t yeilds
1024  * dyadic matrix m.
1025  */
1026 #define OUTER_PRODUCT_4X4(m, v, t) \
1027         {                              \
1028                 m[0][0] = v[0] * t[0];     \
1029                 m[0][1] = v[0] * t[1];     \
1030                 m[0][2] = v[0] * t[2];     \
1031                 m[0][3] = v[0] * t[3];     \
1032                                    \
1033                 m[1][0] = v[1] * t[0];     \
1034                 m[1][1] = v[1] * t[1];     \
1035                 m[1][2] = v[1] * t[2];     \
1036                 m[1][3] = v[1] * t[3];     \
1037                                    \
1038                 m[2][0] = v[2] * t[0];     \
1039                 m[2][1] = v[2] * t[1];     \
1040                 m[2][2] = v[2] * t[2];     \
1041                 m[2][3] = v[2] * t[3];     \
1042                                    \
1043                 m[3][0] = v[3] * t[0];     \
1044                 m[3][1] = v[3] * t[1];     \
1045                 m[3][2] = v[3] * t[2];     \
1046                 m[3][3] = v[3] * t[3];     \
1047         }
1048
1049 /** outer product of vector times vector transpose
1050  *
1051  * The outer product of vector v and vector transpose t yeilds
1052  * dyadic matrix m.
1053  */
1054 #define ACCUM_OUTER_PRODUCT_2X2(m, v, t) \
1055         {                                    \
1056                 m[0][0] += v[0] * t[0];          \
1057                 m[0][1] += v[0] * t[1];          \
1058                                          \
1059                 m[1][0] += v[1] * t[0];          \
1060                 m[1][1] += v[1] * t[1];          \
1061         }
1062
1063 /** outer product of vector times vector transpose
1064  *
1065  * The outer product of vector v and vector transpose t yeilds
1066  * dyadic matrix m.
1067  */
1068 #define ACCUM_OUTER_PRODUCT_3X3(m, v, t) \
1069         {                                    \
1070                 m[0][0] += v[0] * t[0];          \
1071                 m[0][1] += v[0] * t[1];          \
1072                 m[0][2] += v[0] * t[2];          \
1073                                          \
1074                 m[1][0] += v[1] * t[0];          \
1075                 m[1][1] += v[1] * t[1];          \
1076                 m[1][2] += v[1] * t[2];          \
1077                                          \
1078                 m[2][0] += v[2] * t[0];          \
1079                 m[2][1] += v[2] * t[1];          \
1080                 m[2][2] += v[2] * t[2];          \
1081         }
1082
1083 /** outer product of vector times vector transpose
1084  *
1085  * The outer product of vector v and vector transpose t yeilds
1086  * dyadic matrix m.
1087  */
1088 #define ACCUM_OUTER_PRODUCT_4X4(m, v, t) \
1089         {                                    \
1090                 m[0][0] += v[0] * t[0];          \
1091                 m[0][1] += v[0] * t[1];          \
1092                 m[0][2] += v[0] * t[2];          \
1093                 m[0][3] += v[0] * t[3];          \
1094                                          \
1095                 m[1][0] += v[1] * t[0];          \
1096                 m[1][1] += v[1] * t[1];          \
1097                 m[1][2] += v[1] * t[2];          \
1098                 m[1][3] += v[1] * t[3];          \
1099                                          \
1100                 m[2][0] += v[2] * t[0];          \
1101                 m[2][1] += v[2] * t[1];          \
1102                 m[2][2] += v[2] * t[2];          \
1103                 m[2][3] += v[2] * t[3];          \
1104                                          \
1105                 m[3][0] += v[3] * t[0];          \
1106                 m[3][1] += v[3] * t[1];          \
1107                 m[3][2] += v[3] * t[2];          \
1108                 m[3][3] += v[3] * t[3];          \
1109         }
1110
1111 /** determinant of matrix
1112  *
1113  * Computes determinant of matrix m, returning d
1114  */
1115 #define DETERMINANT_2X2(d, m)                      \
1116         {                                              \
1117                 d = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \
1118         }
1119
1120 /** determinant of matrix
1121  *
1122  * Computes determinant of matrix m, returning d
1123  */
1124 #define DETERMINANT_3X3(d, m)                                   \
1125         {                                                           \
1126                 d = m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]);  \
1127                 d -= m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]); \
1128                 d += m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
1129         }
1130
1131 /** i,j,th cofactor of a 4x4 matrix
1132  *
1133  */
1134 #define COFACTOR_4X4_IJ(fac, m, i, j)                                                                                           \
1135         {                                                                                                                           \
1136                 GUINT __ii[4], __jj[4], __k;                                                                                            \
1137                                                                                                                                 \
1138                 for (__k = 0; __k < i; __k++) __ii[__k] = __k;                                                                          \
1139                 for (__k = i; __k < 3; __k++) __ii[__k] = __k + 1;                                                                      \
1140                 for (__k = 0; __k < j; __k++) __jj[__k] = __k;                                                                          \
1141                 for (__k = j; __k < 3; __k++) __jj[__k] = __k + 1;                                                                      \
1142                                                                                                                                 \
1143                 (fac) = m[__ii[0]][__jj[0]] * (m[__ii[1]][__jj[1]] * m[__ii[2]][__jj[2]] - m[__ii[1]][__jj[2]] * m[__ii[2]][__jj[1]]);  \
1144                 (fac) -= m[__ii[0]][__jj[1]] * (m[__ii[1]][__jj[0]] * m[__ii[2]][__jj[2]] - m[__ii[1]][__jj[2]] * m[__ii[2]][__jj[0]]); \
1145                 (fac) += m[__ii[0]][__jj[2]] * (m[__ii[1]][__jj[0]] * m[__ii[2]][__jj[1]] - m[__ii[1]][__jj[1]] * m[__ii[2]][__jj[0]]); \
1146                                                                                                                                 \
1147                 __k = i + j;                                                                                                            \
1148                 if (__k != (__k / 2) * 2)                                                                                               \
1149                 {                                                                                                                       \
1150                         (fac) = -(fac);                                                                                                     \
1151                 }                                                                                                                       \
1152         }
1153
1154 /** determinant of matrix
1155  *
1156  * Computes determinant of matrix m, returning d
1157  */
1158 #define DETERMINANT_4X4(d, m)            \
1159         {                                    \
1160                 GREAL cofac;                     \
1161                 COFACTOR_4X4_IJ(cofac, m, 0, 0); \
1162                 d = m[0][0] * cofac;             \
1163                 COFACTOR_4X4_IJ(cofac, m, 0, 1); \
1164                 d += m[0][1] * cofac;            \
1165                 COFACTOR_4X4_IJ(cofac, m, 0, 2); \
1166                 d += m[0][2] * cofac;            \
1167                 COFACTOR_4X4_IJ(cofac, m, 0, 3); \
1168                 d += m[0][3] * cofac;            \
1169         }
1170
1171 /** cofactor of matrix
1172  *
1173  * Computes cofactor of matrix m, returning a
1174  */
1175 #define COFACTOR_2X2(a, m)    \
1176         {                         \
1177                 a[0][0] = (m)[1][1];  \
1178                 a[0][1] = -(m)[1][0]; \
1179                 a[1][0] = -(m)[0][1]; \
1180                 a[1][1] = (m)[0][0];  \
1181         }
1182
1183 /** cofactor of matrix
1184  *
1185  * Computes cofactor of matrix m, returning a
1186  */
1187 #define COFACTOR_3X3(a, m)                                  \
1188         {                                                       \
1189                 a[0][0] = m[1][1] * m[2][2] - m[1][2] * m[2][1];    \
1190                 a[0][1] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]); \
1191                 a[0][2] = m[1][0] * m[2][1] - m[1][1] * m[2][0];    \
1192                 a[1][0] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]); \
1193                 a[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0];    \
1194                 a[1][2] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]); \
1195                 a[2][0] = m[0][1] * m[1][2] - m[0][2] * m[1][1];    \
1196                 a[2][1] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]); \
1197    a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);            \
1198         }
1199
1200 /** cofactor of matrix
1201  *
1202  * Computes cofactor of matrix m, returning a
1203  */
1204 #define COFACTOR_4X4(a, m)                         \
1205         {                                              \
1206                 int i, j;                                  \
1207                                                    \
1208                 for (i = 0; i < 4; i++)                    \
1209                 {                                          \
1210                         for (j = 0; j < 4; j++)                \
1211                         {                                      \
1212                                 COFACTOR_4X4_IJ(a[i][j], m, i, j); \
1213                         }                                      \
1214                 }                                          \
1215         }
1216
1217 /** adjoint of matrix
1218  *
1219  * Computes adjoint of matrix m, returning a
1220  * (Note that adjoint is just the transpose of the cofactor matrix)
1221  */
1222 #define ADJOINT_2X2(a, m)     \
1223         {                         \
1224                 a[0][0] = (m)[1][1];  \
1225                 a[1][0] = -(m)[1][0]; \
1226                 a[0][1] = -(m)[0][1]; \
1227                 a[1][1] = (m)[0][0];  \
1228         }
1229
1230 /** adjoint of matrix
1231  *
1232  * Computes adjoint of matrix m, returning a
1233  * (Note that adjoint is just the transpose of the cofactor matrix)
1234  */
1235 #define ADJOINT_3X3(a, m)                                   \
1236         {                                                       \
1237                 a[0][0] = m[1][1] * m[2][2] - m[1][2] * m[2][1];    \
1238                 a[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]); \
1239                 a[2][0] = m[1][0] * m[2][1] - m[1][1] * m[2][0];    \
1240                 a[0][1] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]); \
1241                 a[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0];    \
1242                 a[2][1] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]); \
1243                 a[0][2] = m[0][1] * m[1][2] - m[0][2] * m[1][1];    \
1244                 a[1][2] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]); \
1245    a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);            \
1246         }
1247
1248 /** adjoint of matrix
1249  *
1250  * Computes adjoint of matrix m, returning a
1251  * (Note that adjoint is just the transpose of the cofactor matrix)
1252  */
1253 #define ADJOINT_4X4(a, m)                                  \
1254         {                                                      \
1255                 char _i_, _j_;                                     \
1256                                                            \
1257                 for (_i_ = 0; _i_ < 4; _i_++)                      \
1258                 {                                                  \
1259                         for (_j_ = 0; _j_ < 4; _j_++)                  \
1260                         {                                              \
1261                                 COFACTOR_4X4_IJ(a[_j_][_i_], m, _i_, _j_); \
1262                         }                                              \
1263                 }                                                  \
1264         }
1265
1266 /** compute adjoint of matrix and scale
1267  *
1268  * Computes adjoint of matrix m, scales it by s, returning a
1269  */
1270 #define SCALE_ADJOINT_2X2(a, s, m) \
1271         {                              \
1272                 a[0][0] = (s)*m[1][1];     \
1273                 a[1][0] = -(s)*m[1][0];    \
1274                 a[0][1] = -(s)*m[0][1];    \
1275                 a[1][1] = (s)*m[0][0];     \
1276         }
1277
1278 /** compute adjoint of matrix and scale
1279  *
1280  * Computes adjoint of matrix m, scales it by s, returning a
1281  */
1282 #define SCALE_ADJOINT_3X3(a, s, m)                               \
1283         {                                                            \
1284                 a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
1285                 a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]); \
1286                 a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
1287                                                                  \
1288                 a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]); \
1289                 a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]); \
1290                 a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]); \
1291                                                                  \
1292                 a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]); \
1293                 a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]); \
1294                 a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]); \
1295         }
1296
1297 /** compute adjoint of matrix and scale
1298  *
1299  * Computes adjoint of matrix m, scales it by s, returning a
1300  */
1301 #define SCALE_ADJOINT_4X4(a, s, m)                         \
1302         {                                                      \
1303                 char _i_, _j_;                                     \
1304                 for (_i_ = 0; _i_ < 4; _i_++)                      \
1305                 {                                                  \
1306                         for (_j_ = 0; _j_ < 4; _j_++)                  \
1307                         {                                              \
1308                                 COFACTOR_4X4_IJ(a[_j_][_i_], m, _i_, _j_); \
1309                                 a[_j_][_i_] *= s;                          \
1310                         }                                              \
1311                 }                                                  \
1312         }
1313
1314 /** inverse of matrix
1315  *
1316  * Compute inverse of matrix a, returning determinant m and
1317  * inverse b
1318  */
1319 #define INVERT_2X2(b, det, a)           \
1320         {                                   \
1321                 GREAL _tmp_;                    \
1322                 DETERMINANT_2X2(det, a);        \
1323                 _tmp_ = 1.0 / (det);            \
1324                 SCALE_ADJOINT_2X2(b, _tmp_, a); \
1325         }
1326
1327 /** inverse of matrix
1328  *
1329  * Compute inverse of matrix a, returning determinant m and
1330  * inverse b
1331  */
1332 #define INVERT_3X3(b, det, a)           \
1333         {                                   \
1334                 GREAL _tmp_;                    \
1335                 DETERMINANT_3X3(det, a);        \
1336                 _tmp_ = 1.0 / (det);            \
1337                 SCALE_ADJOINT_3X3(b, _tmp_, a); \
1338         }
1339
1340 /** inverse of matrix
1341  *
1342  * Compute inverse of matrix a, returning determinant m and
1343  * inverse b
1344  */
1345 #define INVERT_4X4(b, det, a)           \
1346         {                                   \
1347                 GREAL _tmp_;                    \
1348                 DETERMINANT_4X4(det, a);        \
1349                 _tmp_ = 1.0 / (det);            \
1350                 SCALE_ADJOINT_4X4(b, _tmp_, a); \
1351         }
1352
1353 //! Get the triple(3) row of a transform matrix
1354 #define MAT_GET_ROW(mat, vec3, rowindex) \
1355         {                                    \
1356                 vec3[0] = mat[rowindex][0];      \
1357                 vec3[1] = mat[rowindex][1];      \
1358                 vec3[2] = mat[rowindex][2];      \
1359         }
1360
1361 //! Get the tuple(2) row of a transform matrix
1362 #define MAT_GET_ROW2(mat, vec2, rowindex) \
1363         {                                     \
1364                 vec2[0] = mat[rowindex][0];       \
1365                 vec2[1] = mat[rowindex][1];       \
1366         }
1367
1368 //! Get the quad (4) row of a transform matrix
1369 #define MAT_GET_ROW4(mat, vec4, rowindex) \
1370         {                                     \
1371                 vec4[0] = mat[rowindex][0];       \
1372                 vec4[1] = mat[rowindex][1];       \
1373                 vec4[2] = mat[rowindex][2];       \
1374                 vec4[3] = mat[rowindex][3];       \
1375         }
1376
1377 //! Get the triple(3) col of a transform matrix
1378 #define MAT_GET_COL(mat, vec3, colindex) \
1379         {                                    \
1380                 vec3[0] = mat[0][colindex];      \
1381                 vec3[1] = mat[1][colindex];      \
1382                 vec3[2] = mat[2][colindex];      \
1383         }
1384
1385 //! Get the tuple(2) col of a transform matrix
1386 #define MAT_GET_COL2(mat, vec2, colindex) \
1387         {                                     \
1388                 vec2[0] = mat[0][colindex];       \
1389                 vec2[1] = mat[1][colindex];       \
1390         }
1391
1392 //! Get the quad (4) col of a transform matrix
1393 #define MAT_GET_COL4(mat, vec4, colindex) \
1394         {                                     \
1395                 vec4[0] = mat[0][colindex];       \
1396                 vec4[1] = mat[1][colindex];       \
1397                 vec4[2] = mat[2][colindex];       \
1398                 vec4[3] = mat[3][colindex];       \
1399         }
1400
1401 //! Get the triple(3) col of a transform matrix
1402 #define MAT_GET_X(mat, vec3)       \
1403         {                              \
1404                 MAT_GET_COL(mat, vec3, 0); \
1405         }
1406
1407 //! Get the triple(3) col of a transform matrix
1408 #define MAT_GET_Y(mat, vec3)       \
1409         {                              \
1410                 MAT_GET_COL(mat, vec3, 1); \
1411         }
1412
1413 //! Get the triple(3) col of a transform matrix
1414 #define MAT_GET_Z(mat, vec3)       \
1415         {                              \
1416                 MAT_GET_COL(mat, vec3, 2); \
1417         }
1418
1419 //! Get the triple(3) col of a transform matrix
1420 #define MAT_SET_X(mat, vec3) \
1421         {                        \
1422                 mat[0][0] = vec3[0]; \
1423                 mat[1][0] = vec3[1]; \
1424                 mat[2][0] = vec3[2]; \
1425         }
1426
1427 //! Get the triple(3) col of a transform matrix
1428 #define MAT_SET_Y(mat, vec3) \
1429         {                        \
1430                 mat[0][1] = vec3[0]; \
1431                 mat[1][1] = vec3[1]; \
1432                 mat[2][1] = vec3[2]; \
1433         }
1434
1435 //! Get the triple(3) col of a transform matrix
1436 #define MAT_SET_Z(mat, vec3) \
1437         {                        \
1438                 mat[0][2] = vec3[0]; \
1439                 mat[1][2] = vec3[1]; \
1440                 mat[2][2] = vec3[2]; \
1441         }
1442
1443 //! Get the triple(3) col of a transform matrix
1444 #define MAT_GET_TRANSLATION(mat, vec3) \
1445         {                                  \
1446                 vec3[0] = mat[0][3];           \
1447                 vec3[1] = mat[1][3];           \
1448                 vec3[2] = mat[2][3];           \
1449         }
1450
1451 //! Set the triple(3) col of a transform matrix
1452 #define MAT_SET_TRANSLATION(mat, vec3) \
1453         {                                  \
1454                 mat[0][3] = vec3[0];           \
1455                 mat[1][3] = vec3[1];           \
1456                 mat[2][3] = vec3[2];           \
1457         }
1458
1459 //! Returns the dot product between a vec3f and the row of a matrix
1460 #define MAT_DOT_ROW(mat, vec3, rowindex) (vec3[0] * mat[rowindex][0] + vec3[1] * mat[rowindex][1] + vec3[2] * mat[rowindex][2])
1461
1462 //! Returns the dot product between a vec2f and the row of a matrix
1463 #define MAT_DOT_ROW2(mat, vec2, rowindex) (vec2[0] * mat[rowindex][0] + vec2[1] * mat[rowindex][1])
1464
1465 //! Returns the dot product between a vec4f and the row of a matrix
1466 #define MAT_DOT_ROW4(mat, vec4, rowindex) (vec4[0] * mat[rowindex][0] + vec4[1] * mat[rowindex][1] + vec4[2] * mat[rowindex][2] + vec4[3] * mat[rowindex][3])
1467
1468 //! Returns the dot product between a vec3f and the col of a matrix
1469 #define MAT_DOT_COL(mat, vec3, colindex) (vec3[0] * mat[0][colindex] + vec3[1] * mat[1][colindex] + vec3[2] * mat[2][colindex])
1470
1471 //! Returns the dot product between a vec2f and the col of a matrix
1472 #define MAT_DOT_COL2(mat, vec2, colindex) (vec2[0] * mat[0][colindex] + vec2[1] * mat[1][colindex])
1473
1474 //! Returns the dot product between a vec4f and the col of a matrix
1475 #define MAT_DOT_COL4(mat, vec4, colindex) (vec4[0] * mat[0][colindex] + vec4[1] * mat[1][colindex] + vec4[2] * mat[2][colindex] + vec4[3] * mat[3][colindex])
1476
1477 /*!Transpose matrix times vector
1478 v is a vec3f
1479 and m is a mat4f<br>
1480 */
1481 #define INV_MAT_DOT_VEC_3X3(p, m, v) \
1482         {                                \
1483                 p[0] = MAT_DOT_COL(m, v, 0); \
1484                 p[1] = MAT_DOT_COL(m, v, 1); \
1485                 p[2] = MAT_DOT_COL(m, v, 2); \
1486         }
1487
1488 #endif  // GIM_VECTOR_H_INCLUDED