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