diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-09-02 16:02:46 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-09-02 16:02:46 +0400 |
commit | 1fbb859e6d2e6feb0dfdefb612f17fef675d7859 (patch) | |
tree | 4efd4a86b7d9103b0f1fb49f190f02842c44252e /source/blender/blenkernel/intern/tracking.c | |
parent | 26bfda6fadc83dcf35ab5a5208a32e506503d082 (diff) |
Fix crash when adjusting plane track after re-tracking point tracks
Issue was caused by tacks map merge re-allocating the tracks and this
didn't update plane tracks.
Ideally tracks_map_merge shall not re-allocate tracks, but for now
just update plane tracks. Shouldn't be too much slow anyway and could
always be tweaked without affecting any artists.
Diffstat (limited to 'source/blender/blenkernel/intern/tracking.c')
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 76 |
1 files changed, 45 insertions, 31 deletions
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 4fe46fe78d7..73876c532e7 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -1303,6 +1303,25 @@ 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) @@ -2367,17 +2386,19 @@ 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; + ListBase *old_tracks, *plane_tracks; int a; if (map->is_camera) { old_tracks = &tracking->tracks; + plane_tracks = &tracking->plane_tracks; } else { MovieTrackingObject *object = BKE_tracking_object_get_named(tracking, map->object_name); @@ -2388,6 +2409,7 @@ static void tracks_map_merge(TracksMap *map, MovieTracking *tracking) } old_tracks = &object->tracks; + plane_tracks = &object->plane_tracks; } /* duplicate currently operating tracks to temporary list. @@ -2396,49 +2418,41 @@ static void tracks_map_merge(TracksMap *map, MovieTracking *tracking) */ for (a = 0; a < map->num_tracks; a++) { int replace_sel = 0, replace_rot = 0; - MovieTrackingTrack *new_track, *old; + MovieTrackingTrack *new_track, *old_track; track = &map->tracks[a]; - /* find original of operating track in list of previously displayed tracks */ - old = BLI_ghash_lookup(map->hash, track); - if (old) { - MovieTrackingTrack *cur = old_tracks->first; + new_track = tracking_track_duplicate(track); - while (cur) { - if (cur == old) - break; + /* 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->first, old_track) != -1) { + /* Update active track in movie clip. */ + if (old_track == act_track) { + tracking->act_track = new_track; + } - cur = cur->next; - } + /* Update track used for rotation stabilization. */ + if (old_track == rot_track) { + tracking->stabilization.rot_track = new_track; + } - /* original track was found, re-use flags and remove this track */ - if (cur) { - if (cur == act_track) - replace_sel = 1; - if (cur == rot_track) - replace_rot = 1; + 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; - track->flag = cur->flag; - track->pat_flag = cur->pat_flag; - track->search_flag = cur->search_flag; + plane_tracks_replace_point_track(plane_tracks, old_track, new_track); - BKE_tracking_track_free(cur); - BLI_freelinkN(old_tracks, cur); + BKE_tracking_track_free(old_track); + BLI_freelinkN(old_tracks, old_track); } } - new_track = tracking_track_duplicate(track); - - BLI_ghash_remove(map->hash, track, NULL, NULL); /* XXX: are we actually need this */ + /* Update old-new track mapping */ + BLI_ghash_remove(map->hash, track, NULL, NULL); BLI_ghash_insert(map->hash, track, new_track); - if (replace_sel) /* update current selection in clip */ - tracking->act_track = new_track; - - if (replace_rot) /* update track used for rotation stabilization */ - tracking->stabilization.rot_track = new_track; - BLI_addtail(&tracks, new_track); } |