149 lines
4.2 KiB
Diff
149 lines
4.2 KiB
Diff
|
2659,2804d2658
|
||
|
<
|
||
|
< /******************** breakable joint contribution ***********************/
|
||
|
< extern "C" void dJointSetBreakable (dxJoint *joint, int b) {
|
||
|
< dAASSERT(joint);
|
||
|
< if (b) {
|
||
|
< // we want this joint to be breakable but we must first check if it
|
||
|
< // was already breakable
|
||
|
< if (!joint->breakInfo) {
|
||
|
< // allocate a dxJointBreakInfo struct
|
||
|
< joint->breakInfo = new dxJointBreakInfo;
|
||
|
< joint->breakInfo->flags = 0;
|
||
|
< for (int i = 0; i < 3; i++) {
|
||
|
< joint->breakInfo->b1MaxF[0] = 0;
|
||
|
< joint->breakInfo->b1MaxT[0] = 0;
|
||
|
< joint->breakInfo->b2MaxF[0] = 0;
|
||
|
< joint->breakInfo->b2MaxT[0] = 0;
|
||
|
< }
|
||
|
< joint->breakInfo->callback = 0;
|
||
|
< }
|
||
|
< else {
|
||
|
< // the joint was already breakable
|
||
|
< return;
|
||
|
< }
|
||
|
< }
|
||
|
< else {
|
||
|
< // we want this joint to be unbreakable mut we must first check if
|
||
|
< // it is alreay unbreakable
|
||
|
< if (joint->breakInfo) {
|
||
|
< // deallocate the dxJointBreakInfo struct
|
||
|
< delete joint->breakInfo;
|
||
|
< joint->breakInfo = 0;
|
||
|
< }
|
||
|
< else {
|
||
|
< // the joint was already unbreakable
|
||
|
< return;
|
||
|
< }
|
||
|
< }
|
||
|
< }
|
||
|
<
|
||
|
< extern "C" void dJointSetBreakCallback (dxJoint *joint, dJointBreakCallback *callbackFunc) {
|
||
|
< dAASSERT(joint);
|
||
|
< # ifndef dNODEBUG
|
||
|
< // only works for a breakable joint
|
||
|
< if (!joint->breakInfo) {
|
||
|
< dDebug (0, "dJointSetBreakCallback called on unbreakable joint");
|
||
|
< }
|
||
|
< # endif
|
||
|
< joint->breakInfo->callback = callbackFunc;
|
||
|
< }
|
||
|
<
|
||
|
< extern "C" void dJointSetBreakMode (dxJoint *joint, int mode) {
|
||
|
< dAASSERT(joint);
|
||
|
< # ifndef dNODEBUG
|
||
|
< // only works for a breakable joint
|
||
|
< if (!joint->breakInfo) {
|
||
|
< dDebug (0, "dJointSetBreakMode called on unbreakable joint");
|
||
|
< }
|
||
|
< # endif
|
||
|
< joint->breakInfo->flags = mode;
|
||
|
< }
|
||
|
<
|
||
|
< extern "C" int dJointGetBreakMode (dxJoint *joint) {
|
||
|
< dAASSERT(joint);
|
||
|
< # ifndef dNODEBUG
|
||
|
< // only works for a breakable joint
|
||
|
< if (!joint->breakInfo) {
|
||
|
< dDebug (0, "dJointGetBreakMode called on unbreakable joint");
|
||
|
< }
|
||
|
< # endif
|
||
|
< return joint->breakInfo->flags;
|
||
|
< }
|
||
|
<
|
||
|
< extern "C" void dJointSetBreakForce (dxJoint *joint, int body, dReal x, dReal y, dReal z) {
|
||
|
< dAASSERT(joint);
|
||
|
< # ifndef dNODEBUG
|
||
|
< // only works for a breakable joint
|
||
|
< if (!joint->breakInfo) {
|
||
|
< dDebug (0, "dJointSetBreakForce called on unbreakable joint");
|
||
|
< }
|
||
|
< # endif
|
||
|
< if (body) {
|
||
|
< joint->breakInfo->b2MaxF[0] = x;
|
||
|
< joint->breakInfo->b2MaxF[1] = y;
|
||
|
< joint->breakInfo->b2MaxF[2] = z;
|
||
|
< }
|
||
|
< else {
|
||
|
< joint->breakInfo->b1MaxF[0] = x;
|
||
|
< joint->breakInfo->b1MaxF[1] = y;
|
||
|
< joint->breakInfo->b1MaxF[2] = z;
|
||
|
< }
|
||
|
< }
|
||
|
<
|
||
|
< extern "C" void dJointSetBreakTorque (dxJoint *joint, int body, dReal x, dReal y, dReal z) {
|
||
|
< dAASSERT(joint);
|
||
|
< # ifndef dNODEBUG
|
||
|
< // only works for a breakable joint
|
||
|
< if (!joint->breakInfo) {
|
||
|
< dDebug (0, "dJointSetBreakTorque called on unbreakable joint");
|
||
|
< }
|
||
|
< # endif
|
||
|
< if (body) {
|
||
|
< joint->breakInfo->b2MaxT[0] = x;
|
||
|
< joint->breakInfo->b2MaxT[1] = y;
|
||
|
< joint->breakInfo->b2MaxT[2] = z;
|
||
|
< }
|
||
|
< else {
|
||
|
< joint->breakInfo->b1MaxT[0] = x;
|
||
|
< joint->breakInfo->b1MaxT[1] = y;
|
||
|
< joint->breakInfo->b1MaxT[2] = z;
|
||
|
< }
|
||
|
< }
|
||
|
<
|
||
|
< extern "C" int dJointIsBreakable (dxJoint *joint) {
|
||
|
< dAASSERT(joint);
|
||
|
< return joint->breakInfo != 0;
|
||
|
< }
|
||
|
<
|
||
|
< extern "C" void dJointGetBreakForce (dxJoint *joint, int body, dReal *force) {
|
||
|
< dAASSERT(joint);
|
||
|
< # ifndef dNODEBUG
|
||
|
< // only works for a breakable joint
|
||
|
< if (!joint->breakInfo) {
|
||
|
< dDebug (0, "dJointGetBreakForce called on unbreakable joint");
|
||
|
< }
|
||
|
< # endif
|
||
|
< if (body)
|
||
|
< for (int i=0; i<3; i++) force[i]=joint->breakInfo->b2MaxF[i];
|
||
|
< else
|
||
|
< for (int i=0; i<3; i++) force[i]=joint->breakInfo->b1MaxF[i];
|
||
|
< }
|
||
|
<
|
||
|
< extern "C" void dJointGetBreakTorque (dxJoint *joint, int body, dReal *torque) {
|
||
|
< dAASSERT(joint);
|
||
|
< # ifndef dNODEBUG
|
||
|
< // only works for a breakable joint
|
||
|
< if (!joint->breakInfo) {
|
||
|
< dDebug (0, "dJointGetBreakTorque called on unbreakable joint");
|
||
|
< }
|
||
|
< # endif
|
||
|
< if (body)
|
||
|
< for (int i=0; i<3; i++) torque[i]=joint->breakInfo->b2MaxT[i];
|
||
|
< else
|
||
|
< for (int i=0; i<3; i++) torque[i]=joint->breakInfo->b1MaxT[i];
|
||
|
< }
|
||
|
< /*************************************************************************/
|
||
|
<
|
||
|
\ No newline at end of file
|