[Bf-blender-cvs] [d8f5a81] fracture_modifier: some tweaks for the faster voronoi+bisect method, its faster but not interactive yet... but should mostly lead to correct results

Martin Felke noreply at git.blender.org
Sat Jul 9 13:44:01 CEST 2016


Commit: d8f5a81a9a453335b7ac19937db35956a41ca5b5
Author: Martin Felke
Date:   Sat Jul 9 13:43:36 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBd8f5a81a9a453335b7ac19937db35956a41ca5b5

some tweaks for the faster voronoi+bisect method, its faster but not interactive yet... but should mostly lead to correct results

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

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 6d67f3d..168bed6 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -660,15 +660,8 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
 
 	if (fm->last_shard_tree)
 	{
-		/*if (expected_shards <= fm->last_expected_shards)
-		{
-
-		}
-		else*/
-		{
-			copy_vn_i(deletemap, fm->shard_count, 1);
-			copy_vn_i(skipmap, expected_shards, 1);
-		}
+		copy_vn_i(deletemap, fm->shard_count, 1);
+		copy_vn_i(skipmap, expected_shards, 1);
 
 		for (i = 0; i < expected_shards; i++)
 		{
@@ -693,26 +686,21 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
 			{
 				float epsilon = 0.00001;
 				Shard *t = fm->last_shards[j];
-				//float dist = len_squared_v3v3(n.co, cells[i].centroid);
 				if (t != NULL && n.dist < max)
 				{
 					if (n.dist < epsilon) {
 						if ((fabsf(cells[i].volume - t->raw_volume) < epsilon))
 						{
-							//printf("Tagging skip: %d\n", i);
-							//skipmap[i] = true;
 							deletemap[j] = false;
 						}
 						else
 						{
-							//deletemap[j] = true;
 							skipmap[i] = false;
 						}
 					}
 					else
 					{
 						skipmap[i] = false;
-						//deletemap[j] = true;
 					}
 				}
 				else
diff --git a/source/blender/blenkernel/intern/fracture_util.c b/source/blender/blenkernel/intern/fracture_util.c
index fd2e157..430a1db 100644
--- a/source/blender/blenkernel/intern/fracture_util.c
+++ b/source/blender/blenkernel/intern/fracture_util.c
@@ -789,17 +789,44 @@ static void do_bisect(BMesh* bm_parent, BMesh* bm_child, float obmat[4][4], bool
 	}
 }
 
-BMesh *do_preselection(BMesh* bm_orig, Shard *child, KDTree *preselect_tree)
+static void walk_bmesh(BMesh *bm, BMVert *seed) {
+
+	BMWalker walker;
+	BMEdge *e;
+
+	/* Walk from the single vertex, selecting everything connected
+	 * to it */
+	BMW_init(&walker, bm, BMW_VERT_SHELL,
+	         BMW_MASK_NOP, BMW_MASK_NOP, BMW_MASK_NOP,
+	         BMW_FLAG_NOP,
+	         BMW_NIL_LAY);
+
+	e = BMW_begin(&walker, seed);
+	for (; e; e = BMW_step(&walker)) {
+		if (!BM_elem_flag_test(e->v1, BM_ELEM_TAG) &&
+		   (!BM_elem_flag_test(e->v2, BM_ELEM_TAG)))
+		{
+			break;
+		}
+
+		if (BM_elem_flag_test(e->v1, BM_ELEM_TAG)) {
+			BM_elem_flag_enable(e->v2, BM_ELEM_INTERNAL_TAG);
+		}
+
+		if (BM_elem_flag_test(e->v2, BM_ELEM_TAG)) {
+			BM_elem_flag_enable(e->v1, BM_ELEM_INTERNAL_TAG);
+		}
+	}
+	BMW_end(&walker);
+}
+
+static BMesh *do_preselection(BMesh* bm_orig, Shard *child, KDTree *preselect_tree)
 {
 	int i = 0, r = 0;
 	float max_dist = 0;
-	KDTreeNearest* n, *n2;
+	KDTreeNearest* n = NULL;
 	BMesh *bm_new = BM_mesh_create(&bm_mesh_allocsize_default);
-	BMWalker walker;
-	BMEdge *e;
-	BMVert *seed = NULL;
 
-	n2 = MEM_mallocN(sizeof(KDTreeNearest) * child->totvert, "n2 kdtreenearest");
 	n = MEM_mallocN(sizeof(KDTreeNearest) * bm_orig->totvert, "n kdtreenearest");
 
 	BM_mesh_elem_toolflags_ensure(bm_new);  /* needed for 'duplicate' bmo */
@@ -824,53 +851,31 @@ BMesh *do_preselection(BMesh* bm_orig, Shard *child, KDTree *preselect_tree)
 
 	max_dist = sqrt(max_dist);
 
-	BM_mesh_elem_hflag_disable_all(bm_orig, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
+	BM_mesh_elem_hflag_disable_all(bm_orig, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG | BM_ELEM_INTERNAL_TAG, false);
 
 	//do a range search first in case we have many verts as in dense geometry
-	r = BLI_kdtree_range_search(preselect_tree, child->raw_centroid, &n, max_dist * 2);
+	r = BLI_kdtree_range_search(preselect_tree, child->raw_centroid, &n, max_dist * 2.0f);
 
-	//if we have sparse geometry, do a nearest n search as fallback (if we do have too little verts)
-	if (r < child->totvert) {
-		r = BLI_kdtree_find_nearest_n(preselect_tree, child->raw_centroid, n2, child->totvert);
-		for (i = 0; i < r; i++) {
-			int index = n2[i].index;
-			BMVert *v = BM_vert_at_index(bm_orig, index);
-			BM_elem_flag_enable(v, BM_ELEM_TAG);
-		}
-		seed = BM_vert_at_index(bm_orig, n2[0].index);
-		MEM_freeN(n2);
-		n2 = NULL;
+	//if we have sparse geometry, just return all
+	if (r < 750) {
+
+		BM_mesh_free(bm_new);
+		return BM_mesh_copy(bm_orig);
 	}
 	else {
+		BMVert *v = NULL;
 		for (i = 0; i < r; i++) {
 			int index = n[i].index;
-			BMVert *v = BM_vert_at_index(bm_orig, index);
+			v = BM_vert_at_index(bm_orig, index);
 			BM_elem_flag_enable(v, BM_ELEM_TAG);
+			walk_bmesh(bm_orig, v);
 		}
 
-		seed = BM_vert_at_index(bm_orig, n[0].index);
+		BM_mesh_elem_hflag_enable_test(bm_orig, BM_VERT, BM_ELEM_TAG, true, false, BM_ELEM_INTERNAL_TAG);
 		MEM_freeN(n);
 		n = NULL;
 	}
 
-	/* Walk from the single vertex, selecting everything connected
-	 * to it */
-	BMW_init(&walker, bm_orig, BMW_VERT_SHELL,
-	         BMW_MASK_NOP, BMW_MASK_NOP, BMW_MASK_NOP,
-	         BMW_FLAG_NOP,
-	         BMW_NIL_LAY);
-
-	e = BMW_begin(&walker, seed);
-	for (; e; e = BMW_step(&walker)) {
-		//only find tagged data
-		if ((!BM_elem_flag_test(e->v1, BM_ELEM_TAG)) &&
-			(!BM_elem_flag_test(e->v2, BM_ELEM_TAG)))
-		{
-			break;
-		}
-	}
-	BMW_end(&walker);
-
 	/* Flush the selection to get edge/face selections matching
 	 * the vertex selection */
 	BKE_bm_mesh_hflag_flush_vert(bm_orig, BM_ELEM_TAG);




More information about the Bf-blender-cvs mailing list