bmesh api: minor simplify & cleanup
- add BM_face_edge_share_loop(f, e) -- edge version of existing BM_face_vert_share_loop(f, v) - simplify BM_edge_ordered_verts_ex(), check could be reduced. - use BM_ELEM_INTERNAL_TAG for bmesh_jfke(), not BM_ELEM_TAG to avoid clobbering tagged data tools might use.
This commit is contained in:
@@ -1618,7 +1618,6 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
|
||||
{
|
||||
BMLoop *l_iter, *f1loop = NULL, *f2loop = NULL;
|
||||
int newlen = 0, i, f1len = 0, f2len = 0, radlen = 0, edok, shared;
|
||||
BMIter iter;
|
||||
|
||||
/* can't join a face to itsel */
|
||||
if (f1 == f2) {
|
||||
@@ -1628,19 +1627,10 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
|
||||
/* verify that e is in both f1 and f2 */
|
||||
f1len = f1->len;
|
||||
f2len = f2->len;
|
||||
BM_ITER(l_iter, &iter, bm, BM_LOOPS_OF_FACE, f1) {
|
||||
if (l_iter->e == e) {
|
||||
f1loop = l_iter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
BM_ITER(l_iter, &iter, bm, BM_LOOPS_OF_FACE, f2) {
|
||||
if (l_iter->e == e) {
|
||||
f2loop = l_iter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!(f1loop && f2loop)) {
|
||||
|
||||
if (!((f1loop = BM_face_edge_share_loop(f1, e)) &&
|
||||
(f2loop = BM_face_edge_share_loop(f2, e))))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1673,21 +1663,21 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
|
||||
|
||||
/* validate no internal join */
|
||||
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
|
||||
BM_elem_flag_disable(l_iter->v, BM_ELEM_TAG);
|
||||
BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
|
||||
}
|
||||
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
|
||||
BM_elem_flag_disable(l_iter->v, BM_ELEM_TAG);
|
||||
BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
|
||||
}
|
||||
|
||||
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
|
||||
if (l_iter != f1loop) {
|
||||
BM_elem_flag_enable(l_iter->v, BM_ELEM_TAG);
|
||||
BM_elem_flag_enable(l_iter->v, BM_ELEM_INTERNAL_TAG);
|
||||
}
|
||||
}
|
||||
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
|
||||
if (l_iter != f2loop) {
|
||||
/* as soon as a duplicate is found, bail out */
|
||||
if (BM_elem_flag_test(l_iter->v, BM_ELEM_TAG)) {
|
||||
if (BM_elem_flag_test(l_iter->v, BM_ELEM_INTERNAL_TAG)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -652,7 +652,7 @@ BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2)
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Radial Find a Vertex Loop in Face
|
||||
* \brief Return the Loop Shared by Face and Vertex
|
||||
*
|
||||
* Finds the loop used which uses \a v in face loop \a l
|
||||
*
|
||||
@@ -674,6 +674,29 @@ BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return the Loop Shared by Face and Edge
|
||||
*
|
||||
* Finds the loop used which uses \a e in face loop \a l
|
||||
*
|
||||
* \note currenly this just uses simple loop in future may be speeded up
|
||||
* using radial vars
|
||||
*/
|
||||
BMLoop *BM_face_edge_share_loop(BMFace *f, BMEdge *e)
|
||||
{
|
||||
BMLoop *l_first;
|
||||
BMLoop *l_iter;
|
||||
|
||||
l_iter = l_first = e->l;
|
||||
do {
|
||||
if (l_iter->f == f) {
|
||||
return l_iter;
|
||||
}
|
||||
} while ((l_iter = l_iter->radial_next) != l_first);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the verts of an edge as used in a face
|
||||
* if used in a face at all, otherwise just assign as used in the edge.
|
||||
@@ -681,24 +704,16 @@ BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v)
|
||||
* Useful to get a deterministic winding order when calling
|
||||
* BM_face_create_ngon() on an arbitrary array of verts,
|
||||
* though be sure to pick an edge which has a face.
|
||||
*
|
||||
* \note This is infact quite a simple check, mainly include this function so the intent is more obvious.
|
||||
* We know these 2 verts will _always_ make up the loops edge
|
||||
*/
|
||||
void BM_edge_ordered_verts_ex(BMEdge *edge, BMVert **r_v1, BMVert **r_v2,
|
||||
BMLoop *edge_loop)
|
||||
{
|
||||
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;
|
||||
*r_v2 = edge->v2;
|
||||
}
|
||||
else {
|
||||
*r_v1 = edge->v2;
|
||||
*r_v2 = edge->v1;
|
||||
}
|
||||
*r_v1 = edge_loop->v;
|
||||
*r_v2 = edge_loop->next->v;
|
||||
}
|
||||
|
||||
void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2)
|
||||
|
||||
@@ -79,6 +79,7 @@ int BM_edge_share_vert_count(BMEdge *e1, BMEdge *e2);
|
||||
|
||||
BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2);
|
||||
BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v);
|
||||
BMLoop *BM_face_edge_share_loop(BMFace *f, BMEdge *e);
|
||||
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user