[Bf-blender-cvs] [d6574ab] fracture_modifier: added split shards to island support for dynamic fracture (works only good if there are multiple islands)

Martin Felke noreply at git.blender.org
Sun Oct 9 13:38:27 CEST 2016


Commit: d6574abb83e2870c9170d74d656ba38e954530bf
Author: Martin Felke
Date:   Sun Oct 9 13:36:50 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd6574abb83e2870c9170d74d656ba38e954530bf

added split shards to island support for dynamic fracture (works only good if there are multiple islands)

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

M	source/blender/blenloader/intern/readfile.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 688499c..067fdef 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5215,6 +5215,9 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
 	fmd->fracture_ids.first = NULL;
 	fmd->fracture_ids.last = NULL;
 	fmd->update_dynamic = false;
+	fmd->visible_mesh = NULL;
+	fmd->dm = NULL;
+	fmd->visible_mesh_cached = NULL;
 
 	/*HARDCODING this for now, until we can version it properly, say with 2.75 ? */
 	if (fd->fileversion < 275) {
@@ -5405,6 +5408,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
 			ShardSequence *ssq = NULL;
 			MeshIslandSequence *msq = NULL;
 			Shard *s;
+			bool temp = fmd->shards_to_islands;
 
 			fmd->dm = NULL;
 			fmd->refresh_constraints = true;
@@ -5435,7 +5439,9 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
 
 				msq->is_new = false;
 				fmd->frac_mesh = fmd->current_shard_entry->frac_mesh;
+				fmd->shards_to_islands = false;
 				BKE_fracture_create_dm(fmd, true);
+				fmd->shards_to_islands = temp;
 				fmd->visible_mesh_cached = CDDM_copy(fmd->dm);
 				msq->visible_dm = fmd->visible_mesh_cached;
 				mverts = CDDM_get_verts(fmd->visible_mesh_cached);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index ac4134f..0002db6 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -86,12 +86,12 @@
 #include "limits.h"
 
 static DerivedMesh* do_prefractured(FractureModifierData *fmd, Object *ob, DerivedMesh *derivedData);
-static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* derivedData);
 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);
+static void do_halving(FractureModifierData *fmd, Object* ob, DerivedMesh *dm, DerivedMesh *orig_dm, bool is_prehalving, ShardID id);
 
 //TODO XXX Make BKE
 static FracMesh* copy_fracmesh(FracMesh* fm)
@@ -1607,6 +1607,30 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
 			return;
 		}
 
+#if 0
+		if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC && fmd->shards_to_islands) {
+			//find children of this shard and halve them (and remove them)
+			Shard *t = fmd->frac_mesh->shard_map.first;
+			while (t) {
+				if (t->parent_id == id && id > -1) {
+					DerivedMesh *sdm;
+					Shard* next;
+					next = t->next;
+
+					BLI_remlink(&fmd->frac_mesh->shard_map, t);
+					sdm = BKE_shard_create_dm(t, true);
+					BKE_shard_free(t, true);
+
+					do_halving(fmd, obj, sdm, dm, true, id);
+					t = next;
+				}
+				else {
+					t = t->next;
+				}
+			}
+		}
+#endif
+
 		/* here we REALLY need to fracture so deactivate the shards to islands flag and activate afterwards */
 		fmd->shards_to_islands = false;
 		BKE_fracture_create_dm(fmd, true);
@@ -1818,7 +1842,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)
+static int do_shard_to_island(FractureModifierData *fmd, BMesh* bm_new, ShardID par_id)
 {
 	DerivedMesh *dmtemp;
 	Shard *s;
@@ -1831,10 +1855,33 @@ static int do_shard_to_island(FractureModifierData *fmd, BMesh* bm_new)
 		s = BKE_create_fracture_shard(dmtemp->getVertArray(dmtemp), dmtemp->getPolyArray(dmtemp), dmtemp->getLoopArray(dmtemp),
 		                              dmtemp->getNumVerts(dmtemp), dmtemp->getNumPolys(dmtemp), dmtemp->getNumLoops(dmtemp), true);
 		s = BKE_custom_data_to_shard(s, dmtemp);
-		id = BLI_listbase_count(&fmd->islandShards);
-		s->shard_id = id;
-		s->parent_id = -1;
-		BLI_addtail(&fmd->islandShards, s);
+
+		/*for dynamic mode, store this in the main shardmap instead of separately */
+		if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC) {
+#if 0
+			/*delete all with same parent id and replace*/
+			Shard *t;
+			for (t = fmd->frac_mesh->shard_map.first; t; t = t->next) {
+				if (t->shard_id == par_id) {
+					//delete...
+					BLI_remlink(&fmd->frac_mesh->shard_map, t);
+					BKE_shard_free(t, true);
+				}
+			}
+#endif
+			id = BLI_listbase_count(&fmd->frac_mesh->shard_map);
+			s->shard_id = id+1;
+			s->parent_id = par_id;
+			s->flag = SHARD_INTACT;
+			BLI_addtail(&fmd->frac_mesh->shard_map, s);
+			fmd->frac_mesh->shard_count = id + 1;
+		}
+		else {
+			id = BLI_listbase_count(&fmd->islandShards);
+			s->shard_id = id;
+			s->parent_id = -1;
+			BLI_addtail(&fmd->islandShards, s);
+		}
 
 		dmtemp->needsFree = 1;
 		dmtemp->release(dmtemp);
@@ -1988,7 +2035,7 @@ static float do_setup_meshisland(FractureModifierData *fmd, Object *ob, int totv
 }
 
 static float mesh_separate_tagged(FractureModifierData *fmd, Object *ob, BMVert **v_tag, int v_count,
-                                  float *startco, BMesh *bm_work, short *startno, DerivedMesh *orig_dm)
+                                  float *startco, BMesh *bm_work, short *startno, DerivedMesh *orig_dm, ShardID par_id)
 {
 	BMesh *bm_new;
 	BMesh *bm_old = bm_work;
@@ -2021,7 +2068,7 @@ 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);
+	id = do_shard_to_island(fmd, bm_new, par_id);
 
 	BM_ITER_MESH (v, &iter, bm_new, BM_VERTS_OF_MESH) {
 		/* eliminate centroid in vertex coords */
@@ -2080,7 +2127,7 @@ static void handle_vert(FractureModifierData *fmd, DerivedMesh *dm, BMVert* vert
 	(*tag_counter)++;
 }
 
-static void mesh_separate_loose_partition(FractureModifierData *fmd, Object *ob, BMesh *bm_work, BMVert **orig_work, DerivedMesh *dm)
+static void mesh_separate_loose_partition(FractureModifierData *fmd, Object *ob, BMesh *bm_work, BMVert **orig_work, DerivedMesh *dm, ShardID id)
 {
 	int i, tag_counter = 0;
 	BMEdge *e;
@@ -2148,7 +2195,7 @@ static void mesh_separate_loose_partition(FractureModifierData *fmd, Object *ob,
 		BKE_bm_mesh_hflag_flush_vert(bm_old, BM_ELEM_TAG);
 
 		/* Move selection into a separate object */
-		mesh_separate_tagged(fmd, ob, v_tag, tag_counter, startco, bm_old, startno, dm);
+		mesh_separate_tagged(fmd, ob, v_tag, tag_counter, startco, bm_old, startno, dm, id);
 
 		MEM_freeN(v_tag);
 		v_tag = NULL;
@@ -2257,7 +2304,7 @@ static void mesh_separate_selected(BMesh **bm_work, BMesh **bm_out, BMVert **ori
 	BM_mesh_normals_update(bm_new);
 }
 
-static void halve(FractureModifierData *rmd, Object *ob, int minsize, BMesh **bm_work, BMVert ***orig_work, bool separated, DerivedMesh *dm)
+static void halve(FractureModifierData *rmd, Object *ob, int minsize, BMesh **bm_work, BMVert ***orig_work, bool separated, DerivedMesh *dm, ShardID id)
 {
 
 	int half;
@@ -2298,21 +2345,21 @@ static void halve(FractureModifierData *rmd, Object *ob, int minsize, BMesh **bm
 
 	printf("Old New: %d %d\n", bm_old->totvert, bm_new->totvert);
 	if ((bm_old->totvert <= minsize && bm_old->totvert > 0) || (bm_new->totvert == 0)) {
-		mesh_separate_loose_partition(rmd, ob, bm_old, orig_mod, dm);
+		mesh_separate_loose_partition(rmd, ob, bm_old, orig_mod, dm, id);
 		separated = true;
 	}
 
 	if ((bm_new->totvert <= minsize && bm_new->totvert > 0) || (bm_old->totvert == 0)) {
-		mesh_separate_loose_partition(rmd, ob, bm_new, orig_new, dm);
+		mesh_separate_loose_partition(rmd, ob, bm_new, orig_new, dm, id);
 		separated = true;
 	}
 
 	if ((bm_old->totvert > minsize && bm_new->totvert > 0) || (bm_new->totvert == 0 && !separated)) {
-		halve(rmd, ob, minsize, &bm_old, &orig_mod, separated, dm);
+		halve(rmd, ob, minsize, &bm_old, &orig_mod, separated, dm, id);
 	}
 
 	if ((bm_new->totvert > minsize && bm_old->totvert > 0) || (bm_old->totvert == 0 && !separated)) {
-		halve(rmd, ob, minsize, &bm_new, &orig_new, separated, dm);
+		halve(rmd, ob, minsize, &bm_new, &orig_new, separated, dm, id);
 	}
 
 
@@ -2322,7 +2369,7 @@ static void halve(FractureModifierData *rmd, Object *ob, int minsize, BMesh **bm
 	bm_new = NULL;
 }
 
-static void mesh_separate_loose(FractureModifierData *rmd, Object *ob, DerivedMesh *dm)
+static void mesh_separate_loose(FractureModifierData *rmd, Object *ob, DerivedMesh *dm, ShardID id)
 {
 	int minsize = 100;
 	BMesh *bm_work;
@@ -2353,7 +2400,7 @@ static void mesh_separate_loose(FractureModifierData *rmd, Object *ob, DerivedMe
 	rmd->islandShards.first = NULL;
 	rmd->islandShards.last = NULL;
 
-	halve(rmd, ob, minsize, &bm_work, &orig_start, false, dm);
+	halve(rmd, ob, minsize, &bm_work, &orig_start, false, dm, id);
 
 	MEM_freeN(orig_start);
 	orig_start = NULL;
@@ -3386,7 +3433,6 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
 				Shard *par_shard = prev_shards ? BKE_shard_by_id(prev_shards->frac_mesh, s->parent_id, NULL) : NULL;
 
 				if (par_shard) {
-
 					float size[3];
 					//mul_v3_v3fl(size, par_shard->impact_size, 0.5f);
 
@@ -3394,7 +3440,7 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
 						mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
 						mi->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
 					}
-				}*/
+				} */
 
 				mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
 				mi->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
@@ -3617,21 +3663,23 @@ static void do_clear(FractureModifierData* fmd)
 	}
 }
 
-static void do_halving(FractureModifierData *fmd, Object* ob, DerivedMesh *dm, DerivedMesh *orig_dm, bool is_prehalving)
+static void do_halving(FractureModifierData *fmd, Object* ob, DerivedMesh *dm, DerivedMesh *orig_dm, bool is_prehalving, ShardID id)
 {
 	double start;
 
+	fmd->visible_mesh = BM_mesh_create(&bm_mesh_allocsize_default, &((struct BMeshCreateParams){.use_toolflags = true,}));
+
 	if (fmd->dm && fmd->shards_to_islands && !is_prehalving) {
-		fmd->

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list