diff options
-rw-r--r-- | source/blender/bmesh/intern/bmesh_core.c | 38 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_core.h | 1 |
2 files changed, 39 insertions, 0 deletions
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 @@ -1940,6 +1940,44 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e) } /** + * 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 * * Merges two verts into one (\a v into \a vtarget). 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); |