Commit: 962480865a2adbfe26e549e5291be0f399e62339
Author: Martin Felke
Date:   Sun Oct 18 11:25:52 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB962480865a2adbfe26e549e5291be0f399e62339

fracturing multiple settings seems to work (again) but todo: splinters, 
multiple islands / setting, constraints

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

M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/makesrna/intern/rna_modifier.c
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 b2d8b27..17c3e92 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 active_setting);
+                                  int num_cuts, float fractal, bool smooth, 
int num_levels, int mode, bool reset, int active_setting, int num_settings);
 
 /* 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 3ebe3c8..07e346b 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -615,7 +615,8 @@ 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, int active_setting)
+                             DerivedMesh **dm_parent, BMesh** bm_parent, Shard 
***tempshards, Shard ***tempresults,
+                             int active_setting, int num_settings)
 {
        int i;
        Shard *s = NULL;
@@ -708,15 +709,20 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, 
int expected_shards, int
        //skipping /deletion pass
        for (i = 0; i < expected_shards; i++)
        {
+               Shard *t = NULL;
                if (fm->cancel == 1) {
                        break;
                }
 
-               if (skipmap[i])
+               if (fm->last_shards && i < fm->shard_count)
+                       t = fm->last_shards[i];
+
+               if (skipmap[i] /*&& ((t &&
+                   t->setting_id == active_setting &&
+                   t->shard_id > num_settings) || !t)*/)
                {
                        printf("Skipping shard: %d\n", i);
                        (*tempshards)[i] = NULL;
-                       (*tempresults)[i] = NULL;
                }
                else
                {
@@ -726,6 +732,7 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int 
expected_shards, int
                }
 
                (*tempresults)[i] = NULL;
+
                fm->progress_counter++;
        }
 
@@ -738,11 +745,11 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, 
int expected_shards, int
                        if (!t)
                                continue;
 
-                       if (/*t->parent_id == p->shard_id ||*/ t->setting_id == 
active_setting)
+                       if (t->setting_id == active_setting /*|| t->shard_id < 
num_settings*/)
                        {
                                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);
+                               BKE_shard_free(t, false);
                                fm->last_shards[i] = NULL;
                        }
                        else
@@ -762,7 +769,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, int active_setting)
+                        bool reset, int active_setting, int num_settings)
 {
        /*Parse voronoi raw data*/
        int i = 0, j = 0, count = 0;
@@ -874,7 +881,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, active_setting);
+       do_prepare_cells(fm, cells, expected_shards, algorithm, p, &centroid, 
&dm_parent, &bm_parent, &tempshards, &tempresults, active_setting, 
num_settings);
 
        if (fm->last_shard_tree)
        {
@@ -944,10 +951,10 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
        //keep empty ids... need to catch this later
        if (mode == MOD_FRACTURE_DYNAMIC || active_setting > -1)
        {
-               j = 0;
+               j = 1;
 
-               if (mode == MOD_FRACTURE_DYNAMIC)
-                       j = 1;
+               //if (mode == MOD_FRACTURE_DYNAMIC)
+               //      j = 1;
 
                if (fm->shard_map.last)
                {
@@ -982,7 +989,7 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
                        }
                }
 
-               if (t != NULL) {
+               if (t != NULL && t != s) {
                        BKE_shard_free(t, false);
                }
        }
@@ -1476,7 +1483,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, int active_setting)
+                                  bool reset, int active_setting, int 
num_settings)
 {
        int n_size = 8;
        
@@ -1495,7 +1502,7 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, 
ShardID id, FracPointCloud *p
 #endif
        
        shard = BKE_shard_by_id(fmesh, id, dm);
-       if (!shard || shard->flag & SHARD_FRACTURED) {
+       if (!shard || (shard->flag & SHARD_FRACTURED && (mode == 
MOD_FRACTURE_DYNAMIC))) {
                if (id == 0)
                {
                        //fallback to entire mesh
@@ -1547,7 +1554,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, 
active_setting);
+                   num_cuts, fractal, smooth, num_levels, mode, reset, 
active_setting, num_settings);
 
        /*Free structs in C++ area of memory */
        cells_free(voro_cells, pointcloud->totpoints);
diff --git a/source/blender/makesrna/intern/rna_modifier.c 
b/source/blender/makesrna/intern/rna_modifier.c
index 635442c..173de5a 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -482,7 +482,6 @@ static void rna_Modifier_update_and_keep(Main 
*UNUSED(bmain), Scene *UNUSED(scen
 
 static void rna_Modifier_update_index(Main *UNUSED(bmain), Scene 
*UNUSED(scene), PointerRNA *ptr)
 {
-       FractureModifierData *fmd = NULL;
        ModifierData* md = ptr->data;
 
        if (md && md->type == eModifierType_Fracture)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index b443c82..c4582d3 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1139,13 +1139,6 @@ static Shard* do_splinters(FractureModifierData *fmd, 
FracPointCloud points, flo
 
        unit_m4(*mat);
 
-       /* copy location to matrix */
-       if (s) {
-               (*mat)[3][0] = s->centroid[0];
-               (*mat)[3][1] = s->centroid[1];
-               (*mat)[3][2] = s->centroid[2];
-       }
-
        /*splinters... just global axises and a length, for rotation rotate the 
object */
        if (fmd->splinter_axis & MOD_FRACTURE_SPLINTER_X)
        {
@@ -1166,11 +1159,15 @@ static Shard* do_splinters(FractureModifierData *fmd, 
FracPointCloud points, flo
        {
                int i = 0, num_verts = 0;
                MVert* mvert = NULL, *mv;
-               invert_m4_m4(imat, *mat);
+
 
                if (s) {
                        mvert = s->mvert;
                        num_verts = s->totvert;
+                       /* copy location to matrix */
+                       /*(*mat)[3][0] = s->centroid[0];
+                       (*mat)[3][1] = s->centroid[1];
+                       (*mat)[3][2] = s->centroid[2];*/
                }
                else
                {
@@ -1178,6 +1175,8 @@ static Shard* do_splinters(FractureModifierData *fmd, 
FracPointCloud points, flo
                        num_verts = dm->getNumVerts(dm);
                }
 
+               invert_m4_m4(imat, *mat);
+
                for (i = 0; i < points.totpoints; i++)
                {
                        mul_m4_v3(imat, points.points[i].co);
@@ -1290,6 +1289,7 @@ static void do_fracture(FractureModifierData *fmd, 
ShardID id, Object *obj, Deri
 {
        /* dummy point cloud, random */
        FracPointCloud points;
+       int num_settings = BLI_listbase_count(&fmd->fracture_settings);
 
        points = get_points_global(fmd, obj, dm, id);
 
@@ -1308,7 +1308,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->active_setting);
+                                                    fmd->fracture_mode, 
fmd->reset_shards, fmd->active_setting, num_settings);
                }
 
                /*TODO, limit this to settings shards !*/
@@ -1337,7 +1337,8 @@ static void do_fracture(FractureModifierData *fmd, 
ShardID id, Object *obj, Deri
                BKE_fracture_create_dm(fmd, true);
                fmd->shards_to_islands = temp;
 
-               cleanup_splinters(fmd, mat, s, dm);
+               if (!s)
+                       cleanup_splinters(fmd, mat, s, dm);
                fmd->reset_shards = false;
        }
        MEM_freeN(points.points);
@@ -4012,6 +4013,7 @@ static void do_prehalving(FractureModifierData *fmd, 
Object* ob, DerivedMesh* de
        bool shards_to_islands = fmd->shards_to_islands;
        Shard *s, *next = NULL;
        int num_settings = BLI_listbase_count(&fmd->fracture_settings);
+       bool check = check_first_shards(fmd);
 
        if (fmd->visible_mesh != NULL) {
                BM_mesh_free(fmd->visible_mesh);
@@ -4047,7 +4049,7 @@ static void do_prehalving(FractureModifierData *fmd, 
Object* ob, DerivedMesh* de
                        t->setting_id = -1;
                }
 
-               if (((t->setting_id == fmd->active_setting) && fmd->refresh) || 
(!fmd->refresh))
+               if (((t->setting_id == fmd->active_setting) && fmd->refresh && 
!check) || (!fmd->refresh))
                {
                        BLI_addtail(&fmd->frac_mesh->shard_map, t);
                        printf("Adding shard: %d %d \n", t->shard_id, 
t->setting_id);
@@ -4055,7 +4057,7 @@ static void do_prehalving(FractureModifierData *fmd, 

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