00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _ODE_ODEMATH_H_
00024 #define _ODE_ODEMATH_H_
00025
00026 #include <ode/common.h>
00027
00028 #ifdef __GNUC__
00029 #define PURE_INLINE extern inline
00030 #else
00031 #define PURE_INLINE inline
00032 #endif
00033
00034
00035
00036
00037
00038 #define dACCESS33(A,i,j) ((A)[(i)*4+(j)])
00039
00040
00041
00042
00043 #define dVALIDVEC3(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2])))
00044 #define dVALIDVEC4(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2]) || dIsNan(v[3])))
00045 #define dVALIDMAT3(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11])))
00046 #define dVALIDMAT4(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11]) || dIsNan(m[12]) || dIsNan(m[13]) || dIsNan(m[14]) || dIsNan(m[15]) ))
00047
00048
00049
00050
00051
00052
00053
00054 #define dOP(a,op,b,c) \
00055 (a)[0] = ((b)[0]) op ((c)[0]); \
00056 (a)[1] = ((b)[1]) op ((c)[1]); \
00057 (a)[2] = ((b)[2]) op ((c)[2]);
00058 #define dOPC(a,op,b,c) \
00059 (a)[0] = ((b)[0]) op (c); \
00060 (a)[1] = ((b)[1]) op (c); \
00061 (a)[2] = ((b)[2]) op (c);
00062 #define dOPE(a,op,b) \
00063 (a)[0] op ((b)[0]); \
00064 (a)[1] op ((b)[1]); \
00065 (a)[2] op ((b)[2]);
00066 #define dOPEC(a,op,c) \
00067 (a)[0] op (c); \
00068 (a)[1] op (c); \
00069 (a)[2] op (c);
00070
00077 #define dOPE2(a,op1,b,op2,c) \
00078 (a)[0] op1 ((b)[0]) op2 ((c)[0]); \
00079 (a)[1] op1 ((b)[1]) op2 ((c)[1]); \
00080 (a)[2] op1 ((b)[2]) op2 ((c)[2]);
00081
00082
00083
00084
00085
00086
00087 #define dLENGTHSQUARED(a) (((a)[0])*((a)[0]) + ((a)[1])*((a)[1]) + ((a)[2])*((a)[2]))
00088
00089 #ifdef __cplusplus
00090
00091 PURE_INLINE dReal dLENGTH (const dReal *a) { return dSqrt(dLENGTHSQUARED(a)); }
00092
00093 #else
00094
00095 #define dLENGTH(a) ( dSqrt( ((a)[0])*((a)[0]) + ((a)[1])*((a)[1]) + ((a)[2])*((a)[2]) ) )
00096
00097 #endif
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 #define dDOTpq(a,b,p,q) ((a)[0]*(b)[0] + (a)[p]*(b)[q] + (a)[2*(p)]*(b)[2*(q)])
00111
00112 #ifdef __cplusplus
00113
00114 PURE_INLINE dReal dDOT (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,1); }
00115 PURE_INLINE dReal dDOT13 (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,3); }
00116 PURE_INLINE dReal dDOT31 (const dReal *a, const dReal *b) { return dDOTpq(a,b,3,1); }
00117 PURE_INLINE dReal dDOT33 (const dReal *a, const dReal *b) { return dDOTpq(a,b,3,3); }
00118 PURE_INLINE dReal dDOT14 (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,4); }
00119 PURE_INLINE dReal dDOT41 (const dReal *a, const dReal *b) { return dDOTpq(a,b,4,1); }
00120 PURE_INLINE dReal dDOT44 (const dReal *a, const dReal *b) { return dDOTpq(a,b,4,4); }
00121
00122 #else
00123
00124 #define dDOT(a,b) dDOTpq(a,b,1,1)
00125 #define dDOT13(a,b) dDOTpq(a,b,1,3)
00126 #define dDOT31(a,b) dDOTpq(a,b,3,1)
00127 #define dDOT33(a,b) dDOTpq(a,b,3,3)
00128 #define dDOT14(a,b) dDOTpq(a,b,1,4)
00129 #define dDOT41(a,b) dDOTpq(a,b,4,1)
00130 #define dDOT44(a,b) dDOTpq(a,b,4,4)
00131
00132 #endif
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 #define dCROSS(a,op,b,c) \
00143 do { \
00144 (a)[0] op ((b)[1]*(c)[2] - (b)[2]*(c)[1]); \
00145 (a)[1] op ((b)[2]*(c)[0] - (b)[0]*(c)[2]); \
00146 (a)[2] op ((b)[0]*(c)[1] - (b)[1]*(c)[0]); \
00147 } while(0)
00148 #define dCROSSpqr(a,op,b,c,p,q,r) \
00149 do { \
00150 (a)[ 0] op ((b)[ q]*(c)[2*r] - (b)[2*q]*(c)[ r]); \
00151 (a)[ p] op ((b)[2*q]*(c)[ 0] - (b)[ 0]*(c)[2*r]); \
00152 (a)[2*p] op ((b)[ 0]*(c)[ r] - (b)[ q]*(c)[ 0]); \
00153 } while(0)
00154 #define dCROSS114(a,op,b,c) dCROSSpqr(a,op,b,c,1,1,4)
00155 #define dCROSS141(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,1)
00156 #define dCROSS144(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,4)
00157 #define dCROSS411(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,1)
00158 #define dCROSS414(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,4)
00159 #define dCROSS441(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,1)
00160 #define dCROSS444(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,4)
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171 #define dCROSSMAT(A,a,skip,plus,minus) \
00172 do { \
00173 (A)[1] = minus (a)[2]; \
00174 (A)[2] = plus (a)[1]; \
00175 (A)[(skip)+0] = plus (a)[2]; \
00176 (A)[(skip)+2] = minus (a)[0]; \
00177 (A)[2*(skip)+0] = minus (a)[1]; \
00178 (A)[2*(skip)+1] = plus (a)[0]; \
00179 } while(0)
00180
00181
00182
00183
00184
00185
00186 #ifdef __cplusplus
00187 PURE_INLINE dReal dDISTANCE (const dVector3 a, const dVector3 b)
00188 { return dSqrt( (a[0]-b[0])*(a[0]-b[0]) + (a[1]-b[1])*(a[1]-b[1]) + (a[2]-b[2])*(a[2]-b[2]) ); }
00189 #else
00190 #define dDISTANCE(a,b) \
00191 (dSqrt( ((a)[0]-(b)[0])*((a)[0]-(b)[0]) + ((a)[1]-(b)[1])*((a)[1]-(b)[1]) + ((a)[2]-(b)[2])*((a)[2]-(b)[2]) ))
00192 #endif
00193
00194
00195
00196
00197
00198
00199 #define dMULTIPLYOP0_331(A,op,B,C) \
00200 do { \
00201 (A)[0] op dDOT((B),(C)); \
00202 (A)[1] op dDOT((B+4),(C)); \
00203 (A)[2] op dDOT((B+8),(C)); \
00204 } while(0)
00205 #define dMULTIPLYOP1_331(A,op,B,C) \
00206 do { \
00207 (A)[0] op dDOT41((B),(C)); \
00208 (A)[1] op dDOT41((B+1),(C)); \
00209 (A)[2] op dDOT41((B+2),(C)); \
00210 } while(0)
00211 #define dMULTIPLYOP0_133(A,op,B,C) \
00212 do { \
00213 (A)[0] op dDOT14((B),(C)); \
00214 (A)[1] op dDOT14((B),(C+1)); \
00215 (A)[2] op dDOT14((B),(C+2)); \
00216 } while(0)
00217 #define dMULTIPLYOP0_333(A,op,B,C) \
00218 do { \
00219 (A)[0] op dDOT14((B),(C)); \
00220 (A)[1] op dDOT14((B),(C+1)); \
00221 (A)[2] op dDOT14((B),(C+2)); \
00222 (A)[4] op dDOT14((B+4),(C)); \
00223 (A)[5] op dDOT14((B+4),(C+1)); \
00224 (A)[6] op dDOT14((B+4),(C+2)); \
00225 (A)[8] op dDOT14((B+8),(C)); \
00226 (A)[9] op dDOT14((B+8),(C+1)); \
00227 (A)[10] op dDOT14((B+8),(C+2)); \
00228 } while(0)
00229 #define dMULTIPLYOP1_333(A,op,B,C) \
00230 do { \
00231 (A)[0] op dDOT44((B),(C)); \
00232 (A)[1] op dDOT44((B),(C+1)); \
00233 (A)[2] op dDOT44((B),(C+2)); \
00234 (A)[4] op dDOT44((B+1),(C)); \
00235 (A)[5] op dDOT44((B+1),(C+1)); \
00236 (A)[6] op dDOT44((B+1),(C+2)); \
00237 (A)[8] op dDOT44((B+2),(C)); \
00238 (A)[9] op dDOT44((B+2),(C+1)); \
00239 (A)[10] op dDOT44((B+2),(C+2)); \
00240 } while(0)
00241 #define dMULTIPLYOP2_333(A,op,B,C) \
00242 do { \
00243 (A)[0] op dDOT((B),(C)); \
00244 (A)[1] op dDOT((B),(C+4)); \
00245 (A)[2] op dDOT((B),(C+8)); \
00246 (A)[4] op dDOT((B+4),(C)); \
00247 (A)[5] op dDOT((B+4),(C+4)); \
00248 (A)[6] op dDOT((B+4),(C+8)); \
00249 (A)[8] op dDOT((B+8),(C)); \
00250 (A)[9] op dDOT((B+8),(C+4)); \
00251 (A)[10] op dDOT((B+8),(C+8)); \
00252 } while(0)
00253
00254 #ifdef __cplusplus
00255
00256 #define DECL template <class TA, class TB, class TC> PURE_INLINE void
00257
00258
00259
00260
00261
00262
00263 DECL dMULTIPLY0_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_331(A,=,B,C); }
00264 DECL dMULTIPLY1_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_331(A,=,B,C); }
00265 DECL dMULTIPLY0_133(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_133(A,=,B,C); }
00266 DECL dMULTIPLY0_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_333(A,=,B,C); }
00267 DECL dMULTIPLY1_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_333(A,=,B,C); }
00268 DECL dMULTIPLY2_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP2_333(A,=,B,C); }
00269
00270 DECL dMULTIPLYADD0_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_331(A,+=,B,C); }
00271 DECL dMULTIPLYADD1_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_331(A,+=,B,C); }
00272 DECL dMULTIPLYADD0_133(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_133(A,+=,B,C); }
00273 DECL dMULTIPLYADD0_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_333(A,+=,B,C); }
00274 DECL dMULTIPLYADD1_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_333(A,+=,B,C); }
00275 DECL dMULTIPLYADD2_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP2_333(A,+=,B,C); }
00276
00277 #undef DECL
00278
00279 #else
00280
00281 #define dMULTIPLY0_331(A,B,C) dMULTIPLYOP0_331(A,=,B,C)
00282 #define dMULTIPLY1_331(A,B,C) dMULTIPLYOP1_331(A,=,B,C)
00283 #define dMULTIPLY0_133(A,B,C) dMULTIPLYOP0_133(A,=,B,C)
00284 #define dMULTIPLY0_333(A,B,C) dMULTIPLYOP0_333(A,=,B,C)
00285 #define dMULTIPLY1_333(A,B,C) dMULTIPLYOP1_333(A,=,B,C)
00286 #define dMULTIPLY2_333(A,B,C) dMULTIPLYOP2_333(A,=,B,C)
00287
00288 #define dMULTIPLYADD0_331(A,B,C) dMULTIPLYOP0_331(A,+=,B,C)
00289 #define dMULTIPLYADD1_331(A,B,C) dMULTIPLYOP1_331(A,+=,B,C)
00290 #define dMULTIPLYADD0_133(A,B,C) dMULTIPLYOP0_133(A,+=,B,C)
00291 #define dMULTIPLYADD0_333(A,B,C) dMULTIPLYOP0_333(A,+=,B,C)
00292 #define dMULTIPLYADD1_333(A,B,C) dMULTIPLYOP1_333(A,+=,B,C)
00293 #define dMULTIPLYADD2_333(A,B,C) dMULTIPLYOP2_333(A,+=,B,C)
00294
00295 #endif
00296
00297
00298 #ifdef __cplusplus
00299 extern "C" {
00300 #endif
00301
00302
00303
00304
00305
00306 #if defined(__ODE__)
00307
00308 int _dSafeNormalize3 (dVector3 a);
00309 int _dSafeNormalize4 (dVector4 a);
00310
00311 static __inline void _dNormalize3(dVector3 a)
00312 {
00313 int bNormalizationResult = _dSafeNormalize3(a);
00314 dIASSERT(bNormalizationResult);
00315 dVARIABLEUSED(bNormalizationResult);
00316 }
00317
00318 static __inline void _dNormalize4(dVector4 a)
00319 {
00320 int bNormalizationResult = _dSafeNormalize4(a);
00321 dIASSERT(bNormalizationResult);
00322 dVARIABLEUSED(bNormalizationResult);
00323 }
00324
00325 #endif // defined(__ODE__)
00326
00327
00328 ODE_API int dSafeNormalize3 (dVector3 a);
00329 ODE_API int dSafeNormalize4 (dVector4 a);
00330 ODE_API void dNormalize3 (dVector3 a);
00331 ODE_API void dNormalize4 (dVector4 a);
00332
00333 #if defined(__ODE__)
00334
00335
00336 #define dSafeNormalize3(a) _dSafeNormalize3(a)
00337 #define dSafeNormalize4(a) _dSafeNormalize4(a)
00338 #define dNormalize3(a) _dNormalize3(a)
00339 #define dNormalize4(a) _dNormalize4(a)
00340
00341 #endif // defined(__ODE__)
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 ODE_API void dPlaneSpace (const dVector3 n, dVector3 p, dVector3 q);
00352
00353 ODE_API void dOrthogonalizeR(dMatrix3 m);
00354
00355
00356
00357 #ifdef __cplusplus
00358 }
00359 #endif
00360
00361 #endif