Revision: 14217
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14217
Author:   campbellbarton
Date:     2008-03-23 17:27:34 +0100 (Sun, 23 Mar 2008)

Log Message:
-----------
fixed UV selection hide/reveal in the UV window.

Modified Paths:
--------------
    trunk/blender/source/blender/src/editmesh_mods.c

Modified: trunk/blender/source/blender/src/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/src/editmesh_mods.c    2008-03-23 12:59:26 UTC 
(rev 14216)
+++ trunk/blender/source/blender/src/editmesh_mods.c    2008-03-23 16:27:34 UTC 
(rev 14217)
@@ -2517,7 +2517,6 @@
        BIF_undo_push("Reveal");
 }
 
-/* TODO - improve this with sync sel and selection flushing */
 void hide_tface_uv(int swap)
 {
        EditMesh *em = G.editMesh;
@@ -2536,11 +2535,39 @@
                for (efa= em->faces.first; efa; efa= efa->next) {
                        if(efa->f & SELECT) {
                                tface= CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
-                               if((tface->flag & 
(TF_SEL1|TF_SEL2|TF_SEL3))==0) {
-                                       if(!efa->v4)
-                                               EM_select_face(efa, 0);
-                                       else if(!(tface->flag & TF_SEL4))
-                                               EM_select_face(efa, 0);
+                               if (G.sima->flag & SI_SELACTFACE) {
+                                       /* Pretend face mode */
+                                       if ((   (efa->v4==NULL && 
+                                                       (       tface->flag & 
(TF_SEL1|TF_SEL2|TF_SEL3)) ==                     (TF_SEL1|TF_SEL2|TF_SEL3) )   
                   ||
+                                                       (       tface->flag & 
(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) ==     (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)     
  ) == 0) {
+                                               
+                                               if (G.scene->selectmode == 
SCE_SELECT_FACE) {
+                                                       efa->f &= ~SELECT;
+                                                       /* must re-select after 
*/
+                                                       efa->e1->f &= ~SELECT;
+                                                       efa->e2->f &= ~SELECT;
+                                                       efa->e3->f &= ~SELECT;
+                                                       if(efa->e4) efa->e4->f 
&= ~SELECT;
+                                               } else {
+                                                       EM_select_face(efa, 0);
+                                               }
+                                       }
+                                       tface->flag &= 
~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+                               } else if (G.scene->selectmode == 
SCE_SELECT_FACE) {
+                                       if((tface->flag & 
(TF_SEL1|TF_SEL2|TF_SEL3))==0) {
+                                               if(!efa->v4)
+                                                       EM_select_face(efa, 0);
+                                               else if(!(tface->flag & 
TF_SEL4))
+                                                       EM_select_face(efa, 0);
+                                               tface->flag &= 
~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+                                       }
+                               } else {
+                                       /* EM_deselect_flush will deselect the 
face */
+                                       if((tface->flag & TF_SEL1)==0)          
                efa->v1->f &= ~SELECT;
+                                       if((tface->flag & TF_SEL2)==0)          
                efa->v2->f &= ~SELECT;
+                                       if((tface->flag & TF_SEL3)==0)          
                efa->v3->f &= ~SELECT;
+                                       if((efa->v4) && (tface->flag & 
TF_SEL4)==0)     efa->v4->f &= ~SELECT;                  
+                                       tface->flag &= 
~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
                                }
                        }
                }
@@ -2548,16 +2575,57 @@
                for (efa= em->faces.first; efa; efa= efa->next) {
                        if(efa->f & SELECT) {
                                tface= CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
-                               if(tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
-                                       EM_select_face(efa, 0);
-                               else if(efa->v4 && tface->flag & TF_SEL4)
-                                       EM_select_face(efa, 0);
+                               if (G.sima->flag & SI_SELACTFACE) {
+                                       if (    (efa->v4==NULL && 
+                                                       (       tface->flag & 
(TF_SEL1|TF_SEL2|TF_SEL3)) ==                     (TF_SEL1|TF_SEL2|TF_SEL3) )   
                   ||
+                                                       (       tface->flag & 
(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) ==     (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)     
  ) {
+                                               
+                                               if (G.scene->selectmode == 
SCE_SELECT_FACE) {
+                                                       efa->f &= ~SELECT;
+                                                       /* must re-select after 
*/
+                                                       efa->e1->f &= ~SELECT;
+                                                       efa->e2->f &= ~SELECT;
+                                                       efa->e3->f &= ~SELECT;
+                                                       if(efa->e4) efa->e4->f 
&= ~SELECT;
+                                               } else {
+                                                       EM_select_face(efa, 0);
+                                               }
+                                       }
+                                       tface->flag &= 
~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+                               } else if (G.scene->selectmode == 
SCE_SELECT_FACE) {
+                                       if(tface->flag & 
(TF_SEL1|TF_SEL2|TF_SEL3))
+                                               EM_select_face(efa, 0);
+                                       else if(efa->v4 && tface->flag & 
TF_SEL4)
+                                               EM_select_face(efa, 0);
+                                       tface->flag &= 
~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+                               } else {
+                                       /* EM_deselect_flush will deselect the 
face */
+                                       if(tface->flag & TF_SEL1)               
                efa->v1->f &= ~SELECT;
+                                       if(tface->flag & TF_SEL2)               
                efa->v2->f &= ~SELECT;
+                                       if(tface->flag & TF_SEL3)               
                efa->v3->f &= ~SELECT;
+                                       if((efa->v4) && tface->flag & TF_SEL4)  
efa->v4->f &= ~SELECT;
+                                       tface->flag &= 
~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+                               }
                        }
                }
        }
        
+       
        /*deselects too many but ok for now*/
-       EM_deselect_flush();
+       if(G.scene->selectmode & (SCE_SELECT_EDGE|SCE_SELECT_VERTEX)) {
+               EM_deselect_flush();
+       }
+       
+       if (G.scene->selectmode==SCE_SELECT_FACE) {
+               /* de-selected all edges from faces that were de-selected.
+                * now make sure all faces that are selected also have selected 
edges */
+               for (efa= em->faces.first; efa; efa= efa->next) {
+                       if (efa->f & SELECT) {
+                               EM_select_face(efa, 1);
+                       }
+               }
+       }
+       
        EM_validate_selections();
        
        BIF_undo_push("Hide UV");
@@ -2579,18 +2647,93 @@
                return;
        }
        
-       for (efa= em->faces.first; efa; efa= efa->next) {
-               if (!(efa->h)) {
-                       if (!(efa->f & SELECT)) {
+       if (G.sima->flag & SI_SELACTFACE) {
+               if (G.scene->selectmode == SCE_SELECT_FACE) {
+                       for (efa= em->faces.first; efa; efa= efa->next) {
+                               if (!(efa->h) && !(efa->f & SELECT)) {
+                                       tface= CustomData_em_get(&em->fdata, 
efa->data, CD_MTFACE);
+                                       efa->f |= SELECT;
+                                       tface->flag |= 
TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4;
+                               }
+                       }
+               } else {
+                       /* enable adjacent faces to have disconnected UV 
selections if sticky is disabled */
+                       if (G.sima->sticky == SI_STICKY_DISABLE) {
+                               for (efa= em->faces.first; efa; efa= efa->next) 
{
+                                       if (!(efa->h) && !(efa->f & SELECT)) {
+                                               /* All verts must be unselected 
for the face to be selected in the UV view */
+                                               if ((efa->v1->f&SELECT)==0 && 
(efa->v2->f&SELECT)==0 && (efa->v3->f&SELECT)==0 && (efa->v4==0 || 
(efa->v4->f&SELECT)==0)) {
+                                                       tface= 
CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+                                                       tface->flag |= 
TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4;
+                                                       /* Cant use 
EM_select_face here because it unselects the verts
+                                                        * and we cant tell if 
the face was totally unselected or not */
+                                                       /*EM_select_face(efa, 
1);
+                                                        * 
+                                                        * See Loop with 
EM_select_face() below... */
+                                                       efa->f |= SELECT;
+                                               }
+                                       }
+                               }
+                       } else {
+                               for (efa= em->faces.first; efa; efa= efa->next) 
{
+                                       if (!(efa->h) && !(efa->f & SELECT)) {
+                                               tface= 
CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+                                               if ((efa->v1->f & SELECT)==0)   
                        {tface->flag |= TF_SEL1;}
+                                               if ((efa->v2->f & SELECT)==0)   
                        {tface->flag |= TF_SEL2;}
+                                               if ((efa->v3->f & SELECT)==0)   
                        {tface->flag |= TF_SEL3;}
+                                               if ((efa->v4 && (efa->v4->f & 
SELECT)==0))      {tface->flag |= TF_SEL4;}
+                                               efa->f |= SELECT;
+                                       }
+                               }
+                       }
+                       
+                       /* Select all edges and verts now */
+                       for (efa= em->faces.first; efa; efa= efa->next) {
+                               /* we only selected the face flags, and didnt 
changes edges or verts, fix this now */
+                               if (!(efa->h) && (efa->f & SELECT)) {
+                                       EM_select_face(efa, 1);
+                               }
+                       }
+                       EM_select_flush();
+               }
+       } else if (G.scene->selectmode == SCE_SELECT_FACE) {
+               for (efa= em->faces.first; efa; efa= efa->next) {
+                       if (!(efa->h) && !(efa->f & SELECT)) {
+                               tface= CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
+                               efa->f |= SELECT;
+                               tface->flag |= TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4;
+                       }
+               }
+               
+               /* Select all edges and verts now */
+               for (efa= em->faces.first; efa; efa= efa->next) {
+                       /* we only selected the face flags, and didnt changes 
edges or verts, fix this now */
+                       if (!(efa->h) && (efa->f & SELECT)) {
                                EM_select_face(efa, 1);
+                       }
+               }
+               
+       } else {
+               for (efa= em->faces.first; efa; efa= efa->next) {
+                       if (!(efa->h) && !(efa->f & SELECT)) {
                                tface= CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
-                               tface->flag |= 
(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+                               if ((efa->v1->f & SELECT)==0)                   
        {tface->flag |= TF_SEL1;}
+                               if ((efa->v2->f & SELECT)==0)                   
        {tface->flag |= TF_SEL2;}
+                               if ((efa->v3->f & SELECT)==0)                   
        {tface->flag |= TF_SEL3;}
+                               if ((efa->v4 && (efa->v4->f & SELECT)==0))      
{tface->flag |= TF_SEL4;}
+                               efa->f |= SELECT;
                        }
                }
+               
+               /* Select all edges and verts now */
+               for (efa= em->faces.first; efa; efa= efa->next) {
+                       /* we only selected the face flags, and didnt changes 
edges or verts, fix this now */
+                       if (!(efa->h) && (efa->f & SELECT)) {
+                               EM_select_face(efa, 1);
+                       }
+               }
        }
        
-       EM_selectmode_flush();
-       
        BIF_undo_push("Reveal UV");
        
        object_tface_flags_changed(OBACT, 0);


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

Reply via email to