Commit: 1eabe30d34429ac45259f2cabd1ad2930265cfbd
Author: Martin Felke
Date:   Sat Nov 26 11:47:10 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB1eabe30d34429ac45259f2cabd1ad2930265cfbd

stability fix for dynamic fractal, use triangulated cutter planes now and 
ensure they go through the shard's centroid

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

M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/fracture_util.c

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

diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index ddbf4f3..7958c44 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -546,13 +546,14 @@ static void handle_fast_bisect(FracMesh *fm, int 
expected_shards, int algorithm,
        }
 }
 
-static void handle_boolean_fractal(Shard* s, Shard* t, int expected_shards, 
DerivedMesh* dm_parent, Object *obj, short inner_material_index,
+static void handle_boolean_fractal(Shard* p, Shard* t, int expected_shards, 
DerivedMesh* dm_parent, Object *obj, short inner_material_index,
                                    int num_cuts, float fractal, int 
num_levels, bool smooth,int parent_id, int* i, Shard ***tempresults,
                                    DerivedMesh **dm_p, char uv_layer[64], int 
solver, int thresh)
 {
        /* physics shard and fractalized shard, so we need to booleanize twice 
*/
        /* and we need both halves, so twice again */
        Shard *s2 = NULL;
+       Shard *s = NULL;
        int index = 0;
        int max_retries = 3;
 
@@ -574,9 +575,10 @@ static void handle_boolean_fractal(Shard* s, Shard* t, int 
expected_shards, Deri
                BKE_object_dimensions_get(obj, size);
                radius = MAX3(size[0], size[1], size[2]);
 
-               loc[0] = (BLI_frand() - 0.5f) * size[0];
+               /*loc[0] = (BLI_frand() - 0.5f) * size[0];
                loc[1] = (BLI_frand() - 0.5f) * size[1];
-               loc[2] = (BLI_frand() - 0.5f) * size[2];
+               loc[2] = (BLI_frand() - 0.5f) * size[2];*/
+               copy_v3_v3(loc, p->centroid);
 
                eul[0] = BLI_frand() * M_PI;
                eul[1] = BLI_frand() * M_PI;
@@ -642,7 +644,7 @@ static void handle_boolean_fractal(Shard* s, Shard* t, int 
expected_shards, Deri
 static bool handle_boolean_bisect(FracMesh *fm, Object *obj, int 
expected_shards, int algorithm, int parent_id, Shard **tempshards,
                                   DerivedMesh *dm_parent, BMesh* bm_parent, 
float obmat[4][4], short inner_material_index, int num_cuts,
                                   int num_levels, float fractal, int *i, bool 
smooth, Shard*** tempresults, DerivedMesh **dm_p, char uv_layer[64],
-                                  KDTree *preselect_tree, int solver, int 
thresh)
+                                  KDTree *preselect_tree, int solver, int 
thresh, Shard* p)
 {
        Shard *s = NULL, *t = NULL;
        if (fm->cancel == 1)
@@ -667,7 +669,7 @@ static bool handle_boolean_bisect(FracMesh *fm, Object 
*obj, int expected_shards
                s = BKE_fracture_shard_boolean(obj, dm_parent, t, 
inner_material_index, 0, 0.0f, NULL, NULL, 0.0f, false, 0, uv_layer, solver, 
thresh);
        }
        else if (algorithm == MOD_FRACTURE_BOOLEAN_FRACTAL) {
-               handle_boolean_fractal(s, t, expected_shards, dm_parent, obj, 
inner_material_index, num_cuts, fractal,
+               handle_boolean_fractal(p, t, expected_shards, dm_parent, obj, 
inner_material_index, num_cuts, fractal,
                                       num_levels, smooth, parent_id, i, 
tempresults, dm_p, uv_layer, solver, thresh);
        }
        else if (algorithm == MOD_FRACTURE_BISECT || algorithm == 
MOD_FRACTURE_BISECT_FILL) {
@@ -977,14 +979,14 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
                        for (i = 0; i < expected_shards; i++)   {
                                handle_boolean_bisect(fm, obj, expected_shards, 
algorithm, parent_id, tempshards, dm_parent,
                                                                                
bm_parent, obmat, inner_material_index, num_cuts, num_levels, fractal,
-                                                                               
&i, smooth, &tempresults, &dm_p, uv_layer, preselect_tree, solver, thresh);
+                                                                               
&i, smooth, &tempresults, &dm_p, uv_layer, preselect_tree, solver, thresh, p);
                        }
                }
                else {
                        for (i = 0; i < expected_shards; i++)   {
                                handle_boolean_bisect(fm, obj, expected_shards, 
algorithm, parent_id, tempshards, dm_parent,
                                                                                
bm_parent, obmat, inner_material_index, num_cuts, num_levels, fractal,
-                                                                               
&i, smooth, &tempresults, &dm_p, uv_layer, preselect_tree, solver, thresh);
+                                                                               
&i, smooth, &tempresults, &dm_p, uv_layer, preselect_tree, solver, thresh, p);
                        }
                }
 
diff --git a/source/blender/blenkernel/intern/fracture_util.c 
b/source/blender/blenkernel/intern/fracture_util.c
index a10ce88..1872207 100644
--- a/source/blender/blenkernel/intern/fracture_util.c
+++ b/source/blender/blenkernel/intern/fracture_util.c
@@ -415,7 +415,7 @@ static DerivedMesh* do_fractal(float radius, float 
mat[4][4], bool use_smooth_in
        bm = BM_mesh_create(&bm_mesh_allocsize_default,  &((struct 
BMeshCreateParams){.use_toolflags = true,}));
        BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
                "create_grid x_segments=%i y_segments=%i size=%f matrix=%m4",
-               1, 1, radius*1.4, mat);
+               1, 1, radius*1.4f, mat);
 
        /*subdivide the plane fractally*/
        for (i = 0; i < num_levels; i++)
@@ -439,6 +439,9 @@ static DerivedMesh* do_fractal(float radius, float 
mat[4][4], bool use_smooth_in
        }
 
        BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
+               "triangulate faces=af quad_method=%i ngon_method=%i", 
MOD_TRIANGULATE_QUAD_BEAUTY, MOD_TRIANGULATE_NGON_BEAUTY);
+
+       BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
                "recalc_face_normals faces=af");
 
        BM_ITER_MESH(f, &iter, bm, BM_FACES_OF_MESH)

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

Reply via email to