diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-03-01 18:22:39 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-03-01 18:22:39 +0300 |
commit | 380a0b096a31113cffce7643113a7fb486f053fa (patch) | |
tree | 386df8831f88a5e5b39f8422172731e974454426 | |
parent | edbbe3bcbc3edd2bd57a7e86bcba5a6771bd21a6 (diff) |
Tracking: Deal with gaps and long tracked segments bettertracking_scopes
When there is a gap during looking for a reference marker for the
scopes use the first marker after the gap. It helps re-positioning
the marker back in place after it got ocluded.
Also cosmetic changes on the labels.
-rw-r--r-- | release/scripts/startup/bl_ui/space_clip.py | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/movieclip.c | 31 |
2 files changed, 28 insertions, 7 deletions
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index bfdc941f8f4..7e648ecdb03 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -730,7 +730,7 @@ class CLIP_PT_track(CLIP_PT_tracking_panel, Panel): sub.prop(act_track, "lock", text="", icon=icon) col = layout.column() - col.label(text="Previous Keyframe") + col.label(text="Previous Reference") col.template_track(sc, "scopes_prev") col = layout.column() @@ -738,7 +738,7 @@ class CLIP_PT_track(CLIP_PT_tracking_panel, Panel): col.template_track(sc, "scopes") col = layout.column() - col.label(text="Next Marker") + col.label(text="Next Reference") col.template_track(sc, "scopes_next") row = layout.row(align=True) diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 6945e2bfbc6..128b854c5d8 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -1721,18 +1721,29 @@ static MovieTrackingMarker *marker_previous_keyframe_get(MovieTrackingTrack *tra /* Start with the previous marker, so that if the current marker is a keyframe by itself it is * not used as a result. */ MovieTrackingMarker *marker_it = marker - 1; + MovieTrackingMarker *last_known_marker = NULL; + bool gap_encountered = false; while (marker_it >= track->markers) { if (marker_it->flag & MARKER_DISABLED) { - return NULL; + gap_encountered = true; + --marker_it; + continue; + } + + if (gap_encountered) { + return marker_it; } + + last_known_marker = marker_it; + if ((marker_it->flag & MARKER_TRACKED) == 0) { return marker_it; } --marker_it; } - return NULL; + return last_known_marker; } static MovieTrackingMarker *marker_next_keyframe_get(MovieTrackingTrack *track, @@ -1741,20 +1752,30 @@ static MovieTrackingMarker *marker_next_keyframe_get(MovieTrackingTrack *track, /* Start with the next marker, so that if the current marker is a keyframe by itself it is * not used as a result. */ MovieTrackingMarker *marker_it = marker + 1; - + MovieTrackingMarker *last_known_marker = NULL; const MovieTrackingMarker *marker_end = track->markers + track->markersnr; + bool gap_encountered = false; while (marker_it < marker_end) { if (marker_it->flag & MARKER_DISABLED) { - return NULL; + gap_encountered = true; + ++marker_it; + continue; + } + + if (gap_encountered) { + return marker_it; } + + last_known_marker = marker_it; + if ((marker_it->flag & MARKER_TRACKED) == 0) { return marker_it; } ++marker_it; } - return NULL; + return last_known_marker; } static MovieTrackingMarker *reference_marker_for_scopes_get(MovieClip *clip, |