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