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);
<       }
<   }
<   /*************************************************************************/
