Commit: fb8acd8b33310919c38cb1e208fdbdb9dc655d27
Author: Martin Felke
Date:   Sat Feb 24 11:20:44 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rBfb8acd8b33310919c38cb1e208fdbdb9dc655d27

optionally restore old activation behavior with broken constraints

this allows easier breaking / collapsing of objects

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

M       release/scripts/startup/bl_ui/properties_physics_fracture.py
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_fracture.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py 
b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 561a0f2d564..20efd1f0557 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -217,6 +217,7 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, 
Panel):
         row.prop(md, "use_self_collision")
         row = layout.row()
         row.prop(md, "use_compounds")
+        row.prop(md, "activate_broken")
 
         col = layout.column(align=True)
         col.prop(md, "constraint_target")
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index b88900f3746..2f6ce8c594a 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -4087,7 +4087,7 @@ static bool do_activate(Object* ob, Object *ob2, 
MeshIsland *mi_compare, RigidBo
 
                        RigidBodyOb* rbo = mi->rigidbody;
                        if ((((rbo->flag & RBO_FLAG_KINEMATIC) || 
different_cluster) &&
-                            ((mi_compare == mi) /*|| (same_cluster && 
!dissolve)*/)) && valid)
+                            ((mi_compare == mi) || (same_cluster && !dissolve 
&& fmd->activate_broken))) && valid)
                        {
                                if (rbo->physics_object && activate) {
                                        activateRigidbody(rbo, rbw, mi, ob);
@@ -4703,7 +4703,7 @@ static void activateCluster(MeshIsland *mi, int 
particle_index, RigidBodyWorld *
                {
                        if (con->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) {
                                activateRigidbody(con->mi1->rigidbody, rbw, 
con->mi1, ob);
-                               activateCluster(con->mi1, particle_index, rbw, 
ob);
+                               //activateCluster(con->mi1, particle_index, 
rbw, ob);
                        }
                }
 
@@ -4711,7 +4711,7 @@ static void activateCluster(MeshIsland *mi, int 
particle_index, RigidBodyWorld *
                {
                        if (con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) {
                                activateRigidbody(con->mi2->rigidbody, rbw, 
con->mi2, ob);
-                               activateCluster(con->mi2, particle_index, rbw, 
ob);
+                               //activateCluster(con->mi2, particle_index, 
rbw, ob);
                        }
                }
        }
@@ -4780,14 +4780,15 @@ static void 
handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
 
                                                        
RB_constraint_set_enabled(con->physics_constraint, false);
                                                        /*if 
(con->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC ||
-                                                           
con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC )
+                                                           
con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC ) */
+                                                       if 
(fmd->activate_broken)
                                                        {
                                                                
activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
                                                                
activateCluster(con->mi1, con->mi1->particle_index, rbw, ob);
 
                                                                
activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
                                                                
activateCluster(con->mi2, con->mi2->particle_index, rbw, ob);
-                                                       }*/
+                                                       }
                                                }
                                        }
                                }
@@ -4804,8 +4805,11 @@ static void 
handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
                                {
                                        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 (fmd->activate_broken)
+                                               {
+                                                       
activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
+                                                       
activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+                                               }
                                        }
                                }
                        }
@@ -4917,8 +4921,11 @@ static void handle_breaking_angle(FractureModifierData 
*fmd, Object *ob, RigidBo
                                //break constraint
                                if (rbsc->physics_constraint) {
                                        
RB_constraint_set_enabled(rbsc->physics_constraint, false);
-                                       
//activateRigidbody(rbsc->mi1->rigidbody, rbw, rbsc->mi1, ob);
-                                       
//activateRigidbody(rbsc->mi2->rigidbody, rbw, rbsc->mi2, ob);
+                                       if (fmd->activate_broken)
+                                       {
+                                               
activateRigidbody(rbsc->mi1->rigidbody, rbw, rbsc->mi1, ob);
+                                               
activateRigidbody(rbsc->mi2->rigidbody, rbw, rbsc->mi2, ob);
+                                       }
                                }
                        }
                }
@@ -4931,8 +4938,11 @@ static void handle_breaking_angle(FractureModifierData 
*fmd, Object *ob, RigidBo
                {
                        if (rbsc->physics_constraint) {
                                
RB_constraint_set_enabled(rbsc->physics_constraint, false);
-                               //activateRigidbody(rbsc->mi1->rigidbody, rbw, 
rbsc->mi1, ob);
-                               //activateRigidbody(rbsc->mi2->rigidbody, rbw, 
rbsc->mi2, ob);
+                               if (fmd->activate_broken)
+                               {
+                                       activateRigidbody(rbsc->mi1->rigidbody, 
rbw, rbsc->mi1, ob);
+                                       activateRigidbody(rbsc->mi2->rigidbody, 
rbw, rbsc->mi2, ob);
+                               }
                        }
                }
        }
@@ -4952,8 +4962,11 @@ static void 
handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi
                        {
                                if (rbsc->physics_constraint) {
                                        
RB_constraint_set_enabled(rbsc->physics_constraint, false);
-                                       
//activateRigidbody(rbsc->mi1->rigidbody, rbw, rbsc->mi1, ob);
-                                       
//activateRigidbody(rbsc->mi2->rigidbody, rbw, rbsc->mi2, ob);
+                                       if (fmd->activate_broken)
+                                       {
+                                               
activateRigidbody(rbsc->mi1->rigidbody, rbw, rbsc->mi1, ob);
+                                               
activateRigidbody(rbsc->mi2->rigidbody, rbw, rbsc->mi2, ob);
+                                       }
                                }
                        }
                }
@@ -4966,8 +4979,11 @@ static void 
handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi
                {
                        if (rbsc->physics_constraint) {
                                
RB_constraint_set_enabled(rbsc->physics_constraint, false);
-                               //activateRigidbody(rbsc->mi1->rigidbody, rbw, 
rbsc->mi1, ob);
-                               //activateRigidbody(rbsc->mi2->rigidbody, rbw, 
rbsc->mi2, ob);
+                               if (fmd->activate_broken)
+                               {
+                                       activateRigidbody(rbsc->mi1->rigidbody, 
rbw, rbsc->mi1, ob);
+                                       activateRigidbody(rbsc->mi2->rigidbody, 
rbw, rbsc->mi2, ob);
+                               }
                        }
                }
        }
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index bfcac681cc9..b7969671adc 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1861,6 +1861,7 @@ typedef struct FractureModifierData {
        int deform_distance_weighted;
        int use_centroids;
        int use_vertices;
+       int activate_broken;
 
        /* internal flags */
        int use_experimental;
@@ -1883,7 +1884,7 @@ typedef struct FractureModifierData {
        short mat_ofs_intersect;
        short mat_ofs_difference;
 
-       //char pad[4];
+       char pad[4];
 } FractureModifierData;
 
 typedef struct DataTransferModifierData {
diff --git a/source/blender/makesrna/intern/rna_fracture.c 
b/source/blender/makesrna/intern/rna_fracture.c
index 713939e673a..227c995988a 100644
--- a/source/blender/makesrna/intern/rna_fracture.c
+++ b/source/blender/makesrna/intern/rna_fracture.c
@@ -1573,5 +1573,11 @@ void RNA_def_fracture(BlenderRNA *brna)
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+       prop = RNA_def_property(srna, "activate_broken", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "activate_broken", false);
+       RNA_def_property_ui_text(prop, "Activate Broken", "Activate both shards 
or all elements of the cluster if a constraint breaks");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
        RNA_api_fracture(brna, srna);
 }
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 336e713e0e9..30723cc4fb2 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -269,6 +269,7 @@ static void initData(ModifierData *md)
        zero_v3(fmd->grid_offset);
        zero_v3(fmd->grid_spacing);
        fmd->use_constraint_group = false;
+       fmd->activate_broken = false;
 }
 
 //XXX TODO, freeing functionality should be in BKE too
@@ -1924,6 +1925,7 @@ static void copyData(ModifierData *md, ModifierData 
*target)
        copy_v3_v3(trmd->grid_spacing, rmd->grid_spacing);
 
        trmd->use_constraint_group = rmd->use_constraint_group;
+       trmd->activate_broken = rmd->activate_broken;
 }
 
 //XXXX TODO, is BB really useds still ? aint there exact volume calc now ?

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to