[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31226] branches/soc-2010-aligorith-2/ source/blender: Bullet SoC - Collision shapes are now updated when object data (i.e.

Joshua Leung aligorith at gmail.com
Wed Aug 11 03:59:11 CEST 2010


Revision: 31226
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31226
Author:   aligorith
Date:     2010-08-11 03:59:10 +0200 (Wed, 11 Aug 2010)

Log Message:
-----------
Bullet SoC - Collision shapes are now updated when object data (i.e. geometry) changes, so they don't need to be manually rebuilt anymore.

Also while testing this, I noticed a few things: 
- it seems that the GImpact concave meshes handle collision detection much better for certain test cases, whereas BVH-Triangle Shapes would just let the shapes fall through/no tumbling. Funnily, enough, this didn't happen last time I tried
- got a crash the first time I tested after making these changes, but haven't been able to repeat it yet

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

Modified: branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/depsgraph.c	2010-08-11 00:38:12 UTC (rev 31225)
+++ branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/depsgraph.c	2010-08-11 01:59:10 UTC (rev 31226)
@@ -2282,17 +2282,30 @@
 		ob= (Object*)id;
 		ob->recalc |= (flag & OB_RECALC);
 		BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH);
-
+		
 		if(flag & OB_RECALC_DATA) {
 			/* all users of this ob->data should be checked */
 			id= ob->data;
-
+			
 			/* no point in trying in this cases */
 			if(!id || id->us <= 1)
 				id= NULL;
 			/* for locked shape keys we make an exception */
 			else if(ob_get_key(ob) && (ob->shapeflag & OB_SHAPE_LOCK))
 				id= NULL;
+				
+			/* for Rigid Bodies, force update if shape depends on the data */
+			if (ob->rigidbodySettings) {
+				RigidBodyOb *rbo = ob->rigidbodySettings;
+				
+				/* While strictly only the mesh-shapes really need rebuilding,
+				 * the other shapes also do since they use the bounds.
+				 *
+				 * Also, this only really applies for geometry bodies (hence the check)
+				 */
+				if (ELEM(rbo->type, RBO_TYPE_ACTIVE, RBO_TYPE_PASSIVE))
+					rbo->flag |= RBO_FLAG_NEEDS_RESHAPE;
+			}
 		}
 	}
 

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-11 00:38:12 UTC (rev 31225)
+++ branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c	2010-08-11 01:59:10 UTC (rev 31226)
@@ -775,15 +775,29 @@
 				
 				rbo = ob->rigidbodySettings;
 			}
-			else if (rbo->flag & RBO_FLAG_NEEDS_VALIDATE) {
-				/* there are settings, but the object(s) must be rebuilt (i.e. after being duplicated) */
-				BKE_rigidbody_validate_sim_object(rbw, ob, 1);
-				rbo->flag &= ~RBO_FLAG_NEEDS_VALIDATE;
+			else {
+				/* perform simulation data updates as tagged */
+					/* refresh object... */
+				if (rbo->flag & RBO_FLAG_NEEDS_VALIDATE) {
+					/* there are settings, but the object(s) must be rebuilt (i.e. after being duplicated) */
+					BKE_rigidbody_validate_sim_object(rbw, ob, 1);
+				}
+				else if (rbw->recalc & RBW_RECALC_REBUILD) {
+					/* there are settings, but the object(s) must be rebuilt (i.e. after file-reload) */
+					BKE_rigidbody_validate_sim_object(rbw, ob, 1);
+				}
+					/* refresh shape... */
+				else if (rbo->flag & RBO_FLAG_NEEDS_RESHAPE) {
+					/* mesh/shape data changed, so force shape refresh */
+					BKE_rigidbody_validate_sim_shape(ob, 1);
+					
+					/* now tell RB sim about it */
+					// XXX: we assume that this can only get applied for active/passive shapes that will be included as rigidbodies
+					rbBodySetCollisionShape(rbo->physics_object, rbo->physics_shape);
+				}
+				
+				rbo->flag &= ~(RBO_FLAG_NEEDS_VALIDATE|RBO_FLAG_NEEDS_RESHAPE);
 			}
-			else if (rbw->recalc & RBW_RECALC_REBUILD)  {
-				/* there are settings, but the object(s) must be rebuilt (i.e. after file-reload) */
-				BKE_rigidbody_validate_sim_object(rbw, ob, 1);
-			}
 			
 			/* update simulation object... */
 			rigidbody_update_sim_ob(scene, rbw, ob, rbo);

Modified: branches/soc-2010-aligorith-2/source/blender/makesdna/DNA_rigidbody_types.h
===================================================================
--- branches/soc-2010-aligorith-2/source/blender/makesdna/DNA_rigidbody_types.h	2010-08-11 00:38:12 UTC (rev 31225)
+++ branches/soc-2010-aligorith-2/source/blender/makesdna/DNA_rigidbody_types.h	2010-08-11 01:59:10 UTC (rev 31226)
@@ -144,6 +144,8 @@
 	RBO_FLAG_DYNAMIC_EVAL	= (1<<0),
 	/* rigidbody needs to be validated (usually set after duplicating and not hooked up yet) */
 	RBO_FLAG_NEEDS_VALIDATE = (1<<1),
+	/* rigidbody shape needs refreshing (usually after exiting editmode) */
+	RBO_FLAG_NEEDS_RESHAPE	= (1<<2),
 } eRigidBodyOb_Flag;
 
 /* RigidBody Collision Shape */





More information about the Bf-blender-cvs mailing list