[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14217] trunk/blender/source/blender/src/ editmesh_mods.c: fixed UV selection hide/reveal in the UV window.

Campbell Barton ideasman42 at gmail.com
Sun Mar 23 17:27:34 CET 2008


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





More information about the Bf-blender-cvs mailing list