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().
This commit is contained in:
Campbell Barton 2012-03-19 01:57:42 +00:00
parent ef2dc9b175
commit 753056d4e8
2 changed files with 49 additions and 4 deletions

@ -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).

@ -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__ */