Bullet Collision Detection & Physics Library
gim_linear_math.h
Go to the documentation of this file.
1 #ifndef GIM_LINEAR_H_INCLUDED
2 #define GIM_LINEAR_H_INCLUDED
3 
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 
45 #define VEC_ZERO_2(a) \
46 { \
47  (a)[0] = (a)[1] = 0.0f; \
48 }\
49 
50 
52 #define VEC_ZERO(a) \
53 { \
54  (a)[0] = (a)[1] = (a)[2] = 0.0f; \
55 }\
56 
57 
59 #define VEC_ZERO_4(a) \
60 { \
61  (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f; \
62 }\
63 
64 
66 #define VEC_COPY_2(b,a) \
67 { \
68  (b)[0] = (a)[0]; \
69  (b)[1] = (a)[1]; \
70 }\
71 
72 
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 
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 #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 #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 
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 
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 
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 
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 
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 
154 #define VEC_SCALE_2(c,a,b) \
155 { \
156  (c)[0] = (a)*(b)[0]; \
157  (c)[1] = (a)*(b)[1]; \
158 }\
159 
160 
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 
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 
181 #define VEC_ACCUM_2(c,a,b) \
182 { \
183  (c)[0] += (a)*(b)[0]; \
184  (c)[1] += (a)*(b)[1]; \
185 }\
186 
187 
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 
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 
208 #define VEC_DOT_2(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1])
209 
210 
212 #define VEC_DOT(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2])
213 
215 #define VEC_DOT_4(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3])
216 
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 
225 #define VEC_IMPACT(bsq,direction,position) {\
226  VEC_IMPACT_SQ(bsq,direction,position); \
227  GIM_SQRT(bsq,bsq); \
228 }\
229 
230 #define VEC_LENGTH_2(a,l)\
232 {\
233  GREAL _pp = VEC_DOT_2(a,a);\
234  GIM_SQRT(_pp,l);\
235 }\
236 
237 
239 #define VEC_LENGTH(a,l)\
240 {\
241  GREAL _pp = VEC_DOT(a,a);\
242  GIM_SQRT(_pp,l);\
243 }\
244 
245 
247 #define VEC_LENGTH_4(a,l)\
248 {\
249  GREAL _pp = VEC_DOT_4(a,a);\
250  GIM_SQRT(_pp,l);\
251 }\
252 
253 #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 
262 #define VEC_INV_LENGTH(a,l)\
263 {\
264  GREAL _pp = VEC_DOT(a,a);\
265  GIM_INV_SQRT(_pp,l);\
266 }\
267 
268 
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 
279 #define VEC_DISTANCE(_len,_va,_vb) {\
280  vec3f _tmp_; \
281  VEC_DIFF(_tmp_, _vb, _va); \
282  VEC_LENGTH(_tmp_,_len); \
283 }\
284 
285 
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 
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 #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 #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 
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 
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 
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 
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 
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 
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 
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 
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 #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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 #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 
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 
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 
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 
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 
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 
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 
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 
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 
1181 #define DETERMINANT_2X2(d,m) \
1182 { \
1183  d = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \
1184 }\
1185 
1186 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 #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 #define MAT_GET_ROW2(mat,vec2,rowindex)\
1439 {\
1440  vec2[0] = mat[rowindex][0];\
1441  vec2[1] = mat[rowindex][1];\
1442 }\
1443 
1444 
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 #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 #define MAT_GET_COL2(mat,vec2,colindex)\
1464 {\
1465  vec2[0] = mat[0][colindex];\
1466  vec2[1] = mat[1][colindex];\
1467 }\
1468 
1469 
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 #define MAT_GET_X(mat,vec3)\
1481 {\
1482  MAT_GET_COL(mat,vec3,0);\
1483 }\
1484 
1485 #define MAT_GET_Y(mat,vec3)\
1487 {\
1488  MAT_GET_COL(mat,vec3,1);\
1489 }\
1490 
1491 #define MAT_GET_Z(mat,vec3)\
1493 {\
1494  MAT_GET_COL(mat,vec3,2);\
1495 }\
1496 
1497 
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 #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 #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 
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 #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 
1542 #define MAT_DOT_ROW(mat,vec3,rowindex) (vec3[0]*mat[rowindex][0] + vec3[1]*mat[rowindex][1] + vec3[2]*mat[rowindex][2])
1543 
1545 #define MAT_DOT_ROW2(mat,vec2,rowindex) (vec2[0]*mat[rowindex][0] + vec2[1]*mat[rowindex][1])
1546 
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 
1552 #define MAT_DOT_COL(mat,vec3,colindex) (vec3[0]*mat[0][colindex] + vec3[1]*mat[1][colindex] + vec3[2]*mat[2][colindex])
1553 
1555 #define MAT_DOT_COL2(mat,vec2,colindex) (vec2[0]*mat[0][colindex] + vec2[1]*mat[1][colindex])
1556 
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 
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