diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-01-10 00:18:48 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-01-10 00:18:48 +0400 |
commit | 5bf5d5a8445da66a7da3e06a160bf9771f624d1b (patch) | |
tree | 26993a0362cc693e69c60e8f9e73c8fe249f1987 /source/blender/blenkernel/intern/tracking.c | |
parent | dadb0d81221bb8ec706bea5da814dc4995723ba8 (diff) |
Camera tracking: tracks copy/paste operator
This commit implements basic clipboard support for movie tracking data
int clip editor. Used own implementation of clipboard like it's done
for sequencer.
Ideally it needed to be switched to more general clipboard system, but
currently this system is designed for text data only and it need to
be re-designed itself. But this feature is quite useful since object
tracking is implemented, so it should be OK to live with such own
implementation for a while.
Diffstat (limited to 'source/blender/blenkernel/intern/tracking.c')
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 6897600f42f..5124337fe92 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -70,6 +70,10 @@ typedef struct MovieDistortion { struct libmv_CameraIntrinsics *intrinsics; } MovieDistortion; +static struct { + ListBase tracks; +} tracking_clipboard; + /*********************** common functions *************************/ void BKE_tracking_init_settings(MovieTracking *tracking) @@ -578,6 +582,72 @@ void BKE_tracking_free(MovieTracking *tracking) BKE_tracking_distortion_destroy(tracking->camera.intrinsics); } +static MovieTrackingTrack *duplicate_track(MovieTrackingTrack *track) +{ + MovieTrackingTrack *new_track; + + new_track = MEM_callocN(sizeof(MovieTrackingTrack), "tracksMapMerge new_track"); + + *new_track= *track; + new_track->next = new_track->prev = NULL; + + new_track->markers = MEM_dupallocN(new_track->markers); + + return new_track; +} + +/*********************** clipboard *************************/ + +void BKE_tracking_free_clipboard(void) +{ + MovieTrackingTrack *track = tracking_clipboard.tracks.first, *next_track; + + while (track) { + next_track = track->next; + + BKE_tracking_free_track(track); + MEM_freeN(track); + + track = next_track; + } +} + +void BKE_tracking_clipboard_copy_tracks(MovieTracking *tracking, MovieTrackingObject *object) +{ + ListBase *tracksbase = BKE_tracking_object_tracks(tracking, object); + MovieTrackingTrack *track = tracksbase->first; + + while (track) { + if (TRACK_SELECTED(track)) { + MovieTrackingTrack *new_track = duplicate_track(track); + + BLI_addtail(&tracking_clipboard.tracks, new_track); + } + + track = track->next; + } +} + +int BKE_tracking_clipboard_has_tracks(void) +{ + return tracking_clipboard.tracks.first != NULL; +} + +void BKE_tracking_clipboard_paste_tracks(MovieTracking *tracking, MovieTrackingObject *object) +{ + ListBase *tracksbase = BKE_tracking_object_tracks(tracking, object); + MovieTrackingTrack *track = tracking_clipboard.tracks.first; + + while (track) { + MovieTrackingTrack *new_track = duplicate_track(track); + + BLI_addtail(tracksbase, new_track); + BKE_track_unique_name(tracksbase, new_track); + + track = track->next; + } +} + /*********************** tracks map *************************/ typedef struct TracksMap { @@ -700,9 +770,7 @@ static void tracks_map_merge(TracksMap *map, MovieTracking *tracking) } } - new_track= MEM_callocN(sizeof(MovieTrackingTrack), "tracksMapMerge new_track"); - *new_track= *track; - new_track->markers= MEM_dupallocN(new_track->markers); + new_track= duplicate_track(track); BLI_ghash_remove(map->hash, track, NULL, NULL); /* XXX: are we actually need this */ BLI_ghash_insert(map->hash, track, new_track); |