[Bf-blender-cvs] [e947dd8] master: BMesh: add BM_vert_is_edge_pair(), faster then checking (BM_vert_edge_count(v) == 2)

Campbell Barton noreply at git.blender.org
Fri Jun 27 12:39:20 CEST 2014


Commit: e947dd8cd765909ebadfc5e82d0d34116733b04e
Author: Campbell Barton
Date:   Fri Jun 27 20:22:19 2014 +1000
https://developer.blender.org/rBe947dd8cd765909ebadfc5e82d0d34116733b04e

BMesh: add BM_vert_is_edge_pair(), faster then checking (BM_vert_edge_count(v) == 2)

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

M	source/blender/bmesh/intern/bmesh_queries.c
M	source/blender/bmesh/intern/bmesh_queries.h
M	source/blender/bmesh/operators/bmo_dissolve.c
M	source/blender/bmesh/tools/bmesh_decimate_dissolve.c

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

diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c
index d356255..d478ac0 100644
--- a/source/blender/bmesh/intern/bmesh_queries.c
+++ b/source/blender/bmesh/intern/bmesh_queries.c
@@ -659,6 +659,19 @@ bool BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb)
 }
 
 /**
+ * Fast alternative to ``(BM_vert_edge_count(v) == 2)``
+ */
+bool BM_vert_is_edge_pair(BMVert *v)
+{
+	BMEdge *e = v->e;
+	if (e) {
+		const BMDiskLink *dl = bmesh_disk_edge_link_from_vert(e, v);
+		return (dl->next == dl->prev);
+	}
+	return false;
+}
+
+/**
  *	Returns the number of edges around this vertex.
  */
 int BM_vert_edge_count(BMVert *v)
diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h
index 7db04a5..21d2097 100644
--- a/source/blender/bmesh/intern/bmesh_queries.h
+++ b/source/blender/bmesh/intern/bmesh_queries.h
@@ -65,6 +65,7 @@ int     BM_edge_face_count(BMEdge *e);
 int     BM_vert_face_count(BMVert *v);
 BMEdge *BM_vert_other_disk_edge(BMVert *v, BMEdge *e);
 
+bool    BM_vert_is_edge_pair(BMVert *v);
 bool    BM_vert_is_wire(const BMVert *v);
 BLI_INLINE bool    BM_edge_is_wire(const BMEdge *e);
 
diff --git a/source/blender/bmesh/operators/bmo_dissolve.c b/source/blender/bmesh/operators/bmo_dissolve.c
index 93296c5..bebfeaa 100644
--- a/source/blender/bmesh/operators/bmo_dissolve.c
+++ b/source/blender/bmesh/operators/bmo_dissolve.c
@@ -92,7 +92,7 @@ static void bm_face_split(BMesh *bm, const short oflag)
 	BMIter liter;
 	BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
 		if (BMO_elem_flag_test(bm, v, oflag)) {
-			if (BM_vert_edge_count(v) > 2) {
+			if (BM_vert_is_edge_pair(v) == false) {
 				BMLoop *l;
 				BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
 					if (l->f->len > 3) {
@@ -129,7 +129,7 @@ void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
 		BMVert *v;
 
 		BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
-			BMO_elem_flag_set(bm, v, VERT_MARK, (BM_vert_edge_count(v) != 2));
+			BMO_elem_flag_set(bm, v, VERT_MARK, !BM_vert_is_edge_pair(v));
 		}
 	}
 
@@ -215,7 +215,7 @@ void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
 
 		BM_ITER_MESH_MUTABLE (v, v_next, &viter, bm, BM_VERTS_OF_MESH) {
 			if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
-				if (BM_vert_edge_count(v) == 2) {
+				if (BM_vert_is_edge_pair(v)) {
 					BM_vert_collapse_edge(bm, v->e, v, true, true);
 				}
 			}
@@ -272,7 +272,7 @@ void bmo_dissolve_edges_exec(BMesh *bm, BMOperator *op)
 
 	if (use_verts) {
 		BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
-			BMO_elem_flag_set(bm, v, VERT_MARK, (BM_vert_edge_count(v) != 2));
+			BMO_elem_flag_set(bm, v, VERT_MARK, !BM_vert_is_edge_pair(v));
 		}
 	}
 
@@ -327,7 +327,7 @@ void bmo_dissolve_edges_exec(BMesh *bm, BMOperator *op)
 	if (use_verts) {
 		BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) {
 			if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
-				if (BM_vert_edge_count(v) == 2) {
+				if (BM_vert_is_edge_pair(v)) {
 					BM_vert_collapse_edge(bm, v->e, v, true, true);
 				}
 			}
diff --git a/source/blender/bmesh/tools/bmesh_decimate_dissolve.c b/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
index 99cb68c..096349e 100644
--- a/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
+++ b/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
@@ -235,7 +235,7 @@ void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool
 		for (i = 0; i < vinput_len; i++) {
 			BMVert *v = vinput_arr[i];
 			if (LIKELY(v != NULL) &&
-			    BM_vert_edge_count(v) == 2)
+			    BM_vert_is_edge_pair(v))
 			{
 				BM_vert_collapse_edge(bm, v->e, v, true, true);  /* join edges */
 			}
@@ -274,7 +274,7 @@ void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool
 			v = BLI_heap_node_ptr(vnode_top);
 			i = BM_elem_index_get(v);
 
-			if (BM_vert_edge_count(v) == 2) {
+			if (BM_vert_is_edge_pair(v)) {
 				e_new = BM_vert_collapse_edge(bm, v->e, v, true, true);  /* join edges */
 
 				if (e_new) {




More information about the Bf-blender-cvs mailing list