Revision: 46622
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46622
Author:   campbellbarton
Date:     2012-05-14 12:04:00 +0000 (Mon, 14 May 2012)
Log Message:
-----------
lasso select for movie clip markers.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_clip.h
    trunk/blender/source/blender/editors/space_clip/clip_editor.c
    trunk/blender/source/blender/editors/space_clip/clip_intern.h
    trunk/blender/source/blender/editors/space_clip/space_clip.c
    trunk/blender/source/blender/editors/space_clip/tracking_ops.c
    trunk/blender/source/blender/editors/uvedit/uvedit_ops.c

Modified: trunk/blender/source/blender/editors/include/ED_clip.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_clip.h      2012-05-14 
10:47:25 UTC (rev 46621)
+++ trunk/blender/source/blender/editors/include/ED_clip.h      2012-05-14 
12:04:00 UTC (rev 46622)
@@ -63,6 +63,7 @@
 
 void ED_clip_point_undistorted_pos(SpaceClip * sc, float co[2], float nco[2]);
 void ED_clip_point_stable_pos(struct bContext *C, float x, float y, float *xr, 
float *yr);
+void ED_clip_point_stable_pos__reverse(SpaceClip * sc, ARegion *ar, float 
co[2], float nco[2]);
 void ED_clip_mouse_pos(struct bContext *C, struct wmEvent *event, float co[2]);
 
 int ED_space_clip_texture_buffer_supported(struct SpaceClip *sc);

Modified: trunk/blender/source/blender/editors/space_clip/clip_editor.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/clip_editor.c       
2012-05-14 10:47:25 UTC (rev 46621)
+++ trunk/blender/source/blender/editors/space_clip/clip_editor.c       
2012-05-14 12:04:00 UTC (rev 46622)
@@ -400,6 +400,30 @@
        }
 }
 
+/**
+ * \brief the reverse of ED_clip_point_stable_pos(), gets the marker region 
coords.
+ * better name here? view_to_tracker / tracker_to_view or so?
+ */
+void ED_clip_point_stable_pos__reverse(SpaceClip *sc, ARegion *ar, float 
co[2], float nco[2])
+{
+       float zoomx, zoomy;
+       float pos[3];
+       int width, height;
+       int sx, sy;
+
+       UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &sx, &sy);
+       ED_space_clip_size(sc, &width, &height);
+       ED_space_clip_zoom(sc, ar, &zoomx, &zoomy);
+
+       ED_clip_point_undistorted_pos(sc, co, pos);
+
+       /* untested */
+       mul_v3_m4v3(pos, sc->stabmat, pos);
+
+       nco[0] = (pos[0] * width  * zoomx) + (float)sx;
+       nco[1] = (pos[1] * height * zoomy) + (float)sy;
+}
+
 void ED_clip_mouse_pos(bContext *C, wmEvent *event, float co[2])
 {
        ED_clip_point_stable_pos(C, event->mval[0], event->mval[1], &co[0], 
&co[1]);

Modified: trunk/blender/source/blender/editors/space_clip/clip_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_clip/clip_intern.h       
2012-05-14 10:47:25 UTC (rev 46621)
+++ trunk/blender/source/blender/editors/space_clip/clip_intern.h       
2012-05-14 12:04:00 UTC (rev 46622)
@@ -134,6 +134,7 @@
 void CLIP_OT_select(struct wmOperatorType *ot);
 void CLIP_OT_select_all(struct wmOperatorType *ot);
 void CLIP_OT_select_border(struct wmOperatorType *ot);
+void CLIP_OT_select_lasso(struct wmOperatorType *ot);
 void CLIP_OT_select_circle(struct wmOperatorType *ot);
 void CLIP_OT_select_grouped(struct wmOperatorType *ot);
 

Modified: trunk/blender/source/blender/editors/space_clip/space_clip.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/space_clip.c        
2012-05-14 10:47:25 UTC (rev 46621)
+++ trunk/blender/source/blender/editors/space_clip/space_clip.c        
2012-05-14 12:04:00 UTC (rev 46622)
@@ -416,6 +416,7 @@
        WM_operatortype_append(CLIP_OT_select);
        WM_operatortype_append(CLIP_OT_select_all);
        WM_operatortype_append(CLIP_OT_select_border);
+       WM_operatortype_append(CLIP_OT_select_lasso);
        WM_operatortype_append(CLIP_OT_select_circle);
        WM_operatortype_append(CLIP_OT_select_grouped);
 
@@ -589,8 +590,13 @@
        WM_keymap_add_item(keymap, "CLIP_OT_select_circle", CKEY, KM_PRESS, 0, 
0);
        WM_keymap_add_menu(keymap, "CLIP_MT_select_grouped", GKEY, KM_PRESS, 
KM_SHIFT, 0);
 
+       kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_lasso", EVT_TWEAK_A, 
KM_ANY, KM_CTRL, 0);
+       RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+       kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_lasso", EVT_TWEAK_A, 
KM_ANY, KM_CTRL | KM_SHIFT, 0);
+       RNA_boolean_set(kmi->ptr, "deselect", TRUE);
+
        /* marker */
-       WM_keymap_add_item(keymap, "CLIP_OT_add_marker_slide", LEFTMOUSE, 
KM_PRESS, KM_CTRL, 0);
+       WM_keymap_add_item(keymap, "CLIP_OT_add_marker_slide", LEFTMOUSE, 
KM_CLICK, KM_CTRL, 0);
 
        WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", DELKEY, KM_PRESS, 
KM_SHIFT, 0);
        WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", XKEY, KM_PRESS, 
KM_SHIFT, 0);

Modified: trunk/blender/source/blender/editors/space_clip/tracking_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/tracking_ops.c      
2012-05-14 10:47:25 UTC (rev 46621)
+++ trunk/blender/source/blender/editors/space_clip/tracking_ops.c      
2012-05-14 12:04:00 UTC (rev 46622)
@@ -42,6 +42,7 @@
 #include "BLI_math.h"
 #include "BLI_listbase.h"
 #include "BLI_rect.h"
+#include "BLI_lasso.h"
 #include "BLI_blenlib.h"
 
 #include "BKE_main.h"
@@ -943,6 +944,105 @@
        WM_operator_properties_gesture_border(ot, TRUE);
 }
 
+
+static int do_lasso_select_mar(bContext *C, int mcords[][2], short moves, 
short select)
+{
+       ARegion *ar = CTX_wm_region(C);
+       SpaceClip *sc = CTX_wm_space_clip(C);
+       MovieClip *clip = ED_space_clip(sc);
+       MovieTracking *tracking = &clip->tracking;
+       MovieTrackingTrack *track;
+       ListBase *tracksbase = BKE_tracking_get_tracks(tracking);
+       rcti rect;
+       int change = FALSE;
+
+       /* get rectangle from operator */
+       BLI_lasso_boundbox(&rect, mcords, moves);
+
+       /* do actual selection */
+       track = tracksbase->first;
+       while (track) {
+               if ((track->flag & TRACK_HIDDEN) == 0) {
+                       if (MARKER_VISIBLE(sc, track, marker)) {
+                               MovieTrackingMarker *marker = 
BKE_tracking_get_marker(track, sc->user.framenr);
+                               float screen_co[2];
+
+                               /* tracker in screen coords */
+                               ED_clip_point_stable_pos__reverse(sc, ar, 
marker->pos, screen_co);
+
+                               if (BLI_in_rcti(&rect, screen_co[0], 
screen_co[1]) &&
+                                   BLI_lasso_is_point_inside(mcords, moves, 
screen_co[0], screen_co[1], V2D_IS_CLIPPED))
+                               {
+                                       BKE_tracking_track_flag(track, 
TRACK_AREA_ALL, SELECT, !select);
+                               }
+
+                               change = TRUE;
+                       }
+               }
+
+               track = track->next;
+       }
+
+       if (change) {
+               BKE_tracking_dopesheet_tag_update(tracking);
+
+               WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL);
+       }
+
+       return change;
+}
+
+static int clip_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_movieclip(C, mcords, i, select);
+
+               return OPERATOR_FINISHED;
+       }
+       return OPERATOR_PASS_THROUGH;
+}
+
+void CLIP_OT_select_lasso(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Lasso Select";
+       ot->description = "Select markers using lasso selection";
+       ot->idname = "CLIP_OT_select_lasso";
+
+       /* api callbacks */
+       ot->invoke = WM_gesture_lasso_invoke;
+       ot->modal = WM_gesture_lasso_modal;
+       ot->exec = clip_lasso_select_exec;
+       ot->poll = ED_space_clip_tracking_poll;
+       ot->cancel = WM_gesture_lasso_cancel;
+
+       /* flags */
+       ot->flag = OPTYPE_UNDO;
+
+       /* properties */
+       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");
+}
+
 /********************** circle select operator *********************/
 
 static int marker_inside_ellipse(MovieTrackingMarker *marker, float offset[2], 
float ellipse[2])

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c    2012-05-14 
10:47:25 UTC (rev 46621)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c    2012-05-14 
12:04:00 UTC (rev 46622)
@@ -2636,7 +2636,7 @@
 
 /* ******************** lasso select operator **************** */
 
-static void do_lasso_select_mesh_uv(bContext *C, int mcords[][2], short moves, 
short select)
+static int 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);
@@ -2695,6 +2695,7 @@
                        }
                }
        }
+
        if (change) {
                uv_select_sync_flush(scene->toolsettings, em, select);
 
@@ -2702,6 +2703,8 @@
                        WM_event_add_notifier(C, NC_GEOM | ND_SELECT, 
obedit->data);
                }
        }
+
+       return change;
 }
 
 static int uv_lasso_select_exec(bContext *C, wmOperator *op)
@@ -2725,9 +2728,14 @@
                short select;
 
                select = !RNA_boolean_get(op->ptr, "deselect");
-               do_lasso_select_mesh_uv(C, mcords, i, select);
 
-               return OPERATOR_FINISHED;
+               if (do_lasso_select_mesh_uv(C, mcords, i, select)) {
+                       return OPERATOR_FINISHED;
+               }
+               else {
+                       return OPERATOR_CANCELLED;
+               }
+
        }
        return OPERATOR_PASS_THROUGH;
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to