Commit: c04b4d393b88cc50a478fe20a9266b6f975e8171
Author: Martin Felke
Date:   Fri Sep 9 13:33:34 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBc04b4d393b88cc50a478fe20a9266b6f975e8171

fixes: activating clusters via percentage, add meshisland id as name in 
fracture too, load crash fix

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

M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/blenloader/intern/readfile.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 ac42878..a4d0f50 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -3199,6 +3199,28 @@ static void validateShard(RigidBodyWorld *rbw, 
MeshIsland *mi, Object *ob, int r
        mi->rigidbody->flag &= ~(RBO_FLAG_NEEDS_VALIDATE | 
RBO_FLAG_NEEDS_RESHAPE);
 }
 
+static void activateCluster(MeshIsland *mi, int particle_index, RigidBodyWorld 
*rbw, Object *ob) {
+       RigidBodyShardCon *con;
+       int i = 0;
+       for (i = 0; i < mi->participating_constraint_count; i++)
+       {
+               con = mi->participating_constraints[i];
+               if (con->physics_constraint && con->mi1->particle_index == 
particle_index) {
+                       if (con->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+                               activateRigidbody(con->mi1->rigidbody, rbw, 
con->mi1, ob);
+                               activateCluster(con->mi1, particle_index, rbw, 
ob);
+                       }
+               }
+
+               if (con->physics_constraint && con->mi2->particle_index == 
particle_index) {
+                       if (con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+                               activateRigidbody(con->mi2->rigidbody, rbw, 
con->mi2, ob);
+                               activateCluster(con->mi2, particle_index, rbw, 
ob);
+                       }
+               }
+       }
+}
+
 static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, 
MeshIsland *mi, RigidBodyWorld *rbw, int breaking_percentage)
 {
        int broken_cons = 0, cons = 0, i = 0, cluster_cons = 0, 
broken_cluster_cons = 0;
@@ -3239,9 +3261,17 @@ static void 
handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
                                        if (fmd->use_breaking)
                                        {
                                                if (con->physics_constraint) {
+
                                                        
RB_constraint_set_enabled(con->physics_constraint, false);
-                                                       
activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
-                                                       
activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+                                                       if 
(con->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+                                                               
activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
+                                                               
activateCluster(con->mi1, mi->particle_index, rbw, ob);
+                                                       }
+
+                                                       if 
(con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+                                                               
activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+                                                               
activateCluster(con->mi2, mi->particle_index, rbw, ob);
+                                                       }
                                                }
                                        }
                                }
@@ -4454,9 +4484,11 @@ void BKE_rigidbody_do_simulation(Scene *scene, float 
ctime)
        }
        else if (rbw->ltime == startframe)
        {
-               bool did_it = restoreKinematic(rbw);
-               if (did_it)
-                       rigidbody_update_simulation(scene, rbw, true);
+               /*bool did_it = */restoreKinematic(rbw);
+               //if (did_it)
+
+               //make 1st run like later runs... hack...
+               rigidbody_update_simulation(scene, rbw, true);
        }
 
        /* advance simulation, we can only step one frame forward */
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 0ffc34c..430a719 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5287,7 +5287,12 @@ static void load_fracture_modifier(FileData* fd, 
FractureModifierData *fmd)
                                sh = shards[i]; //skip "empty" shards
                                while (sh->shard_id < mi->id)
                                {
-                                       sh = sh->next;
+                                       if (sh->next) {
+                                               sh = sh->next;
+                                       }
+                                       else {
+                                               break;
+                                       }
                                }
 
                                if (sh)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 58ac0d4..1d3987d 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1853,6 +1853,7 @@ static float do_setup_meshisland(FractureModifierData 
*fmd, Object *ob, int totv
        mi->thresh_weight = 0.0f;
        mi->ground_weight = 0.0f;
        mi->id = id;
+       snprintf(mi->name, 64, "%d", mi->id);
        mi->vertices = verts; /*those are temporary only !!! */
        mi->vertco = MEM_mallocN(sizeof(float) * 3 * totvert, "mi->vertco");
        memcpy(mi->vertco, vertco, 3 * totvert * sizeof(float));
@@ -2240,7 +2241,7 @@ static void halve(FractureModifierData *rmd, Object *ob, 
int minsize, BMesh **bm
 
 static void mesh_separate_loose(FractureModifierData *rmd, Object *ob, 
DerivedMesh *dm)
 {
-       int minsize = 1000;
+       int minsize = 100;
        BMesh *bm_work;
        BMVert *vert, **orig_start;
        BMIter iter;
@@ -2284,6 +2285,9 @@ static void do_constraint(FractureModifierData* fmd, 
MeshIsland *mi1, MeshIsland
        rbsc = BKE_rigidbody_create_shard_constraint(fmd->modifier.scene, 
con_type, true);
        rbsc->mi1 = mi1;
        rbsc->mi2 = mi2;
+
+       snprintf(rbsc->name, 64, "%s-%s", rbsc->mi1->name, rbsc->mi2->name);
+
        if (thresh == 0 || fmd->use_breaking == false) {
                rbsc->flag &= ~RBC_FLAG_USE_BREAKING;
        }
@@ -3213,6 +3217,7 @@ static void do_island_from_shard(FractureModifierData 
*fmd, Object *ob, Shard* s
        mat4_to_loc_quat(dummyloc, rot, ob->obmat);
        copy_qt_qt(mi->rot, rot);
        mi->id = s->shard_id;
+       snprintf(mi->name, 64, "%d", mi->id);
 
        if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
        {

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

Reply via email to