Commit: 3b0646b3accbecb05f75568039c2b0462abc6848
Author: Martin Felke
Date:   Tue Mar 7 16:41:09 2017 +0100
Branches: fracture_modifier
https://developer.blender.org/rB3b0646b3accbecb05f75568039c2b0462abc6848

dissolve constraint now only dissolves constraints between different clusters 
if clusters are used

additionally added a python-settable variable to indicate whether the dynamic 
fracture data has been loaded externally or not (just set it from the handler)

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

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/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 3a3eb6ab68..dbc0c13dc7 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -110,8 +110,13 @@ static void activateRigidbody(RigidBodyOb* rbo, 
RigidBodyWorld *UNUSED(rbw), Mes
 
        if (mi && ob->rigidbody_object->flag & RBO_FLAG_CONSTRAINT_DISSOLVE) {
                for (i = 0; i < mi->participating_constraint_count; i++) {
+                       bool different_cluster = false;
                        con = mi->participating_constraints[i];
-                       if (con->physics_constraint) {
+
+                       different_cluster = ((con->mi1->particle_index != 
con->mi2->particle_index) ||
+                                           ((con->mi1->particle_index == -1) 
&& (con->mi2->particle_index == -1)));
+
+                       if (con->physics_constraint && different_cluster) {
                                
RB_constraint_set_enabled(con->physics_constraint, false);
                        }
                }
@@ -1774,7 +1779,7 @@ static void 
rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
                return;
        }
 
-       if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL || fmd->fracture_mode 
== MOD_FRACTURE_DYNAMIC)
+       if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL || (fmd->fracture_mode 
== MOD_FRACTURE_DYNAMIC && fmd->is_dynamic_external))
        {
                mul_v3_m4v3(loc, ob->obmat, rbc->pos);
                mat4_to_quat(rot, ob->obmat);
@@ -1845,7 +1850,7 @@ static void 
rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
                        case RBC_TYPE_6DOF_SPRING:
                                rbc->physics_constraint = 
RB_constraint_new_6dof_spring(loc, rot, rb1, rb2);
 
-                               if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL 
|| fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
+                               if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL 
|| (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->is_dynamic_external))
                                {
                                        if ((rbc->plastic_angle < 0.0f) && 
(rbc->plastic_dist < 0.0f))
                                        {
@@ -2039,12 +2044,16 @@ static void do_activate(Object* ob, Object *ob2, 
MeshIsland *mi_compare, RigidBo
        {
                for (mi = fmd->meshIslands.first; mi; mi = mi->next)
                {
-                       bool same_cluster = (mi->particle_index != -1) &&
-                                           (mi->particle_index == 
mi_compare->particle_index);
+                       bool dissolve = ob->rigidbody_object->flag & 
RBO_FLAG_CONSTRAINT_DISSOLVE;
+
+                       bool same_cluster = ((mi->particle_index != -1) &&
+                                           (mi->particle_index == 
mi_compare->particle_index));
+
+                       bool different_cluster = !same_cluster && dissolve;
 
                        RigidBodyOb* rbo = mi->rigidbody;
-                       if (((rbo->flag & RBO_FLAG_KINEMATIC) || 
(ob->rigidbody_object->flag & RBO_FLAG_CONSTRAINT_DISSOLVE)) &&
-                            ((mi_compare == mi) || same_cluster))
+                       if (((rbo->flag & RBO_FLAG_KINEMATIC) || 
different_cluster) &&
+                            ((mi_compare == mi) || (same_cluster && 
!dissolve)))
                        {
                                if (rbo->physics_object) {
                                        activateRigidbody(rbo, rbw, mi, ob);
@@ -4070,7 +4079,8 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                                rbsc->mi2->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD) {
                                /* World has been rebuilt so rebuild constraint 
*/
                                
BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, true);
-                               BKE_rigidbody_start_dist_angle(rbsc, 
fmd->fracture_mode == MOD_FRACTURE_EXTERNAL || fmd->fracture_mode == 
MOD_FRACTURE_DYNAMIC);
+                               BKE_rigidbody_start_dist_angle(rbsc, 
fmd->fracture_mode == MOD_FRACTURE_EXTERNAL ||
+                                                              
(fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->is_dynamic_external));
                                //TODO ensure evaluation on transform change too
                        }
 
@@ -4085,7 +4095,8 @@ static bool do_update_modifier(Scene* scene, Object* ob, 
RigidBodyWorld *rbw, bo
                                handle_regular_breaking(fmd, ob, rbw, rbsc, 
max_con_mass, rebuild);
                        }
 
-                       if ((fmd->fracture_mode == MOD_FRACTURE_EXTERNAL || 
fmd->fracture_mode == MOD_FRACTURE_DYNAMIC) && (rbsc->flag & 
RBC_FLAG_USE_BREAKING) && !rebuild)
+                       if ((fmd->fracture_mode == MOD_FRACTURE_EXTERNAL || 
fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->is_dynamic_external) &&
+                           (rbsc->flag & RBC_FLAG_USE_BREAKING) && !rebuild)
                        {
                                handle_plastic_breaking(rbsc, rbw, laststeps, 
lastscale);
                        }
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index f8c40407d2..2a72649078 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1767,6 +1767,7 @@ typedef struct FractureModifierData {
        int limit_impact;
        int fracture_all;
        int dynamic_new_constraints;
+       int is_dynamic_external;
 
        /* internal flags */
        int use_experimental;
@@ -1786,7 +1787,7 @@ typedef struct FractureModifierData {
 
        int keep_cutter_shards;
 
-       //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 855c123bd1..b8bdfe3712 100644
--- a/source/blender/makesrna/intern/rna_fracture.c
+++ b/source/blender/makesrna/intern/rna_fracture.c
@@ -1222,5 +1222,11 @@ void RNA_def_fracture(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Inner Crease",  "Crease at edges of 
inner faces");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+       prop = RNA_def_property(srna, "is_dynamic_external", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "is_dynamic_external", false);
+       RNA_def_property_ui_text(prop, "Dynamic External", "Indicator whether 
the data for dynamic fracture was loaded externally");
+       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 e2c412ae2b..8f525053d7 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -230,6 +230,7 @@ static void initData(ModifierData *md)
        fmd->keep_cutter_shards = MOD_FRACTURE_KEEP_BOTH;
        fmd->use_constraint_collision = false;
        fmd->inner_crease = 0.0f;
+       fmd->is_dynamic_external = false;
 }
 
 //XXX TODO, freeing functionality should be in BKE too
@@ -1802,6 +1803,7 @@ static void copyData(ModifierData *md, ModifierData 
*target)
        trmd->keep_cutter_shards = rmd->keep_cutter_shards;
        trmd->use_constraint_collision = rmd->use_constraint_collision;
        trmd->inner_crease = rmd->inner_crease;
+       trmd->is_dynamic_external = rmd->is_dynamic_external;
 }
 
 //XXXX TODO, is BB really useds still ? aint there exact volume calc now ?

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

Reply via email to