diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-09-06 14:21:56 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-09-06 14:21:56 +0400 |
commit | 1718c002d625cda44ad79606624926ee82151290 (patch) | |
tree | 75c16305861002a71f45b3dae7eb860a346c7004 /source/blender/blenkernel/intern/tracking.c | |
parent | 567e3b47cc585afbfd9d56e194562f20a2efdadd (diff) |
Avoid tracks reallocation and planes traversal in tracks_map_merge
Would save us a bit of time when doing 2D tracking.
Diffstat (limited to 'source/blender/blenkernel/intern/tracking.c')
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 65 |
1 files changed, 21 insertions, 44 deletions
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 19c1bf9b8a8..44303ce2a44 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -1303,25 +1303,6 @@ void BKE_tracking_marker_get_subframe_position(MovieTrackingTrack *track, float /*********************** Plane Track *************************/ -static void plane_tracks_replace_point_track(ListBase *plane_tracks, - MovieTrackingTrack *old_track, - MovieTrackingTrack *new_track) -{ - MovieTrackingPlaneTrack *plane_track; - - for (plane_track = plane_tracks->first; - plane_track; - plane_track = plane_track->next) - { - int i; - for (i = 0; i < plane_track->point_tracksnr; i++) { - if (plane_track->point_tracks[i] == old_track) { - plane_track->point_tracks[i] = new_track; - } - } - } -} - /* Creates new plane track out of selected point tracks */ MovieTrackingPlaneTrack *BKE_tracking_plane_track_add(MovieTracking *tracking, ListBase *plane_tracks_base, ListBase *tracks, int framenr) @@ -2386,12 +2367,9 @@ static void tracks_map_insert(TracksMap *map, MovieTrackingTrack *track, void *c map->ptr++; } -/* TODO(sergey): Make it so tracks are not re-allocating here */ static void tracks_map_merge(TracksMap *map, MovieTracking *tracking) { MovieTrackingTrack *track; - MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); - MovieTrackingTrack *rot_track = tracking->stabilization.rot_track; ListBase tracks = {NULL, NULL}, new_tracks = {NULL, NULL}; ListBase *old_tracks, *plane_tracks; int a; @@ -2417,42 +2395,41 @@ static void tracks_map_merge(TracksMap *map, MovieTracking *tracking) * of currently operating tracks (if needed) */ for (a = 0; a < map->num_tracks; a++) { - MovieTrackingTrack *new_track, *old_track; + MovieTrackingTrack *old_track; + bool mapped_to_old = false; track = &map->tracks[a]; - new_track = tracking_track_duplicate(track); - /* find original of operating track in list of previously displayed tracks */ old_track = BLI_ghash_lookup(map->hash, track); if (old_track) { if (BLI_findindex(old_tracks, old_track) != -1) { - /* Update active track in movie clip. */ - if (old_track == act_track) { - tracking->act_track = new_track; - } - - /* Update track used for rotation stabilization. */ - if (old_track == rot_track) { - tracking->stabilization.rot_track = new_track; - } + BLI_remlink(old_tracks, old_track); + BLI_addtail(&tracks, old_track); - new_track->flag = track->flag = old_track->flag; - new_track->pat_flag = track->pat_flag = old_track->pat_flag; - new_track->search_flag = track->search_flag = old_track->search_flag; + /* Copy flags like selection back to the track map */ + track->flag = old_track->flag; + track->pat_flag = old_track->pat_flag; + track->search_flag = old_track->search_flag; - plane_tracks_replace_point_track(plane_tracks, old_track, new_track); + /* Copy all the rest settings back from the map to the actual tracks, */ + MEM_freeN(old_track->markers); + *old_track = *track; + old_track->markers = MEM_dupallocN(old_track->markers); - BKE_tracking_track_free(old_track); - BLI_freelinkN(old_tracks, old_track); + mapped_to_old = true; } } - /* Update old-new track mapping */ - BLI_ghash_remove(map->hash, track, NULL, NULL); - BLI_ghash_insert(map->hash, track, new_track); + if (mapped_to_old == false) { + MovieTrackingTrack *new_track = tracking_track_duplicate(track); + + /* Update old-new track mapping */ + BLI_ghash_remove(map->hash, track, NULL, NULL); + BLI_ghash_insert(map->hash, track, new_track); - BLI_addtail(&tracks, new_track); + BLI_addtail(&tracks, new_track); + } } /* move all tracks, which aren't operating */ |