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))

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to