[Bf-blender-cvs] [5a46ad2] fracture_modifier: dynamic fracture, attempt to better control the higher level fractures via threshold

Martin Felke noreply at git.blender.org
Thu Oct 6 17:49:58 CEST 2016


Commit: 5a46ad276c7ad3721e71a34982510f3a2c733e60
Author: Martin Felke
Date:   Thu Oct 6 17:49:32 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB5a46ad276c7ad3721e71a34982510f3a2c733e60

dynamic fracture, attempt to better control the higher level fractures via threshold

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

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 ae0a592..0dd92b7 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2033,9 +2033,9 @@ static bool can_break(Object* collider, Object* ob, bool limit, Shard *s)
 	if (collider && collider->rigidbody_object && (collider->rigidbody_object->flag & RBO_FLAG_IS_TRIGGER &&
 	   s && (s->parent_id == 0 || s->shard_id == 0)))
 	{
-		if (limit && (collider == ob)) {
+		/*if (limit && (collider == ob)) {
 			return false;
-		}
+		}*/
 
 		return true;
 	}
@@ -2101,12 +2101,16 @@ static bool check_shard_size(FractureModifierData *fmd, int id)
 	return true;
 }
 
-static void impact_to_shard(Shard* s, Object* ob)
+static void impact_to_shard(Shard* s/*, Object* ob,*/, RigidBodyOb *rbo)
 {
 	float mat[4][4];
 
-	invert_m4_m4(mat, ob->obmat);
-	mul_m4_v3(mat, s->impact_loc);
+	if ((s->shard_id == 0) /*|| (s->parent_id == 0)*/)
+	{
+		/*invert_m4_m4(mat, ob->obmat);
+		mul_m4_v3(mat, s->impact_loc);*/
+		sub_v3_v3(s->impact_loc, rbo->pos);
+	}
 }
 
 static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
@@ -2150,7 +2154,9 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 				int id = rbo->meshisland_index;
 				Shard *s = findShard(fmd1, id);
 
-				if ((force > fmd1->dynamic_force && (!fmd1->limit_impact || (fmd1->limit_impact && s && (s->parent_id > 0 || s->shard_id > 0)))) ||
+				//printf("FORCE1:%f\n",force);
+
+				if (((force > fmd1->dynamic_force) && (!fmd1->limit_impact || (fmd1->limit_impact && s && (s->parent_id > 0 || s->shard_id >= 0)))) ||
 				    (s && ob2 && (fmd1->limit_impact && can_break(ob2, ob1, fmd1->limit_impact, s))))
 				{
 					if (s) {
@@ -2168,9 +2174,9 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 						copy_v3_v3(s->impact_loc, cp->contact_pos_world_onA);
 						copy_v3_v3(s->impact_size, size);
 
-						if (fmd1->limit_impact && s && ((s->shard_id == 0)))
+						if (fmd1->limit_impact && s)
 						{
-							impact_to_shard(s, ob1);
+							impact_to_shard(s, rbo);
 						}
 					}
 					/*only fracture on new entries, this is necessary because after loading a file
@@ -2201,7 +2207,9 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 				int id = rbo->meshisland_index;
 				Shard *s = findShard(fmd2, id);
 
-				if ((force > fmd2->dynamic_force && (!fmd2->limit_impact || (fmd2->limit_impact && s && (s->parent_id > 0 || s->shard_id > 0)))) ||
+				//printf("FORCE2:%f\n",force);
+
+				if (((force > fmd2->dynamic_force) && (!fmd2->limit_impact || (fmd2->limit_impact && s && (s->parent_id > 0 || s->shard_id >= 0)))) ||
 				        (ob1 && s && (fmd2->limit_impact && can_break(ob1, ob2, fmd2->limit_impact, s))))
 				{
 					if (s) {
@@ -2218,9 +2226,9 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 						copy_v3_v3(s->impact_loc, cp->contact_pos_world_onB);
 						copy_v3_v3(s->impact_size, size);
 
-						if (fmd2->limit_impact && s && (s->shard_id == 0))
+						if (fmd2->limit_impact && s)
 						{
-							impact_to_shard(s, ob2);
+							impact_to_shard(s, rbo);
 						}
 					}
 
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 1f12736..191098d 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -91,6 +91,7 @@ static Shard* copy_shard(Shard *s);
 static void arrange_shard(FractureModifierData *fmd, ShardID id, bool do_verts, float cent[]);
 static Shard* find_shard(ListBase *shards, ShardID id);
 static void cleanup_arrange_shard(FractureModifierData *fmd, Shard *s, float cent[]);
+static MeshIsland* find_meshisland(ListBase* meshIslands, int id);
 
 //TODO XXX Make BKE
 static FracMesh* copy_fracmesh(FracMesh* fm)
@@ -1180,7 +1181,7 @@ static FracPointCloud get_points_global(FractureModifierData *emd, Object *ob, D
 		if (emd->fracture_mode == MOD_FRACTURE_DYNAMIC && emd->limit_impact) {
 			//shrink pointcloud container around impact point, to a size
 			s = BKE_shard_by_id(emd->frac_mesh, id, fracmesh);
-			if (s != NULL && (/*s->shard_id == 0 || s->parent_id == 0 || */s->impact_size[0] > 0.0f)) {
+			if (s != NULL && s->impact_size[0] > 0.0f) {
 				float size[3], nmin[3], nmax[3], loc[3], tmin[3], tmax[3];
 				print_v3("Impact Loc\n", s->impact_loc);
 				print_v3("Impact Size\n", s->impact_size);
@@ -1232,6 +1233,9 @@ static FracPointCloud get_points_global(FractureModifierData *emd, Object *ob, D
 			}
 		}
 
+		//print_v3("MIN:", min);
+		//print_v3("MAX:", max);
+
 		BLI_srandom(emd->point_seed);
 		for (i = 0; i < count; ++i) {
 			if (BLI_frand() < thresh) {




More information about the Bf-blender-cvs mailing list