[Bf-blender-cvs] [3d36d35] fracture_modifier: fixes for the monitoring logic of plastic constraints, again

Martin Felke noreply at git.blender.org
Thu Jan 21 19:42:45 CET 2016


Commit: 3d36d357c23022c981bf5e87ca90bfcd685ed95b
Author: Martin Felke
Date:   Thu Jan 21 19:42:27 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB3d36d357c23022c981bf5e87ca90bfcd685ed95b

fixes for the monitoring logic of plastic constraints, again

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

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

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 983b24c..0bd83db 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1598,17 +1598,17 @@ static void rigidbody_set_springs_active(RigidBodyShardCon *rbc, bool active)
 		}
 		else
 		{
-			RB_constraint_set_spring_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_X, rbc->flag & RBC_FLAG_USE_SPRING_X);
+			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, rbc->spring_damping_x);
+			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, rbc->flag & RBC_FLAG_USE_SPRING_Y);
+			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, rbc->spring_damping_y);
+			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, rbc->flag & RBC_FLAG_USE_SPRING_Z);
+			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, rbc->spring_damping_z);
+			RB_constraint_set_damping_6dof_spring(rbc->physics_constraint, RB_LIMIT_LIN_Z, 0);
 		}
 	}
 }
@@ -1707,16 +1707,16 @@ static void rigidbody_create_shard_physics_constraint(FractureModifierData* fmd,
 
 				if (rbc->flag & RBC_FLAG_USE_PLASTIC)
 				{	/* set to inactive plastic here, needs to be activated */
+					rbc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
 					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);
 				}
 
-				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 */
@@ -3149,30 +3149,43 @@ static void handle_breaking_distance(FractureModifierData *fmd, Object *ob, Rigi
 static void handle_plastic_breaking(RigidBodyShardCon *rbsc)
 {
 	float dist, angle, distdiff, anglediff;
-	bool exceededAngle = false, exceededDist = false;
+	bool exceededAngle = false, exceededDist = false, broken = false;
 
 	calc_dist_angle(rbsc, &dist, &angle, true);
 
 	/* note, relative change in percentage is expected, -1 disables */
-	distdiff = fabs(1 -(rbsc->start_dist/dist));
+	distdiff = fabs(1.0f -(rbsc->start_dist/dist));
 
 	/* TODO, ensure rigidbody orn is equal to quaternion of object !!! */
 	// The construct "asin(sin(x))" is a triangle function to achieve a seamless rotation loop from input
-	anglediff = asin(sin(abs(rbsc->start_angle - angle) * 0.5f));
-	if (anglediff > 0.0f)
-		printf("Angles %f %f\n", anglediff, rbsc->breaking_angle);
+	anglediff = asin(sin(fabs(rbsc->start_angle - angle) * 0.5f));
+	//if (anglediff > 0.0f)
+	//	printf("Angles %f %f\n", anglediff, rbsc->breaking_angle);
 
 	exceededAngle = ((rbsc->breaking_angle >= 0.0f) && (anglediff > rbsc->breaking_angle));
 	exceededDist = ((rbsc->breaking_dist >= 0.0f) && (distdiff > (rbsc->breaking_dist + (anglediff / M_PI))));
+	broken = rbsc->physics_constraint && !(RB_constraint_is_enabled(rbsc->physics_constraint));
 
-	if (exceededDist || exceededAngle)
+	if (exceededDist || exceededAngle || broken)
 	{
 		if (rbsc->type == RBC_TYPE_6DOF_SPRING && rbsc->flag & RBC_FLAG_USE_PLASTIC)
 		{
-			rigidbody_set_springs_active(rbsc, true);
+			if (!(rbsc->flag & RBC_FLAG_PLASTIC_ACTIVE) && !(rbsc->flag & RBC_FLAG_NEEDS_VALIDATE))
+			{
+				/* activate only once */
+				rbsc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+				rigidbody_set_springs_active(rbsc, true);
+				RB_constraint_set_equilibrium_6dof_spring(rbsc->physics_constraint);
+			}
+			else if (rbsc->physics_constraint && RB_constraint_is_enabled(rbsc->physics_constraint))
+			{
+				rigidbody_set_springs_active(rbsc, false);
+				RB_constraint_set_enabled(rbsc->physics_constraint, false);
+			}
 		}
-		else if (rbsc->physics_constraint)
+		else if (rbsc->physics_constraint && RB_constraint_is_enabled(rbsc->physics_constraint))
 		{
+			rigidbody_set_springs_active(rbsc, false);
 			RB_constraint_set_enabled(rbsc->physics_constraint, false);
 		}
 	}
@@ -3185,8 +3198,9 @@ static void handle_plastic_breaking(RigidBodyShardCon *rbsc)
 	{
 		if (rbsc->type == RBC_TYPE_6DOF_SPRING && rbsc->flag & RBC_FLAG_USE_PLASTIC)
 		{
-			if (rbsc->physics_constraint)
+			if (rbsc->physics_constraint && RB_constraint_is_enabled(rbsc->physics_constraint))
 			{
+				rigidbody_set_springs_active(rbsc, false);
 				RB_constraint_set_enabled(rbsc->physics_constraint, false);
 			}
 		}
@@ -3257,7 +3271,9 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 
 	if (isModifierActive(fmd)) {
 		float max_con_mass = 0;
-		int count = 0;//BLI_listbase_count(&fmd->meshIslands);
+		bool is_empty = BLI_listbase_is_empty(&fmd->meshIslands);
+		int count = 0, brokencount = 0, plastic = 0;
+		float frame = 0;
 
 		if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 		{
@@ -3268,7 +3284,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 			}
 		}
 
-		count = BLI_listbase_count(&fmd->meshIslands);
+		//count = BLI_listbase_count(&fmd->meshIslands);
 
 		//if (fmd->use_compounds && rebuild)
 			/*create compound */
@@ -3301,7 +3317,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 					}
 				}
 
-				validateShard(rbw, count == 0 ? NULL : mi, ob, do_rebuild, true); //fmd->fracture_mode == MOD_FRACTURE_DYNAMIC);
+				validateShard(rbw, is_empty ? NULL : mi, ob, do_rebuild, true); //fmd->fracture_mode == MOD_FRACTURE_DYNAMIC);
 			}
 
 			/* update simulation object... */
@@ -3313,6 +3329,19 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 		}
 
 		for (rbsc = fmd->meshConstraints.first; rbsc; rbsc = rbsc->next) {
+
+			if (rbsc->physics_constraint && !(RB_constraint_is_enabled(rbsc->physics_constraint)))
+			{
+				brokencount++;
+			}
+
+			if (rbsc->type == RBC_TYPE_6DOF_SPRING && (rbsc->flag & RBC_FLAG_PLASTIC_ACTIVE))
+			{
+				plastic++;
+			}
+
+			count++;
+
 			if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL)
 			{
 				handle_regular_breaking(fmd, ob, rbw, rbsc, max_con_mass, rebuild);
@@ -3336,6 +3365,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 				if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL && rbsc->flag & RBC_FLAG_USE_PLASTIC)
 				{
 					/*reset plastic constraints, by deactivating them*/
+					rbsc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
 					rigidbody_set_springs_active(rbsc, false);
 				}
 			}
@@ -3348,6 +3378,9 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 			rbsc->flag &= ~RBC_FLAG_NEEDS_VALIDATE;
 		}
 
+		frame = BKE_scene_frame_get(scene);
+		printf("Constraints: Frame %d , Total %d,  Intact %d,  Broken %d, Plastic %d\n", (int)frame, count, count-brokencount, brokencount, plastic);
+
 		return true;
 	}
 	else
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h
index 7aa000e..c9b398a 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -392,6 +392,8 @@ typedef enum eRigidBodyCon_Flag {
 
 	/* mark this constraint to be able to go into "plastic" mode */
 	RBC_FLAG_USE_PLASTIC				= (1 << 17),
+	/* mark already active plastic constraints */
+	RBC_FLAG_PLASTIC_ACTIVE				= (1 << 18)
 
 } eRigidBodyCon_Flag;




More information about the Bf-blender-cvs mailing list