Tracking: Fix wrong behavior of refining with previous frame matching
This commit is contained in:
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"
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue