diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-04-14 16:03:23 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-04-14 16:03:23 +0400 |
commit | ec4edb94d93fe3db7e0e16bdc341cfeabfe6690f (patch) | |
tree | 8e22ec7a150d60e981f7f01c4919a5bf8167d092 /source/blender/editors/space_clip/clip_dopesheet_ops.c | |
parent | c3218ebdff43ad60d9e01b5fa13768e8416d7bd7 (diff) |
Camera tracking: initial commit of dopesheet view for clip editor:
- Changed regions to use the whole main region for such views as
curves and dopesheet. This allows to have own panels with
tools/properties in this areas.
- Active clip is getting synchronized between different clip editor
editors in the same screen, so updating of curve/dopesheet views
happens automatically when one changes current clip in one of this
editors.
- Curves and dopesheet are still using PREVIEW region type instead of
re-using main region.
- To deal with vertical synchronization in dopesheet, re-initialization
of preview region happens.
- Panels in toolbox and properties panels are now separated to rely
on current view mode, some operators and poll functions still need
to be updated.
- Added new screen called "Movie Tracking" where layout is configured to
display timeline, main clip window, curves and dopesheet.
Diffstat (limited to 'source/blender/editors/space_clip/clip_dopesheet_ops.c')
-rw-r--r-- | source/blender/editors/space_clip/clip_dopesheet_ops.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/source/blender/editors/space_clip/clip_dopesheet_ops.c b/source/blender/editors/space_clip/clip_dopesheet_ops.c new file mode 100644 index 00000000000..2225f01afe3 --- /dev/null +++ b/source/blender/editors/space_clip/clip_dopesheet_ops.c @@ -0,0 +1,166 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2012 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/space_clip/clip_graph_ops.c + * \ingroup spclip + */ + +#include "DNA_object_types.h" /* SELECT */ +#include "DNA_scene_types.h" + +#include "MEM_guardedalloc.h" + +#include "BLI_utildefines.h" +#include "BLI_math.h" +#include "BLI_listbase.h" +#include "BLI_rect.h" + +#include "BKE_context.h" +#include "BKE_movieclip.h" +#include "BKE_tracking.h" +#include "BKE_depsgraph.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "ED_screen.h" +#include "ED_clip.h" + +#include "UI_interface.h" + +#include "RNA_access.h" +#include "RNA_define.h" + +#include "UI_view2d.h" + +#include "clip_intern.h" // own include + +static int ED_space_clip_dopesheet_poll(bContext *C) +{ + SpaceClip *sc = CTX_wm_space_clip(C); + + if (sc && sc->clip) { + if (sc->view == SC_VIEW_DOPESHEET) { + ARegion *ar = CTX_wm_region(C); + + return ar->regiontype == RGN_TYPE_PREVIEW; + } + } + + return FALSE; +} + +/********************** select channel operator *********************/ + +static int dopesheet_select_channel_poll(bContext *C) +{ + SpaceClip *sc = CTX_wm_space_clip(C); + + if (sc && sc->clip) + return sc->view == SC_VIEW_DOPESHEET; + + return FALSE; +} + +static int dopesheet_select_channel_exec(bContext *C, wmOperator *op) +{ + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip(sc); + MovieTracking *tracking = &clip->tracking; + ListBase *tracksbase = BKE_tracking_get_tracks(tracking); + MovieTrackingTrack *track; + float location[2]; + int extend = RNA_boolean_get(op->ptr, "extend"), channel, channel_index; + + RNA_float_get_array(op->ptr, "location", location); + channel = -(location[1] - (CHANNEL_FIRST + CHANNEL_HEIGHT_HALF)) / CHANNEL_STEP; + + for (track = tracksbase->first, channel_index = 0; track; track = track->next) { + if (!TRACK_VIEW_SELECTED(sc, track)) + continue; + + if (channel_index == channel) { + if (extend) + track->flag ^= TRACK_DOPE_SEL; + else + track->flag |= TRACK_DOPE_SEL; + + if (track->flag & TRACK_DOPE_SEL) { + MovieTrackingMarker *marker; + + /* make last selected in dopesheet track active in clip editor */ + tracking->act_track = track; + + /* make active track be centered to screen */ + /* XXX: doesn't work in other opened spaces */ + marker = BKE_tracking_get_marker(track, sc->user.framenr); + clip_view_center_to_point(sc, marker->pos[0], marker->pos[1]); + } + } + else if (!extend) + track->flag &= ~TRACK_DOPE_SEL; + + channel_index++; + } + + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, NULL); + + return OPERATOR_FINISHED; +} + +static int dopesheet_select_channel_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar = CTX_wm_region(C); + float location[2]; + + UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &location[0], &location[1]); + RNA_float_set_array(op->ptr, "location", location); + + return dopesheet_select_channel_exec(C, op); +} + +void CLIP_OT_dopesheet_select_channel(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Select Channel"; + ot->description = "Select movie tracking channel"; + ot->idname = "CLIP_OT_dopesheet_select_channel"; + + /* api callbacks */ + ot->invoke = dopesheet_select_channel_invoke; + ot->exec = dopesheet_select_channel_exec; + ot->poll = dopesheet_select_channel_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX, + "Location", "Mouse location to select channel", -100.0f, 100.0f); + RNA_def_boolean(ot->srna, "extend", 0, + "Extend", "Extend selection rather than clearing the existing selection"); +} |