[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45943] trunk/blender/source/blender/ editors: bmesh/uv editor

Campbell Barton ideasman42 at gmail.com
Tue Apr 24 21:28:18 CEST 2012


Revision: 45943
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45943
Author:   campbellbarton
Date:     2012-04-24 19:28:18 +0000 (Tue, 24 Apr 2012)
Log Message:
-----------
bmesh/uv editor
- selecting in UV window with sync-sel enabled now sets/validates sel-history.
- border de-select now clears sel history.

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

Modified: trunk/blender/source/blender/editors/include/ED_uvedit.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_uvedit.h	2012-04-24 19:08:26 UTC (rev 45942)
+++ trunk/blender/source/blender/editors/include/ED_uvedit.h	2012-04-24 19:28:18 UTC (rev 45943)
@@ -64,11 +64,11 @@
 int uvedit_edge_selected(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
 int uvedit_uv_selected(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
 
-int uvedit_face_select(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
+int uvedit_face_select(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const short do_history);
 int uvedit_face_deselect(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
-void uvedit_edge_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+void uvedit_edge_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const short do_history);
 void uvedit_edge_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-void uvedit_uv_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+void uvedit_uv_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const short do_history);
 void uvedit_uv_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
 
 int ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima, float co[2], float uv[2]);

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2012-04-24 19:08:26 UTC (rev 45942)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2012-04-24 19:28:18 UTC (rev 45943)
@@ -84,6 +84,8 @@
 
 #define EFA_F1_FLAG 2
 
+static void select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action);
+
 /************************* state testing ************************/
 
 int ED_uvedit_test(Object *obedit)
@@ -324,12 +326,16 @@
 	}
 }
 
-int uvedit_face_select(Scene *scene, BMEditMesh *em, BMFace *efa)
+int uvedit_face_select(Scene *scene, BMEditMesh *em, BMFace *efa, const short do_history)
 {
 	ToolSettings *ts = scene->toolsettings;
 
-	if (ts->uv_flag & UV_SYNC_SELECTION)
+	if (ts->uv_flag & UV_SYNC_SELECTION) {
 		BM_face_select_set(em->bm, efa, TRUE);
+		if (do_history) {
+			BM_select_history_store(em->bm, (BMElem *)efa);
+		}
+	}
 	else {
 		BMLoop *l;
 		MLoopUV *luv;
@@ -395,7 +401,7 @@
 	}
 }
 
-void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l)
+void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history)
 
 {
 	ToolSettings *ts = scene->toolsettings;
@@ -409,6 +415,10 @@
 			BM_vert_select_set(em->bm, l->e->v1, TRUE);
 			BM_vert_select_set(em->bm, l->e->v2, TRUE);
 		}
+
+		if (do_history) {
+			BM_select_history_store(em->bm, (BMElem *)l->e);
+		}
 	}
 	else {
 		MLoopUV *luv1, *luv2;
@@ -464,7 +474,7 @@
 	}
 }
 
-void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l)
+void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history)
 {
 	ToolSettings *ts = scene->toolsettings;
 
@@ -473,6 +483,10 @@
 			BM_face_select_set(em->bm, l->f, TRUE);
 		else
 			BM_vert_select_set(em->bm, l->v, TRUE);
+
+		if (do_history) {
+			BM_select_history_remove(em->bm, (BMElem *)l->v);
+		}
 	}
 	else {
 		MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
@@ -998,17 +1012,13 @@
 
 	BM_mesh_elem_index_ensure(em->bm, BM_VERT);
 
-	count = 0;
-	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-		if (!extend) {
-			uvedit_face_deselect(scene, em, efa);
-		}
-		
+	if (!extend) {
+		select_all_perform(scene, ima, em, SEL_DESELECT);
+	}
+
+	BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, count) {
 		BMO_elem_flag_disable(em->bm, efa, EFA_F1_FLAG);
-
 		BM_elem_index_set(efa, count); /* set_inline */
-
-		count++;
 	}
 	em->bm->elem_index_dirty &= ~BM_FACE;
 
@@ -1083,7 +1093,7 @@
 			iterv1 = uv_vertex_map_get(vmap, efa, a);
 
 			if (iterv1->flag) {
-				if (select) uvedit_uv_select(em, scene, l);
+				if (select) uvedit_uv_select(em, scene, l, FALSE);
 				else uvedit_uv_deselect(em, scene, l);
 			}
 
@@ -1582,30 +1592,20 @@
 
 /* ******************** (de)select all operator **************** */
 
-static void select_all_perform(bContext *C, int action)
+static void select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action)
 {
-	Scene *scene;
-	ToolSettings *ts;
-	Object *obedit;
-	BMEditMesh *em;
+	ToolSettings *ts = scene->toolsettings;
 	BMFace *efa;
 	BMLoop *l;
 	BMIter iter, liter;
-	Image *ima;
 	MTexPoly *tf;
 	MLoopUV *luv;
-	
-	scene = CTX_data_scene(C);
-	ts = CTX_data_tool_settings(C);
-	obedit = CTX_data_edit_object(C);
-	em = BMEdit_FromObject(obedit);
-	ima = CTX_data_edit_image(C);
-	
+
 	if (ts->uv_flag & UV_SYNC_SELECTION) {
 
 		switch (action) {
 			case SEL_TOGGLE:
-				EDBM_select_toggle_all(BMEdit_FromObject(obedit));
+				EDBM_select_toggle_all(em);
 				break;
 			case SEL_SELECT:
 				EDBM_flag_enable_all(em, BM_ELEM_SELECT);
@@ -1667,10 +1667,14 @@
 
 static int select_all_exec(bContext *C, wmOperator *op)
 {
+	Scene *scene = CTX_data_scene(C);
 	Object *obedit = CTX_data_edit_object(C);
+	Image *ima = CTX_data_edit_image(C);
+	BMEditMesh *em = BMEdit_FromObject(obedit);
+
 	int action = RNA_enum_get(op->ptr, "action");
 
-	select_all_perform(C, action);
+	select_all_perform(scene, ima, em, action);
 
 	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
 
@@ -1731,7 +1735,7 @@
 	MTexPoly *tf;
 	MLoopUV *luv;
 	NearestHit hit;
-	int i, select = 1, selectmode, sticky, sync, *hitv = NULL, nvert;
+	int i, select = 1, selectmode, sticky, sync, *hitv = NULL;
 	BLI_array_declare(hitv);
 	int flush = 0, hitlen = 0; /* 0 == don't flush, 1 == sel, -1 == desel;  only use when selection sync is enabled */
 	float limit[2], **hituv = NULL;
@@ -1811,16 +1815,12 @@
 		/* mark 2 edge vertices as being hit */
 		BLI_array_growitems(hitv,  hit.efa->len);
 		BLI_array_growitems(hituv, hit.efa->len);
-		for (i = 0; i < hit.efa->len; i++) {
-			hitv[i] = 0xFFFFFFFF;
-		}
+		fill_vn_i(hitv, hit.efa->len, 0xFFFFFFFF);
 
-		nvert = hit.efa->len;
-
 		hitv[hit.lindex] = hit.vert1;
-		hitv[(hit.lindex + 1) % nvert] = hit.vert2;
+		hitv[(hit.lindex + 1) % hit.efa->len] = hit.vert2;
 		hituv[hit.lindex] = hit.luv->uv;
-		hituv[(hit.lindex + 1) % nvert] = hit.nextluv->uv;
+		hituv[(hit.lindex + 1) % hit.efa->len] = hit.nextluv->uv;
 
 		hitlen = hit.efa->len;
 	}
@@ -1883,7 +1883,7 @@
 				select = 0;
 			}
 			else {
-				uvedit_uv_select(em, scene, hit.l);
+				uvedit_uv_select(em, scene, hit.l, TRUE);
 				select = 1;
 			}
 			flush = 1;
@@ -1895,7 +1895,7 @@
 				select = 0;
 			}
 			else {
-				uvedit_edge_select(em, scene, hit.l);
+				uvedit_edge_select(em, scene, hit.l, TRUE);
 				select = 1;
 			}
 			flush = 1;
@@ -1907,12 +1907,19 @@
 				select = 0;
 			}
 			else {
-				uvedit_face_select(scene, em, hit.efa);
+				uvedit_face_select(scene, em, hit.efa, TRUE);
 				select = 1;
 			}
 			flush = -1;
 		}
 
+		/* de-selecting an edge may deselect a face too - validate */
+		if (ts->uv_flag & UV_SYNC_SELECTION) {
+			if (select == FALSE) {
+				BM_select_history_validate(em->bm);
+			}
+		}
+
 		/* (de)select sticky uv nodes */
 		if (sticky != SI_STICKY_DISABLE) {
 
@@ -1943,7 +1950,7 @@
 					BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 						luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 						if (sticky_select(limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen))
-							uvedit_uv_select(em, scene, l);
+							uvedit_uv_select(em, scene, l, FALSE);
 					}
 				}
 
@@ -1953,23 +1960,21 @@
 	}
 	else {
 		/* deselect all */
-		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-			uvedit_face_deselect(scene, em, efa);
-		}
+		select_all_perform(scene, ima, em, SEL_DESELECT);
 
 		if (selectmode == UV_SELECT_VERTEX) {
 			/* select vertex */
-			uvedit_uv_select(em, scene, hit.l);
+			uvedit_uv_select(em, scene, hit.l, TRUE);
 			flush = 1;
 		}
 		else if (selectmode == UV_SELECT_EDGE) {
 			/* select edge */
-			uvedit_edge_select(em, scene, hit.l);
+			uvedit_edge_select(em, scene, hit.l, TRUE);
 			flush = 1;
 		}
 		else if (selectmode == UV_SELECT_FACE) {
 			/* select face */
-			uvedit_face_select(scene, em, hit.efa);
+			uvedit_face_select(scene, em, hit.efa, TRUE);
 		}
 
 		/* select sticky uvs */
@@ -1984,7 +1989,7 @@
 					luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 
 					if (sticky_select(limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen))
-						uvedit_uv_select(em, scene, l);
+						uvedit_uv_select(em, scene, l, FALSE);
 
 					flush = 1;
 				}
@@ -2317,7 +2322,7 @@
 			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 				if (BM_elem_flag_test(l->v, BM_ELEM_TAG)) {
 					if (select)
-						uvedit_uv_select(em, scene, l);
+						uvedit_uv_select(em, scene, l, FALSE);
 					else
 						uvedit_uv_deselect(em, scene, l);
 				}
@@ -2351,7 +2356,7 @@
 				
 				BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 					if (select)
-						uvedit_uv_select(em, scene, l);
+						uvedit_uv_select(em, scene, l, FALSE);
 					else
 						uvedit_uv_deselect(em, scene, l);
 					
@@ -2378,7 +2383,7 @@
 							/* tf_vlist = CustomData_bmesh_get(&em->bm->pdata, efa_vlist->head.data, CD_MTEXPOLY); */ /* UNUSED */
 							
 							if (select)
-								uvedit_uv_select(em, scene, BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa_vlist, vlist_iter->tfindex));
+								uvedit_uv_select(em, scene, BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa_vlist, vlist_iter->tfindex), FALSE);
 							else
 								uvedit_uv_deselect(em, scene, BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa_vlist, vlist_iter->tfindex));
 						}
@@ -2395,7 +2400,7 @@
 		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
 			if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
 				if (select)
-					uvedit_face_select(scene, em, efa);
+					uvedit_face_select(scene, em, efa, FALSE);
 				else
 					uvedit_face_deselect(scene, em, efa);
 			}
@@ -2436,7 +2441,7 @@
 	extend = RNA_boolean_get(op->ptr, "extend");
 
 	if (!extend)
-		select_all_perform(C, SEL_DESELECT);
+		select_all_perform(scene, ima, em, SEL_DESELECT);
 	
 	if (ts->uv_flag & UV_SYNC_SELECTION)
 		faces = (ts->selectmode == SCE_SELECT_FACE);
@@ -2483,14 +2488,14 @@
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list