[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