[Bf-blender-cvs] [91f02a80f54] fracture_modifier: fix for wrong centroid calculation when re-using existing mesh-islands

Martin Felke noreply at git.blender.org
Sat Aug 5 19:22:39 CEST 2017


Commit: 91f02a80f545800cd514706506069f846fbc9348
Author: Martin Felke
Date:   Sat Aug 5 19:22:13 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB91f02a80f545800cd514706506069f846fbc9348

fix for wrong centroid calculation when re-using existing mesh-islands

this affected the physics mesh and the convert to keyframes function, which created incorrect results.

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

M	source/blender/editors/object/object_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 81d80f535ba..86172c26b7d 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -3512,13 +3512,16 @@ static int rigidbody_convert_keyframes_exec(bContext *C, wmOperator *op)
 				}
 			}
 
+#if 0
+			//this check might be wrong in case a passive shard (no sim data then) is first
 			if (rmd && (rmd->fracture_mode != MOD_FRACTURE_DYNAMIC) && rmd->meshIslands.first)
 			{
 				MeshIsland* mi = rmd->meshIslands.first;
 				convertable = mi->frame_count > 0;
 			}
+#endif
 
-			if (rmd && convertable) {
+			if (rmd /*&& convertable*/) {
 				int count = BLI_listbase_count(&rmd->meshIslands);
 
 				if (count == 0)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 900868a9a20..a8b4ae61c1d 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1961,7 +1961,7 @@ static int BM_mesh_minmax(BMesh *bm, float r_min[3], float r_max[3], int tagged)
 }
 
 //XXX BKE
-static int do_shard_to_island(FractureModifierData *fmd, BMesh* bm_new, ShardID par_id)
+static int do_shard_to_island(FractureModifierData *fmd, BMesh* bm_new, ShardID par_id, float centroid[3])
 {
 	DerivedMesh *dmtemp;
 	Shard *s;
@@ -2003,6 +2003,8 @@ static int do_shard_to_island(FractureModifierData *fmd, BMesh* bm_new, ShardID
 			BLI_addtail(&fmd->islandShards, s);
 		}
 
+		copy_v3_v3(centroid, s->centroid);
+
 		dmtemp->needsFree = 1;
 		dmtemp->release(dmtemp);
 		dmtemp = NULL;
@@ -2199,7 +2201,8 @@ static float mesh_separate_tagged(FractureModifierData *fmd, Object *ob, BMVert
 	BM_calc_center_centroid(bm_new, centroid, false);
 	BM_mesh_elem_index_ensure(bm_new, BM_VERT | BM_EDGE | BM_FACE);
 
-	id = do_shard_to_island(fmd, bm_new, par_id);
+	//overwrite centroid with shard centroid here if we have a valid shard
+	id = do_shard_to_island(fmd, bm_new, par_id, centroid);
 
 	BM_ITER_MESH (v, &iter, bm_new, BM_VERTS_OF_MESH) {
 		/* eliminate centroid in vertex coords */




More information about the Bf-blender-cvs mailing list