[Bf-blender-cvs] [4670d184740] fracture_modifier: use separate storage for packed geometry, allows mode switching and re-use of it
Martin Felke
noreply at git.blender.org
Sun Jun 11 11:50:13 CEST 2017
Commit: 4670d1847406142b7ab745361833d0b0a3d187d2
Author: Martin Felke
Date: Sun Jun 11 11:49:50 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rB4670d1847406142b7ab745361833d0b0a3d187d2
use separate storage for packed geometry, allows mode switching and re-use of it
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/makesdna/DNA_modifier_types.h
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 95722f2305d..eb748e1eac9 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -84,10 +84,11 @@ float BKE_shard_calc_minmax(struct Shard *shard);
void BKE_fracmesh_free(struct FracMesh *fm, bool doCustomData);
void BKE_shard_free(struct Shard *s, bool doCustomData);
+struct Shard* BKE_fracture_shard_copy(struct Shard *s);
/* DerivedMesh */
-void BKE_fracture_create_dm(struct FractureModifierData *fmd, bool doCustomData);
+struct DerivedMesh *BKE_fracture_create_dm(struct FractureModifierData *fmd, bool doCustomData, bool use_packed);
struct DerivedMesh *BKE_shard_create_dm(struct Shard *s, bool doCustomData);
/* create shards from base mesh and a list of points */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index cb986fcceb5..d0c0a69fbbe 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -361,6 +361,38 @@ Shard* BKE_create_initial_shard(DerivedMesh *dm)
return s;
}
+Shard* BKE_fracture_shard_copy(Shard *s)
+{
+ Shard *t = BKE_create_fracture_shard(s->mvert, s->mpoly, s->mloop, s->medge, s->totvert, s->totpoly, s->totloop, s->totedge, true);
+ copy_v3_v3(t->centroid, s->centroid);
+ t->neighbor_count = s->neighbor_count;
+ t->neighbor_ids = MEM_mallocN(sizeof(int) * t->neighbor_count, __func__);
+ memcpy(t->neighbor_ids, s->neighbor_ids, sizeof(int) * t->neighbor_count);
+ copy_v3_v3(t->raw_centroid, s->raw_centroid);
+ t->raw_volume = s->raw_volume;
+ t->shard_id = s->shard_id;
+ t->setting_id = s->setting_id;
+ t->flag = s->flag;
+ t->parent_id = s->parent_id;
+ copy_v3_v3(t->max, s->max);
+ copy_v3_v3(t->min, s->min);
+ copy_v3_v3(t->impact_loc, s->impact_loc);
+ copy_v3_v3(t->impact_size, s->impact_size);
+ //TODO, maybe cluster colors too ?
+
+ CustomData_reset(&t->vertData);
+ CustomData_reset(&t->loopData);
+ CustomData_reset(&t->polyData);
+ CustomData_reset(&t->edgeData);
+
+ CustomData_copy(&s->vertData, &t->vertData, CD_MASK_MDEFORMVERT, CD_DUPLICATE, s->totvert);
+ CustomData_copy(&s->loopData, &t->loopData, CD_MASK_MLOOPUV, CD_DUPLICATE, s->totloop);
+ CustomData_copy(&s->polyData, &t->polyData, CD_MASK_MTEXPOLY, CD_DUPLICATE, s->totpoly);
+ CustomData_copy(&s->edgeData, &t->edgeData, CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_MEDGE, CD_DUPLICATE, s->totedge);
+
+ return t;
+}
+
/*access shard directly by index / id*/
Shard *BKE_shard_by_id(FracMesh *mesh, ShardID id, DerivedMesh *dm) {
@@ -1946,7 +1978,8 @@ static void do_marking(FractureModifierData *fmd, DerivedMesh *result)
}
}
-static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_loops, int num_polys, int num_edges, bool doCustomData)
+static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_loops, int num_polys, int num_edges,
+ bool doCustomData, bool use_packed)
{
int shard_count = fmd->shards_to_islands ? BLI_listbase_count(&fmd->islandShards) : fmd->frac_mesh->shard_count;
ListBase *shardlist;
@@ -1997,7 +2030,11 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
}
vertstart = polystart = loopstart = edgestart = 0;
- if (fmd->shards_to_islands) {
+ if (use_packed)
+ {
+ shardlist = &fmd->pack_storage;
+ }
+ else if (fmd->shards_to_islands) {
shardlist = &fmd->islandShards;
}
else {
@@ -2073,7 +2110,7 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
}
/* DerivedMesh */
-static DerivedMesh *create_dm(FractureModifierData *fmd, bool doCustomData)
+static DerivedMesh *create_dm(FractureModifierData *fmd, bool doCustomData, bool use_packed)
{
Shard *s;
int num_verts, num_polys, num_loops, num_edges;
@@ -2081,7 +2118,16 @@ static DerivedMesh *create_dm(FractureModifierData *fmd, bool doCustomData)
num_verts = num_polys = num_loops = num_edges = 0;
- if (fmd->shards_to_islands) {
+ if (use_packed)
+ {
+ for (s = fmd->pack_storage.first; s; s = s->next) {
+ num_verts += s->totvert;
+ num_polys += s->totpoly;
+ num_loops += s->totloop;
+ num_edges += s->totedge;
+ }
+ }
+ else if (fmd->shards_to_islands) {
for (s = fmd->islandShards.first; s; s = s->next) {
num_verts += s->totvert;
num_polys += s->totpoly;
@@ -2102,7 +2148,7 @@ static DerivedMesh *create_dm(FractureModifierData *fmd, bool doCustomData)
}
}
- result = do_create(fmd, num_verts, num_loops, num_polys, num_edges, doCustomData);
+ result = do_create(fmd, num_verts, num_loops, num_polys, num_edges, doCustomData, use_packed);
if (num_edges == 0) {
CustomData_free(&result->edgeData, 0);
@@ -2116,18 +2162,23 @@ static DerivedMesh *create_dm(FractureModifierData *fmd, bool doCustomData)
return result;
}
-void BKE_fracture_create_dm(FractureModifierData *fmd, bool doCustomData)
+DerivedMesh* BKE_fracture_create_dm(FractureModifierData *fmd, bool doCustomData, bool use_packed)
{
DerivedMesh *dm_final = NULL;
- if (fmd->dm) {
+ if (fmd->dm && !use_packed) {
fmd->dm->needsFree = 1;
fmd->dm->release(fmd->dm);
fmd->dm = NULL;
}
- dm_final = create_dm(fmd, doCustomData);
- fmd->dm = dm_final;
+ dm_final = create_dm(fmd, doCustomData, use_packed);
+
+ if (!use_packed) {
+ fmd->dm = dm_final;
+ }
+
+ return dm_final;
}
void BKE_copy_customdata_layers(CustomData* dest, CustomData *src, int type, int count)
@@ -2733,7 +2784,7 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
DerivedMesh *dm = fmd->visible_mesh_cached;
int vertstart = 0, totvert = 0, totpoly = 0, polystart = 0, matstart = 1, defstart = 0;
MVert *mv = NULL;
- MPoly *mp = NULL, *mpoly = NULL, *ppoly = NULL, *pp = NULL, *spoly = NULL, *sp = NULL;
+ MPoly *mp = NULL, *mpoly = NULL, *ppoly = NULL, *pp = NULL, *spoly = NULL, *sp = NULL, *tpoly = NULL, *tp = NULL;
int i = 0, j = 0;
MDeformVert *dvert = NULL;
@@ -2745,7 +2796,7 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
dm = fmd->visible_mesh_cached = NULL;
}
- fmd->visible_mesh_cached = create_dm(fmd, do_custom_data);
+ fmd->visible_mesh_cached = create_dm(fmd, do_custom_data, fmd->pack_storage.first != NULL);
if (!fmd->visible_mesh_cached)
return 0;
@@ -2762,6 +2813,8 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
MVert *pvert = mi->physics_mesh->getVertArray(mi->physics_mesh);
float inv_size[3] = {1.0f, 1.0f, 1.0f};
Shard *s = BLI_findlink(&fmd->frac_mesh->shard_map, mi->id);
+ Shard *t = BLI_findlink(&fmd->pack_storage, mi->id);
+
if (!s)
continue;
@@ -2847,6 +2900,10 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
totpoly = mi->physics_mesh->getNumPolys(mi->physics_mesh);
ppoly = mi->physics_mesh->getPolyArray(mi->physics_mesh);
spoly = s->mpoly;
+ if (t) {
+ tpoly = t->mpoly;
+ }
+
for (j = 0, mp = mpoly + polystart, pp = ppoly, sp = spoly; j < totpoly; j++, mp++, pp++, sp++)
{
/* material index lookup and correction, avoid having the same material in different slots */
@@ -2861,6 +2918,12 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
// having a materialmap then)
pp->mat_nr = index;
sp->mat_nr = index;
+
+ //also dont forget pack storage
+ if (tpoly) {
+ tp = tpoly + j;
+ tp->mat_nr = index;
+ }
}
/* fortunately we know how many faces "belong" to this meshisland, too */
@@ -2929,6 +2992,12 @@ short BKE_fracture_collect_materials(Object* o, Object* ob, int matstart, GHash*
return (*totcolp);
}
+void pack_storage_add(FractureModifierData *fmd, Shard* s)
+{
+ Shard *t = BKE_fracture_shard_copy(s);
+ BLI_addtail(&fmd->pack_storage, t);
+}
+
MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own, Object *target)
{
MeshIsland *mi;
@@ -2999,6 +3068,9 @@ MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
//XXX TODO handle UVs, shapekeys and more ?
+ //add shard to pack storage
+ pack_storage_add(fmd, s);
+
return mi;
}
@@ -3069,6 +3141,22 @@ void BKE_fracture_free_mesh_island(FractureModifierData *rmd, MeshIsland *mi, bo
mi = NULL;
}
+void pack_storage_remove(FractureModifierData *fmd, Shard *s)
+{
+ Shard *t = fmd->pack_storage.first;
+ while(t)
+ {
+ if (t->shard_id == s->shard_id)
+ {
+ BLI_remlink(&fmd->pack_storage, t);
+ BKE_shard_free(t, true);
+ break;
+ }
+
+ t = t->next;
+ }
+}
+
void BKE_fracture_mesh_island_remove(FractureModifierData *fmd, MeshIsland *mi)
{
if (BLI_listbase_is_single(&fmd->meshIslands))
@@ -3085,6 +3173,7 @@ void BKE_fracture_mesh_island_remove(FractureModifierData *fmd, MeshIsland *mi)
{
int i;
BLI_remlink(&fmd->frac_mesh->shard_map, s);
+ pack_storage_remove(fmd, s);
BKE_shard_free(s, true);
fmd->frac_mesh->shard_count--;
@@ -3101,6 +3190,16 @@ void BKE_fracture_mesh_island_remove(FractureModifierData *fmd, MeshIsland *mi)
}
}
+void pack_storage_remove_all(FractureModifierData*fmd)
+{
+ Shard *s;
+ while (fmd->pack_storage.first) {
+ s = fmd->pack_storage.first;
+ BLI_remlink(&fmd->pack_storage, s);
+ BKE_shard_free(s, true);
+ }
+}
+
void BKE_fracture_mesh_island_remove_all(FractureModifierData *fmd)
{
MeshIsland *mi;
@@ -3110,6 +3209,9 @@ void BKE_fracture_mesh_island_remove_all(FractureModifierData *fmd)
MEM_freeN(fmd->frac_mesh);
fmd->frac_mesh = NULL;
+ //free pack storage
+ pack_storage_remove_all(fmd);
+
//free all constraints first
BKE_free_constraints(fmd);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index f63cbe46d78..aea2b1fdafa 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5343,7 +5343,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
}
/* ugly ugly, need only the shard... the rest is to be generated on demand... */
- BKE_fracture_create_dm(fmd, true);
+ BKE_fracture_crea
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list