Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2008-03-23 19:27:34 +0300
committerCampbell Barton <ideasman42@gmail.com>2008-03-23 19:27:34 +0300
commit096fcb3c8fab2fdf989fcb20e74f07ecbc318aaa (patch)
treebcf6bf8f4d0820df8eb7e361863f120ed288157f /source/blender/src/editmesh_mods.c
parent4a6d75af27693cdeee84b2a4862d68b287c0b812 (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.c177
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);