diff options
-rw-r--r-- | source/blender/blenkernel/BKE_tracking.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 48 | ||||
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops.c | 12 |
3 files changed, 55 insertions, 6 deletions
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h index a860378a35f..51f97180ddb 100644 --- a/source/blender/blenkernel/BKE_tracking.h +++ b/source/blender/blenkernel/BKE_tracking.h @@ -218,6 +218,7 @@ void BKE_tracking_refine_marker(struct MovieClip *clip, struct MovieTrackingTrac /* **** Plane tracking **** */ void BKE_tracking_track_plane_from_existing_motion(struct MovieTrackingPlaneTrack *plane_track, int start_frame); +void BKE_tracking_retrack_plane_from_existing_motion_at_segment(struct MovieTrackingPlaneTrack *plane_track, int start_frame); void BKE_tracking_homography_between_two_quads(/*const*/ float reference_corners[4][2], /*const*/ float corners[4][2], float H[3][3]); /* **** Camera solving **** */ diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 2c84fbd8680..fd92ec9f462 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -3282,7 +3282,8 @@ BLI_INLINE void mat3f_from_mat3d(float mat_float[3][3], double mat_double[3][3]) } /* NOTE: frame number should be in clip space, not scene space */ -static void track_plane_from_existing_motion(MovieTrackingPlaneTrack *plane_track, int start_frame, int direction) +static void track_plane_from_existing_motion(MovieTrackingPlaneTrack *plane_track, int start_frame, + int direction, bool retrack) { MovieTrackingPlaneMarker *start_plane_marker = BKE_tracking_plane_marker_get(plane_track, start_frame); MovieTrackingPlaneMarker *keyframe_plane_marker = NULL; @@ -3359,7 +3360,7 @@ static void track_plane_from_existing_motion(MovieTrackingPlaneTrack *plane_trac new_plane_marker.framenr = current_frame + frame_delta; - if (keyframe_plane_marker && + if (!retrack && keyframe_plane_marker && next_plane_marker && (plane_track->flag & PLANE_TRACK_AUTOKEY)) { @@ -3384,8 +3385,47 @@ static void track_plane_from_existing_motion(MovieTrackingPlaneTrack *plane_trac /* NOTE: frame number should be in clip space, not scene space */ void BKE_tracking_track_plane_from_existing_motion(MovieTrackingPlaneTrack *plane_track, int start_frame) { - track_plane_from_existing_motion(plane_track, start_frame, 1); - track_plane_from_existing_motion(plane_track, start_frame, -1); + track_plane_from_existing_motion(plane_track, start_frame, 1, false); + track_plane_from_existing_motion(plane_track, start_frame, -1, false); +} + +static MovieTrackingPlaneMarker *find_plane_keyframe(MovieTrackingPlaneTrack *plane_track, + int start_frame, int direction) +{ + MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, start_frame); + int index = plane_marker - plane_track->markers; + int frame_delta = direction > 0 ? 1 : -1; + + while (index >= 0 && index < plane_track->markersnr) { + if ((plane_marker->flag & PLANE_MARKER_TRACKED) == 0) { + return plane_marker; + } + plane_marker += frame_delta; + } + + return NULL; +} + +void BKE_tracking_retrack_plane_from_existing_motion_at_segment(MovieTrackingPlaneTrack *plane_track, int start_frame) +{ + MovieTrackingPlaneMarker *prev_plane_keyframe, *next_plane_keyframe; + + prev_plane_keyframe = find_plane_keyframe(plane_track, start_frame, -1); + next_plane_keyframe = find_plane_keyframe(plane_track, start_frame, 1); + + if (prev_plane_keyframe != NULL && next_plane_keyframe != NULL) { + /* First we track from left keyframe to the right one without any blending. */ + track_plane_from_existing_motion(plane_track, prev_plane_keyframe->framenr, 1, true); + + /* And then we track from the right keyframe to the left one, so shape blends in nicely */ + track_plane_from_existing_motion(plane_track, next_plane_keyframe->framenr, -1, false); + } + else if (prev_plane_keyframe != NULL) { + track_plane_from_existing_motion(plane_track, prev_plane_keyframe->framenr, 1, true); + } + else if (next_plane_keyframe != NULL) { + track_plane_from_existing_motion(plane_track, next_plane_keyframe->framenr, -1, true); + } } BLI_INLINE void float_corners_to_double(/*const*/ float corners[4][2], double double_corners[4][2]) diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index 59101b24ad8..a4cd1e1ccad 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -4135,14 +4135,22 @@ static void keyframe_set_flag(bContext *C, bool set) MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get_exact(plane_track, framenr); if (plane_marker) { if (set) { - plane_marker->flag &= ~PLANE_MARKER_TRACKED; + 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 { - plane_marker->flag |= PLANE_MARKER_TRACKED; + 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)) |