From e77f986fa0c0ae399dec4cd50e0e578af984334b Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Tue, 22 Sep 2020 11:00:06 -0300 Subject: MeshAnalysis: Optimize the detection of intersecting geometry For the self overlap result, each intersection pair does not need to be tested twice. --- source/blender/blenkernel/intern/editmesh_bvh.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'source/blender/blenkernel/intern/editmesh_bvh.c') diff --git a/source/blender/blenkernel/intern/editmesh_bvh.c b/source/blender/blenkernel/intern/editmesh_bvh.c index a1e53a1f848..c4f855dd8c2 100644 --- a/source/blender/blenkernel/intern/editmesh_bvh.c +++ b/source/blender/blenkernel/intern/editmesh_bvh.c @@ -582,3 +582,26 @@ BVHTreeOverlap *BKE_bmbvh_overlap(const BMBVHTree *bmtree_a, return BLI_bvhtree_overlap( bmtree_a->tree, bmtree_b->tree, r_overlap_tot, bmbvh_overlap_cb, &data); } + +static bool bmbvh_overlap_self_cb(void *userdata, int index_a, int index_b, int thread) +{ + if (index_a < index_b) { + return bmbvh_overlap_cb(userdata, index_a, index_b, thread); + } + return false; +} + +/** + * Overlap indices reference the looptri's + */ +BVHTreeOverlap *BKE_bmbvh_overlap_self(const BMBVHTree *bmtree, unsigned int *r_overlap_tot) +{ + struct BMBVHTree_OverlapData data; + + data.tree_pair[0] = bmtree; + data.tree_pair[1] = bmtree; + data.epsilon = BLI_bvhtree_get_epsilon(bmtree->tree); + + return BLI_bvhtree_overlap( + bmtree->tree, bmtree->tree, r_overlap_tot, bmbvh_overlap_self_cb, &data); +} -- cgit v1.2.3