[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45376] trunk/blender/source/blender/bmesh : Fix #30791: BMEdge. is_manifold also returned true for edges with only one face

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Apr 3 19:09:59 CEST 2012


Revision: 45376
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45376
Author:   blendix
Date:     2012-04-03 17:09:47 +0000 (Tue, 03 Apr 2012)
Log Message:
-----------
Fix #30791: BMEdge.is_manifold also returned true for edges with only one face
attached to it. A manifold edge should have exactly 2 faces attached to it,
sticking to the standard definition for "manifold".

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
    trunk/blender/source/blender/bmesh/tools/BME_bevel.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-04-03 15:18:59 UTC (rev 45375)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-04-03 17:09:47 UTC (rev 45376)
@@ -537,21 +537,21 @@
 
 /**
  * Tests whether or not this edge is manifold.
- * A manifold edge either has 1 or 2 faces attached to it.
+ * A manifold edge has exactly 2 faces attached to it.
  */
 
 #if 1 /* fast path for checking manifold */
 int BM_edge_is_manifold(BMEdge *e)
 {
 	const BMLoop *l = e->l;
-	return (l && ((l->radial_next == l) ||              /* 1 face user  */
-	              (l->radial_next->radial_next == l))); /* 2 face users */
+	return (l && (l->radial_next != l) &&             /* not 0 or 1 face users */
+	             (l->radial_next->radial_next == l)); /* 2 face users */
 }
 #else
 int BM_edge_is_manifold(BMEdge *e)
 {
 	int count = BM_edge_face_count(e);
-	if (count == 2 || count == 1) {
+	if (count == 2) {
 		return TRUE;
 	}
 	else {

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2012-04-03 15:18:59 UTC (rev 45375)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2012-04-03 17:09:47 UTC (rev 45376)
@@ -667,7 +667,7 @@
 	
 	/* Don't start a loop from a boundary edge if it cannot
 	 * be extended to cover any faces */
-	if (BM_edge_face_count(e) == 1) {
+	if (BM_edge_is_boundary(e)) {
 		if (!bmw_FaceLoopWalker_include_face(walker, e->l)) {
 			return FALSE;
 		}
@@ -843,7 +843,7 @@
 	int i, len;
 #endif
 
-#define EDGE_CHECK(e) (bmw_mask_check_edge(walker, e) && BM_edge_is_manifold(e))
+#define EDGE_CHECK(e) (bmw_mask_check_edge(walker, e) && (BM_edge_is_boundary(e) || BM_edge_is_manifold(e)))
 
 	BMW_state_remove(walker);
 

Modified: trunk/blender/source/blender/bmesh/tools/BME_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/BME_bevel.c	2012-04-03 15:18:59 UTC (rev 45375)
+++ trunk/blender/source/blender/bmesh/tools/BME_bevel.c	2012-04-03 17:09:47 UTC (rev 45376)
@@ -905,7 +905,7 @@
 
 	BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
 		BMO_elem_flag_enable(bm, e, BME_BEVEL_ORIG);
-		if (!BM_edge_is_manifold(e)) {
+		if (!(BM_edge_is_boundary(e) || BM_edge_is_manifold(e))) {
 			BMO_elem_flag_enable(bm, e->v1, BME_BEVEL_NONMAN);
 			BMO_elem_flag_enable(bm, e->v2, BME_BEVEL_NONMAN);
 			BMO_elem_flag_enable(bm, e, BME_BEVEL_NONMAN);




More information about the Bf-blender-cvs mailing list