From baea85b4498315bc085712626511119e05aed237 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Aug 2014 15:56:34 +1000 Subject: BMesh: add BM_vert_splice_check_double checks if splicing verts creates duplicate edges --- source/blender/bmesh/intern/bmesh_core.c | 38 ++++++++++++++++++++++++++++++++ source/blender/bmesh/intern/bmesh_core.h | 1 + 2 files changed, 39 insertions(+) (limited to 'source/blender') diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c index 6f886ed5b37..99dd9c26cc6 100644 --- a/source/blender/bmesh/intern/bmesh_core.c +++ b/source/blender/bmesh/intern/bmesh_core.c @@ -1939,6 +1939,44 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e) return f1; } +/** + * Check if splicing vertices would create any double edges. + * + * \note assume caller will handle case where verts share an edge. + */ +bool BM_vert_splice_check_double(BMVert *v_a, BMVert *v_b) +{ + bool is_double = false; + + BLI_assert(BM_edge_exists(v_a, v_b) == false); + + if (v_a->e && v_b->e) { + SmallHash visit; + BMEdge *e, *e_first; + + BLI_smallhash_init(&visit); + + e = e_first = v_a->e; + do { + BMVert *v_other = BM_edge_other_vert(e, v_a); + BLI_smallhash_insert(&visit, (uintptr_t)v_other, NULL); + } while ((e = BM_DISK_EDGE_NEXT(e, v_a)) != e_first); + + e = e_first = v_b->e; + do { + BMVert *v_other = BM_edge_other_vert(e, v_b); + if (BLI_smallhash_haskey(&visit, (uintptr_t)v_other)) { + is_double = true; + break; + } + } while ((e = BM_DISK_EDGE_NEXT(e, v_b)) != e_first); + + BLI_smallhash_release(&visit); + } + + return is_double; +} + /** * \brief Splice Vert * diff --git a/source/blender/bmesh/intern/bmesh_core.h b/source/blender/bmesh/intern/bmesh_core.h index 4a2b4b7feca..ab847fc82eb 100644 --- a/source/blender/bmesh/intern/bmesh_core.h +++ b/source/blender/bmesh/intern/bmesh_core.h @@ -61,6 +61,7 @@ void bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep, const bool copy_select); bool BM_edge_splice(BMesh *bm, BMEdge *e, BMEdge *e_target); bool BM_vert_splice(BMesh *bm, BMVert *v, BMVert *v_target); +bool BM_vert_splice_check_double(BMVert *v_a, BMVert *v_b); void bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len, const bool copy_select); -- cgit v1.2.3