[Bf-blender-cvs] [ee199c5] fracture_modifier: crash fix for trigger when used with constraints, they were attempted to be removed multiple times
Martin Felke
noreply at git.blender.org
Thu Nov 6 14:10:48 CET 2014
Commit: ee199c563daea3277b1848ff162a0b0999f35edf
Author: Martin Felke
Date: Thu Nov 6 14:10:32 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBee199c563daea3277b1848ff162a0b0999f35edf
crash fix for trigger when used with constraints, they were attempted to be removed multiple times
===================================================================
M intern/rigidbody/rb_bullet_api.cpp
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index dcd1582..bfe12be 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -172,6 +172,7 @@ void* rbContactCallback::bworld = NULL;
bool rbContactCallback::handle_contacts(btManifoldPoint& point, btCollisionObject* body0, btCollisionObject* body1)
{
+ bool ret = false;
if (rbContactCallback::callback)
{
rbContactPoint *cp = new rbContactPoint;
@@ -193,6 +194,7 @@ bool rbContactCallback::handle_contacts(btManifoldPoint& point, btCollisionObjec
delete cp;
}
+ return ret;
}
/* ********************************** */
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 3b9675b..892caff 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1454,7 +1454,9 @@ void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
if (rbc->physics_constraint) {
if (rebuild == false)
+ {
RB_dworld_remove_constraint(rbw->physics_world, rbc->physics_constraint);
+ }
}
if (rbc->physics_constraint == NULL || rebuild) {
@@ -1625,6 +1627,7 @@ static int filterCallback(void* world, void* island1, void* island2) {
ob1 = rbw->objects[ob_index1];
if (ob1->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION)
{
+ RigidBodyShardCon *con;
fmd1 = (FractureModifierData*)modifiers_findByType(ob1, eModifierType_Fracture);
for (mi = fmd1->meshIslands.first; mi; mi = mi->next)
{
@@ -1636,11 +1639,20 @@ static int filterCallback(void* world, void* island1, void* island2) {
rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
}
}
+
+ for (con = fmd1->meshConstraints.first; con; con = con->next)
+ {
+ RB_dworld_remove_constraint(rbw->physics_world, con->physics_constraint);
+ RB_constraint_delete(con->physics_constraint);
+ con->physics_constraint = NULL;
+ con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+ }
}
ob2 = rbw->objects[ob_index2];
if (ob2->rigidbody_object->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION)
{
+ RigidBodyShardCon *con;
fmd2 = (FractureModifierData*)modifiers_findByType(ob2, eModifierType_Fracture);
for (mi = fmd2->meshIslands.first; mi; mi = mi->next)
@@ -1654,12 +1666,21 @@ static int filterCallback(void* world, void* island1, void* island2) {
rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
}
}
+
+ for (con = fmd2->meshConstraints.first; con; con = con->next)
+ {
+ RB_dworld_remove_constraint(rbw->physics_world, con->physics_constraint);
+ RB_constraint_delete(con->physics_constraint);
+ con->physics_constraint = NULL;
+ con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+ }
}
}
return mi1->rigidbody->col_groups == mi2->rigidbody->col_groups;
}
+#if 0
static void contactCallback(rbContactPoint* cp, void* world)
{
MeshIsland* mi1, *mi2;
@@ -1739,6 +1760,7 @@ static void contactCallback(rbContactPoint* cp, void* world)
}
}
}
+#endif
/* --------------------- */
@@ -2640,7 +2662,8 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
}
}
- if (rebuild) {
+ if (rebuild || rbsc->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD ||
+ rbsc->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD) {
/* World has been rebuilt so rebuild constraint */
BKE_rigidbody_validate_sim_shard_constraint(rbw, rbsc, true);
BKE_rigidbody_start_dist_angle(rbsc);
@@ -2985,13 +3008,10 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], flo
// RB_TODO update rigid body physics object's loc/rot for dynamic objects here as well (needs to be done outside bullet's update loop)
}
-void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
+static void restoreKinematic(RigidBodyWorld *rbw)
{
GroupObject *go;
- if (rbw)
- rbw->pointcache->flag |= PTCACHE_OUTDATED;
-
/*restore kinematic state of shards if object is kinematic*/
for (go = rbw->group->gobject.first; go; go = go->next) {
if ((go->ob) && (go->ob->rigidbody_object) && (go->ob->rigidbody_object->flag & RBO_FLAG_KINEMATIC))
@@ -3002,17 +3022,33 @@ void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
MeshIsland* mi;
for (mi = fmd->meshIslands.first; mi; mi = mi->next)
{
+ RigidBodyShardCon* con;
+ int i = 0;
+
if (mi->rigidbody)
{
mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
mi->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
}
+
+ for (i = 0; i < mi->participating_constraint_count; i++)
+ {
+ con = mi->participating_constraints[i];
+ con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+ }
}
}
}
}
}
+void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
+{
+ if (rbw)
+ rbw->pointcache->flag |= PTCACHE_OUTDATED;
+
+ restoreKinematic(rbw);
+}
/* ------------------ */
@@ -3063,6 +3099,7 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
if (ctime <= startframe) {
/* rebuild constraints */
rbw->rebuild_comp_con = true;
+ restoreKinematic(rbw);
rbw->ltime = startframe;
if ((rbw->object_changed))
More information about the Bf-blender-cvs
mailing list