[Bf-blender-cvs] [9e9bbed] fracture_modifier: ignore individual mesh island transforms in rigidbody system again and just re-apply them when converting back to objects, it just caused trouble and brought not the expected result

Martin Felke noreply at git.blender.org
Mon Feb 1 14:02:47 CET 2016


Commit: 9e9bbed144389beab39b1a8b8b091afdd9f0326e
Author: Martin Felke
Date:   Mon Feb 1 14:02:30 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB9e9bbed144389beab39b1a8b8b091afdd9f0326e

ignore individual mesh island transforms in rigidbody system again and just re-apply them when converting back to objects, it just caused trouble and brought not the expected result

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

M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/editors/object/object_modifier.c

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

diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 79f747b..83809b1 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -2393,7 +2393,7 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
 	for (mi = fmd->meshIslands.first; mi; mi = mi->next)
 	{
 		MVert *pvert = mi->physics_mesh->getVertArray(mi->physics_mesh);
-		//Shard *s = BLI_findlink(&fmd->frac_mesh->shard_map, mi->id);
+		Shard *s = BLI_findlink(&fmd->frac_mesh->shard_map, mi->id);
 
 		for (i = 0; i < mi->vertex_count; i++)
 		{
@@ -2425,21 +2425,18 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
 				loc_quat_size_to_mat4(mat, loc , mi->rot, size);
 
 			invert_m4_m4(imat, mat);
-			//pv = pvert + i;
-			//add_v3_v3(pv->co, mi->centroid);
-			//mul_m4_v3(imat, pv->co);
-			//sub_v3_v3(pv->co, mi->centroid);
-#endif
-
-			loc_quat_size_to_mat4(mat, loc, mi->rot, size);
-			invert_m4_m4(imat, mat);
 			pv = pvert + i;
 			mul_m4_v3(imat, pv->co);
 
+			loc_quat_size_to_mat4(mat, loc , mi->rot, size);
+			invert_m4_m4(imat, mat);
+
 			sub_v3_v3(v->co, mi->centroid);
-			mul_m4_v3(mat, v->co);
+			mul_m4_v3(imat, v->co);
 			add_v3_v3(v->co, mi->centroid);
+
 			//printf("%d %d\n", index, dm->getNumVerts(dm));
+#endif
 
 			//hrm perhaps we need to update rest coordinates, too...
 			mi->vertco[3*i] = v->co[0];
@@ -2450,6 +2447,12 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
 			mi->vertno[3*i+1] = v->no[1];
 			mi->vertno[3*i+2] = v->no[2];
 
+#if 0
+			sub_v3_v3(v->co, mi->centroid);
+			mul_m4_v3(mat, v->co);
+			add_v3_v3(v->co, mi->centroid);
+#endif
+
 			if (ob && dvert)
 			{
 				int l;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 676c42c..f0c9ae2 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -480,12 +480,6 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float loc[3],
 	invert_m4_m4(ob->imat, ob->obmat);
 	mat4_to_size(size, ob->obmat);
 
-	if (rmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
-	{
-		//take mi->rot into account too
-		mul_qt_qtqt(rot, rot, mi->rot);
-	}
-
 	if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED && frame > -1) {
 		/*record only in prefracture case here, when you want to convert to keyframes*/
 		n = frame - mi->start_frame + 1;
@@ -3598,7 +3592,7 @@ 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) && 0)// /*&& !rebuild*/)
+			if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL && (rbsc->flag & RBC_FLAG_USE_BREAKING) && !rebuild)
 			{
 				handle_plastic_breaking(rbsc, rbw, laststeps, lastscale);
 			}
@@ -3939,6 +3933,19 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
 
 				//frame = (int)BKE_scene_frame_get(md->scene);
 				//print_v3("RBO POS:", rbo->pos);
+#if 0
+				if (mode)
+				{
+					float rot[4];
+					copy_qt_qt(rot, mi->rot);
+					mul_qt_qtqt(rot, rot, rbo->orn);
+					BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
+				}
+				else
+				{
+					BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
+				}
+#endif
 				BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
 			}
 
@@ -4173,7 +4180,7 @@ static bool restoreKinematic(RigidBodyWorld *rbw)
 	return did_it;
 }
 
-static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
+static void resetExternal(RigidBodyWorld *rbw)
 {
 	GroupObject *go;
 
@@ -4187,52 +4194,46 @@ static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
 			RigidBodyShardCon *rbsc;
 			MeshIsland *mi;
 			Scene *scene = fmd->modifier.scene;
+			float frame = BKE_scene_frame_get(scene);
 
-			BKE_object_where_is_calc(scene, ob);
-
-			if (do_reset_always)
+			for (mi = fmd->meshIslands.first; mi; mi = mi->next)
 			{
-				for (mi = fmd->meshIslands.first; mi; mi = mi->next)
-				{
-					float loc[3], rot[4], quat[4];
-					mat4_to_quat(quat, ob->obmat);
+				float loc[3], rot[4], quat[4] = {1.0f, 0.0f, 0.0f, 0.0f};
 
-					//mul_v3_m4v3(loc, ob->obmat, mi->centroid);
-					//mul_qt_qtqt(rot, quat, mi->rot);
-					copy_v3_v3(loc, mi->centroid);
-					copy_qt_qt(rot, mi->rot);
+				copy_v3_v3(loc, mi->centroid);
+				copy_qt_qt(rot, mi->rot);
 
-					if (mi->rigidbody)
+				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++)
 					{
-						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);
-
-						for (i = 0; i < mi->vertex_count; i++)
+						MVert *v = mi->vertices_cached[i];
+						if (v)
 						{
-							MVert *v = mi->vertices_cached[i];
-							if (v)
-							{
-								int x;
-								//dont change initial meshislands
-								sub_v3_v3(v->co, mi->centroid);
-								mul_m4_v3(mat, v->co);
-								add_v3_v3(v->co, mi->centroid);
-								x = 1;
-							}
+							//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)
@@ -4268,6 +4269,17 @@ static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
 				rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
 			}
 		}
+	}
+}
+
+static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
+{
+	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_DYNAMIC)
 		{
@@ -4395,6 +4407,7 @@ void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
 			if (!(cache->flag & PTCACHE_BAKED))
 			{
 				resetDynamic(rbw, true);
+				//resetExternal(rbw);
 			}
 
 			BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 55743f3..5b682c6 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2764,32 +2764,33 @@ static Object* do_convert_meshisland_to_object(MeshIsland *mi, Scene* scene, Gro
 	else
 	{
 		int i;
-		float size[3] = {1.0f, 1.0f, 1.0f}, inv_size[3] = {1.0f, 1.0f, 1.0f};
+		float size[3] = {1.0f, 1.0f, 1.0f};
+		float loc[3] = {0.0f, 0.0f, 0.0f}, mat[4][4], imat[4][4];
+
 		Shard *s = BLI_findlink(&fmd->frac_mesh->shard_map, mi->id);
 		if (s)
 		{
 			//AGAIN, used raw_centroid FOR NOW XXX TODO
 			copy_v3_v3(ob_new->size,s->raw_centroid);
-			inv_size[0] = 1.0f / s->raw_centroid[0];
-			inv_size[1] = 1.0f / s->raw_centroid[1];
-			inv_size[2] = 1.0f / s->raw_centroid[2];
 		}
 		else
 		{
 			copy_v3_v3(ob_new->size, size);
 		}
-		copy_v3_v3(ob_new->loc, mi->rigidbody->pos);
-		copy_qt_qt(ob_new->quat, mi->rigidbody->orn);
 
-		//compensate size; loc and rot should be dealt with already in physmesh
+		copy_v3_v3(ob_new->loc, mi->centroid);
+		copy_qt_qt(ob_new->quat, mi->rot);
+		loc_quat_size_to_mat4(ob_new->obmat, ob_new->loc, ob_new->quat, ob_new->size);
+		invert_m4_m4(ob_new->imat, ob_new->obmat);
+
+		loc_quat_size_to_mat4(mat, loc, ob_new->quat, ob_new->size);
+		invert_m4_m4(imat, mat);
+		//compensate for rot, size
 		for (i = 0; i < me->totvert; i++)
 		{
-			mul_v3_v3(me->mvert[i].co, inv_size);
+			mul_m4_v3(imat, me->mvert[i].co);
 		}
 
-		//copy_v3_v3(ob_new->loc, mi->centroid);
-		//copy_qt_qt(ob_new->quat, mi->rot); // does bullet reset the start orientation ? maybe i do in the code somewhere...
-		loc_quat_size_to_mat4(ob_new->obmat, ob_new->loc, ob_new->quat, ob_new->size);
 		mat4_to_axis_angle(ob_new->rotAxis, &ob_new->rotAngle, ob_new->obmat);
 		mat4_to_eulO(ob_new->rot, ob_new->rotmode, ob_new->obmat);
 	}




More information about the Bf-blender-cvs mailing list