Commit: a051a76c8a025b5096efb7ce200506df63cef0e9
Author: Martin Felke
Date:   Sun Jun 7 21:21:06 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rBa051a76c8a025b5096efb7ce200506df63cef0e9

attempt to add a cut by objects / geometry (other FM) option as well as 
properly resetting shards after fracture parameter change (the latter didnt 
work properly)

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

M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/makesdna/DNA_modifier_types.h
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 4b4ae6a..3f19d29 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -85,7 +85,8 @@ 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);
+                                  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);
 
 /* 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 f1fd9c7..80188a6 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -742,7 +742,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)
+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)
 {
        /*Parse voronoi raw data*/
        int i = 0, j = 0, count = 0;
@@ -775,7 +775,18 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
                return;
        }
 
-       if (mode == MOD_FRACTURE_PREFRACTURED)
+       if (reset)
+       {
+               while (fm->shard_map.first)
+               {
+                       Shard *t = fm->shard_map.first;
+                       BLI_remlink_safe(&fm->shard_map, t);
+                       printf("Resetting shard: %d\n", t->shard_id);
+                       BKE_shard_free(t, true);
+               }
+       }
+
+       if (mode == MOD_FRACTURE_PREFRACTURED && !reset)
        {
                //rebuild tree
                if (!fm->last_shard_tree && (fm->shard_count > 0) && mode == 
MOD_FRACTURE_PREFRACTURED)
@@ -1173,7 +1184,7 @@ static void do_intersect(FractureModifierData *fmd, 
Object* ob, Shard *t, short
                s = BKE_fracture_shard_boolean(ob, *dm_parent, t, 
inner_mat_index, 0, 0.0f, NULL, NULL, 0.0f, false, 0);
        }
 
-       printf("Fractured: %d\n", k);
+       //printf("Fractured: %d\n", k);
 
        if (s != NULL) {
                add_shard(fmd->frac_mesh, s, mat);
@@ -1234,7 +1245,8 @@ static void intersect_shards_by_dm(FractureModifierData 
*fmd, DerivedMesh *d, Ob
        count = fmd->frac_mesh->shard_count;
 
        /*TODO, pass modifier mesh here !!! */
-       if (count == 0 || !keep_other_shard) {
+       if (count == 0 && keep_other_shard) {
+
                if (ob->derivedFinal != NULL) {
                        dm_parent = CDDM_copy(ob->derivedFinal);
                }
@@ -1259,11 +1271,16 @@ static void intersect_shards_by_dm(FractureModifierData 
*fmd, DerivedMesh *d, Ob
 
                if (cnt > 0)
                {
-                       /*clean up old entries here to avoid unnecessary 
shards*/
-                       Shard *first = fmd->frac_mesh->shard_map.first;
-                       BLI_remlink_safe(&fmd->frac_mesh->shard_map,first);
-                       BKE_shard_free(first, true);
-                       first = NULL;
+                       if (keep_other_shard)
+                       {
+                               /*clean up old entries here to avoid 
unnecessary shards*/
+                               Shard *first = fmd->frac_mesh->shard_map.first;
+                               
BLI_remlink_safe(&fmd->frac_mesh->shard_map,first);
+                               BKE_shard_free(first, true);
+                               first = NULL;
+                       }
+
+                       /* keep asynchronous by intent, to keep track of 
original shard count */
                        fmd->frac_mesh->shard_count--;
                }
        }
@@ -1346,7 +1363,7 @@ void BKE_fracture_shard_by_planes(FractureModifierData 
*fmd, Object *obj, short
                                                int totvert = 
dm->getNumVerts(dm);
                                                int i = 0;
 
-                                               printf("Cutting with %s, island 
%d...\n", ob->id.name, j);
+                                               //printf("Cutting with %s, 
island %d...\n", ob->id.name, j);
                                                for (i = 0, v = mv; i < 
totvert; i++, v++)
                                                {
                                                        add_v3_v3(v->co, 
mi->centroid);
@@ -1359,6 +1376,20 @@ void BKE_fracture_shard_by_planes(FractureModifierData 
*fmd, Object *obj, short
                                                dm = NULL;
                                                j++;
                                        }
+
+                                       /*now delete first shards, those are 
the old ones */
+                                       while (fmd->frac_mesh->shard_count > 0)
+                                       {
+                                               /*clean up old entries here to 
avoid unnecessary shards*/
+                                               Shard *first = 
fmd->frac_mesh->shard_map.first;
+                                               
BLI_remlink_safe(&fmd->frac_mesh->shard_map,first);
+                                               BKE_shard_free(first, true);
+                                               first = NULL;
+                                               fmd->frac_mesh->shard_count--;
+                                       }
+
+                                       /* re-synchronize counts, was possibly 
different before */
+                                       fmd->frac_mesh->shard_count = 
BLI_listbase_count(&fmd->frac_mesh->shard_map);
                                }
                                else
                                {
@@ -1384,7 +1415,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) {
+                                  inner_material_index, float mat[4][4], int 
num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset) {
        int n_size = 8;
        
        Shard *shard;
@@ -1445,7 +1476,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);
+                   num_cuts, fractal, smooth, num_levels, mode, reset);
 
        /*Free structs in C++ area of memory */
        cells_free(voro_cells, pointcloud->totpoints);
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index 7bf21c8..55299f5 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1564,6 +1564,7 @@ typedef struct FractureModifierData {
        int refresh;
        int refresh_constraints;
        int refresh_autohide;
+       int reset_shards;
 
        int use_constraints;
        int use_mass_dependent_thresholds;
@@ -1593,7 +1594,7 @@ typedef struct FractureModifierData {
        float max_vol;
        int last_frame;
 
-       char pad[4];
+       //char pad[4];
 } FractureModifierData;
 
 typedef struct DataTransferModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c 
b/source/blender/makesrna/intern/rna_modifier.c
index b404902..3e0a52c 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -787,6 +787,7 @@ static void 
rna_FractureModifier_thresh_defgrp_name_set(PointerRNA *ptr, const c
        FractureModifierData *tmd = (FractureModifierData *)ptr->data;
        rna_object_vgroup_name_set(ptr, value, tmd->thresh_defgrp_name, 
sizeof(tmd->thresh_defgrp_name));
        tmd->refresh_constraints = true;
+       tmd->reset_shards = true;
 }
 
 static void rna_FractureModifier_ground_defgrp_name_set(PointerRNA *ptr, const 
char *value)
@@ -794,6 +795,7 @@ static void 
rna_FractureModifier_ground_defgrp_name_set(PointerRNA *ptr, const c
        FractureModifierData *tmd = (FractureModifierData *)ptr->data;
        rna_object_vgroup_name_set(ptr, value, tmd->ground_defgrp_name, 
sizeof(tmd->ground_defgrp_name));
        tmd->refresh_constraints = true;
+       tmd->reset_shards = true;
 }
 
 static void rna_FractureModifier_inner_defgrp_name_set(PointerRNA *ptr, const 
char *value)
@@ -801,6 +803,7 @@ static void 
rna_FractureModifier_inner_defgrp_name_set(PointerRNA *ptr, const ch
        FractureModifierData *tmd = (FractureModifierData *)ptr->data;
        rna_object_vgroup_name_set(ptr, value, tmd->inner_defgrp_name, 
sizeof(tmd->inner_defgrp_name));
        tmd->refresh_constraints = true;
+       tmd->reset_shards = true;
 }
 
 static void rna_RigidBodyModifier_threshold_set(PointerRNA *ptr, float value)
@@ -942,6 +945,157 @@ static void 
rna_FractureModifier_constraint_target_set(PointerRNA* ptr, int valu
        rmd->refresh_constraints = true;
 }
 
+static void rna_FractureModifier_frac_algorithm_set(PointerRNA* ptr, int value)
+{
+       FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+       rmd->frac_algorithm = value;
+       rmd->reset_shards = true;
+}
+
+static void rna_FractureModifier_point_source_set(PointerRNA* ptr, int value)
+{
+       FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+       rmd->point_source = value;
+       printf("PointSource\n");
+       rmd->reset_shards = true;
+}
+
+static void rna_FractureModifier_point_seed_set(PointerRNA* ptr, int value)
+{
+       FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+       rmd->point_seed = value;
+       rmd->reset_shards = true;
+}
+
+static void rna_FractureModifier_percentage_set(PointerRNA* ptr, int value)
+{
+       FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+       rmd->percentage = value;
+       rmd->reset_shards = true;
+}
+
+
+static void rna_FractureModifier_extra_group_set(PointerRNA* ptr, PointerRNA 
value)
+{
+       FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+       rmd->extra_group = value.data;
+       rmd->reset_shards = true;
+}
+
+static void rna_FractureModifier_shards_to_islands_set(PointerRNA* ptr, int 
value)
+{
+       FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+       rmd->shards_to_islands = value;
+       rmd->reset_shards = true;
+}
+
+static void rna_FractureModifier_fix_normals_set(PointerRNA* ptr, int value)
+{
+       FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+       rmd->fix_normals = value;
+       rmd->reset_shards = true;
+}
+
+static void rna_FractureModifier_inner_material_set(PointerRNA* ptr, 
PointerRNA value)
+{
+       FractureModifierData *rmd = (FractureModifierData*)ptr->data;
+       rmd->inner_material = value.data;
+       rmd->reset_shards = true;
+}
+
+static vo

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