Blender V2.61 - r43446

gim_linear_math.h

Go to the documentation of this file.
00001 #ifndef GIM_LINEAR_H_INCLUDED
00002 #define GIM_LINEAR_H_INCLUDED
00003 
00008 /*
00009 -----------------------------------------------------------------------------
00010 This source file is part of GIMPACT Library.
00011 
00012 For the latest info, see http://gimpact.sourceforge.net/
00013 
00014 Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
00015 email: projectileman@yahoo.com
00016 
00017  This library is free software; you can redistribute it and/or
00018  modify it under the terms of EITHER:
00019    (1) The GNU Lesser General Public License as published by the Free
00020        Software Foundation; either version 2.1 of the License, or (at
00021        your option) any later version. The text of the GNU Lesser
00022        General Public License is included with this library in the
00023        file GIMPACT-LICENSE-LGPL.TXT.
00024    (2) The BSD-style license that is included with this library in
00025        the file GIMPACT-LICENSE-BSD.TXT.
00026    (3) The zlib/libpng license that is included with this library in
00027        the file GIMPACT-LICENSE-ZLIB.TXT.
00028 
00029  This library is distributed in the hope that it will be useful,
00030  but WITHOUT ANY WARRANTY; without even the implied warranty of
00031  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
00032  GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
00033 
00034 -----------------------------------------------------------------------------
00035 */
00036 
00037 
00038 #include "gim_math.h"
00039 #include "gim_geom_types.h"
00040 
00041 
00042 
00043 
00045 #define VEC_ZERO_2(a)               \
00046 {                       \
00047    (a)[0] = (a)[1] = 0.0f;          \
00048 }\
00049 
00050 
00052 #define VEC_ZERO(a)             \
00053 {                       \
00054    (a)[0] = (a)[1] = (a)[2] = 0.0f;     \
00055 }\
00056 
00057 
00059 #define VEC_ZERO_4(a)               \
00060 {                       \
00061    (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f;    \
00062 }\
00063 
00064 
00066 #define VEC_COPY_2(b,a)             \
00067 {                       \
00068    (b)[0] = (a)[0];             \
00069    (b)[1] = (a)[1];             \
00070 }\
00071 
00072 
00074 #define VEC_COPY(b,a)               \
00075 {                       \
00076    (b)[0] = (a)[0];             \
00077    (b)[1] = (a)[1];             \
00078    (b)[2] = (a)[2];             \
00079 }\
00080 
00081 
00083 #define VEC_COPY_4(b,a)             \
00084 {                       \
00085    (b)[0] = (a)[0];             \
00086    (b)[1] = (a)[1];             \
00087    (b)[2] = (a)[2];             \
00088    (b)[3] = (a)[3];             \
00089 }\
00090 
00091 
00092 #define VEC_SWAP(b,a)               \
00093 {  \
00094     GIM_SWAP_NUMBERS((b)[0],(a)[0]);\
00095     GIM_SWAP_NUMBERS((b)[1],(a)[1]);\
00096     GIM_SWAP_NUMBERS((b)[2],(a)[2]);\
00097 }\
00098 
00099 
00100 #define VEC_DIFF_2(v21,v2,v1)           \
00101 {                       \
00102    (v21)[0] = (v2)[0] - (v1)[0];        \
00103    (v21)[1] = (v2)[1] - (v1)[1];        \
00104 }\
00105 
00106 
00108 #define VEC_DIFF(v21,v2,v1)         \
00109 {                       \
00110    (v21)[0] = (v2)[0] - (v1)[0];        \
00111    (v21)[1] = (v2)[1] - (v1)[1];        \
00112    (v21)[2] = (v2)[2] - (v1)[2];        \
00113 }\
00114 
00115 
00117 #define VEC_DIFF_4(v21,v2,v1)           \
00118 {                       \
00119    (v21)[0] = (v2)[0] - (v1)[0];        \
00120    (v21)[1] = (v2)[1] - (v1)[1];        \
00121    (v21)[2] = (v2)[2] - (v1)[2];        \
00122    (v21)[3] = (v2)[3] - (v1)[3];        \
00123 }\
00124 
00125 
00127 #define VEC_SUM_2(v21,v2,v1)            \
00128 {                       \
00129    (v21)[0] = (v2)[0] + (v1)[0];        \
00130    (v21)[1] = (v2)[1] + (v1)[1];        \
00131 }\
00132 
00133 
00135 #define VEC_SUM(v21,v2,v1)          \
00136 {                       \
00137    (v21)[0] = (v2)[0] + (v1)[0];        \
00138    (v21)[1] = (v2)[1] + (v1)[1];        \
00139    (v21)[2] = (v2)[2] + (v1)[2];        \
00140 }\
00141 
00142 
00144 #define VEC_SUM_4(v21,v2,v1)            \
00145 {                       \
00146    (v21)[0] = (v2)[0] + (v1)[0];        \
00147    (v21)[1] = (v2)[1] + (v1)[1];        \
00148    (v21)[2] = (v2)[2] + (v1)[2];        \
00149    (v21)[3] = (v2)[3] + (v1)[3];        \
00150 }\
00151 
00152 
00154 #define VEC_SCALE_2(c,a,b)          \
00155 {                       \
00156    (c)[0] = (a)*(b)[0];             \
00157    (c)[1] = (a)*(b)[1];             \
00158 }\
00159 
00160 
00162 #define VEC_SCALE(c,a,b)            \
00163 {                       \
00164    (c)[0] = (a)*(b)[0];             \
00165    (c)[1] = (a)*(b)[1];             \
00166    (c)[2] = (a)*(b)[2];             \
00167 }\
00168 
00169 
00171 #define VEC_SCALE_4(c,a,b)          \
00172 {                       \
00173    (c)[0] = (a)*(b)[0];             \
00174    (c)[1] = (a)*(b)[1];             \
00175    (c)[2] = (a)*(b)[2];             \
00176    (c)[3] = (a)*(b)[3];             \
00177 }\
00178 
00179 
00181 #define VEC_ACCUM_2(c,a,b)          \
00182 {                       \
00183    (c)[0] += (a)*(b)[0];            \
00184    (c)[1] += (a)*(b)[1];            \
00185 }\
00186 
00187 
00189 #define VEC_ACCUM(c,a,b)            \
00190 {                       \
00191    (c)[0] += (a)*(b)[0];            \
00192    (c)[1] += (a)*(b)[1];            \
00193    (c)[2] += (a)*(b)[2];            \
00194 }\
00195 
00196 
00198 #define VEC_ACCUM_4(c,a,b)          \
00199 {                       \
00200    (c)[0] += (a)*(b)[0];            \
00201    (c)[1] += (a)*(b)[1];            \
00202    (c)[2] += (a)*(b)[2];            \
00203    (c)[3] += (a)*(b)[3];            \
00204 }\
00205 
00206 
00208 #define VEC_DOT_2(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1])
00209 
00210 
00212 #define VEC_DOT(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2])
00213 
00215 #define VEC_DOT_4(a,b)  ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3])
00216 
00218 #define VEC_IMPACT_SQ(bsq,direction,position) {\
00219    GREAL _llel_ = VEC_DOT(direction, position);\
00220    bsq = VEC_DOT(position, position) - _llel_*_llel_;\
00221 }\
00222 
00223 
00225 #define VEC_IMPACT(bsq,direction,position)  {\
00226    VEC_IMPACT_SQ(bsq,direction,position);       \
00227    GIM_SQRT(bsq,bsq);                   \
00228 }\
00229 
00230 
00231 #define VEC_LENGTH_2(a,l)\
00232 {\
00233     GREAL _pp = VEC_DOT_2(a,a);\
00234     GIM_SQRT(_pp,l);\
00235 }\
00236 
00237 
00239 #define VEC_LENGTH(a,l)\
00240 {\
00241     GREAL _pp = VEC_DOT(a,a);\
00242     GIM_SQRT(_pp,l);\
00243 }\
00244 
00245 
00247 #define VEC_LENGTH_4(a,l)\
00248 {\
00249     GREAL _pp = VEC_DOT_4(a,a);\
00250     GIM_SQRT(_pp,l);\
00251 }\
00252 
00253 
00254 #define VEC_INV_LENGTH_2(a,l)\
00255 {\
00256     GREAL _pp = VEC_DOT_2(a,a);\
00257     GIM_INV_SQRT(_pp,l);\
00258 }\
00259 
00260 
00262 #define VEC_INV_LENGTH(a,l)\
00263 {\
00264     GREAL _pp = VEC_DOT(a,a);\
00265     GIM_INV_SQRT(_pp,l);\
00266 }\
00267 
00268 
00270 #define VEC_INV_LENGTH_4(a,l)\
00271 {\
00272     GREAL _pp = VEC_DOT_4(a,a);\
00273     GIM_INV_SQRT(_pp,l);\
00274 }\
00275 
00276 
00277 
00279 #define VEC_DISTANCE(_len,_va,_vb) {\
00280     vec3f _tmp_;                \
00281     VEC_DIFF(_tmp_, _vb, _va);          \
00282     VEC_LENGTH(_tmp_,_len);         \
00283 }\
00284 
00285 
00287 #define VEC_CONJUGATE_LENGTH(a,l)\
00288 {\
00289     GREAL _pp = 1.0 - a[0]*a[0] - a[1]*a[1] - a[2]*a[2];\
00290     GIM_SQRT(_pp,l);\
00291 }\
00292 
00293 
00295 #define VEC_NORMALIZE(a) {  \
00296     GREAL len;\
00297     VEC_INV_LENGTH(a,len); \
00298     if(len<G_REAL_INFINITY)\
00299     {\
00300         a[0] *= len;                \
00301         a[1] *= len;                \
00302         a[2] *= len;                \
00303     }                       \
00304 }\
00305 
00306 
00307 #define VEC_RENORMALIZE(a,newlen) { \
00308     GREAL len;\
00309     VEC_INV_LENGTH(a,len); \
00310     if(len<G_REAL_INFINITY)\
00311     {\
00312         len *= newlen;\
00313         a[0] *= len;                \
00314         a[1] *= len;                \
00315         a[2] *= len;                \
00316     }                       \
00317 }\
00318 
00319 
00320 #define VEC_CROSS(c,a,b)        \
00321 {                       \
00322    c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1];    \
00323    c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2];    \
00324    c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0];    \
00325 }\
00326 
00327 
00330 #define VEC_PERPENDICULAR(vp,v,n)           \
00331 {                       \
00332    GREAL dot = VEC_DOT(v, n);           \
00333    vp[0] = (v)[0] - dot*(n)[0];     \
00334    vp[1] = (v)[1] - dot*(n)[1];     \
00335    vp[2] = (v)[2] - dot*(n)[2];     \
00336 }\
00337 
00338 
00340 #define VEC_PARALLEL(vp,v,n)            \
00341 {                       \
00342    GREAL dot = VEC_DOT(v, n);           \
00343    vp[0] = (dot) * (n)[0];          \
00344    vp[1] = (dot) * (n)[1];          \
00345    vp[2] = (dot) * (n)[2];          \
00346 }\
00347 
00348 
00350 #define VEC_PROJECT(vp,v,n)         \
00351 { \
00352     GREAL scalar = VEC_DOT(v, n);           \
00353     scalar/= VEC_DOT(n, n); \
00354     vp[0] = (scalar) * (n)[0];          \
00355     vp[1] = (scalar) * (n)[1];          \
00356     vp[2] = (scalar) * (n)[2];          \
00357 }\
00358 
00359 
00361 #define VEC_UNPROJECT(vp,v,n)           \
00362 { \
00363     GREAL scalar = VEC_DOT(v, n);           \
00364     scalar = VEC_DOT(n, n)/scalar; \
00365     vp[0] = (scalar) * (n)[0];          \
00366     vp[1] = (scalar) * (n)[1];          \
00367     vp[2] = (scalar) * (n)[2];          \
00368 }\
00369 
00370 
00373 #define VEC_REFLECT(vr,v,n)         \
00374 {                       \
00375    GREAL dot = VEC_DOT(v, n);           \
00376    vr[0] = (v)[0] - 2.0 * (dot) * (n)[0];   \
00377    vr[1] = (v)[1] - 2.0 * (dot) * (n)[1];   \
00378    vr[2] = (v)[2] - 2.0 * (dot) * (n)[2];   \
00379 }\
00380 
00381 
00384 #define VEC_BLEND_AB(vr,sa,a,sb,b)          \
00385 {                       \
00386    vr[0] = (sa) * (a)[0] + (sb) * (b)[0];   \
00387    vr[1] = (sa) * (a)[1] + (sb) * (b)[1];   \
00388    vr[2] = (sa) * (a)[2] + (sb) * (b)[2];   \
00389 }\
00390 
00391 
00393 #define VEC_BLEND(vr,a,b,s) VEC_BLEND_AB(vr,(1-s),a,s,b)
00394 
00395 #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];
00396 
00398 #define VEC_MAYOR_COORD(vec, maxc)\
00399 {\
00400     GREAL A[] = {fabs(vec[0]),fabs(vec[1]),fabs(vec[2])};\
00401     maxc =  A[0]>A[1]?(A[0]>A[2]?0:2):(A[1]>A[2]?1:2);\
00402 }\
00403 
00404 
00405 #define VEC_MINOR_AXES(vec, i0, i1)\
00406 {\
00407     VEC_MAYOR_COORD(vec,i0);\
00408     i0 = (i0+1)%3;\
00409     i1 = (i0+1)%3;\
00410 }\
00411 
00412 
00413 
00414 
00415 #define VEC_EQUAL(v1,v2) (v1[0]==v2[0]&&v1[1]==v2[1]&&v1[2]==v2[2])
00416 
00417 #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]))
00418 
00419 
00421 #define X_AXIS_CROSS_VEC(dst,src)\
00422 {                      \
00423     dst[0] = 0.0f;     \
00424     dst[1] = -src[2];  \
00425     dst[2] = src[1];  \
00426 }\
00427 
00428 #define Y_AXIS_CROSS_VEC(dst,src)\
00429 {                      \
00430     dst[0] = src[2];     \
00431     dst[1] = 0.0f;  \
00432     dst[2] = -src[0];  \
00433 }\
00434 
00435 #define Z_AXIS_CROSS_VEC(dst,src)\
00436 {                      \
00437     dst[0] = -src[1];     \
00438     dst[1] = src[0];  \
00439     dst[2] = 0.0f;  \
00440 }\
00441 
00442 
00443 
00444 
00445 
00446 
00448 #define IDENTIFY_MATRIX_3X3(m)          \
00449 {                       \
00450    m[0][0] = 1.0;               \
00451    m[0][1] = 0.0;               \
00452    m[0][2] = 0.0;               \
00453                         \
00454    m[1][0] = 0.0;               \
00455    m[1][1] = 1.0;               \
00456    m[1][2] = 0.0;               \
00457                         \
00458    m[2][0] = 0.0;               \
00459    m[2][1] = 0.0;               \
00460    m[2][2] = 1.0;               \
00461 }\
00462 
00463 
00464 #define IDENTIFY_MATRIX_4X4(m)          \
00465 {                       \
00466    m[0][0] = 1.0;               \
00467    m[0][1] = 0.0;               \
00468    m[0][2] = 0.0;               \
00469    m[0][3] = 0.0;               \
00470                         \
00471    m[1][0] = 0.0;               \
00472    m[1][1] = 1.0;               \
00473    m[1][2] = 0.0;               \
00474    m[1][3] = 0.0;               \
00475                         \
00476    m[2][0] = 0.0;               \
00477    m[2][1] = 0.0;               \
00478    m[2][2] = 1.0;               \
00479    m[2][3] = 0.0;               \
00480                         \
00481    m[3][0] = 0.0;               \
00482    m[3][1] = 0.0;               \
00483    m[3][2] = 0.0;               \
00484    m[3][3] = 1.0;               \
00485 }\
00486 
00487 
00488 #define ZERO_MATRIX_4X4(m)          \
00489 {                       \
00490    m[0][0] = 0.0;               \
00491    m[0][1] = 0.0;               \
00492    m[0][2] = 0.0;               \
00493    m[0][3] = 0.0;               \
00494                         \
00495    m[1][0] = 0.0;               \
00496    m[1][1] = 0.0;               \
00497    m[1][2] = 0.0;               \
00498    m[1][3] = 0.0;               \
00499                         \
00500    m[2][0] = 0.0;               \
00501    m[2][1] = 0.0;               \
00502    m[2][2] = 0.0;               \
00503    m[2][3] = 0.0;               \
00504                         \
00505    m[3][0] = 0.0;               \
00506    m[3][1] = 0.0;               \
00507    m[3][2] = 0.0;               \
00508    m[3][3] = 0.0;               \
00509 }\
00510 
00511 
00512 #define ROTX_CS(m,cosine,sine)      \
00513 {                   \
00514    /* rotation about the x-axis */  \
00515                     \
00516    m[0][0] = 1.0;           \
00517    m[0][1] = 0.0;           \
00518    m[0][2] = 0.0;           \
00519    m[0][3] = 0.0;           \
00520                     \
00521    m[1][0] = 0.0;           \
00522    m[1][1] = (cosine);          \
00523    m[1][2] = (sine);            \
00524    m[1][3] = 0.0;           \
00525                     \
00526    m[2][0] = 0.0;           \
00527    m[2][1] = -(sine);           \
00528    m[2][2] = (cosine);          \
00529    m[2][3] = 0.0;           \
00530                     \
00531    m[3][0] = 0.0;           \
00532    m[3][1] = 0.0;           \
00533    m[3][2] = 0.0;           \
00534    m[3][3] = 1.0;           \
00535 }\
00536 
00537 
00538 #define ROTY_CS(m,cosine,sine)      \
00539 {                   \
00540    /* rotation about the y-axis */  \
00541                     \
00542    m[0][0] = (cosine);          \
00543    m[0][1] = 0.0;           \
00544    m[0][2] = -(sine);           \
00545    m[0][3] = 0.0;           \
00546                     \
00547    m[1][0] = 0.0;           \
00548    m[1][1] = 1.0;           \
00549    m[1][2] = 0.0;           \
00550    m[1][3] = 0.0;           \
00551                     \
00552    m[2][0] = (sine);            \
00553    m[2][1] = 0.0;           \
00554    m[2][2] = (cosine);          \
00555    m[2][3] = 0.0;           \
00556                     \
00557    m[3][0] = 0.0;           \
00558    m[3][1] = 0.0;           \
00559    m[3][2] = 0.0;           \
00560    m[3][3] = 1.0;           \
00561 }\
00562 
00563 
00564 #define ROTZ_CS(m,cosine,sine)      \
00565 {                   \
00566    /* rotation about the z-axis */  \
00567                     \
00568    m[0][0] = (cosine);          \
00569    m[0][1] = (sine);            \
00570    m[0][2] = 0.0;           \
00571    m[0][3] = 0.0;           \
00572                     \
00573    m[1][0] = -(sine);           \
00574    m[1][1] = (cosine);          \
00575    m[1][2] = 0.0;           \
00576    m[1][3] = 0.0;           \
00577                     \
00578    m[2][0] = 0.0;           \
00579    m[2][1] = 0.0;           \
00580    m[2][2] = 1.0;           \
00581    m[2][3] = 0.0;           \
00582                     \
00583    m[3][0] = 0.0;           \
00584    m[3][1] = 0.0;           \
00585    m[3][2] = 0.0;           \
00586    m[3][3] = 1.0;           \
00587 }\
00588 
00589 
00590 #define COPY_MATRIX_2X2(b,a)    \
00591 {               \
00592    b[0][0] = a[0][0];       \
00593    b[0][1] = a[0][1];       \
00594                 \
00595    b[1][0] = a[1][0];       \
00596    b[1][1] = a[1][1];       \
00597                 \
00598 }\
00599 
00600 
00602 #define COPY_MATRIX_2X3(b,a)    \
00603 {               \
00604    b[0][0] = a[0][0];       \
00605    b[0][1] = a[0][1];       \
00606    b[0][2] = a[0][2];       \
00607                 \
00608    b[1][0] = a[1][0];       \
00609    b[1][1] = a[1][1];       \
00610    b[1][2] = a[1][2];       \
00611 }\
00612 
00613 
00615 #define COPY_MATRIX_3X3(b,a)    \
00616 {               \
00617    b[0][0] = a[0][0];       \
00618    b[0][1] = a[0][1];       \
00619    b[0][2] = a[0][2];       \
00620                 \
00621    b[1][0] = a[1][0];       \
00622    b[1][1] = a[1][1];       \
00623    b[1][2] = a[1][2];       \
00624                 \
00625    b[2][0] = a[2][0];       \
00626    b[2][1] = a[2][1];       \
00627    b[2][2] = a[2][2];       \
00628 }\
00629 
00630 
00632 #define COPY_MATRIX_4X4(b,a)    \
00633 {               \
00634    b[0][0] = a[0][0];       \
00635    b[0][1] = a[0][1];       \
00636    b[0][2] = a[0][2];       \
00637    b[0][3] = a[0][3];       \
00638                 \
00639    b[1][0] = a[1][0];       \
00640    b[1][1] = a[1][1];       \
00641    b[1][2] = a[1][2];       \
00642    b[1][3] = a[1][3];       \
00643                 \
00644    b[2][0] = a[2][0];       \
00645    b[2][1] = a[2][1];       \
00646    b[2][2] = a[2][2];       \
00647    b[2][3] = a[2][3];       \
00648                 \
00649    b[3][0] = a[3][0];       \
00650    b[3][1] = a[3][1];       \
00651    b[3][2] = a[3][2];       \
00652    b[3][3] = a[3][3];       \
00653 }\
00654 
00655 
00657 #define TRANSPOSE_MATRIX_2X2(b,a)   \
00658 {               \
00659    b[0][0] = a[0][0];       \
00660    b[0][1] = a[1][0];       \
00661                 \
00662    b[1][0] = a[0][1];       \
00663    b[1][1] = a[1][1];       \
00664 }\
00665 
00666 
00668 #define TRANSPOSE_MATRIX_3X3(b,a)   \
00669 {               \
00670    b[0][0] = a[0][0];       \
00671    b[0][1] = a[1][0];       \
00672    b[0][2] = a[2][0];       \
00673                 \
00674    b[1][0] = a[0][1];       \
00675    b[1][1] = a[1][1];       \
00676    b[1][2] = a[2][1];       \
00677                 \
00678    b[2][0] = a[0][2];       \
00679    b[2][1] = a[1][2];       \
00680    b[2][2] = a[2][2];       \
00681 }\
00682 
00683 
00685 #define TRANSPOSE_MATRIX_4X4(b,a)   \
00686 {               \
00687    b[0][0] = a[0][0];       \
00688    b[0][1] = a[1][0];       \
00689    b[0][2] = a[2][0];       \
00690    b[0][3] = a[3][0];       \
00691                 \
00692    b[1][0] = a[0][1];       \
00693    b[1][1] = a[1][1];       \
00694    b[1][2] = a[2][1];       \
00695    b[1][3] = a[3][1];       \
00696                 \
00697    b[2][0] = a[0][2];       \
00698    b[2][1] = a[1][2];       \
00699    b[2][2] = a[2][2];       \
00700    b[2][3] = a[3][2];       \
00701                 \
00702    b[3][0] = a[0][3];       \
00703    b[3][1] = a[1][3];       \
00704    b[3][2] = a[2][3];       \
00705    b[3][3] = a[3][3];       \
00706 }\
00707 
00708 
00710 #define SCALE_MATRIX_2X2(b,s,a)     \
00711 {                   \
00712    b[0][0] = (s) * a[0][0];     \
00713    b[0][1] = (s) * a[0][1];     \
00714                     \
00715    b[1][0] = (s) * a[1][0];     \
00716    b[1][1] = (s) * a[1][1];     \
00717 }\
00718 
00719 
00721 #define SCALE_MATRIX_3X3(b,s,a)     \
00722 {                   \
00723    b[0][0] = (s) * a[0][0];     \
00724    b[0][1] = (s) * a[0][1];     \
00725    b[0][2] = (s) * a[0][2];     \
00726                     \
00727    b[1][0] = (s) * a[1][0];     \
00728    b[1][1] = (s) * a[1][1];     \
00729    b[1][2] = (s) * a[1][2];     \
00730                     \
00731    b[2][0] = (s) * a[2][0];     \
00732    b[2][1] = (s) * a[2][1];     \
00733    b[2][2] = (s) * a[2][2];     \
00734 }\
00735 
00736 
00738 #define SCALE_MATRIX_4X4(b,s,a)     \
00739 {                   \
00740    b[0][0] = (s) * a[0][0];     \
00741    b[0][1] = (s) * a[0][1];     \
00742    b[0][2] = (s) * a[0][2];     \
00743    b[0][3] = (s) * a[0][3];     \
00744                     \
00745    b[1][0] = (s) * a[1][0];     \
00746    b[1][1] = (s) * a[1][1];     \
00747    b[1][2] = (s) * a[1][2];     \
00748    b[1][3] = (s) * a[1][3];     \
00749                     \
00750    b[2][0] = (s) * a[2][0];     \
00751    b[2][1] = (s) * a[2][1];     \
00752    b[2][2] = (s) * a[2][2];     \
00753    b[2][3] = (s) * a[2][3];     \
00754                     \
00755    b[3][0] = s * a[3][0];       \
00756    b[3][1] = s * a[3][1];       \
00757    b[3][2] = s * a[3][2];       \
00758    b[3][3] = s * a[3][3];       \
00759 }\
00760 
00761 
00763 #define SCALE_VEC_MATRIX_2X2(b,svec,a)      \
00764 {                   \
00765    b[0][0] = svec[0] * a[0][0];     \
00766    b[1][0] = svec[0] * a[1][0];     \
00767                     \
00768    b[0][1] = svec[1] * a[0][1];     \
00769    b[1][1] = svec[1] * a[1][1];     \
00770 }\
00771 
00772 
00774 #define SCALE_VEC_MATRIX_3X3(b,svec,a)      \
00775 {                   \
00776    b[0][0] = svec[0] * a[0][0];     \
00777    b[1][0] = svec[0] * a[1][0];     \
00778    b[2][0] = svec[0] * a[2][0];     \
00779                     \
00780    b[0][1] = svec[1] * a[0][1];     \
00781    b[1][1] = svec[1] * a[1][1];     \
00782    b[2][1] = svec[1] * a[2][1];     \
00783                     \
00784    b[0][2] = svec[2] * a[0][2];     \
00785    b[1][2] = svec[2] * a[1][2];     \
00786    b[2][2] = svec[2] * a[2][2];     \
00787 }\
00788 
00789 
00791 #define SCALE_VEC_MATRIX_4X4(b,svec,a)      \
00792 {                   \
00793    b[0][0] = svec[0] * a[0][0];     \
00794    b[1][0] = svec[0] * a[1][0];     \
00795    b[2][0] = svec[0] * a[2][0];     \
00796    b[3][0] = svec[0] * a[3][0];     \
00797                     \
00798    b[0][1] = svec[1] * a[0][1];     \
00799    b[1][1] = svec[1] * a[1][1];     \
00800    b[2][1] = svec[1] * a[2][1];     \
00801    b[3][1] = svec[1] * a[3][1];     \
00802                     \
00803    b[0][2] = svec[2] * a[0][2];     \
00804    b[1][2] = svec[2] * a[1][2];     \
00805    b[2][2] = svec[2] * a[2][2];     \
00806    b[3][2] = svec[2] * a[3][2];     \
00807    \
00808    b[0][3] = svec[3] * a[0][3];     \
00809    b[1][3] = svec[3] * a[1][3];     \
00810    b[2][3] = svec[3] * a[2][3];     \
00811    b[3][3] = svec[3] * a[3][3];     \
00812 }\
00813 
00814 
00816 #define ACCUM_SCALE_MATRIX_2X2(b,s,a)       \
00817 {                   \
00818    b[0][0] += (s) * a[0][0];        \
00819    b[0][1] += (s) * a[0][1];        \
00820                     \
00821    b[1][0] += (s) * a[1][0];        \
00822    b[1][1] += (s) * a[1][1];        \
00823 }\
00824 
00825 
00827 #define ACCUM_SCALE_MATRIX_3X3(b,s,a)       \
00828 {                   \
00829    b[0][0] += (s) * a[0][0];        \
00830    b[0][1] += (s) * a[0][1];        \
00831    b[0][2] += (s) * a[0][2];        \
00832                     \
00833    b[1][0] += (s) * a[1][0];        \
00834    b[1][1] += (s) * a[1][1];        \
00835    b[1][2] += (s) * a[1][2];        \
00836                     \
00837    b[2][0] += (s) * a[2][0];        \
00838    b[2][1] += (s) * a[2][1];        \
00839    b[2][2] += (s) * a[2][2];        \
00840 }\
00841 
00842 
00844 #define ACCUM_SCALE_MATRIX_4X4(b,s,a)       \
00845 {                   \
00846    b[0][0] += (s) * a[0][0];        \
00847    b[0][1] += (s) * a[0][1];        \
00848    b[0][2] += (s) * a[0][2];        \
00849    b[0][3] += (s) * a[0][3];        \
00850                     \
00851    b[1][0] += (s) * a[1][0];        \
00852    b[1][1] += (s) * a[1][1];        \
00853    b[1][2] += (s) * a[1][2];        \
00854    b[1][3] += (s) * a[1][3];        \
00855                     \
00856    b[2][0] += (s) * a[2][0];        \
00857    b[2][1] += (s) * a[2][1];        \
00858    b[2][2] += (s) * a[2][2];        \
00859    b[2][3] += (s) * a[2][3];        \
00860                     \
00861    b[3][0] += (s) * a[3][0];        \
00862    b[3][1] += (s) * a[3][1];        \
00863    b[3][2] += (s) * a[3][2];        \
00864    b[3][3] += (s) * a[3][3];        \
00865 }\
00866 
00867 
00869 #define MATRIX_PRODUCT_2X2(c,a,b)       \
00870 {                       \
00871    c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0];   \
00872    c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1];   \
00873                         \
00874    c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0];   \
00875    c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1];   \
00876                         \
00877 }\
00878 
00879 
00881 #define MATRIX_PRODUCT_3X3(c,a,b)               \
00882 {                               \
00883    c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];   \
00884    c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1];   \
00885    c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2];   \
00886                                 \
00887    c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0];   \
00888    c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1];   \
00889    c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2];   \
00890                                 \
00891    c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0];   \
00892    c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1];   \
00893    c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2];   \
00894 }\
00895 
00896 
00899 #define MATRIX_PRODUCT_4X4(c,a,b)       \
00900 {                       \
00901    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];\
00902    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];\
00903    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];\
00904    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];\
00905                         \
00906    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];\
00907    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];\
00908    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];\
00909    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];\
00910                         \
00911    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];\
00912    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];\
00913    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];\
00914    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];\
00915                         \
00916    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];\
00917    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];\
00918    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];\
00919    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];\
00920 }\
00921 
00922 
00924 #define MAT_DOT_VEC_2X2(p,m,v)                  \
00925 {                               \
00926    p[0] = m[0][0]*v[0] + m[0][1]*v[1];              \
00927    p[1] = m[1][0]*v[0] + m[1][1]*v[1];              \
00928 }\
00929 
00930 
00932 #define MAT_DOT_VEC_3X3(p,m,v)                  \
00933 {                               \
00934    p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];       \
00935    p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];       \
00936    p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];       \
00937 }\
00938 
00939 
00943 #define MAT_DOT_VEC_4X4(p,m,v)                  \
00944 {                               \
00945    p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]*v[3];    \
00946    p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]*v[3];    \
00947    p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]*v[3];    \
00948    p[3] = m[3][0]*v[0] + m[3][1]*v[1] + m[3][2]*v[2] + m[3][3]*v[3];    \
00949 }\
00950 
00951 
00956 #define MAT_DOT_VEC_3X4(p,m,v)                  \
00957 {                               \
00958    p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]; \
00959    p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]; \
00960    p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]; \
00961 }\
00962 
00963 
00966 #define VEC_DOT_MAT_3X3(p,v,m)                  \
00967 {                               \
00968    p[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0];       \
00969    p[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1];       \
00970    p[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2];       \
00971 }\
00972 
00973 
00977 #define MAT_DOT_VEC_2X3(p,m,v)                  \
00978 {                               \
00979    p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2];        \
00980    p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2];        \
00981 }\
00982 
00983 
00984 #define MAT_TRANSFORM_PLANE_4X4(pout,m,plane)\
00985 {                               \
00986    pout[0] = m[0][0]*plane[0] + m[0][1]*plane[1]  + m[0][2]*plane[2];\
00987    pout[1] = m[1][0]*plane[0] + m[1][1]*plane[1]  + m[1][2]*plane[2];\
00988    pout[2] = m[2][0]*plane[0] + m[2][1]*plane[1]  + m[2][2]*plane[2];\
00989    pout[3] = m[0][3]*pout[0] + m[1][3]*pout[1]  + m[2][3]*pout[2] + plane[3];\
00990 }\
00991 
00992 
00993 
01003 #define INV_TRANSP_MAT_DOT_VEC_2X2(p,m,v)           \
01004 {                               \
01005    GREAL det;                       \
01006                                 \
01007    det = m[0][0]*m[1][1] - m[0][1]*m[1][0];         \
01008    p[0] = m[1][1]*v[0] - m[1][0]*v[1];              \
01009    p[1] = - m[0][1]*v[0] + m[0][0]*v[1];            \
01010                                 \
01011    /* if matrix not singular, and not orthonormal, then renormalize */ \
01012    if ((det!=1.0f) && (det != 0.0f)) {              \
01013       det = 1.0f / det;                     \
01014       p[0] *= det;                      \
01015       p[1] *= det;                      \
01016    }                                \
01017 }\
01018 
01019 
01027 #define NORM_XFORM_2X2(p,m,v)                   \
01028 {                               \
01029    GREAL len;                           \
01030                                 \
01031    /* do nothing if off-diagonals are zero and diagonals are    \
01032     * equal */                          \
01033    if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) { \
01034       p[0] = m[1][1]*v[0] - m[1][0]*v[1];           \
01035       p[1] = - m[0][1]*v[0] + m[0][0]*v[1];         \
01036                                 \
01037       len = p[0]*p[0] + p[1]*p[1];              \
01038       GIM_INV_SQRT(len,len);                    \
01039       p[0] *= len;                      \
01040       p[1] *= len;                      \
01041    } else {                         \
01042       VEC_COPY_2 (p, v);                    \
01043    }                                \
01044 }\
01045 
01046 
01052 #define OUTER_PRODUCT_2X2(m,v,t)                \
01053 {                               \
01054    m[0][0] = v[0] * t[0];                   \
01055    m[0][1] = v[0] * t[1];                   \
01056                                 \
01057    m[1][0] = v[1] * t[0];                   \
01058    m[1][1] = v[1] * t[1];                   \
01059 }\
01060 
01061 
01067 #define OUTER_PRODUCT_3X3(m,v,t)                \
01068 {                               \
01069    m[0][0] = v[0] * t[0];                   \
01070    m[0][1] = v[0] * t[1];                   \
01071    m[0][2] = v[0] * t[2];                   \
01072                                 \
01073    m[1][0] = v[1] * t[0];                   \
01074    m[1][1] = v[1] * t[1];                   \
01075    m[1][2] = v[1] * t[2];                   \
01076                                 \
01077    m[2][0] = v[2] * t[0];                   \
01078    m[2][1] = v[2] * t[1];                   \
01079    m[2][2] = v[2] * t[2];                   \
01080 }\
01081 
01082 
01088 #define OUTER_PRODUCT_4X4(m,v,t)                \
01089 {                               \
01090    m[0][0] = v[0] * t[0];                   \
01091    m[0][1] = v[0] * t[1];                   \
01092    m[0][2] = v[0] * t[2];                   \
01093    m[0][3] = v[0] * t[3];                   \
01094                                 \
01095    m[1][0] = v[1] * t[0];                   \
01096    m[1][1] = v[1] * t[1];                   \
01097    m[1][2] = v[1] * t[2];                   \
01098    m[1][3] = v[1] * t[3];                   \
01099                                 \
01100    m[2][0] = v[2] * t[0];                   \
01101    m[2][1] = v[2] * t[1];                   \
01102    m[2][2] = v[2] * t[2];                   \
01103    m[2][3] = v[2] * t[3];                   \
01104                                 \
01105    m[3][0] = v[3] * t[0];                   \
01106    m[3][1] = v[3] * t[1];                   \
01107    m[3][2] = v[3] * t[2];                   \
01108    m[3][3] = v[3] * t[3];                   \
01109 }\
01110 
01111 
01117 #define ACCUM_OUTER_PRODUCT_2X2(m,v,t)              \
01118 {                               \
01119    m[0][0] += v[0] * t[0];                  \
01120    m[0][1] += v[0] * t[1];                  \
01121                                 \
01122    m[1][0] += v[1] * t[0];                  \
01123    m[1][1] += v[1] * t[1];                  \
01124 }\
01125 
01126 
01132 #define ACCUM_OUTER_PRODUCT_3X3(m,v,t)              \
01133 {                               \
01134    m[0][0] += v[0] * t[0];                  \
01135    m[0][1] += v[0] * t[1];                  \
01136    m[0][2] += v[0] * t[2];                  \
01137                                 \
01138    m[1][0] += v[1] * t[0];                  \
01139    m[1][1] += v[1] * t[1];                  \
01140    m[1][2] += v[1] * t[2];                  \
01141                                 \
01142    m[2][0] += v[2] * t[0];                  \
01143    m[2][1] += v[2] * t[1];                  \
01144    m[2][2] += v[2] * t[2];                  \
01145 }\
01146 
01147 
01153 #define ACCUM_OUTER_PRODUCT_4X4(m,v,t)              \
01154 {                               \
01155    m[0][0] += v[0] * t[0];                  \
01156    m[0][1] += v[0] * t[1];                  \
01157    m[0][2] += v[0] * t[2];                  \
01158    m[0][3] += v[0] * t[3];                  \
01159                                 \
01160    m[1][0] += v[1] * t[0];                  \
01161    m[1][1] += v[1] * t[1];                  \
01162    m[1][2] += v[1] * t[2];                  \
01163    m[1][3] += v[1] * t[3];                  \
01164                                 \
01165    m[2][0] += v[2] * t[0];                  \
01166    m[2][1] += v[2] * t[1];                  \
01167    m[2][2] += v[2] * t[2];                  \
01168    m[2][3] += v[2] * t[3];                  \
01169                                 \
01170    m[3][0] += v[3] * t[0];                  \
01171    m[3][1] += v[3] * t[1];                  \
01172    m[3][2] += v[3] * t[2];                  \
01173    m[3][3] += v[3] * t[3];                  \
01174 }\
01175 
01176 
01181 #define DETERMINANT_2X2(d,m)                    \
01182 {                               \
01183    d = m[0][0] * m[1][1] - m[0][1] * m[1][0];           \
01184 }\
01185 
01186 
01191 #define DETERMINANT_3X3(d,m)                    \
01192 {                               \
01193    d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]);     \
01194    d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]);    \
01195    d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]);    \
01196 }\
01197 
01198 
01202 #define COFACTOR_4X4_IJ(fac,m,i,j)              \
01203 {                               \
01204    GUINT __ii[4], __jj[4], __k;                     \
01205                                 \
01206    for (__k=0; __k<i; __k++) __ii[__k] = __k;               \
01207    for (__k=i; __k<3; __k++) __ii[__k] = __k+1;             \
01208    for (__k=0; __k<j; __k++) __jj[__k] = __k;               \
01209    for (__k=j; __k<3; __k++) __jj[__k] = __k+1;             \
01210                                 \
01211    (fac) = m[__ii[0]][__jj[0]] * (m[__ii[1]][__jj[1]]*m[__ii[2]][__jj[2]]   \
01212                             - m[__ii[1]][__jj[2]]*m[__ii[2]][__jj[1]]); \
01213    (fac) -= m[__ii[0]][__jj[1]] * (m[__ii[1]][__jj[0]]*m[__ii[2]][__jj[2]]  \
01214                              - m[__ii[1]][__jj[2]]*m[__ii[2]][__jj[0]]);\
01215    (fac) += m[__ii[0]][__jj[2]] * (m[__ii[1]][__jj[0]]*m[__ii[2]][__jj[1]]  \
01216                              - m[__ii[1]][__jj[1]]*m[__ii[2]][__jj[0]]);\
01217                                 \
01218    __k = i+j;                           \
01219    if ( __k != (__k/2)*2) {                     \
01220       (fac) = -(fac);                       \
01221    }                                \
01222 }\
01223 
01224 
01229 #define DETERMINANT_4X4(d,m)                    \
01230 {                               \
01231    GREAL cofac;                     \
01232    COFACTOR_4X4_IJ (cofac, m, 0, 0);                \
01233    d = m[0][0] * cofac;                     \
01234    COFACTOR_4X4_IJ (cofac, m, 0, 1);                \
01235    d += m[0][1] * cofac;                    \
01236    COFACTOR_4X4_IJ (cofac, m, 0, 2);                \
01237    d += m[0][2] * cofac;                    \
01238    COFACTOR_4X4_IJ (cofac, m, 0, 3);                \
01239    d += m[0][3] * cofac;                    \
01240 }\
01241 
01242 
01247 #define COFACTOR_2X2(a,m)                   \
01248 {                               \
01249    a[0][0] = (m)[1][1];                     \
01250    a[0][1] = - (m)[1][0];                       \
01251    a[1][0] = - (m)[0][1];                       \
01252    a[1][1] = (m)[0][0];                     \
01253 }\
01254 
01255 
01260 #define COFACTOR_3X3(a,m)                   \
01261 {                               \
01262    a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];         \
01263    a[0][1] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);     \
01264    a[0][2] = m[1][0]*m[2][1] - m[1][1]*m[2][0];         \
01265    a[1][0] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);     \
01266    a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];         \
01267    a[1][2] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);     \
01268    a[2][0] = m[0][1]*m[1][2] - m[0][2]*m[1][1];         \
01269    a[2][1] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);     \
01270    a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);        \
01271 }\
01272 
01273 
01278 #define COFACTOR_4X4(a,m)                   \
01279 {                               \
01280    int i,j;                         \
01281                                 \
01282    for (i=0; i<4; i++) {                    \
01283       for (j=0; j<4; j++) {                 \
01284          COFACTOR_4X4_IJ (a[i][j], m, i, j);            \
01285       }                             \
01286    }                                \
01287 }\
01288 
01289 
01295 #define ADJOINT_2X2(a,m)                    \
01296 {                               \
01297    a[0][0] = (m)[1][1];                     \
01298    a[1][0] = - (m)[1][0];                       \
01299    a[0][1] = - (m)[0][1];                       \
01300    a[1][1] = (m)[0][0];                     \
01301 }\
01302 
01303 
01309 #define ADJOINT_3X3(a,m)                    \
01310 {                               \
01311    a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];         \
01312    a[1][0] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]);     \
01313    a[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0];         \
01314    a[0][1] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]);     \
01315    a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];         \
01316    a[2][1] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]);     \
01317    a[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1];         \
01318    a[1][2] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]);     \
01319    a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]);        \
01320 }\
01321 
01322 
01328 #define ADJOINT_4X4(a,m)                    \
01329 {                               \
01330    char _i_,_j_;                            \
01331                                 \
01332    for (_i_=0; _i_<4; _i_++) {                  \
01333       for (_j_=0; _j_<4; _j_++) {                   \
01334          COFACTOR_4X4_IJ (a[_j_][_i_], m, _i_, _j_);            \
01335       }                             \
01336    }                                \
01337 }\
01338 
01339 
01344 #define SCALE_ADJOINT_2X2(a,s,m)                \
01345 {                               \
01346    a[0][0] = (s) * m[1][1];                 \
01347    a[1][0] = - (s) * m[1][0];                   \
01348    a[0][1] = - (s) * m[0][1];                   \
01349    a[1][1] = (s) * m[0][0];                 \
01350 }\
01351 
01352 
01357 #define SCALE_ADJOINT_3X3(a,s,m)                \
01358 {                               \
01359    a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
01360    a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]); \
01361    a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
01362                                 \
01363    a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]); \
01364    a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]); \
01365    a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]); \
01366                                 \
01367    a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]); \
01368    a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]); \
01369    a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]); \
01370 }\
01371 
01372 
01377 #define SCALE_ADJOINT_4X4(a,s,m)                \
01378 {                               \
01379    char _i_,_j_; \
01380    for (_i_=0; _i_<4; _i_++) {                  \
01381       for (_j_=0; _j_<4; _j_++) {                   \
01382          COFACTOR_4X4_IJ (a[_j_][_i_], m, _i_, _j_);            \
01383          a[_j_][_i_] *= s;                      \
01384       }                             \
01385    }                                \
01386 }\
01387 
01388 
01393 #define INVERT_2X2(b,det,a)         \
01394 {                       \
01395    GREAL _tmp_;                 \
01396    DETERMINANT_2X2 (det, a);            \
01397    _tmp_ = 1.0 / (det);             \
01398    SCALE_ADJOINT_2X2 (b, _tmp_, a);     \
01399 }\
01400 
01401 
01407 #define INVERT_3X3(b,det,a)         \
01408 {                       \
01409    GREAL _tmp_;                 \
01410    DETERMINANT_3X3 (det, a);            \
01411    _tmp_ = 1.0 / (det);             \
01412    SCALE_ADJOINT_3X3 (b, _tmp_, a);     \
01413 }\
01414 
01415 
01421 #define INVERT_4X4(b,det,a)         \
01422 {                       \
01423    GREAL _tmp_;                 \
01424    DETERMINANT_4X4 (det, a);            \
01425    _tmp_ = 1.0 / (det);             \
01426    SCALE_ADJOINT_4X4 (b, _tmp_, a);     \
01427 }\
01428 
01429 
01430 #define MAT_GET_ROW(mat,vec3,rowindex)\
01431 {\
01432     vec3[0] = mat[rowindex][0];\
01433     vec3[1] = mat[rowindex][1];\
01434     vec3[2] = mat[rowindex][2]; \
01435 }\
01436 
01437 
01438 #define MAT_GET_ROW2(mat,vec2,rowindex)\
01439 {\
01440     vec2[0] = mat[rowindex][0];\
01441     vec2[1] = mat[rowindex][1];\
01442 }\
01443 
01444 
01446 #define MAT_GET_ROW4(mat,vec4,rowindex)\
01447 {\
01448     vec4[0] = mat[rowindex][0];\
01449     vec4[1] = mat[rowindex][1];\
01450     vec4[2] = mat[rowindex][2];\
01451     vec4[3] = mat[rowindex][3];\
01452 }\
01453 
01454 
01455 #define MAT_GET_COL(mat,vec3,colindex)\
01456 {\
01457     vec3[0] = mat[0][colindex];\
01458     vec3[1] = mat[1][colindex];\
01459     vec3[2] = mat[2][colindex]; \
01460 }\
01461 
01462 
01463 #define MAT_GET_COL2(mat,vec2,colindex)\
01464 {\
01465     vec2[0] = mat[0][colindex];\
01466     vec2[1] = mat[1][colindex];\
01467 }\
01468 
01469 
01471 #define MAT_GET_COL4(mat,vec4,colindex)\
01472 {\
01473     vec4[0] = mat[0][colindex];\
01474     vec4[1] = mat[1][colindex];\
01475     vec4[2] = mat[2][colindex];\
01476     vec4[3] = mat[3][colindex];\
01477 }\
01478 
01479 
01480 #define MAT_GET_X(mat,vec3)\
01481 {\
01482     MAT_GET_COL(mat,vec3,0);\
01483 }\
01484 
01485 
01486 #define MAT_GET_Y(mat,vec3)\
01487 {\
01488     MAT_GET_COL(mat,vec3,1);\
01489 }\
01490 
01491 
01492 #define MAT_GET_Z(mat,vec3)\
01493 {\
01494     MAT_GET_COL(mat,vec3,2);\
01495 }\
01496 
01497 
01499 #define MAT_SET_X(mat,vec3)\
01500 {\
01501     mat[0][0] = vec3[0];\
01502     mat[1][0] = vec3[1];\
01503     mat[2][0] = vec3[2];\
01504 }\
01505 
01506 
01507 #define MAT_SET_Y(mat,vec3)\
01508 {\
01509     mat[0][1] = vec3[0];\
01510     mat[1][1] = vec3[1];\
01511     mat[2][1] = vec3[2];\
01512 }\
01513 
01514 
01515 #define MAT_SET_Z(mat,vec3)\
01516 {\
01517     mat[0][2] = vec3[0];\
01518     mat[1][2] = vec3[1];\
01519     mat[2][2] = vec3[2];\
01520 }\
01521 
01522 
01524 #define MAT_GET_TRANSLATION(mat,vec3)\
01525 {\
01526     vec3[0] = mat[0][3];\
01527     vec3[1] = mat[1][3];\
01528     vec3[2] = mat[2][3]; \
01529 }\
01530 
01531 
01532 #define MAT_SET_TRANSLATION(mat,vec3)\
01533 {\
01534     mat[0][3] = vec3[0];\
01535     mat[1][3] = vec3[1];\
01536     mat[2][3] = vec3[2]; \
01537 }\
01538 
01539 
01540 
01542 #define MAT_DOT_ROW(mat,vec3,rowindex) (vec3[0]*mat[rowindex][0] + vec3[1]*mat[rowindex][1] + vec3[2]*mat[rowindex][2])
01543 
01545 #define MAT_DOT_ROW2(mat,vec2,rowindex) (vec2[0]*mat[rowindex][0] + vec2[1]*mat[rowindex][1])
01546 
01548 #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])
01549 
01550 
01552 #define MAT_DOT_COL(mat,vec3,colindex) (vec3[0]*mat[0][colindex] + vec3[1]*mat[1][colindex] + vec3[2]*mat[2][colindex])
01553 
01555 #define MAT_DOT_COL2(mat,vec2,colindex) (vec2[0]*mat[0][colindex] + vec2[1]*mat[1][colindex])
01556 
01558 #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])
01559 
01564 #define INV_MAT_DOT_VEC_3X3(p,m,v)                  \
01565 {                               \
01566    p[0] = MAT_DOT_COL(m,v,0); \
01567    p[1] = MAT_DOT_COL(m,v,1);   \
01568    p[2] = MAT_DOT_COL(m,v,2);   \
01569 }\
01570 
01571 
01572 
01573 #endif // GIM_VECTOR_H_INCLUDED