From 753056d4e82094fe8993c0efade081600b14359b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 19 Mar 2012 01:57:42 +0000 Subject: BMesh utility functions, not used yet, - BM_edge_loop_pair incase you need the loops rather then the faces. - BM_edge_ordered_verts_ex() - accepts a loop argument. - BM_edge_length_calc() - simple length calc, useful if the edge is in some array, saves assigning a var and using len_v3v2(). --- source/blender/bmesh/intern/bmesh_queries.c | 49 ++++++++++++++++++++++++++--- source/blender/bmesh/intern/bmesh_queries.h | 4 +++ 2 files changed, 49 insertions(+), 4 deletions(-) (limited to 'source/blender/bmesh') diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 341bb877f93..53b393b3140 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -258,6 +258,14 @@ BMVert *BM_edge_other_vert(BMEdge *e, BMVert *v) return bmesh_edge_other_vert_get(e, v); } +/** + * Returms edge length + */ +float BM_edge_length_calc(BMEdge *e) +{ + return len_v3v3(e->v1->co, e->v2->co); +} + /** * Utility function, since enough times we have an edge * and want to access 2 connected faces. @@ -283,6 +291,31 @@ int BM_edge_face_pair(BMEdge *e, BMFace **r_fa, BMFace **r_fb) } } +/** + * Utility function, since enough times we have an edge + * and want to access 2 connected loops. + * + * \return TRUE when only 2 faces are found. + */ +int BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb) +{ + BMLoop *la, *lb; + + if ((la = e->l) && + (lb = la->radial_next) && + (lb->radial_next == la)) + { + *r_la = la; + *r_lb = lb; + return TRUE; + } + else { + *r_la = NULL; + *r_lb = NULL; + return FALSE; + } +} + /** * Returns the number of edges around this vertex. */ @@ -599,11 +632,14 @@ BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v) * BM_face_create_ngon() on an arbitrary array of verts, * though be sure to pick an edge which has a face. */ -void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2) +void BM_edge_ordered_verts_ex(BMEdge *edge, BMVert **r_v1, BMVert **r_v2, + BMLoop *edge_loop) { - if ((edge->l == NULL) || - (((edge->l->prev->v == edge->v1) && (edge->l->v == edge->v2)) || - ((edge->l->v == edge->v1) && (edge->l->next->v == edge->v2))) + BLI_assert(edge_loop->e == edge); + + if ((edge_loop == NULL) || + (((edge_loop->prev->v == edge->v1) && (edge_loop->v == edge->v2)) || + ((edge_loop->v == edge->v1) && (edge_loop->next->v == edge->v2))) ) { *r_v1 = edge->v1; @@ -615,6 +651,11 @@ void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2) } } +void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2) +{ + BM_edge_ordered_verts_ex(edge, r_v1, r_v2, edge->l); +} + /** * Calculates the angle between the previous and next loops * (angle at this loops face corner). diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index 2524d090a4e..4bccd869dd4 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -37,7 +37,9 @@ int BM_edge_in_face(BMFace *f, BMEdge *e); int BM_vert_in_edge(BMEdge *e, BMVert *v); int BM_verts_in_edge(BMVert *v1, BMVert *v2, BMEdge *e); +float BM_edge_length_calc(BMEdge *e); int BM_edge_face_pair(BMEdge *e, BMFace **r_fa, BMFace **r_fb); +int BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb); BMVert *BM_edge_other_vert(BMEdge *e, BMVert *v); BMLoop *BM_face_other_edge_loop(BMFace *f, BMEdge *e, BMVert *v); BMLoop *BM_face_other_vert_loop(BMFace *f, BMVert *v_prev, BMVert *v); @@ -78,5 +80,7 @@ BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2); BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v); void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2); +void BM_edge_ordered_verts_ex(BMEdge *edge, BMVert **r_v1, BMVert **r_v2, + BMLoop *edge_loop); #endif /* __BMESH_QUERIES_H__ */ -- cgit v1.2.3