diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-01-27 18:20:17 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-01-27 18:20:17 +0300 |
commit | fa9ba68a2b4de3eb65de9a410ae4bd2186443b83 (patch) | |
tree | 4bcd5437899daf5be8b5697a968450625c6708ee /source/blender/editors/space_clip/tracking_ops.c | |
parent | 28d599a0fc3f285675e757a802f3f752eaceb766 (diff) |
Tracking: Update plane track solution after joining point tracks
Was in fact long term TODO, it all should work fine now.
Diffstat (limited to 'source/blender/editors/space_clip/tracking_ops.c')
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index e5385b3e0bf..61bfa5b315b 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -35,6 +35,7 @@ #include "DNA_space_types.h" #include "BLI_utildefines.h" +#include "BLI_ghash.h" #include "BLI_math.h" #include "BLI_blenlib.h" @@ -1509,6 +1510,7 @@ static int join_tracks_exec(bContext *C, wmOperator *op) MovieClip *clip = ED_space_clip_get_clip(sc); MovieTracking *tracking = &clip->tracking; ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); if (act_track == NULL) { @@ -1516,6 +1518,8 @@ static int join_tracks_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } + GSet *point_tracks = BLI_gset_ptr_new(__func__); + for (MovieTrackingTrack *track = tracksbase->first, *next_track; track != NULL; track = next_track) @@ -1528,17 +1532,34 @@ static int join_tracks_exec(bContext *C, wmOperator *op) tracking->stabilization.rot_track = act_track; } - /* TODO(sergey): Re-evaluate planes with auto-key. */ - BKE_tracking_plane_tracks_replace_point_track(tracking, - track, - act_track); - + for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first; + plane_track != NULL; + plane_track = plane_track->next) + { + if (BKE_tracking_plane_track_has_point_track(plane_track, track)) { + BKE_tracking_plane_track_replace_point_track(plane_track, + track, + act_track); + if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) { + BLI_gset_insert(point_tracks, plane_track); + } + } + } BKE_tracking_track_free(track); BLI_freelinkN(tracksbase, track); } } + GSetIterator gs_iter; + int framenr = ED_space_clip_get_clip_frame_number(sc); + GSET_ITER (gs_iter, point_tracks) { + MovieTrackingPlaneTrack *plane_track = BLI_gsetIterator_getKey(&gs_iter); + BKE_tracking_track_plane_from_existing_motion( plane_track, framenr); + } + + BLI_gset_free(point_tracks, NULL); + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); return OPERATOR_FINISHED; |