Tracking: Fix wrong behavior of refining with previous frame matching

This commit is contained in:
Sergey Sharybin 2014-09-11 20:43:41 +06:00
parent e38152bae4
commit d919218482
Notes: blender-bot 2023-02-14 10:09:27 +01:00
Referenced by issue #42307, Consistency
Referenced by issue #42270, Renderbug Cycles preview
Referenced by issue #42045, the displacment of a ss plane are only rendered with open Gl !
Referenced by issue #41962, command-line without specified filename doesn't renders
Referenced by issue #41920, png color and alpha with unexpected behaviour in cycles
Referenced by issue #41904, 2.72 testbuild: Cycles crush when I set emission as volume material for world.
Referenced by issue #41897, Keystroke doesn't detect Multi Window Focus.
Referenced by issue #41877, Texture Paint - Quick Edit - Apply/Apply Camera Image - Version 2.71 and Test Build 2.72
Referenced by issue #41856, "Screen Key" add-on missing
Referenced by issue #41860, transformation constraint does not work correctly
Referenced by issue #41861, Loopcut wire (incorrect mode-switch)
Referenced by issue #41833, Immediate crash while rendering and pressing the home key.
Referenced by issue #41807, Strange Blue segment shown on clay object
Referenced by issue #41636, Use "Keyframe" for "refine marker position"
1 changed files with 38 additions and 8 deletions

View File

@ -725,6 +725,35 @@ void BKE_tracking_context_finish(MovieTrackingContext *context)
}
}
static bool refine_marker_reference_frame_get(MovieTrackingTrack *track,
MovieTrackingMarker *marker,
bool backwards,
int *reference_framenr)
{
const MovieTrackingMarker *first_marker = track->markers;
const MovieTrackingMarker *last_marker = track->markers + track->markersnr - 1;
MovieTrackingMarker *reference = backwards ? marker + 1 : marker - 1;
while (reference >= first_marker &&
reference <= last_marker &&
(reference->flag & MARKER_DISABLED) != 0)
{
if (backwards)
reference++;
else
reference--;
}
if (reference < first_marker ||
reference > last_marker)
{
return false;
}
*reference_framenr = reference->framenr;
return (reference->flag & MARKER_DISABLED) == 0;
}
/* Refine marker's position using previously known keyframe.
* Direction of searching for a keyframe depends on backwards flag,
* which means if backwards is false, previous keyframe will be as
@ -748,14 +777,15 @@ void BKE_tracking_refine_marker(MovieClip *clip, MovieTrackingTrack *track, Movi
BKE_movieclip_get_size(clip, &user, &frame_width, &frame_height);
/* Get an image buffer for reference frame, also gets reference marker.
*
* Usually tracking_context_get_reference_ibuf will return current frame
* if marker is keyframed, which is correct for normal tracking. But here
* we'll want to have next/previous frame in such cases. So let's use small
* magic with original frame number used to get reference frame for.
*/
reference_framenr = backwards ? marker->framenr + 1 : marker->framenr - 1;
/* Get an image buffer for reference frame, also gets reference marker. */
if (!refine_marker_reference_frame_get(track,
marker,
backwards,
&reference_framenr))
{
return;
}
reference_ibuf = tracking_context_get_reference_ibuf(clip, &user, clip_flag, track, reference_framenr,
backwards, &reference_marker);
if (reference_ibuf == NULL) {