fix for BM_edge_other_loop() not working right (own error in recent commit), and add new function BM_vert_step_fan_loop() for stepping around the loops of a face fan with manifold edges.
This commit is contained in:
@@ -346,7 +346,9 @@ BMLoop *BM_edge_other_loop(BMEdge *e, BMLoop *l)
|
|||||||
BLI_assert(BM_edge_is_manifold(e));
|
BLI_assert(BM_edge_is_manifold(e));
|
||||||
BLI_assert(BM_vert_in_edge(e, l->v));
|
BLI_assert(BM_vert_in_edge(e, l->v));
|
||||||
|
|
||||||
l_other = (e->l == l) ? l->radial_next : l;
|
l_other = (l->e == e) ? l : l->prev;
|
||||||
|
l_other = l_other->radial_next;
|
||||||
|
BLI_assert(l_other->e == e);
|
||||||
|
|
||||||
if (l_other->v == l->v) {
|
if (l_other->v == l->v) {
|
||||||
/* pass */
|
/* pass */
|
||||||
@@ -361,6 +363,55 @@ BMLoop *BM_edge_other_loop(BMEdge *e, BMLoop *l)
|
|||||||
return l_other;
|
return l_other;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility function to step around a fan of loops,
|
||||||
|
* using an edge to mark the previous side.
|
||||||
|
*
|
||||||
|
* \note all edges must be manifold,
|
||||||
|
* once a non manifold edge is hit, return NULL.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* ,.,-->|
|
||||||
|
* _,-' |
|
||||||
|
* ,' | (notice how 'e_step'
|
||||||
|
* / | and 'l' define the
|
||||||
|
* / | direction the arrow
|
||||||
|
* | return | points).
|
||||||
|
* | loop --> |
|
||||||
|
* ---------------------+---------------------
|
||||||
|
* ^ l --> |
|
||||||
|
* | |
|
||||||
|
* assign e_step |
|
||||||
|
* |
|
||||||
|
* begin e_step ----> |
|
||||||
|
* |
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
|
||||||
|
BMLoop *BM_vert_step_fan_loop(BMLoop *l, BMEdge **e_step)
|
||||||
|
{
|
||||||
|
BMEdge *e_prev = *e_step;
|
||||||
|
BMEdge *e_next;
|
||||||
|
if (l->e == e_prev) {
|
||||||
|
e_next = l->prev->e;
|
||||||
|
}
|
||||||
|
else if (l->prev->e == e_prev) {
|
||||||
|
e_next = l->e;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
BLI_assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BM_edge_is_manifold(e_next)) {
|
||||||
|
return BM_edge_other_loop((*e_step = e_next), l);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The function takes a vertex at the center of a fan and returns the opposite edge in the fan.
|
* The function takes a vertex at the center of a fan and returns the opposite edge in the fan.
|
||||||
* All edges in the fan must be manifold, otherwise return NULL.
|
* All edges in the fan must be manifold, otherwise return NULL.
|
||||||
|
@@ -44,6 +44,7 @@ BMLoop *BM_edge_other_loop(BMEdge *e, BMLoop *l);
|
|||||||
BMLoop *BM_face_other_edge_loop(BMFace *f, 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);
|
BMLoop *BM_face_other_vert_loop(BMFace *f, BMVert *v_prev, BMVert *v);
|
||||||
BMLoop *BM_loop_other_vert_loop(BMLoop *l, BMVert *v);
|
BMLoop *BM_loop_other_vert_loop(BMLoop *l, BMVert *v);
|
||||||
|
BMLoop *BM_vert_step_fan_loop(BMLoop *l, BMEdge **e_step);
|
||||||
BMLoop *BM_vert_find_first_loop(BMVert *v);
|
BMLoop *BM_vert_find_first_loop(BMVert *v);
|
||||||
|
|
||||||
int BM_vert_edge_count_nonwire(BMVert *v);
|
int BM_vert_edge_count_nonwire(BMVert *v);
|
||||||
|
Reference in New Issue
Block a user