[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44816] trunk/blender/source/blender/bmesh /intern: Fix edge loop selection.

Antony Riakiotakis kalast at gmail.com
Sun Mar 11 21:46:13 CET 2012


Revision: 44816
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44816
Author:   psy-fi
Date:     2012-03-11 20:45:58 +0000 (Sun, 11 Mar 2012)
Log Message:
-----------
Fix edge loop selection. Now boundary selection checks only for filled edges to determine when to stop and stops at vertices shared by only 2 edges.

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

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-03-11 20:01:26 UTC (rev 44815)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-03-11 20:45:58 UTC (rev 44816)
@@ -291,6 +291,23 @@
 	return bmesh_disk_count(v);
 }
 
+int BM_vert_edge_count_nonwire( BMesh *bm, BMVert *v)
+{
+	int count = 0;
+	BMIter eiter;
+	BMEdge *edge;
+	BM_ITER(edge, &eiter, bm, BM_EDGES_OF_VERT, v){
+		if (!edge) return count;
+
+		if (count >= (1 << 20)) {
+			printf(" bmesh error: infinite loop in disk cycle!\n");
+			return 0;
+		}
+
+		if(edge->l) count++;
+	}
+	return count;
+}
 /**
  *	Returns the number of faces around this edge
  */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2012-03-11 20:01:26 UTC (rev 44815)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2012-03-11 20:45:58 UTC (rev 44816)
@@ -49,6 +49,8 @@
 int     BM_vert_is_wire(BMesh *bm, BMVert *v);
 int     BM_edge_is_wire(BMesh *bm, BMEdge *e);
 
+int 	BM_vert_edge_count_nonwire( BMesh *bm, BMVert *v);
+
 int     BM_vert_is_manifold(BMesh *bm, BMVert *v);
 int     BM_edge_is_manifold(BMesh *bm, BMEdge *e);
 int     BM_edge_is_boundary(BMEdge *e);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2012-03-11 20:01:26 UTC (rev 44815)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2012-03-11 20:45:58 UTC (rev 44816)
@@ -464,11 +464,12 @@
 
 	v = (e->v1 == lwalk->lastv) ? e->v2 : e->v1;
 
-	val = BM_vert_edge_count(v);
-
 	rlen = owalk.startrad;
 
-	if (val == 4 || val == 2 || rlen == 1) {
+	val = BM_vert_edge_count_nonwire(walker->bm, v);
+
+	/* however, why use 2 here at all? I guess for internal ngon loops it can be useful. Antony R. */
+	if (((val == 4 || val == 2) && rlen > 1) || (rlen == 1 && val > 2)) {
 		i = 0;
 		stopi = val / 2;
 		while (1) {
@@ -481,7 +482,7 @@
 
 			l2 = l->radial_next;
 
-			if (l2 == l) {
+			if (l2 == l || !l2) {
 				break;
 			}
 




More information about the Bf-blender-cvs mailing list