[Bf-blender-cvs] [baea85b] master: BMesh: add BM_vert_splice_check_double

Campbell Barton noreply at git.blender.org
Mon Aug 18 07:59:29 CEST 2014


Commit: baea85b4498315bc085712626511119e05aed237
Author: Campbell Barton
Date:   Mon Aug 18 15:56:34 2014 +1000
Branches: master
https://developer.blender.org/rBbaea85b4498315bc085712626511119e05aed237

BMesh: add BM_vert_splice_check_double

checks if splicing verts creates duplicate edges

===================================================================

M	source/blender/bmesh/intern/bmesh_core.c
M	source/blender/bmesh/intern/bmesh_core.h

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c
index 6f886ed..99dd9c2 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 4a2b4b7..ab847fc 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);




More information about the Bf-blender-cvs mailing list