[Bf-blender-cvs] [fb8acd8b333] fracture_modifier: optionally restore old activation behavior with broken constraints

Martin Felke noreply at git.blender.org
Sat Feb 24 11:21:11 CET 2018


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 ?



More information about the Bf-blender-cvs mailing list