[Bf-blender-cvs] [d735ec0] fracture_modifier: minor fix for dynamic fracture, there was an off by 1 error which caused strange behavior on single shards

Martin Felke noreply at git.blender.org
Tue Oct 11 01:22:42 CEST 2016


Commit: d735ec0a2e078313a9de226268d195d9ff9d9812
Author: Martin Felke
Date:   Tue Oct 11 01:22:34 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd735ec0a2e078313a9de226268d195d9ff9d9812

minor fix for dynamic fracture, there was an off by 1 error which caused strange behavior on single shards

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

M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 264dc43..a359df7 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -98,7 +98,7 @@ void BKE_fracture_shard_by_points(struct FracMesh *fmesh, ShardID id, struct Fra
 void BKE_fracture_shard_by_planes(struct FractureModifierData *fmd, struct Object *obj, short inner_material_index, float mat[4][4]);
 void BKE_fracture_shard_by_greasepencil(struct FractureModifierData *fmd, struct Object *obj, short inner_material_index, float mat[4][4]);
 
-void BKE_match_vertex_coords(struct MeshIsland* mi, struct MeshIsland *par, struct Object *ob, int frame, bool is_parent);
+void BKE_match_vertex_coords(struct MeshIsland* mi, struct MeshIsland *par, struct Object *ob, int frame, bool is_parent, bool shards_to_islands);
 bool BKE_lookup_mesh_state(struct FractureModifierData *fmd, int frame, int do_lookup);
 void BKE_get_prev_entries(struct FractureModifierData *fmd);
 void BKE_get_next_entries(struct FractureModifierData *fmd);
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 516d62e..504b33a 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -2085,7 +2085,7 @@ bool BKE_lookup_mesh_state(FractureModifierData *fmd, int frame, int do_lookup)
 	}
 }
 
-void BKE_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob, int frame, bool is_parent)
+void BKE_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob, int frame, bool is_parent, bool shards_to_islands)
 {
 	float loc[3] = {0.0f, 0.0f, 0.0f};
 	float rot[4] = {1.0f, 0.0f, 0.0f, 0.0f};
@@ -2097,6 +2097,8 @@ void BKE_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob, int fr
 	float quat[4] = {1.0f, 0.0f, 0.0f, 0.0f};
 	float qrot[4] = {1.0f, 0.0f, 0.0f, 0.0f};
 
+	int val = shards_to_islands ? -1 : 0;
+
 	invert_m4_m4(mat, ob->obmat);
 
 	mi->locs[0] = loc[0] = par->locs[3*frame];
@@ -2112,7 +2114,7 @@ void BKE_match_vertex_coords(MeshIsland* mi, MeshIsland *par, Object *ob, int fr
 	mat4_to_quat(quat, mat);
 
 
-	if (par->id > 0)
+	if (par->id > val)
 	{
 		mul_qt_qtqt(qrot, rot, par->rot);
 		mul_qt_qtqt(qrot, quat, qrot);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 76e458d..fea9abf 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -3222,7 +3222,7 @@ static void do_verts_weights(FractureModifierData *fmd, Shard *s, MeshIsland *mi
 static void do_handle_parent_mi(FractureModifierData *fmd, MeshIsland *mi, MeshIsland *par, Object* ob, int frame, bool is_parent)
 {
 	frame -= par->start_frame;
-	BKE_match_vertex_coords(mi, par, ob, frame, is_parent);
+	BKE_match_vertex_coords(mi, par, ob, frame, is_parent, fmd->shards_to_islands);
 
 	BKE_rigidbody_remove_shard(fmd->modifier.scene, par);
 	fmd->modifier.scene->rigidbody_world->flag |= RBW_FLAG_OBJECT_CHANGED;
@@ -3374,13 +3374,14 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
 	{
 		/*take care of previous transformation, if any*/
 		MeshIslandSequence *prev = NULL;
+		int val = fmd->shards_to_islands ? -1 : 0;
 
 		if (fmd->current_mi_entry) {
 			prev = fmd->current_mi_entry->prev;
 		}
 
 		/*also take over the UNFRACTURED last shards transformation !!! */
-		if (s->parent_id == 0)
+		if (s->parent_id == val)
 		{
 			//float quat[4];
 
@@ -3433,12 +3434,13 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
 	{
 		if (par != NULL)
 		{
+			int val = fmd->shards_to_islands ? -1 : 0;
 			copy_v3_v3(mi->rigidbody->lin_vel, par->rigidbody->lin_vel);
 			copy_v3_v3(mi->rigidbody->ang_vel, par->rigidbody->ang_vel);
 			mi->rigidbody->flag = par->rigidbody->flag;
 
 			//keep 1st level shards kinematic if parent is triggered
-			if (par->id == 0 && (par->rigidbody->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION) && fmd->limit_impact) {
+			if (par->id == val && (par->rigidbody->flag & RBO_FLAG_USE_KINEMATIC_DEACTIVATION) && fmd->limit_impact) {
 
 				/*ShardSequence *prev_shards = fmd->current_shard_entry ? fmd->current_shard_entry->prev : NULL;
 				Shard *par_shard = prev_shards ? BKE_shard_by_id(prev_shards->frac_mesh, s->parent_id, NULL) : NULL;




More information about the Bf-blender-cvs mailing list