joint.cpp.diff 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. 2659,2804d2658
  2. <
  3. < /******************** breakable joint contribution ***********************/
  4. < extern "C" void dJointSetBreakable (dxJoint *joint, int b) {
  5. < dAASSERT(joint);
  6. < if (b) {
  7. < // we want this joint to be breakable but we must first check if it
  8. < // was already breakable
  9. < if (!joint->breakInfo) {
  10. < // allocate a dxJointBreakInfo struct
  11. < joint->breakInfo = new dxJointBreakInfo;
  12. < joint->breakInfo->flags = 0;
  13. < for (int i = 0; i < 3; i++) {
  14. < joint->breakInfo->b1MaxF[0] = 0;
  15. < joint->breakInfo->b1MaxT[0] = 0;
  16. < joint->breakInfo->b2MaxF[0] = 0;
  17. < joint->breakInfo->b2MaxT[0] = 0;
  18. < }
  19. < joint->breakInfo->callback = 0;
  20. < }
  21. < else {
  22. < // the joint was already breakable
  23. < return;
  24. < }
  25. < }
  26. < else {
  27. < // we want this joint to be unbreakable mut we must first check if
  28. < // it is alreay unbreakable
  29. < if (joint->breakInfo) {
  30. < // deallocate the dxJointBreakInfo struct
  31. < delete joint->breakInfo;
  32. < joint->breakInfo = 0;
  33. < }
  34. < else {
  35. < // the joint was already unbreakable
  36. < return;
  37. < }
  38. < }
  39. < }
  40. <
  41. < extern "C" void dJointSetBreakCallback (dxJoint *joint, dJointBreakCallback *callbackFunc) {
  42. < dAASSERT(joint);
  43. < # ifndef dNODEBUG
  44. < // only works for a breakable joint
  45. < if (!joint->breakInfo) {
  46. < dDebug (0, "dJointSetBreakCallback called on unbreakable joint");
  47. < }
  48. < # endif
  49. < joint->breakInfo->callback = callbackFunc;
  50. < }
  51. <
  52. < extern "C" void dJointSetBreakMode (dxJoint *joint, int mode) {
  53. < dAASSERT(joint);
  54. < # ifndef dNODEBUG
  55. < // only works for a breakable joint
  56. < if (!joint->breakInfo) {
  57. < dDebug (0, "dJointSetBreakMode called on unbreakable joint");
  58. < }
  59. < # endif
  60. < joint->breakInfo->flags = mode;
  61. < }
  62. <
  63. < extern "C" int dJointGetBreakMode (dxJoint *joint) {
  64. < dAASSERT(joint);
  65. < # ifndef dNODEBUG
  66. < // only works for a breakable joint
  67. < if (!joint->breakInfo) {
  68. < dDebug (0, "dJointGetBreakMode called on unbreakable joint");
  69. < }
  70. < # endif
  71. < return joint->breakInfo->flags;
  72. < }
  73. <
  74. < extern "C" void dJointSetBreakForce (dxJoint *joint, int body, dReal x, dReal y, dReal z) {
  75. < dAASSERT(joint);
  76. < # ifndef dNODEBUG
  77. < // only works for a breakable joint
  78. < if (!joint->breakInfo) {
  79. < dDebug (0, "dJointSetBreakForce called on unbreakable joint");
  80. < }
  81. < # endif
  82. < if (body) {
  83. < joint->breakInfo->b2MaxF[0] = x;
  84. < joint->breakInfo->b2MaxF[1] = y;
  85. < joint->breakInfo->b2MaxF[2] = z;
  86. < }
  87. < else {
  88. < joint->breakInfo->b1MaxF[0] = x;
  89. < joint->breakInfo->b1MaxF[1] = y;
  90. < joint->breakInfo->b1MaxF[2] = z;
  91. < }
  92. < }
  93. <
  94. < extern "C" void dJointSetBreakTorque (dxJoint *joint, int body, dReal x, dReal y, dReal z) {
  95. < dAASSERT(joint);
  96. < # ifndef dNODEBUG
  97. < // only works for a breakable joint
  98. < if (!joint->breakInfo) {
  99. < dDebug (0, "dJointSetBreakTorque called on unbreakable joint");
  100. < }
  101. < # endif
  102. < if (body) {
  103. < joint->breakInfo->b2MaxT[0] = x;
  104. < joint->breakInfo->b2MaxT[1] = y;
  105. < joint->breakInfo->b2MaxT[2] = z;
  106. < }
  107. < else {
  108. < joint->breakInfo->b1MaxT[0] = x;
  109. < joint->breakInfo->b1MaxT[1] = y;
  110. < joint->breakInfo->b1MaxT[2] = z;
  111. < }
  112. < }
  113. <
  114. < extern "C" int dJointIsBreakable (dxJoint *joint) {
  115. < dAASSERT(joint);
  116. < return joint->breakInfo != 0;
  117. < }
  118. <
  119. < extern "C" void dJointGetBreakForce (dxJoint *joint, int body, dReal *force) {
  120. < dAASSERT(joint);
  121. < # ifndef dNODEBUG
  122. < // only works for a breakable joint
  123. < if (!joint->breakInfo) {
  124. < dDebug (0, "dJointGetBreakForce called on unbreakable joint");
  125. < }
  126. < # endif
  127. < if (body)
  128. < for (int i=0; i<3; i++) force[i]=joint->breakInfo->b2MaxF[i];
  129. < else
  130. < for (int i=0; i<3; i++) force[i]=joint->breakInfo->b1MaxF[i];
  131. < }
  132. <
  133. < extern "C" void dJointGetBreakTorque (dxJoint *joint, int body, dReal *torque) {
  134. < dAASSERT(joint);
  135. < # ifndef dNODEBUG
  136. < // only works for a breakable joint
  137. < if (!joint->breakInfo) {
  138. < dDebug (0, "dJointGetBreakTorque called on unbreakable joint");
  139. < }
  140. < # endif
  141. < if (body)
  142. < for (int i=0; i<3; i++) torque[i]=joint->breakInfo->b2MaxT[i];
  143. < else
  144. < for (int i=0; i<3; i++) torque[i]=joint->breakInfo->b1MaxT[i];
  145. < }
  146. < /*************************************************************************/
  147. <
  148. \ No newline at end of file