bmesh api: minor simplify & cleanup
authorCampbell Barton <ideasman42@gmail.com>
Wed, 18 Apr 2012 04:32:55 +0000 (04:32 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 18 Apr 2012 04:32:55 +0000 (04:32 +0000)
- 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.

source/blender/bmesh/intern/bmesh_core.c
source/blender/bmesh/intern/bmesh_queries.c
source/blender/bmesh/intern/bmesh_queries.h

index 6b80faf1c0d10ed8edfafb0339417be67f92031d..765c1c3e774e802dc3f6cceffb94bf810180ba62 100644 (file)
@@ -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;
                        }
                }
index 45edfd9628aacb5aecf67e5d11c65df3140b8161..f85105651d4b508c6f87a4b0921c9d82530ef6d8 100644 (file)
@@ -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)
index f3dfa754f00ce5a26fe79643ef25da47dc469ae2..567d60eeac6ead5bbdcb7e18f498deaf6470a1af 100644 (file)
@@ -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,