[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46008] trunk/blender/source/blender/ editors: add back lasso tool in the UV editor (Ctrl+LMB / Ctrl+Shift+LMB)

Campbell Barton ideasman42 at gmail.com
Sat Apr 28 03:59:24 CEST 2012


Revision: 46008
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46008
Author:   campbellbarton
Date:     2012-04-28 01:59:21 +0000 (Sat, 28 Apr 2012)
Log Message:
-----------
add back lasso tool in the UV editor (Ctrl+LMB / Ctrl+Shift+LMB)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/space_image/image_ops.c
    trunk/blender/source/blender/editors/uvedit/uvedit_ops.c

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-04-27 13:36:57 UTC (rev 46007)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-04-28 01:59:21 UTC (rev 46008)
@@ -4280,3 +4280,4 @@
 	RNA_def_boolean(ot->srna, "use_outset", FALSE, "Outset", "Outset rather than inset");
 	RNA_def_boolean(ot->srna, "use_select_inset", TRUE, "Select Outer", "Select the new inset faces");
 }
+

Modified: trunk/blender/source/blender/editors/space_image/image_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_image/image_ops.c	2012-04-27 13:36:57 UTC (rev 46007)
+++ trunk/blender/source/blender/editors/space_image/image_ops.c	2012-04-28 01:59:21 UTC (rev 46008)
@@ -190,13 +190,14 @@
 	return 0;
 }
 
-/* For IMAGE_OT_curves_point_set to avoid sampling when in uv smooth mode */
+/* For IMAGE_OT_curves_point_set to avoid sampling when in uv smooth mode or editmode */
 int space_image_main_area_not_uv_brush_poll(bContext *C)
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
+	Scene *scene = CTX_data_scene(C);
+	ToolSettings *toolsettings = scene->toolsettings;
 
-	ToolSettings *toolsettings = CTX_data_scene(C)->toolsettings;
-	if (sima && !toolsettings->uvsculpt)
+	if (sima && !toolsettings->uvsculpt && !scene->obedit)
 		return 1;
 
 	return 0;

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2012-04-27 13:36:57 UTC (rev 46007)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2012-04-28 01:59:21 UTC (rev 46008)
@@ -47,6 +47,7 @@
 #include "DNA_scene_types.h"
 
 #include "BLI_math.h"
+#include "BLI_lasso.h"
 #include "BLI_blenlib.h"
 #include "BLI_array.h"
 #include "BLI_utildefines.h"
@@ -1699,7 +1700,7 @@
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
 	Scene *scene = CTX_data_scene(C);
-	ToolSettings *ts = CTX_data_tool_settings(C);
+	ToolSettings *ts = scene->toolsettings;
 	Object *obedit = CTX_data_edit_object(C);
 	Image *ima = CTX_data_edit_image(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
@@ -2101,7 +2102,7 @@
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
 	Scene *scene = CTX_data_scene(C);
-	ToolSettings *ts = CTX_data_tool_settings(C);
+	ToolSettings *ts = scene->toolsettings;
 	Object *obedit = CTX_data_edit_object(C);
 	Image *ima = CTX_data_edit_image(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
@@ -2203,7 +2204,7 @@
 static int unlink_selection_exec(bContext *C, wmOperator *op)
 {
 	Scene *scene = CTX_data_scene(C);
-	ToolSettings *ts = CTX_data_tool_settings(C);
+	ToolSettings *ts = scene->toolsettings;
 	Object *obedit = CTX_data_edit_object(C);
 	Image *ima = CTX_data_edit_image(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
@@ -2289,7 +2290,7 @@
  * 
  * De-selects faces that have been tagged on efa->tmp.l.  */
 
-static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Object *obedit, short select)
+static void uv_faces_do_sticky(SpaceImage *sima, Scene *scene, Object *obedit, short select)
 {
 	/* Selecting UV Faces with some modes requires us to change 
 	 * the selection in other faces (depending on the sticky mode).
@@ -2297,7 +2298,7 @@
 	 * This only needs to be done when the Mesh is not used for
 	 * selection (so for sticky modes, vertex or location based). */
 	
-	ToolSettings *ts = CTX_data_tool_settings(C);
+	ToolSettings *ts = scene->toolsettings;
 	BMEditMesh *em = BMEdit_FromObject(obedit);
 	BMFace *efa;
 	BMLoop *l;
@@ -2418,7 +2419,7 @@
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
 	Scene *scene = CTX_data_scene(C);
-	ToolSettings *ts = CTX_data_tool_settings(C);
+	ToolSettings *ts = scene->toolsettings;
 	Object *obedit = CTX_data_edit_object(C);
 	Image *ima = CTX_data_edit_image(C);
 	ARegion *ar = CTX_wm_region(C);
@@ -2477,7 +2478,7 @@
 
 		/* (de)selects all tagged faces and deals with sticky modes */
 		if (change)
-			uv_faces_do_sticky(C, sima, scene, obedit, select);
+			uv_faces_do_sticky(sima, scene, obedit, select);
 	}
 	else {
 		/* other selection modes */
@@ -2512,7 +2513,9 @@
 	if (change) {
 		uv_select_sync_flush(ts, em, select);
 
-		WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+		if (ts->uv_flag & UV_SYNC_SELECTION) {
+			WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+		}
 		
 		return OPERATOR_FINISHED;
 	}
@@ -2571,6 +2574,7 @@
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
 	Scene *scene = CTX_data_scene(C);
+	ToolSettings *ts = scene->toolsettings;
 	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
 	ARegion *ar = CTX_wm_region(C);
@@ -2608,9 +2612,11 @@
 	}
 
 	if (change) {
-		uv_select_sync_flush(scene->toolsettings, em, select);
+		uv_select_sync_flush(ts, em, select);
 
-		WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+		if (ts->uv_flag & UV_SYNC_SELECTION) {
+			WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+		}
 	}
 
 	return OPERATOR_FINISHED;
@@ -2640,6 +2646,126 @@
 	RNA_def_int(ot->srna, "gesture_mode", 0, INT_MIN, INT_MAX, "Gesture Mode", "", INT_MIN, INT_MAX);
 }
 
+
+/* ******************** lasso select operator **************** */
+
+static void do_lasso_select_mesh_uv(bContext *C, int mcords[][2], short moves, short select)
+{
+	Image *ima = CTX_data_edit_image(C);
+	ARegion *ar = CTX_wm_region(C);
+	Object *obedit = CTX_data_edit_object(C);
+	Scene *scene = CTX_data_scene(C);
+	ToolSettings *ts = scene->toolsettings;
+	BMEditMesh *em = BMEdit_FromObject(obedit);
+
+	BMIter iter, liter;
+
+	BMFace *efa;
+	BMLoop *l;
+	MTexPoly *tf;
+	int screen_uv[2], change = TRUE;
+	rcti rect;
+
+	BLI_lasso_boundbox(&rect, mcords, moves);
+
+	if (ts->uv_selectmode == UV_SELECT_FACE) { /* Face Center Sel */
+		change = FALSE;
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			/* assume not touched */
+			if ((select) != (uvedit_face_select_test(scene, em, efa))) {
+				float cent[2];
+				uv_poly_center(em, efa, cent);
+				UI_view2d_view_to_region(&ar->v2d, cent[0], cent[1], &screen_uv[0], &screen_uv[1]);
+				if (BLI_in_rcti(&rect, screen_uv[0], screen_uv[1]) &&
+				    BLI_lasso_is_point_inside(mcords, moves, screen_uv[0], screen_uv[1], V2D_IS_CLIPPED))
+				{
+					uvedit_face_select_enable(scene, em, efa, FALSE);
+					change = TRUE;
+				}
+			}
+		}
+	}
+	else { /* Vert Sel */
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
+			if (uvedit_face_visible_test(scene, ima, efa, tf)) {
+				BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+					if ((select) != (uvedit_uv_select_test(em, scene, l))) {
+						MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+						UI_view2d_view_to_region(&ar->v2d, luv->uv[0], luv->uv[1], &screen_uv[0], &screen_uv[1]);
+						if (BLI_in_rcti(&rect, screen_uv[0], screen_uv[1]) &&
+						    BLI_lasso_is_point_inside(mcords, moves, screen_uv[0], screen_uv[1], V2D_IS_CLIPPED))
+						{
+							if (select) {
+								uvedit_uv_select_enable(em, scene, l, FALSE);
+							}
+							else {
+								uvedit_uv_select_disable(em, scene, l);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	if (change) {
+		uv_select_sync_flush(scene->toolsettings, em, select);
+
+		if (ts->uv_flag & UV_SYNC_SELECTION) {
+			WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+		}
+	}
+}
+
+static int uv_lasso_select_exec(bContext *C, wmOperator *op)
+{
+	int i = 0;
+	int mcords[1024][2];
+
+	RNA_BEGIN (op->ptr, itemptr, "path") {
+		float loc[2];
+
+		RNA_float_get_array(&itemptr, "loc", loc);
+		mcords[i][0] = (int)loc[0];
+		mcords[i][1] = (int)loc[1];
+		i++;
+		if (i >= 1024) break;
+	}
+	RNA_END;
+
+	if (i > 1) {
+		short select;
+
+		select = !RNA_boolean_get(op->ptr, "deselect");
+		do_lasso_select_mesh_uv(C, mcords, i, select);
+
+		return OPERATOR_FINISHED;
+	}
+	return OPERATOR_PASS_THROUGH;
+}
+
+void UV_OT_select_lasso(wmOperatorType *ot)
+{
+	ot->name = "Lasso Select UV";
+	ot->description = "Select UVs using lasso selection";
+	ot->idname = "UV_OT_select_lasso";
+
+	ot->invoke = WM_gesture_lasso_invoke;
+	ot->modal = WM_gesture_lasso_modal;
+	ot->exec = uv_lasso_select_exec;
+	ot->poll = ED_operator_image_active;
+	ot->cancel = WM_gesture_lasso_cancel;
+
+	/* flags */
+	ot->flag = OPTYPE_UNDO;
+
+	RNA_def_collection_runtime(ot->srna, "path", &RNA_OperatorMousePath, "Path", "");
+	RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect rather than select items");
+	RNA_def_boolean(ot->srna, "extend", 1, "Extend", "Extend selection instead of deselecting everything first");
+}
+
+
+
 /* ******************** snap cursor operator **************** */
 
 static void snap_uv_to_pixel(float *uvco, float w, float h)
@@ -3007,9 +3133,9 @@
 static int hide_exec(bContext *C, wmOperator *op)
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
-	ToolSettings *ts = CTX_data_tool_settings(C);
 	Object *obedit = CTX_data_edit_object(C);
 	Scene *scene = CTX_data_scene(C);
+	ToolSettings *ts = scene->toolsettings;
 	BMEditMesh *em = BMEdit_FromObject(obedit);
 	BMFace *efa;
 	BMLoop *l;
@@ -3122,9 +3248,9 @@
 static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
-	ToolSettings *ts = CTX_data_tool_settings(C);
 	Object *obedit = CTX_data_edit_object(C);
-	/*Scene *scene = CTX_data_scene(C);*/ /*UNUSED*/
+	Scene *scene = CTX_data_scene(C);
+	ToolSettings *ts = scene->toolsettings;
 	BMEditMesh *em = BMEdit_FromObject(obedit);
 	BMFace *efa;
 	BMLoop *l;
@@ -3550,6 +3676,7 @@
 	WM_operatortype_append(UV_OT_unlink_selected);
 	WM_operatortype_append(UV_OT_select_pinned);
 	WM_operatortype_append(UV_OT_select_border);
+	WM_operatortype_append(UV_OT_select_lasso);
 	WM_operatortype_append(UV_OT_circle_select);
 
 	WM_operatortype_append(UV_OT_snap_cursor);
@@ -3610,6 +3737,11 @@
 
 	WM_keymap_add_item(keymap, "UV_OT_circle_select", CKEY, KM_PRESS, 0, 0);
 
+	kmi = WM_keymap_add_item(keymap, "UV_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
+	RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+	kmi = WM_keymap_add_item(keymap, "UV_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT, 0);
+	RNA_boolean_set(kmi->ptr, "deselect", TRUE);
+
 	/* selection manipulation */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list