diff options
Diffstat (limited to 'source/blender/editors/space_clip/tracking_ops.c')
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops.c | 3333 |
1 files changed, 1599 insertions, 1734 deletions
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index 68d13b63804..ce1ade80823 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -57,329 +57,319 @@ static bool add_marker(const bContext *C, float x, float y) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - MovieTrackingTrack *track; - int width, height; - int framenr = ED_space_clip_get_clip_frame_number(sc); + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + MovieTrackingTrack *track; + int width, height; + int framenr = ED_space_clip_get_clip_frame_number(sc); - ED_space_clip_get_size(sc, &width, &height); + ED_space_clip_get_size(sc, &width, &height); - if (width == 0 || height == 0) { - return false; - } + if (width == 0 || height == 0) { + return false; + } - track = BKE_tracking_track_add(tracking, tracksbase, x, y, framenr, width, height); + track = BKE_tracking_track_add(tracking, tracksbase, x, y, framenr, width, height); - BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, 0); - BKE_tracking_plane_tracks_deselect_all(plane_tracks_base); + BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, 0); + BKE_tracking_plane_tracks_deselect_all(plane_tracks_base); - clip->tracking.act_track = track; - clip->tracking.act_plane_track = NULL; + clip->tracking.act_track = track; + clip->tracking.act_plane_track = NULL; - return true; + return true; } static int add_marker_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - float pos[2]; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + float pos[2]; - RNA_float_get_array(op->ptr, "location", pos); + RNA_float_get_array(op->ptr, "location", pos); - if (!add_marker(C, pos[0], pos[1])) { - return OPERATOR_CANCELLED; - } + if (!add_marker(C, pos[0], pos[1])) { + return OPERATOR_CANCELLED; + } - /* Reset offset from locked position, so frame jumping wouldn't be so - * confusing. - */ - sc->xlockof = 0; - sc->ylockof = 0; + /* Reset offset from locked position, so frame jumping wouldn't be so + * confusing. + */ + sc->xlockof = 0; + sc->ylockof = 0; - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } static int add_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - SpaceClip *sc = CTX_wm_space_clip(C); - ARegion *ar = CTX_wm_region(C); + SpaceClip *sc = CTX_wm_space_clip(C); + ARegion *ar = CTX_wm_region(C); - if (!RNA_struct_property_is_set(op->ptr, "location")) { - /* If location is not set, use mouse positio nas default. */ - float co[2]; - ED_clip_mouse_pos(sc, ar, event->mval, co); - RNA_float_set_array(op->ptr, "location", co); - } + if (!RNA_struct_property_is_set(op->ptr, "location")) { + /* If location is not set, use mouse positio nas default. */ + float co[2]; + ED_clip_mouse_pos(sc, ar, event->mval, co); + RNA_float_set_array(op->ptr, "location", co); + } - return add_marker_exec(C, op); + return add_marker_exec(C, op); } void CLIP_OT_add_marker(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Add Marker"; - ot->idname = "CLIP_OT_add_marker"; - ot->description = "Place new marker at specified location"; + /* identifiers */ + ot->name = "Add Marker"; + ot->idname = "CLIP_OT_add_marker"; + ot->description = "Place new marker at specified location"; - /* api callbacks */ - ot->invoke = add_marker_invoke; - ot->exec = add_marker_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->invoke = add_marker_invoke; + ot->exec = add_marker_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - /* properties */ - RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX, - "Location", "Location of marker on frame", -1.0f, 1.0f); + /* properties */ + RNA_def_float_vector(ot->srna, + "location", + 2, + NULL, + -FLT_MAX, + FLT_MAX, + "Location", + "Location of marker on frame", + -1.0f, + 1.0f); } /********************** add marker operator *********************/ -static int add_marker_at_click_invoke(bContext *C, - wmOperator *op, - const wmEvent *UNUSED(event)) +static int add_marker_at_click_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { - ED_workspace_status_text( - C, - IFACE_("Use LMB click to define location where place the marker")); + ED_workspace_status_text(C, IFACE_("Use LMB click to define location where place the marker")); - /* Add modal handler for ESC. */ - WM_event_add_modal_handler(C, op); + /* Add modal handler for ESC. */ + WM_event_add_modal_handler(C, op); - return OPERATOR_RUNNING_MODAL; + return OPERATOR_RUNNING_MODAL; } -static int add_marker_at_click_modal(bContext *C, - wmOperator *UNUSED(op), - const wmEvent *event) +static int add_marker_at_click_modal(bContext *C, wmOperator *UNUSED(op), const wmEvent *event) { - switch (event->type) { - case MOUSEMOVE: - return OPERATOR_RUNNING_MODAL; + switch (event->type) { + case MOUSEMOVE: + return OPERATOR_RUNNING_MODAL; - case LEFTMOUSE: - { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - ARegion *ar = CTX_wm_region(C); - float pos[2]; + case LEFTMOUSE: { + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + ARegion *ar = CTX_wm_region(C); + float pos[2]; - ED_workspace_status_text(C, NULL); + ED_workspace_status_text(C, NULL); - ED_clip_point_stable_pos(sc, ar, - event->x - ar->winrct.xmin, - event->y - ar->winrct.ymin, - &pos[0], &pos[1]); + ED_clip_point_stable_pos( + sc, ar, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, &pos[0], &pos[1]); - if (!add_marker(C, pos[0], pos[1])) { - return OPERATOR_CANCELLED; - } + if (!add_marker(C, pos[0], pos[1])) { + return OPERATOR_CANCELLED; + } - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - return OPERATOR_FINISHED; - } + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + return OPERATOR_FINISHED; + } - case ESCKEY: - ED_workspace_status_text(C, NULL); - return OPERATOR_CANCELLED; - } + case ESCKEY: + ED_workspace_status_text(C, NULL); + return OPERATOR_CANCELLED; + } - return OPERATOR_PASS_THROUGH; + return OPERATOR_PASS_THROUGH; } void CLIP_OT_add_marker_at_click(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Add Marker at Click"; - ot->idname = "CLIP_OT_add_marker_at_click"; - ot->description = "Place new marker at the desired (clicked) position"; + /* identifiers */ + ot->name = "Add Marker at Click"; + ot->idname = "CLIP_OT_add_marker_at_click"; + ot->description = "Place new marker at the desired (clicked) position"; - /* api callbacks */ - ot->invoke = add_marker_at_click_invoke; - ot->poll = ED_space_clip_tracking_poll; - ot->modal = add_marker_at_click_modal; + /* api callbacks */ + ot->invoke = add_marker_at_click_invoke; + ot->poll = ED_space_clip_tracking_poll; + ot->modal = add_marker_at_click_modal; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING; } /********************** delete track operator *********************/ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - bool changed = false; - /* Delete selected plane tracks. */ - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first, - *next_plane_track; - plane_track != NULL; - plane_track = next_plane_track) - { - next_plane_track = plane_track->next; - if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { - clip_delete_plane_track(C, clip, plane_track); - changed = true; - } - } - /* Remove selected point tracks (they'll also be removed from planes which - * uses them). - */ - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - for (MovieTrackingTrack *track = tracksbase->first, *next_track; - track != NULL; - track = next_track) - { - next_track = track->next; - if (TRACK_VIEW_SELECTED(sc, track)) { - clip_delete_track(C, clip, track); - changed = true; - } - } - /* Nothing selected now, unlock view so it can be scrolled nice again. */ - sc->flag &= ~SC_LOCK_SELECTION; - if (changed) { - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - } - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + bool changed = false; + /* Delete selected plane tracks. */ + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first, *next_plane_track; + plane_track != NULL; + plane_track = next_plane_track) { + next_plane_track = plane_track->next; + if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { + clip_delete_plane_track(C, clip, plane_track); + changed = true; + } + } + /* Remove selected point tracks (they'll also be removed from planes which + * uses them). + */ + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + for (MovieTrackingTrack *track = tracksbase->first, *next_track; track != NULL; + track = next_track) { + next_track = track->next; + if (TRACK_VIEW_SELECTED(sc, track)) { + clip_delete_track(C, clip, track); + changed = true; + } + } + /* Nothing selected now, unlock view so it can be scrolled nice again. */ + sc->flag &= ~SC_LOCK_SELECTION; + if (changed) { + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + } + return OPERATOR_FINISHED; } void CLIP_OT_delete_track(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Delete Track"; - ot->idname = "CLIP_OT_delete_track"; - ot->description = "Delete selected tracks"; + /* identifiers */ + ot->name = "Delete Track"; + ot->idname = "CLIP_OT_delete_track"; + ot->description = "Delete selected tracks"; - /* api callbacks */ - ot->invoke = WM_operator_confirm; - ot->exec = delete_track_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->invoke = WM_operator_confirm; + ot->exec = delete_track_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** delete marker operator *********************/ static int delete_marker_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - const int framenr = ED_space_clip_get_clip_frame_number(sc); - bool has_selection = false; - bool changed = false; - - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - for (MovieTrackingTrack *track = tracksbase->first, *next_track; - track != NULL; - track = next_track) - { - next_track = track->next; - if (TRACK_VIEW_SELECTED(sc, track)) { - MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr); - if (marker != NULL) { - has_selection |= track->markersnr > 1; - clip_delete_marker(C, clip, track, marker); - changed = true; - } - } - } - - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first, - *plane_track_next; - plane_track != NULL; - plane_track = plane_track_next) - { - plane_track_next = plane_track->next; - if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { - MovieTrackingPlaneMarker *plane_marker = - BKE_tracking_plane_marker_get_exact(plane_track, framenr); - if (plane_marker != NULL) { - if (plane_track->markersnr == 1) { - BKE_tracking_plane_track_free(plane_track); - BLI_freelinkN(plane_tracks_base, plane_track); - } - else { - BKE_tracking_plane_marker_delete(plane_track, framenr); - } - changed = true; - } - } - } - - if (!has_selection) { - /* Nothing selected now, unlock view so it can be scrolled nice again. */ - sc->flag &= ~SC_LOCK_SELECTION; - } - - if (!changed) { - return OPERATOR_CANCELLED; - } - - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + const int framenr = ED_space_clip_get_clip_frame_number(sc); + bool has_selection = false; + bool changed = false; + + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + for (MovieTrackingTrack *track = tracksbase->first, *next_track; track != NULL; + track = next_track) { + next_track = track->next; + if (TRACK_VIEW_SELECTED(sc, track)) { + MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr); + if (marker != NULL) { + has_selection |= track->markersnr > 1; + clip_delete_marker(C, clip, track, marker); + changed = true; + } + } + } + + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first, *plane_track_next; + plane_track != NULL; + plane_track = plane_track_next) { + plane_track_next = plane_track->next; + if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { + MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get_exact(plane_track, + framenr); + if (plane_marker != NULL) { + if (plane_track->markersnr == 1) { + BKE_tracking_plane_track_free(plane_track); + BLI_freelinkN(plane_tracks_base, plane_track); + } + else { + BKE_tracking_plane_marker_delete(plane_track, framenr); + } + changed = true; + } + } + } + + if (!has_selection) { + /* Nothing selected now, unlock view so it can be scrolled nice again. */ + sc->flag &= ~SC_LOCK_SELECTION; + } + + if (!changed) { + return OPERATOR_CANCELLED; + } + + return OPERATOR_FINISHED; } void CLIP_OT_delete_marker(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Delete Marker"; - ot->idname = "CLIP_OT_delete_marker"; - ot->description = "Delete marker for current frame from selected tracks"; + /* identifiers */ + ot->name = "Delete Marker"; + ot->idname = "CLIP_OT_delete_marker"; + ot->description = "Delete marker for current frame from selected tracks"; - /* api callbacks */ - ot->invoke = WM_operator_confirm; - ot->exec = delete_marker_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->invoke = WM_operator_confirm; + ot->exec = delete_marker_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** slide marker operator *********************/ enum { - SLIDE_ACTION_POS = 0, - SLIDE_ACTION_SIZE, - SLIDE_ACTION_OFFSET, - SLIDE_ACTION_TILT_SIZE, + SLIDE_ACTION_POS = 0, + SLIDE_ACTION_SIZE, + SLIDE_ACTION_OFFSET, + SLIDE_ACTION_TILT_SIZE, }; typedef struct { - short area, action; - MovieTrackingTrack *track; - MovieTrackingMarker *marker; + short area, action; + MovieTrackingTrack *track; + MovieTrackingMarker *marker; - int mval[2]; - int width, height; - float *min, *max, *pos, *offset, (*corners)[2]; - float spos[2]; + int mval[2]; + int width, height; + float *min, *max, *pos, *offset, (*corners)[2]; + float spos[2]; - bool lock, accurate; + bool lock, accurate; - /* Data to restore on cancel. */ - float old_search_min[2], old_search_max[2], old_pos[2], old_offset[2]; - float old_corners[4][2]; - float (*old_markers)[2]; + /* Data to restore on cancel. */ + float old_search_min[2], old_search_max[2], old_pos[2], old_offset[2]; + float old_corners[4][2]; + float (*old_markers)[2]; } SlideMarkerData; -static void slide_marker_tilt_slider(const MovieTrackingMarker *marker, - float r_slider[2]) +static void slide_marker_tilt_slider(const MovieTrackingMarker *marker, float r_slider[2]) { - add_v2_v2v2(r_slider, marker->pattern_corners[1], marker->pattern_corners[2]); - add_v2_v2(r_slider, marker->pos); + add_v2_v2v2(r_slider, marker->pattern_corners[1], marker->pattern_corners[2]); + add_v2_v2(r_slider, marker->pos); } static SlideMarkerData *create_slide_marker_data(SpaceClip *sc, @@ -392,124 +382,107 @@ static SlideMarkerData *create_slide_marker_data(SpaceClip *sc, int width, int height) { - SlideMarkerData *data = MEM_callocN(sizeof(SlideMarkerData), "slide marker data"); - int framenr = ED_space_clip_get_clip_frame_number(sc); - - marker = BKE_tracking_marker_ensure(track, framenr); - - data->area = area; - data->action = action; - data->track = track; - data->marker = marker; - - if (area == TRACK_AREA_POINT) { - data->pos = marker->pos; - data->offset = track->offset; - } - else if (area == TRACK_AREA_PAT) { - if (action == SLIDE_ACTION_SIZE) { - data->corners = marker->pattern_corners; - } - else if (action == SLIDE_ACTION_OFFSET) { - data->pos = marker->pos; - data->offset = track->offset; - data->old_markers = MEM_callocN( - sizeof(*data->old_markers) * track->markersnr, - "slide marekrs"); - for (int a = 0; a < track->markersnr; a++) { - copy_v2_v2(data->old_markers[a], track->markers[a].pos); - } - } - else if (action == SLIDE_ACTION_POS) { - data->corners = marker->pattern_corners; - data->pos = marker->pattern_corners[corner]; - copy_v2_v2(data->spos, data->pos); - } - else if (action == SLIDE_ACTION_TILT_SIZE) { - data->corners = marker->pattern_corners; - slide_marker_tilt_slider(marker, data->spos); - } - } - else if (area == TRACK_AREA_SEARCH) { - data->min = marker->search_min; - data->max = marker->search_max; - } - - data->mval[0] = event->mval[0]; - data->mval[1] = event->mval[1]; - - data->width = width; - data->height = height; - - if (action == SLIDE_ACTION_SIZE) { - data->lock = true; - } - - /* Backup marker's settings. */ - memcpy(data->old_corners, marker->pattern_corners, sizeof(data->old_corners)); - copy_v2_v2(data->old_search_min, marker->search_min); - copy_v2_v2(data->old_search_max, marker->search_max); - copy_v2_v2(data->old_pos, marker->pos); - copy_v2_v2(data->old_offset, track->offset); - - return data; -} - -static float mouse_to_slide_zone_distance_squared( - const float co[2], - const float slide_zone[2], - int width, - int height) -{ - float pixel_co[2] = {co[0] * width, co[1] * height}, - pixel_slide_zone[2] = {slide_zone[0] * width, slide_zone[1] * height}; - return SQUARE(pixel_co[0] - pixel_slide_zone[0]) + - SQUARE(pixel_co[1] - pixel_slide_zone[1]); + SlideMarkerData *data = MEM_callocN(sizeof(SlideMarkerData), "slide marker data"); + int framenr = ED_space_clip_get_clip_frame_number(sc); + + marker = BKE_tracking_marker_ensure(track, framenr); + + data->area = area; + data->action = action; + data->track = track; + data->marker = marker; + + if (area == TRACK_AREA_POINT) { + data->pos = marker->pos; + data->offset = track->offset; + } + else if (area == TRACK_AREA_PAT) { + if (action == SLIDE_ACTION_SIZE) { + data->corners = marker->pattern_corners; + } + else if (action == SLIDE_ACTION_OFFSET) { + data->pos = marker->pos; + data->offset = track->offset; + data->old_markers = MEM_callocN(sizeof(*data->old_markers) * track->markersnr, + "slide marekrs"); + for (int a = 0; a < track->markersnr; a++) { + copy_v2_v2(data->old_markers[a], track->markers[a].pos); + } + } + else if (action == SLIDE_ACTION_POS) { + data->corners = marker->pattern_corners; + data->pos = marker->pattern_corners[corner]; + copy_v2_v2(data->spos, data->pos); + } + else if (action == SLIDE_ACTION_TILT_SIZE) { + data->corners = marker->pattern_corners; + slide_marker_tilt_slider(marker, data->spos); + } + } + else if (area == TRACK_AREA_SEARCH) { + data->min = marker->search_min; + data->max = marker->search_max; + } + + data->mval[0] = event->mval[0]; + data->mval[1] = event->mval[1]; + + data->width = width; + data->height = height; + + if (action == SLIDE_ACTION_SIZE) { + data->lock = true; + } + + /* Backup marker's settings. */ + memcpy(data->old_corners, marker->pattern_corners, sizeof(data->old_corners)); + copy_v2_v2(data->old_search_min, marker->search_min); + copy_v2_v2(data->old_search_max, marker->search_max); + copy_v2_v2(data->old_pos, marker->pos); + copy_v2_v2(data->old_offset, track->offset); + + return data; +} + +static float mouse_to_slide_zone_distance_squared(const float co[2], + const float slide_zone[2], + int width, + int height) +{ + float pixel_co[2] = {co[0] * width, co[1] * height}, + pixel_slide_zone[2] = {slide_zone[0] * width, slide_zone[1] * height}; + return SQUARE(pixel_co[0] - pixel_slide_zone[0]) + SQUARE(pixel_co[1] - pixel_slide_zone[1]); } static float mouse_to_search_corner_distance_squared( - const MovieTrackingMarker *marker, - const float co[2], - int corner, - int width, - int height) -{ - float side_zone[2]; - if (corner == 0) { - side_zone[0] = marker->pos[0] + marker->search_max[0]; - side_zone[1] = marker->pos[1] + marker->search_min[1]; - } - else { - side_zone[0] = marker->pos[0] + marker->search_min[0]; - side_zone[1] = marker->pos[1] + marker->search_max[1]; - } - return mouse_to_slide_zone_distance_squared(co, - side_zone, - width, - height); + const MovieTrackingMarker *marker, const float co[2], int corner, int width, int height) +{ + float side_zone[2]; + if (corner == 0) { + side_zone[0] = marker->pos[0] + marker->search_max[0]; + side_zone[1] = marker->pos[1] + marker->search_min[1]; + } + else { + side_zone[0] = marker->pos[0] + marker->search_min[0]; + side_zone[1] = marker->pos[1] + marker->search_max[1]; + } + return mouse_to_slide_zone_distance_squared(co, side_zone, width, height); } static float mouse_to_closest_pattern_corner_distance_squared( - const MovieTrackingMarker *marker, - const float co[2], - int width, - int height, - int *r_corner) -{ - float min_distance_squared = FLT_MAX; - for (int i = 0; i < 4; i++) { - float corner_co[2]; - add_v2_v2v2(corner_co, marker->pattern_corners[i], marker->pos); - float distance_squared = mouse_to_slide_zone_distance_squared(co, - corner_co, - width, - height); - if (distance_squared < min_distance_squared) { - min_distance_squared = distance_squared; - *r_corner = i; - } - } - return min_distance_squared; + const MovieTrackingMarker *marker, const float co[2], int width, int height, int *r_corner) +{ + float min_distance_squared = FLT_MAX; + for (int i = 0; i < 4; i++) { + float corner_co[2]; + add_v2_v2v2(corner_co, marker->pattern_corners[i], marker->pos); + float distance_squared = mouse_to_slide_zone_distance_squared(co, corner_co, width, height); + if (distance_squared < min_distance_squared) { + min_distance_squared = distance_squared; + *r_corner = i; + } + } + return min_distance_squared; } static float mouse_to_offset_distance_squared(const MovieTrackingTrack *track, @@ -518,12 +491,9 @@ static float mouse_to_offset_distance_squared(const MovieTrackingTrack *track, int width, int height) { - float pos[2]; - add_v2_v2v2(pos, marker->pos, track->offset); - return mouse_to_slide_zone_distance_squared(co, - pos, - width, - height); + float pos[2]; + add_v2_v2v2(pos, marker->pos, track->offset); + return mouse_to_slide_zone_distance_squared(co, pos, width, height); } static int mouse_to_tilt_distance_squared(const MovieTrackingMarker *marker, @@ -531,1719 +501,1614 @@ static int mouse_to_tilt_distance_squared(const MovieTrackingMarker *marker, int width, int height) { - float slider[2]; - slide_marker_tilt_slider(marker, slider); - return mouse_to_slide_zone_distance_squared(co, - slider, - width, - height); + float slider[2]; + slide_marker_tilt_slider(marker, slider); + return mouse_to_slide_zone_distance_squared(co, slider, width, height); } static bool slide_check_corners(float (*corners)[2]) { - int i, next, prev; - float cross = 0.0f; - float p[2] = {0.0f, 0.0f}; - - if (!isect_point_quad_v2(p, corners[0], corners[1], corners[2], corners[3])) - return false; - - for (i = 0; i < 4; i++) { - float v1[2], v2[2], cur_cross; - - next = (i + 1) % 4; - prev = (4 + i - 1) % 4; - - sub_v2_v2v2(v1, corners[i], corners[prev]); - sub_v2_v2v2(v2, corners[next], corners[i]); - - cur_cross = cross_v2v2(v1, v2); - - if (fabsf(cur_cross) > FLT_EPSILON) { - if (cross == 0.0f) { - cross = cur_cross; - } - else if (cross * cur_cross < 0.0f) { - return false; - } - } - } - - return true; -} - -MovieTrackingTrack *tracking_marker_check_slide(bContext *C, - const wmEvent *event, - int *area_r, - int *action_r, - int *corner_r) -{ - const float distance_clip_squared = 12.0f * 12.0f; - SpaceClip *sc = CTX_wm_space_clip(C); - ARegion *ar = CTX_wm_region(C); - - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTrackingTrack *track; - int width, height; - float co[2]; - ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking); - int framenr = ED_space_clip_get_clip_frame_number(sc); - float global_min_distance_squared = FLT_MAX; - - /* Sliding zone designator which is the closest to the mouse - * across all the tracks. - */ - int min_action = -1, min_area = 0, min_corner = -1; - MovieTrackingTrack *min_track = NULL; - - ED_space_clip_get_size(sc, &width, &height); - - if (width == 0 || height == 0) - return NULL; - - ED_clip_mouse_pos(sc, ar, event->mval, co); - - track = tracksbase->first; - while (track) { - if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) { - const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, - framenr); - /* Sliding zone designator which is the closest to the mouse for - * the current tracks. - */ - float min_distance_squared = FLT_MAX; - int action = -1, area = 0, corner = -1; - - if ((marker->flag & MARKER_DISABLED) == 0) { - float distance_squared; - - /* We start checking with whether the mouse is close enough - * to the pattern offset area. - */ - distance_squared = mouse_to_offset_distance_squared(track, - marker, - co, - width, - height); - area = TRACK_AREA_POINT; - action = SLIDE_ACTION_POS; - - /* NOTE: All checks here are assuming there's no maximum distance - * limit, so checks are quite simple here. - * Actual distance clipping happens later once all the sliding - * zones are checked. - */ - min_distance_squared = distance_squared; - - /* If search area is visible, check how close to it's sliding - * zones mouse is. - */ - if (sc->flag & SC_SHOW_MARKER_SEARCH) { - distance_squared = mouse_to_search_corner_distance_squared( - marker, - co, - 1, - width, - height); - if (distance_squared < min_distance_squared) { - area = TRACK_AREA_SEARCH; - action = SLIDE_ACTION_OFFSET; - min_distance_squared = distance_squared; - } - - distance_squared = mouse_to_search_corner_distance_squared( - marker, - co, - 0, - width, - height); - if (distance_squared < min_distance_squared) { - area = TRACK_AREA_SEARCH; - action = SLIDE_ACTION_SIZE; - min_distance_squared = distance_squared; - } - } - - /* If pattern area is visible, check which corner is closest to - * the mouse. - */ - if (sc->flag & SC_SHOW_MARKER_PATTERN) { - int current_corner = -1; - distance_squared = - mouse_to_closest_pattern_corner_distance_squared( - marker, - co, - width, - height, - ¤t_corner); - if (distance_squared < min_distance_squared) { - area = TRACK_AREA_PAT; - action = SLIDE_ACTION_POS; - corner = current_corner; - min_distance_squared = distance_squared; - } - - /* Here we also check whether the mouse is actually closer to - * the widget which controls scale and tilt. - */ - distance_squared = mouse_to_tilt_distance_squared(marker, - co, - width, - height); - if (distance_squared < min_distance_squared) { - area = TRACK_AREA_PAT; - action = SLIDE_ACTION_TILT_SIZE; - min_distance_squared = distance_squared; - } - } - - if (min_distance_squared < global_min_distance_squared) { - min_area = area; - min_action = action; - min_corner = corner; - min_track = track; - global_min_distance_squared = min_distance_squared; - } - } - } - - track = track->next; - } - - if (global_min_distance_squared < distance_clip_squared / sc->zoom) { - if (area_r) { - *area_r = min_area; - } - if (action_r) { - *action_r = min_action; - } - if (corner_r) { - *corner_r = min_corner; - } - return min_track; - } - return NULL; + int i, next, prev; + float cross = 0.0f; + float p[2] = {0.0f, 0.0f}; + + if (!isect_point_quad_v2(p, corners[0], corners[1], corners[2], corners[3])) + return false; + + for (i = 0; i < 4; i++) { + float v1[2], v2[2], cur_cross; + + next = (i + 1) % 4; + prev = (4 + i - 1) % 4; + + sub_v2_v2v2(v1, corners[i], corners[prev]); + sub_v2_v2v2(v2, corners[next], corners[i]); + + cur_cross = cross_v2v2(v1, v2); + + if (fabsf(cur_cross) > FLT_EPSILON) { + if (cross == 0.0f) { + cross = cur_cross; + } + else if (cross * cur_cross < 0.0f) { + return false; + } + } + } + + return true; +} + +MovieTrackingTrack *tracking_marker_check_slide( + bContext *C, const wmEvent *event, int *area_r, int *action_r, int *corner_r) +{ + const float distance_clip_squared = 12.0f * 12.0f; + SpaceClip *sc = CTX_wm_space_clip(C); + ARegion *ar = CTX_wm_region(C); + + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTrackingTrack *track; + int width, height; + float co[2]; + ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking); + int framenr = ED_space_clip_get_clip_frame_number(sc); + float global_min_distance_squared = FLT_MAX; + + /* Sliding zone designator which is the closest to the mouse + * across all the tracks. + */ + int min_action = -1, min_area = 0, min_corner = -1; + MovieTrackingTrack *min_track = NULL; + + ED_space_clip_get_size(sc, &width, &height); + + if (width == 0 || height == 0) + return NULL; + + ED_clip_mouse_pos(sc, ar, event->mval, co); + + track = tracksbase->first; + while (track) { + if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) { + const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); + /* Sliding zone designator which is the closest to the mouse for + * the current tracks. + */ + float min_distance_squared = FLT_MAX; + int action = -1, area = 0, corner = -1; + + if ((marker->flag & MARKER_DISABLED) == 0) { + float distance_squared; + + /* We start checking with whether the mouse is close enough + * to the pattern offset area. + */ + distance_squared = mouse_to_offset_distance_squared(track, marker, co, width, height); + area = TRACK_AREA_POINT; + action = SLIDE_ACTION_POS; + + /* NOTE: All checks here are assuming there's no maximum distance + * limit, so checks are quite simple here. + * Actual distance clipping happens later once all the sliding + * zones are checked. + */ + min_distance_squared = distance_squared; + + /* If search area is visible, check how close to it's sliding + * zones mouse is. + */ + if (sc->flag & SC_SHOW_MARKER_SEARCH) { + distance_squared = mouse_to_search_corner_distance_squared(marker, co, 1, width, height); + if (distance_squared < min_distance_squared) { + area = TRACK_AREA_SEARCH; + action = SLIDE_ACTION_OFFSET; + min_distance_squared = distance_squared; + } + + distance_squared = mouse_to_search_corner_distance_squared(marker, co, 0, width, height); + if (distance_squared < min_distance_squared) { + area = TRACK_AREA_SEARCH; + action = SLIDE_ACTION_SIZE; + min_distance_squared = distance_squared; + } + } + + /* If pattern area is visible, check which corner is closest to + * the mouse. + */ + if (sc->flag & SC_SHOW_MARKER_PATTERN) { + int current_corner = -1; + distance_squared = mouse_to_closest_pattern_corner_distance_squared( + marker, co, width, height, ¤t_corner); + if (distance_squared < min_distance_squared) { + area = TRACK_AREA_PAT; + action = SLIDE_ACTION_POS; + corner = current_corner; + min_distance_squared = distance_squared; + } + + /* Here we also check whether the mouse is actually closer to + * the widget which controls scale and tilt. + */ + distance_squared = mouse_to_tilt_distance_squared(marker, co, width, height); + if (distance_squared < min_distance_squared) { + area = TRACK_AREA_PAT; + action = SLIDE_ACTION_TILT_SIZE; + min_distance_squared = distance_squared; + } + } + + if (min_distance_squared < global_min_distance_squared) { + min_area = area; + min_action = action; + min_corner = corner; + min_track = track; + global_min_distance_squared = min_distance_squared; + } + } + } + + track = track->next; + } + + if (global_min_distance_squared < distance_clip_squared / sc->zoom) { + if (area_r) { + *area_r = min_area; + } + if (action_r) { + *action_r = min_action; + } + if (corner_r) { + *corner_r = min_corner; + } + return min_track; + } + return NULL; } static void *slide_marker_customdata(bContext *C, const wmEvent *event) { - SpaceClip *sc = CTX_wm_space_clip(C); - ARegion *ar = CTX_wm_region(C); + SpaceClip *sc = CTX_wm_space_clip(C); + ARegion *ar = CTX_wm_region(C); - MovieTrackingTrack *track; - int width, height; - float co[2]; - void *customdata = NULL; - int framenr = ED_space_clip_get_clip_frame_number(sc); - int area, action, corner; + MovieTrackingTrack *track; + int width, height; + float co[2]; + void *customdata = NULL; + int framenr = ED_space_clip_get_clip_frame_number(sc); + int area, action, corner; - ED_space_clip_get_size(sc, &width, &height); + ED_space_clip_get_size(sc, &width, &height); - if (width == 0 || height == 0) { - return NULL; - } + if (width == 0 || height == 0) { + return NULL; + } - ED_clip_mouse_pos(sc, ar, event->mval, co); + ED_clip_mouse_pos(sc, ar, event->mval, co); - track = tracking_marker_check_slide(C, event, &area, &action, &corner); - if (track != NULL) { - MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); - customdata = create_slide_marker_data(sc, - track, - marker, - event, - area, - corner, - action, - width, - height); - } + track = tracking_marker_check_slide(C, event, &area, &action, &corner); + if (track != NULL) { + MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); + customdata = create_slide_marker_data( + sc, track, marker, event, area, corner, action, width, height); + } - return customdata; + return customdata; } static int slide_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - SlideMarkerData *slidedata = slide_marker_customdata(C, event); - if (slidedata != NULL) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; + SlideMarkerData *slidedata = slide_marker_customdata(C, event); + if (slidedata != NULL) { + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; - tracking->act_track = slidedata->track; - tracking->act_plane_track = NULL; + tracking->act_track = slidedata->track; + tracking->act_plane_track = NULL; - op->customdata = slidedata; + op->customdata = slidedata; - clip_tracking_hide_cursor(C); - WM_event_add_modal_handler(C, op); + clip_tracking_hide_cursor(C); + WM_event_add_modal_handler(C, op); - WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL); + WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL); - return OPERATOR_RUNNING_MODAL; - } + return OPERATOR_RUNNING_MODAL; + } - return OPERATOR_PASS_THROUGH; + return OPERATOR_PASS_THROUGH; } static void cancel_mouse_slide(SlideMarkerData *data) { - MovieTrackingTrack *track = data->track; - MovieTrackingMarker *marker = data->marker; + MovieTrackingTrack *track = data->track; + MovieTrackingMarker *marker = data->marker; - memcpy(marker->pattern_corners, - data->old_corners, - sizeof(marker->pattern_corners)); - copy_v2_v2(marker->search_min, data->old_search_min); - copy_v2_v2(marker->search_max, data->old_search_max); - copy_v2_v2(marker->pos, data->old_pos); - copy_v2_v2(track->offset, data->old_offset); + memcpy(marker->pattern_corners, data->old_corners, sizeof(marker->pattern_corners)); + copy_v2_v2(marker->search_min, data->old_search_min); + copy_v2_v2(marker->search_max, data->old_search_max); + copy_v2_v2(marker->pos, data->old_pos); + copy_v2_v2(track->offset, data->old_offset); - if (data->old_markers != NULL) { - for (int a = 0; a < data->track->markersnr; a++) { - copy_v2_v2(data->track->markers[a].pos, data->old_markers[a]); - } - } + if (data->old_markers != NULL) { + for (int a = 0; a < data->track->markersnr; a++) { + copy_v2_v2(data->track->markers[a].pos, data->old_markers[a]); + } + } } static void apply_mouse_slide(bContext *C, SlideMarkerData *data) { - if (data->area == TRACK_AREA_POINT) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - int framenr = ED_space_clip_get_clip_frame_number(sc); - - for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; - plane_track != NULL; - plane_track = plane_track->next) - { - if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) { - if (BKE_tracking_plane_track_has_point_track(plane_track, - data->track)) - { - BKE_tracking_track_plane_from_existing_motion(plane_track, - framenr); - } - } - } - } + if (data->area == TRACK_AREA_POINT) { + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + int framenr = ED_space_clip_get_clip_frame_number(sc); + + for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; plane_track != NULL; + plane_track = plane_track->next) { + if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) { + if (BKE_tracking_plane_track_has_point_track(plane_track, data->track)) { + BKE_tracking_track_plane_from_existing_motion(plane_track, framenr); + } + } + } + } } static void free_slide_data(SlideMarkerData *data) { - if (data->old_markers != NULL) { - MEM_freeN(data->old_markers); - } - MEM_freeN(data); + if (data->old_markers != NULL) { + MEM_freeN(data->old_markers); + } + MEM_freeN(data); } static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event) { - SpaceClip *sc = CTX_wm_space_clip(C); - ARegion *ar = CTX_wm_region(C); - - SlideMarkerData *data = (SlideMarkerData *)op->customdata; - float dx, dy, mdelta[2]; - - switch (event->type) { - case LEFTCTRLKEY: - case RIGHTCTRLKEY: - case LEFTSHIFTKEY: - case RIGHTSHIFTKEY: - if (data->action == SLIDE_ACTION_SIZE) { - if (ELEM(event->type, LEFTCTRLKEY, RIGHTCTRLKEY)) { - data->lock = event->val == KM_RELEASE; - } - } - - if (ELEM(event->type, LEFTSHIFTKEY, RIGHTSHIFTKEY)) { - data->accurate = event->val == KM_PRESS; - } - ATTR_FALLTHROUGH; - case MOUSEMOVE: - mdelta[0] = event->mval[0] - data->mval[0]; - mdelta[1] = event->mval[1] - data->mval[1]; - - dx = mdelta[0] / data->width / sc->zoom; - - if (data->lock) { - dy = -dx / data->height * data->width; - } - else { - dy = mdelta[1] / data->height / sc->zoom; - } - - if (data->accurate) { - dx /= 5.0f; - dy /= 5.0f; - } - - if (data->area == TRACK_AREA_POINT) { - if (data->action == SLIDE_ACTION_OFFSET) { - data->offset[0] = data->old_offset[0] + dx; - data->offset[1] = data->old_offset[1] + dy; - } - else { - data->pos[0] = data->old_pos[0] + dx; - data->pos[1] = data->old_pos[1] + dy; - } - - WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); - DEG_id_tag_update(&sc->clip->id, 0); - } - else if (data->area == TRACK_AREA_PAT) { - if (data->action == SLIDE_ACTION_SIZE) { - float start[2], end[2]; - float scale; - - ED_clip_point_stable_pos(sc, - ar, - data->mval[0], - data->mval[1], - &start[0], - &start[1]); - - sub_v2_v2(start, data->old_pos); - - if (len_squared_v2(start) != 0.0f) { - float mval[2]; - - if (data->accurate) { - mval[0] = data->mval[0] + (event->mval[0] - data->mval[0]) / 5.0f; - mval[1] = data->mval[1] + (event->mval[1] - data->mval[1]) / 5.0f; - } - else { - mval[0] = event->mval[0]; - mval[1] = event->mval[1]; - } - - ED_clip_point_stable_pos(sc, - ar, - mval[0], - mval[1], - &end[0], - &end[1]); - - sub_v2_v2(end, data->old_pos); - scale = len_v2(end) / len_v2(start); - - if (scale > 0.0f) { - for (int a = 0; a < 4; a++) { - mul_v2_v2fl(data->corners[a], - data->old_corners[a], - scale); - } - } - } - - BKE_tracking_marker_clamp(data->marker, CLAMP_PAT_DIM); - } - else if (data->action == SLIDE_ACTION_OFFSET) { - float d[2] = {dx, dy}; - for (int a = 0; a < data->track->markersnr; a++) { - add_v2_v2v2(data->track->markers[a].pos, - data->old_markers[a], - d); - } - sub_v2_v2v2(data->offset, data->old_offset, d); - } - else if (data->action == SLIDE_ACTION_POS) { - float spos[2]; - - copy_v2_v2(spos, data->pos); - - data->pos[0] = data->spos[0] + dx; - data->pos[1] = data->spos[1] + dy; - - if (!slide_check_corners(data->corners)) { - copy_v2_v2(data->pos, spos); - } - - /* Currently only patterns are allowed to have such - * combination of event and data. - */ - BKE_tracking_marker_clamp(data->marker, CLAMP_PAT_DIM); - } - else if (data->action == SLIDE_ACTION_TILT_SIZE) { - float start[2], end[2]; - float scale = 1.0f, angle = 0.0f; - float mval[2]; - - if (data->accurate) { - mval[0] = data->mval[0] + (event->mval[0] - data->mval[0]) / 5.0f; - mval[1] = data->mval[1] + (event->mval[1] - data->mval[1]) / 5.0f; - } - else { - mval[0] = event->mval[0]; - mval[1] = event->mval[1]; - } - - sub_v2_v2v2(start, data->spos, data->old_pos); - - ED_clip_point_stable_pos(sc, ar, mval[0], mval[1], &end[0], &end[1]); - sub_v2_v2(end, data->old_pos); - - if (len_squared_v2(start) != 0.0f) { - scale = len_v2(end) / len_v2(start); - - if (scale < 0.0f) { - scale = 0.0; - } - } - - angle = -angle_signed_v2v2(start, end); + SpaceClip *sc = CTX_wm_space_clip(C); + ARegion *ar = CTX_wm_region(C); + + SlideMarkerData *data = (SlideMarkerData *)op->customdata; + float dx, dy, mdelta[2]; + + switch (event->type) { + case LEFTCTRLKEY: + case RIGHTCTRLKEY: + case LEFTSHIFTKEY: + case RIGHTSHIFTKEY: + if (data->action == SLIDE_ACTION_SIZE) { + if (ELEM(event->type, LEFTCTRLKEY, RIGHTCTRLKEY)) { + data->lock = event->val == KM_RELEASE; + } + } + + if (ELEM(event->type, LEFTSHIFTKEY, RIGHTSHIFTKEY)) { + data->accurate = event->val == KM_PRESS; + } + ATTR_FALLTHROUGH; + case MOUSEMOVE: + mdelta[0] = event->mval[0] - data->mval[0]; + mdelta[1] = event->mval[1] - data->mval[1]; + + dx = mdelta[0] / data->width / sc->zoom; + + if (data->lock) { + dy = -dx / data->height * data->width; + } + else { + dy = mdelta[1] / data->height / sc->zoom; + } + + if (data->accurate) { + dx /= 5.0f; + dy /= 5.0f; + } + + if (data->area == TRACK_AREA_POINT) { + if (data->action == SLIDE_ACTION_OFFSET) { + data->offset[0] = data->old_offset[0] + dx; + data->offset[1] = data->old_offset[1] + dy; + } + else { + data->pos[0] = data->old_pos[0] + dx; + data->pos[1] = data->old_pos[1] + dy; + } + + WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL); + DEG_id_tag_update(&sc->clip->id, 0); + } + else if (data->area == TRACK_AREA_PAT) { + if (data->action == SLIDE_ACTION_SIZE) { + float start[2], end[2]; + float scale; + + ED_clip_point_stable_pos(sc, ar, data->mval[0], data->mval[1], &start[0], &start[1]); + + sub_v2_v2(start, data->old_pos); + + if (len_squared_v2(start) != 0.0f) { + float mval[2]; + + if (data->accurate) { + mval[0] = data->mval[0] + (event->mval[0] - data->mval[0]) / 5.0f; + mval[1] = data->mval[1] + (event->mval[1] - data->mval[1]) / 5.0f; + } + else { + mval[0] = event->mval[0]; + mval[1] = event->mval[1]; + } + + ED_clip_point_stable_pos(sc, ar, mval[0], mval[1], &end[0], &end[1]); + + sub_v2_v2(end, data->old_pos); + scale = len_v2(end) / len_v2(start); + + if (scale > 0.0f) { + for (int a = 0; a < 4; a++) { + mul_v2_v2fl(data->corners[a], data->old_corners[a], scale); + } + } + } + + BKE_tracking_marker_clamp(data->marker, CLAMP_PAT_DIM); + } + else if (data->action == SLIDE_ACTION_OFFSET) { + float d[2] = {dx, dy}; + for (int a = 0; a < data->track->markersnr; a++) { + add_v2_v2v2(data->track->markers[a].pos, data->old_markers[a], d); + } + sub_v2_v2v2(data->offset, data->old_offset, d); + } + else if (data->action == SLIDE_ACTION_POS) { + float spos[2]; + + copy_v2_v2(spos, data->pos); + + data->pos[0] = data->spos[0] + dx; + data->pos[1] = data->spos[1] + dy; + + if (!slide_check_corners(data->corners)) { + copy_v2_v2(data->pos, spos); + } + + /* Currently only patterns are allowed to have such + * combination of event and data. + */ + BKE_tracking_marker_clamp(data->marker, CLAMP_PAT_DIM); + } + else if (data->action == SLIDE_ACTION_TILT_SIZE) { + float start[2], end[2]; + float scale = 1.0f, angle = 0.0f; + float mval[2]; + + if (data->accurate) { + mval[0] = data->mval[0] + (event->mval[0] - data->mval[0]) / 5.0f; + mval[1] = data->mval[1] + (event->mval[1] - data->mval[1]) / 5.0f; + } + else { + mval[0] = event->mval[0]; + mval[1] = event->mval[1]; + } + + sub_v2_v2v2(start, data->spos, data->old_pos); + + ED_clip_point_stable_pos(sc, ar, mval[0], mval[1], &end[0], &end[1]); + sub_v2_v2(end, data->old_pos); - for (int a = 0; a < 4; a++) { - float vec[2]; + if (len_squared_v2(start) != 0.0f) { + scale = len_v2(end) / len_v2(start); - mul_v2_v2fl(data->corners[a], data->old_corners[a], scale); + if (scale < 0.0f) { + scale = 0.0; + } + } - copy_v2_v2(vec, data->corners[a]); - vec[0] *= data->width; - vec[1] *= data->height; + angle = -angle_signed_v2v2(start, end); - data->corners[a][0] = (vec[0] * cosf(angle) - vec[1] * sinf(angle)) / data->width; - data->corners[a][1] = (vec[1] * cosf(angle) + vec[0] * sinf(angle)) / data->height; - } + for (int a = 0; a < 4; a++) { + float vec[2]; - BKE_tracking_marker_clamp(data->marker, CLAMP_PAT_DIM); + mul_v2_v2fl(data->corners[a], data->old_corners[a], scale); - } - } - else if (data->area == TRACK_AREA_SEARCH) { - if (data->action == SLIDE_ACTION_SIZE) { - data->min[0] = data->old_search_min[0] - dx; - data->max[0] = data->old_search_max[0] + dx; + copy_v2_v2(vec, data->corners[a]); + vec[0] *= data->width; + vec[1] *= data->height; - data->min[1] = data->old_search_min[1] + dy; - data->max[1] = data->old_search_max[1] - dy; + data->corners[a][0] = (vec[0] * cosf(angle) - vec[1] * sinf(angle)) / data->width; + data->corners[a][1] = (vec[1] * cosf(angle) + vec[0] * sinf(angle)) / data->height; + } - BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_DIM); - } - else if (data->area == TRACK_AREA_SEARCH) { - float d[2] = {dx, dy}; - add_v2_v2v2(data->min, data->old_search_min, d); - add_v2_v2v2(data->max, data->old_search_max, d); - } + BKE_tracking_marker_clamp(data->marker, CLAMP_PAT_DIM); + } + } + else if (data->area == TRACK_AREA_SEARCH) { + if (data->action == SLIDE_ACTION_SIZE) { + data->min[0] = data->old_search_min[0] - dx; + data->max[0] = data->old_search_max[0] + dx; - BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_POS); - } + data->min[1] = data->old_search_min[1] + dy; + data->max[1] = data->old_search_max[1] - dy; - data->marker->flag &= ~MARKER_TRACKED; + BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_DIM); + } + else if (data->area == TRACK_AREA_SEARCH) { + float d[2] = {dx, dy}; + add_v2_v2v2(data->min, data->old_search_min, d); + add_v2_v2v2(data->max, data->old_search_max, d); + } - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, NULL); + BKE_tracking_marker_clamp(data->marker, CLAMP_SEARCH_POS); + } - break; + data->marker->flag &= ~MARKER_TRACKED; - case LEFTMOUSE: - if (event->val == KM_RELEASE) { - apply_mouse_slide(C, op->customdata); - free_slide_data(op->customdata); + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, NULL); - clip_tracking_show_cursor(C); + break; - return OPERATOR_FINISHED; - } + case LEFTMOUSE: + if (event->val == KM_RELEASE) { + apply_mouse_slide(C, op->customdata); + free_slide_data(op->customdata); - break; + clip_tracking_show_cursor(C); - case ESCKEY: - cancel_mouse_slide(op->customdata); + return OPERATOR_FINISHED; + } - free_slide_data(op->customdata); + break; - clip_tracking_show_cursor(C); + case ESCKEY: + cancel_mouse_slide(op->customdata); - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, NULL); + free_slide_data(op->customdata); - return OPERATOR_CANCELLED; - } + clip_tracking_show_cursor(C); - return OPERATOR_RUNNING_MODAL; + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, NULL); + + return OPERATOR_CANCELLED; + } + + return OPERATOR_RUNNING_MODAL; } void CLIP_OT_slide_marker(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Slide Marker"; - ot->description = "Slide marker areas"; - ot->idname = "CLIP_OT_slide_marker"; + /* identifiers */ + ot->name = "Slide Marker"; + ot->description = "Slide marker areas"; + ot->idname = "CLIP_OT_slide_marker"; - /* api callbacks */ - ot->poll = ED_space_clip_tracking_poll; - ot->invoke = slide_marker_invoke; - ot->modal = slide_marker_modal; + /* api callbacks */ + ot->poll = ED_space_clip_tracking_poll; + ot->invoke = slide_marker_invoke; + ot->modal = slide_marker_modal; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_GRAB_CURSOR | OPTYPE_BLOCKING; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_GRAB_CURSOR | OPTYPE_BLOCKING; - /* properties */ - RNA_def_float_vector(ot->srna, "offset", 2, NULL, -FLT_MAX, FLT_MAX, - "Offset", - "Offset in floating point units, 1.0 is the width and height of the image", - -FLT_MAX, FLT_MAX); + /* properties */ + RNA_def_float_vector(ot->srna, + "offset", + 2, + NULL, + -FLT_MAX, + FLT_MAX, + "Offset", + "Offset in floating point units, 1.0 is the width and height of the image", + -FLT_MAX, + FLT_MAX); } /********************** clear track operator *********************/ static int clear_track_path_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - int action = RNA_enum_get(op->ptr, "action"); - const bool clear_active = RNA_boolean_get(op->ptr, "clear_active"); - int framenr = ED_space_clip_get_clip_frame_number(sc); - - if (clear_active) { - MovieTrackingTrack *track = BKE_tracking_track_get_active(tracking); - if (track != NULL) { - BKE_tracking_track_path_clear(track, framenr, action); - } - } - else { - for (MovieTrackingTrack *track = tracksbase->first; - track != NULL; - track = track->next) - { - if (TRACK_VIEW_SELECTED(sc, track)) { - BKE_tracking_track_path_clear(track, framenr, action); - } - } - } - - BKE_tracking_dopesheet_tag_update(tracking); - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); - - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + int action = RNA_enum_get(op->ptr, "action"); + const bool clear_active = RNA_boolean_get(op->ptr, "clear_active"); + int framenr = ED_space_clip_get_clip_frame_number(sc); + + if (clear_active) { + MovieTrackingTrack *track = BKE_tracking_track_get_active(tracking); + if (track != NULL) { + BKE_tracking_track_path_clear(track, framenr, action); + } + } + else { + for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) { + if (TRACK_VIEW_SELECTED(sc, track)) { + BKE_tracking_track_path_clear(track, framenr, action); + } + } + } + + BKE_tracking_dopesheet_tag_update(tracking); + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); + + return OPERATOR_FINISHED; } void CLIP_OT_clear_track_path(wmOperatorType *ot) { - static const EnumPropertyItem clear_path_actions[] = { - {TRACK_CLEAR_UPTO, "UPTO", 0, "Clear up-to", "Clear path up to current frame"}, - {TRACK_CLEAR_REMAINED, "REMAINED", 0, "Clear remained", "Clear path at remaining frames (after current)"}, - {TRACK_CLEAR_ALL, "ALL", 0, "Clear all", "Clear the whole path"}, - {0, NULL, 0, NULL, NULL}, - }; - - /* identifiers */ - ot->name = "Clear Track Path"; - ot->description = "Clear tracks after/before current position or clear the whole track"; - ot->idname = "CLIP_OT_clear_track_path"; - - /* api callbacks */ - ot->exec = clear_track_path_exec; - ot->poll = ED_space_clip_tracking_poll; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - RNA_def_enum(ot->srna, "action", clear_path_actions, TRACK_CLEAR_REMAINED, "Action", "Clear action to execute"); - RNA_def_boolean(ot->srna, "clear_active", 0, "Clear Active", "Clear active track only instead of all selected tracks"); + static const EnumPropertyItem clear_path_actions[] = { + {TRACK_CLEAR_UPTO, "UPTO", 0, "Clear up-to", "Clear path up to current frame"}, + {TRACK_CLEAR_REMAINED, + "REMAINED", + 0, + "Clear remained", + "Clear path at remaining frames (after current)"}, + {TRACK_CLEAR_ALL, "ALL", 0, "Clear all", "Clear the whole path"}, + {0, NULL, 0, NULL, NULL}, + }; + + /* identifiers */ + ot->name = "Clear Track Path"; + ot->description = "Clear tracks after/before current position or clear the whole track"; + ot->idname = "CLIP_OT_clear_track_path"; + + /* api callbacks */ + ot->exec = clear_track_path_exec; + ot->poll = ED_space_clip_tracking_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, + "action", + clear_path_actions, + TRACK_CLEAR_REMAINED, + "Action", + "Clear action to execute"); + RNA_def_boolean(ot->srna, + "clear_active", + 0, + "Clear Active", + "Clear active track only instead of all selected tracks"); } /********************** disable markers operator *********************/ enum { - MARKER_OP_DISABLE = 0, - MARKER_OP_ENABLE = 1, - MARKER_OP_TOGGLE = 2, + MARKER_OP_DISABLE = 0, + MARKER_OP_ENABLE = 1, + MARKER_OP_TOGGLE = 2, }; static int disable_markers_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - int action = RNA_enum_get(op->ptr, "action"); - int framenr = ED_space_clip_get_clip_frame_number(sc); - - for (MovieTrackingTrack *track = tracksbase->first; - track != NULL; - track = track->next) - { - if (TRACK_VIEW_SELECTED(sc, track) && - (track->flag & TRACK_LOCKED) == 0) - { - MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr); - switch (action) { - case MARKER_OP_DISABLE: - marker->flag |= MARKER_DISABLED; - break; - case MARKER_OP_ENABLE: - marker->flag &= ~MARKER_DISABLED; - break; - case MARKER_OP_TOGGLE: - marker->flag ^= MARKER_DISABLED; - break; - } - } - } - - DEG_id_tag_update(&clip->id, 0); - - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); - - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + int action = RNA_enum_get(op->ptr, "action"); + int framenr = ED_space_clip_get_clip_frame_number(sc); + + for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) { + if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) { + MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr); + switch (action) { + case MARKER_OP_DISABLE: + marker->flag |= MARKER_DISABLED; + break; + case MARKER_OP_ENABLE: + marker->flag &= ~MARKER_DISABLED; + break; + case MARKER_OP_TOGGLE: + marker->flag ^= MARKER_DISABLED; + break; + } + } + } + + DEG_id_tag_update(&clip->id, 0); + + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); + + return OPERATOR_FINISHED; } void CLIP_OT_disable_markers(wmOperatorType *ot) { - static const EnumPropertyItem actions_items[] = { - {MARKER_OP_DISABLE, "DISABLE", 0, "Disable", - "Disable selected markers"}, - {MARKER_OP_ENABLE, "ENABLE", 0, "Enable", - "Enable selected markers"}, - {MARKER_OP_TOGGLE, "TOGGLE", 0, "Toggle", - "Toggle disabled flag for selected markers"}, - {0, NULL, 0, NULL, NULL}, - }; + static const EnumPropertyItem actions_items[] = { + {MARKER_OP_DISABLE, "DISABLE", 0, "Disable", "Disable selected markers"}, + {MARKER_OP_ENABLE, "ENABLE", 0, "Enable", "Enable selected markers"}, + {MARKER_OP_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle disabled flag for selected markers"}, + {0, NULL, 0, NULL, NULL}, + }; - /* identifiers */ - ot->name = "Disable Markers"; - ot->description = "Disable/enable selected markers"; - ot->idname = "CLIP_OT_disable_markers"; + /* identifiers */ + ot->name = "Disable Markers"; + ot->description = "Disable/enable selected markers"; + ot->idname = "CLIP_OT_disable_markers"; - /* api callbacks */ - ot->exec = disable_markers_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = disable_markers_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - /* properties */ - RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Disable action to execute"); + /* properties */ + RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Disable action to execute"); } /********************** set principal center operator *********************/ static int set_center_principal_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - int width, height; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + int width, height; - BKE_movieclip_get_size(clip, &sc->user, &width, &height); + BKE_movieclip_get_size(clip, &sc->user, &width, &height); - if (width == 0 || height == 0) { - return OPERATOR_CANCELLED; - } + if (width == 0 || height == 0) { + return OPERATOR_CANCELLED; + } - clip->tracking.camera.principal[0] = ((float)width) / 2.0f; - clip->tracking.camera.principal[1] = ((float)height) / 2.0f; + clip->tracking.camera.principal[0] = ((float)width) / 2.0f; + clip->tracking.camera.principal[1] = ((float)height) / 2.0f; - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void CLIP_OT_set_center_principal(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Set Principal to Center"; - ot->description = "Set optical center to center of footage"; - ot->idname = "CLIP_OT_set_center_principal"; + /* identifiers */ + ot->name = "Set Principal to Center"; + ot->description = "Set optical center to center of footage"; + ot->idname = "CLIP_OT_set_center_principal"; - /* api callbacks */ - ot->exec = set_center_principal_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = set_center_principal_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** hide tracks operator *********************/ static int hide_tracks_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - int unselected; - - unselected = RNA_boolean_get(op->ptr, "unselected"); - - /* Hide point tracks. */ - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); - for (MovieTrackingTrack *track = tracksbase->first; - track != NULL; - track = track->next) - { - if (unselected == 0 && TRACK_VIEW_SELECTED(sc, track)) { - track->flag |= TRACK_HIDDEN; - } - else if (unselected == 1 && !TRACK_VIEW_SELECTED(sc, track)) { - track->flag |= TRACK_HIDDEN; - } - } - - if (act_track != NULL && act_track->flag & TRACK_HIDDEN) { - clip->tracking.act_track = NULL; - } - - /* Hide place tracks. */ - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - MovieTrackingPlaneTrack *act_plane_track = - BKE_tracking_plane_track_get_active(tracking); - for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; - plane_track != NULL; - plane_track = plane_track->next) - { - if (unselected == 0 && plane_track->flag & SELECT) { - plane_track->flag |= PLANE_TRACK_HIDDEN; - } - else if (unselected == 1 && (plane_track->flag & SELECT) == 0) { - plane_track->flag |= PLANE_TRACK_HIDDEN; - } - } - if (act_plane_track != NULL && act_plane_track->flag & TRACK_HIDDEN) { - clip->tracking.act_plane_track = NULL; - } - - if (unselected == 0) { - /* No selection on screen now, unlock view so it can be - * scrolled nice again. - */ - sc->flag &= ~SC_LOCK_SELECTION; - } - - BKE_tracking_dopesheet_tag_update(tracking); - WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, NULL); - - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + int unselected; + + unselected = RNA_boolean_get(op->ptr, "unselected"); + + /* Hide point tracks. */ + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); + for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) { + if (unselected == 0 && TRACK_VIEW_SELECTED(sc, track)) { + track->flag |= TRACK_HIDDEN; + } + else if (unselected == 1 && !TRACK_VIEW_SELECTED(sc, track)) { + track->flag |= TRACK_HIDDEN; + } + } + + if (act_track != NULL && act_track->flag & TRACK_HIDDEN) { + clip->tracking.act_track = NULL; + } + + /* Hide place tracks. */ + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + MovieTrackingPlaneTrack *act_plane_track = BKE_tracking_plane_track_get_active(tracking); + for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; plane_track != NULL; + plane_track = plane_track->next) { + if (unselected == 0 && plane_track->flag & SELECT) { + plane_track->flag |= PLANE_TRACK_HIDDEN; + } + else if (unselected == 1 && (plane_track->flag & SELECT) == 0) { + plane_track->flag |= PLANE_TRACK_HIDDEN; + } + } + if (act_plane_track != NULL && act_plane_track->flag & TRACK_HIDDEN) { + clip->tracking.act_plane_track = NULL; + } + + if (unselected == 0) { + /* No selection on screen now, unlock view so it can be + * scrolled nice again. + */ + sc->flag &= ~SC_LOCK_SELECTION; + } + + BKE_tracking_dopesheet_tag_update(tracking); + WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, NULL); + + return OPERATOR_FINISHED; } void CLIP_OT_hide_tracks(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Hide Tracks"; - ot->description = "Hide selected tracks"; - ot->idname = "CLIP_OT_hide_tracks"; + /* identifiers */ + ot->name = "Hide Tracks"; + ot->description = "Hide selected tracks"; + ot->idname = "CLIP_OT_hide_tracks"; - /* api callbacks */ - ot->exec = hide_tracks_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = hide_tracks_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - /* properties */ - RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected tracks"); + /* properties */ + RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected tracks"); } /********************** hide tracks clear operator *********************/ static int hide_tracks_clear_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; - /* Unhide point tracks. */ - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - for (MovieTrackingTrack *track = tracksbase->first; - track != NULL; - track = track->next) - { - track->flag &= ~TRACK_HIDDEN; - } + /* Unhide point tracks. */ + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) { + track->flag &= ~TRACK_HIDDEN; + } - /* Unhide plane tracks. */ - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; - plane_track != NULL; - plane_track = plane_track->next) - { - plane_track->flag &= ~PLANE_TRACK_HIDDEN; - } + /* Unhide plane tracks. */ + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; plane_track != NULL; + plane_track = plane_track->next) { + plane_track->flag &= ~PLANE_TRACK_HIDDEN; + } - BKE_tracking_dopesheet_tag_update(tracking); + BKE_tracking_dopesheet_tag_update(tracking); - WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, NULL); + WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, NULL); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void CLIP_OT_hide_tracks_clear(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Hide Tracks Clear"; - ot->description = "Clear hide selected tracks"; - ot->idname = "CLIP_OT_hide_tracks_clear"; + /* identifiers */ + ot->name = "Hide Tracks Clear"; + ot->description = "Clear hide selected tracks"; + ot->idname = "CLIP_OT_hide_tracks_clear"; - /* api callbacks */ - ot->exec = hide_tracks_clear_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = hide_tracks_clear_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** frame jump operator *********************/ static int frame_jump_exec(bContext *C, wmOperator *op) { - Scene *scene = CTX_data_scene(C); - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - int pos = RNA_enum_get(op->ptr, "position"); - int delta; - - if (pos <= 1) { /* jump to path */ - MovieTrackingTrack *track = BKE_tracking_track_get_active(tracking); - if (track == NULL) { - return OPERATOR_CANCELLED; - } - - delta = pos == 1 ? 1 : -1; - while (sc->user.framenr + delta >= SFRA && - sc->user.framenr + delta <= EFRA) - { - int framenr = BKE_movieclip_remap_scene_to_clip_frame( - clip, - sc->user.framenr + delta); - MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, - framenr); - - if (marker == NULL || marker->flag & MARKER_DISABLED) { - break; - } - - sc->user.framenr += delta; - } - } - else { /* to failed frame */ - if (tracking->reconstruction.flag & TRACKING_RECONSTRUCTED) { - int framenr = ED_space_clip_get_clip_frame_number(sc); - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - - delta = pos == 3 ? 1 : -1; - framenr += delta; - - while (framenr + delta >= SFRA && - framenr + delta <= EFRA) - { - MovieReconstructedCamera *cam = - BKE_tracking_camera_get_reconstructed(tracking, - object, - framenr); - - if (cam == NULL) { - sc->user.framenr = - BKE_movieclip_remap_clip_to_scene_frame(clip, - framenr); - break; - } - - framenr += delta; - } - } - } - - if (CFRA != sc->user.framenr) { - CFRA = sc->user.framenr; - BKE_sound_seek_scene(CTX_data_main(C), scene); - - WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); - } - - WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, NULL); - - return OPERATOR_FINISHED; + Scene *scene = CTX_data_scene(C); + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + int pos = RNA_enum_get(op->ptr, "position"); + int delta; + + if (pos <= 1) { /* jump to path */ + MovieTrackingTrack *track = BKE_tracking_track_get_active(tracking); + if (track == NULL) { + return OPERATOR_CANCELLED; + } + + delta = pos == 1 ? 1 : -1; + while (sc->user.framenr + delta >= SFRA && sc->user.framenr + delta <= EFRA) { + int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr + delta); + MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr); + + if (marker == NULL || marker->flag & MARKER_DISABLED) { + break; + } + + sc->user.framenr += delta; + } + } + else { /* to failed frame */ + if (tracking->reconstruction.flag & TRACKING_RECONSTRUCTED) { + int framenr = ED_space_clip_get_clip_frame_number(sc); + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + + delta = pos == 3 ? 1 : -1; + framenr += delta; + + while (framenr + delta >= SFRA && framenr + delta <= EFRA) { + MovieReconstructedCamera *cam = BKE_tracking_camera_get_reconstructed( + tracking, object, framenr); + + if (cam == NULL) { + sc->user.framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, framenr); + break; + } + + framenr += delta; + } + } + } + + if (CFRA != sc->user.framenr) { + CFRA = sc->user.framenr; + BKE_sound_seek_scene(CTX_data_main(C), scene); + + WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); + } + + WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, NULL); + + return OPERATOR_FINISHED; } void CLIP_OT_frame_jump(wmOperatorType *ot) { - static const EnumPropertyItem position_items[] = { - {0, "PATHSTART", 0, "Path Start", "Jump to start of current path"}, - {1, "PATHEND", 0, "Path End", "Jump to end of current path"}, - {2, "FAILEDPREV", 0, "Previous Failed", "Jump to previous failed frame"}, - {2, "FAILNEXT", 0, "Next Failed", "Jump to next failed frame"}, - {0, NULL, 0, NULL, NULL}, - }; + static const EnumPropertyItem position_items[] = { + {0, "PATHSTART", 0, "Path Start", "Jump to start of current path"}, + {1, "PATHEND", 0, "Path End", "Jump to end of current path"}, + {2, "FAILEDPREV", 0, "Previous Failed", "Jump to previous failed frame"}, + {2, "FAILNEXT", 0, "Next Failed", "Jump to next failed frame"}, + {0, NULL, 0, NULL, NULL}, + }; - /* identifiers */ - ot->name = "Jump to Frame"; - ot->description = "Jump to special frame"; - ot->idname = "CLIP_OT_frame_jump"; + /* identifiers */ + ot->name = "Jump to Frame"; + ot->description = "Jump to special frame"; + ot->idname = "CLIP_OT_frame_jump"; - /* api callbacks */ - ot->exec = frame_jump_exec; - ot->poll = ED_space_clip_poll; + /* api callbacks */ + ot->exec = frame_jump_exec; + ot->poll = ED_space_clip_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - /* properties */ - RNA_def_enum(ot->srna, "position", position_items, 0, "Position", - "Position to jump to"); + /* properties */ + RNA_def_enum(ot->srna, "position", position_items, 0, "Position", "Position to jump to"); } /********************** join tracks operator *********************/ static int join_tracks_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - MovieTrackingStabilization *stab = &tracking->stabilization; - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - bool update_stabilization = false; - - MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); - if (act_track == NULL) { - BKE_report(op->reports, RPT_ERROR, "No active track to join to"); - return OPERATOR_CANCELLED; - } - - GSet *point_tracks = BLI_gset_ptr_new(__func__); - - for (MovieTrackingTrack *track = tracksbase->first, *next_track; - track != NULL; - track = next_track) - { - next_track = track->next; - if (TRACK_VIEW_SELECTED(sc, track) && track != act_track) { - BKE_tracking_tracks_join(tracking, act_track, track); - - if (track->flag & TRACK_USE_2D_STAB) { - update_stabilization = true; - if ((act_track->flag & TRACK_USE_2D_STAB) == 0) { - act_track->flag |= TRACK_USE_2D_STAB; - } - else { - stab->tot_track--; - } - BLI_assert(0 <= stab->tot_track); - } - if (track->flag & TRACK_USE_2D_STAB_ROT) { - update_stabilization = true; - if ((act_track->flag & TRACK_USE_2D_STAB_ROT) == 0) { - act_track->flag |= TRACK_USE_2D_STAB_ROT; - } - else { - stab->tot_rot_track--; - } - BLI_assert(0 <= stab->tot_rot_track); - } - - for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; - plane_track != NULL; - plane_track = plane_track->next) - { - if (BKE_tracking_plane_track_has_point_track(plane_track, track)) { - BKE_tracking_plane_track_replace_point_track(plane_track, - track, - act_track); - if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) { - BLI_gset_insert(point_tracks, plane_track); - } - } - } - - BKE_tracking_track_free(track); - BLI_freelinkN(tracksbase, track); - } - } - - if (update_stabilization) { - WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); - } - - GSetIterator gs_iter; - int framenr = ED_space_clip_get_clip_frame_number(sc); - GSET_ITER (gs_iter, point_tracks) { - MovieTrackingPlaneTrack *plane_track = BLI_gsetIterator_getKey(&gs_iter); - BKE_tracking_track_plane_from_existing_motion( plane_track, framenr); - } - - BLI_gset_free(point_tracks, NULL); - - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + MovieTrackingStabilization *stab = &tracking->stabilization; + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + bool update_stabilization = false; + + MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); + if (act_track == NULL) { + BKE_report(op->reports, RPT_ERROR, "No active track to join to"); + return OPERATOR_CANCELLED; + } + + GSet *point_tracks = BLI_gset_ptr_new(__func__); + + for (MovieTrackingTrack *track = tracksbase->first, *next_track; track != NULL; + track = next_track) { + next_track = track->next; + if (TRACK_VIEW_SELECTED(sc, track) && track != act_track) { + BKE_tracking_tracks_join(tracking, act_track, track); + + if (track->flag & TRACK_USE_2D_STAB) { + update_stabilization = true; + if ((act_track->flag & TRACK_USE_2D_STAB) == 0) { + act_track->flag |= TRACK_USE_2D_STAB; + } + else { + stab->tot_track--; + } + BLI_assert(0 <= stab->tot_track); + } + if (track->flag & TRACK_USE_2D_STAB_ROT) { + update_stabilization = true; + if ((act_track->flag & TRACK_USE_2D_STAB_ROT) == 0) { + act_track->flag |= TRACK_USE_2D_STAB_ROT; + } + else { + stab->tot_rot_track--; + } + BLI_assert(0 <= stab->tot_rot_track); + } + + for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; plane_track != NULL; + plane_track = plane_track->next) { + if (BKE_tracking_plane_track_has_point_track(plane_track, track)) { + BKE_tracking_plane_track_replace_point_track(plane_track, track, act_track); + if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) { + BLI_gset_insert(point_tracks, plane_track); + } + } + } + + BKE_tracking_track_free(track); + BLI_freelinkN(tracksbase, track); + } + } + + if (update_stabilization) { + WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); + } + + GSetIterator gs_iter; + int framenr = ED_space_clip_get_clip_frame_number(sc); + GSET_ITER (gs_iter, point_tracks) { + MovieTrackingPlaneTrack *plane_track = BLI_gsetIterator_getKey(&gs_iter); + BKE_tracking_track_plane_from_existing_motion(plane_track, framenr); + } + + BLI_gset_free(point_tracks, NULL); + + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + + return OPERATOR_FINISHED; } void CLIP_OT_join_tracks(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Join Tracks"; - ot->description = "Join selected tracks"; - ot->idname = "CLIP_OT_join_tracks"; + /* identifiers */ + ot->name = "Join Tracks"; + ot->description = "Join selected tracks"; + ot->idname = "CLIP_OT_join_tracks"; - /* api callbacks */ - ot->exec = join_tracks_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = join_tracks_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** lock tracks operator *********************/ enum { - TRACK_ACTION_LOCK = 0, - TRACK_ACTION_UNLOCK = 1, - TRACK_ACTION_TOGGLE = 2, + TRACK_ACTION_LOCK = 0, + TRACK_ACTION_UNLOCK = 1, + TRACK_ACTION_TOGGLE = 2, }; static int lock_tracks_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - int action = RNA_enum_get(op->ptr, "action"); - - for (MovieTrackingTrack *track = tracksbase->first; - track != NULL; - track = track->next) - { - if (TRACK_VIEW_SELECTED(sc, track)) { - switch (action) { - case TRACK_ACTION_LOCK: - track->flag |= TRACK_LOCKED; - break; - case TRACK_ACTION_UNLOCK: - track->flag &= ~TRACK_LOCKED; - break; - case TRACK_ACTION_TOGGLE: - track->flag ^= TRACK_LOCKED; - break; - } - } - } - - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); - - return OPERATOR_FINISHED; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + int action = RNA_enum_get(op->ptr, "action"); + + for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) { + if (TRACK_VIEW_SELECTED(sc, track)) { + switch (action) { + case TRACK_ACTION_LOCK: + track->flag |= TRACK_LOCKED; + break; + case TRACK_ACTION_UNLOCK: + track->flag &= ~TRACK_LOCKED; + break; + case TRACK_ACTION_TOGGLE: + track->flag ^= TRACK_LOCKED; + break; + } + } + } + + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip); + + return OPERATOR_FINISHED; } void CLIP_OT_lock_tracks(wmOperatorType *ot) { - static const EnumPropertyItem actions_items[] = { - {TRACK_ACTION_LOCK, "LOCK", 0, "Lock", "Lock selected tracks"}, - {TRACK_ACTION_UNLOCK, "UNLOCK", 0, "Unlock", "Unlock selected tracks"}, - {TRACK_ACTION_TOGGLE, "TOGGLE", 0, "Toggle", - "Toggle locked flag for selected tracks"}, - {0, NULL, 0, NULL, NULL}, - }; + static const EnumPropertyItem actions_items[] = { + {TRACK_ACTION_LOCK, "LOCK", 0, "Lock", "Lock selected tracks"}, + {TRACK_ACTION_UNLOCK, "UNLOCK", 0, "Unlock", "Unlock selected tracks"}, + {TRACK_ACTION_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle locked flag for selected tracks"}, + {0, NULL, 0, NULL, NULL}, + }; - /* identifiers */ - ot->name = "Lock Tracks"; - ot->description = "Lock/unlock selected tracks"; - ot->idname = "CLIP_OT_lock_tracks"; + /* identifiers */ + ot->name = "Lock Tracks"; + ot->description = "Lock/unlock selected tracks"; + ot->idname = "CLIP_OT_lock_tracks"; - /* api callbacks */ - ot->exec = lock_tracks_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = lock_tracks_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - /* properties */ - RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", - "Lock action to execute"); + /* properties */ + RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Lock action to execute"); } /********************** set keyframe operator *********************/ enum { - SOLVER_KEYFRAME_A = 0, - SOLVER_KEYFRAME_B = 1, + SOLVER_KEYFRAME_A = 0, + SOLVER_KEYFRAME_B = 1, }; static int set_solver_keyframe_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - int keyframe = RNA_enum_get(op->ptr, "keyframe"); - int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, - sc->user.framenr); + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + int keyframe = RNA_enum_get(op->ptr, "keyframe"); + int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr); - if (keyframe == SOLVER_KEYFRAME_A) { - object->keyframe1 = framenr; - } - else { - object->keyframe2 = framenr; - } + if (keyframe == SOLVER_KEYFRAME_A) { + object->keyframe1 = framenr; + } + else { + object->keyframe2 = framenr; + } - WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); + WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void CLIP_OT_set_solver_keyframe(wmOperatorType *ot) { - static const EnumPropertyItem keyframe_items[] = { - {SOLVER_KEYFRAME_A, "KEYFRAME_A", 0, "Keyframe A", ""}, - {SOLVER_KEYFRAME_B, "KEYFRAME_B", 0, "Keyframe B", ""}, - {0, NULL, 0, NULL, NULL}, - }; + static const EnumPropertyItem keyframe_items[] = { + {SOLVER_KEYFRAME_A, "KEYFRAME_A", 0, "Keyframe A", ""}, + {SOLVER_KEYFRAME_B, "KEYFRAME_B", 0, "Keyframe B", ""}, + {0, NULL, 0, NULL, NULL}, + }; - /* identifiers */ - ot->name = "Set Solver Keyframe"; - ot->description = "Set keyframe used by solver"; - ot->idname = "CLIP_OT_set_solver_keyframe"; + /* identifiers */ + ot->name = "Set Solver Keyframe"; + ot->description = "Set keyframe used by solver"; + ot->idname = "CLIP_OT_set_solver_keyframe"; - /* api callbacks */ - ot->exec = set_solver_keyframe_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = set_solver_keyframe_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - /* properties */ - RNA_def_enum(ot->srna, "keyframe", keyframe_items, 0, "Keyframe", - "Keyframe to set"); + /* properties */ + RNA_def_enum(ot->srna, "keyframe", keyframe_items, 0, "Keyframe", "Keyframe to set"); } /********************** track copy color operator *********************/ static int track_copy_color_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); - if (act_track == NULL) { - return OPERATOR_CANCELLED; - } + MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); + if (act_track == NULL) { + return OPERATOR_CANCELLED; + } - for (MovieTrackingTrack *track = tracksbase->first; - track != NULL; - track = track->next) - { - if (TRACK_VIEW_SELECTED(sc, track) && track != act_track) { - track->flag &= ~TRACK_CUSTOMCOLOR; - if (act_track->flag & TRACK_CUSTOMCOLOR) { - copy_v3_v3(track->color, act_track->color); - track->flag |= TRACK_CUSTOMCOLOR; - } - } - } + for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) { + if (TRACK_VIEW_SELECTED(sc, track) && track != act_track) { + track->flag &= ~TRACK_CUSTOMCOLOR; + if (act_track->flag & TRACK_CUSTOMCOLOR) { + copy_v3_v3(track->color, act_track->color); + track->flag |= TRACK_CUSTOMCOLOR; + } + } + } - WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); + WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void CLIP_OT_track_copy_color(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Copy Color"; - ot->description = "Copy color to all selected tracks"; - ot->idname = "CLIP_OT_track_copy_color"; + /* identifiers */ + ot->name = "Copy Color"; + ot->description = "Copy color to all selected tracks"; + ot->idname = "CLIP_OT_track_copy_color"; - /* api callbacks */ - ot->exec = track_copy_color_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = track_copy_color_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** clean tracks operator *********************/ static bool is_track_clean(MovieTrackingTrack *track, int frames, int del) { - bool ok = true; - int prev = -1, count = 0; - MovieTrackingMarker *markers = track->markers, *new_markers = NULL; - int start_disabled = 0; - int markersnr = track->markersnr; - - if (del) { - new_markers = MEM_callocN(markersnr * sizeof(MovieTrackingMarker), - "track cleaned markers"); - } - - for (int a = 0; a < markersnr; a++) { - int end = 0; - - if (prev == -1) { - if ((markers[a].flag & MARKER_DISABLED) == 0) { - prev = a; - } - else { - start_disabled = 1; - } - } - - if (prev >= 0) { - end = a == markersnr - 1; - end |= (a < markersnr - 1) && (markers[a].framenr != markers[a + 1].framenr - 1 || - markers[a].flag & MARKER_DISABLED); - } - - if (end) { - int segok = 1, len = 0; - - if (a != prev && markers[a].framenr != markers[a - 1].framenr + 1) { - len = a - prev; - } - else if (markers[a].flag & MARKER_DISABLED) { - len = a - prev; - } - else { - len = a - prev + 1; - } - - if (frames) { - if (len < frames) { - segok = 0; - ok = 0; - - if (!del) { - break; - } - } - } - - if (del) { - if (segok) { - int t = len; - - if (markers[a].flag & MARKER_DISABLED) { - t++; - } - - /* Place disabled marker in front of current segment. */ - if (start_disabled) { - memcpy(new_markers + count, - markers + prev, - sizeof(MovieTrackingMarker)); - new_markers[count].framenr--; - new_markers[count].flag |= MARKER_DISABLED; - - count++; - start_disabled = 0; - } - - memcpy(new_markers + count, - markers + prev, - t * sizeof(MovieTrackingMarker)); - count += t; - } - else if (markers[a].flag & MARKER_DISABLED) { - /* Current segment which would be deleted was finished by - * disabled marker, so next segment should be started from - * disabled marker. - */ - start_disabled = 1; - } - } - - prev = -1; - } - } - - if (del && count == 0) { - ok = 0; - } - - if (del) { - MEM_freeN(track->markers); - - if (count) { - track->markers = new_markers; - } - else { - track->markers = NULL; - MEM_freeN(new_markers); - } - - track->markersnr = count; - } - - return ok; + bool ok = true; + int prev = -1, count = 0; + MovieTrackingMarker *markers = track->markers, *new_markers = NULL; + int start_disabled = 0; + int markersnr = track->markersnr; + + if (del) { + new_markers = MEM_callocN(markersnr * sizeof(MovieTrackingMarker), "track cleaned markers"); + } + + for (int a = 0; a < markersnr; a++) { + int end = 0; + + if (prev == -1) { + if ((markers[a].flag & MARKER_DISABLED) == 0) { + prev = a; + } + else { + start_disabled = 1; + } + } + + if (prev >= 0) { + end = a == markersnr - 1; + end |= (a < markersnr - 1) && (markers[a].framenr != markers[a + 1].framenr - 1 || + markers[a].flag & MARKER_DISABLED); + } + + if (end) { + int segok = 1, len = 0; + + if (a != prev && markers[a].framenr != markers[a - 1].framenr + 1) { + len = a - prev; + } + else if (markers[a].flag & MARKER_DISABLED) { + len = a - prev; + } + else { + len = a - prev + 1; + } + + if (frames) { + if (len < frames) { + segok = 0; + ok = 0; + + if (!del) { + break; + } + } + } + + if (del) { + if (segok) { + int t = len; + + if (markers[a].flag & MARKER_DISABLED) { + t++; + } + + /* Place disabled marker in front of current segment. */ + if (start_disabled) { + memcpy(new_markers + count, markers + prev, sizeof(MovieTrackingMarker)); + new_markers[count].framenr--; + new_markers[count].flag |= MARKER_DISABLED; + + count++; + start_disabled = 0; + } + + memcpy(new_markers + count, markers + prev, t * sizeof(MovieTrackingMarker)); + count += t; + } + else if (markers[a].flag & MARKER_DISABLED) { + /* Current segment which would be deleted was finished by + * disabled marker, so next segment should be started from + * disabled marker. + */ + start_disabled = 1; + } + } + + prev = -1; + } + } + + if (del && count == 0) { + ok = 0; + } + + if (del) { + MEM_freeN(track->markers); + + if (count) { + track->markers = new_markers; + } + else { + track->markers = NULL; + MEM_freeN(new_markers); + } + + track->markersnr = count; + } + + return ok; } static int clean_tracks_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); - int frames = RNA_int_get(op->ptr, "frames"); - int action = RNA_enum_get(op->ptr, "action"); - float error = RNA_float_get(op->ptr, "error"); - - if (error && action == TRACKING_CLEAN_DELETE_SEGMENT) { - action = TRACKING_CLEAN_DELETE_TRACK; - } - - for (MovieTrackingTrack *track = tracksbase->first, *next_track; - track != NULL; - track = next_track) - { - next_track = track->next; - - if ((track->flag & TRACK_HIDDEN) == 0 && - (track->flag & TRACK_LOCKED) == 0) - { - bool ok; - - ok = (is_track_clean(track, - frames, - action == TRACKING_CLEAN_DELETE_SEGMENT)) && - ((error == 0.0f) || - (track->flag & TRACK_HAS_BUNDLE) == 0 || - (track->error < error)); - - if (!ok) { - if (action == TRACKING_CLEAN_SELECT) { - BKE_tracking_track_flag_set(track, TRACK_AREA_ALL, SELECT); - } - else if (action == TRACKING_CLEAN_DELETE_TRACK) { - if (track == act_track) { - clip->tracking.act_track = NULL; - } - BKE_tracking_track_free(track); - BLI_freelinkN(tracksbase, track); - track = NULL; - } - - /* Happens when all tracking segments are not long enough. */ - if (track && track->markersnr == 0) { - if (track == act_track) { - clip->tracking.act_track = NULL; - } - BKE_tracking_track_free(track); - BLI_freelinkN(tracksbase, track); - } - } - } - } - - BKE_tracking_dopesheet_tag_update(tracking); - - WM_event_add_notifier(C, NC_MOVIECLIP | ND_SELECT, clip); - - return OPERATOR_FINISHED; -} - -static int clean_tracks_invoke(bContext *C, - wmOperator *op, - const wmEvent *UNUSED(event)) -{ - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - - if (!RNA_struct_property_is_set(op->ptr, "frames")) { - RNA_int_set(op->ptr, "frames", clip->tracking.settings.clean_frames); - } - - if (!RNA_struct_property_is_set(op->ptr, "error")) { - RNA_float_set(op->ptr, "error", clip->tracking.settings.clean_error); - } - - if (!RNA_struct_property_is_set(op->ptr, "action")) { - RNA_enum_set(op->ptr, "action", clip->tracking.settings.clean_action); - } - - return clean_tracks_exec(C, op); + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); + int frames = RNA_int_get(op->ptr, "frames"); + int action = RNA_enum_get(op->ptr, "action"); + float error = RNA_float_get(op->ptr, "error"); + + if (error && action == TRACKING_CLEAN_DELETE_SEGMENT) { + action = TRACKING_CLEAN_DELETE_TRACK; + } + + for (MovieTrackingTrack *track = tracksbase->first, *next_track; track != NULL; + track = next_track) { + next_track = track->next; + + if ((track->flag & TRACK_HIDDEN) == 0 && (track->flag & TRACK_LOCKED) == 0) { + bool ok; + + ok = (is_track_clean(track, frames, action == TRACKING_CLEAN_DELETE_SEGMENT)) && + ((error == 0.0f) || (track->flag & TRACK_HAS_BUNDLE) == 0 || (track->error < error)); + + if (!ok) { + if (action == TRACKING_CLEAN_SELECT) { + BKE_tracking_track_flag_set(track, TRACK_AREA_ALL, SELECT); + } + else if (action == TRACKING_CLEAN_DELETE_TRACK) { + if (track == act_track) { + clip->tracking.act_track = NULL; + } + BKE_tracking_track_free(track); + BLI_freelinkN(tracksbase, track); + track = NULL; + } + + /* Happens when all tracking segments are not long enough. */ + if (track && track->markersnr == 0) { + if (track == act_track) { + clip->tracking.act_track = NULL; + } + BKE_tracking_track_free(track); + BLI_freelinkN(tracksbase, track); + } + } + } + } + + BKE_tracking_dopesheet_tag_update(tracking); + + WM_event_add_notifier(C, NC_MOVIECLIP | ND_SELECT, clip); + + return OPERATOR_FINISHED; +} + +static int clean_tracks_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) +{ + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + + if (!RNA_struct_property_is_set(op->ptr, "frames")) { + RNA_int_set(op->ptr, "frames", clip->tracking.settings.clean_frames); + } + + if (!RNA_struct_property_is_set(op->ptr, "error")) { + RNA_float_set(op->ptr, "error", clip->tracking.settings.clean_error); + } + + if (!RNA_struct_property_is_set(op->ptr, "action")) { + RNA_enum_set(op->ptr, "action", clip->tracking.settings.clean_action); + } + + return clean_tracks_exec(C, op); } void CLIP_OT_clean_tracks(wmOperatorType *ot) { - static const EnumPropertyItem actions_items[] = { - {TRACKING_CLEAN_SELECT, "SELECT", 0, "Select", - "Select unclean tracks"}, - {TRACKING_CLEAN_DELETE_TRACK, "DELETE_TRACK", 0, "Delete Track", - "Delete unclean tracks"}, - {TRACKING_CLEAN_DELETE_SEGMENT, "DELETE_SEGMENTS", 0, "Delete Segments", - "Delete unclean segments of tracks"}, - {0, NULL, 0, NULL, NULL}, - }; - - /* identifiers */ - ot->name = "Clean Tracks"; - ot->description = "Clean tracks with high error values or few frames"; - ot->idname = "CLIP_OT_clean_tracks"; - - /* api callbacks */ - ot->exec = clean_tracks_exec; - ot->invoke = clean_tracks_invoke; - ot->poll = ED_space_clip_tracking_poll; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - RNA_def_int(ot->srna, "frames", 0, 0, INT_MAX, "Tracked Frames", - "Effect on tracks which are tracked less than " - "specified amount of frames", - 0, INT_MAX); - RNA_def_float(ot->srna, "error", 0.0f, 0.0f, FLT_MAX, "Reprojection Error", - "Effect on tracks which have got larger re-projection error", - 0.0f, 100.0f); - RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", - "Cleanup action to execute"); + static const EnumPropertyItem actions_items[] = { + {TRACKING_CLEAN_SELECT, "SELECT", 0, "Select", "Select unclean tracks"}, + {TRACKING_CLEAN_DELETE_TRACK, "DELETE_TRACK", 0, "Delete Track", "Delete unclean tracks"}, + {TRACKING_CLEAN_DELETE_SEGMENT, + "DELETE_SEGMENTS", + 0, + "Delete Segments", + "Delete unclean segments of tracks"}, + {0, NULL, 0, NULL, NULL}, + }; + + /* identifiers */ + ot->name = "Clean Tracks"; + ot->description = "Clean tracks with high error values or few frames"; + ot->idname = "CLIP_OT_clean_tracks"; + + /* api callbacks */ + ot->exec = clean_tracks_exec; + ot->invoke = clean_tracks_invoke; + ot->poll = ED_space_clip_tracking_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + RNA_def_int(ot->srna, + "frames", + 0, + 0, + INT_MAX, + "Tracked Frames", + "Effect on tracks which are tracked less than " + "specified amount of frames", + 0, + INT_MAX); + RNA_def_float(ot->srna, + "error", + 0.0f, + 0.0f, + FLT_MAX, + "Reprojection Error", + "Effect on tracks which have got larger re-projection error", + 0.0f, + 100.0f); + RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Cleanup action to execute"); } /********************** add tracking object *********************/ static int tracking_object_new_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; - BKE_tracking_object_add(tracking, "Object"); + BKE_tracking_object_add(tracking, "Object"); - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void CLIP_OT_tracking_object_new(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Add Tracking Object"; - ot->description = "Add new object for tracking"; - ot->idname = "CLIP_OT_tracking_object_new"; + /* identifiers */ + ot->name = "Add Tracking Object"; + ot->description = "Add new object for tracking"; + ot->idname = "CLIP_OT_tracking_object_new"; - /* api callbacks */ - ot->exec = tracking_object_new_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = tracking_object_new_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** remove tracking object *********************/ static int tracking_object_remove_exec(bContext *C, wmOperator *op) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - MovieTrackingObject *object; + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *object; - object = BKE_tracking_object_get_active(tracking); + object = BKE_tracking_object_get_active(tracking); - if (object->flag & TRACKING_OBJECT_CAMERA) { - BKE_report(op->reports, - RPT_WARNING, - "Object used for camera tracking cannot be deleted"); - return OPERATOR_CANCELLED; - } + if (object->flag & TRACKING_OBJECT_CAMERA) { + BKE_report(op->reports, RPT_WARNING, "Object used for camera tracking cannot be deleted"); + return OPERATOR_CANCELLED; + } - BKE_tracking_object_delete(tracking, object); + BKE_tracking_object_delete(tracking, object); - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void CLIP_OT_tracking_object_remove(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Remove Tracking Object"; - ot->description = "Remove object for tracking"; - ot->idname = "CLIP_OT_tracking_object_remove"; + /* identifiers */ + ot->name = "Remove Tracking Object"; + ot->description = "Remove object for tracking"; + ot->idname = "CLIP_OT_tracking_object_remove"; - /* api callbacks */ - ot->exec = tracking_object_remove_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = tracking_object_remove_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** copy tracks to clipboard operator *********************/ static int copy_tracks_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - clip_tracking_clear_invisible_track_selection(sc, clip); + clip_tracking_clear_invisible_track_selection(sc, clip); - BKE_tracking_clipboard_copy_tracks(tracking, object); + BKE_tracking_clipboard_copy_tracks(tracking, object); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void CLIP_OT_copy_tracks(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Copy Tracks"; - ot->description = "Copy selected tracks to clipboard"; - ot->idname = "CLIP_OT_copy_tracks"; + /* identifiers */ + ot->name = "Copy Tracks"; + ot->description = "Copy selected tracks to clipboard"; + ot->idname = "CLIP_OT_copy_tracks"; - /* api callbacks */ - ot->exec = copy_tracks_exec; - ot->poll = ED_space_clip_tracking_poll; + /* api callbacks */ + ot->exec = copy_tracks_exec; + ot->poll = ED_space_clip_tracking_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER; + /* flags */ + ot->flag = OPTYPE_REGISTER; } /********************* paste tracks from clipboard operator ********************/ static bool paste_tracks_poll(bContext *C) { - if (ED_space_clip_tracking_poll(C)) { - return BKE_tracking_clipboard_has_tracks(); - } + if (ED_space_clip_tracking_poll(C)) { + return BKE_tracking_clipboard_has_tracks(); + } - return 0; + return 0; } static int paste_tracks_exec(bContext *C, wmOperator *UNUSED(op)) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - ListBase *tracks_base = BKE_tracking_object_get_tracks(tracking, object); + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + ListBase *tracks_base = BKE_tracking_object_get_tracks(tracking, object); - BKE_tracking_tracks_deselect_all(tracks_base); - BKE_tracking_clipboard_paste_tracks(tracking, object); + BKE_tracking_tracks_deselect_all(tracks_base); + BKE_tracking_clipboard_paste_tracks(tracking, object); - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } void CLIP_OT_paste_tracks(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Paste Tracks"; - ot->description = "Paste tracks from clipboard"; - ot->idname = "CLIP_OT_paste_tracks"; + /* identifiers */ + ot->name = "Paste Tracks"; + ot->description = "Paste tracks from clipboard"; + ot->idname = "CLIP_OT_paste_tracks"; - /* api callbacks */ - ot->exec = paste_tracks_exec; - ot->poll = paste_tracks_poll; + /* api callbacks */ + ot->exec = paste_tracks_exec; + ot->poll = paste_tracks_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** Insert track keyframe operator *********************/ static void keyframe_set_flag(bContext *C, bool set) { - SpaceClip *sc = CTX_wm_space_clip(C); - MovieClip *clip = ED_space_clip_get_clip(sc); - MovieTracking *tracking = &clip->tracking; - int framenr = ED_space_clip_get_clip_frame_number(sc); - - ListBase *tracks_base = BKE_tracking_get_active_tracks(tracking); - for (MovieTrackingTrack *track = tracks_base->first; - track != NULL; - track = track->next) - { - if (TRACK_VIEW_SELECTED(sc, track)) { - if (set) { - MovieTrackingMarker *marker = - BKE_tracking_marker_ensure(track, framenr); - marker->flag &= ~MARKER_TRACKED; - } - else { - MovieTrackingMarker *marker = - BKE_tracking_marker_get_exact(track, framenr); - if (marker != NULL) { - marker->flag |= MARKER_TRACKED; - } - } - } - } - - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; - plane_track != NULL; - plane_track = plane_track->next) - { - if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { - if (set) { - MovieTrackingPlaneMarker *plane_marker = - BKE_tracking_plane_marker_ensure(plane_track, framenr); - if (plane_marker->flag & PLANE_MARKER_TRACKED) { - plane_marker->flag &= ~PLANE_MARKER_TRACKED; - BKE_tracking_track_plane_from_existing_motion( - plane_track, - plane_marker->framenr); - } - } - else { - MovieTrackingPlaneMarker *plane_marker = - BKE_tracking_plane_marker_get_exact(plane_track, - framenr); - if (plane_marker) { - if ((plane_marker->flag & PLANE_MARKER_TRACKED) == 0) { - plane_marker->flag |= PLANE_MARKER_TRACKED; - BKE_tracking_retrack_plane_from_existing_motion_at_segment( - plane_track, - plane_marker->framenr); - } - } - } - } - } - - WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + MovieTracking *tracking = &clip->tracking; + int framenr = ED_space_clip_get_clip_frame_number(sc); + + ListBase *tracks_base = BKE_tracking_get_active_tracks(tracking); + for (MovieTrackingTrack *track = tracks_base->first; track != NULL; track = track->next) { + if (TRACK_VIEW_SELECTED(sc, track)) { + if (set) { + MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr); + marker->flag &= ~MARKER_TRACKED; + } + else { + MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr); + if (marker != NULL) { + marker->flag |= MARKER_TRACKED; + } + } + } + } + + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; plane_track != NULL; + plane_track = plane_track->next) { + if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { + if (set) { + MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_ensure(plane_track, + framenr); + if (plane_marker->flag & PLANE_MARKER_TRACKED) { + plane_marker->flag &= ~PLANE_MARKER_TRACKED; + BKE_tracking_track_plane_from_existing_motion(plane_track, plane_marker->framenr); + } + } + else { + MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get_exact(plane_track, + framenr); + if (plane_marker) { + if ((plane_marker->flag & PLANE_MARKER_TRACKED) == 0) { + plane_marker->flag |= PLANE_MARKER_TRACKED; + BKE_tracking_retrack_plane_from_existing_motion_at_segment(plane_track, + plane_marker->framenr); + } + } + } + } + } + + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); } static int keyframe_insert_exec(bContext *C, wmOperator *UNUSED(op)) { - keyframe_set_flag(C, true); - return OPERATOR_FINISHED; + keyframe_set_flag(C, true); + return OPERATOR_FINISHED; } void CLIP_OT_keyframe_insert(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Insert keyframe"; - ot->description = "Insert a keyframe to selected tracks at current frame"; - ot->idname = "CLIP_OT_keyframe_insert"; + /* identifiers */ + ot->name = "Insert keyframe"; + ot->description = "Insert a keyframe to selected tracks at current frame"; + ot->idname = "CLIP_OT_keyframe_insert"; - /* api callbacks */ - ot->poll = ED_space_clip_tracking_poll; - ot->exec = keyframe_insert_exec; + /* api callbacks */ + ot->poll = ED_space_clip_tracking_poll; + ot->exec = keyframe_insert_exec; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /********************** Delete track keyframe operator *********************/ static int keyframe_delete_exec(bContext *C, wmOperator *UNUSED(op)) { - keyframe_set_flag(C, false); - return OPERATOR_FINISHED; + keyframe_set_flag(C, false); + return OPERATOR_FINISHED; } void CLIP_OT_keyframe_delete(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Delete keyframe"; - ot->description = "Delete a keyframe from selected tracks at current frame"; - ot->idname = "CLIP_OT_keyframe_delete"; + /* identifiers */ + ot->name = "Delete keyframe"; + ot->description = "Delete a keyframe from selected tracks at current frame"; + ot->idname = "CLIP_OT_keyframe_delete"; - /* api callbacks */ - ot->poll = ED_space_clip_tracking_poll; - ot->exec = keyframe_delete_exec; + /* api callbacks */ + ot->poll = ED_space_clip_tracking_poll; + ot->exec = keyframe_delete_exec; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } |