diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-04-21 23:54:45 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-04-22 00:10:50 +0300 |
commit | 260f75a2cad9f4af24682af063e3c2a7b38e2e39 (patch) | |
tree | 0243f6d6b59df946c9298d6b7524add6f4fa71bc /source/blender | |
parent | 9425a8ff381b51e519e19d9bd7484cf095a78c30 (diff) |
Tracking: Cleanup, move some plane tracks code to utility functions
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_tracking.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 58 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_utils.c | 46 |
3 files changed, 67 insertions, 45 deletions
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h index ef997446c6c..5af05f4ca80 100644 --- a/source/blender/blenkernel/BKE_tracking.h +++ b/source/blender/blenkernel/BKE_tracking.h @@ -136,6 +136,14 @@ struct MovieTrackingPlaneTrack *BKE_tracking_plane_track_get_active(struct Movie void BKE_tracking_plane_tracks_deselect_all(struct ListBase *plane_tracks_base); +bool BKE_tracking_plane_track_has_point_track(struct MovieTrackingPlaneTrack *plane_track, + struct MovieTrackingTrack *track); +bool BKE_tracking_plane_track_remove_point_track(struct MovieTrackingPlaneTrack *plane_track, + struct MovieTrackingTrack *track); + +void BKE_tracking_plane_tracks_remove_point_track(struct MovieTracking *tracking, + struct MovieTrackingTrack *track); + /* **** Plane Marker **** */ struct MovieTrackingPlaneMarker *BKE_tracking_plane_marker_insert(struct MovieTrackingPlaneTrack *plane_track, struct MovieTrackingPlaneMarker *plane_marker); diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 83db0639468..e7dccc09376 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -1302,6 +1302,64 @@ void BKE_tracking_plane_tracks_deselect_all(ListBase *plane_tracks_base) } } +bool BKE_tracking_plane_track_has_point_track(MovieTrackingPlaneTrack *plane_track, + MovieTrackingTrack *track) +{ + int i; + for (i = 0; i < plane_track->point_tracksnr; i++) { + if (plane_track->point_tracks[i] == track) { + return true; + } + } + return false; +} + +bool BKE_tracking_plane_track_remove_point_track(MovieTrackingPlaneTrack *plane_track, + MovieTrackingTrack *track) +{ + int i, track_index; + MovieTrackingTrack **new_point_tracks; + + if (plane_track->point_tracksnr <= 4) { + return false; + } + + new_point_tracks = MEM_mallocN(sizeof(*new_point_tracks) * (plane_track->point_tracksnr - 1), + "new point tracks array"); + + for (i = 0, track_index = 0; i < plane_track->point_tracksnr; i++) { + if (plane_track->point_tracks[i] != track) { + new_point_tracks[track_index++] = plane_track->point_tracks[i]; + } + } + + MEM_freeN(plane_track->point_tracks); + plane_track->point_tracks = new_point_tracks; + plane_track->point_tracksnr--; + + return true; +} + +void BKE_tracking_plane_tracks_remove_point_track(MovieTracking *tracking, + MovieTrackingTrack *track) +{ + MovieTrackingPlaneTrack *plane_track, *next_plane_track; + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + for (plane_track = plane_tracks_base->first; + plane_track; + plane_track = next_plane_track) + { + next_plane_track = plane_track->next; + if (BKE_tracking_plane_track_has_point_track(plane_track, track)) { + if (!BKE_tracking_plane_track_remove_point_track(plane_track, track)) { + /* Delete planes with less than 3 point tracks in it. */ + BKE_tracking_plane_track_free(plane_track); + BLI_freelinkN(plane_tracks_base, plane_track); + } + } + } +} + /*********************** Plane Marker *************************/ MovieTrackingPlaneMarker *BKE_tracking_plane_marker_insert(MovieTrackingPlaneTrack *plane_track, diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c index 6a2a01620cd..48f8f587106 100644 --- a/source/blender/editors/space_clip/clip_utils.c +++ b/source/blender/editors/space_clip/clip_utils.c @@ -177,9 +177,7 @@ void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track) MovieTracking *tracking = &clip->tracking; MovieTrackingStabilization *stab = &tracking->stabilization; MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); - MovieTrackingPlaneTrack *plane_track, *next_plane_track; ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); bool has_bundle = false, update_stab = false; char track_name_escaped[MAX_NAME], prefix[MAX_NAME * 2]; @@ -197,49 +195,7 @@ void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track) has_bundle = true; /* Make sure no plane will use freed track */ - for (plane_track = plane_tracks_base->first; - plane_track; - plane_track = next_plane_track) - { - bool found = false; - int i; - - next_plane_track = plane_track->next; - - for (i = 0; i < plane_track->point_tracksnr; i++) { - if (plane_track->point_tracks[i] == track) { - found = true; - break; - } - } - - if (!found) { - continue; - } - - if (plane_track->point_tracksnr > 4) { - int track_index; - MovieTrackingTrack **new_point_tracks; - - new_point_tracks = MEM_mallocN(sizeof(*new_point_tracks) * (plane_track->point_tracksnr - 1), - "new point tracks array"); - - for (i = 0, track_index = 0; i < plane_track->point_tracksnr; i++) { - if (plane_track->point_tracks[i] != track) { - new_point_tracks[track_index++] = plane_track->point_tracks[i]; - } - } - - MEM_freeN(plane_track->point_tracks); - plane_track->point_tracks = new_point_tracks; - plane_track->point_tracksnr--; - } - else { - /* Delete planes with less than 3 point tracks in it. */ - BKE_tracking_plane_track_free(plane_track); - BLI_freelinkN(plane_tracks_base, plane_track); - } - } + BKE_tracking_plane_tracks_remove_point_track(tracking, track); /* Delete f-curves associated with the track (such as weight, i.e.) */ BLI_strescape(track_name_escaped, track->name, sizeof(track_name_escaped)); |