[Bf-blender-cvs] [c890d60] fracture_modifier: cluster breaking angle, distance, percentage added, rename contact distance to search radius, jump back to start frame of rigidbody cache now automatically at fracture time (or frame 1)

Martin Felke noreply at git.blender.org
Mon Nov 24 16:39:40 CET 2014


Commit: c890d60651a8d42b97a41b3019aae3eb1869e2e7
Author: Martin Felke
Date:   Mon Nov 24 16:36:27 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBc890d60651a8d42b97a41b3019aae3eb1869e2e7

cluster breaking angle, distance, percentage added, rename contact distance to search radius, jump back to start frame of rigidbody cache now automatically at fracture time (or frame 1)

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

M	release/scripts/startup/bl_ui/properties_physics_fracture.py
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/editors/object/object_modifier.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.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 919ee6e..5a32eaa 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -129,16 +129,21 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, Panel):
             box.prop(md, "percentage")
             box.label("Constraint Breaking Settings")
             col = box.column(align=True)
-            row = col.row()
+            row = col.row(align=True)
             row.prop(md, "breaking_percentage", text="Percentage")
-            row.prop(md, "breaking_percentage_weighted")
+            row.prop(md, "cluster_breaking_percentage", text="Cluster Percentage")
 
-            row = col.row()
+            row = col.row(align=True)
             row.prop(md, "breaking_angle", text="Angle")
-            row.prop(md, "breaking_angle_weighted")
+            row.prop(md, "cluster_breaking_angle", text="Cluster Angle")
 
-            row = col.row()
+            row = col.row(align=True)
             row.prop(md, "breaking_distance", text="Distance")
+            row.prop(md, "cluster_breaking_distance", text="Cluster Distance")
+
+            row = col.row(align=True)
+            row.prop(md, "breaking_percentage_weighted")
+            row.prop(md, "breaking_angle_weighted")
             row.prop(md, "breaking_distance_weighted")
 
             col = box.column(align=True)
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index b87d2d2..bb401dc 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2670,7 +2670,7 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
 						int breaking_percentage = rmd->breaking_percentage_weighted ? (rmd->breaking_percentage * weight) : rmd->breaking_percentage;
 						
 						if (rmd->breaking_percentage > 0 || (rmd->breaking_percentage_weighted && weight > 0)) {
-							int broken_cons = 0, cons = 0, i = 0;
+							int broken_cons = 0, cons = 0, i = 0, cluster_cons = 0, broken_cluster_cons = 0;
 							RigidBodyShardCon *con;
 							
 							cons = mi->participating_constraint_count;
@@ -2678,11 +2678,41 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
 							for (i = 0; i < cons; i++) {
 								con = mi->participating_constraints[i];
 								if (con && con->physics_constraint) {
+									if (rmd->cluster_breaking_percentage > 0)
+									{
+										/*only count as broken if between clusters!*/
+										if (con->mi1->particle_index != con->mi2->particle_index)
+										{
+											cluster_cons++;
+
+											if (!RB_constraint_is_enabled(con->physics_constraint)) {
+												broken_cluster_cons++;
+											}
+										}
+									}
+
 									if (!RB_constraint_is_enabled(con->physics_constraint)) {
 										broken_cons++;
 									}
 								}
 							}
+
+							if (cluster_cons > 0) {
+								if ((float)broken_cluster_cons / (float)cluster_cons * 100 >= rmd->cluster_breaking_percentage) {
+									for (i = 0; i < cons; i++) {
+										con = mi->participating_constraints[i];
+										if (con && con->mi1->particle_index != con->mi2->particle_index) {
+											con->flag &= ~RBC_FLAG_ENABLED;
+											con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+
+											if (con->physics_constraint) {
+												RB_constraint_set_enabled(con->physics_constraint, false);
+											}
+										}
+									}
+								}
+							}
+
 							
 							if (cons > 0) {
 								if ((float)broken_cons / (float)cons * 100 >= breaking_percentage) {
@@ -2741,31 +2771,66 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
 					}
 					
 					if (((rmd->breaking_angle) > 0) || (rmd->breaking_angle_weighted && weight > 0) ||
-					    (((rmd->breaking_distance > 0) || (rmd->breaking_distance_weighted && weight > 0)) && !rebuild))
+					    (((rmd->breaking_distance > 0) || (rmd->breaking_distance_weighted && weight > 0)) ||
+					     (rmd->cluster_breaking_angle > 0 || rmd->cluster_breaking_distance > 0)) && !rebuild )
 					{
 						float dist, angle, distdiff, anglediff;
 						calc_dist_angle(rbsc, &dist, &angle);
 						
 						anglediff = fabs(angle - rbsc->start_angle);
 						distdiff = fabs(dist - rbsc->start_dist);
-						
+
+						/* Treat angles here */
 						if ((rmd->breaking_angle > 0 || (rmd->breaking_angle_weighted && weight > 0)) &&
 						    (anglediff > breaking_angle))
 						{
+							/* if we have cluster breaking angle, then only treat equal cluster indexes like the default, else all */
+							if ((rmd->cluster_breaking_angle > 0 && rbsc->mi1->particle_index == rbsc->mi2->particle_index) ||
+							     rmd->cluster_breaking_angle == 0)
+							{
+								rbsc->flag &= ~RBC_FLAG_ENABLED;
+								rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
+							
+								if (rbsc->physics_constraint) {
+									RB_constraint_set_enabled(rbsc->physics_constraint, false);
+								}
+							}
+						}
+
+						if ((rmd->cluster_breaking_angle > 0) && (rbsc->mi1->particle_index != rbsc->mi2->particle_index)
+						    && anglediff > rmd->cluster_breaking_angle)
+						{
 							rbsc->flag &= ~RBC_FLAG_ENABLED;
 							rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
-							
+
 							if (rbsc->physics_constraint) {
 								RB_constraint_set_enabled(rbsc->physics_constraint, false);
 							}
 						}
 						
+						/* Treat distances here */
 						if ((rmd->breaking_distance > 0 || (rmd->breaking_distance_weighted && weight > 0)) &&
 						    (distdiff > breaking_distance))
 						{
+							/* if we have cluster breaking distance, then only treat equal cluster indexes like the default, else all */
+							if ((rmd->cluster_breaking_distance > 0 && rbsc->mi1->particle_index == rbsc->mi2->particle_index) ||
+							     rmd->cluster_breaking_distance == 0)
+							{
+								rbsc->flag &= ~RBC_FLAG_ENABLED;
+								rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
+
+								if (rbsc->physics_constraint) {
+									RB_constraint_set_enabled(rbsc->physics_constraint, false);
+								}
+							}
+						}
+
+						if ((rmd->cluster_breaking_distance > 0) && (rbsc->mi1->particle_index != rbsc->mi2->particle_index)
+						    && distdiff > rmd->cluster_breaking_distance)
+						{
 							rbsc->flag &= ~RBC_FLAG_ENABLED;
 							rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
-							
+
 							if (rbsc->physics_constraint) {
 								RB_constraint_set_enabled(rbsc->physics_constraint, false);
 							}
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index ff3c9d3..2a0c9dd 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2339,12 +2339,25 @@ static int fracture_refresh_exec(bContext *C, wmOperator *UNUSED(op))
 	Object *obact = ED_object_active_context(C);
 	Scene *scene = CTX_data_scene(C);
 	float cfra = BKE_scene_frame_get(scene);
+	double start = 1.0;
 	FractureModifierData *rmd;
 	FractureJob *fj;
 	wmJob* wm_job;
 
 	rmd = (FractureModifierData *)modifiers_findByType(obact, eModifierType_Fracture);
-	if (!rmd || (rmd && rmd->refresh) || (scene->rigidbody_world && cfra != scene->rigidbody_world->pointcache->startframe)) {
+
+	if (scene->rigidbody_world != NULL)
+	{
+		start = (double)scene->rigidbody_world->pointcache->startframe;
+	}
+
+	BKE_scene_frame_set(scene, start);
+	DAG_relations_tag_update(G.main);
+	WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
+	WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
+	WM_event_add_notifier(C, NC_SCENE | ND_FRAME, NULL);
+
+	if (!rmd || (rmd && rmd->refresh) /*|| (scene->rigidbody_world && cfra != scene->rigidbody_world->pointcache->startframe)*/) {
 		rmd->refresh = false;
 		return OPERATOR_CANCELLED;
 	}
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index fca26a4..6f28b9a 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1453,10 +1453,13 @@ typedef struct FractureModifierData {
 	int solver_iterations_override;
 	int cluster_solver_iterations_override;
 	int breaking_percentage;
+	int cluster_breaking_percentage;
 	int splinter_axis;
 
 	float breaking_angle;
 	float breaking_distance;
+	float cluster_breaking_angle;
+	float cluster_breaking_distance;
 	float origmat[4][4];
 	float breaking_threshold;
 	float cluster_breaking_threshold;
@@ -1490,7 +1493,7 @@ typedef struct FractureModifierData {
 	/* internal values */
 	float max_vol;
 
-	char pad[4];
+	//char pad[4];
 } FractureModifierData;
 
 #endif  /* __DNA_MODIFIER_TYPES_H__ */
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index f3cae89..de2eec2 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -727,6 +727,28 @@ static void rna_RigidBodyModifier_autohide_dist_set(PointerRNA *ptr, float value
 	rmd->refresh_autohide = true;
 }
 
+static void rna_RigidBodyModifier_cluster_breaking_angle_set(PointerRNA *ptr, float value)
+{
+	FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+	rmd->cluster_breaking_angle = value;
+	rmd->refresh_constraints = true;
+}
+
+static void rna_RigidBodyModifier_cluster_breaking_distance_set(PointerRNA *ptr, float value)
+{
+	FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+	rmd->cluster_breaking_distance = value;
+	rmd->refresh_constraints = true;
+}
+
+static void rna_RigidBodyModifier_cluster_breaking_percentage_set(PointerRNA *ptr, int value)
+{
+	FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+	rmd->cluster_breaking_percentage = value;
+	rmd->refresh_constraints = true;
+}
+
+
 #else
 
 static PropertyRNA *rna_def_property_subdivision_common(StructRNA *srna, const char type[])
@@ -3846,7 +3868,7 @@ static void rna_def_modifier_fracture(BlenderRNA *brna)
 	RNA_def_property_range(prop, 0.0f, FLT_MAX);
 	RNA_def_property_float_default(prop

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list