Commit: 256aeb213a55ab99256afe83e000d685d8a90282
Author: Martin Felke
Date:   Sun Jun 18 17:20:38 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB256aeb213a55ab99256afe83e000d685d8a90282

added additional distances and angles settings in order to control plastic 
deform better

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

M       release/scripts/startup/bl_operators/presets.py
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_operators/presets.py 
b/release/scripts/startup/bl_operators/presets.py
index 98b84a5f323..d917eaabcf1 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -690,7 +690,14 @@ class AddPresetFracture(AddPresetBase, Operator):
         "fracture.orthogonality_factor",
         "fracture.keep_distort",
         "fracture.do_merge",
-        "fracture.constraint_type"
+        "fracture.constraint_type",
+        "fracture.automerge_dist",
+        "fracture.deform_distance",
+        "fracture.deform_distance_weighted",
+        "fracture.cluster_deform_distance",
+        "fracture.deform_angle",
+        "fracture.deform_angle_weighted",
+        "fracture.cluster_deform_angle"
     ]
 
     preset_subdir = "fracture"
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py 
b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index a1bf23978a5..ea155a7eefc 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -242,6 +242,24 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, 
Panel):
             col.prop(md, "cluster_solver_iterations_override")
             layout.prop(md, "use_mass_dependent_thresholds")
 
+        if not md.use_compounds:
+            layout.label("Constraint Deform Settings")
+            col = layout.column(align=True)
+            row = col.row(align=True)
+            row.prop(md, "deform_angle", text="Deforming Angle")
+            row.prop(md, "cluster_deform_angle", text="Cluster Deforming 
Angle")
+
+            row = col.row(align=True)
+            row.prop(md, "deform_distance", text="Deforming Distance")
+            row.prop(md, "cluster_deform_distance", text="Cluster Deforming 
Distance")
+
+            row = col.row(align=True)
+            row.prop(md, "deform_angle_weighted")
+            row.prop(md, "deform_distance_weighted")
+
+
+
+
 class PHYSICS_PT_fracture_utilities(PhysicButtonsPanel, Panel):
     bl_label = "Fracture Utilities"
 
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 543edc3f6b7..ac90857ccdf 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -3744,21 +3744,66 @@ static void deactivateRigidbody(RigidBodyOb *rbo)
        //RB_body_set_kinematic_state(rbo->physics_object, true);
        //RB_body_set_mass(rbo->physics_object, 0.0f);
        //rbo->flag |= RBO_FLAG_IS_GHOST;
+       //rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
        RB_body_deactivate(rbo->physics_object);
 }
 
 static void deform_constraint(FractureModifierData *fmd, Object *ob, 
RigidBodyShardCon* rbsc, RigidBodyWorld *rbw)
 {
        RB_dworld_remove_constraint(rbw->physics_world, 
rbsc->physics_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 && fmd->is_dynamic_external));
 
+       BKE_rigidbody_start_dist_angle(rbsc, true);
        //rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
+       BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, true);
+       //set_constraint_index(fmd, rbsc);
+
        deactivateRigidbody(rbsc->mi1->rigidbody);
        deactivateRigidbody(rbsc->mi2->rigidbody);
 }
 
+static void handle_deform_angle(FractureModifierData *fmd, Object *ob, 
RigidBodyShardCon *rbsc, RigidBodyWorld *rbw,
+                                float anglediff, float weight, float 
deform_angle)
+{
+       if ((fmd->deform_angle > 0 || (fmd->deform_angle_weighted && weight > 
0)) &&
+               (anglediff > deform_angle))
+       {
+               /* if we have cluster breaking angle, then only treat equal 
cluster indexes like the default, else all */
+               if ((fmd->cluster_deform_angle > 0 && rbsc->mi1->particle_index 
== rbsc->mi2->particle_index) ||
+                        fmd->cluster_deform_angle == 0)
+               {
+                       deform_constraint(fmd, ob, rbsc, rbw);
+               }
+       }
+
+       if ((fmd->cluster_deform_angle > 0) && (rbsc->mi1->particle_index != 
rbsc->mi2->particle_index)
+               && anglediff > fmd->cluster_deform_angle)
+       {
+               deform_constraint(fmd, ob, rbsc, rbw);
+       }
+}
+
+static void handle_deform_dist(FractureModifierData *fmd, Object *ob, 
RigidBodyShardCon *rbsc, RigidBodyWorld *rbw,
+                                float distdiff, float weight, float 
deform_dist)
+{
+       if ((fmd->deform_distance > 0 || (fmd->deform_angle_weighted && weight 
> 0)) &&
+               (distdiff > deform_dist))
+       {
+               /* if we have cluster breaking angle, then only treat equal 
cluster indexes like the default, else all */
+               if ((fmd->cluster_deform_distance > 0 && 
rbsc->mi1->particle_index == rbsc->mi2->particle_index) ||
+                        fmd->cluster_deform_distance == 0)
+               {
+                       deform_constraint(fmd, ob, rbsc, rbw);
+               }
+       }
+
+       if ((fmd->cluster_deform_distance > 0) && (rbsc->mi1->particle_index != 
rbsc->mi2->particle_index)
+               && distdiff > fmd->cluster_deform_distance)
+       {
+               deform_constraint(fmd, ob, rbsc, rbw);
+       }
+}
+
+
 static void handle_breaking_angle(FractureModifierData *fmd, Object *ob, 
RigidBodyShardCon *rbsc, RigidBodyWorld *rbw,
                                   float anglediff, float weight, float 
breaking_angle)
 {
@@ -3778,12 +3823,6 @@ static void handle_breaking_angle(FractureModifierData 
*fmd, Object *ob, RigidBo
                                        activateRigidbody(rbsc->mi2->rigidbody, 
rbw, rbsc->mi2, ob);
                                }
                        }
-                       else {
-                               //attempt to make plastic deform by 
reconstraining the shards
-                               if (rbsc->physics_constraint) {
-                                       deform_constraint(fmd, ob, rbsc, rbw);
-                               }
-                       }
                }
        }
 
@@ -3798,12 +3837,6 @@ static void handle_breaking_angle(FractureModifierData 
*fmd, Object *ob, RigidBo
                                activateRigidbody(rbsc->mi2->rigidbody, rbw, 
rbsc->mi2, ob);
                        }
                }
-               else {
-                       //attempt to make plastic deform by reconstraining the 
shards
-                       if (rbsc->physics_constraint) {
-                               deform_constraint(fmd, ob, rbsc, rbw);
-                       }
-               }
        }
 }
 
@@ -3825,12 +3858,6 @@ static void 
handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi
                                        activateRigidbody(rbsc->mi2->rigidbody, 
rbw, rbsc->mi2, ob);
                                }
                        }
-                       else {
-                               //attempt to make plastic deform by 
reconstraining the shards
-                               if (rbsc->physics_constraint) {
-                                       deform_constraint(fmd, ob, rbsc, rbw);
-                               }
-                       }
                }
        }
 
@@ -3845,12 +3872,6 @@ static void 
handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi
                                activateRigidbody(rbsc->mi2->rigidbody, rbw, 
rbsc->mi2, ob);
                        }
                }
-               else {
-                       //attempt to make plastic deform by reconstraining the 
shards
-                       if (rbsc->physics_constraint) {
-                               deform_constraint(fmd, ob, rbsc, rbw);
-                       }
-               }
        }
 }
 
@@ -3940,6 +3961,9 @@ static void handle_regular_breaking(FractureModifierData 
*fmd, Object *ob, Rigid
        float weight = MIN2(rbsc->mi1->thresh_weight, rbsc->mi2->thresh_weight);
        float breaking_angle = fmd->breaking_angle_weighted ? 
fmd->breaking_angle * weight : fmd->breaking_angle;
        float breaking_distance = fmd->breaking_distance_weighted ? 
fmd->breaking_distance * weight : fmd->breaking_distance;
+       float deform_angle = fmd->deform_angle_weighted ? fmd->deform_angle * 
weight : fmd->deform_angle;
+       float deform_distance = fmd->deform_distance_weighted ? 
fmd->deform_distance * weight : fmd->deform_distance;
+       float dist, angle, distdiff, anglediff;
 
        if ((fmd->use_mass_dependent_thresholds || fmd->use_compounds /*|| 
fmd->mass_threshold_factor > 0.0f*/)) {
                BKE_rigidbody_calc_threshold(max_con_mass, fmd, rbsc);
@@ -3949,18 +3973,30 @@ static void 
handle_regular_breaking(FractureModifierData *fmd, Object *ob, Rigid
                (fmd->breaking_distance > 0) || 
(fmd->breaking_distance_weighted && weight > 0) ||
                 (fmd->cluster_breaking_angle > 0 || 
(fmd->cluster_breaking_distance > 0))) /*&& !rebuild*/)
        {
-               float dist, angle, distdiff, anglediff;
                calc_dist_angle(rbsc, &dist, &angle, false);
-
                anglediff = fabs(angle - rbsc->start_angle);
                distdiff = fabs(dist - rbsc->start_dist);
 
-               /* Treat angles here */
+               /* handle breaking */
                handle_breaking_angle(fmd, ob, rbsc, rbw, anglediff, weight, 
breaking_angle);
-
-               /* Treat distances here */
                handle_breaking_distance(fmd, ob, rbsc, rbw, distdiff, weight, 
breaking_distance);
        }
+
+       if ((((fmd->deform_angle) > 0) || (fmd->deform_angle_weighted && weight 
> 0) ||
+               (fmd->deform_distance > 0) || (fmd->deform_distance_weighted && 
weight > 0) ||
+                (fmd->cluster_deform_angle > 0 || 
(fmd->cluster_deform_distance > 0))) /*&& !rebuild*/)
+       {
+               if (rbsc->physics_constraint && 
RB_constraint_is_enabled(rbsc->physics_constraint))
+               {
+                       calc_dist_angle(rbsc, &dist, &angle, false);
+                       anglediff = fabs(angle - rbsc->start_angle);
+                       distdiff = fabs(dist - rbsc->start_dist);
+
+                       /* handle deform */
+                       handle_deform_angle(fmd, ob, rbsc, rbw, anglediff, 
weight, deform_angle);
+                       handle_deform_dist(fmd, ob, rbsc, rbw, distdiff, 
weight, deform_distance);
+               }
+       }
 }
 
 static void handle_solver_iterations(RigidBodyWorld *rbw, FractureModifierData 
*fmd, RigidBodyShardCon *rbsc)
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index bbaa970b294..2e61d5fa6f9 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1734,6 +1734,10 @@ typedef struct FractureModifierData {
        float physics_mesh_scale;
        float grease_offset;
        float dynamic_force;
+       float deform_angle;
+       float deform_distance;
+       float cluster_deform_angle;
+       float cluster_deform_distance;
 
        float impulse_dampening;
        float minimum_impulse;
@@ -1774,6 +1778,8 @@ typedef struct FractureModifierData {
        int is_dynamic_external;
        int keep_distort;
        int do_merge;
+       int deform_angle_weighted;
+       int deform_distance_weighted;
 
        /* internal flags */
        int use_experimental;
diff --git a/source/blender/makesrna/intern/rna_fracture.c 
b/source/blender/makesrna/intern/rna_fracture.c
index daede62a9e9..0505c05861e 100644
--- a/source/blender/makesrna/intern/rna_fracture.c
+++ b/source/blender/makesrna/intern/rna_fracture.c
@@ -283,6 +283,34 @@ static void rna_FractureModifier_breaking_distance_set(

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to