Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_clip/tracking_ops_track.c')
-rw-r--r--source/blender/editors/space_clip/tracking_ops_track.c202
1 files changed, 66 insertions, 136 deletions
diff --git a/source/blender/editors/space_clip/tracking_ops_track.c b/source/blender/editors/space_clip/tracking_ops_track.c
index 580eff08e2c..f5fb415c34f 100644
--- a/source/blender/editors/space_clip/tracking_ops_track.c
+++ b/source/blender/editors/space_clip/tracking_ops_track.c
@@ -153,7 +153,8 @@ static bool track_markers_check_direction(int backwards, int curfra, int efra)
static int track_markers_initjob(bContext *C,
TrackMarkersJob *tmj,
- int backwards)
+ bool backwards,
+ bool sequence)
{
SpaceClip *sc = CTX_wm_space_clip(C);
MovieClip *clip = ED_space_clip_get_clip(sc);
@@ -168,11 +169,21 @@ static int track_markers_initjob(bContext *C,
tmj->clip = clip;
tmj->backwards = backwards;
- if (backwards) {
- tmj->efra = SFRA;
+ if (sequence) {
+ if (backwards) {
+ tmj->efra = SFRA;
+ }
+ else {
+ tmj->efra = EFRA;
+ }
}
else {
- tmj->efra = EFRA;
+ if (backwards) {
+ tmj->efra = tmj->sfra - 1;
+ }
+ else {
+ tmj->efra = tmj->sfra + 1;
+ }
}
/* Limit frames to be tracked by user setting. */
@@ -303,106 +314,7 @@ static void track_markers_freejob(void *tmv)
MEM_freeN(tmj);
}
-/* TODO(sergey): Majority of the code here can be de-duplicated with the job. */
-static int track_markers_exec(bContext *C, wmOperator *op)
-{
- SpaceClip *sc;
- MovieClip *clip;
- Scene *scene = CTX_data_scene(C);
- struct AutoTrackContext *context;
- MovieClipUser *user, fake_user = {0};
- int framenr, sfra, efra;
- const bool backwards = RNA_boolean_get(op->ptr, "backwards");
- const bool sequence = RNA_boolean_get(op->ptr, "sequence");
- int frames_limit;
-
- if (RNA_struct_property_is_set(op->ptr, "clip")) {
- Main *bmain = CTX_data_main(C);
- char clip_name[MAX_ID_NAME - 2];
-
- RNA_string_get(op->ptr, "clip", clip_name);
- clip = (MovieClip *)BLI_findstring(&bmain->movieclip,
- clip_name,
- offsetof(ID, name) + 2);
- sc = NULL;
-
- if (clip == NULL) {
- return OPERATOR_CANCELLED;
- }
- framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, CFRA);
- fake_user.framenr = framenr;
- user = &fake_user;
- }
- else {
- sc = CTX_wm_space_clip(C);
-
- if (sc == NULL) {
- return OPERATOR_CANCELLED;
- }
-
- clip = ED_space_clip_get_clip(sc);
- framenr = ED_space_clip_get_clip_frame_number(sc);
- user = &sc->user;
- }
-
- sfra = framenr;
-
- if (track_count_markers(sc, clip, framenr) == 0) {
- return OPERATOR_CANCELLED;
- }
-
- track_init_markers(sc, clip, framenr, &frames_limit);
-
- if (backwards) {
- efra = SFRA;
- }
- else {
- efra = EFRA;
- }
-
- /* Limit frames to be tracked by user setting. */
- if (frames_limit) {
- if (backwards)
- efra = MAX2(efra, sfra - frames_limit);
- else
- efra = MIN2(efra, sfra + frames_limit);
- }
-
- efra = BKE_movieclip_remap_scene_to_clip_frame(clip, efra);
-
- if (!track_markers_check_direction(backwards, framenr, efra)) {
- return OPERATOR_CANCELLED;
- }
-
- /* Do not disable tracks due to threshold when tracking frame-by-frame. */
- context = BKE_autotrack_context_new(clip, user, backwards, sequence);
- while (framenr != efra) {
- if (!BKE_autotrack_context_step(context))
- break;
-
- if (backwards) framenr--;
- else framenr++;
-
- if (!sequence)
- break;
- }
-
- BKE_autotrack_context_sync(context);
- BKE_autotrack_context_finish(context);
- BKE_autotrack_context_free(context);
-
- /* Update scene current frame to the lastes tracked frame. */
- scene->r.cfra = BKE_movieclip_remap_clip_to_scene_frame(clip, framenr);
-
- WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip);
- WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
-
- return OPERATOR_FINISHED;
-}
-
-static int track_markers_invoke(bContext *C,
- wmOperator *op,
- const wmEvent *UNUSED(event))
+static int track_markers(bContext *C, wmOperator *op, bool use_job)
{
TrackMarkersJob *tmj;
ScrArea *sa = CTX_wm_area(C);
@@ -438,49 +350,67 @@ static int track_markers_invoke(bContext *C,
return OPERATOR_CANCELLED;
}
- if (!sequence) {
- return track_markers_exec(C, op);
- }
-
tmj = MEM_callocN(sizeof(TrackMarkersJob), "TrackMarkersJob data");
- if (!track_markers_initjob(C, tmj, backwards)) {
+ if (!track_markers_initjob(C, tmj, backwards, sequence)) {
track_markers_freejob(tmj);
return OPERATOR_CANCELLED;
}
/* Setup job. */
- wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), sa,
- "Track Markers",
- WM_JOB_PROGRESS, WM_JOB_TYPE_CLIP_TRACK_MARKERS);
- WM_jobs_customdata_set(wm_job, tmj, track_markers_freejob);
-
- /* If there's delay set in tracking job, tracking should happen
- * with fixed FPS. To deal with editor refresh we have to synchronize
- * tracks from job and tracks in clip. Do this in timer callback
- * to prevent threading conflicts. */
- if (tmj->delay > 0) {
- WM_jobs_timer(wm_job,
- tmj->delay / 1000.0f, NC_MOVIECLIP | NA_EVALUATED, 0);
- }
- else {
- WM_jobs_timer(wm_job, 0.2, NC_MOVIECLIP | NA_EVALUATED, 0);
- }
+ if (use_job && sequence) {
+ wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), sa,
+ "Track Markers",
+ WM_JOB_PROGRESS, WM_JOB_TYPE_CLIP_TRACK_MARKERS);
+ WM_jobs_customdata_set(wm_job, tmj, track_markers_freejob);
+
+ /* If there's delay set in tracking job, tracking should happen
+ * with fixed FPS. To deal with editor refresh we have to synchronize
+ * tracks from job and tracks in clip. Do this in timer callback
+ * to prevent threading conflicts. */
+ if (tmj->delay > 0) {
+ WM_jobs_timer(wm_job,
+ tmj->delay / 1000.0f, NC_MOVIECLIP | NA_EVALUATED, 0);
+ }
+ else {
+ WM_jobs_timer(wm_job, 0.2, NC_MOVIECLIP | NA_EVALUATED, 0);
+ }
- WM_jobs_callbacks(wm_job,
- track_markers_startjob,
- NULL,
- track_markers_updatejob,
- track_markers_endjob);
+ WM_jobs_callbacks(wm_job,
+ track_markers_startjob,
+ NULL,
+ track_markers_updatejob,
+ track_markers_endjob);
- G.is_break = false;
+ G.is_break = false;
- WM_jobs_start(CTX_wm_manager(C), wm_job);
- WM_cursor_wait(0);
+ WM_jobs_start(CTX_wm_manager(C), wm_job);
+ WM_cursor_wait(0);
- /* 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;
+ }
+ else {
+ short stop = 0, do_update = 0;
+ float progress = 0.0f;
+ track_markers_startjob(tmj, &stop, &do_update, &progress);
+ track_markers_endjob(tmj);
+ track_markers_freejob(tmj);
+ return OPERATOR_FINISHED;
+ }
+}
+
+static int track_markers_exec(bContext *C, wmOperator *op)
+{
+ return track_markers(C, op, false);
+}
+
+static int track_markers_invoke(bContext *C,
+ wmOperator *op,
+ const wmEvent *UNUSED(event))
+{
+ return track_markers(C, op, true);
}
static int track_markers_modal(bContext *C,