Commit: 80def34da1237cf7f362672ff7c3dfb36f96fca3
Author: Martin Felke
Date:   Thu Feb 4 20:19:57 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB80def34da1237cf7f362672ff7c3dfb36f96fca3

some more mutex locking for dynamic fracture, there still were crashes when 
interactively moving dynamic objects during running sim

===================================================================

M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 97e92c9..ba6a15d 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -3744,6 +3744,7 @@ static void rigidbody_update_simulation(Scene *scene, 
RigidBodyWorld *rbw, bool
        }
 }
 
+static ThreadMutex post_step_lock = BLI_MUTEX_INITIALIZER;
 static void rigidbody_update_simulation_post_step(RigidBodyWorld *rbw)
 {
        GroupObject *go;
@@ -3757,6 +3758,7 @@ static void 
rigidbody_update_simulation_post_step(RigidBodyWorld *rbw)
 
                Object *ob = go->ob;
                //handle fractured rigidbodies, maybe test for psys as well ?
+               BLI_mutex_lock(&post_step_lock);
                for (md = ob->modifiers.first; md; md = md->next) {
                        if (md->type == eModifierType_Fracture) {
                                rmd = (FractureModifierData *)md;
@@ -3765,7 +3767,7 @@ static void 
rigidbody_update_simulation_post_step(RigidBodyWorld *rbw)
                                                rbo = mi->rigidbody;
                                                if (!rbo) continue;
                                                /* reset kinematic state for 
transformed objects */
-                                               if (ob->flag & SELECT && 
G.moving & G_TRANSFORM_OBJ) {
+                                               if (rbo->physics_object && 
ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ) {
                                                        
RB_body_set_kinematic_state(rbo->physics_object, rbo->flag & RBO_FLAG_KINEMATIC 
|| rbo->flag & RBO_FLAG_DISABLED);
                                                        
RB_body_set_mass(rbo->physics_object, RBO_GET_MASS(rbo));
                                                        /* deactivate passive 
objects so they don't interfere with deactivation of active objects */
@@ -3774,7 +3776,7 @@ static void 
rigidbody_update_simulation_post_step(RigidBodyWorld *rbw)
                                                }
 
                                                /* update stored velocities, 
can be set again after sim rebuild */
-                                               if (rmd->fracture_mode == 
MOD_FRACTURE_DYNAMIC)
+                                               if (rmd->fracture_mode == 
MOD_FRACTURE_DYNAMIC && rbo->physics_object)
                                                {
                                                        if (!(rbo->flag & 
RBO_FLAG_KINEMATIC))
                                                        {
@@ -3788,6 +3790,7 @@ static void 
rigidbody_update_simulation_post_step(RigidBodyWorld *rbw)
                                }
                        }
                }
+               BLI_mutex_unlock(&post_step_lock);
 
                /* handle regular rigidbodies */
                if (ob && !modFound) {
@@ -4314,6 +4317,7 @@ static void resetExternal(RigidBodyWorld *rbw)
        }
 }
 
+static ThreadMutex reset_lock = BLI_MUTEX_INITIALIZER;
 static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
 {
        GroupObject *go;
@@ -4350,6 +4354,7 @@ static void resetDynamic(RigidBodyWorld *rbw, bool 
do_reset_always)
                                        return;
                                }
 
+                               BLI_mutex_lock(&reset_lock);
                                fmd->refresh = true;
                                fmd->reset_shards = true;
                                fmd->last_frame = INT_MAX;
@@ -4391,6 +4396,7 @@ static void resetDynamic(RigidBodyWorld *rbw, bool 
do_reset_always)
                                                break;
                                        }
                                }
+                               BLI_mutex_unlock(&reset_lock);
 
                                //DAG_id_tag_update(go->ob, OB_RECALC_ALL);
                                //WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, 
go->ob);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 5d68c29..70408ba 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -42,6 +42,7 @@
 #include "BLI_rand.h"
 #include "BLI_utildefines.h"
 #include "BLI_string.h"
+#include "BLI_threads.h"
 
 
 #include "BKE_cdderivedmesh.h"
@@ -4392,6 +4393,7 @@ static void do_prehalving(FractureModifierData *fmd, 
Object* ob, DerivedMesh* de
 }
 #endif
 
+static ThreadMutex dynamic_lock = BLI_MUTEX_INITIALIZER;
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                                   DerivedMesh *derivedData,
                                   ModifierApplyFlag UNUSED(flag))
@@ -4428,7 +4430,9 @@ static DerivedMesh *applyModifier(ModifierData *md, 
Object *ob,
                        //rigidbody_object_add(md->scene, ob, RBO_TYPE_ACTIVE);
                }
 
+               BLI_mutex_lock(&dynamic_lock);
                final_dm = do_dynamic(fmd, ob, derivedData);
+               BLI_mutex_unlock(&dynamic_lock);
        }
        else if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
        {

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

Reply via email to