[Bf-blender-cvs] [8650a73] soc-2016-uv_tools: Implemented "real" hiding of UV elements

Phil Gosch noreply at git.blender.org
Tue Jun 14 11:33:10 CEST 2016


Commit: 8650a733fc26e912bac6b0dba7e00210d9c0ba73
Author: Phil Gosch
Date:   Tue Jun 14 11:32:29 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rB8650a733fc26e912bac6b0dba7e00210d9c0ba73

Implemented "real" hiding of UV elements

Previously it wasn't possible to hide elements without altering the BMesh selection state

ToDo: Make UV operators ignore hidden elements

===================================================================

M	source/blender/editors/uvedit/uvedit_draw.c
M	source/blender/editors/uvedit/uvedit_intern.h
M	source/blender/editors/uvedit/uvedit_ops.c
M	source/blender/makesdna/DNA_meshdata_types.h

===================================================================

diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index 94d69a0..507d514 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -222,7 +222,9 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
 						glBegin(GL_POLYGON);
 						BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 							luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-							glVertex2fv(luv->uv);
+							if (!(luv->flag & MLOOPUV_HIDDEN)) {
+								glVertex2fv(luv->uv);
+							}
 						}
 						glEnd();
 					}
@@ -260,7 +262,9 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
 						glBegin(GL_POLYGON);
 						BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 							luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-							glVertex2fv(luv->uv);
+							if (!(luv->flag & MLOOPUV_HIDDEN)) {
+								glVertex2fv(luv->uv);
+							}
 						}
 						glEnd();
 					}
@@ -323,10 +327,12 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
 					glBegin(GL_POLYGON);
 					BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
 						luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-						a = fabsf(uvang[i] - ang[i]) / (float)M_PI;
-						weight_to_rgb(col, 1.0f - pow2f(1.0f - a));
-						glColor3fv(col);
-						glVertex2fv(luv->uv);
+						if (!(luv->flag & MLOOPUV_HIDDEN)) {
+							a = fabsf(uvang[i] - ang[i]) / (float)M_PI;
+							weight_to_rgb(col, 1.0f - pow2f(1.0f - a));
+							glColor3fv(col);
+							glVertex2fv(luv->uv);
+						}
 					}
 					glEnd();
 				}
@@ -359,7 +365,9 @@ static void draw_uvs_lineloop_bmface(BMFace *efa, const int cd_loop_uv_offset)
 	glBegin(GL_LINE_LOOP);
 	BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 		luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-		glVertex2fv(luv->uv);
+		if (!(luv->flag & MLOOPUV_HIDDEN)) {
+			glVertex2fv(luv->uv);
+		}
 	}
 	glEnd();
 }
@@ -372,7 +380,7 @@ static void draw_uvs_lineloop_mpoly(Mesh *me, MPoly *mpoly)
 	glBegin(GL_LINE_LOOP);
 	mloopuv = &me->mloopuv[mpoly->loopstart];
 	for (i = mpoly->totloop; i != 0; i--, mloopuv++) {
-		glVertex2fv(mloopuv->uv);
+		glVertex2fv(mloopuv->uv); /* We don't check MLOOPUV_HIDDEN here since we always want to see other UVs */
 	}
 	glEnd();
 }
@@ -525,7 +533,9 @@ static void draw_uvs_looptri(BMEditMesh *em, unsigned int *r_loop_index, const i
 		unsigned int j;
 		for (j = 0; j < 3; j++) {
 			MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(em->looptris[i][j], cd_loop_uv_offset);
-			glVertex2fv(luv->uv);
+			if (!(luv->flag & MLOOPUV_HIDDEN)) {
+				glVertex2fv(luv->uv);
+			}
 		}
 		i++;
 	} while (i != em->tottri && (f == em->looptris[i][0]->f));
@@ -801,7 +811,9 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
 							glColor4ubv(sel ? (GLubyte *)col1 : (GLubyte *)col2);
 
 							luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-							glVertex2fv(luv->uv);
+							if (!(luv->flag & MLOOPUV_HIDDEN)) {
+								glVertex2fv(luv->uv);
+							}
 						}
 						glEnd();
 					}
@@ -819,9 +831,13 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
 								lastsel = sel;
 							}
 							luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-							glVertex2fv(luv->uv);
+							if (!(luv->flag & MLOOPUV_HIDDEN)) {
+								glVertex2fv(luv->uv);
+							}
 							luv = BM_ELEM_CD_GET_VOID_P(l->next, cd_loop_uv_offset);
-							glVertex2fv(luv->uv);
+							if (!(luv->flag & MLOOPUV_HIDDEN)) {
+								glVertex2fv(luv->uv);
+							}
 						}
 						glEnd();
 					}
@@ -862,9 +878,13 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
 			if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
 				continue;
 
+			tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+
 			if (!uvedit_face_select_test(scene, efa, cd_loop_uv_offset)) {
-				uv_poly_center(efa, cent, cd_loop_uv_offset);
-				glVertex2fv(cent);
+				if (uv_poly_visible(efa, cd_loop_uv_offset)) {
+					uv_poly_center(efa, cent, cd_loop_uv_offset);
+					glVertex2fv(cent); 
+				}
 			}
 		}
 
@@ -875,9 +895,13 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
 			if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
 				continue;
 
+			tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+
 			if (uvedit_face_select_test(scene, efa, cd_loop_uv_offset)) {
-				uv_poly_center(efa, cent, cd_loop_uv_offset);
-				glVertex2fv(cent);
+				if (uv_poly_visible(efa, cd_loop_uv_offset)) {
+					uv_poly_center(efa, cent, cd_loop_uv_offset);
+					glVertex2fv(cent); 
+				}
 			}
 		}
 
@@ -899,7 +923,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
 
 			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 				luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-				if (!uvedit_uv_select_test(scene, l, cd_loop_uv_offset))
+				if (!uvedit_uv_select_test(scene, l, cd_loop_uv_offset) && !(luv->flag & MLOOPUV_HIDDEN))
 					glVertex2fv(luv->uv);
 			}
 		}
@@ -918,7 +942,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
 			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 				luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
 
-				if (luv->flag & MLOOPUV_PINNED)
+				if (luv->flag & MLOOPUV_PINNED && !(luv->flag & MLOOPUV_HIDDEN))
 					glVertex2fv(luv->uv);
 			}
 		}
@@ -936,7 +960,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
 			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 				luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
 
-				if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset))
+				if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset) && !(luv->flag & MLOOPUV_HIDDEN))
 					glVertex2fv(luv->uv);
 			}
 		}
diff --git a/source/blender/editors/uvedit/uvedit_intern.h b/source/blender/editors/uvedit/uvedit_intern.h
index d5655e3..b16f94a 100644
--- a/source/blender/editors/uvedit/uvedit_intern.h
+++ b/source/blender/editors/uvedit/uvedit_intern.h
@@ -48,6 +48,7 @@ bool uvedit_face_visible_nolocal(struct Scene *scene, struct BMFace *efa);
 /* geometric utilities */
 void  uv_poly_copy_aspect(float uv_orig[][2], float uv[][2], float aspx, float aspy, int len);
 void  uv_poly_center(struct BMFace *f, float r_cent[2], const int cd_loop_uv_offset);
+bool  uv_poly_visible(struct BMFace *f, const int cd_loop_uv_offset);
 
 /* find nearest */
 
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index a8c052c..e510782 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -631,6 +631,24 @@ void uv_poly_center(BMFace *f, float r_cent[2], const int cd_loop_uv_offset)
 	mul_v2_fl(r_cent, 1.0f / (float)f->len);
 }
 
+bool uv_poly_visible(BMFace *f, const int cd_loop_uv_offset)
+{
+	BMLoop *l;
+	MLoopUV *luv;
+	BMIter liter;
+	bool visible = false;
+
+	BM_ITER_ELEM(l, &liter, f, BM_LOOPS_OF_FACE) {
+		luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+		if (!(luv->flag & MLOOPUV_HIDDEN)) {
+			visible = true;
+			break;
+		}
+	}
+
+	return visible;
+}
+
 void uv_poly_copy_aspect(float uv_orig[][2], float uv[][2], float aspx, float aspy, int len)
 {
 	int i;
@@ -3922,61 +3940,14 @@ static int uv_hide_exec(bContext *C, wmOperator *op)
 
 		BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 			luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-
-			if (UV_SEL_TEST(luv, !swap)) {
-				hide = 1;
-				break;
-			}
-		}
-
-		if (hide) {
-			/* note, a special case for edges could be used,
-			 * for now edges act like verts and get flushed */
-			if (use_face_center) {
-				if (em->selectmode == SCE_SELECT_FACE) {
-					/* check that every UV is selected */
-					if (bm_face_is_all_uv_sel(efa, true, cd_loop_uv_offset) == !swap) {
-						BM_face_select_set(em->bm, efa, false);
-					}
-					uvedit_face_select_disable(scene, em, efa, cd_loop_uv_offset);
-				}
-				else {
-					if (bm_face_is_all_uv_sel(efa, true, cd_loop_uv_offset) == !swap) {
-						BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-							luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-							if (UV_SEL_TEST(luv, !swap)) {
-								BM_vert_select_set(em->bm, l->v, false);
-							}
-						}
-					}
-					if (!swap) uvedit_face_select_disable(scene, em, efa, cd_loop_uv_offset);
-				}
-			}
-			else if (em->selectmode == SCE_SELECT_FACE) {
-				/* check if a UV is de-selected */
-				if (bm_face_is_all_uv_sel(efa, false, cd_loop_uv_offset) != !swap) {
-					BM_face_select_set(em->bm, efa, false);
-					uvedit_face_select_disable(scene, em, efa, cd_loop_uv_offset);
-				}
-			}
-			else {
-				BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-					luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-					if (UV_SEL_TEST(luv, !swap)) {
-						BM_vert_select_set(em->bm, l->v, false);
-						if (!swap) luv->flag &= ~MLOOPUV_VERTSEL;
-					}
-				}
+			if ((luv->flag & MLOOPUV_VERTSEL && !swap) || (!(luv->flag & MLOOPUV_VERTSEL) && swap)) {
+				luv->flag |= MLOOPUV_HIDDEN;
 			}
 		}
 	}
-
-	/* flush vertex selection changes */
-	if (em->selectmode != SCE_SELECT_FACE)
-		EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX | SCE_SELECT_EDGE);
 	
 	BM_select_history_validate(em->bm);
-	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+	WM_event_add_notifier(C, NC_GEOM | ND_SELECT | ND_DATA, obedit->data);
 
 	return OPERATOR_FINISHED;
 }
@@ -4012,14 +3983,9 @@ static int uv_reveal_exec(bContext *C, wmOperator *UNUSED(op))
 	BMLoop *l;
 	BMIter iter, liter;
 	MLoopUV *luv;
-	const int use_face_center = (ts->uv_selectmode == UV_SELECT_FACE);
-	const int stickymode = sima ? (sima->sticky != SI_STICKY_DISABLE) : 1;
 
 	const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
 
-	/* note on tagging, selecting faces needs to be delayed so it doesn't select the verts and
-	 * confuse our checks on selected verts. */
-
 	/* call the mesh function if we are in mesh sync sel */
 	if (ts->uv_flag & UV_SYNC_SELECTION) {
 		EDBM_mesh_reveal(em);
@@ -4027,92 +3993,19 @@ static int uv_reveal_exec(bContext *C, wmOperator *UNUSED(op))
 
 		return OPERATOR_FINISHED;
 	}
-	if (use_face_center) {
-		if (em->s

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list