[Bf-blender-cvs] [025aae4] fracture_modifier: support for keeping edge data in fracture modifier (like sharp edges)
Martin Felke
noreply at git.blender.org
Fri Dec 16 00:15:52 CET 2016
Commit: 025aae441378805b07148eb7c95b35fb461914d8
Author: Martin Felke
Date: Fri Dec 16 00:15:12 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB025aae441378805b07148eb7c95b35fb461914d8
support for keeping edge data in fracture modifier (like sharp edges)
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/fracture_util.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/makesdna/DNA_fracture_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 53d5fdb..c2ac1d1 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -72,7 +72,8 @@ bool BKE_get_shard_minmax(struct FracMesh *mesh, ShardID id, float min_r[3], flo
/* container object handling functions */
struct FracMesh *BKE_create_fracture_container(void);
-struct Shard *BKE_create_fracture_shard(struct MVert *mvert, struct MPoly *mpoly, struct MLoop *mloop, int totvert, int totpoly, int totloop, bool copy);
+struct Shard *BKE_create_fracture_shard(struct MVert *mvert, struct MPoly *mpoly, struct MLoop *mloop, struct MEdge *medge,
+ int totvert, int totpoly, int totloop, int totedge, bool copy);
struct Shard *BKE_custom_data_to_shard(struct Shard *s, struct DerivedMesh *dm);
/* utility functions */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 8ef6bca..db928d8 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -48,6 +48,7 @@
#include "BKE_pointcache.h"
#include "BKE_rigidbody.h"
+#include "BLI_edgehash.h"
#include "BLI_kdtree.h"
#include "BLI_listbase.h"
#include "BLI_math_vector.h"
@@ -206,6 +207,7 @@ Shard *BKE_custom_data_to_shard(Shard *s, DerivedMesh *dm)
CustomData_reset(&s->vertData);
CustomData_reset(&s->loopData);
CustomData_reset(&s->polyData);
+ CustomData_reset(&s->edgeData);
CustomData_copy(&dm->vertData, &s->vertData, CD_MASK_MDEFORMVERT, CD_DUPLICATE, s->totvert);
CustomData_copy(&dm->loopData, &s->loopData, CD_MASK_MLOOPUV, CD_DUPLICATE, s->totloop);
@@ -309,6 +311,9 @@ void BKE_shard_free(Shard *s, bool doCustomData)
if (s->mpoly) {
MEM_freeN(s->mpoly);
}
+ if (s->medge) {
+ MEM_freeN(s->medge);
+ }
if (s->neighbor_ids) {
MEM_freeN(s->neighbor_ids);
}
@@ -320,6 +325,7 @@ void BKE_shard_free(Shard *s, bool doCustomData)
CustomData_free(&s->vertData, s->totvert);
CustomData_free(&s->loopData, s->totloop);
CustomData_free(&s->polyData, s->totpoly);
+ CustomData_free(&s->edgeData, s->totedge);
}
MEM_freeN(s);
@@ -345,8 +351,8 @@ float BKE_shard_calc_minmax(Shard *shard)
Shard* BKE_create_initial_shard(DerivedMesh *dm)
{
/* create temporary shard covering the entire mesh */
- Shard *s = BKE_create_fracture_shard(dm->getVertArray(dm), dm->getPolyArray(dm), dm->getLoopArray(dm),
- dm->numVertData, dm->numPolyData, dm->numLoopData, true);
+ Shard *s = BKE_create_fracture_shard(dm->getVertArray(dm), dm->getPolyArray(dm), dm->getLoopArray(dm), dm->getEdgeArray(dm),
+ dm->numVertData, dm->numPolyData, dm->numLoopData, dm->numEdgeData, true);
s = BKE_custom_data_to_shard(s, dm);
s->flag = SHARD_INTACT;
s->shard_id = -2;
@@ -398,12 +404,13 @@ bool BKE_get_shard_minmax(FracMesh *mesh, ShardID id, float min_r[3], float max_
return false;
}
-Shard *BKE_create_fracture_shard(MVert *mvert, MPoly *mpoly, MLoop *mloop, int totvert, int totpoly, int totloop, bool copy)
+Shard *BKE_create_fracture_shard(MVert *mvert, MPoly *mpoly, MLoop *mloop, MEdge* medge, int totvert, int totpoly, int totloop, int totedge, bool copy)
{
Shard *shard = MEM_mallocN(sizeof(Shard), __func__);
shard->totvert = totvert;
shard->totpoly = totpoly;
shard->totloop = totloop;
+ shard->totedge = totedge;
shard->cluster_colors = NULL;
shard->neighbor_ids = NULL;
shard->neighbor_count = 0;
@@ -412,14 +419,17 @@ Shard *BKE_create_fracture_shard(MVert *mvert, MPoly *mpoly, MLoop *mloop, int t
shard->mvert = MEM_mallocN(sizeof(MVert) * totvert, "shard vertices");
shard->mpoly = MEM_mallocN(sizeof(MPoly) * totpoly, "shard polys");
shard->mloop = MEM_mallocN(sizeof(MLoop) * totloop, "shard loops");
+ shard->medge = MEM_mallocN(sizeof(MEdge) * totedge, "shard edges");
memcpy(shard->mvert, mvert, sizeof(MVert) * totvert);
memcpy(shard->mpoly, mpoly, sizeof(MPoly) * totpoly);
memcpy(shard->mloop, mloop, sizeof(MLoop) * totloop);
+ memcpy(shard->medge, medge, sizeof(MEdge) * totedge);
}
else {
shard->mvert = mvert;
shard->mpoly = mpoly;
shard->mloop = mloop;
+ shard->medge = medge;
}
shard->shard_id = -1;
@@ -1123,7 +1133,7 @@ static Shard *parse_cell(cell c)
copy_v3_v3(centr, c.centroid);
- s = BKE_create_fracture_shard(mvert, mpoly, mloop, totvert, totpoly, totloop, false);
+ s = BKE_create_fracture_shard(mvert, mpoly, mloop, NULL, totvert, totpoly, totloop, 0, false);
//s->flag &= ~(SHARD_SKIP | SHARD_DELETE);
s->neighbor_ids = neighbors;
@@ -1362,8 +1372,8 @@ static void intersect_shards_by_dm(FractureModifierData *fmd, DerivedMesh *d, Ob
MVert *mv;
DerivedMesh *dm_parent = NULL;
- t = BKE_create_fracture_shard(d->getVertArray(d), d->getPolyArray(d), d->getLoopArray(d),
- d->getNumVerts(d), d->getNumPolys(d), d->getNumLoops(d), true);
+ t = BKE_create_fracture_shard(d->getVertArray(d), d->getPolyArray(d), d->getLoopArray(d), d->getEdgeArray(d),
+ d->getNumVerts(d), d->getNumPolys(d), d->getNumLoops(d), d->getNumEdges(d), true);
t = BKE_custom_data_to_shard(t, d);
@@ -1827,23 +1837,28 @@ static void do_marking(FractureModifierData *fmd, DerivedMesh *result)
}
}
-static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_loops, int num_polys, bool doCustomData)
+static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_loops, int num_polys, int num_edges, bool doCustomData)
{
int shard_count = fmd->shards_to_islands ? BLI_listbase_count(&fmd->islandShards) : fmd->frac_mesh->shard_count;
ListBase *shardlist;
Shard *shard;
- int vertstart, polystart, loopstart;
+ int vertstart, polystart, loopstart, edgestart;
MVert *mverts;
MPoly *mpolys;
MLoop *mloops;
+ MEdge *medges;
- DerivedMesh *result = CDDM_new(num_verts, 0, 0, num_loops, num_polys);
+ DerivedMesh *result = CDDM_new(num_verts, num_edges, 0, num_loops, num_polys);
mverts = CDDM_get_verts(result);
mloops = CDDM_get_loops(result);
mpolys = CDDM_get_polys(result);
+ if (num_edges > 0) {
+ medges = CDDM_get_edges(result);
+ }
+
if (doCustomData && shard_count > 0) {
Shard *s;
if (fmd->shards_to_islands) {
@@ -1869,7 +1884,7 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
}
}
- vertstart = polystart = loopstart = 0;
+ vertstart = polystart = loopstart = edgestart = 0;
if (fmd->shards_to_islands) {
shardlist = &fmd->islandShards;
}
@@ -1881,6 +1896,7 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
{
MPoly *mp;
MLoop *ml;
+ MEdge *me;
int i;
memcpy(mverts + vertstart, shard->mvert, shard->totvert * sizeof(MVert));
@@ -1908,6 +1924,17 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
for (i = 0, ml = mloops + loopstart; i < shard->totloop; ++i, ++ml) {
/* adjust vertex index */
ml->v += vertstart;
+ ml->e += edgestart;
+ }
+
+ if (num_edges > 0) {
+ memcpy(medges + edgestart, shard->medge, shard->totedge * sizeof(MEdge));
+
+ for (i = 0, me = medges + edgestart; i < shard->totedge; ++i, ++me) {
+ /* adjust vertex indices */
+ me->v1 += vertstart;
+ me->v2 += vertstart;
+ }
}
if (doCustomData) {
@@ -1927,6 +1954,7 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
vertstart += shard->totvert;
polystart += shard->totpoly;
loopstart += shard->totloop;
+ edgestart += shard->totedge;
}
return result;
@@ -1936,16 +1964,17 @@ static DerivedMesh* do_create(FractureModifierData *fmd, int num_verts, int num_
static DerivedMesh *create_dm(FractureModifierData *fmd, bool doCustomData)
{
Shard *s;
- int num_verts, num_polys, num_loops;
+ int num_verts, num_polys, num_loops, num_edges;
DerivedMesh *result;
- num_verts = num_polys = num_loops = 0;
+ num_verts = num_polys = num_loops = num_edges = 0;
if (fmd->shards_to_islands) {
for (s = fmd->islandShards.first; s; s = s->next) {
num_verts += s->totvert;
num_polys += s->totpoly;
num_loops += s->totloop;
+ num_edges += s->totedge;
}
}
else {
@@ -1957,13 +1986,16 @@ static DerivedMesh *create_dm(FractureModifierData *fmd, bool doCustomData)
num_verts += s->totvert;
num_polys += s->totpoly;
num_loops += s->totloop;
+ num_edges += s->totedge;
}
}
- result = do_create(fmd, num_verts, num_loops, num_polys, doCustomData);
+ result = do_create(fmd, num_verts, num_loops, num_polys, num_edges, doCustomData);
- CustomData_free(&result->edgeData, 0);
- CDDM_calc_edges(result);
+ if (num_edges == 0) {
+ CustomData_free(&result->edgeData, 0);
+ CDDM_calc_edges(result);
+ }
do_marking(fmd, result);
@@ -2005,7 +2037,7 @@ DerivedMesh *BKE_shard_create_dm(Shard *s, bool doCustomData)
MLoop *mloops;
MPoly *mpolys;
- dm = CDDM_new(s->totvert, 0, 0, s->totloop, s->totpoly);
+ dm = CDDM_new(s->totvert, s->totedge, 0, s->totloop, s->totpoly);
mverts = CDDM_get_verts(dm);
mloops = CDDM_get_loops(dm);
@@ -2015,8 +2047,14 @@ DerivedMesh *BKE_shard_create_dm(Shard *s, bool doCustomData)
memcpy(mloops, s->mloop, s->totloop * sizeof(MLoop));
memcpy(mpolys, s->mpoly, s->totpoly * sizeof(MPoly));
- CustomData_free(&dm->edgeData, 0);
- CDDM_calc_edges(dm);
+ if (s->totedge > 0) {
+ MEdge *medges = CDDM_get_edges(dm);
+ memcpy(medges, s->medge, s->totedge * sizeof(MEdge));
+ }
+ else {
+ CustomData_free(&dm->edgeData, 0);
+ CDDM_calc_edges(dm);
+ }
dm->dirty |= DM_DIRTY_NORMALS;
CDDM_calc_normals_mapping(dm);
@@ -2410,10 +2448,11 @@ static Shard* fracture_object_to_shard( Object *own, Object* target)
MVert* mvert, *mv;
MPoly* mpoly;
MLoop* mloop;
+ MEdge* medge;
SpaceTransform trans;
float mat[4][4], size[3] = {1.0f, 1.0f, 1.0f};
- int totvert, totpoly, totloop, v;
+ int totvert, totpoly, totloop, totedge, v;
bool do_free = false;
dm = target->derivedFinal;
@@ -2431,12 +2470,14 @@ static Shard* fracture_object_to_shard( O
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list