diff options
author | Campbell Barton <ideasman42@gmail.com> | 2008-03-23 19:27:34 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2008-03-23 19:27:34 +0300 |
commit | 096fcb3c8fab2fdf989fcb20e74f07ecbc318aaa (patch) | |
tree | bcf6bf8f4d0820df8eb7e361863f120ed288157f /source/blender/src/editmesh_mods.c | |
parent | 4a6d75af27693cdeee84b2a4862d68b287c0b812 (diff) |
fixed UV selection hide/reveal in the UV window.
Diffstat (limited to 'source/blender/src/editmesh_mods.c')
-rw-r--r-- | source/blender/src/editmesh_mods.c | 177 |
1 files changed, 160 insertions, 17 deletions
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c index bc1dd4afa8b..a5589ccd9c5 100644 --- a/source/blender/src/editmesh_mods.c +++ b/source/blender/src/editmesh_mods.c @@ -2517,7 +2517,6 @@ void reveal_mesh(void) 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 @@ void hide_tface_uv(int swap) 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 @@ void hide_tface_uv(int swap) 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 @@ void reveal_tface_uv(void) 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); |