1 /************************************************************************* 2 * * 3 * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * 4 * All rights reserved. Email: russ@q12.org Web: www.q12.org * 5 * * 6 * This library is free software; you can redistribute it and/or * 7 * modify it under the terms of EITHER: * 8 * (1) The GNU Lesser General Public License as published by the Free * 9 * Software Foundation; either version 2.1 of the License, or (at * 10 * your option) any later version. The text of the GNU Lesser * 11 * General Public License is included with this library in the * 12 * file LICENSE.TXT. * 13 * (2) The BSD-style license that is included with this library in * 14 * the file LICENSE-BSD.TXT. * 15 * * 16 * This library is distributed in the hope that it will be useful, * 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * 19 * LICENSE.TXT and LICENSE-BSD.TXT for more details. * 20 * * 21 *************************************************************************/ 22 23 /* C++ interface for non-collision stuff */ 24 25 26 #ifndef _ODE_ODECPP_H_ 27 #define _ODE_ODECPP_H_ 28 #ifdef __cplusplus 29 30 31 32 33 //namespace ode { 34 35 36 class dWorldSimpleIDContainer { 37 protected: 38 dWorldID _id; 39 dWorldSimpleIDContainer()40 dWorldSimpleIDContainer(): _id(0) {} ~dWorldSimpleIDContainer()41 ~dWorldSimpleIDContainer() { destroy(); } 42 destroy()43 void destroy() { 44 if (_id) { 45 dWorldDestroy(_id); 46 _id = 0; 47 } 48 } 49 }; 50 51 class dWorldDynamicIDContainer: public dWorldSimpleIDContainer { 52 protected: ~dWorldDynamicIDContainer()53 virtual ~dWorldDynamicIDContainer() {} 54 }; 55 56 template <class dWorldTemplateBase> 57 class dWorldTemplate: public dWorldTemplateBase { 58 // intentionally undefined, don't use these 59 dWorldTemplate (const dWorldTemplate<dWorldTemplateBase> &); 60 void operator= (const dWorldTemplate<dWorldTemplateBase> &); 61 62 protected: get_id()63 dWorldID get_id() const { return dWorldTemplateBase::_id; } set_id(dWorldID value)64 void set_id(dWorldID value) { dWorldTemplateBase::_id = value; } 65 66 public: dWorldTemplate()67 dWorldTemplate() 68 { set_id(dWorldCreate()); } 69 id()70 dWorldID id() const 71 { return get_id(); } dWorldID()72 operator dWorldID() const 73 { return get_id(); } 74 setGravity(dReal x,dReal y,dReal z)75 void setGravity (dReal x, dReal y, dReal z) 76 { dWorldSetGravity (get_id(), x, y, z); } setGravity(const dVector3 g)77 void setGravity (const dVector3 g) 78 { setGravity (g[0], g[1], g[2]); } getGravity(dVector3 g)79 void getGravity (dVector3 g) const 80 { dWorldGetGravity (get_id(), g); } 81 setERP(dReal erp)82 void setERP (dReal erp) 83 { dWorldSetERP(get_id(), erp); } getERP()84 dReal getERP() const 85 { return dWorldGetERP(get_id()); } 86 setCFM(dReal cfm)87 void setCFM (dReal cfm) 88 { dWorldSetCFM(get_id(), cfm); } getCFM()89 dReal getCFM() const 90 { return dWorldGetCFM(get_id()); } 91 step(dReal stepsize)92 void step (dReal stepsize) 93 { dWorldStep (get_id(), stepsize); } 94 quickStep(dReal stepsize)95 void quickStep(dReal stepsize) 96 { dWorldQuickStep (get_id(), stepsize); } setQuickStepNumIterations(int num)97 void setQuickStepNumIterations(int num) 98 { dWorldSetQuickStepNumIterations (get_id(), num); } getQuickStepNumIterations()99 int getQuickStepNumIterations() const 100 { return dWorldGetQuickStepNumIterations (get_id()); } setQuickStepW(dReal over_relaxation)101 void setQuickStepW(dReal over_relaxation) 102 { dWorldSetQuickStepW (get_id(), over_relaxation); } getQuickStepW()103 dReal getQuickStepW() const 104 { return dWorldGetQuickStepW (get_id()); } 105 setAutoDisableLinearThreshold(dReal threshold)106 void setAutoDisableLinearThreshold (dReal threshold) 107 { dWorldSetAutoDisableLinearThreshold (get_id(), threshold); } getAutoDisableLinearThreshold()108 dReal getAutoDisableLinearThreshold() const 109 { return dWorldGetAutoDisableLinearThreshold (get_id()); } setAutoDisableAngularThreshold(dReal threshold)110 void setAutoDisableAngularThreshold (dReal threshold) 111 { dWorldSetAutoDisableAngularThreshold (get_id(), threshold); } getAutoDisableAngularThreshold()112 dReal getAutoDisableAngularThreshold() const 113 { return dWorldGetAutoDisableAngularThreshold (get_id()); } setAutoDisableSteps(int steps)114 void setAutoDisableSteps (int steps) 115 { dWorldSetAutoDisableSteps (get_id(), steps); } getAutoDisableSteps()116 int getAutoDisableSteps() const 117 { return dWorldGetAutoDisableSteps (get_id()); } setAutoDisableTime(dReal time)118 void setAutoDisableTime (dReal time) 119 { dWorldSetAutoDisableTime (get_id(), time); } getAutoDisableTime()120 dReal getAutoDisableTime() const 121 { return dWorldGetAutoDisableTime (get_id()); } setAutoDisableFlag(int do_auto_disable)122 void setAutoDisableFlag (int do_auto_disable) 123 { dWorldSetAutoDisableFlag (get_id(), do_auto_disable); } getAutoDisableFlag()124 int getAutoDisableFlag() const 125 { return dWorldGetAutoDisableFlag (get_id()); } 126 getLinearDampingThreshold()127 dReal getLinearDampingThreshold() const 128 { return dWorldGetLinearDampingThreshold(get_id()); } setLinearDampingThreshold(dReal threshold)129 void setLinearDampingThreshold(dReal threshold) 130 { dWorldSetLinearDampingThreshold(get_id(), threshold); } getAngularDampingThreshold()131 dReal getAngularDampingThreshold() const 132 { return dWorldGetAngularDampingThreshold(get_id()); } setAngularDampingThreshold(dReal threshold)133 void setAngularDampingThreshold(dReal threshold) 134 { dWorldSetAngularDampingThreshold(get_id(), threshold); } getLinearDamping()135 dReal getLinearDamping() const 136 { return dWorldGetLinearDamping(get_id()); } setLinearDamping(dReal scale)137 void setLinearDamping(dReal scale) 138 { dWorldSetLinearDamping(get_id(), scale); } getAngularDamping()139 dReal getAngularDamping() const 140 { return dWorldGetAngularDamping(get_id()); } setAngularDamping(dReal scale)141 void setAngularDamping(dReal scale) 142 { dWorldSetAngularDamping(get_id(), scale); } setDamping(dReal linear_scale,dReal angular_scale)143 void setDamping(dReal linear_scale, dReal angular_scale) 144 { dWorldSetDamping(get_id(), linear_scale, angular_scale); } 145 getMaxAngularSpeed()146 dReal getMaxAngularSpeed() const 147 { return dWorldGetMaxAngularSpeed(get_id()); } setMaxAngularSpeed(dReal max_speed)148 void setMaxAngularSpeed(dReal max_speed) 149 { dWorldSetMaxAngularSpeed(get_id(), max_speed); } 150 setContactSurfaceLayer(dReal depth)151 void setContactSurfaceLayer(dReal depth) 152 { dWorldSetContactSurfaceLayer (get_id(), depth); } getContactSurfaceLayer()153 dReal getContactSurfaceLayer() const 154 { return dWorldGetContactSurfaceLayer (get_id()); } 155 impulseToForce(dReal stepsize,dReal ix,dReal iy,dReal iz,dVector3 force)156 void impulseToForce (dReal stepsize, dReal ix, dReal iy, dReal iz, 157 dVector3 force) 158 { dWorldImpulseToForce (get_id(), stepsize, ix, iy, iz, force); } 159 }; 160 161 162 class dBodySimpleIDContainer { 163 protected: 164 dBodyID _id; 165 dBodySimpleIDContainer()166 dBodySimpleIDContainer(): _id(0) {} ~dBodySimpleIDContainer()167 ~dBodySimpleIDContainer() { destroy(); } 168 destroy()169 void destroy() { 170 if (_id) { 171 dBodyDestroy(_id); 172 _id = 0; 173 } 174 } 175 }; 176 177 class dBodyDynamicIDContainer: public dBodySimpleIDContainer { 178 protected: ~dBodyDynamicIDContainer()179 virtual ~dBodyDynamicIDContainer() {} 180 }; 181 182 template <class dBodyTemplateBase, class dWorldTemplateBase> 183 class dBodyTemplate: public dBodyTemplateBase { 184 // intentionally undefined, don't use these 185 dBodyTemplate (const dBodyTemplate<dBodyTemplateBase, dWorldTemplateBase> &); 186 void operator= (const dBodyTemplate<dBodyTemplateBase, dWorldTemplateBase> &); 187 188 protected: get_id()189 dBodyID get_id() const { return dBodyTemplateBase::_id; } set_id(dBodyID value)190 void set_id(dBodyID value) { dBodyTemplateBase::_id = value; } 191 destroy()192 void destroy() { dBodyTemplateBase::destroy(); } 193 194 public: dBodyTemplate()195 dBodyTemplate() 196 { } dBodyTemplate(dWorldID world)197 dBodyTemplate (dWorldID world) 198 { set_id(dBodyCreate(world)); } dBodyTemplate(dWorldTemplate<dWorldTemplateBase> & world)199 dBodyTemplate (dWorldTemplate<dWorldTemplateBase>& world) 200 { set_id(dBodyCreate(world.id())); } 201 create(dWorldID world)202 void create (dWorldID world) { 203 destroy(); 204 set_id(dBodyCreate(world)); 205 } create(dWorldTemplate<dWorldTemplateBase> & world)206 void create (dWorldTemplate<dWorldTemplateBase>& world) { 207 create(world.id()); 208 } 209 id()210 dBodyID id() const 211 { return get_id(); } dBodyID()212 operator dBodyID() const 213 { return get_id(); } 214 setData(void * data)215 void setData (void *data) 216 { dBodySetData (get_id(), data); } getData()217 void *getData() const 218 { return dBodyGetData (get_id()); } 219 setPosition(dReal x,dReal y,dReal z)220 void setPosition (dReal x, dReal y, dReal z) 221 { dBodySetPosition (get_id(), x, y, z); } setPosition(const dVector3 p)222 void setPosition (const dVector3 p) 223 { setPosition(p[0], p[1], p[2]); } 224 setRotation(const dMatrix3 R)225 void setRotation (const dMatrix3 R) 226 { dBodySetRotation (get_id(), R); } setQuaternion(const dQuaternion q)227 void setQuaternion (const dQuaternion q) 228 { dBodySetQuaternion (get_id(), q); } setLinearVel(dReal x,dReal y,dReal z)229 void setLinearVel (dReal x, dReal y, dReal z) 230 { dBodySetLinearVel (get_id(), x, y, z); } setLinearVel(const dVector3 v)231 void setLinearVel (const dVector3 v) 232 { setLinearVel(v[0], v[1], v[2]); } setAngularVel(dReal x,dReal y,dReal z)233 void setAngularVel (dReal x, dReal y, dReal z) 234 { dBodySetAngularVel (get_id(), x, y, z); } setAngularVel(const dVector3 v)235 void setAngularVel (const dVector3 v) 236 { setAngularVel (v[0], v[1], v[2]); } 237 getPosition()238 const dReal * getPosition() const 239 { return dBodyGetPosition (get_id()); } getRotation()240 const dReal * getRotation() const 241 { return dBodyGetRotation (get_id()); } getQuaternion()242 const dReal * getQuaternion() const 243 { return dBodyGetQuaternion (get_id()); } getLinearVel()244 const dReal * getLinearVel() const 245 { return dBodyGetLinearVel (get_id()); } getAngularVel()246 const dReal * getAngularVel() const 247 { return dBodyGetAngularVel (get_id()); } 248 setMass(const dMass * mass)249 void setMass (const dMass *mass) 250 { dBodySetMass (get_id(), mass); } setMass(const dMass & mass)251 void setMass (const dMass &mass) 252 { setMass (&mass); } getMass()253 dMass getMass () const 254 { dMass mass; dBodyGetMass (get_id(), &mass); return mass; } 255 addForce(dReal fx,dReal fy,dReal fz)256 void addForce (dReal fx, dReal fy, dReal fz) 257 { dBodyAddForce (get_id(), fx, fy, fz); } addForce(const dVector3 f)258 void addForce (const dVector3 f) 259 { addForce (f[0], f[1], f[2]); } addTorque(dReal fx,dReal fy,dReal fz)260 void addTorque (dReal fx, dReal fy, dReal fz) 261 { dBodyAddTorque (get_id(), fx, fy, fz); } addTorque(const dVector3 t)262 void addTorque (const dVector3 t) 263 { addTorque(t[0], t[1], t[2]); } 264 addRelForce(dReal fx,dReal fy,dReal fz)265 void addRelForce (dReal fx, dReal fy, dReal fz) 266 { dBodyAddRelForce (get_id(), fx, fy, fz); } addRelForce(const dVector3 f)267 void addRelForce (const dVector3 f) 268 { addRelForce (f[0], f[1], f[2]); } addRelTorque(dReal fx,dReal fy,dReal fz)269 void addRelTorque (dReal fx, dReal fy, dReal fz) 270 { dBodyAddRelTorque (get_id(), fx, fy, fz); } addRelTorque(const dVector3 t)271 void addRelTorque (const dVector3 t) 272 { addRelTorque (t[0], t[1], t[2]); } 273 addForceAtPos(dReal fx,dReal fy,dReal fz,dReal px,dReal py,dReal pz)274 void addForceAtPos (dReal fx, dReal fy, dReal fz, 275 dReal px, dReal py, dReal pz) 276 { dBodyAddForceAtPos (get_id(), fx, fy, fz, px, py, pz); } addForceAtPos(const dVector3 f,const dVector3 p)277 void addForceAtPos (const dVector3 f, const dVector3 p) 278 { addForceAtPos (f[0], f[1], f[2], p[0], p[1], p[2]); } 279 addForceAtRelPos(dReal fx,dReal fy,dReal fz,dReal px,dReal py,dReal pz)280 void addForceAtRelPos (dReal fx, dReal fy, dReal fz, 281 dReal px, dReal py, dReal pz) 282 { dBodyAddForceAtRelPos (get_id(), fx, fy, fz, px, py, pz); } addForceAtRelPos(const dVector3 f,const dVector3 p)283 void addForceAtRelPos (const dVector3 f, const dVector3 p) 284 { addForceAtRelPos (f[0], f[1], f[2], p[0], p[1], p[2]); } 285 addRelForceAtPos(dReal fx,dReal fy,dReal fz,dReal px,dReal py,dReal pz)286 void addRelForceAtPos (dReal fx, dReal fy, dReal fz, 287 dReal px, dReal py, dReal pz) 288 { dBodyAddRelForceAtPos (get_id(), fx, fy, fz, px, py, pz); } addRelForceAtPos(const dVector3 f,const dVector3 p)289 void addRelForceAtPos (const dVector3 f, const dVector3 p) 290 { addRelForceAtPos (f[0], f[1], f[2], p[0], p[1], p[2]); } 291 addRelForceAtRelPos(dReal fx,dReal fy,dReal fz,dReal px,dReal py,dReal pz)292 void addRelForceAtRelPos (dReal fx, dReal fy, dReal fz, 293 dReal px, dReal py, dReal pz) 294 { dBodyAddRelForceAtRelPos (get_id(), fx, fy, fz, px, py, pz); } addRelForceAtRelPos(const dVector3 f,const dVector3 p)295 void addRelForceAtRelPos (const dVector3 f, const dVector3 p) 296 { addRelForceAtRelPos (f[0], f[1], f[2], p[0], p[1], p[2]); } 297 getForce()298 const dReal * getForce() const 299 { return dBodyGetForce(get_id()); } getTorque()300 const dReal * getTorque() const 301 { return dBodyGetTorque(get_id()); } setForce(dReal x,dReal y,dReal z)302 void setForce (dReal x, dReal y, dReal z) 303 { dBodySetForce (get_id(), x, y, z); } setForce(const dVector3 f)304 void setForce (const dVector3 f) 305 { setForce (f[0], f[1], f[2]); } setTorque(dReal x,dReal y,dReal z)306 void setTorque (dReal x, dReal y, dReal z) 307 { dBodySetTorque (get_id(), x, y, z); } setTorque(const dVector3 t)308 void setTorque (const dVector3 t) 309 { setTorque (t[0], t[1], t[2]); } 310 setDynamic()311 void setDynamic() 312 { dBodySetDynamic (get_id()); } setKinematic()313 void setKinematic() 314 { dBodySetKinematic (get_id()); } isKinematic()315 bool isKinematic() const 316 { return dBodyIsKinematic (get_id()) != 0; } 317 enable()318 void enable() 319 { dBodyEnable (get_id()); } disable()320 void disable() 321 { dBodyDisable (get_id()); } isEnabled()322 bool isEnabled() const 323 { return dBodyIsEnabled (get_id()) != 0; } 324 getRelPointPos(dReal px,dReal py,dReal pz,dVector3 result)325 void getRelPointPos (dReal px, dReal py, dReal pz, dVector3 result) const 326 { dBodyGetRelPointPos (get_id(), px, py, pz, result); } getRelPointPos(const dVector3 p,dVector3 result)327 void getRelPointPos (const dVector3 p, dVector3 result) const 328 { getRelPointPos (p[0], p[1], p[2], result); } 329 getRelPointVel(dReal px,dReal py,dReal pz,dVector3 result)330 void getRelPointVel (dReal px, dReal py, dReal pz, dVector3 result) const 331 { dBodyGetRelPointVel (get_id(), px, py, pz, result); } getRelPointVel(const dVector3 p,dVector3 result)332 void getRelPointVel (const dVector3 p, dVector3 result) const 333 { getRelPointVel (p[0], p[1], p[2], result); } 334 getPointVel(dReal px,dReal py,dReal pz,dVector3 result)335 void getPointVel (dReal px, dReal py, dReal pz, dVector3 result) const 336 { dBodyGetPointVel (get_id(), px, py, pz, result); } getPointVel(const dVector3 p,dVector3 result)337 void getPointVel (const dVector3 p, dVector3 result) const 338 { getPointVel (p[0], p[1], p[2], result); } 339 getPosRelPoint(dReal px,dReal py,dReal pz,dVector3 result)340 void getPosRelPoint (dReal px, dReal py, dReal pz, dVector3 result) const 341 { dBodyGetPosRelPoint (get_id(), px, py, pz, result); } getPosRelPoint(const dVector3 p,dVector3 result)342 void getPosRelPoint (const dVector3 p, dVector3 result) const 343 { getPosRelPoint (p[0], p[1], p[2], result); } 344 vectorToWorld(dReal px,dReal py,dReal pz,dVector3 result)345 void vectorToWorld (dReal px, dReal py, dReal pz, dVector3 result) const 346 { dBodyVectorToWorld (get_id(), px, py, pz, result); } vectorToWorld(const dVector3 p,dVector3 result)347 void vectorToWorld (const dVector3 p, dVector3 result) const 348 { vectorToWorld (p[0], p[1], p[2], result); } 349 vectorFromWorld(dReal px,dReal py,dReal pz,dVector3 result)350 void vectorFromWorld (dReal px, dReal py, dReal pz, dVector3 result) const 351 { dBodyVectorFromWorld (get_id(), px, py, pz, result); } vectorFromWorld(const dVector3 p,dVector3 result)352 void vectorFromWorld (const dVector3 p, dVector3 result) const 353 { vectorFromWorld (p[0], p[1], p[2], result); } 354 setFiniteRotationMode(bool mode)355 void setFiniteRotationMode (bool mode) 356 { dBodySetFiniteRotationMode (get_id(), mode); } 357 setFiniteRotationAxis(dReal x,dReal y,dReal z)358 void setFiniteRotationAxis (dReal x, dReal y, dReal z) 359 { dBodySetFiniteRotationAxis (get_id(), x, y, z); } setFiniteRotationAxis(const dVector3 a)360 void setFiniteRotationAxis (const dVector3 a) 361 { setFiniteRotationAxis (a[0], a[1], a[2]); } 362 getFiniteRotationMode()363 bool getFiniteRotationMode() const 364 { return dBodyGetFiniteRotationMode (get_id()) != 0; } getFiniteRotationAxis(dVector3 result)365 void getFiniteRotationAxis (dVector3 result) const 366 { dBodyGetFiniteRotationAxis (get_id(), result); } 367 getNumJoints()368 int getNumJoints() const 369 { return dBodyGetNumJoints (get_id()); } getJoint(int index)370 dJointID getJoint (int index) const 371 { return dBodyGetJoint (get_id(), index); } 372 setGravityMode(bool mode)373 void setGravityMode (bool mode) 374 { dBodySetGravityMode (get_id(), mode); } getGravityMode()375 bool getGravityMode() const 376 { return dBodyGetGravityMode (get_id()) != 0; } 377 isConnectedTo(dBodyID body)378 bool isConnectedTo (dBodyID body) const 379 { return dAreConnected (get_id(), body) != 0; } 380 setAutoDisableLinearThreshold(dReal threshold)381 void setAutoDisableLinearThreshold (dReal threshold) 382 { dBodySetAutoDisableLinearThreshold (get_id(), threshold); } getAutoDisableLinearThreshold()383 dReal getAutoDisableLinearThreshold() const 384 { return dBodyGetAutoDisableLinearThreshold (get_id()); } setAutoDisableAngularThreshold(dReal threshold)385 void setAutoDisableAngularThreshold (dReal threshold) 386 { dBodySetAutoDisableAngularThreshold (get_id(), threshold); } getAutoDisableAngularThreshold()387 dReal getAutoDisableAngularThreshold() const 388 { return dBodyGetAutoDisableAngularThreshold (get_id()); } setAutoDisableSteps(int steps)389 void setAutoDisableSteps (int steps) 390 { dBodySetAutoDisableSteps (get_id(), steps); } getAutoDisableSteps()391 int getAutoDisableSteps() const 392 { return dBodyGetAutoDisableSteps (get_id()); } setAutoDisableTime(dReal time)393 void setAutoDisableTime (dReal time) 394 { dBodySetAutoDisableTime (get_id(), time); } getAutoDisableTime()395 dReal getAutoDisableTime() const 396 { return dBodyGetAutoDisableTime (get_id()); } setAutoDisableFlag(bool do_auto_disable)397 void setAutoDisableFlag (bool do_auto_disable) 398 { dBodySetAutoDisableFlag (get_id(), do_auto_disable); } getAutoDisableFlag()399 bool getAutoDisableFlag() const 400 { return dBodyGetAutoDisableFlag (get_id()) != 0; } 401 getLinearDamping()402 dReal getLinearDamping() const 403 { return dBodyGetLinearDamping(get_id()); } setLinearDamping(dReal scale)404 void setLinearDamping(dReal scale) 405 { dBodySetLinearDamping(get_id(), scale); } getAngularDamping()406 dReal getAngularDamping() const 407 { return dBodyGetAngularDamping(get_id()); } setAngularDamping(dReal scale)408 void setAngularDamping(dReal scale) 409 { dBodySetAngularDamping(get_id(), scale); } setDamping(dReal linear_scale,dReal angular_scale)410 void setDamping(dReal linear_scale, dReal angular_scale) 411 { dBodySetDamping(get_id(), linear_scale, angular_scale); } getLinearDampingThreshold()412 dReal getLinearDampingThreshold() const 413 { return dBodyGetLinearDampingThreshold(get_id()); } setLinearDampingThreshold(dReal threshold)414 void setLinearDampingThreshold(dReal threshold) const 415 { dBodySetLinearDampingThreshold(get_id(), threshold); } getAngularDampingThreshold()416 dReal getAngularDampingThreshold() const 417 { return dBodyGetAngularDampingThreshold(get_id()); } setAngularDampingThreshold(dReal threshold)418 void setAngularDampingThreshold(dReal threshold) 419 { dBodySetAngularDampingThreshold(get_id(), threshold); } setDampingDefaults()420 void setDampingDefaults() 421 { dBodySetDampingDefaults(get_id()); } 422 getMaxAngularSpeed()423 dReal getMaxAngularSpeed() const 424 { return dBodyGetMaxAngularSpeed(get_id()); } setMaxAngularSpeed(dReal max_speed)425 void setMaxAngularSpeed(dReal max_speed) 426 { dBodySetMaxAngularSpeed(get_id(), max_speed); } 427 getGyroscopicMode()428 bool getGyroscopicMode() const 429 { return dBodyGetGyroscopicMode(get_id()) != 0; } setGyroscopicMode(bool mode)430 void setGyroscopicMode(bool mode) 431 { dBodySetGyroscopicMode(get_id(), mode); } 432 433 }; 434 435 436 class dJointGroupSimpleIDContainer { 437 protected: 438 dJointGroupID _id; 439 dJointGroupSimpleIDContainer()440 dJointGroupSimpleIDContainer(): _id(0) {} ~dJointGroupSimpleIDContainer()441 ~dJointGroupSimpleIDContainer() { destroy(); } 442 destroy()443 void destroy() { 444 if (_id) { 445 dJointGroupDestroy(_id); 446 _id = 0; 447 } 448 } 449 }; 450 451 class dJointGroupDynamicIDContainer: public dJointGroupSimpleIDContainer { 452 protected: ~dJointGroupDynamicIDContainer()453 virtual ~dJointGroupDynamicIDContainer() {} 454 }; 455 456 template <class dJointGroupTemplateBase> 457 class dJointGroupTemplate: public dJointGroupTemplateBase { 458 // intentionally undefined, don't use these 459 dJointGroupTemplate (const dJointGroupTemplate<dJointGroupTemplateBase> &); 460 void operator= (const dJointGroupTemplate<dJointGroupTemplateBase> &); 461 462 protected: get_id()463 dJointGroupID get_id() const { return dJointGroupTemplateBase::_id; } set_id(dJointGroupID value)464 void set_id(dJointGroupID value) { dJointGroupTemplateBase::_id = value; } 465 destroy()466 void destroy() { dJointGroupTemplateBase::destroy(); } 467 468 public: dJointGroupTemplate()469 dJointGroupTemplate () 470 { set_id(dJointGroupCreate(0)); } 471 create()472 void create () { 473 destroy(); 474 set_id(dJointGroupCreate(0)); 475 } 476 id()477 dJointGroupID id() const 478 { return get_id(); } dJointGroupID()479 operator dJointGroupID() const 480 { return get_id(); } 481 empty()482 void empty() 483 { dJointGroupEmpty (get_id()); } clear()484 void clear() 485 { empty(); } 486 }; 487 488 489 class dJointSimpleIDContainer { 490 protected: 491 dJointID _id; 492 dJointSimpleIDContainer()493 dJointSimpleIDContainer(): _id(0) {} ~dJointSimpleIDContainer()494 ~dJointSimpleIDContainer() { destroy(); } 495 destroy()496 void destroy() { 497 if (_id) { 498 dJointDestroy (_id); 499 _id = 0; 500 } 501 } 502 }; 503 504 class dJointDynamicIDContainer: public dJointSimpleIDContainer { 505 protected: ~dJointDynamicIDContainer()506 virtual ~dJointDynamicIDContainer() {} 507 }; 508 509 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 510 class dJointTemplate: public dJointTemplateBase { 511 private: 512 // intentionally undefined, don't use these 513 dJointTemplate (const dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &) ; 514 void operator= (const dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 515 516 protected: get_id()517 dJointID get_id() const { return dJointTemplateBase::_id; } set_id(dJointID value)518 void set_id(dJointID value) { dJointTemplateBase::_id = value; } 519 destroy()520 void destroy() { dJointTemplateBase::destroy(); } 521 522 protected: dJointTemplate()523 dJointTemplate() // don't let user construct pure dJointTemplate objects 524 { } 525 526 public: id()527 dJointID id() const 528 { return get_id(); } dJointID()529 operator dJointID() const 530 { return get_id(); } 531 getNumBodies()532 int getNumBodies() const 533 { return dJointGetNumBodies(get_id()); } 534 attach(dBodyID body1,dBodyID body2)535 void attach (dBodyID body1, dBodyID body2) 536 { dJointAttach (get_id(), body1, body2); } attach(dBodyTemplate<dBodyTemplateBase,dWorldTemplateBase> & body1,dBodyTemplate<dBodyTemplateBase,dWorldTemplateBase> & body2)537 void attach (dBodyTemplate<dBodyTemplateBase, dWorldTemplateBase>& body1, dBodyTemplate<dBodyTemplateBase, dWorldTemplateBase>& body2) 538 { attach(body1.id(), body2.id()); } 539 enable()540 void enable() 541 { dJointEnable (get_id()); } disable()542 void disable() 543 { dJointDisable (get_id()); } isEnabled()544 bool isEnabled() const 545 { return dJointIsEnabled (get_id()) != 0; } 546 setData(void * data)547 void setData (void *data) 548 { dJointSetData (get_id(), data); } getData()549 void *getData() const 550 { return dJointGetData (get_id()); } 551 getType()552 dJointType getType() const 553 { return dJointGetType (get_id()); } 554 getBody(int index)555 dBodyID getBody (int index) const 556 { return dJointGetBody (get_id(), index); } 557 setFeedback(dJointFeedback * fb)558 void setFeedback(dJointFeedback *fb) 559 { dJointSetFeedback(get_id(), fb); } getFeedback()560 dJointFeedback *getFeedback() const 561 { return dJointGetFeedback(get_id()); } 562 563 // If not implemented it will do nothing as describe in the doc setParam(int,dReal)564 virtual void setParam (int, dReal) {}; getParam(int)565 virtual dReal getParam (int) const { return 0; } 566 }; 567 568 569 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 570 class dBallJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 571 private: 572 // intentionally undefined, don't use these 573 dBallJointTemplate (const dBallJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 574 void operator= (const dBallJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 575 576 protected: 577 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 578 get_id()579 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)580 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 581 destroy()582 void destroy() { dBaseTemplate::destroy(); } 583 584 public: dBallJointTemplate()585 dBallJointTemplate() { } 586 dBallJointTemplate (dWorldID world, dJointGroupID group=0) 587 { set_id(dJointCreateBall(world, group)); } 588 dBallJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 589 { set_id(dJointCreateBall(world.id(), group)); } 590 591 void create (dWorldID world, dJointGroupID group=0) { 592 destroy(); 593 set_id(dJointCreateBall(world, group)); 594 } 595 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 596 { create(world.id(), group); } 597 setAnchor(dReal x,dReal y,dReal z)598 void setAnchor (dReal x, dReal y, dReal z) 599 { dJointSetBallAnchor (get_id(), x, y, z); } setAnchor(const dVector3 a)600 void setAnchor (const dVector3 a) 601 { setAnchor (a[0], a[1], a[2]); } getAnchor(dVector3 result)602 void getAnchor (dVector3 result) const 603 { dJointGetBallAnchor (get_id(), result); } getAnchor2(dVector3 result)604 void getAnchor2 (dVector3 result) const 605 { dJointGetBallAnchor2 (get_id(), result); } setParam(int parameter,dReal value)606 virtual void setParam (int parameter, dReal value) 607 { dJointSetBallParam (get_id(), parameter, value); } getParam(int parameter)608 virtual dReal getParam (int parameter) const 609 { return dJointGetBallParam (get_id(), parameter); } 610 // TODO: expose params through methods 611 } ; 612 613 614 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 615 class dHingeJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 616 private: 617 // intentionally undefined, don't use these 618 dHingeJointTemplate (const dHingeJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 619 void operator = (const dHingeJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 620 621 protected: 622 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 623 get_id()624 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)625 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 626 destroy()627 void destroy() { dBaseTemplate::destroy(); } 628 629 public: dHingeJointTemplate()630 dHingeJointTemplate() { } 631 dHingeJointTemplate (dWorldID world, dJointGroupID group=0) 632 { set_id(dJointCreateHinge(world, group)); } 633 dHingeJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 634 { set_id(dJointCreateHinge(world.id(), group)); } 635 636 void create (dWorldID world, dJointGroupID group=0) { 637 destroy(); 638 set_id(dJointCreateHinge (world, group)); 639 } 640 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 641 { create(world.id(), group); } 642 setAnchor(dReal x,dReal y,dReal z)643 void setAnchor (dReal x, dReal y, dReal z) 644 { dJointSetHingeAnchor (get_id(), x, y, z); } setAnchor(const dVector3 a)645 void setAnchor (const dVector3 a) 646 { setAnchor (a[0], a[1], a[2]); } getAnchor(dVector3 result)647 void getAnchor (dVector3 result) const 648 { dJointGetHingeAnchor (get_id(), result); } getAnchor2(dVector3 result)649 void getAnchor2 (dVector3 result) const 650 { dJointGetHingeAnchor2 (get_id(), result); } 651 setAxis(dReal x,dReal y,dReal z)652 void setAxis (dReal x, dReal y, dReal z) 653 { dJointSetHingeAxis (get_id(), x, y, z); } setAxis(const dVector3 a)654 void setAxis (const dVector3 a) 655 { setAxis(a[0], a[1], a[2]); } getAxis(dVector3 result)656 void getAxis (dVector3 result) const 657 { dJointGetHingeAxis (get_id(), result); } 658 getAngle()659 dReal getAngle() const 660 { return dJointGetHingeAngle (get_id()); } getAngleRate()661 dReal getAngleRate() const 662 { return dJointGetHingeAngleRate (get_id()); } 663 setParam(int parameter,dReal value)664 virtual void setParam (int parameter, dReal value) 665 { dJointSetHingeParam (get_id(), parameter, value); } getParam(int parameter)666 virtual dReal getParam (int parameter) const 667 { return dJointGetHingeParam (get_id(), parameter); } 668 // TODO: expose params through methods 669 addTorque(dReal torque)670 void addTorque (dReal torque) 671 { dJointAddHingeTorque(get_id(), torque); } 672 }; 673 674 675 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 676 class dSliderJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 677 private: 678 // intentionally undefined, don't use these 679 dSliderJointTemplate (const dSliderJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 680 void operator = (const dSliderJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 681 682 protected: 683 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 684 get_id()685 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)686 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 687 destroy()688 void destroy() { dBaseTemplate::destroy(); } 689 690 public: dSliderJointTemplate()691 dSliderJointTemplate() { } 692 dSliderJointTemplate (dWorldID world, dJointGroupID group=0) 693 { set_id(dJointCreateSlider(world, group)); } 694 dSliderJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 695 { set_id(dJointCreateSlider(world.id(), group)); } 696 697 void create (dWorldID world, dJointGroupID group=0) { 698 destroy(); 699 set_id(dJointCreateSlider(world, group)); 700 } 701 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 702 { create(world.id(), group); } 703 setAxis(dReal x,dReal y,dReal z)704 void setAxis (dReal x, dReal y, dReal z) 705 { dJointSetSliderAxis (get_id(), x, y, z); } setAxis(const dVector3 a)706 void setAxis (const dVector3 a) 707 { setAxis (a[0], a[1], a[2]); } getAxis(dVector3 result)708 void getAxis (dVector3 result) const 709 { dJointGetSliderAxis (get_id(), result); } 710 getPosition()711 dReal getPosition() const 712 { return dJointGetSliderPosition (get_id()); } getPositionRate()713 dReal getPositionRate() const 714 { return dJointGetSliderPositionRate (get_id()); } 715 setParam(int parameter,dReal value)716 virtual void setParam (int parameter, dReal value) 717 { dJointSetSliderParam (get_id(), parameter, value); } getParam(int parameter)718 virtual dReal getParam (int parameter) const 719 { return dJointGetSliderParam (get_id(), parameter); } 720 // TODO: expose params through methods 721 addForce(dReal force)722 void addForce (dReal force) 723 { dJointAddSliderForce(get_id(), force); } 724 }; 725 726 727 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 728 class dUniversalJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 729 private: 730 // intentionally undefined, don't use these 731 dUniversalJointTemplate (const dUniversalJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 732 void operator = (const dUniversalJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 733 734 protected: 735 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 736 get_id()737 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)738 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 739 destroy()740 void destroy() { dBaseTemplate::destroy(); } 741 742 public: dUniversalJointTemplate()743 dUniversalJointTemplate() { } 744 dUniversalJointTemplate (dWorldID world, dJointGroupID group=0) 745 { set_id(dJointCreateUniversal(world, group)); } 746 dUniversalJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 747 { set_id(dJointCreateUniversal(world.id(), group)); } 748 749 void create (dWorldID world, dJointGroupID group=0) { 750 destroy(); 751 set_id(dJointCreateUniversal(world, group)); 752 } 753 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 754 { create(world.id(), group); } 755 setAnchor(dReal x,dReal y,dReal z)756 void setAnchor (dReal x, dReal y, dReal z) 757 { dJointSetUniversalAnchor (get_id(), x, y, z); } setAnchor(const dVector3 a)758 void setAnchor (const dVector3 a) 759 { setAnchor(a[0], a[1], a[2]); } setAxis1(dReal x,dReal y,dReal z)760 void setAxis1 (dReal x, dReal y, dReal z) 761 { dJointSetUniversalAxis1 (get_id(), x, y, z); } setAxis1(const dVector3 a)762 void setAxis1 (const dVector3 a) 763 { setAxis1 (a[0], a[1], a[2]); } setAxis2(dReal x,dReal y,dReal z)764 void setAxis2 (dReal x, dReal y, dReal z) 765 { dJointSetUniversalAxis2 (get_id(), x, y, z); } setAxis2(const dVector3 a)766 void setAxis2 (const dVector3 a) 767 { setAxis2 (a[0], a[1], a[2]); } 768 getAnchor(dVector3 result)769 void getAnchor (dVector3 result) const 770 { dJointGetUniversalAnchor (get_id(), result); } getAnchor2(dVector3 result)771 void getAnchor2 (dVector3 result) const 772 { dJointGetUniversalAnchor2 (get_id(), result); } getAxis1(dVector3 result)773 void getAxis1 (dVector3 result) const 774 { dJointGetUniversalAxis1 (get_id(), result); } getAxis2(dVector3 result)775 void getAxis2 (dVector3 result) const 776 { dJointGetUniversalAxis2 (get_id(), result); } 777 setParam(int parameter,dReal value)778 virtual void setParam (int parameter, dReal value) 779 { dJointSetUniversalParam (get_id(), parameter, value); } getParam(int parameter)780 virtual dReal getParam (int parameter) const 781 { return dJointGetUniversalParam (get_id(), parameter); } 782 // TODO: expose params through methods 783 getAngles(dReal * angle1,dReal * angle2)784 void getAngles(dReal *angle1, dReal *angle2) const 785 { dJointGetUniversalAngles (get_id(), angle1, angle2); } 786 getAngle1()787 dReal getAngle1() const 788 { return dJointGetUniversalAngle1 (get_id()); } getAngle1Rate()789 dReal getAngle1Rate() const 790 { return dJointGetUniversalAngle1Rate (get_id()); } getAngle2()791 dReal getAngle2() const 792 { return dJointGetUniversalAngle2 (get_id()); } getAngle2Rate()793 dReal getAngle2Rate() const 794 { return dJointGetUniversalAngle2Rate (get_id()); } 795 addTorques(dReal torque1,dReal torque2)796 void addTorques (dReal torque1, dReal torque2) 797 { dJointAddUniversalTorques(get_id(), torque1, torque2); } 798 }; 799 800 801 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 802 class dHinge2JointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 803 private: 804 // intentionally undefined, don't use these 805 dHinge2JointTemplate (const dHinge2JointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 806 void operator = (const dHinge2JointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 807 808 protected: 809 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 810 get_id()811 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)812 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 813 destroy()814 void destroy() { dBaseTemplate::destroy(); } 815 816 public: dHinge2JointTemplate()817 dHinge2JointTemplate() { } 818 dHinge2JointTemplate (dWorldID world, dJointGroupID group=0) 819 { set_id(dJointCreateHinge2(world, group)); } 820 dHinge2JointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 821 { set_id(dJointCreateHinge2(world.id(), group)); } 822 823 void create (dWorldID world, dJointGroupID group=0) { 824 destroy(); 825 set_id(dJointCreateHinge2(world, group)); 826 } 827 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 828 { create(world.id(), group); } 829 setAnchor(dReal x,dReal y,dReal z)830 void setAnchor (dReal x, dReal y, dReal z) 831 { dJointSetHinge2Anchor (get_id(), x, y, z); } setAnchor(const dVector3 a)832 void setAnchor (const dVector3 a) 833 { setAnchor(a[0], a[1], a[2]); } setAxis1(dReal x,dReal y,dReal z)834 void setAxis1 (dReal x, dReal y, dReal z) 835 { dJointSetHinge2Axis1 (get_id(), x, y, z); } setAxis1(const dVector3 a)836 void setAxis1 (const dVector3 a) 837 { setAxis1 (a[0], a[1], a[2]); } setAxis2(dReal x,dReal y,dReal z)838 void setAxis2 (dReal x, dReal y, dReal z) 839 { dJointSetHinge2Axis2 (get_id(), x, y, z); } setAxis2(const dVector3 a)840 void setAxis2 (const dVector3 a) 841 { setAxis2 (a[0], a[1], a[2]); } 842 getAnchor(dVector3 result)843 void getAnchor (dVector3 result) const 844 { dJointGetHinge2Anchor (get_id(), result); } getAnchor2(dVector3 result)845 void getAnchor2 (dVector3 result) const 846 { dJointGetHinge2Anchor2 (get_id(), result); } getAxis1(dVector3 result)847 void getAxis1 (dVector3 result) const 848 { dJointGetHinge2Axis1 (get_id(), result); } getAxis2(dVector3 result)849 void getAxis2 (dVector3 result) const 850 { dJointGetHinge2Axis2 (get_id(), result); } 851 getAngle1()852 dReal getAngle1() const 853 { return dJointGetHinge2Angle1 (get_id()); } getAngle1Rate()854 dReal getAngle1Rate() const 855 { return dJointGetHinge2Angle1Rate (get_id()); } getAngle2Rate()856 dReal getAngle2Rate() const 857 { return dJointGetHinge2Angle2Rate (get_id()); } 858 setParam(int parameter,dReal value)859 virtual void setParam (int parameter, dReal value) 860 { dJointSetHinge2Param (get_id(), parameter, value); } getParam(int parameter)861 virtual dReal getParam (int parameter) const 862 { return dJointGetHinge2Param (get_id(), parameter); } 863 // TODO: expose params through methods 864 addTorques(dReal torque1,dReal torque2)865 void addTorques(dReal torque1, dReal torque2) 866 { dJointAddHinge2Torques(get_id(), torque1, torque2); } 867 }; 868 869 870 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 871 class dPRJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 872 private: 873 // intentionally undefined, don't use these 874 dPRJointTemplate (const dPRJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 875 void operator = (const dPRJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 876 877 protected: 878 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 879 get_id()880 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)881 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 882 destroy()883 void destroy() { dBaseTemplate::destroy(); } 884 885 public: dPRJointTemplate()886 dPRJointTemplate() { } 887 dPRJointTemplate (dWorldID world, dJointGroupID group=0) 888 { set_id(dJointCreatePR(world, group)); } 889 dPRJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 890 { set_id(dJointCreatePR(world.id(), group)); } 891 892 void create (dWorldID world, dJointGroupID group=0) { 893 destroy(); 894 set_id(dJointCreatePR(world, group)); 895 } 896 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 897 { create(world.id(), group); } 898 setAnchor(dReal x,dReal y,dReal z)899 void setAnchor (dReal x, dReal y, dReal z) 900 { dJointSetPRAnchor (get_id(), x, y, z); } setAnchor(const dVector3 a)901 void setAnchor (const dVector3 a) 902 { setAnchor (a[0], a[1], a[2]); } setAxis1(dReal x,dReal y,dReal z)903 void setAxis1 (dReal x, dReal y, dReal z) 904 { dJointSetPRAxis1 (get_id(), x, y, z); } setAxis1(const dVector3 a)905 void setAxis1 (const dVector3 a) 906 { setAxis1(a[0], a[1], a[2]); } setAxis2(dReal x,dReal y,dReal z)907 void setAxis2 (dReal x, dReal y, dReal z) 908 { dJointSetPRAxis2 (get_id(), x, y, z); } setAxis2(const dVector3 a)909 void setAxis2 (const dVector3 a) 910 { setAxis2(a[0], a[1], a[2]); } 911 getAnchor(dVector3 result)912 void getAnchor (dVector3 result) const 913 { dJointGetPRAnchor (get_id(), result); } getAxis1(dVector3 result)914 void getAxis1 (dVector3 result) const 915 { dJointGetPRAxis1 (get_id(), result); } getAxis2(dVector3 result)916 void getAxis2 (dVector3 result) const 917 { dJointGetPRAxis2 (get_id(), result); } 918 getPosition()919 dReal getPosition() const 920 { return dJointGetPRPosition (get_id()); } getPositionRate()921 dReal getPositionRate() const 922 { return dJointGetPRPositionRate (get_id()); } 923 getAngle()924 dReal getAngle() const 925 { return dJointGetPRAngle (get_id()); } getAngleRate()926 dReal getAngleRate() const 927 { return dJointGetPRAngleRate (get_id()); } 928 setParam(int parameter,dReal value)929 virtual void setParam (int parameter, dReal value) 930 { dJointSetPRParam (get_id(), parameter, value); } getParam(int parameter)931 virtual dReal getParam (int parameter) const 932 { return dJointGetPRParam (get_id(), parameter); } 933 }; 934 935 936 937 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 938 class dPUJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> 939 { 940 private: 941 // intentionally undefined, don't use these 942 dPUJointTemplate (const dPUJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 943 void operator = (const dPUJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 944 945 protected: 946 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 947 get_id()948 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)949 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 950 destroy()951 void destroy() { dBaseTemplate::destroy(); } 952 953 public: dPUJointTemplate()954 dPUJointTemplate() { } 955 dPUJointTemplate (dWorldID world, dJointGroupID group=0) 956 { set_id(dJointCreatePU(world, group)); } 957 dPUJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 958 { set_id(dJointCreatePU(world.id(), group)); } 959 960 void create (dWorldID world, dJointGroupID group=0) 961 { 962 destroy(); 963 set_id(dJointCreatePU(world, group)); 964 } 965 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 966 { create(world.id(), group); } 967 setAnchor(dReal x,dReal y,dReal z)968 void setAnchor (dReal x, dReal y, dReal z) 969 { dJointSetPUAnchor (get_id(), x, y, z); } setAnchor(const dVector3 a)970 void setAnchor (const dVector3 a) 971 { setAnchor (a[0], a[1], a[2]); } setAxis1(dReal x,dReal y,dReal z)972 void setAxis1 (dReal x, dReal y, dReal z) 973 { dJointSetPUAxis1 (get_id(), x, y, z); } setAxis1(const dVector3 a)974 void setAxis1 (const dVector3 a) 975 { setAxis1(a[0], a[1], a[2]); } setAxis2(dReal x,dReal y,dReal z)976 void setAxis2 (dReal x, dReal y, dReal z) 977 { dJointSetPUAxis2 (get_id(), x, y, z); } setAxis3(dReal x,dReal y,dReal z)978 void setAxis3 (dReal x, dReal y, dReal z) 979 { dJointSetPUAxis3 (get_id(), x, y, z); } setAxis3(const dVector3 a)980 void setAxis3 (const dVector3 a) 981 { setAxis3(a[0], a[1], a[2]); } setAxisP(dReal x,dReal y,dReal z)982 void setAxisP (dReal x, dReal y, dReal z) 983 { dJointSetPUAxis3 (get_id(), x, y, z); } setAxisP(const dVector3 a)984 void setAxisP (const dVector3 a) 985 { setAxisP(a[0], a[1], a[2]); } 986 getAnchor(dVector3 result)987 virtual void getAnchor (dVector3 result) const 988 { dJointGetPUAnchor (get_id(), result); } getAxis1(dVector3 result)989 void getAxis1 (dVector3 result) const 990 { dJointGetPUAxis1 (get_id(), result); } getAxis2(dVector3 result)991 void getAxis2 (dVector3 result) const 992 { dJointGetPUAxis2 (get_id(), result); } getAxis3(dVector3 result)993 void getAxis3 (dVector3 result) const 994 { dJointGetPUAxis3 (get_id(), result); } getAxisP(dVector3 result)995 void getAxisP (dVector3 result) const 996 { dJointGetPUAxis3 (get_id(), result); } 997 getAngle1()998 dReal getAngle1() const 999 { return dJointGetPUAngle1 (get_id()); } getAngle1Rate()1000 dReal getAngle1Rate() const 1001 { return dJointGetPUAngle1Rate (get_id()); } getAngle2()1002 dReal getAngle2() const 1003 { return dJointGetPUAngle2 (get_id()); } getAngle2Rate()1004 dReal getAngle2Rate() const 1005 { return dJointGetPUAngle2Rate (get_id()); } 1006 getPosition()1007 dReal getPosition() const 1008 { return dJointGetPUPosition (get_id()); } getPositionRate()1009 dReal getPositionRate() const 1010 { return dJointGetPUPositionRate (get_id()); } 1011 setParam(int parameter,dReal value)1012 virtual void setParam (int parameter, dReal value) 1013 { dJointSetPUParam (get_id(), parameter, value); } getParam(int parameter)1014 virtual dReal getParam (int parameter) const 1015 { return dJointGetPUParam (get_id(), parameter); } 1016 // TODO: expose params through methods 1017 }; 1018 1019 1020 1021 1022 1023 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 1024 class dPistonJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> 1025 { 1026 private: 1027 // intentionally undefined, don't use these 1028 dPistonJointTemplate (const dPistonJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1029 void operator = (const dPistonJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1030 1031 protected: 1032 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 1033 get_id()1034 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)1035 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 1036 destroy()1037 void destroy() { dBaseTemplate::destroy(); } 1038 1039 public: dPistonJointTemplate()1040 dPistonJointTemplate() { } 1041 dPistonJointTemplate (dWorldID world, dJointGroupID group=0) 1042 { set_id(dJointCreatePiston(world, group)); } 1043 dPistonJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1044 { set_id(dJointCreatePiston(world, group)); } 1045 1046 void create (dWorldID world, dJointGroupID group=0) 1047 { 1048 destroy(); 1049 set_id(dJointCreatePiston(world, group)); 1050 } 1051 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1052 { create(world.id(), group); } 1053 setAnchor(dReal x,dReal y,dReal z)1054 void setAnchor (dReal x, dReal y, dReal z) 1055 { dJointSetPistonAnchor (get_id(), x, y, z); } setAnchor(const dVector3 a)1056 void setAnchor (const dVector3 a) 1057 { setAnchor (a[0], a[1], a[2]); } getAnchor(dVector3 result)1058 void getAnchor (dVector3 result) const 1059 { dJointGetPistonAnchor (get_id(), result); } getAnchor2(dVector3 result)1060 void getAnchor2 (dVector3 result) const 1061 { dJointGetPistonAnchor2 (get_id(), result); } 1062 setAxis(dReal x,dReal y,dReal z)1063 void setAxis (dReal x, dReal y, dReal z) 1064 { dJointSetPistonAxis (get_id(), x, y, z); } setAxis(const dVector3 a)1065 void setAxis (const dVector3 a) 1066 { setAxis(a[0], a[1], a[2]); } getAxis(dVector3 result)1067 void getAxis (dVector3 result) const 1068 { dJointGetPistonAxis (get_id(), result); } 1069 getPosition()1070 dReal getPosition() const 1071 { return dJointGetPistonPosition (get_id()); } getPositionRate()1072 dReal getPositionRate() const 1073 { return dJointGetPistonPositionRate (get_id()); } 1074 setParam(int parameter,dReal value)1075 virtual void setParam (int parameter, dReal value) 1076 { dJointSetPistonParam (get_id(), parameter, value); } getParam(int parameter)1077 virtual dReal getParam (int parameter) const 1078 { return dJointGetPistonParam (get_id(), parameter); } 1079 // TODO: expose params through methods 1080 addForce(dReal force)1081 void addForce (dReal force) 1082 { dJointAddPistonForce (get_id(), force); } 1083 }; 1084 1085 1086 1087 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 1088 class dFixedJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> 1089 { 1090 private: 1091 // intentionally undefined, don't use these 1092 dFixedJointTemplate (const dFixedJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1093 void operator = (const dFixedJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1094 1095 protected: 1096 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 1097 get_id()1098 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)1099 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 1100 destroy()1101 void destroy() { dBaseTemplate::destroy(); } 1102 1103 public: dFixedJointTemplate()1104 dFixedJointTemplate() { } 1105 dFixedJointTemplate (dWorldID world, dJointGroupID group=0) 1106 { set_id(dJointCreateFixed(world, group)); } 1107 dFixedJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1108 { set_id(dJointCreateFixed(world, group)); } 1109 1110 void create (dWorldID world, dJointGroupID group=0) { 1111 destroy(); 1112 set_id(dJointCreateFixed(world, group)); 1113 } 1114 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1115 { create(world.id(), group); } 1116 set()1117 void set() 1118 { dJointSetFixed (get_id()); } 1119 setParam(int parameter,dReal value)1120 virtual void setParam (int parameter, dReal value) 1121 { dJointSetFixedParam (get_id(), parameter, value); } 1122 getParam(int parameter)1123 virtual dReal getParam (int parameter) const 1124 { return dJointGetFixedParam (get_id(), parameter); } 1125 // TODO: expose params through methods 1126 }; 1127 1128 1129 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 1130 class dContactJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 1131 private: 1132 // intentionally undefined, don't use these 1133 dContactJointTemplate (const dContactJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1134 void operator = (const dContactJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1135 1136 protected: 1137 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 1138 get_id()1139 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)1140 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 1141 destroy()1142 void destroy() { dBaseTemplate::destroy(); } 1143 1144 public: dContactJointTemplate()1145 dContactJointTemplate() { } dContactJointTemplate(dWorldID world,dJointGroupID group,dContact * contact)1146 dContactJointTemplate (dWorldID world, dJointGroupID group, dContact *contact) 1147 { set_id(dJointCreateContact(world, group, contact)); } dContactJointTemplate(dWorldTemplate<dWorldTemplateBase> & world,dJointGroupID group,dContact * contact)1148 dContactJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group, dContact *contact) 1149 { set_id(dJointCreateContact(world.id(), group, contact)); } 1150 create(dWorldID world,dJointGroupID group,dContact * contact)1151 void create (dWorldID world, dJointGroupID group, dContact *contact) { 1152 destroy(); 1153 set_id(dJointCreateContact(world, group, contact)); 1154 } 1155 create(dWorldTemplate<dWorldTemplateBase> & world,dJointGroupID group,dContact * contact)1156 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group, dContact *contact) 1157 { create(world.id(), group, contact); } 1158 }; 1159 1160 1161 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 1162 class dNullJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 1163 private: 1164 // intentionally undefined, don't use these 1165 dNullJointTemplate (const dNullJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1166 void operator = (const dNullJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1167 1168 protected: 1169 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 1170 get_id()1171 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)1172 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 1173 destroy()1174 void destroy() { dBaseTemplate::destroy(); } 1175 1176 public: dNullJointTemplate()1177 dNullJointTemplate() { } 1178 dNullJointTemplate (dWorldID world, dJointGroupID group=0) 1179 { set_id(dJointCreateNull(world, group)); } 1180 dNullJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1181 { set_id(dJointCreateNull (world.id(), group)); } 1182 1183 void create (dWorldID world, dJointGroupID group=0) { 1184 destroy(); 1185 set_id(dJointCreateNull(world, group)); 1186 } 1187 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1188 { create(world.id(), group); } 1189 }; 1190 1191 1192 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 1193 class dAMotorJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 1194 private: 1195 // intentionally undefined, don't use these 1196 dAMotorJointTemplate (const dAMotorJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1197 void operator = (const dAMotorJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1198 1199 protected: 1200 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 1201 get_id()1202 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)1203 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 1204 destroy()1205 void destroy() { dBaseTemplate::destroy(); } 1206 1207 public: dAMotorJointTemplate()1208 dAMotorJointTemplate() { } 1209 dAMotorJointTemplate (dWorldID world, dJointGroupID group=0) 1210 { set_id(dJointCreateAMotor(world, group)); } 1211 dAMotorJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1212 { set_id(dJointCreateAMotor(world.id(), group)); } 1213 1214 void create (dWorldID world, dJointGroupID group=0) { 1215 destroy(); 1216 set_id(dJointCreateAMotor(world, group)); 1217 } 1218 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1219 { create(world.id(), group); } 1220 setMode(int mode)1221 void setMode (int mode) 1222 { dJointSetAMotorMode (get_id(), mode); } getMode()1223 int getMode() const 1224 { return dJointGetAMotorMode (get_id()); } 1225 setNumAxes(int num)1226 void setNumAxes (int num) 1227 { dJointSetAMotorNumAxes (get_id(), num); } getNumAxes()1228 int getNumAxes() const 1229 { return dJointGetAMotorNumAxes (get_id()); } 1230 setAxis(int anum,int rel,dReal x,dReal y,dReal z)1231 void setAxis (int anum, int rel, dReal x, dReal y, dReal z) 1232 { dJointSetAMotorAxis (get_id(), anum, rel, x, y, z); } setAxis(int anum,int rel,const dVector3 a)1233 void setAxis (int anum, int rel, const dVector3 a) 1234 { setAxis(anum, rel, a[0], a[1], a[2]); } getAxis(int anum,dVector3 result)1235 void getAxis (int anum, dVector3 result) const 1236 { dJointGetAMotorAxis (get_id(), anum, result); } getAxisRel(int anum)1237 int getAxisRel (int anum) const 1238 { return dJointGetAMotorAxisRel (get_id(), anum); } 1239 setAngle(int anum,dReal angle)1240 void setAngle (int anum, dReal angle) 1241 { dJointSetAMotorAngle (get_id(), anum, angle); } getAngle(int anum)1242 dReal getAngle (int anum) const 1243 { return dJointGetAMotorAngle (get_id(), anum); } getAngleRate(int anum)1244 dReal getAngleRate (int anum) 1245 { return dJointGetAMotorAngleRate (get_id(), anum); } 1246 setParam(int parameter,dReal value)1247 void setParam (int parameter, dReal value) 1248 { dJointSetAMotorParam (get_id(), parameter, value); } getParam(int parameter)1249 dReal getParam (int parameter) const 1250 { return dJointGetAMotorParam (get_id(), parameter); } 1251 // TODO: expose params through methods 1252 addTorques(dReal torque1,dReal torque2,dReal torque3)1253 void addTorques(dReal torque1, dReal torque2, dReal torque3) 1254 { dJointAddAMotorTorques(get_id(), torque1, torque2, torque3); } 1255 }; 1256 1257 1258 template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase> 1259 class dLMotorJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> { 1260 private: 1261 // intentionally undefined, don't use these 1262 dLMotorJointTemplate (const dLMotorJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1263 void operator = (const dLMotorJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &); 1264 1265 protected: 1266 typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate; 1267 get_id()1268 dJointID get_id() const { return dBaseTemplate::get_id(); } set_id(dJointID value)1269 void set_id(dJointID value) { dBaseTemplate::set_id(value); } 1270 destroy()1271 void destroy() { dBaseTemplate::destroy(); } 1272 1273 public: dLMotorJointTemplate()1274 dLMotorJointTemplate() { } 1275 dLMotorJointTemplate (dWorldID world, dJointGroupID group=0) 1276 { set_id(dJointCreateLMotor(world, group)); } 1277 dLMotorJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1278 { set_id(dJointCreateLMotor(world.id(), group)); } 1279 1280 void create (dWorldID world, dJointGroupID group=0) { 1281 destroy(); 1282 set_id(dJointCreateLMotor(world, group)); 1283 } 1284 void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0) 1285 { create(world.id(), group); } 1286 setNumAxes(int num)1287 void setNumAxes (int num) 1288 { dJointSetLMotorNumAxes (get_id(), num); } getNumAxes()1289 int getNumAxes() const 1290 { return dJointGetLMotorNumAxes (get_id()); } 1291 setAxis(int anum,int rel,dReal x,dReal y,dReal z)1292 void setAxis (int anum, int rel, dReal x, dReal y, dReal z) 1293 { dJointSetLMotorAxis (get_id(), anum, rel, x, y, z); } setAxis(int anum,int rel,const dVector3 a)1294 void setAxis (int anum, int rel, const dVector3 a) 1295 { setAxis(anum, rel, a[0], a[1], a[2]); } getAxis(int anum,dVector3 result)1296 void getAxis (int anum, dVector3 result) const 1297 { dJointGetLMotorAxis (get_id(), anum, result); } 1298 setParam(int parameter,dReal value)1299 void setParam (int parameter, dReal value) 1300 { dJointSetLMotorParam (get_id(), parameter, value); } getParam(int parameter)1301 dReal getParam (int parameter) const 1302 { return dJointGetLMotorParam (get_id(), parameter); } 1303 // TODO: expose params through methods 1304 }; 1305 1306 //} 1307 1308 #if !defined(dODECPP_WORLD_TEMPLATE_BASE) 1309 1310 #if defined(dODECPP_BODY_TEMPLATE_BASE) || defined(dODECPP_JOINTGROUP_TEMPLATE_BASE) || defined(dODECPP_JOINT_TEMPLATE_BASE) 1311 #error All the odecpp template bases must be defined or not defined together 1312 #endif 1313 1314 #define dODECPP_WORLD_TEMPLATE_BASE dWorldDynamicIDContainer 1315 #define dODECPP_BODY_TEMPLATE_BASE dBodyDynamicIDContainer 1316 #define dODECPP_JOINTGROUP_TEMPLATE_BASE dJointGroupDynamicIDContainer 1317 #define dODECPP_JOINT_TEMPLATE_BASE dJointDynamicIDContainer 1318 1319 #else // #if defined(dODECPP_WORLD_TEMPLATE_BASE) 1320 1321 #if !defined(dODECPP_BODY_TEMPLATE_BASE) || !defined(dODECPP_JOINTGROUP_TEMPLATE_BASE) || !defined(dODECPP_JOINT_TEMPLATE_BASE) 1322 #error All the odecpp template bases must be defined or not defined together 1323 #endif 1324 1325 #endif // #if defined(dODECPP_WORLD_TEMPLATE_BASE) 1326 1327 1328 typedef dWorldTemplate<dODECPP_WORLD_TEMPLATE_BASE> dWorld; 1329 typedef dBodyTemplate<dODECPP_BODY_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE> dBody; 1330 typedef dJointGroupTemplate<dODECPP_JOINTGROUP_TEMPLATE_BASE> dJointGroup; 1331 typedef dJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dJoint; 1332 typedef dBallJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dBallJoint; 1333 typedef dHingeJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dHingeJoint; 1334 typedef dSliderJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dSliderJoint; 1335 typedef dUniversalJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dUniversalJoint; 1336 typedef dHinge2JointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dHinge2Joint; 1337 typedef dPRJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dPRJoint; 1338 typedef dPUJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dPUJoint; 1339 typedef dPistonJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dPistonJoint; 1340 typedef dFixedJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dFixedJoint; 1341 typedef dContactJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dContactJoint; 1342 typedef dNullJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dNullJoint; 1343 typedef dAMotorJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dAMotorJoint; 1344 typedef dLMotorJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dLMotorJoint; 1345 1346 1347 #endif 1348 #endif 1349 1350 // Local variables: 1351 // mode:c++ 1352 // c-basic-offset:2 1353 // End: 1354