| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- 587,598c587,593
- < /******************** breakable joint contribution ***********************/
- < // this saves us a few dereferences
- < dxJointBreakInfo *jBI = joint->breakInfo;
- < // we need joint feedback if the joint is breakable or if the user
- < // requested feedback.
- < if (jBI||fb) {
- < // we need feedback on the amount of force that this joint is
- < // applying to the bodies. we use a slightly slower computation
- < // that splits out the force components and puts them in the
- < // feedback structure.
- < dJointFeedback temp_fb; // temporary storage for joint feedback
- < dReal data1[8],data2[8];
- ---
- > if (fb)
- > {
- > // the user has requested feedback on the amount of force that this
- > // joint is applying to the bodies. we use a slightly slower
- > // computation that splits out the force components and puts them
- > // in the feedback structure.
- > dReal data1[8], data2[8];
- 603,608c598,603
- < cf1[0] = (temp_fb.f1[0] = data1[0]);
- < cf1[1] = (temp_fb.f1[1] = data1[1]);
- < cf1[2] = (temp_fb.f1[2] = data1[2]);
- < cf1[4] = (temp_fb.t1[0] = data1[4]);
- < cf1[5] = (temp_fb.t1[1] = data1[5]);
- < cf1[6] = (temp_fb.t1[2] = data1[6]);
- ---
- > cf1[0] = (fb->f1[0] = data1[0]);
- > cf1[1] = (fb->f1[1] = data1[1]);
- > cf1[2] = (fb->f1[2] = data1[2]);
- > cf1[4] = (fb->t1[0] = data1[4]);
- > cf1[5] = (fb->t1[1] = data1[5]);
- > cf1[6] = (fb->t1[2] = data1[6]);
- 614,691c609,614
- < cf2[0] = (temp_fb.f2[0] = data2[0]);
- < cf2[1] = (temp_fb.f2[1] = data2[1]);
- < cf2[2] = (temp_fb.f2[2] = data2[2]);
- < cf2[4] = (temp_fb.t2[0] = data2[4]);
- < cf2[5] = (temp_fb.t2[1] = data2[5]);
- < cf2[6] = (temp_fb.t2[2] = data2[6]);
- < }
- < // if the user requested so we must copy the feedback information to
- < // the feedback struct that the user suplied.
- < if (fb) {
- < // copy temp_fb to fb
- < fb->f1[0] = temp_fb.f1[0];
- < fb->f1[1] = temp_fb.f1[1];
- < fb->f1[2] = temp_fb.f1[2];
- < fb->t1[0] = temp_fb.t1[0];
- < fb->t1[1] = temp_fb.t1[1];
- < fb->t1[2] = temp_fb.t1[2];
- < if (body[1]) {
- < fb->f2[0] = temp_fb.f2[0];
- < fb->f2[1] = temp_fb.f2[1];
- < fb->f2[2] = temp_fb.f2[2];
- < fb->t2[0] = temp_fb.t2[0];
- < fb->t2[1] = temp_fb.t2[1];
- < fb->t2[2] = temp_fb.t2[2];
- < }
- < }
- < // if the joint is breakable we need to check the breaking conditions
- < if (jBI) {
- < dReal relCF1[3];
- < dReal relCT1[3];
- < // multiply the force and torque vectors by the rotation matrix of body 1
- < dMULTIPLY1_331 (&relCF1[0],body[0]->R,&temp_fb.f1[0]);
- < dMULTIPLY1_331 (&relCT1[0],body[0]->R,&temp_fb.t1[0]);
- < if (jBI->flags & dJOINT_BREAK_AT_B1_FORCE) {
- < // check if the force is to high
- < for (int i = 0; i < 3; i++) {
- < if (relCF1[i] > jBI->b1MaxF[i]) {
- < jBI->flags |= dJOINT_BROKEN;
- < goto doneCheckingBreaks;
- < }
- < }
- < }
- < if (jBI->flags & dJOINT_BREAK_AT_B1_TORQUE) {
- < // check if the torque is to high
- < for (int i = 0; i < 3; i++) {
- < if (relCT1[i] > jBI->b1MaxT[i]) {
- < jBI->flags |= dJOINT_BROKEN;
- < goto doneCheckingBreaks;
- < }
- < }
- < }
- < if (body[1]) {
- < dReal relCF2[3];
- < dReal relCT2[3];
- < // multiply the force and torque vectors by the rotation matrix of body 2
- < dMULTIPLY1_331 (&relCF2[0],body[1]->R,&temp_fb.f2[0]);
- < dMULTIPLY1_331 (&relCT2[0],body[1]->R,&temp_fb.t2[0]);
- < if (jBI->flags & dJOINT_BREAK_AT_B2_FORCE) {
- < // check if the force is to high
- < for (int i = 0; i < 3; i++) {
- < if (relCF2[i] > jBI->b2MaxF[i]) {
- < jBI->flags |= dJOINT_BROKEN;
- < goto doneCheckingBreaks;
- < }
- < }
- < }
- < if (jBI->flags & dJOINT_BREAK_AT_B2_TORQUE) {
- < // check if the torque is to high
- < for (int i = 0; i < 3; i++) {
- < if (relCT2[i] > jBI->b2MaxT[i]) {
- < jBI->flags |= dJOINT_BROKEN;
- < goto doneCheckingBreaks;
- < }
- < }
- < }
- < }
- < doneCheckingBreaks:
- < ;
- ---
- > cf2[0] = (fb->f2[0] = data2[0]);
- > cf2[1] = (fb->f2[1] = data2[1]);
- > cf2[2] = (fb->f2[2] = data2[2]);
- > cf2[4] = (fb->t2[0] = data2[4]);
- > cf2[5] = (fb->t2[1] = data2[5]);
- > cf2[6] = (fb->t2[2] = data2[6]);
- 694d616
- < /*************************************************************************/
- 1178,1196d1099
- < /******************** breakable joint contribution ***********************/
- < dxJoint* nextJ;
- < if (!world->firstjoint)
- < nextJ = 0;
- < else
- < nextJ = (dxJoint*)world->firstjoint->next;
- < for (j=world->firstjoint; j; j=nextJ) {
- < nextJ = (dxJoint*)j->next;
- < // check if joint is breakable and broken
- < if (j->breakInfo && j->breakInfo->flags & dJOINT_BROKEN) {
- < // detach (break) the joint
- < dJointAttach (j, 0, 0);
- < // call the callback function if it is set
- < if (j->breakInfo->callback) j->breakInfo->callback (j);
- < // finally destroy the joint if the dJOINT_DELETE_ON_BREAK is set
- < if (j->breakInfo->flags & dJOINT_DELETE_ON_BREAK) dJointDestroy (j);
- < }
- < }
- < /*************************************************************************/
|