glue.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. // glue.cpp
  2. #include "Newton.h"
  3. #include "dMatrix.h"
  4. extern "C" {
  5. #include "brl.mod/blitz.mod/blitz.h"
  6. NewtonWorld * bmx_newtondynamics_NewtonCreate(BBObject *);
  7. NewtonBody * bmx_newtondynamics_NewtonCreateDynamicBody(BBObject *, const NewtonWorld* const, const NewtonCollision* const, const dFloat* const);
  8. BBObject * bmx_newtondynamics_NewtonBodyGetUserData(const NewtonBody* const);
  9. void bmx_newtondynamics_NewtonBodySetOmega(const NewtonBody* const, float, float, float, float);
  10. void bmx_newtondynamics_NewtonBodySetVelocity(const NewtonBody* const, float, float, float, float);
  11. void bmx_newtondynamics_NewtonBodySetForce(const NewtonBody* const, float, float, float, float);
  12. void bmx_newtondynamics_NewtonBodySetTorque(const NewtonBody* const, float, float, float, float);
  13. void bmx_newtondynamics_NewtonBodySetAngularDamping(const NewtonBody* const, float, float, float);
  14. void bmx_newtondynamics_NewtonBodyGetAngularDamping(const NewtonBody* const, float*, float*, float*);
  15. void bmx_newtondynamics_NewtonBodyGetRotation(const NewtonBody* const, float *, float *, float *, float *);
  16. void bmx_newtondynamics_NewtonBodyGetOmega(const NewtonBody* const, float *, float *, float *);
  17. void bmx_newtondynamics_NewtonBodyGetVelocity(const NewtonBody* const, float *, float *, float *);
  18. void bmx_newtondynamics_NewtonBodyGetForce(const NewtonBody* const, float *, float *, float *);
  19. void bmx_newtondynamics_NewtonBodyGetTorque(const NewtonBody* const, float *, float *, float *);
  20. void bmx_newtondynamics_NewtonBodyGetForceAcc(const NewtonBody* const, float *, float *, float *);
  21. void bmx_newtondynamics_NewtonBodyGetTorqueAcc(const NewtonBody* const, float *, float *, float *);
  22. void bmx_newtondynamics_NewtonBodyGetCentreOfMass(const NewtonBody* const, float *, float *, float *);
  23. void bmx_newtondynamics_NewtonBodyGetAABB(const NewtonBody* const, float *, float *, float *, float *, float *, float *);
  24. void bmx_newtondynamics_NewtonBodyAddForce(const NewtonBody* const, float, float, float);
  25. void bmx_newtondynamics_NewtonBodyAddTorque(const NewtonBody* const, float, float, float);
  26. void bmx_newtondynamics_NewtonBodyCalculateInverseDynamicsForce(const NewtonBody* const, float, float, float, float, float *, float *, float *);
  27. void bmx_newtondynamics_config_body(BBObject *, NewtonBody *);
  28. void bmx_newtondynamics_body_destroycallback(const NewtonBody* const);
  29. NewtonCollision * bmx_newtondynamics_NewtonCreateSphere(BBObject *, const NewtonWorld* const, float, int, float *);
  30. NewtonCollision * bmx_newtondynamics_NewtonCreateBox(BBObject *, const NewtonWorld* const, float, float, float, int, float *);
  31. NewtonCollision * bmx_newtondynamics_NewtonCreateTreeCollision(BBObject *, const NewtonWorld* const, int);
  32. NewtonCollision * bmx_newtondynamics_NewtonCreateCylinder(BBObject *, const NewtonWorld* const, float, float, int, float *);
  33. void bmx_newtondynamics_collision_copycallback(const NewtonWorld* const, NewtonCollision* const, const NewtonCollision* const);
  34. void bmx_newtondynamics_collision_destroycallback(const NewtonWorld* const, const NewtonCollision* const);
  35. void bmx_newtondynamics_config_collision(BBObject *, NewtonCollision *);
  36. void bmx_newtondynamics_matrix_GetEulerAngles(float *, float *, float *, float *, float *, float *, float *);
  37. void bmx_newtondynamics_NewtonWorldRayCast(const NewtonWorld* const, float, float, float, float, float, float,
  38. NewtonWorldRayFilterCallback, BBObject *, NewtonWorldRayPrefilterCallback, int);
  39. BBObject * bmx_newtondynamics_RayCastDelegateFromPtr(void * data);
  40. }
  41. // ********************************************************
  42. void bmx_newtondynamics_body_destroycallback(const NewtonBody* const body) {
  43. BBObject * obj = (BBObject*) NewtonBodyGetUserData(body);
  44. if (obj) {
  45. BBRELEASE(obj);
  46. }
  47. }
  48. void bmx_newtondynamics_config_body(BBObject * obj, NewtonBody * body) {
  49. NewtonBodySetUserData(body, obj);
  50. BBRETAIN(obj);
  51. NewtonBodySetDestructorCallback(body, bmx_newtondynamics_body_destroycallback);
  52. }
  53. void bmx_newtondynamics_collision_copycallback(const NewtonWorld* const world, NewtonCollision* const coll, const NewtonCollision* const source) {
  54. BBObject * obj = (BBObject*) NewtonCollisionGetUserData(source);
  55. bmx_newtondynamics_config_collision(obj, coll);
  56. }
  57. void bmx_newtondynamics_collision_destroycallback(const NewtonWorld* const world, const NewtonCollision* const coll) {
  58. BBObject * obj = (BBObject*) NewtonCollisionGetUserData(coll);
  59. if (obj) {
  60. BBRELEASE(obj);
  61. }
  62. }
  63. void bmx_newtondynamics_config_collision(BBObject * obj, NewtonCollision * coll) {
  64. NewtonCollisionSetUserData(coll, obj);
  65. BBRETAIN(obj);
  66. }
  67. // ********************************************************
  68. NewtonWorld * bmx_newtondynamics_NewtonCreate(BBObject *) {
  69. NewtonWorld * world = NewtonCreate();
  70. NewtonWorldSetCollisionConstructorDestructorCallback(world, bmx_newtondynamics_collision_copycallback, bmx_newtondynamics_collision_destroycallback);
  71. return world;
  72. }
  73. NewtonBody * bmx_newtondynamics_NewtonCreateDynamicBody(BBObject * obj, const NewtonWorld* const world, const NewtonCollision* const coll, const dFloat* const matrix) {
  74. NewtonBody * body = NewtonCreateDynamicBody(world, coll, matrix);
  75. bmx_newtondynamics_config_body(obj, body);
  76. return body;
  77. }
  78. void bmx_newtondynamics_NewtonBodySetOmega(const NewtonBody* const body, float x, float y, float z, float w) {
  79. dVector v(x, y, z, w);
  80. NewtonBodySetOmega(body, &v[0]);
  81. }
  82. void bmx_newtondynamics_NewtonBodySetVelocity(const NewtonBody* const body, float x, float y, float z, float w) {
  83. dVector v(x, y, z, w);
  84. NewtonBodySetVelocity(body, &v[0]);
  85. }
  86. void bmx_newtondynamics_NewtonBodySetForce(const NewtonBody* const body, float x, float y, float z, float w) {
  87. dVector v(x, y, z, w);
  88. NewtonBodySetForce(body, &v[0]);
  89. }
  90. void bmx_newtondynamics_NewtonBodySetTorque(const NewtonBody* const body, float x, float y, float z, float w) {
  91. dVector v(x, y, z, w);
  92. NewtonBodySetTorque(body, &v[0]);
  93. }
  94. BBObject * bmx_newtondynamics_NewtonBodyGetUserData(const NewtonBody* const body) {
  95. return (BBObject*) NewtonBodyGetUserData(body);
  96. }
  97. void bmx_newtondynamics_NewtonBodySetAngularDamping(const NewtonBody* const body, float ax, float ay, float az) {
  98. dVector v(ax, ay, az, 0.0f);
  99. NewtonBodySetAngularDamping(body, &v[0]);
  100. }
  101. void bmx_newtondynamics_NewtonBodyGetAngularDamping(const NewtonBody* const body, float * ax, float * ay, float * az) {
  102. dVector v;
  103. NewtonBodyGetAngularDamping(body, &v[0]);
  104. *ax = v.m_x;
  105. *ay = v.m_y;
  106. *az = v.m_z;
  107. }
  108. void bmx_newtondynamics_NewtonBodyGetRotation(const NewtonBody* const body, float * q0, float * q1, float * q2, float * q3) {
  109. dVector v;
  110. NewtonBodyGetRotation(body, &v[0]);
  111. *q0 = v.m_x;
  112. *q1 = v.m_y;
  113. *q2 = v.m_z;
  114. *q3 = v.m_w;
  115. }
  116. void bmx_newtondynamics_NewtonBodyGetOmega(const NewtonBody* const body, float * ox, float * oy, float * oz) {
  117. dVector v;
  118. NewtonBodyGetOmega(body, &v[0]);
  119. *ox = v.m_x;
  120. *oy = v.m_y;
  121. *oz = v.m_z;
  122. }
  123. void bmx_newtondynamics_NewtonBodyGetVelocity(const NewtonBody* const body, float * vx, float * vy, float * vz) {
  124. dVector v;
  125. NewtonBodyGetVelocity(body, &v[0]);
  126. *vx = v.m_x;
  127. *vy = v.m_y;
  128. *vz = v.m_z;
  129. }
  130. void bmx_newtondynamics_NewtonBodyGetForce(const NewtonBody* const body, float * fx, float * fy, float * fz) {
  131. dVector v;
  132. NewtonBodyGetForce(body, &v[0]);
  133. *fx = v.m_x;
  134. *fy = v.m_y;
  135. *fz = v.m_z;
  136. }
  137. void bmx_newtondynamics_NewtonBodyGetTorque(const NewtonBody* const body, float * tx, float * ty, float * tz) {
  138. dVector v;
  139. NewtonBodyGetTorque(body, &v[0]);
  140. *tx = v.m_x;
  141. *ty = v.m_y;
  142. *tz = v.m_z;
  143. }
  144. void bmx_newtondynamics_NewtonBodyGetForceAcc(const NewtonBody* const body, float * fx, float * fy, float * fz) {
  145. dVector v;
  146. NewtonBodyGetForceAcc(body, &v[0]);
  147. *fx = v.m_x;
  148. *fy = v.m_y;
  149. *fz = v.m_z;
  150. }
  151. void bmx_newtondynamics_NewtonBodyGetTorqueAcc(const NewtonBody* const body, float * tx, float * ty, float * tz) {
  152. dVector v;
  153. NewtonBodyGetTorqueAcc(body, &v[0]);
  154. *tx = v.m_x;
  155. *ty = v.m_y;
  156. *tz = v.m_z;
  157. }
  158. void bmx_newtondynamics_NewtonBodyGetCentreOfMass(const NewtonBody* const body, float * cx, float * cy, float * cz) {
  159. dVector v;
  160. NewtonBodyGetCentreOfMass(body, &v[0]);
  161. *cx = v.m_x;
  162. *cy = v.m_y;
  163. *cz = v.m_z;
  164. }
  165. void bmx_newtondynamics_NewtonBodyGetAABB(const NewtonBody* const body, float * p0x, float * p0y, float * p0z, float * p1x, float * p1y, float * p1z) {
  166. dVector v0, v1;
  167. NewtonBodyGetAABB(body, &v0[0], &v1[0]);
  168. *p0x = v0.m_x;
  169. *p0y = v0.m_y;
  170. *p0z = v0.m_z;
  171. *p1x = v1.m_x;
  172. *p1y = v1.m_y;
  173. *p1z = v1.m_z;
  174. }
  175. void bmx_newtondynamics_NewtonBodyAddForce(const NewtonBody* const body, float x, float y, float z) {
  176. dVector v(x, y, z, 0.0f);
  177. NewtonBodyAddForce(body, &v[0]);
  178. }
  179. void bmx_newtondynamics_NewtonBodyAddTorque(const NewtonBody* const body, float x, float y, float z) {
  180. dVector v(x, y, z, 0.0f);
  181. NewtonBodyAddTorque(body, &v[0]);
  182. }
  183. void bmx_newtondynamics_NewtonBodyCalculateInverseDynamicsForce(const NewtonBody* const body, float timestep, float x, float y, float z, float * fx, float * fy, float * fz) {
  184. dVector v(x, y, z, 0.0f);
  185. dVector f;
  186. NewtonBodyCalculateInverseDynamicsForce(body, timestep, &v[0], &f[0]);
  187. *fx = f.m_x;
  188. *fy = f.m_y;
  189. *fz = f.m_z;
  190. }
  191. // ********************************************************
  192. NewtonCollision * bmx_newtondynamics_NewtonCreateSphere(BBObject * obj, const NewtonWorld* const world, float radius, int shapeID, float * offsetMatrix) {
  193. NewtonCollision * coll = NewtonCreateSphere(world, radius, shapeID, offsetMatrix);
  194. bmx_newtondynamics_config_collision(obj, coll);
  195. return coll;
  196. }
  197. NewtonCollision * bmx_newtondynamics_NewtonCreateBox(BBObject * obj, const NewtonWorld* const world, float dx, float dy, float dz, int shapeID, float * offsetMatrix) {
  198. NewtonCollision * coll = NewtonCreateBox(world, dx, dy, dz, shapeID, offsetMatrix);
  199. bmx_newtondynamics_config_collision(obj, coll);
  200. return coll;
  201. }
  202. NewtonCollision * bmx_newtondynamics_NewtonCreateTreeCollision(BBObject * obj, const NewtonWorld* const world, int shapeID) {
  203. NewtonCollision * coll = NewtonCreateTreeCollision(world, shapeID);
  204. bmx_newtondynamics_config_collision(obj, coll);
  205. return coll;
  206. }
  207. NewtonCollision * bmx_newtondynamics_NewtonCreateCylinder(BBObject * obj, const NewtonWorld* const world, float radius, float height, int shapeID, float * offsetMatrix) {
  208. NewtonCollision * cyl = NewtonCreateCylinder(world, radius, height, shapeID, offsetMatrix);
  209. bmx_newtondynamics_config_collision(obj, cyl);
  210. return cyl;
  211. }
  212. void bmx_newtondynamics_NewtonWorldRayCast(const NewtonWorld* const world, float p0x, float p0y, float p0z, float p1x, float p1y, float p1z,
  213. NewtonWorldRayFilterCallback fcb, BBObject * delegate, NewtonWorldRayPrefilterCallback pfcb, int threadIndex) {
  214. dVector p0(p0x, p0y, p0z, 0.0f);
  215. dVector p1(p1x, p1y, p1z, 0.0f);
  216. NewtonWorldRayCast(world, &p0[0], &p1[0], fcb, delegate, pfcb, threadIndex);
  217. }
  218. // ********************************************************
  219. void bmx_newtondynamics_matrix_GetEulerAngles(float * frontX, float * pitch0, float * yaw0, float * roll0, float * pitch1, float * yaw1, float * roll1) {
  220. dMatrix m(frontX);
  221. dVector v0, v1;
  222. m.GetEulerAngles(v0, v1, m_pitchYawRoll);
  223. *pitch0 = v0[0];
  224. *yaw0 = v0[1];
  225. *roll0 = v0[2];
  226. *pitch1 = v1[0];
  227. *yaw1 = v1[1];
  228. *roll1 = v1[2];
  229. }
  230. BBObject * bmx_newtondynamics_RayCastDelegateFromPtr(void * data) {
  231. return (BBObject*)data;
  232. }