[Bf-blender-cvs] [b800df4] fracture_modifier: fixed constraint restore with external fracture mode (using participants instead of jumping around in list, which messes up the iteration loop)

Martin Felke noreply at git.blender.org
Mon Jan 18 18:04:54 CET 2016


Commit: b800df49d7f433b412f3677e9e6ccbbe11935132
Author: Martin Felke
Date:   Mon Jan 18 18:03:20 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBb800df49d7f433b412f3677e9e6ccbbe11935132

fixed constraint restore with external fracture mode (using participants instead of jumping around in list, which messes up the iteration loop)

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

M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 5efb230..35b53e6 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -3079,52 +3079,142 @@ static bool can_next(RigidBodyShardCon *rbsc, MeshIsland *mi1, MeshIsland *mi2)
 	return rbsc && rbsc->next && rbsc->next->mi1 == mi1 && rbsc->next->mi2 == mi2;
 }
 
+static void handle_plastic_breaking_participants(RigidBodyShardCon *rbsc)
+{
+	if (rbsc->physics_constraint && !(RB_constraint_is_enabled(rbsc->physics_constraint)))
+	{
+		//go back until pair changes, break all
+		MeshIsland *mi1 = rbsc->mi1;
+		MeshIsland *mi2 = rbsc->mi2;
+		int i;
+
+		for (i = 0; i < mi1->participating_constraint_count; i++)
+		{
+			RigidBodyShardCon *con = mi1->participating_constraints[i];
+			bool same = (((con->mi1 == mi1 && con->mi2 == mi2) || (con->mi1 == mi2 && con->mi2 == mi1)));
+			if (con->physics_constraint && same)
+			{
+				if (con->flag & RBC_FLAG_PLASTIC) {
+					RB_constraint_set_enabled(con->physics_constraint, true);
+				}
+				else {
+					RB_constraint_set_enabled(con->physics_constraint, false);
+
+					RB_constraint_set_breaking_threshold(con->physics_constraint, 0);
+					if (con->type == RBC_TYPE_6DOF_SPRING)
+					{
+						RigidBodyShardCon* rbc = con;
+						RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, false);
+						RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, 0);
+						RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, 0);
+
+						RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, false);
+						RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, 0);
+						RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, 0);
+
+						RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, false);
+						RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, 0);
+						RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, 0);
+
+						RB_constraint_set_equilibrium_6dof_spring(rbc->physics_constraint);
+					}
+				}
+			}
+		}
+
+		for (i = 0; i < mi2->participating_constraint_count; i++)
+		{
+			RigidBodyShardCon *con = mi2->participating_constraints[i];
+			bool same = (((con->mi1 == mi1 && con->mi2 == mi2) || (con->mi1 == mi2 && con->mi2 == mi1)));
+			if (con->physics_constraint && same)
+			{
+				if (con->flag & RBC_FLAG_PLASTIC) {
+					RB_constraint_set_enabled(con->physics_constraint, true);
+				}
+				else {
+					RB_constraint_set_enabled(con->physics_constraint, false);
+
+					RB_constraint_set_breaking_threshold(con->physics_constraint, 0);
+
+					if (con->type == RBC_TYPE_6DOF_SPRING)
+					{
+						RigidBodyShardCon* rbc = con;
+						RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, false);
+						RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, 0);
+						RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, 0);
+
+						RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, false);
+						RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, 0);
+						RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, 0);
+
+						RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, false);
+						RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, 0);
+						RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, 0);
+
+						RB_constraint_set_equilibrium_6dof_spring(rbc->physics_constraint);
+					}
+				}
+			}
+		}
+	}
+}
+
 static void handle_plastic_breaking(FractureModifierData *fmd, RigidBodyShardCon *rbsc)
 {
 	if (rbsc->physics_constraint && !(RB_constraint_is_enabled(rbsc->physics_constraint)))
 	{
 		//go back until pair changes, break all
 		RigidBodyShardCon *con = rbsc;
-		MeshIsland *mi1 = con->mi1;
-		MeshIsland *mi2 = con->mi2;
+		MeshIsland *mi1 = rbsc->mi1;
+		MeshIsland *mi2 = rbsc->mi2;
 
-		while (can_prev(con, mi1, mi2))
+		while (can_prev(con, mi1, mi2) && fmd->use_special_breaking)
 		{
-			if ((con->flag & RBC_FLAG_PLASTIC) && fmd->use_special_breaking)
+			if ((con->flag & RBC_FLAG_PLASTIC))
 			{
-				con->flag |= RBC_FLAG_ENABLED;
+				if (con->physics_constraint) {
+					//con->flag |= RBC_FLAG_ENABLED;
+					RB_constraint_set_enabled(con->physics_constraint, true);
+					//con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+				}
 			}
 			else
 			{
-				con->flag &= ~RBC_FLAG_ENABLED;
 				if (con->physics_constraint) {
+					//con->flag &= ~RBC_FLAG_ENABLED;
 					RB_constraint_set_enabled(con->physics_constraint, false);
+					//con->flag |= RBC_FLAG_NEEDS_VALIDATE;
 				}
 			}
-			con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+
 			con = con->prev;
 		}
 
-		while (can_next(con, mi1, mi2))
+		while (can_next(con, mi1, mi2) && fmd->use_special_breaking)
 		{
-			if ((con->flag & RBC_FLAG_PLASTIC) && fmd->use_special_breaking)
+			if ((con->flag & RBC_FLAG_PLASTIC))
 			{
-				con->flag |= RBC_FLAG_ENABLED;
+				if (con->physics_constraint) {
+					//con->flag |= RBC_FLAG_ENABLED;
+					RB_constraint_set_enabled(con->physics_constraint, true);
+					//con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+				}
 			}
 			else
 			{
-				con->flag &= ~RBC_FLAG_ENABLED;
 				if (con->physics_constraint) {
+					//con->flag &= ~RBC_FLAG_ENABLED;
 					RB_constraint_set_enabled(con->physics_constraint, false);
+					//con->flag |= RBC_FLAG_NEEDS_VALIDATE;
 				}
 			}
-			con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+
 			con = con->next;
 		}
 	}
 }
 
-static void handle_regular_breaking(FractureModifierData *fmd, Object *ob, RigidBodyWorld *rbw, RigidBodyShardCon *rbsc, float max_con_mass)
+static void handle_regular_breaking(FractureModifierData *fmd, Object *ob, RigidBodyWorld *rbw, RigidBodyShardCon *rbsc, float max_con_mass, bool rebuild)
 {
 	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;
@@ -3154,7 +3244,7 @@ static void handle_regular_breaking(FractureModifierData *fmd, Object *ob, Rigid
 
 	if (((fmd->breaking_angle) > 0) || (fmd->breaking_angle_weighted && weight > 0) ||
 		(((fmd->breaking_distance > 0) || (fmd->breaking_distance_weighted && weight > 0)) ||
-		 (fmd->cluster_breaking_angle > 0 || fmd->cluster_breaking_distance > 0)) /*&& !rebuild*/)
+		 (fmd->cluster_breaking_angle > 0 || fmd->cluster_breaking_distance > 0)) && !rebuild)
 	{
 		float dist, angle, distdiff, anglediff;
 		calc_dist_angle(rbsc, &dist, &angle);
@@ -3246,12 +3336,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 		for (rbsc = fmd->meshConstraints.first; rbsc; rbsc = rbsc->next) {
 			if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL)
 			{
-				handle_regular_breaking(fmd, ob, rbw, rbsc, max_con_mass);
-			}
-			else
-			{
-				//hmm maybe enable "special" constraint behavior
-				handle_plastic_breaking(fmd, rbsc);
+				handle_regular_breaking(fmd, ob, rbw, rbsc, max_con_mass, rebuild);
 			}
 
 			if (rebuild || rbsc->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD ||
@@ -3266,7 +3351,16 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 			}
 
 			if (rbsc->physics_constraint && rbw && (rbw->flag & RBW_FLAG_REBUILD_CONSTRAINTS)) {
-				RB_constraint_set_enabled(rbsc->physics_constraint, true);
+				//printf("Rebuilding constraints\n");
+				RB_constraint_set_enabled(rbsc->physics_constraint, rbsc->flag & RBC_FLAG_ENABLED);
+			}
+
+			if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
+			{
+				//hmm maybe enable "special" constraint behavior
+				//handle_plastic_breaking(fmd, rbsc);
+				if (fmd->use_special_breaking)
+					handle_plastic_breaking_participants(rbsc);
 			}
 
 			rbsc->flag &= ~RBC_FLAG_NEEDS_VALIDATE;




More information about the Bf-blender-cvs mailing list