[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56784] trunk/blender/source/blender/bmesh /intern/bmesh_walkers_impl.c: fix for problem where edge loop select would select too many vertices ( extend selection too far),

Campbell Barton ideasman42 at gmail.com
Tue May 14 06:55:22 CEST 2013


Revision: 56784
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56784
Author:   campbellbarton
Date:     2013-05-14 04:55:21 +0000 (Tue, 14 May 2013)
Log Message:
-----------
fix for problem where edge loop select would select too many vertices (extend selection too far),

before & after: http://www.graphicall.org/ftp/ideasman42/edgeloop_select_fix.png

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

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2013-05-14 04:09:02 UTC (rev 56783)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2013-05-14 04:55:21 UTC (rev 56784)
@@ -428,6 +428,15 @@
  *
  * Starts at a tool-flagged edge and walks over the edge loop
  */
+
+/* utility function */
+static bool bm_loop_is_single(BMLoop *l)
+{
+	return ((BM_edge_is_boundary(l->e)) &&
+	        (l->f->len != 4) &&
+	        (BM_edge_is_boundary(l->next->e) || BM_edge_is_boundary(l->prev->e)));
+}
+
 static void bmw_LoopWalker_begin(BMWalker *walker, void *data)
 {
 	BMwLoopWalker *lwalk = NULL, owalk, *owalk_pt;
@@ -444,7 +453,7 @@
 	lwalk->cur = lwalk->start = e;
 	lwalk->lastv = lwalk->startv = v;
 	lwalk->is_boundary = BM_edge_is_boundary(e);
-	lwalk->is_single = (vert_edge_count[0] == 2 && vert_edge_count[1] == 2);
+	lwalk->is_single = (lwalk->is_boundary && bm_loop_is_single(e->l));
 
 	/* could also check that vertex*/
 	if ((lwalk->is_boundary == false) &&
@@ -639,6 +648,10 @@
 			} while (true);
 		}
 
+		if (owalk.is_single == false && bm_loop_is_single(l)) {
+			l = NULL;
+		}
+
 		if (l != NULL) {
 			if (l != e->l &&
 			    bmw_mask_check_edge(walker, l->e) &&




More information about the Bf-blender-cvs mailing list