[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56197] trunk/blender/source/blender/ editors: revision r56196 adding uv select more/less used 4 nested 'for' loops,

Campbell Barton ideasman42 at gmail.com
Mon Apr 22 08:02:37 CEST 2013


Revision: 56197
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56197
Author:   campbellbarton
Date:     2013-04-22 06:02:30 +0000 (Mon, 22 Apr 2013)
Log Message:
-----------
revision r56196 adding uv select more/less used 4 nested 'for' loops, 
rewrite to use only 2.

also use generic, reusable functions for selection flushing so each operator doesn't need to implement its own.
and merge more-less operation into the same function, just call the selection flush function with select/deselect arg.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56196

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_uvedit.h
    trunk/blender/source/blender/editors/uvedit/uvedit_ops.c

Modified: trunk/blender/source/blender/editors/include/ED_uvedit.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_uvedit.h	2013-04-22 03:08:56 UTC (rev 56196)
+++ trunk/blender/source/blender/editors/include/ED_uvedit.h	2013-04-22 06:02:30 UTC (rev 56197)
@@ -64,11 +64,11 @@
 int  uvedit_edge_select_test(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
 int  uvedit_uv_select_test(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
 
-int  uvedit_face_select_enable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const short do_history);
+int  uvedit_face_select_enable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const bool do_history);
 int  uvedit_face_select_disable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
-void uvedit_edge_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const short do_history);
+void uvedit_edge_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool do_history);
 void uvedit_edge_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-void uvedit_uv_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const short do_history);
+void uvedit_uv_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool do_history);
 void uvedit_uv_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
 
 int ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima,

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2013-04-22 03:08:56 UTC (rev 56196)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2013-04-22 06:02:30 UTC (rev 56197)
@@ -84,6 +84,8 @@
 #include "uvedit_intern.h"
 
 static void uv_select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action);
+static void uv_select_flush_from_tag_face(SpaceImage *sima, Scene *scene, Object *obedit, bool select);
+static void uv_select_flush_from_tag_loop(SpaceImage *sima, Scene *scene, Object *obedit, bool select);
 
 /************************* state testing ************************/
 
@@ -366,7 +368,7 @@
 	}
 }
 
-int uvedit_face_select_enable(Scene *scene, BMEditMesh *em, BMFace *efa, const short do_history)
+int uvedit_face_select_enable(Scene *scene, BMEditMesh *em, BMFace *efa, const bool do_history)
 {
 	ToolSettings *ts = scene->toolsettings;
 
@@ -445,7 +447,7 @@
 	}
 }
 
-void uvedit_edge_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history)
+void uvedit_edge_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const bool do_history)
 
 {
 	ToolSettings *ts = scene->toolsettings;
@@ -520,7 +522,7 @@
 	}
 }
 
-void uvedit_uv_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history)
+void uvedit_uv_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const bool do_history)
 {
 	ToolSettings *ts = scene->toolsettings;
 
@@ -1321,50 +1323,8 @@
 	return NULL;
 }
 
-/* ******************** select more ******************** */
-static void uv_tag_sticky_flush(Scene *scene, Image *ima, BMLoop *l_start, eSpaceImage_Sticky sticky,
-                                const int cd_loop_uv_offset, const int cd_poly_tex_offset)
+static int uv_select_more_less(bContext *C, const bool select)
 {
-	BMIter iter;
-	BMLoop *l;
-	MTexPoly *tf;
-	MLoopUV *luv;
-
-	BM_elem_flag_enable(l_start, BM_ELEM_TAG);
-
-	switch (sticky) {
-		case SI_STICKY_LOC:
-			luv = BM_ELEM_CD_GET_VOID_P(l_start, cd_loop_uv_offset);
-
-			BM_ITER_ELEM (l, &iter, l_start->v, BM_LOOPS_OF_VERT) {
-				tf = BM_ELEM_CD_GET_VOID_P(l->f, cd_poly_tex_offset);
-
-				if (uvedit_face_visible_test(scene, ima, l->f, tf)) {
-					MLoopUV *luv_other;
-					luv_other = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-
-					if (compare_v2v2(luv->uv, luv_other->uv, STD_UV_CONNECT_LIMIT)) {
-						BM_elem_flag_enable(l, BM_ELEM_TAG);
-					}
-				}
-			}
-			break;
-		case SI_STICKY_VERTEX:
-			BM_ITER_ELEM (l, &iter, l_start->v, BM_LOOPS_OF_VERT) {
-				tf = BM_ELEM_CD_GET_VOID_P(l->f, cd_poly_tex_offset);
-
-				if (uvedit_face_visible_test(scene, ima, l->f, tf)) {
-					BM_elem_flag_enable(l, BM_ELEM_TAG);
-				}
-			}
-			break;
-		case SI_STICKY_DISABLE:
-			break;
-	}
-}
-
-static int uv_select_more_exec(bContext *C, wmOperator *UNUSED(op))
-{
 	Scene *scene = CTX_data_scene(C);
 	Object *obedit = CTX_data_edit_object(C);
 	Image *ima = CTX_data_edit_image(C);
@@ -1372,59 +1332,96 @@
 	BMEditMesh *em = BKE_editmesh_from_object(obedit);
 
 	BMFace *efa;
-	BMLoop *l, *lf;
-	BMIter iter, liter, fiter;
+	BMLoop *l;
+	BMIter iter, liter;
 	ToolSettings *ts = scene->toolsettings;
-	eSpaceImage_Sticky sticky = sima->sticky;
 
 	const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
 	const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
 
 	if (ts->uv_flag & UV_SYNC_SELECTION) {
-		EDBM_select_more(em);
+		if (select) {
+			EDBM_select_more(em);
+		}
+		else {
+			EDBM_select_less(em);
+		}
+
 		WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
 		return OPERATOR_FINISHED;
 	}
 
-	/* clear tags */
-	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-		BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-			BM_elem_flag_disable(l->next, BM_ELEM_TAG);
+	if (ts->uv_selectmode == UV_SELECT_FACE) {
+
+		/* clear tags */
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			BM_elem_flag_disable(efa, BM_ELEM_TAG);
 		}
-	}
 
-	/* mark loops to be selected */
-	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-		MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+		/* mark loops to be selected */
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
 
-		if (uvedit_face_visible_test(scene, ima, efa, tf)) {
-			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+			if (uvedit_face_visible_test(scene, ima, efa, tf)) {
 
-				MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+#define IS_SEL   1
+#define IS_UNSEL 2
 
-				if (luv->flag & MLOOPUV_VERTSEL) {
-					if (ts->uv_selectmode == UV_SELECT_FACE) {
-						BM_ITER_ELEM (lf, &fiter, l->f, BM_LOOPS_OF_FACE) {
-							uv_tag_sticky_flush(scene, ima, lf, sticky, cd_loop_uv_offset, cd_poly_tex_offset);
-						}
+				int sel_state = 0;
+
+				BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+					MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+					if (luv->flag & MLOOPUV_VERTSEL) {
+						sel_state |= IS_SEL;
 					}
 					else {
-						uv_tag_sticky_flush(scene, ima, l->next, sticky, cd_loop_uv_offset, cd_poly_tex_offset);
+						sel_state |= IS_UNSEL;
+					}
 
-						uv_tag_sticky_flush(scene, ima, l->prev, sticky, cd_loop_uv_offset, cd_poly_tex_offset);
+					/* if we have a mixed selection, tag to grow it */
+					if (sel_state == (IS_SEL | IS_UNSEL)) {
+						BM_elem_flag_enable(efa, BM_ELEM_TAG);
+						break;
 					}
 				}
+
+#undef IS_SEL
+#undef IS_UNSEL
+
 			}
 		}
+
+		/* select tagged faces */
+		uv_select_flush_from_tag_face(sima, scene, obedit, select);
 	}
+	else {
 
-	/* select tagged loops */
-	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-		BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-			if (BM_elem_flag_test(l, BM_ELEM_TAG)) {
-				uvedit_uv_select_enable(em, scene, l, FALSE);
+		/* clear tags */
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+				BM_elem_flag_disable(l, BM_ELEM_TAG);
 			}
 		}
+
+		/* mark loops to be selected */
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+
+			if (uvedit_face_visible_test(scene, ima, efa, tf)) {
+				BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+
+					MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+
+					if (((luv->flag & MLOOPUV_VERTSEL) != 0) == select) {
+						BM_elem_flag_enable(l->next, BM_ELEM_TAG);
+						BM_elem_flag_enable(l->prev, BM_ELEM_TAG);
+					}
+				}
+			}
+		}
+
+		/* select tagged loops */
+		uv_select_flush_from_tag_loop(sima, scene, obedit, select);
 	}
 
 	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
@@ -1432,6 +1429,11 @@
 	return OPERATOR_FINISHED;
 }
 
+static int uv_select_more_exec(bContext *C, wmOperator *UNUSED(op))
+{
+	return uv_select_more_less(C, true);
+}
+
 static void UV_OT_select_more(wmOperatorType *ot)
 {
 	/* identifiers */
@@ -1445,76 +1447,9 @@
 	ot->poll = ED_operator_uvedit;
 }
 
-/* ******************** select less ******************** */
 static int uv_select_less_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	Scene *scene = CTX_data_scene(C);
-	Object *obedit = CTX_data_edit_object(C);
-	Image *ima = CTX_data_edit_image(C);
-	SpaceImage *sima = CTX_wm_space_image(C);
-	BMEditMesh *em = BKE_editmesh_from_object(obedit);
-
-	BMFace *efa;
-	BMLoop *l;
-	BMIter iter, liter;
-	eSpaceImage_Sticky sticky = sima->sticky;
-
-	ToolSettings *ts = scene->toolsettings;
-
-	const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
-	const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
-
-	if (ts->uv_flag & UV_SYNC_SELECTION) {
-		EDBM_select_less(em);
-		WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
-		return OPERATOR_FINISHED;
-	}
-
-	/* clear tags */
-	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-		BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-			BM_elem_flag_disable(l->next, BM_ELEM_TAG);
-		}
-	}
-
-	/* mark loops to be deselected */
-	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-		MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
-
-		if (uvedit_face_visible_test(scene, ima, efa, tf)) {
-			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-				MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-
-				if (luv->flag & MLOOPUV_VERTSEL) {
-					MLoopUV *luv_next;
-					MLoopUV *luv_prev;
-
-					luv_next = BM_ELEM_CD_GET_VOID_P(l->next, cd_loop_uv_offset);
-					if (!(luv_next->flag & MLOOPUV_VERTSEL)) {
-						uv_tag_sticky_flush(scene, ima, l, sticky, cd_loop_uv_offset, cd_poly_tex_offset);
-					}
-
-					luv_prev = BM_ELEM_CD_GET_VOID_P(l->prev, cd_loop_uv_offset);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list