[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