Commit: 4a2dad0f8d53b99b0c48f2796b841aa8f911c5fd
Author: Martin Felke
Date:   Sat Oct 17 15:28:21 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB4a2dad0f8d53b99b0c48f2796b841aa8f911c5fd

multiple fracturing settings seem to work, but tested with 1 file only for 
now...

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

M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenloader/intern/readfile.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 418b583..b2d8b27 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -87,7 +87,7 @@ struct DerivedMesh *BKE_shard_create_dm(struct Shard *s, bool 
doCustomData);
 /* create shards from base mesh and a list of points */
 void BKE_fracture_shard_by_points(struct FracMesh *fmesh, ShardID id, struct 
FracPointCloud *points, int algorithm,
                                   struct Object *obj, struct DerivedMesh *dm, 
short inner_material_index, float mat[4][4],
-                                  int num_cuts, float fractal, bool smooth, 
int num_levels, int mode, bool reset);
+                                  int num_cuts, float fractal, bool smooth, 
int num_levels, int mode, bool reset, int active_setting);
 
 /* create shards from a base mesh and a set of other objects / cutter planes */
 void BKE_fracture_shard_by_planes(struct FractureModifierData *fmd, struct 
Object *obj, short inner_material_index, float mat[4][4]);
diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index 1b6a763..f0ff619 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -360,6 +360,9 @@ Shard *BKE_create_fracture_shard(MVert *mvert, MPoly 
*mpoly, MLoop *mloop, int t
        }
 
        shard->shard_id = -1;
+       shard->setting_id = -1;
+       shard->parent_id = -1;
+
        shard->flag = SHARD_INTACT;
        BKE_shard_calc_minmax(shard);
 
@@ -612,7 +615,7 @@ static bool handle_boolean_bisect(FracMesh *fm, Object 
*obj, int expected_shards
 }
 
 static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, 
int algorithm, Shard *p, float (*centroid)[3],
-                             DerivedMesh **dm_parent, BMesh** bm_parent, Shard 
***tempshards, Shard ***tempresults)
+                             DerivedMesh **dm_parent, BMesh** bm_parent, Shard 
***tempshards, Shard ***tempresults, int active_setting)
 {
        int i;
        Shard *s = NULL;
@@ -732,16 +735,19 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, 
int expected_shards, int
                {
                        Shard *t = fm->last_shards[i];
 
-                       if (t->parent_id == p->shard_id)
+                       if (!t)
+                               continue;
+
+                       if (/*t->parent_id == p->shard_id ||*/ t->setting_id == 
active_setting)
                        {
+                               printf("Deleting shard: %d %d %d\n", i, 
t->shard_id, t->setting_id);
                                BLI_remlink_safe(&fm->shard_map, t);
                                BKE_shard_free(t, true);
                                fm->last_shards[i] = NULL;
-                               printf("Deleting shard: %d\n", i);
                        }
                        else
                        {
-                               printf("NOT Deleting shard: %d\n", i);
+                               printf("NOT Deleting shard: %d %d %d\n", i, 
t->shard_id, t->setting_id);
                        }
                }
        }
@@ -756,7 +762,7 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int 
expected_shards, int
 /* parse the voro++ cell data */
 static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, 
FracMesh *fm, int algorithm, Object *obj, DerivedMesh *dm,
                         short inner_material_index, float mat[4][4], int 
num_cuts, float fractal, bool smooth, int num_levels, int mode,
-                        bool reset)
+                        bool reset, int active_setting)
 {
        /*Parse voronoi raw data*/
        int i = 0, j = 0, count = 0;
@@ -861,7 +867,7 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
 
        unit_m4(obmat);
 
-       do_prepare_cells(fm, cells, expected_shards, algorithm, p, &centroid, 
&dm_parent, &bm_parent, &tempshards, &tempresults);
+       do_prepare_cells(fm, cells, expected_shards, algorithm, p, &centroid, 
&dm_parent, &bm_parent, &tempshards, &tempresults, active_setting);
 
        if (fm->last_shard_tree)
        {
@@ -917,25 +923,29 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
                dm_p = NULL;
        }
 
-
        //if (p->shard_id == -2)
-       if (p && parent_id == -2)
+       if (p && (parent_id == -2 /*|| parent_id == -1*/))
        {
+               BLI_remlink_safe(&fm->shard_map, p);
                BKE_shard_free(p, true);
+               p = NULL;
        }
 
        fm->shard_count = 0; /* may be not matching with expected shards, so 
reset... did increment this for
                              *progressbar only */
 
        //keep empty ids... need to catch this later
-       if (mode == MOD_FRACTURE_DYNAMIC)
+       if (mode == MOD_FRACTURE_DYNAMIC || active_setting > -1)
        {
-               j = 1;
+               j = 0;
+
+               if (mode == MOD_FRACTURE_DYNAMIC)
+                       j = 1;
+
                if (fm->shard_map.last)
                {
                        j += ((Shard*)(fm->shard_map.last))->shard_id;
                }
-
        }
        else
        {
@@ -950,7 +960,8 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
                        add_shard(fm, s, mat);
                        s->shard_id += j+1;
                        s->parent_id = parent_id;
-                       //printf("ADDED: %d %d %d\n", i, j, s->shard_id);
+                       s->setting_id = active_setting;
+                       printf("ADDED: %d %d %d\n", i, j, s->shard_id);
                        if (parent_id > -1)
                        {
                                int i = 0;
@@ -1458,7 +1469,7 @@ void BKE_fracture_shard_by_planes(FractureModifierData 
*fmd, Object *obj, short
 
 void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud 
*pointcloud, int algorithm, Object *obj, DerivedMesh *dm, short
                                   inner_material_index, float mat[4][4], int 
num_cuts, float fractal, bool smooth, int num_levels, int mode,
-                                  bool reset)
+                                  bool reset, int active_setting)
 {
        int n_size = 8;
        
@@ -1529,7 +1540,7 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, 
ShardID id, FracPointCloud *p
 
        /*Evaluate result*/
        parse_cells(voro_cells, pointcloud->totpoints, id, fmesh, algorithm, 
obj, dm, inner_material_index, mat,
-                   num_cuts, fractal, smooth, num_levels, mode, reset);
+                   num_cuts, fractal, smooth, num_levels, mode, reset, 
active_setting);
 
        /*Free structs in C++ area of memory */
        cells_free(voro_cells, pointcloud->totpoints);
@@ -2043,6 +2054,9 @@ void BKE_fracture_store_settings(FractureModifierData 
*fs, FractureSetting *fmd)
        /*copy settings values to FM itself....*/
 
        /* vgroups  XXX TODO non ascii strings ?*/
+       if (!fmd || !fs)
+               return;
+
        strncpy(fmd->thresh_defgrp_name, fs->thresh_defgrp_name, 
strlen(fs->thresh_defgrp_name));
        strncpy(fmd->ground_defgrp_name, fs->ground_defgrp_name, 
strlen(fs->ground_defgrp_name));
        strncpy(fmd->inner_defgrp_name, fs->inner_defgrp_name, 
strlen(fs->inner_defgrp_name));
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index ed60793..45d087e 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4943,7 +4943,7 @@ static void load_fracture_modifier(FileData* fd, 
FractureModifierData *fmd, Obje
 
                fmd->fracture_settings.first = NULL;
                fmd->fracture_settings.last = NULL;
-               fmd->active_setting = 0;
+               fmd->active_setting = -1;
        }
        else
        {
diff --git a/source/blender/makesdna/DNA_fracture_types.h 
b/source/blender/makesdna/DNA_fracture_types.h
index 3292f35..76f341f 100644
--- a/source/blender/makesdna/DNA_fracture_types.h
+++ b/source/blender/makesdna/DNA_fracture_types.h
@@ -72,10 +72,11 @@ typedef struct Shard {
        int neighbor_count; /* counts of neighbor islands */
        int parent_id;      /* the shard from which this shard originates, we 
keep all shards in the shardmap */
        int flag;           /* flag for fracture state (INTACT, FRACTURED)*/
+       int setting_id;     /* to which setting this shard belongs, -1 for none 
or no settings available*/
        float raw_volume;
        float impact_loc[3]; /* last impact location on this shard */
        float impact_size[3]; /* size of impact area (simplified) */
-       char pad2[4];
+       //char pad2[4];
 } Shard;
 
 typedef struct FracMesh {
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 58ecb82..8d0a6a9 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -85,6 +85,7 @@
 
 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 FracMesh* copy_fracmesh(FracMesh* fm)
 {
@@ -99,18 +100,7 @@ static FracMesh* copy_fracmesh(FracMesh* fm)
 
        for (s = fm->shard_map.first; s; s = s->next)
        {
-               t = BKE_create_fracture_shard(s->mvert, s->mpoly, s->mloop, 
s->totvert, s->totpoly, s->totloop, true);
-               t->parent_id = s->parent_id;
-               t->shard_id = s->shard_id;
-
-               CustomData_reset(&t->vertData);
-               CustomData_reset(&t->loopData);
-               CustomData_reset(&t->polyData);
-
-               CustomData_add_layer(&t->vertData, CD_MDEFORMVERT, 
CD_DUPLICATE, CustomData_get_layer(&s->vertData, CD_MDEFORMVERT), s->totvert);
-               CustomData_add_layer(&t->loopData, CD_MLOOPUV, CD_DUPLICATE, 
CustomData_get_layer(&s->loopData, CD_MLOOPUV), s->totloop);
-               CustomData_add_layer(&t->polyData, CD_MTEXPOLY, CD_DUPLICATE, 
CustomData_get_layer(&s->polyData, CD_MTEXPOLY), s->totpoly);
-
+               t = copy_shard(s);
                BLI_addtail(&fmesh->shard_map, t);
                i++;
        }
@@ -214,6 +204,7 @@ static void initData(ModifierData *md)
        fmd->update_dynamic = false;
        fmd->limit_impact = false;
        fmd->reset_shards = false;
+       fmd->active_setting = -1;
 }
 
 static void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool 
remove_rigidbody)
@@ -1282,7 +1273,7 @@ static void do_fracture(FractureModifierData *fmd, 
ShardID id, Object *obj, Deri
                if (points.totpoints > 0) {
                        BKE_fracture_shard_by_points(fmd->frac_mesh, id, 
&points, fmd->frac_algorithm, obj, dm, mat_index, mat,
                                                     fmd->fractal_cuts, 
fmd->fractal_amount, fmd->use_smooth, fmd->fractal_iterations,
-                                                    fmd->fracture_mode, 
fmd->reset_shards);
+                                                    fmd->fracture_mode, 
fmd->reset_shards, fmd->active_setting);
                }
 
                /*TODO, limit this to settings shards !*/
@@ -1513,6 +1504,7 @@ static void do_shard_to_island(FractureModifierData *fmd, 
BMesh* bm_new)
                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->is

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to