[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