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
00097 #if defined(dSINGLE)
00098 typedef float dReal;
00099 #ifdef dDOUBLE
00100 #error You can only #define dSINGLE or dDOUBLE, not both.
00101 #endif // dDOUBLE
00102 #elif defined(dDOUBLE)
00103 typedef double dReal;
00104 #else
00105 #error You must #define dSINGLE or dDOUBLE
00106 #endif
00107
00108
00109 #if dTRIMESH_ENABLED
00110 #if dTRIMESH_OPCODE && dTRIMESH_GIMPACT
00111 #error You can only #define dTRIMESH_OPCODE or dTRIMESH_GIMPACT, not both.
00112 #endif
00113 #endif // dTRIMESH_ENABLED
00114
00115
00116
00117
00118 #define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a))
00119
00120
00121 typedef dReal dVector3[4];
00122 typedef dReal dVector4[4];
00123 typedef dReal dMatrix3[4*3];
00124 typedef dReal dMatrix4[4*4];
00125 typedef dReal dMatrix6[8*6];
00126 typedef dReal dQuaternion[4];
00127
00128
00129
00130
00131 #if defined(dSINGLE)
00132
00133 #define REAL(x) (x ## f)
00134 #define dRecip(x) ((1.0f/(x)))
00135 #define dSqrt(x) (sqrtf(x))
00136 #define dRecipSqrt(x) ((1.0f/sqrtf(x)))
00137 #define dSin(x) (sinf(x))
00138 #define dCos(x) (cosf(x))
00139 #define dFabs(x) (fabsf(x))
00140 #define dAtan2(y,x) (atan2f(y,x))
00141 #define dFMod(a,b) (fmodf(a,b))
00142
00143 #ifdef HAVE___ISNANF
00144 #define dIsNan(x) (__isnanf(x))
00145 #elif defined(HAVE__ISNANF)
00146 #define dIsNan(x) (_isnanf(x))
00147 #elif defined(HAVE_ISNANF)
00148 #define dIsNan(x) (isnanf(x))
00149 #else
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 #define dIsNan(x) (_isnan(x))
00160 #endif
00161
00162 #define dCopySign(a,b) ((dReal)copysignf(a,b))
00163
00164 #elif defined(dDOUBLE)
00165
00166 #define REAL(x) (x)
00167 #define dRecip(x) (1.0/(x))
00168 #define dSqrt(x) sqrt(x)
00169 #define dRecipSqrt(x) (1.0/sqrt(x))
00170 #define dSin(x) sin(x)
00171 #define dCos(x) cos(x)
00172 #define dFabs(x) fabs(x)
00173 #define dAtan2(y,x) atan2((y),(x))
00174 #define dFMod(a,b) (fmod((a),(b)))
00175 #ifdef HAVE___ISNAN
00176 #define dIsNan(x) (__isnan(x))
00177 #elif defined(HAVE__ISNAN)
00178 #define dIsNan(x) (_isnan(x))
00179 #elif defined(HAVE_ISNAN)
00180 #define dIsNan(x) (isnan(x))
00181 #else
00182 #define dIsNan(x) (_isnan(x))
00183 #endif
00184
00185 #define dCopySign(a,b) (copysign((a),(b)))
00186
00187 #else
00188 #error You must #define dSINGLE or dDOUBLE
00189 #endif
00190
00191
00192
00193
00194
00195
00196
00197 #define dEFFICIENT_SIZE(x) ((((x)-1)|(EFFICIENT_ALIGNMENT-1))+1)
00198
00199
00200
00201
00202
00203
00204 #define dALLOCA16(n) \
00205 ((char*)dEFFICIENT_SIZE(((size_t)(alloca((n)+(EFFICIENT_ALIGNMENT-1))))))
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215 #ifdef dUSE_MALLOC_FOR_ALLOCA
00216 enum {
00217 d_MEMORY_OK = 0,
00218 d_MEMORY_OUT_OF_MEMORY
00219 };
00220
00221 #endif
00222
00223
00224
00225
00226
00227 struct dxWorld;
00228 struct dxSpace;
00229 struct dxBody;
00230 struct dxGeom;
00231 struct dxJoint;
00232 struct dxJointNode;
00233 struct dxJointGroup;
00234
00235 typedef struct dxWorld *dWorldID;
00236 typedef struct dxSpace *dSpaceID;
00237 typedef struct dxBody *dBodyID;
00238 typedef struct dxGeom *dGeomID;
00239 typedef struct dxJoint *dJointID;
00240 typedef struct dxJointGroup *dJointGroupID;
00241
00242
00243
00244
00245 enum {
00246 d_ERR_UNKNOWN = 0,
00247 d_ERR_IASSERT,
00248 d_ERR_UASSERT,
00249 d_ERR_LCP
00250 };
00251
00252
00253
00254
00255 enum {
00256 dJointTypeNone = 0,
00257 dJointTypeBall,
00258 dJointTypeHinge,
00259 dJointTypeSlider,
00260 dJointTypeContact,
00261 dJointTypeUniversal,
00262 dJointTypeHinge2,
00263 dJointTypeFixed,
00264 dJointTypeNull,
00265 dJointTypeAMotor,
00266 dJointTypeLMotor,
00267 dJointTypePlane2D,
00268 dJointTypePR
00269 };
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 #define D_ALL_PARAM_NAMES(start) \
00306 \
00307 dParamLoStop = start, \
00308 dParamHiStop, \
00309 dParamVel, \
00310 dParamFMax, \
00311 dParamFudgeFactor, \
00312 dParamBounce, \
00313 dParamCFM, \
00314 dParamStopERP, \
00315 dParamStopCFM, \
00316 \
00317 dParamSuspensionERP, \
00318 dParamSuspensionCFM,
00319
00320 #define D_ALL_PARAM_NAMES_X(start,x) \
00321 \
00322 dParamLoStop ## x = start, \
00323 dParamHiStop ## x, \
00324 dParamVel ## x, \
00325 dParamFMax ## x, \
00326 dParamFudgeFactor ## x, \
00327 dParamBounce ## x, \
00328 dParamCFM ## x, \
00329 dParamStopERP ## x, \
00330 dParamStopCFM ## x, \
00331 \
00332 dParamSuspensionERP ## x, \
00333 dParamSuspensionCFM ## x,
00334
00335 enum {
00336 D_ALL_PARAM_NAMES(0)
00337 D_ALL_PARAM_NAMES_X(0x100,2)
00338 D_ALL_PARAM_NAMES_X(0x200,3)
00339
00340
00341
00342
00343 dParamGroup=0x100
00344 };
00345
00346
00347
00348
00349 enum{
00350 dAMotorUser = 0,
00351 dAMotorEuler = 1
00352 };
00353
00354
00355
00356
00357 typedef struct dJointFeedback {
00358 dVector3 f1;
00359 dVector3 t1;
00360 dVector3 f2;
00361 dVector3 t2;
00362 } dJointFeedback;
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372 void dGeomMoved (dGeomID);
00373 dGeomID dGeomGetBodyNext (dGeomID);
00374
00375
00376 #ifdef __cplusplus
00377 }
00378 #endif
00379
00380 #endif