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);
                }
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to