[Bf-blender-cvs] [7c4489b] fracture_modifier: partial fix for dynamic fracture transform issues, impact points might be calculated incorrectly still.

Martin Felke noreply at git.blender.org
Wed Oct 5 22:16:37 CEST 2016


Commit: 7c4489be8f1f2c62381e20f69410e0239c81c506
Author: Martin Felke
Date:   Wed Oct 5 22:16:18 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB7c4489be8f1f2c62381e20f69410e0239c81c506

partial fix for dynamic fracture transform issues, impact points might be calculated incorrectly still.

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

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 fc0d51b..ae0a592 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2101,6 +2101,14 @@ static bool check_shard_size(FractureModifierData *fmd, int id)
 	return true;
 }
 
+static void impact_to_shard(Shard* s, Object* ob)
+{
+	float mat[4][4];
+
+	invert_m4_m4(mat, ob->obmat);
+	mul_m4_v3(mat, s->impact_loc);
+}
+
 static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 {
 	int linear_index1, linear_index2;
@@ -2138,7 +2146,8 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 		{
 			if (fmd1->current_shard_entry && fmd1->current_shard_entry->is_new)
 			{
-				int id = rbw->cache_index_map[linear_index1]->meshisland_index;
+				RigidBodyOb *rbo = rbw->cache_index_map[linear_index1];
+				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)))) ||
@@ -2158,6 +2167,11 @@ 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)))
+						{
+							impact_to_shard(s, ob1);
+						}
 					}
 					/*only fracture on new entries, this is necessary because after loading a file
 					 *the pointcache thinks it is empty and a fracture is attempted ! */
@@ -2183,7 +2197,8 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 		{
 			if (fmd2->current_shard_entry && fmd2->current_shard_entry->is_new)
 			{
-				int id = rbw->cache_index_map[linear_index2]->meshisland_index;
+				RigidBodyOb *rbo = rbw->cache_index_map[linear_index2];
+				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)))) ||
@@ -2191,6 +2206,7 @@ static void check_fracture(rbContactPoint* cp, RigidBodyWorld *rbw)
 				{
 					if (s) {
 						float size[3];
+
 						if (s->parent_id > 0 ||ob1 == ob2 || (ob1 && ob1->rigidbody_object && ob1->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
 							size[0] = -1.0f; //mark as invalid, so the regular object size is used
 							size[1] = -1.0f;
@@ -2201,6 +2217,11 @@ 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))
+						{
+							impact_to_shard(s, ob2);
+						}
 					}
 
 					if (check_shard_size(fmd2, id))
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 8b3b3e8..1f12736 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1181,39 +1181,18 @@ static FracPointCloud get_points_global(FractureModifierData *emd, Object *ob, D
 			//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)) {
-				float size[3], nmin[3], nmax[3], loc[3], imat[4][4], tmin[3], tmax[3], quat[4];
+				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);
 
-				//invert_m4_m4(imat, ob->obmat);
-				//mul_v3_m4v3(loc, imat, s->impact_loc);
-				//sub_v3_v3v3(loc, s->impact_loc, ob->loc);
-				//mat4_to_quat(quat, imat);
-				//mul_qt_v3(quat, loc);
 				copy_v3_v3(loc, s->impact_loc);
 				copy_v3_v3(tmax, s->max);
 				copy_v3_v3(tmin, s->min);
 
-				//sub_v3_v3(loc, cent);
-				//sub_v3_v3(loc, s->centroid);
-
 				mul_v3_v3fl(size, s->impact_size, 1.25f);
 				sub_v3_v3v3(nmin, loc, size);
 				add_v3_v3v3(nmax, loc, size);
 
-				/*sub_v3_v3(tmin, cent);
-				sub_v3_v3(tmin, s->centroid);
-
-				sub_v3_v3(tmax, cent);
-				sub_v3_v3(tmax, s->centroid);
-
-				mat4_to_quat(quat, ob->obmat);
-				mul_qt_v3(quat, tmin);
-				mul_qt_v3(quat, tmax);*/
-
-				/*add_v3_v3(tmin, ob->loc);
-				add_v3_v3(tmax, ob->loc);*/
-
 				//clamp
 				if (fabsf(tmin[0]) < fabsf(nmin[0])) {
 					nmin[0] = tmin[0];




More information about the Bf-blender-cvs mailing list