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) {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to