[Bf-blender-cvs] [d13f6ae2bf2] fracture_modifier: fix: separated comparison angle/distance for break/deform, propagate weakened threshold now

Martin Felke noreply at git.blender.org
Sat Oct 7 20:00:10 CEST 2017


Commit: d13f6ae2bf20cf0815e8b98c008233b613f31761
Author: Martin Felke
Date:   Sat Oct 7 19:59:44 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd13f6ae2bf20cf0815e8b98c008233b613f31761

fix: separated comparison angle/distance for break/deform, propagate weakened threshold now

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

M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/makesdna/DNA_rigidbody_types.h

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

diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 15c0ae1580b..50728e8a32d 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -102,7 +102,7 @@ void BKE_rigidbody_calc_shard_mass(struct Object* ob, struct MeshIsland* mi, str
 void BKE_rigidbody_calc_threshold(float max_con_mass, struct FractureModifierData* rmd, struct RigidBodyShardCon *con);
 float BKE_rigidbody_calc_max_con_mass(struct Object* ob);
 float BKE_rigidbody_calc_min_con_dist(struct Object* ob);
-void BKE_rigidbody_start_dist_angle(struct RigidBodyShardCon* con, bool exact);
+void BKE_rigidbody_start_dist_angle(struct RigidBodyShardCon* con, bool exact, bool both);
 void BKE_rigidbody_remove_shard_con(struct Scene* scene, struct RigidBodyShardCon* con);
 void BKE_rigidbody_remove_shard(struct Scene* scene, struct MeshIsland *mi);
 void BKE_rigidbody_update_ob_array(struct RigidBodyWorld *rbw, bool do_bake_correction);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index de4b194089f..47298d8d21f 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2547,15 +2547,21 @@ static void calc_dist_angle(RigidBodyShardCon *con, float *dist, float *angle, b
 	}
 }
 
-void BKE_rigidbody_start_dist_angle(RigidBodyShardCon *con, bool exact)
+void BKE_rigidbody_start_dist_angle(RigidBodyShardCon *con, bool exact, bool both)
 {
 	/* store starting angle and distance per constraint*/
 	float dist, angle;
 	calc_dist_angle(con, &dist, &angle, exact);
 
-	//printf("Start Values(dist, angle) %f %f %f %f\n", con->start_dist, con->start_angle, dist, angle);
-	con->start_dist = dist;
-	con->start_angle = angle;
+	if (both)
+	{
+		con->start_dist = dist;
+		con->start_angle = angle;
+		//printf("Start Values(dist, angle) %f %f %f %f\n", con->start_dist, con->start_angle, dist, angle);
+	}
+
+	con->start_dist_deform = dist;
+	con->start_angle_deform = angle;
 }
 
 float BKE_rigidbody_calc_max_con_mass(Object *ob)
@@ -4648,17 +4654,17 @@ static void test_deactivate_rigidbody(RigidBodyOb *rbo)
 
 static void deform_constraint(FractureModifierData *fmd, Object *ob, RigidBodyShardCon* rbsc, RigidBodyWorld *rbw)
 {
-	float thresh;
+	float thresh = RB_constraint_get_breaking_threshold(rbsc->physics_constraint);
 	float weakening = 1.0f - fmd->deform_weakening;
 
 	RB_dworld_remove_constraint(rbw->physics_world, rbsc->physics_constraint);
 
-	BKE_rigidbody_start_dist_angle(rbsc, true);
+	BKE_rigidbody_start_dist_angle(rbsc, true, false);
 	//rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
 	BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, true);
 	//set_constraint_index(fmd, rbsc);
 
-	thresh = RB_constraint_get_breaking_threshold(rbsc->physics_constraint);
+	//thresh = RB_constraint_get_breaking_threshold(rbsc->physics_constraint);
 	RB_constraint_set_breaking_threshold(rbsc->physics_constraint, thresh * weakening);
 
 	RB_body_deactivate(rbsc->mi1->rigidbody->physics_object);
@@ -4893,8 +4899,8 @@ static void handle_regular_breaking(FractureModifierData *fmd, Object *ob, Rigid
 		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);
+			anglediff = fabs(angle - rbsc->start_angle_deform);
+			distdiff = fabs(dist - rbsc->start_dist_deform);
 
 			/* handle deform */
 			handle_deform_angle(fmd, ob, rbsc, rbw, anglediff, weight, deform_angle);
@@ -5107,7 +5113,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 				/* 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 && fmd->is_dynamic_external));
+				                               (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->is_dynamic_external), true);
 				//TODO ensure evaluation on transform change too
 			}
 
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h
index 42fdd977cc8..eab44334eed 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -313,6 +313,8 @@ typedef struct RigidBodyShardCon {
 	float breaking_dist;
 	float plastic_angle;
 	float plastic_dist;
+	float start_angle_deform;
+	float start_dist_deform;
 
 	float orn[4];
 	float pos[3];



More information about the Bf-blender-cvs mailing list