[Bf-blender-cvs] [9c33f3d] fracture_modifier: partial fix for suddenly missing self-collision of shards of the same object, this happened even after converting to regular rigidbodies when disable collisions was active ! (so this is now off by default)

Martin Felke noreply at git.blender.org
Tue Mar 1 18:28:13 CET 2016


Commit: 9c33f3db3fcdc81442ebc4185844a2e981722f42
Author: Martin Felke
Date:   Tue Mar 1 18:27:42 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB9c33f3db3fcdc81442ebc4185844a2e981722f42

partial fix for suddenly missing self-collision of shards of the same object, this happened even after converting to regular rigidbodies when disable collisions was active ! (so this is now off by default)

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

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

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index eb0c2df..bee7399 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2572,7 +2572,7 @@ RigidBodyShardCon *BKE_rigidbody_create_shard_constraint(Scene *scene, short typ
 	 */
 
 	/* create new settings data, and link it up */
-	rbc = MEM_callocN(sizeof(RigidBodyShardCon), "RigidBodyCon");
+	rbc = MEM_callocN(sizeof(RigidBodyShardCon), "RigidBodyShardCon");
 
 	/* set default settings */
 	rbc->type = type;
@@ -3173,7 +3173,7 @@ static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
 	/* calc ratio of broken cons here, per MeshIsland and flag the rest to be broken too*/
 	for (i = 0; i < cons; i++) {
 		con = mi->participating_constraints[i];
-		if (con && con->physics_constraint) {
+		if (con) {
 			if (fmd->cluster_breaking_percentage > 0)
 			{
 				/*only count as broken if between clusters!*/
@@ -3181,13 +3181,16 @@ static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
 				{
 					cluster_cons++;
 
-					if (!RB_constraint_is_enabled(con->physics_constraint)) {
-						broken_cluster_cons++;
+					if (con->physics_constraint)
+					{
+						if (!RB_constraint_is_enabled(con->physics_constraint)) {
+							broken_cluster_cons++;
+						}
 					}
 				}
 			}
 
-			if (!RB_constraint_is_enabled(con->physics_constraint)) {
+			if (con->physics_constraint && !RB_constraint_is_enabled(con->physics_constraint)) {
 				broken_cons++;
 			}
 		}
@@ -3200,8 +3203,8 @@ static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
 				if (con && con->mi1->particle_index != con->mi2->particle_index) {
 					if (fmd->use_breaking)
 					{
-						//con->flag &= ~RBC_FLAG_ENABLED;
-						//con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+						con->flag &= ~RBC_FLAG_ENABLED;
+						con->flag |= RBC_FLAG_NEEDS_VALIDATE;
 
 						if (con->physics_constraint) {
 							RB_constraint_set_enabled(con->physics_constraint, false);
@@ -3222,8 +3225,8 @@ static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
 				con = mi->participating_constraints[i];
 				if (con && fmd->use_breaking)
 				{
-					//con->flag &= ~RBC_FLAG_ENABLED;
-					//con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+					con->flag &= ~RBC_FLAG_ENABLED;
+					con->flag |= RBC_FLAG_NEEDS_VALIDATE;
 
 					if (con->physics_constraint) {
 						RB_constraint_set_enabled(con->physics_constraint, false);
@@ -3248,8 +3251,8 @@ static void handle_breaking_angle(FractureModifierData *fmd, Object *ob, RigidBo
 		{
 			if (fmd->use_breaking)
 			{
-				//rbsc->flag &= ~RBC_FLAG_ENABLED;
-				//rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
+				rbsc->flag &= ~RBC_FLAG_ENABLED;
+				rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
 
 				if (rbsc->physics_constraint) {
 					RB_constraint_set_enabled(rbsc->physics_constraint, false);
@@ -3265,8 +3268,8 @@ static void handle_breaking_angle(FractureModifierData *fmd, Object *ob, RigidBo
 	{
 		if (fmd->use_breaking)
 		{
-			//rbsc->flag &= ~RBC_FLAG_ENABLED;
-			//rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
+			rbsc->flag &= ~RBC_FLAG_ENABLED;
+			rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
 
 			if (rbsc->physics_constraint) {
 				RB_constraint_set_enabled(rbsc->physics_constraint, false);
@@ -4200,139 +4203,6 @@ static bool restoreKinematic(RigidBodyWorld *rbw)
 	return did_it;
 }
 
-#if 0
-static void resetPrefractured(RigidBodyWorld *rbw)
-{
-	GroupObject *go;
-	if (!rbw->group)
-		return;
-
-	for (go = rbw->group->gobject.first; go; go = go->next)
-	{
-		Object *ob = go->ob;
-		FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
-
-		if (fmd && (fmd->fracture_mode == MOD_FRACTURE_PREFRACTURED || fmd->fracture_mode == MOD_FRACTURE_EXTERNAL))
-		{
-			MeshIsland* mi;
-			RigidBodyShardCon *con;
-			Scene *scene = fmd->modifier.scene;
-
-			for (con = fmd->meshConstraints.first; con; con = con->next)
-			{
-				BKE_rigidbody_remove_shard_con(scene, con);
-				con->flag |= RBC_FLAG_NEEDS_VALIDATE;
-				//BKE_rigidbody_validate_sim_shard_constraint(rbw, fmd, ob, con, false);
-			}
-
-			for (mi = fmd->meshIslands.first; mi; mi = mi->next)
-			{
-				BKE_rigidbody_remove_shard(scene, mi);
-				if (mi->rigidbody)
-				{
-					mi->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
-					//validateShard(rbw, mi, ob, false, false);
-				}
-			}
-
-			//BKE_rigidbody_update_ob_array(rbw);
-		}
-	}
-}
-
-static void resetExternal(RigidBodyWorld *rbw)
-{
-	GroupObject *go;
-
-	for (go = rbw->group->gobject.first; go; go = go->next)
-	{
-		Object *ob = go->ob;
-		FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
-
-		if (fmd && fmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
-		{
-			RigidBodyShardCon *rbsc;
-			MeshIsland *mi;
-			Scene *scene = fmd->modifier.scene;
-			float frame = BKE_scene_frame_get(scene);
-
-			for (mi = fmd->meshIslands.first; mi; mi = mi->next)
-			{
-				float loc[3], rot[4], quat[4] = {1.0f, 0.0f, 0.0f, 0.0f};
-
-				copy_v3_v3(loc, mi->centroid);
-				copy_qt_qt(rot, mi->rot);
-
-				if (mi->rigidbody)
-				{
-					int i;
-					float loc2[3] = {0.0f, 0.0f, 0.0f};
-					float size[3] = {1.0f, 1.0f, 1.0};
-					float mat[4][4], imat[4][4];
-					loc_quat_size_to_mat4(mat, loc2, mi->rot, size);
-					invert_m4_m4(imat, mat);
-
-					copy_v3_v3(mi->rigidbody->pos, loc);
-					copy_qt_qt(mi->rigidbody->orn, rot);
-					BKE_rigidbody_remove_shard(scene, mi);
-					validateShard(rbw, mi, ob, false, false);
-					//BKE_rigidbody_update_cell(mi, ob, mi->centroid, quat, fmd, (int)frame);
-
-					for (i = 0; i < mi->vertex_count; i++)
-					{
-						MVert *v = mi->vertices_cached[i];
-						if (v)
-						{
-							//dont change initial meshislands
-							sub_v3_v3(v->co, mi->centroid);
-							mul_m4_v3(imat, v->co);
-							add_v3_v3(v->co, mi->centroid);
-						}
-					}
-				}
-			}
-
-			//BKE_object_where_is_calc(scene, ob);
-
-			for (rbsc = fmd->meshConstraints.first; rbsc; rbsc = rbsc->next)
-			{
-				if (rbsc->type == RBC_TYPE_6DOF_SPRING)
-				{
-					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);
-							if (rbsc->physics_constraint)
-							{
-								RB_constraint_set_enabled(rbsc->physics_constraint, true);
-								RB_constraint_set_equilibrium_6dof_spring(rbsc->physics_constraint);
-							}
-						}
-						else
-						{
-							rigidbody_set_springs_active(rbsc, false);
-							rbsc->flag &= ~RBC_FLAG_PLASTIC_ACTIVE;
-							if (rbsc->physics_constraint)
-								RB_constraint_set_enabled(rbsc->physics_constraint, false);
-						}
-					}
-				}
-				else
-				{
-					if (rbsc->physics_constraint)
-						RB_constraint_set_enabled(rbsc->physics_constraint, rbsc->flag & RBC_FLAG_ENABLED);
-				}
-
-				rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
-			}
-		}
-	}
-}
-#endif
-
 static ThreadMutex reset_lock = BLI_MUTEX_INITIALIZER;
 static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
 {
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 89812d1..117a251 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2242,7 +2242,7 @@ static void do_constraint(FractureModifierData* fmd, MeshIsland *mi1, MeshIsland
 		rbsc->flag &= ~RBC_FLAG_USE_BREAKING;
 	}
 
-	rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
+	//rbsc->flag |= RBC_FLAG_DISABLE_COLLISIONS;
 
 	if ((mi1->particle_index != -1) && (mi2->particle_index != -1) &&
 		(mi1->particle_index == mi2->particle_index))




More information about the Bf-blender-cvs mailing list