[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43986] branches/bmesh/blender/source/ blender: fix [#30103] Select vertex groups works only in vertex select mode

Campbell Barton ideasman42 at gmail.com
Wed Feb 8 15:29:20 CET 2012


Revision: 43986
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43986
Author:   campbellbarton
Date:     2012-02-08 14:29:14 +0000 (Wed, 08 Feb 2012)
Log Message:
-----------
fix [#30103] Select vertex groups works only in vertex select mode

add selection flushing matching whats in trunk.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/object/object_vgroup.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2012-02-08 14:01:47 UTC (rev 43985)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2012-02-08 14:29:14 UTC (rev 43986)
@@ -293,6 +293,10 @@
 
 void BM_SelectMode_Flush(BMesh *bm);
 
+/* mode independant flushing up/down */
+void BM_DeSelect_Flush(BMesh *bm);
+void BM_Select_Flush(BMesh *bm);
+
 /*convert an editmesh to a bmesh*/
 BMesh *editmesh_to_bmesh(struct EditMesh *em);
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2012-02-08 14:01:47 UTC (rev 43985)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2012-02-08 14:29:14 UTC (rev 43986)
@@ -141,6 +141,95 @@
 	recount_totsels(bm);
 }
 
+/* BMESH NOTE: matches EM_deselect_flush() behavior from trunk */
+void BM_DeSelect_Flush(BMesh *bm)
+{
+	BMEdge *e;
+	BMLoop *l_iter;
+	BMLoop *l_first;
+	BMFace *f;
+
+	BMIter edges;
+	BMIter faces;
+
+	int ok;
+
+	for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
+		if (!(BM_TestHFlag(e->v1, BM_SELECT) && BM_TestHFlag(e->v2, BM_SELECT) && !BM_TestHFlag(e, BM_HIDDEN))) {
+			BM_ClearHFlag(e, BM_SELECT);
+		}
+	}
+
+	for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)) {
+		ok = TRUE;
+		if (!BM_TestHFlag(f, BM_HIDDEN)) {
+			l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+			do {
+				if (!BM_TestHFlag(l_iter->v, BM_SELECT)) {
+					ok = FALSE;
+					break;
+				}
+			} while ((l_iter = l_iter->next) != l_first);
+		}
+		else {
+			ok = FALSE;
+		}
+
+		if (ok == FALSE) {
+			BM_ClearHFlag(f, BM_SELECT);
+		}
+	}
+
+	/* Remove any deselected elements from the BMEditSelection */
+	BM_validate_selections(bm);
+
+	recount_totsels(bm);
+}
+
+
+/* BMESH NOTE: matches EM_select_flush() behavior from trunk */
+void BM_Select_Flush(BMesh *bm)
+{
+	BMEdge *e;
+	BMLoop *l_iter;
+	BMLoop *l_first;
+	BMFace *f;
+
+	BMIter edges;
+	BMIter faces;
+
+	int ok;
+
+	for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
+		if (BM_TestHFlag(e->v1, BM_SELECT) && BM_TestHFlag(e->v2, BM_SELECT) && !BM_TestHFlag(e, BM_HIDDEN)) {
+			BM_SetHFlag(e, BM_SELECT);
+		}
+	}
+
+	for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)) {
+		ok = TRUE;
+		if (!BM_TestHFlag(f, BM_HIDDEN)) {
+			l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+			do {
+				if (!BM_TestHFlag(l_iter->v, BM_SELECT)) {
+					ok = FALSE;
+					break;
+				}
+			} while ((l_iter = l_iter->next) != l_first);
+		}
+		else {
+			ok = FALSE;
+		}
+
+		if (ok) {
+			BM_SetHFlag(f, BM_SELECT);
+		}
+	}
+
+	recount_totsels(bm);
+}
+
+
 /*
  * BMESH SELECT VERT
  *

Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2012-02-08 14:01:47 UTC (rev 43985)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2012-02-08 14:29:14 UTC (rev 43986)
@@ -148,11 +148,10 @@
 int EDBM_CallAndSelectOpf(struct BMEditMesh *em, struct wmOperator *op, 
 						  const char *selectslot, const char *fmt, ...);
 
-/*flushes based on the current select mode.  if in vertex select mode,
-  verts select/deselect edges and faces, if in edge select mode,
-  edges select/deselect faces and vertices, and in face select mode faces select/deselect
-  edges and vertices.*/
-void EDBM_selectmode_flush(struct BMEditMesh *em);
+/* flushes based on the current select mode.  if in vertex select mode,
+ * verts select/deselect edges and faces, if in edge select mode,
+ * edges select/deselect faces and vertices, and in face select mode faces select/deselect
+ * edges and vertices.*/
 void EDBM_select_more(struct BMEditMesh *em);
 void EDBM_select_less(struct BMEditMesh *em);
 
@@ -161,8 +160,10 @@
 /*exactly the same as EDBM_selectmode_flush, but you pass in the selectmode
   instead of using the current one*/
 void EDBM_select_flush(struct BMEditMesh *em, int selectmode);
-void EDBM_deselect_flush(struct BMEditMesh *em);
 
+void EDBM_deselectmode_flush(struct BMEditMesh *em);
+void EDBM_selectmode_flush(struct BMEditMesh *em);
+
 void EDBM_selectmode_set(struct BMEditMesh *em);
 void EDBM_convertsel(struct BMEditMesh *em, short oldmode, short selectmode);
 void		undo_push_mesh(struct bContext *C, const char *name);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2012-02-08 14:01:47 UTC (rev 43985)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2012-02-08 14:29:14 UTC (rev 43986)
@@ -425,16 +425,16 @@
 	em->bm->selectmode = em->selectmode;
 }
 
-/*BMESH_TODO*/
-void EDBM_deselect_flush(BMEditMesh *UNUSED(em))
+void EDBM_deselectmode_flush(BMEditMesh *em)
 {
+	BM_DeSelect_Flush(em->bm);
 }
 
 
 void EDBM_selectmode_flush(BMEditMesh *em)
 {
 	em->bm->selectmode = em->selectmode;
-	BM_SelectMode_Flush(em->bm);
+	BM_Select_Flush(em->bm);
 }
 
 void EDBM_select_more(BMEditMesh *em)

Modified: branches/bmesh/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/object/object_vgroup.c	2012-02-08 14:01:47 UTC (rev 43985)
+++ branches/bmesh/blender/source/blender/editors/object/object_vgroup.c	2012-02-08 14:29:14 UTC (rev 43986)
@@ -603,7 +603,7 @@
 
 			/* this has to be called, because this function operates on vertices only */
 			if(select) EDBM_selectmode_flush(em);	// vertices to edges/faces
-			else EDBM_deselect_flush(em);
+			else EDBM_deselectmode_flush(em);
 		}
 		else {
 			if (me->dvert) {




More information about the Bf-blender-cvs mailing list