[Bf-blender-cvs] [dede676] fracture_modifier: implemented some special constraint breaking method further (plastic constraint breaking), for external fracturing mode

Martin Felke noreply at git.blender.org
Mon Jan 18 21:59:34 CET 2016


Commit: dede676e90276bed96eea52b09a07593466dddf1
Author: Martin Felke
Date:   Mon Jan 18 21:59:07 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBdede676e90276bed96eea52b09a07593466dddf1

implemented some special constraint breaking method further (plastic constraint breaking), for external fracturing mode

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

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

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index e98abbd..0872da2 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1563,6 +1563,41 @@ static void rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
 	}
 }
 
+static void rigidbody_set_springs_active(RigidBodyShardCon *rbc, bool active)
+{
+	if (rbc && rbc->physics_constraint && rbc->type == RBC_TYPE_6DOF_SPRING)
+	{
+		if (active)
+		{
+			RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->flag & RBC_FLAG_USE_SPRING_X);
+			RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->spring_stiffness_x);
+			RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->spring_damping_x);
+
+			RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->flag & RBC_FLAG_USE_SPRING_Y);
+			RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->spring_stiffness_y);
+			RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->spring_damping_y);
+
+			RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->flag & RBC_FLAG_USE_SPRING_Z);
+			RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->spring_stiffness_z);
+			RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->spring_damping_z);
+		}
+		else
+		{
+			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);
+		}
+	}
+}
+
 static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd, Object* ob, RigidBodyShardCon *rbc)
 {
 	float loc[3];
@@ -1635,19 +1670,18 @@ static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
 			case RBC_TYPE_6DOF_SPRING:
 				rbc->physics_constraint = RB_constraint_new_6dof_spring(loc, rot, rb1, rb2);
 
-				RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->flag & RBC_FLAG_USE_SPRING_X);
-				RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->spring_stiffness_x);
-				RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->spring_damping_x);
-
-				RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->flag & RBC_FLAG_USE_SPRING_Y);
-				RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->spring_stiffness_y);
-				RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Y, rbc->spring_damping_y);
-
-				RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->flag & RBC_FLAG_USE_SPRING_Z);
-				RB_constraint_set_stiffness_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->spring_stiffness_z);
-				RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, rbc->spring_damping_z);
+				if (rbc->flag & RBC_FLAG_USE_PLASTIC && !rbc->flag & RBC_FLAG_PLASTIC_ACTIVE)
+				{	/* set to inactive plastic here, needs to be activated */
+					rigidbody_set_springs_active(rbc, false);
+				}
+				else
+				{
+					/* not plastic springs, activate now */
+					rigidbody_set_springs_active(rbc, true);
+				}
 
 				RB_constraint_set_equilibrium_6dof_spring(rbc->physics_constraint);
+
 			/* fall through */
 			case RBC_TYPE_6DOF:
 				if (rbc->type == RBC_TYPE_6DOF)     /* a litte awkward but avoids duplicate code for limits */
@@ -3071,14 +3105,38 @@ static void handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi
 	}
 }
 
-static bool can_prev(RigidBodyShardCon *rbsc, MeshIsland *mi1, MeshIsland *mi2)
+static void handle_plastic_breaking_constraint(RigidBodyShardCon *con, MeshIsland *mi1, MeshIsland *mi2)
 {
-	return rbsc && rbsc->prev && rbsc->prev->mi1 == mi1 && rbsc->prev->mi2 == mi2;
-}
-
-static bool can_next(RigidBodyShardCon *rbsc, MeshIsland *mi1, MeshIsland *mi2)
-{
-	return rbsc && rbsc->next && rbsc->next->mi1 == mi1 && rbsc->next->mi2 == mi2;
+	bool same = (((con->mi1 == mi1 && con->mi2 == mi2) || (con->mi1 == mi2 && con->mi2 == mi1)));
+	if (con->physics_constraint && same)
+	{
+		if (con->type == RBC_TYPE_6DOF_SPRING)
+		{
+			if (con->flag & RBC_FLAG_USE_PLASTIC)
+			{
+				if (!(con->flag & RBC_FLAG_PLASTIC_ACTIVE))
+				{
+					/* if the other constraint is plastic and not plastic active and enabled, make plastic active (set stiffness) */
+					con->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+					rigidbody_set_springs_active(con, true);
+				}
+				else
+				{
+					/*break active plastic spring*/
+					RB_constraint_set_enabled(con->physics_constraint, false);
+				}
+			}
+			else
+			{  /*break non-plastic spring */
+				RB_constraint_set_enabled(con->physics_constraint, false);
+			}
+		}
+		else
+		{
+			/*break all other constraints */
+			RB_constraint_set_enabled(con->physics_constraint, false);
+		}
+	}
 }
 
 static void handle_plastic_breaking_participants(RigidBodyShardCon *rbsc)
@@ -3093,85 +3151,41 @@ static void handle_plastic_breaking_participants(RigidBodyShardCon *rbsc)
 	exceeded = (rbsc->breaking_angle > 0.0f && anglediff > rbsc->breaking_angle);
 	exceeded = exceeded || (rbsc->breaking_dist > 0.0f && distdiff > rbsc->breaking_dist);
 
+	/* is there a break event on THIS constraint ? */
 	if (rbsc->physics_constraint && (!(RB_constraint_is_enabled(rbsc->physics_constraint)) || exceeded))
 	{
-		//go back until pair changes, break all
 		MeshIsland *mi1 = rbsc->mi1;
 		MeshIsland *mi2 = rbsc->mi2;
 		int i;
 
+		/* if THIS constraint is not plastic (or not in plastic mode -> enabled and plastic active), handle the others ...*/
+		if (rbsc->flag & RBC_FLAG_USE_PLASTIC)
+			return;
+
 		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);
-#if 0
-					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);
-					}
-#endif
-				}
-			}
+			handle_plastic_breaking_constraint(con, mi1, mi2);
 		}
 
 		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);
+			handle_plastic_breaking_constraint(con, mi1, mi2);
+		}
+	}
+}
 
 #if 0
-					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);
+static bool can_prev(RigidBodyShardCon *rbsc, MeshIsland *mi1, MeshIsland *mi2)
+{
+	return rbsc && rbsc->prev && rbsc->prev->mi1 == mi1 && rbsc->prev->mi2 == mi2;
+}
 
-						RB_constraint_set_equilibrium_6dof_spring(rbc->physics_constraint);
-					}
-#endif
-				}
-			}
-		}
-	}
+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(FractureModifierData *fmd, RigidBodyShardCon *r

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list