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_COMMON_H_
00024 #define _ODE_COMMON_H_
00025 #include <ode/config.h>
00026 #include <ode/error.h>
00027 #include <math.h>
00028
00029 #ifdef __cplusplus
00030 extern "C" {
00031 #endif
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 #define EFFICIENT_ALIGNMENT 16
00046
00047
00048
00049
00050
00051
00052
00053
00054 #ifndef M_PI
00055 #define M_PI REAL(3.1415926535897932384626433832795029)
00056 #endif
00057 #ifndef M_SQRT1_2
00058 #define M_SQRT1_2 REAL(0.7071067811865475244008443621048490)
00059 #endif
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 #ifndef dNODEBUG
00073 #ifdef __GNUC__
00074 #define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \
00075 "assertion \"" #a "\" failed in %s() [%s]",__FUNCTION__,__FILE__);
00076 #define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \
00077 msg " in %s()", __FUNCTION__);
00078 #define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \
00079 msg " in %s() File %s Line %d", __FUNCTION__, __FILE__,__LINE__);
00080 #else
00081 #define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \
00082 "assertion \"" #a "\" failed in %s:%d",__FILE__,__LINE__);
00083 #define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \
00084 msg " (%s:%d)", __FILE__,__LINE__);
00085 #define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \
00086 msg " (%s:%d)", __FILE__,__LINE__);
00087 #endif
00088 #else
00089 #define dIASSERT(a) ;
00090 #define dUASSERT(a,msg) ;
00091 #define dDEBUGMSG(msg) ;
00092 #endif
00093 #define dAASSERT(a) dUASSERT(a,"Bad argument(s)")
00094
00095
00096 #define dVARIABLEUSED(a) ((void)a)
00097
00098
00099
00100 #if defined(dSINGLE)
00101 typedef float dReal;
00102 #ifdef dDOUBLE
00103 #error You can only #define dSINGLE or dDOUBLE, not both.
00104 #endif // dDOUBLE
00105 #elif defined(dDOUBLE)
00106 typedef double dReal;
00107 #else
00108 #error You must #define dSINGLE or dDOUBLE
00109 #endif
00110
00111
00112 #if dTRIMESH_ENABLED
00113 #if dTRIMESH_OPCODE && dTRIMESH_GIMPACT
00114 #error You can only #define dTRIMESH_OPCODE or dTRIMESH_GIMPACT, not both.
00115 #endif
00116 #endif // dTRIMESH_ENABLED
00117
00118
00119
00120 #if dTRIMESH_16BIT_INDICES
00121 #if dTRIMESH_GIMPACT
00122 typedef uint32 dTriIndex;
00123 #else // dTRIMESH_GIMPACT
00124 typedef uint16 dTriIndex;
00125 #endif // dTRIMESH_GIMPACT
00126 #else // dTRIMESH_16BIT_INDICES
00127 typedef uint32 dTriIndex;
00128 #endif // dTRIMESH_16BIT_INDICES
00129
00130
00131
00132
00133 #define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a))
00134
00135
00136 typedef dReal dVector3[4];
00137 typedef dReal dVector4[4];
00138 typedef dReal dMatrix3[4*3];
00139 typedef dReal dMatrix4[4*4];
00140 typedef dReal dMatrix6[8*6];
00141 typedef dReal dQuaternion[4];
00142
00143
00144
00145
00146 #if defined(dSINGLE)
00147
00148 #define REAL(x) (x ## f)
00149 #define dRecip(x) ((1.0f/(x)))
00150 #define dSqrt(x) (sqrtf(x))
00151 #define dRecipSqrt(x) ((1.0f/sqrtf(x)))
00152 #define dSin(x) (sinf(x))
00153 #define dCos(x) (cosf(x))
00154 #define dFabs(x) (fabsf(x))
00155 #define dAtan2(y,x) (atan2f(y,x))
00156 #define dFMod(a,b) (fmodf(a,b))
00157 #define dFloor(x) floorf(x)
00158
00159 #ifdef HAVE___ISNANF
00160 #define dIsNan(x) (__isnanf(x))
00161 #elif defined(HAVE__ISNANF)
00162 #define dIsNan(x) (_isnanf(x))
00163 #elif defined(HAVE_ISNANF)
00164 #define dIsNan(x) (isnanf(x))
00165 #else
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 #define dIsNan(x) (_isnan(x))
00176 #endif
00177
00178 #define dCopySign(a,b) ((dReal)copysignf(a,b))
00179
00180 #elif defined(dDOUBLE)
00181
00182 #define REAL(x) (x)
00183 #define dRecip(x) (1.0/(x))
00184 #define dSqrt(x) sqrt(x)
00185 #define dRecipSqrt(x) (1.0/sqrt(x))
00186 #define dSin(x) sin(x)
00187 #define dCos(x) cos(x)
00188 #define dFabs(x) fabs(x)
00189 #define dAtan2(y,x) atan2((y),(x))
00190 #define dFMod(a,b) (fmod((a),(b)))
00191 #define dFloor(x) floor(x)
00192
00193 #ifdef HAVE___ISNAN
00194 #define dIsNan(x) (__isnan(x))
00195 #elif defined(HAVE__ISNAN)
00196 #define dIsNan(x) (_isnan(x))
00197 #elif defined(HAVE_ISNAN)
00198 #define dIsNan(x) (isnan(x))
00199 #else
00200 #define dIsNan(x) (_isnan(x))
00201 #endif
00202
00203 #define dCopySign(a,b) (copysign((a),(b)))
00204
00205 #else
00206 #error You must #define dSINGLE or dDOUBLE
00207 #endif
00208
00209
00210
00211
00212
00213
00214
00215 #define dEFFICIENT_SIZE(x) ((((x)-1)|(EFFICIENT_ALIGNMENT-1))+1)
00216
00217
00218
00219
00220
00221
00222 #define dALLOCA16(n) \
00223 ((char*)dEFFICIENT_SIZE(((size_t)(alloca((n)+(EFFICIENT_ALIGNMENT-1))))))
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 #ifdef dUSE_MALLOC_FOR_ALLOCA
00234 enum {
00235 d_MEMORY_OK = 0,
00236 d_MEMORY_OUT_OF_MEMORY
00237 };
00238
00239 #endif
00240
00241
00242
00243
00244
00245 struct dxWorld;
00246 struct dxSpace;
00247 struct dxBody;
00248 struct dxGeom;
00249 struct dxJoint;
00250 struct dxJointNode;
00251 struct dxJointGroup;
00252
00253 typedef struct dxWorld *dWorldID;
00254 typedef struct dxSpace *dSpaceID;
00255 typedef struct dxBody *dBodyID;
00256 typedef struct dxGeom *dGeomID;
00257 typedef struct dxJoint *dJointID;
00258 typedef struct dxJointGroup *dJointGroupID;
00259
00260
00261
00262
00263 enum {
00264 d_ERR_UNKNOWN = 0,
00265 d_ERR_IASSERT,
00266 d_ERR_UASSERT,
00267 d_ERR_LCP
00268 };
00269
00270
00271
00272
00273 enum {
00274 dJointTypeNone = 0,
00275 dJointTypeBall,
00276 dJointTypeHinge,
00277 dJointTypeSlider,
00278 dJointTypeContact,
00279 dJointTypeUniversal,
00280 dJointTypeHinge2,
00281 dJointTypeFixed,
00282 dJointTypeNull,
00283 dJointTypeAMotor,
00284 dJointTypeLMotor,
00285 dJointTypePlane2D,
00286 dJointTypePR,
00287 dJointTypePiston
00288 };
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324 #define D_ALL_PARAM_NAMES(start) \
00325 \
00326 dParamLoStop = start, \
00327 dParamHiStop, \
00328 dParamVel, \
00329 dParamFMax, \
00330 dParamFudgeFactor, \
00331 dParamBounce, \
00332 dParamCFM, \
00333 dParamStopERP, \
00334 dParamStopCFM, \
00335 \
00336 dParamSuspensionERP, \
00337 dParamSuspensionCFM, \
00338 dParamERP, \
00339
00348 #define D_ALL_PARAM_NAMES_X(start,x) \
00349 dParamGroup ## x = start, \
00350 \
00351 dParamLoStop ## x = start, \
00352 dParamHiStop ## x, \
00353 dParamVel ## x, \
00354 dParamFMax ## x, \
00355 dParamFudgeFactor ## x, \
00356 dParamBounce ## x, \
00357 dParamCFM ## x, \
00358 dParamStopERP ## x, \
00359 dParamStopCFM ## x, \
00360 \
00361 dParamSuspensionERP ## x, \
00362 dParamSuspensionCFM ## x, \
00363 dParamERP ## x,
00364
00365 enum {
00366 D_ALL_PARAM_NAMES(0)
00367 dParamsInGroup,
00368 D_ALL_PARAM_NAMES_X(0x000,1)
00369 D_ALL_PARAM_NAMES_X(0x100,2)
00370 D_ALL_PARAM_NAMES_X(0x200,3)
00371
00372
00373
00374
00375 dParamGroup=0x100
00376 };
00377
00378
00379
00380
00381 enum{
00382 dAMotorUser = 0,
00383 dAMotorEuler = 1
00384 };
00385
00386
00387
00388
00389 typedef struct dJointFeedback {
00390 dVector3 f1;
00391 dVector3 t1;
00392 dVector3 f2;
00393 dVector3 t2;
00394 } dJointFeedback;
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404 void dGeomMoved (dGeomID);
00405 dGeomID dGeomGetBodyNext (dGeomID);
00406
00407
00408 #ifdef __cplusplus
00409 }
00410 #endif
00411
00412 #endif