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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to