[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