[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39908] branches/bmesh/blender/source/ blender: Patch 28492 from Andrew Wiggin (ender79) to fix loop deselect problem (bug 28492)

Howard Trickey howard.trickey at gmail.com
Sun Sep 4 16:59:21 CEST 2011


Revision: 39908
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39908
Author:   howardt
Date:     2011-09-04 14:59:20 +0000 (Sun, 04 Sep 2011)
Log Message:
-----------
Patch 28492 from Andrew Wiggin (ender79) to fix loop deselect problem (bug 28492)

This disables, at least for now, some code that was marked as 'not 100% reliable' that was breaking trunk behavior.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2011-09-04 14:32:32 UTC (rev 39907)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2011-09-04 14:59:20 UTC (rev 39908)
@@ -12,6 +12,23 @@
 #include <string.h>
 
 /*
+ * Restricted deselect prevents deslection of a
+ * face or vertex from deselecting the component
+ * edges and/or vertices, if those edges/vertices
+ * are part of another selected face/edge.
+ * This is not 100% reliable, and so needs to be
+ * turned off for now. A couple of examples where
+ * it didn't work:
+ * - In vertex mode, select two adjacent edge loops,
+ *   then try to deselect one of the loops (see bug
+ *   #28492)
+ * - In vertex+edge multi-select mode, select three
+ *   edges that line up to form a path, then try to
+ *   deselect the middle edge
+*/
+/*#define RESTRICTED_DESELECT*/
+
+/*
  * BM_MARK.C
  *
  * Selection routines for bmesh structures.
@@ -134,13 +151,13 @@
  * BMESH SELECT EDGE
  *
  * Changes selection state of a single edge
- * in a mesh. Note that this may not be
- * 100 percent reliable.
+ * in a mesh.
  *
 */
 
 void BM_Select_Edge(BMesh *bm, BMEdge *e, int select)
 {
+#if defined(RESTRICTED_DESELECT)
 	int candesel;
 	int testiso = 1;
 
@@ -181,6 +198,7 @@
 			if (candesel) BM_Select_Vert(bm, !i?e->v1:e->v2, 0);			
 		}
 	}
+#endif
 
 	if(select) { 
 		if (!BM_TestHFlag(e, BM_SELECT)) bm->totedgesel += 1;
@@ -193,6 +211,10 @@
 		if (BM_TestHFlag(e, BM_SELECT)) bm->totedgesel -= 1;
 
 		BM_ClearHFlag(&(e->head), BM_SELECT);
+#if !defined(RESTRICTED_DESELECT)
+		BM_Select(bm, e->v1, 0);
+		BM_Select(bm, e->v2, 0);
+#endif
 	}
 }
 
@@ -201,9 +223,7 @@
  * BMESH SELECT FACE
  *
  * Changes selection state of a single
- * face in a mesh. This (might) suffer
- * from same problems as edge select
- * code...
+ * face in a mesh.
  *
 */
 
@@ -223,34 +243,42 @@
 		}while(l != bm_firstfaceloop(f));
 	}
 	else{ 
-		BMIter liter, fiter, eiter;
-		BMFace *f2;
+		BMIter liter;
 		BMLoop *l;
-		BMEdge *e;
 
 		if (BM_TestHFlag(f, BM_SELECT)) bm->totfacesel -= 1;
 		BM_ClearHFlag(&(f->head), BM_SELECT);
 
 		/*flush down to edges*/
 		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+#if defined(RESTRICTED_DESELECT)
+			BMIter fiter;
+			BMFace *f2;
 			BM_ITER(f2, &fiter, bm, BM_FACES_OF_EDGE, l->e) {
 				if (BM_TestHFlag(f2, BM_SELECT))
 					break;
 			}
 
-			if (!f2) {
+			if (!f2)
+#endif
+			{
 				BM_Select(bm, l->e, 0);
 			}
 		}
 
 		/*flush down to verts*/
 		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+#if defined(RESTRICTED_DESELECT)
+			BMIter eiter;
+			BMEdge *e;
 			BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, l->v) {
 				if (BM_TestHFlag(e, BM_SELECT))
 					break;
 			}
 
-			if (!e) {
+			if (!e)
+#endif
+			{
 				BM_Select(bm, l->v, 0);
 			}
 		}

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2011-09-04 14:32:32 UTC (rev 39907)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2011-09-04 14:59:20 UTC (rev 39908)
@@ -877,9 +877,6 @@
 /* ***************************************************** */
 
 /* ****************  LOOP SELECTS *************** */
-/*faceloop_select, edgeloop_select, and edgering_select, are left
-  here for reference purposes temporarily, but have all been replaced
-  by uses of walker_select.*/
 
 static void walker_select(BMEditMesh *em, int walkercode, void *start, int select)
 {
@@ -994,7 +991,7 @@
 	if(eed) {
 		if(extend==0) EDBM_clear_flag_all(em, BM_SELECT);
 	
-		if(BM_TestHFlag(em, BM_SELECT)==0) select=1;
+		if(BM_TestHFlag(eed, BM_SELECT)==0) select=1;
 		else if(extend) select=0;
 
 		if(em->selectmode & SCE_SELECT_FACE) {
@@ -1009,7 +1006,7 @@
 		else if(em->selectmode & SCE_SELECT_VERTEX) {
 			if(ring)
 				walker_select(em, BMW_EDGERING, eed, select);
-			else 
+			else
 				walker_select(em, BMW_LOOP, eed, select);
 		}
 




More information about the Bf-blender-cvs mailing list