[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45728] trunk/blender/source/blender/bmesh /intern: bmesh api: minor simplify & cleanup
Campbell Barton
ideasman42 at gmail.com
Wed Apr 18 06:32:56 CEST 2012
Revision: 45728
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45728
Author: campbellbarton
Date: 2012-04-18 04:32:55 +0000 (Wed, 18 Apr 2012)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/intern/bmesh_core.c
trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c 2012-04-17 22:53:24 UTC (rev 45727)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c 2012-04-18 04:32:55 UTC (rev 45728)
@@ -1618,7 +1618,6 @@
{
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 @@
/* 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 @@
/* 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;
}
}
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c 2012-04-17 22:53:24 UTC (rev 45727)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c 2012-04-18 04:32:55 UTC (rev 45728)
@@ -652,7 +652,7 @@
}
/**
- * \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
*
@@ -675,30 +675,45 @@
}
/**
+ * \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.
*
* 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)
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h 2012-04-17 22:53:24 UTC (rev 45727)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h 2012-04-18 04:32:55 UTC (rev 45728)
@@ -79,6 +79,7 @@
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,
More information about the Bf-blender-cvs
mailing list