[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45603] trunk/blender/source/blender: fix for editmode UV hiding with edges, was also using deprecated flag ( UV_SELECT_FACE)

Campbell Barton ideasman42 at gmail.com
Fri Apr 13 15:31:42 CEST 2012


Revision: 45603
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45603
Author:   campbellbarton
Date:     2012-04-13 13:31:41 +0000 (Fri, 13 Apr 2012)
Log Message:
-----------
fix for editmode UV hiding with edges, was also using deprecated flag (UV_SELECT_FACE)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
    trunk/blender/source/blender/makesdna/DNA_space_types.h

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2012-04-13 12:58:12 UTC (rev 45602)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2012-04-13 13:31:41 UTC (rev 45603)
@@ -2979,6 +2979,27 @@
 
 /********************** hide operator *********************/
 
+/* check if we are selected or unselected based on 'bool_test' arg,
+ * needed for select swap support */
+#define UV_SEL_TEST(luv, bool_test) ((((luv)->flag & MLOOPUV_VERTSEL) == MLOOPUV_VERTSEL) == bool_test)
+
+/* is every UV vert selected or unselected depending on bool_test */
+static int bm_face_is_all_uv_sel(BMesh *bm, BMFace *f, int bool_test)
+{
+	BMLoop *l_iter;
+	BMLoop *l_first;
+
+	l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+	do {
+		MLoopUV *luv = CustomData_bmesh_get(&bm->ldata, l_iter->head.data, CD_MLOOPUV);
+		if (!UV_SEL_TEST(luv, bool_test)) {
+			return FALSE;
+		}
+	} while ((l_iter = l_iter->next) != l_first);
+
+	return TRUE;
+}
+
 static int hide_exec(bContext *C, wmOperator *op)
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
@@ -2993,7 +3014,7 @@
 	MTexPoly *tf;
 	int swap = RNA_boolean_get(op->ptr, "unselected");
 	Image *ima = sima ? sima->image : NULL;
-	int facemode = sima ? sima->flag & SI_SELACTFACE : 0;
+	int facemode = (ts->uv_selectmode == UV_SELECT_FACE);
 
 	if (ts->uv_flag & UV_SYNC_SELECTION) {
 		EDBM_mesh_hide(em, swap);
@@ -3002,10 +3023,6 @@
 		return OPERATOR_FINISHED;
 	}
 
-	/* check if we are selected or unselected based on 'bool_test' arg,
-	 * needed for select swap support */
-#define UV_SEL_TEST(luv, bool_test) ((((luv)->flag & MLOOPUV_VERTSEL) == MLOOPUV_VERTSEL) == bool_test)
-
 	BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
 		int hide = 0;
 
@@ -3018,39 +3035,42 @@
 		BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
 			luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 
-			if (luv->flag & MLOOPUV_VERTSEL) {
+			if (UV_SEL_TEST(luv, !swap)) {
 				hide = 1;
 				break;
 			}
 		}
 
-		if (swap)
-			hide = !hide;
-
 		if (hide) {
+			/* note, a special case for edges could be used,
+			 * for now edges act like verts and get flushed */
 			if (facemode) {
-				/* check that every UV is selected */
-				luv = NULL;
-				BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
-					luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
-					if (!UV_SEL_TEST(luv, !swap)) {
-						break;
+				if (em->selectmode == SCE_SELECT_FACE) {
+					/* check that every UV is selected */
+					if (bm_face_is_all_uv_sel(em->bm, efa, TRUE) == !swap) {
+						BM_elem_select_set(em->bm, efa, FALSE);
 					}
+					uvedit_face_deselect(scene, em, efa);
 				}
+				else {
+					if (bm_face_is_all_uv_sel(em->bm, efa, TRUE) == !swap) {
+						BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+							luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+							if (UV_SEL_TEST(luv, !swap)) {
+								BM_elem_select_set(em->bm, l->v, FALSE);
+							}
+						}
+					}
+					if (!swap) uvedit_face_deselect(scene, em, efa);
 
-				if (!luv) {
-					BM_elem_select_set(em->bm, efa, FALSE);
-					uvedit_face_deselect(scene, em, efa);
+
 				}
 			}
 			else if (em->selectmode == SCE_SELECT_FACE) {
-				/*check if a UV is selected*/
-				BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
-					luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
-					if (UV_SEL_TEST(luv, !swap)) {
-						BM_elem_select_set(em->bm, efa, FALSE);
-					}
-					if (!swap) luv->flag &= ~MLOOPUV_VERTSEL;
+				/* check if a UV is de-selected */
+				if (bm_face_is_all_uv_sel(em->bm, efa, FALSE) != !swap) {
+					BM_elem_select_set(em->bm, efa, FALSE);
+					uvedit_face_deselect(scene, em, efa);
 				}
 			}
 			else {
@@ -3064,12 +3084,10 @@
 			}
 		}
 	}
-	
-#undef UV_SEL_TEST
 
 	/* flush vertex selection changes */
-	if (!facemode && em->selectmode != SCE_SELECT_FACE)
-		EDBM_selectmode_flush(em);
+	if (em->selectmode != SCE_SELECT_FACE)
+		EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX | SCE_SELECT_EDGE);
 	
 	EDBM_editselection_validate(em);
 	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
@@ -3077,6 +3095,8 @@
 	return OPERATOR_FINISHED;
 }
 
+#undef UV_SEL_TEST
+
 static void UV_OT_hide(wmOperatorType *ot)
 {
 	/* identifiers */
@@ -3106,7 +3126,7 @@
 	BMLoop *l;
 	BMIter iter, liter;
 	MLoopUV *luv;
-	int facemode = sima ? sima->flag & SI_SELACTFACE : 0;
+	int facemode = (ts->uv_selectmode == UV_SELECT_FACE);
 	int stickymode = sima ? (sima->sticky != SI_STICKY_DISABLE) : 1;
 
 	/* note on tagging, selecting faces needs to be delayed so it doesn't select the verts and

Modified: trunk/blender/source/blender/makesdna/DNA_space_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_space_types.h	2012-04-13 12:58:12 UTC (rev 45602)
+++ trunk/blender/source/blender/makesdna/DNA_space_types.h	2012-04-13 13:31:41 UTC (rev 45603)
@@ -705,7 +705,7 @@
 #define SI_DRAWTOOL		(1<<3)
 #define SI_NO_DRAWFACES	(1<<4)
 #define SI_DRAWSHADOW   (1<<5)
-#define SI_SELACTFACE   (1<<6)	/* deprecated */
+/* #define SI_SELACTFACE   (1<<6) */ /* deprecated */
 #define SI_DEPRECATED2	(1<<7)
 #define SI_DEPRECATED3  (1<<8)	/* stick UV selection to mesh vertex (UVs wont always be touching) */
 #define SI_COORDFLOATS  (1<<9)




More information about the Bf-blender-cvs mailing list