odecpp.h 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355
  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 setAxes (const dReal *axis1/*=NULL*/, const dReal *axis2/*=NULL*/)
  685. { dJointSetHinge2Axes (get_id(), axis1, axis2); }
  686. ODE_API_DEPRECATED void setAxis1 (dReal x, dReal y, dReal z)
  687. { dVector3 a = { x, y, z }; dJointSetHinge2Axes (get_id(), a, NULL); }
  688. ODE_API_DEPRECATED void setAxis1 (const dVector3 a)
  689. { dJointSetHinge2Axes (get_id(), a, NULL); }
  690. ODE_API_DEPRECATED void setAxis2 (dReal x, dReal y, dReal z)
  691. { dVector3 a = { x, y, z }; dJointSetHinge2Axes (get_id(), NULL, a); }
  692. ODE_API_DEPRECATED void setAxis2 (const dVector3 a)
  693. { dJointSetHinge2Axes (get_id(), NULL, a); }
  694. void getAnchor (dVector3 result) const
  695. { dJointGetHinge2Anchor (get_id(), result); }
  696. void getAnchor2 (dVector3 result) const
  697. { dJointGetHinge2Anchor2 (get_id(), result); }
  698. void getAxis1 (dVector3 result) const
  699. { dJointGetHinge2Axis1 (get_id(), result); }
  700. void getAxis2 (dVector3 result) const
  701. { dJointGetHinge2Axis2 (get_id(), result); }
  702. dReal getAngle1() const
  703. { return dJointGetHinge2Angle1 (get_id()); }
  704. dReal getAngle1Rate() const
  705. { return dJointGetHinge2Angle1Rate (get_id()); }
  706. dReal getAngle2Rate() const
  707. { return dJointGetHinge2Angle2Rate (get_id()); }
  708. virtual void setParam (int parameter, dReal value)
  709. { dJointSetHinge2Param (get_id(), parameter, value); }
  710. virtual dReal getParam (int parameter) const
  711. { return dJointGetHinge2Param (get_id(), parameter); }
  712. // TODO: expose params through methods
  713. void addTorques(dReal torque1, dReal torque2)
  714. { dJointAddHinge2Torques(get_id(), torque1, torque2); }
  715. };
  716. template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase>
  717. class dPRJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> {
  718. private:
  719. // intentionally undefined, don't use these
  720. dPRJointTemplate (const dPRJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  721. void operator = (const dPRJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  722. protected:
  723. typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate;
  724. dJointID get_id() const { return dBaseTemplate::get_id(); }
  725. void set_id(dJointID value) { dBaseTemplate::set_id(value); }
  726. void destroy() { dBaseTemplate::destroy(); }
  727. public:
  728. dPRJointTemplate() { }
  729. dPRJointTemplate (dWorldID world, dJointGroupID group=0)
  730. { set_id(dJointCreatePR(world, group)); }
  731. dPRJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  732. { set_id(dJointCreatePR(world.id(), group)); }
  733. void create (dWorldID world, dJointGroupID group=0) {
  734. destroy();
  735. set_id(dJointCreatePR(world, group));
  736. }
  737. void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  738. { create(world.id(), group); }
  739. void setAnchor (dReal x, dReal y, dReal z)
  740. { dJointSetPRAnchor (get_id(), x, y, z); }
  741. void setAnchor (const dVector3 a)
  742. { setAnchor (a[0], a[1], a[2]); }
  743. void setAxis1 (dReal x, dReal y, dReal z)
  744. { dJointSetPRAxis1 (get_id(), x, y, z); }
  745. void setAxis1 (const dVector3 a)
  746. { setAxis1(a[0], a[1], a[2]); }
  747. void setAxis2 (dReal x, dReal y, dReal z)
  748. { dJointSetPRAxis2 (get_id(), x, y, z); }
  749. void setAxis2 (const dVector3 a)
  750. { setAxis2(a[0], a[1], a[2]); }
  751. void getAnchor (dVector3 result) const
  752. { dJointGetPRAnchor (get_id(), result); }
  753. void getAxis1 (dVector3 result) const
  754. { dJointGetPRAxis1 (get_id(), result); }
  755. void getAxis2 (dVector3 result) const
  756. { dJointGetPRAxis2 (get_id(), result); }
  757. dReal getPosition() const
  758. { return dJointGetPRPosition (get_id()); }
  759. dReal getPositionRate() const
  760. { return dJointGetPRPositionRate (get_id()); }
  761. dReal getAngle() const
  762. { return dJointGetPRAngle (get_id()); }
  763. dReal getAngleRate() const
  764. { return dJointGetPRAngleRate (get_id()); }
  765. virtual void setParam (int parameter, dReal value)
  766. { dJointSetPRParam (get_id(), parameter, value); }
  767. virtual dReal getParam (int parameter) const
  768. { return dJointGetPRParam (get_id(), parameter); }
  769. };
  770. template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase>
  771. class dPUJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase>
  772. {
  773. private:
  774. // intentionally undefined, don't use these
  775. dPUJointTemplate (const dPUJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  776. void operator = (const dPUJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  777. protected:
  778. typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate;
  779. dJointID get_id() const { return dBaseTemplate::get_id(); }
  780. void set_id(dJointID value) { dBaseTemplate::set_id(value); }
  781. void destroy() { dBaseTemplate::destroy(); }
  782. public:
  783. dPUJointTemplate() { }
  784. dPUJointTemplate (dWorldID world, dJointGroupID group=0)
  785. { set_id(dJointCreatePU(world, group)); }
  786. dPUJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  787. { set_id(dJointCreatePU(world.id(), group)); }
  788. void create (dWorldID world, dJointGroupID group=0)
  789. {
  790. destroy();
  791. set_id(dJointCreatePU(world, group));
  792. }
  793. void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  794. { create(world.id(), group); }
  795. void setAnchor (dReal x, dReal y, dReal z)
  796. { dJointSetPUAnchor (get_id(), x, y, z); }
  797. void setAnchor (const dVector3 a)
  798. { setAnchor (a[0], a[1], a[2]); }
  799. void setAxis1 (dReal x, dReal y, dReal z)
  800. { dJointSetPUAxis1 (get_id(), x, y, z); }
  801. void setAxis1 (const dVector3 a)
  802. { setAxis1(a[0], a[1], a[2]); }
  803. void setAxis2 (dReal x, dReal y, dReal z)
  804. { dJointSetPUAxis2 (get_id(), x, y, z); }
  805. void setAxis3 (dReal x, dReal y, dReal z)
  806. { dJointSetPUAxis3 (get_id(), x, y, z); }
  807. void setAxis3 (const dVector3 a)
  808. { setAxis3(a[0], a[1], a[2]); }
  809. void setAxisP (dReal x, dReal y, dReal z)
  810. { dJointSetPUAxis3 (get_id(), x, y, z); }
  811. void setAxisP (const dVector3 a)
  812. { setAxisP(a[0], a[1], a[2]); }
  813. virtual void getAnchor (dVector3 result) const
  814. { dJointGetPUAnchor (get_id(), result); }
  815. void getAxis1 (dVector3 result) const
  816. { dJointGetPUAxis1 (get_id(), result); }
  817. void getAxis2 (dVector3 result) const
  818. { dJointGetPUAxis2 (get_id(), result); }
  819. void getAxis3 (dVector3 result) const
  820. { dJointGetPUAxis3 (get_id(), result); }
  821. void getAxisP (dVector3 result) const
  822. { dJointGetPUAxis3 (get_id(), result); }
  823. dReal getAngle1() const
  824. { return dJointGetPUAngle1 (get_id()); }
  825. dReal getAngle1Rate() const
  826. { return dJointGetPUAngle1Rate (get_id()); }
  827. dReal getAngle2() const
  828. { return dJointGetPUAngle2 (get_id()); }
  829. dReal getAngle2Rate() const
  830. { return dJointGetPUAngle2Rate (get_id()); }
  831. dReal getPosition() const
  832. { return dJointGetPUPosition (get_id()); }
  833. dReal getPositionRate() const
  834. { return dJointGetPUPositionRate (get_id()); }
  835. virtual void setParam (int parameter, dReal value)
  836. { dJointSetPUParam (get_id(), parameter, value); }
  837. virtual dReal getParam (int parameter) const
  838. { return dJointGetPUParam (get_id(), parameter); }
  839. // TODO: expose params through methods
  840. };
  841. template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase>
  842. class dPistonJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase>
  843. {
  844. private:
  845. // intentionally undefined, don't use these
  846. dPistonJointTemplate (const dPistonJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  847. void operator = (const dPistonJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  848. protected:
  849. typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate;
  850. dJointID get_id() const { return dBaseTemplate::get_id(); }
  851. void set_id(dJointID value) { dBaseTemplate::set_id(value); }
  852. void destroy() { dBaseTemplate::destroy(); }
  853. public:
  854. dPistonJointTemplate() { }
  855. dPistonJointTemplate (dWorldID world, dJointGroupID group=0)
  856. { set_id(dJointCreatePiston(world, group)); }
  857. dPistonJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  858. { set_id(dJointCreatePiston(world, group)); }
  859. void create (dWorldID world, dJointGroupID group=0)
  860. {
  861. destroy();
  862. set_id(dJointCreatePiston(world, group));
  863. }
  864. void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  865. { create(world.id(), group); }
  866. void setAnchor (dReal x, dReal y, dReal z)
  867. { dJointSetPistonAnchor (get_id(), x, y, z); }
  868. void setAnchor (const dVector3 a)
  869. { setAnchor (a[0], a[1], a[2]); }
  870. void getAnchor (dVector3 result) const
  871. { dJointGetPistonAnchor (get_id(), result); }
  872. void getAnchor2 (dVector3 result) const
  873. { dJointGetPistonAnchor2 (get_id(), result); }
  874. void setAxis (dReal x, dReal y, dReal z)
  875. { dJointSetPistonAxis (get_id(), x, y, z); }
  876. void setAxis (const dVector3 a)
  877. { setAxis(a[0], a[1], a[2]); }
  878. void getAxis (dVector3 result) const
  879. { dJointGetPistonAxis (get_id(), result); }
  880. dReal getPosition() const
  881. { return dJointGetPistonPosition (get_id()); }
  882. dReal getPositionRate() const
  883. { return dJointGetPistonPositionRate (get_id()); }
  884. virtual void setParam (int parameter, dReal value)
  885. { dJointSetPistonParam (get_id(), parameter, value); }
  886. virtual dReal getParam (int parameter) const
  887. { return dJointGetPistonParam (get_id(), parameter); }
  888. // TODO: expose params through methods
  889. void addForce (dReal force)
  890. { dJointAddPistonForce (get_id(), force); }
  891. };
  892. template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase>
  893. class dFixedJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase>
  894. {
  895. private:
  896. // intentionally undefined, don't use these
  897. dFixedJointTemplate (const dFixedJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  898. void operator = (const dFixedJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  899. protected:
  900. typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate;
  901. dJointID get_id() const { return dBaseTemplate::get_id(); }
  902. void set_id(dJointID value) { dBaseTemplate::set_id(value); }
  903. void destroy() { dBaseTemplate::destroy(); }
  904. public:
  905. dFixedJointTemplate() { }
  906. dFixedJointTemplate (dWorldID world, dJointGroupID group=0)
  907. { set_id(dJointCreateFixed(world, group)); }
  908. dFixedJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  909. { set_id(dJointCreateFixed(world, group)); }
  910. void create (dWorldID world, dJointGroupID group=0) {
  911. destroy();
  912. set_id(dJointCreateFixed(world, group));
  913. }
  914. void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  915. { create(world.id(), group); }
  916. void set()
  917. { dJointSetFixed (get_id()); }
  918. virtual void setParam (int parameter, dReal value)
  919. { dJointSetFixedParam (get_id(), parameter, value); }
  920. virtual dReal getParam (int parameter) const
  921. { return dJointGetFixedParam (get_id(), parameter); }
  922. // TODO: expose params through methods
  923. };
  924. template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase>
  925. class dContactJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> {
  926. private:
  927. // intentionally undefined, don't use these
  928. dContactJointTemplate (const dContactJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  929. void operator = (const dContactJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  930. protected:
  931. typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate;
  932. dJointID get_id() const { return dBaseTemplate::get_id(); }
  933. void set_id(dJointID value) { dBaseTemplate::set_id(value); }
  934. void destroy() { dBaseTemplate::destroy(); }
  935. public:
  936. dContactJointTemplate() { }
  937. dContactJointTemplate (dWorldID world, dJointGroupID group, dContact *contact)
  938. { set_id(dJointCreateContact(world, group, contact)); }
  939. dContactJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group, dContact *contact)
  940. { set_id(dJointCreateContact(world.id(), group, contact)); }
  941. void create (dWorldID world, dJointGroupID group, dContact *contact) {
  942. destroy();
  943. set_id(dJointCreateContact(world, group, contact));
  944. }
  945. void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group, dContact *contact)
  946. { create(world.id(), group, contact); }
  947. };
  948. template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase>
  949. class dNullJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> {
  950. private:
  951. // intentionally undefined, don't use these
  952. dNullJointTemplate (const dNullJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  953. void operator = (const dNullJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  954. protected:
  955. typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate;
  956. dJointID get_id() const { return dBaseTemplate::get_id(); }
  957. void set_id(dJointID value) { dBaseTemplate::set_id(value); }
  958. void destroy() { dBaseTemplate::destroy(); }
  959. public:
  960. dNullJointTemplate() { }
  961. dNullJointTemplate (dWorldID world, dJointGroupID group=0)
  962. { set_id(dJointCreateNull(world, group)); }
  963. dNullJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  964. { set_id(dJointCreateNull (world.id(), group)); }
  965. void create (dWorldID world, dJointGroupID group=0) {
  966. destroy();
  967. set_id(dJointCreateNull(world, group));
  968. }
  969. void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  970. { create(world.id(), group); }
  971. };
  972. template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase>
  973. class dAMotorJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> {
  974. private:
  975. // intentionally undefined, don't use these
  976. dAMotorJointTemplate (const dAMotorJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  977. void operator = (const dAMotorJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  978. protected:
  979. typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate;
  980. dJointID get_id() const { return dBaseTemplate::get_id(); }
  981. void set_id(dJointID value) { dBaseTemplate::set_id(value); }
  982. void destroy() { dBaseTemplate::destroy(); }
  983. public:
  984. dAMotorJointTemplate() { }
  985. dAMotorJointTemplate (dWorldID world, dJointGroupID group=0)
  986. { set_id(dJointCreateAMotor(world, group)); }
  987. dAMotorJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  988. { set_id(dJointCreateAMotor(world.id(), group)); }
  989. void create (dWorldID world, dJointGroupID group=0) {
  990. destroy();
  991. set_id(dJointCreateAMotor(world, group));
  992. }
  993. void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  994. { create(world.id(), group); }
  995. void setMode (int mode)
  996. { dJointSetAMotorMode (get_id(), mode); }
  997. int getMode() const
  998. { return dJointGetAMotorMode (get_id()); }
  999. void setNumAxes (int num)
  1000. { dJointSetAMotorNumAxes (get_id(), num); }
  1001. int getNumAxes() const
  1002. { return dJointGetAMotorNumAxes (get_id()); }
  1003. void setAxis (int anum, int rel, dReal x, dReal y, dReal z)
  1004. { dJointSetAMotorAxis (get_id(), anum, rel, x, y, z); }
  1005. void setAxis (int anum, int rel, const dVector3 a)
  1006. { setAxis(anum, rel, a[0], a[1], a[2]); }
  1007. void getAxis (int anum, dVector3 result) const
  1008. { dJointGetAMotorAxis (get_id(), anum, result); }
  1009. int getAxisRel (int anum) const
  1010. { return dJointGetAMotorAxisRel (get_id(), anum); }
  1011. void setAngle (int anum, dReal angle)
  1012. { dJointSetAMotorAngle (get_id(), anum, angle); }
  1013. dReal getAngle (int anum) const
  1014. { return dJointGetAMotorAngle (get_id(), anum); }
  1015. dReal getAngleRate (int anum)
  1016. { return dJointGetAMotorAngleRate (get_id(), anum); }
  1017. void setParam (int parameter, dReal value)
  1018. { dJointSetAMotorParam (get_id(), parameter, value); }
  1019. dReal getParam (int parameter) const
  1020. { return dJointGetAMotorParam (get_id(), parameter); }
  1021. // TODO: expose params through methods
  1022. void addTorques(dReal torque1, dReal torque2, dReal torque3)
  1023. { dJointAddAMotorTorques(get_id(), torque1, torque2, torque3); }
  1024. };
  1025. template <class dJointTemplateBase, class dWorldTemplateBase, class dBodyTemplateBase>
  1026. class dLMotorJointTemplate : public dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> {
  1027. private:
  1028. // intentionally undefined, don't use these
  1029. dLMotorJointTemplate (const dLMotorJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  1030. void operator = (const dLMotorJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> &);
  1031. protected:
  1032. typedef dJointTemplate<dJointTemplateBase, dWorldTemplateBase, dBodyTemplateBase> dBaseTemplate;
  1033. dJointID get_id() const { return dBaseTemplate::get_id(); }
  1034. void set_id(dJointID value) { dBaseTemplate::set_id(value); }
  1035. void destroy() { dBaseTemplate::destroy(); }
  1036. public:
  1037. dLMotorJointTemplate() { }
  1038. dLMotorJointTemplate (dWorldID world, dJointGroupID group=0)
  1039. { set_id(dJointCreateLMotor(world, group)); }
  1040. dLMotorJointTemplate (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  1041. { set_id(dJointCreateLMotor(world.id(), group)); }
  1042. void create (dWorldID world, dJointGroupID group=0) {
  1043. destroy();
  1044. set_id(dJointCreateLMotor(world, group));
  1045. }
  1046. void create (dWorldTemplate<dWorldTemplateBase>& world, dJointGroupID group=0)
  1047. { create(world.id(), group); }
  1048. void setNumAxes (int num)
  1049. { dJointSetLMotorNumAxes (get_id(), num); }
  1050. int getNumAxes() const
  1051. { return dJointGetLMotorNumAxes (get_id()); }
  1052. void setAxis (int anum, int rel, dReal x, dReal y, dReal z)
  1053. { dJointSetLMotorAxis (get_id(), anum, rel, x, y, z); }
  1054. void setAxis (int anum, int rel, const dVector3 a)
  1055. { setAxis(anum, rel, a[0], a[1], a[2]); }
  1056. void getAxis (int anum, dVector3 result) const
  1057. { dJointGetLMotorAxis (get_id(), anum, result); }
  1058. void setParam (int parameter, dReal value)
  1059. { dJointSetLMotorParam (get_id(), parameter, value); }
  1060. dReal getParam (int parameter) const
  1061. { return dJointGetLMotorParam (get_id(), parameter); }
  1062. // TODO: expose params through methods
  1063. };
  1064. //}
  1065. #if !defined(dODECPP_WORLD_TEMPLATE_BASE)
  1066. #if defined(dODECPP_BODY_TEMPLATE_BASE) || defined(dODECPP_JOINTGROUP_TEMPLATE_BASE) || defined(dODECPP_JOINT_TEMPLATE_BASE)
  1067. #error All the odecpp template bases must be defined or not defined together
  1068. #endif
  1069. #define dODECPP_WORLD_TEMPLATE_BASE dWorldDynamicIDContainer
  1070. #define dODECPP_BODY_TEMPLATE_BASE dBodyDynamicIDContainer
  1071. #define dODECPP_JOINTGROUP_TEMPLATE_BASE dJointGroupDynamicIDContainer
  1072. #define dODECPP_JOINT_TEMPLATE_BASE dJointDynamicIDContainer
  1073. #else // #if defined(dODECPP_WORLD_TEMPLATE_BASE)
  1074. #if !defined(dODECPP_BODY_TEMPLATE_BASE) || !defined(dODECPP_JOINTGROUP_TEMPLATE_BASE) || !defined(dODECPP_JOINT_TEMPLATE_BASE)
  1075. #error All the odecpp template bases must be defined or not defined together
  1076. #endif
  1077. #endif // #if defined(dODECPP_WORLD_TEMPLATE_BASE)
  1078. typedef dWorldTemplate<dODECPP_WORLD_TEMPLATE_BASE> dWorld;
  1079. typedef dBodyTemplate<dODECPP_BODY_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE> dBody;
  1080. typedef dJointGroupTemplate<dODECPP_JOINTGROUP_TEMPLATE_BASE> dJointGroup;
  1081. typedef dJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dJoint;
  1082. typedef dBallJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dBallJoint;
  1083. typedef dHingeJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dHingeJoint;
  1084. typedef dSliderJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dSliderJoint;
  1085. typedef dUniversalJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dUniversalJoint;
  1086. typedef dHinge2JointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dHinge2Joint;
  1087. typedef dPRJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dPRJoint;
  1088. typedef dPUJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dPUJoint;
  1089. typedef dPistonJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dPistonJoint;
  1090. typedef dFixedJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dFixedJoint;
  1091. typedef dContactJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dContactJoint;
  1092. typedef dNullJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dNullJoint;
  1093. typedef dAMotorJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dAMotorJoint;
  1094. typedef dLMotorJointTemplate<dODECPP_JOINT_TEMPLATE_BASE, dODECPP_WORLD_TEMPLATE_BASE, dODECPP_BODY_TEMPLATE_BASE> dLMotorJoint;
  1095. #endif
  1096. #endif
  1097. // Local variables:
  1098. // mode:c++
  1099. // c-basic-offset:2
  1100. // End: