[Bf-blender-cvs] [227a40e] bmesh-boolean-experiment: Improved starting point when calculating island joining paths
Campbell Barton
noreply at git.blender.org
Mon Dec 7 13:03:50 CET 2015
Commit: 227a40ebaec553fe3f24d7166708a309f7a04888
Author: Campbell Barton
Date: Mon Dec 7 22:54:09 2015 +1100
Branches: bmesh-boolean-experiment
https://developer.blender.org/rB227a40ebaec553fe3f24d7166708a309f7a04888
Improved starting point when calculating island joining paths
===================================================================
M source/blender/bmesh/tools/bmesh_intersect.c
===================================================================
diff --git a/source/blender/bmesh/tools/bmesh_intersect.c b/source/blender/bmesh/tools/bmesh_intersect.c
index 11e84a3..3ac6d6b 100644
--- a/source/blender/bmesh/tools/bmesh_intersect.c
+++ b/source/blender/bmesh/tools/bmesh_intersect.c
@@ -240,16 +240,21 @@ static bool bm_face_split_edgenet_prepare_holes(
LinkNode node;
unsigned int edge_len, vert_len;
} *group_base, **groups_arr = BLI_array_alloca(groups_arr, groups_len);
- KDTree *tree = BLI_kdtree_new(edge_arr_len * 2);
+ /* we don't know how many unique verts there are connecting the edges, so over-alloc */
BMVert **verts_arr = BLI_array_alloca(verts_arr, edge_arr_len * 2);
+ float (*verts_center)[3] = BLI_array_alloca(verts_center, edge_arr_len * 2);
unsigned int verts_len = 0;
+ KDTree *tree = BLI_kdtree_new(edge_arr_len * 2);
+
{
group_base = (void *)groups;
for (unsigned int i = 0; i < groups_len; i++, group_base = (void *)group_base->node.next) {
- /* fill the kdtree */
+ /* unrelated to the kdtree, but find the center at the same time */
+ zero_v3(verts_center[i]);
+ /* fill the kdtree */
LinkNode *g = group_base->node.link;
do {
BMEdge *e = g->link;
@@ -263,12 +268,16 @@ static bool bm_face_split_edgenet_prepare_holes(
BLI_kdtree_insert(tree, (int)verts_len, v_iter->co);
verts_arr[verts_len] = v_iter;
+ add_v3_v3(verts_center[i], v_iter->co);
+
verts_len++;
group_base->vert_len++;
}
}
} while ((g = g->next));
+ mul_v3_fl(verts_center[i], 1.0f / (float)group_base->vert_len);
+
groups_arr[i] = group_base;
}
}
@@ -287,18 +296,23 @@ static bool bm_face_split_edgenet_prepare_holes(
/* start-end of the verts in the current group */
unsigned int group_vert_range[2] = {0, groups_arr[0]->vert_len};
for (unsigned int group_index = 1; group_index < groups_len; group_index++) {
- BMVert *v_start;
- /* left most vert of left most edge */
- {
- BMEdge *e = groups_arr[group_index]->node.link;
- v_start = (dot_v3v3(f_ortho_dir, e->v1->co) <
- dot_v3v3(f_ortho_dir, e->v2->co)) ? e->v1 : e->v2;
- }
/* the range of verts this group uses in 'verts_arr' (not uncluding the last index) */
group_vert_range[0] = group_vert_range[1];
group_vert_range[1] += groups_arr[group_index]->vert_len;
+ /* find the closest point all all previous to this edge-groups center,
+ * gives a 'reasonably' good starting point from which to refine a close pair */
+ BMVert *v_start;
+ {
+ const int index = BLI_kdtree_find_nearest_cb(
+ tree, verts_center[group_index],
+ kdtree_find_v_prev_range_cb, group_vert_range,
+ NULL);
+ BLI_assert(index >= 0 && index < (int)verts_len);
+ v_start = verts_arr[index];
+ }
+
BMVert *vpair_best[2] = {v_start, NULL};
for (unsigned int i = 0; i < refine; i++) {
unsigned int src_side, dst_side;
@@ -317,8 +331,7 @@ static bool bm_face_split_edgenet_prepare_holes(
src_side ? kdtree_find_v_prev_range_cb : kdtree_find_v_in_range_cb, group_vert_range,
NULL);
- BLI_assert(index >= 0);
- BLI_assert(index < (int)verts_len);
+ BLI_assert(index >= 0 && index < (int)verts_len);
vpair_best[dst_side] = verts_arr[index];
}
More information about the Bf-blender-cvs
mailing list