[Bf-blender-cvs] [1dd3595] fracture_modifier: added a fake parenting for passive shards, those are simply moved with the object itself, so you can parent the entire object and have exact motion data in the passive shards

Martin Felke noreply at git.blender.org
Mon Jan 25 17:47:36 CET 2016


Commit: 1dd3595443c3d3255cd70e584009b7ee66b208e6
Author: Martin Felke
Date:   Mon Jan 25 17:47:18 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB1dd3595443c3d3255cd70e584009b7ee66b208e6

added a fake parenting for passive shards, those are simply moved with the object itself, so you can parent the entire object and have exact motion data in the passive shards

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

M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/object/object_transform.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_object.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 154547e..4d9e2f3 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -77,6 +77,7 @@
 
 static void resetDynamic(RigidBodyWorld *rbw);
 static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed);
+static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object *ob, RigidBodyOb *rbo);
 
 
 static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), MeshIsland *UNUSED(mi), Object *UNUSED(ob))
@@ -135,6 +136,8 @@ void BKE_rigidbody_start_dist_angle(RigidBodyShardCon *con, bool exact)
 	/* 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;
 }
@@ -1264,7 +1267,7 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec
 
 		copy_v3_v3(loc, rbo->pos);
 		copy_v4_v4(rot, rbo->orn);
-		
+
 		rbo->physics_object = RB_body_new(rbo->physics_shape, loc, rot, fmd->use_compounds, fmd->impulse_dampening,
 		                                  fmd->directional_factor, fmd->minimum_impulse, fmd->mass_threshold_factor);
 
@@ -3255,20 +3258,22 @@ static void handle_plastic_breaking(RigidBodyShardCon *rbsc, RigidBodyWorld* rbw
 	// The construct "asin(sin(x))" is a triangle function to achieve a seamless rotation loop from input
 	anglediff = asin(sin(fabs(rbsc->start_angle - angle) * 0.5f));
 
+	//printf("Dist, Angle: %f %f %f %f %f %f\n", rbsc->start_dist, rbsc->start_angle, dist, angle, distdiff, anglediff);
+
 	exceededAngle = ((rbsc->breaking_angle >= 0.0f) && (anglediff > rbsc->breaking_angle));
 	exceededDist = ((rbsc->breaking_dist >= 0.0f) && (distdiff > (rbsc->breaking_dist + (anglediff / M_PI))));
 
 	if (exceededDist || exceededAngle)
 	{
-		if (rbsc->type == RBC_TYPE_6DOF_SPRING && rbsc->plastic_dist >= 0.0f && rbsc->plastic_angle >= 0.0f)
+		if (rbsc->type == RBC_TYPE_6DOF_SPRING)
 		{
-			if (!(rbsc->flag & RBC_FLAG_PLASTIC_ACTIVE))
+			if (!(rbsc->flag & RBC_FLAG_PLASTIC_ACTIVE) && rbsc->plastic_dist >= 0.0f && rbsc->plastic_angle >= 0.0f)
 			{
-				/* activate only once */
-				rbsc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
-				rigidbody_set_springs_active(rbsc, true);
 				if (rbsc->physics_constraint)
 				{
+					/* activate only once */
+					rbsc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+					rigidbody_set_springs_active(rbsc, true);
 					RB_constraint_set_equilibrium_6dof_spring(rbsc->physics_constraint);
 					RB_constraint_set_enabled(rbsc->physics_constraint, true);
 				}
@@ -3291,7 +3296,9 @@ static void handle_plastic_breaking(RigidBodyShardCon *rbsc, RigidBodyWorld* rbw
 		{
 			if (rbsc->physics_constraint)
 			{
-				RB_constraint_set_enabled(rbsc->physics_constraint, false);
+				rigidbody_set_springs_active(rbsc, false);
+				RB_constraint_set_enabled(rbsc->physics_constraint, rbsc->flag & RBC_FLAG_ENABLED);
+				//rbsc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
 			}
 		}
 	}
@@ -3368,6 +3375,16 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 		int count = 0, brokencount = 0, plastic = 0;
 		float frame = 0;
 
+		if (rebuild)
+		{
+			copy_m4_m4(fmd->passive_parent_mat, ob->obmat);
+		}
+
+		//print_m4("Obmat: \n", ob->obmat);
+		//print_m4("Passivemat: \n", fmd->passive_parent_mat);
+
+		BKE_object_where_is_calc(scene, ob);
+
 		if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 		{
 			int frame = (int)BKE_scene_frame_get(scene);
@@ -3423,6 +3440,12 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 
 		for (rbsc = fmd->meshConstraints.first; rbsc; rbsc = rbsc->next) {
 
+			if (rebuild)
+			{
+				rbsc->start_angle = 0.0f;
+				rbsc->start_dist = 0.0f;
+			}
+
 			if (rbsc->physics_constraint && !(RB_constraint_is_enabled(rbsc->physics_constraint)))
 			{
 				brokencount++;
@@ -3440,11 +3463,6 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 				handle_regular_breaking(fmd, ob, rbw, rbsc, max_con_mass, rebuild);
 			}
 
-			if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL && (rbsc->flag & RBC_FLAG_USE_BREAKING))
-			{
-				handle_plastic_breaking(rbsc, rbw, laststeps, lastscale);
-			}
-
 			if (rebuild || rbsc->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD ||
 				rbsc->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC_REBUILD) {
 				/* World has been rebuilt so rebuild constraint */
@@ -3455,36 +3473,41 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
 
 			else if (rbsc->flag & RBC_FLAG_NEEDS_VALIDATE) {
 				BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, rbsc, false);
+				if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
+					BKE_rigidbody_start_dist_angle(rbsc, true);
 			}
 
-			if (rbsc->physics_constraint && rbw && (rbw->flag & RBW_FLAG_REBUILD_CONSTRAINTS)) {
+			if (rbsc->physics_constraint && rbw && (rbw->flag & RBW_FLAG_REBUILD_CONSTRAINTS) && !rebuild) {
 				//printf("Rebuilding constraints\n");
 				RB_constraint_set_enabled(rbsc->physics_constraint, rbsc->flag & RBC_FLAG_ENABLED);
+
 				if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL && rbsc->type == RBC_TYPE_6DOF_SPRING)
 				{
-					if (rbw->ltime > rbw->pointcache->startframe)
+					if (rbsc->plastic_angle >= 0.0f || rbsc->plastic_dist >= 0.0f)
 					{
-						if (rbsc->plastic_angle >= 0.0f || rbsc->plastic_dist >= 0.0f)
+						/*reset plastic constraints with immediate activation*/
+						if (rbsc->flag & RBC_FLAG_USE_PLASTIC)
+						{
+							rbsc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+							rigidbody_set_springs_active(rbsc, true);
+						}
+						else
 						{
-							/*reset plastic constraints with immediate activation*/
-							if (rbsc->flag & RBC_FLAG_USE_PLASTIC)
-							{
-								rbsc->flag |= RBC_FLAG_PLASTIC_ACTIVE;
-								rigidbody_set_springs_active(rbsc, true);
-							}
-							else
-							{
-								rigidbody_set_springs_active(rbsc, false);
-								rbsc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
-							}
-
-							if (rbsc->physics_constraint)
-								RB_constraint_set_equilibrium_6dof_spring(rbsc->physics_constraint);
+							rigidbody_set_springs_active(rbsc, false);
+							rbsc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
 						}
+
+						if (rbsc->physics_constraint)
+							RB_constraint_set_equilibrium_6dof_spring(rbsc->physics_constraint);
 					}
 				}
 			}
 
+			if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL && (rbsc->flag & RBC_FLAG_USE_BREAKING) && !rebuild)
+			{
+				handle_plastic_breaking(rbsc, rbw, laststeps, lastscale);
+			}
+
 			rbsc->flag &= ~RBC_FLAG_NEEDS_VALIDATE;
 			lastscale = rbw->time_scale;
 			laststeps = rbw->steps_per_second;
@@ -3572,8 +3595,6 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
 			/* update simulation object... */
 			rigidbody_update_sim_ob(scene, rbw, ob, rbo, centroid, NULL);
 		}
-
-
 	}
 
 	if (rbw->physics_world && rbw->flag & RBW_FLAG_REBUILD_CONSTRAINTS)
@@ -3700,38 +3721,17 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 	RigidBodyOb *rbo;
 	float size[3] = {1, 1, 1};
 	float centr[3];
+	
 
 	if (md->type == eModifierType_Fracture) {
 		fmd = (FractureModifierData *)md;
-		exploOK = !fmd->explo_shared || (fmd->explo_shared && fmd->frac_mesh && fmd->dm);
+		bool mode = fmd->fracture_mode == MOD_FRACTURE_EXTERNAL;
+
+		exploOK = !fmd->explo_shared || (fmd->explo_shared && fmd->frac_mesh && fmd->dm) || mode;
 
 		if (isModifierActive(fmd) && exploOK) {
 			modFound = true;
 
-			if ((ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ) ||
-			    ((ob->rigidbody_object) && (ob->rigidbody_object->flag & RBO_FLAG_KINEMATIC)))
-			{
-				/* update "original" matrix */
-				copy_m4_m4(fmd->origmat, ob->obmat);
-				if (ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ && rbw) {
-					RigidBodyShardCon *con;
-
-					rbw->flag |= RBW_FLAG_OBJECT_CHANGED;
-					BKE_rigidbody_cache_reset(rbw);
-					/* re-enable all constraints as well */
-					for (con = fmd->meshConstraints.first; con; con = con->next) {
-						con->flag |= RBC_FLAG_ENABLED;
-						con->flag |= RBC_FLAG_NEEDS_VALIDATE;
-					}
-				}
-			}
-
-			if (!is_zero_m4(fmd->origmat) && rbw && !(rbw->flag & RBW_FLAG_OBJECT_CHANGED))
-			{
-				//if (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED)
-				copy_m4_m4(ob->obmat, fmd->origmat);
-			}
-
 			if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
 			{
 				int frame = (int)ctime;
@@ -3749,6 +3749,8 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 					continue;
 				}
 
+				rigidbody_passive_fake_parenting(fmd, ob, rbo);
+
 				/* use rigid body transform after cache start frame if objects is not being transformed */
 				if (BKE_rigidbody_check_sim_running(rbw, ctime) && !(ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)) {
 
@@ -3771,6 +3773,34 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 				BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
 			}
 
+			copy_m4_m4(fmd->passive_parent_mat, ob->obmat);
+
+			if ((ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ) /* || (mode && rbw) */||
+				((ob->rigidbody_object) && (ob->rigidbody_object->flag & RBO_FLAG_KINEMATIC)))
+			{
+				/* update "original" matrix */
+				copy_m4_m4(fmd->origmat, ob->obmat);
+				if (ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ && rbw) {
+					RigidBodyShardCon *con;
+
+					rbw->flag |= RBW_FLAG_OBJECT_CHANGED;
+					BKE_rigidbody_cache_reset(rbw);
+					/* re-enable all constraints as well */
+					for (con = fmd->meshConstraints.first; con; con = con->next) {
+						//con->flag |= RBC_FLAG_ENABLED;
+						//con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+						if (con->physics_constraint)
+							RB_constraint_set_enabled(con->physics_constraint, con->flag & RBC_FLAG_ENABLED);
+					}
+				}
+			}
+
+			if (!is_zero_m4(fmd->origmat) && rbw && !(rbw->flag & RBW_FLAG_OBJECT_CHANGED))
+			{
+				//if (fmd->fracture_mode == MOD_FRACTURE_PREFRACT

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list