[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31156] branches/soc-2010-aligorith-2/ source/blender/blenkernel/intern/rigidbody.c: Bullet SoC - Fix for bug when no effectors were present in the scene

Joshua Leung aligorith at gmail.com
Sun Aug 8 06:22:00 CEST 2010


Revision: 31156
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31156
Author:   aligorith
Date:     2010-08-08 06:21:58 +0200 (Sun, 08 Aug 2010)

Log Message:
-----------
Bullet SoC - Fix for bug when no effectors were present in the scene

Gravity (on the y-axis) was being applied to objects, on top of the normal z-axis gravity. Thus objects were moving diagonally.

Now, we check for effectors, and make sure that force is initialised before tring to calculate effectors.

Modified Paths:
--------------
    branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c

Modified: branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c
===================================================================
--- branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c	2010-08-08 04:19:06 UTC (rev 31155)
+++ branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c	2010-08-08 04:21:58 UTC (rev 31156)
@@ -587,27 +587,31 @@
 	if ((ob->pd == NULL) || (ob->pd->forcefield == PFIELD_NULL)) {
 		EffectorWeights *effector_weights = rbw->effector_weights;
 		EffectedPoint epoint;
-		ListBase *effectors = pdInitEffectors(scene, ob, NULL, effector_weights);
-		float loc[3], vel[3];
-		float force[3];
+		ListBase *effectors;
 		
-		/* create dummy 'point' which represents last known position of object as result of sim */
-#if 0 // XXX: this is the 'safe' version (using object info), but really should try grabbing from sim for better responses?
-		VECCOPY(loc, ob->obmat[3]);
-		vel[0]=vel[1]=vel[2]= 1.0f;
-#else // XXX: this can create some inaccuracies with sim position, but is probably better than using unsimulated vals?
-		rbBodyGetPosition(rbo->physics_object, loc);
-		rbBodyGetLinearVelocity(rbo->physics_object, vel);
-#endif
-		pd_point_from_loc(scene, loc, vel, 0, &epoint);
+		/* get effectors present in the group specified by effector_weights */
+		effectors = pdInitEffectors(scene, ob, NULL, effector_weights);
+		if (effectors) {
+			float force[3] = {0.0f, 0.0f, 0.0f};
+			float loc[3], vel[3];
+			
+			/* create dummy 'point' which represents last known position of object as result of sim */
+			// XXX: this can create some inaccuracies with sim position, but is probably better than using unsimulated vals?
+			rbBodyGetPosition(rbo->physics_object, loc);
+			rbBodyGetLinearVelocity(rbo->physics_object, vel);
+			
+			pd_point_from_loc(scene, loc, vel, 0, &epoint);
+			
+			/* calculate net force of effectors, and apply to sim object 
+			 *	- we use 'central force' since apply force requires a "relative position" which we don't have...
+			 */
+			pdDoEffectors(effectors, NULL, effector_weights, &epoint, force, NULL);
+			printf("\tapplying force (%f,%f,%f) to '%s'\n", force[0],force[1],force[2],ob->id.name+2);
+			rbBodyApplyCentralForce(rbo->physics_object, force);
+		}
+		else
+			printf("\tno forces to apply to '%s'\n", ob->id.name+2);
 		
-		/* calculate net force of effectors, and apply to sim object 
-		 *	- we use 'central force' since apply force requires a "relative position" which we don't have...
-		 */
-		pdDoEffectors(effectors, NULL, effector_weights, &epoint, force, NULL);
-		printf("\tapplying force (%f,%f,%f) to '%s'\n", force[0],force[1],force[2],ob->id.name+2);
-		rbBodyApplyCentralForce(rbo->physics_object, force);
-		
 		/* cleanup */
 		pdEndEffectors(&effectors);
 	}





More information about the Bf-blender-cvs mailing list