[Bf-blender-cvs] [256aeb213a5] fracture_modifier: added additional distances and angles settings in order to control plastic deform better

Martin Felke noreply at git.blender.org
Sun Jun 18 17:20:49 CEST 2017


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. @@




More information about the Bf-blender-cvs mailing list