[Bf-blender-cvs] [1eabe30] fracture_modifier: stability fix for dynamic fractal, use triangulated cutter planes now and ensure they go through the shard's centroid

Martin Felke noreply at git.blender.org
Sat Nov 26 11:47:33 CET 2016


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)




More information about the Bf-blender-cvs mailing list