odecpp.h 50 KB

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