From e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 17 Apr 2019 06:17:24 +0200 Subject: ClangFormat: apply to source, most of intern Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat --- source/blender/blenkernel/intern/tracking.c | 4156 ++++++++++++++------------- 1 file changed, 2122 insertions(+), 2034 deletions(-) (limited to 'source/blender/blenkernel/intern/tracking.c') diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 28f47cbf067..c478ce274b8 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -32,7 +32,7 @@ #include "DNA_gpencil_types.h" #include "DNA_camera_types.h" #include "DNA_movieclip_types.h" -#include "DNA_object_types.h" /* SELECT */ +#include "DNA_object_types.h" /* SELECT */ #include "DNA_scene_types.h" #include "BLI_utildefines.h" @@ -64,15 +64,15 @@ #include "tracking_private.h" typedef struct MovieDistortion { - struct libmv_CameraIntrinsics *intrinsics; - /* Parameters needed for coordinates normalization. */ - float principal[2]; - float pixel_aspect; - float focal; + struct libmv_CameraIntrinsics *intrinsics; + /* Parameters needed for coordinates normalization. */ + float principal[2]; + float pixel_aspect; + float focal; } MovieDistortion; static struct { - ListBase tracks; + ListBase tracks; } tracking_clipboard; /*********************** Common functions *************************/ @@ -80,25 +80,25 @@ static struct { /* Free the whole list of tracks, list's head and tail are set to NULL. */ static void tracking_tracks_free(ListBase *tracks) { - MovieTrackingTrack *track; + MovieTrackingTrack *track; - for (track = tracks->first; track; track = track->next) { - BKE_tracking_track_free(track); - } + for (track = tracks->first; track; track = track->next) { + BKE_tracking_track_free(track); + } - BLI_freelistN(tracks); + BLI_freelistN(tracks); } /* Free the whole list of plane tracks, list's head and tail are set to NULL. */ static void tracking_plane_tracks_free(ListBase *plane_tracks) { - MovieTrackingPlaneTrack *plane_track; + MovieTrackingPlaneTrack *plane_track; - for (plane_track = plane_tracks->first; plane_track; plane_track = plane_track->next) { - BKE_tracking_plane_track_free(plane_track); - } + for (plane_track = plane_tracks->first; plane_track; plane_track = plane_track->next) { + BKE_tracking_plane_track_free(plane_track); + } - BLI_freelistN(plane_tracks); + BLI_freelistN(plane_tracks); } /* Free reconstruction structures, only frees contents of a structure, @@ -108,8 +108,8 @@ static void tracking_plane_tracks_free(ListBase *plane_tracks) */ static void tracking_reconstruction_free(MovieTrackingReconstruction *reconstruction) { - if (reconstruction->cameras) - MEM_freeN(reconstruction->cameras); + if (reconstruction->cameras) + MEM_freeN(reconstruction->cameras); } /* Free memory used by tracking object, only frees contents of the structure, @@ -119,22 +119,22 @@ static void tracking_reconstruction_free(MovieTrackingReconstruction *reconstruc */ static void tracking_object_free(MovieTrackingObject *object) { - tracking_tracks_free(&object->tracks); - tracking_plane_tracks_free(&object->plane_tracks); - tracking_reconstruction_free(&object->reconstruction); + tracking_tracks_free(&object->tracks); + tracking_plane_tracks_free(&object->plane_tracks); + tracking_reconstruction_free(&object->reconstruction); } /* Free list of tracking objects, list's head and tail is set to NULL. */ static void tracking_objects_free(ListBase *objects) { - MovieTrackingObject *object; + MovieTrackingObject *object; - /* Free objects contents. */ - for (object = objects->first; object; object = object->next) - tracking_object_free(object); + /* Free objects contents. */ + for (object = objects->first; object; object = object->next) + tracking_object_free(object); - /* Free objects themselves. */ - BLI_freelistN(objects); + /* Free objects themselves. */ + BLI_freelistN(objects); } /* Free memory used by a dopesheet, only frees dopesheet contents. @@ -142,26 +142,26 @@ static void tracking_objects_free(ListBase *objects) */ static void tracking_dopesheet_free(MovieTrackingDopesheet *dopesheet) { - MovieTrackingDopesheetChannel *channel; + MovieTrackingDopesheetChannel *channel; - /* Free channel's sergments. */ - channel = dopesheet->channels.first; - while (channel) { - if (channel->segments) { - MEM_freeN(channel->segments); - } + /* Free channel's sergments. */ + channel = dopesheet->channels.first; + while (channel) { + if (channel->segments) { + MEM_freeN(channel->segments); + } - channel = channel->next; - } + channel = channel->next; + } - /* Free lists themselves. */ - BLI_freelistN(&dopesheet->channels); - BLI_freelistN(&dopesheet->coverage_segments); + /* Free lists themselves. */ + BLI_freelistN(&dopesheet->channels); + BLI_freelistN(&dopesheet->coverage_segments); - /* Ensure lists are clean. */ - BLI_listbase_clear(&dopesheet->channels); - BLI_listbase_clear(&dopesheet->coverage_segments); - dopesheet->tot_channel = 0; + /* Ensure lists are clean. */ + BLI_listbase_clear(&dopesheet->channels); + BLI_listbase_clear(&dopesheet->coverage_segments); + dopesheet->tot_channel = 0; } /* Free tracking structure, only frees structure contents @@ -171,150 +171,162 @@ static void tracking_dopesheet_free(MovieTrackingDopesheet *dopesheet) */ void BKE_tracking_free(MovieTracking *tracking) { - tracking_tracks_free(&tracking->tracks); - tracking_plane_tracks_free(&tracking->plane_tracks); - tracking_reconstruction_free(&tracking->reconstruction); - tracking_objects_free(&tracking->objects); + tracking_tracks_free(&tracking->tracks); + tracking_plane_tracks_free(&tracking->plane_tracks); + tracking_reconstruction_free(&tracking->reconstruction); + tracking_objects_free(&tracking->objects); - if (tracking->camera.intrinsics) - BKE_tracking_distortion_free(tracking->camera.intrinsics); + if (tracking->camera.intrinsics) + BKE_tracking_distortion_free(tracking->camera.intrinsics); - tracking_dopesheet_free(&tracking->dopesheet); + tracking_dopesheet_free(&tracking->dopesheet); } /* Copy the whole list of tracks. */ -static void tracking_tracks_copy(ListBase *tracks_dst, const ListBase *tracks_src, GHash *tracks_mapping, const int flag) +static void tracking_tracks_copy(ListBase *tracks_dst, + const ListBase *tracks_src, + GHash *tracks_mapping, + const int flag) { - MovieTrackingTrack *track_dst, *track_src; + MovieTrackingTrack *track_dst, *track_src; - BLI_listbase_clear(tracks_dst); - BLI_ghash_clear(tracks_mapping, NULL, NULL); + BLI_listbase_clear(tracks_dst); + BLI_ghash_clear(tracks_mapping, NULL, NULL); - for (track_src = tracks_src->first; track_src != NULL; track_src = track_src->next) { - track_dst = MEM_dupallocN(track_src); - if (track_src->markers) { - track_dst->markers = MEM_dupallocN(track_src->markers); - } - if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) { - id_us_plus(&track_dst->gpd->id); - } - BLI_addtail(tracks_dst, track_dst); - BLI_ghash_insert(tracks_mapping, track_src, track_dst); - } + for (track_src = tracks_src->first; track_src != NULL; track_src = track_src->next) { + track_dst = MEM_dupallocN(track_src); + if (track_src->markers) { + track_dst->markers = MEM_dupallocN(track_src->markers); + } + if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) { + id_us_plus(&track_dst->gpd->id); + } + BLI_addtail(tracks_dst, track_dst); + BLI_ghash_insert(tracks_mapping, track_src, track_dst); + } } /* copy the whole list of plane tracks (need whole MovieTracking structures due to embedded pointers to tracks). * WARNING: implies tracking_[dst/src] and their tracks have already been copied. */ -static void tracking_plane_tracks_copy( - ListBase *plane_tracks_list_dst, const ListBase *plane_tracks_list_src, - GHash *tracks_mapping, const int flag) -{ - MovieTrackingPlaneTrack *plane_track_dst, *plane_track_src; - - BLI_listbase_clear(plane_tracks_list_dst); - - for (plane_track_src = plane_tracks_list_src->first; - plane_track_src != NULL; - plane_track_src = plane_track_src->next) - { - plane_track_dst = MEM_dupallocN(plane_track_src); - if (plane_track_src->markers) { - plane_track_dst->markers = MEM_dupallocN(plane_track_src->markers); - } - plane_track_dst->point_tracks = MEM_mallocN(sizeof(*plane_track_dst->point_tracks) * plane_track_dst->point_tracksnr, __func__); - for (int i = 0; i < plane_track_dst->point_tracksnr; i++) { - plane_track_dst->point_tracks[i] = BLI_ghash_lookup(tracks_mapping, plane_track_src->point_tracks[i]); - } - if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) { - id_us_plus(&plane_track_dst->image->id); - } - BLI_addtail(plane_tracks_list_dst, plane_track_dst); - } +static void tracking_plane_tracks_copy(ListBase *plane_tracks_list_dst, + const ListBase *plane_tracks_list_src, + GHash *tracks_mapping, + const int flag) +{ + MovieTrackingPlaneTrack *plane_track_dst, *plane_track_src; + + BLI_listbase_clear(plane_tracks_list_dst); + + for (plane_track_src = plane_tracks_list_src->first; plane_track_src != NULL; + plane_track_src = plane_track_src->next) { + plane_track_dst = MEM_dupallocN(plane_track_src); + if (plane_track_src->markers) { + plane_track_dst->markers = MEM_dupallocN(plane_track_src->markers); + } + plane_track_dst->point_tracks = MEM_mallocN( + sizeof(*plane_track_dst->point_tracks) * plane_track_dst->point_tracksnr, __func__); + for (int i = 0; i < plane_track_dst->point_tracksnr; i++) { + plane_track_dst->point_tracks[i] = BLI_ghash_lookup(tracks_mapping, + plane_track_src->point_tracks[i]); + } + if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) { + id_us_plus(&plane_track_dst->image->id); + } + BLI_addtail(plane_tracks_list_dst, plane_track_dst); + } } /* Copy reconstruction structure. */ -static void tracking_reconstruction_copy( - MovieTrackingReconstruction *reconstruction_dst, const MovieTrackingReconstruction *reconstruction_src, - const int UNUSED(flag)) +static void tracking_reconstruction_copy(MovieTrackingReconstruction *reconstruction_dst, + const MovieTrackingReconstruction *reconstruction_src, + const int UNUSED(flag)) { - *reconstruction_dst = *reconstruction_src; - if (reconstruction_src->cameras) { - reconstruction_dst->cameras = MEM_dupallocN(reconstruction_src->cameras); - } + *reconstruction_dst = *reconstruction_src; + if (reconstruction_src->cameras) { + reconstruction_dst->cameras = MEM_dupallocN(reconstruction_src->cameras); + } } /* Copy stabilization structure. */ -static void tracking_stabilization_copy( - MovieTrackingStabilization *stabilization_dst, const MovieTrackingStabilization *stabilization_src, - const int UNUSED(flag)) +static void tracking_stabilization_copy(MovieTrackingStabilization *stabilization_dst, + const MovieTrackingStabilization *stabilization_src, + const int UNUSED(flag)) { - *stabilization_dst = *stabilization_src; + *stabilization_dst = *stabilization_src; } /* Copy tracking object. */ -static void tracking_object_copy( - MovieTrackingObject *object_dst, const MovieTrackingObject *object_src, GHash *tracks_mapping, const int flag) +static void tracking_object_copy(MovieTrackingObject *object_dst, + const MovieTrackingObject *object_src, + GHash *tracks_mapping, + const int flag) { - *object_dst = *object_src; - tracking_tracks_copy(&object_dst->tracks, &object_src->tracks, tracks_mapping, flag); - tracking_plane_tracks_copy(&object_dst->plane_tracks, &object_src->plane_tracks, tracks_mapping, flag); - tracking_reconstruction_copy(&object_dst->reconstruction, &object_src->reconstruction, flag); + *object_dst = *object_src; + tracking_tracks_copy(&object_dst->tracks, &object_src->tracks, tracks_mapping, flag); + tracking_plane_tracks_copy( + &object_dst->plane_tracks, &object_src->plane_tracks, tracks_mapping, flag); + tracking_reconstruction_copy(&object_dst->reconstruction, &object_src->reconstruction, flag); } /* Copy list of tracking objects. */ -static void tracking_objects_copy( - ListBase *objects_dst, const ListBase *objects_src, GHash *tracks_mapping, const int flag) +static void tracking_objects_copy(ListBase *objects_dst, + const ListBase *objects_src, + GHash *tracks_mapping, + const int flag) { - MovieTrackingObject *object_dst, *object_src; + MovieTrackingObject *object_dst, *object_src; - BLI_listbase_clear(objects_dst); + BLI_listbase_clear(objects_dst); - for (object_src = objects_src->first; object_src != NULL; object_src = object_src->next) { - object_dst = MEM_mallocN(sizeof(*object_dst), __func__); - tracking_object_copy(object_dst, object_src, tracks_mapping, flag); - BLI_addtail(objects_dst, object_dst); - } + for (object_src = objects_src->first; object_src != NULL; object_src = object_src->next) { + object_dst = MEM_mallocN(sizeof(*object_dst), __func__); + tracking_object_copy(object_dst, object_src, tracks_mapping, flag); + BLI_addtail(objects_dst, object_dst); + } } /* Copy tracking structure content. */ -void BKE_tracking_copy(MovieTracking *tracking_dst, const MovieTracking *tracking_src, const int flag) -{ - GHash *tracks_mapping = BLI_ghash_ptr_new(__func__); - - *tracking_dst = *tracking_src; - - tracking_tracks_copy(&tracking_dst->tracks, &tracking_src->tracks, tracks_mapping, flag); - tracking_plane_tracks_copy(&tracking_dst->plane_tracks, &tracking_src->plane_tracks, tracks_mapping, flag); - tracking_reconstruction_copy(&tracking_dst->reconstruction, &tracking_src->reconstruction, flag); - tracking_stabilization_copy(&tracking_dst->stabilization, &tracking_src->stabilization, flag); - if (tracking_src->act_track) { - tracking_dst->act_track = BLI_ghash_lookup(tracks_mapping, tracking_src->act_track); - } - if (tracking_src->act_plane_track) { - MovieTrackingPlaneTrack *plane_track_src, *plane_track_dst; - for (plane_track_src = tracking_src->plane_tracks.first, plane_track_dst = tracking_dst->plane_tracks.first; - !ELEM(NULL, plane_track_src, plane_track_dst); - plane_track_src = plane_track_src->next, plane_track_dst = plane_track_dst->next) - { - if (plane_track_src == tracking_src->act_plane_track) { - tracking_dst->act_plane_track = plane_track_dst; - break; - } - } - } - - /* Warning! Will override tracks_mapping. */ - tracking_objects_copy(&tracking_dst->objects, &tracking_src->objects, tracks_mapping, flag); - - /* Those remaining are runtime data, they will be reconstructed as needed, do not bother copying them. */ - tracking_dst->dopesheet.ok = false; - BLI_listbase_clear(&tracking_dst->dopesheet.channels); - BLI_listbase_clear(&tracking_dst->dopesheet.coverage_segments); - - tracking_dst->camera.intrinsics = NULL; - tracking_dst->stats = NULL; - - BLI_ghash_free(tracks_mapping, NULL, NULL); +void BKE_tracking_copy(MovieTracking *tracking_dst, + const MovieTracking *tracking_src, + const int flag) +{ + GHash *tracks_mapping = BLI_ghash_ptr_new(__func__); + + *tracking_dst = *tracking_src; + + tracking_tracks_copy(&tracking_dst->tracks, &tracking_src->tracks, tracks_mapping, flag); + tracking_plane_tracks_copy( + &tracking_dst->plane_tracks, &tracking_src->plane_tracks, tracks_mapping, flag); + tracking_reconstruction_copy(&tracking_dst->reconstruction, &tracking_src->reconstruction, flag); + tracking_stabilization_copy(&tracking_dst->stabilization, &tracking_src->stabilization, flag); + if (tracking_src->act_track) { + tracking_dst->act_track = BLI_ghash_lookup(tracks_mapping, tracking_src->act_track); + } + if (tracking_src->act_plane_track) { + MovieTrackingPlaneTrack *plane_track_src, *plane_track_dst; + for (plane_track_src = tracking_src->plane_tracks.first, + plane_track_dst = tracking_dst->plane_tracks.first; + !ELEM(NULL, plane_track_src, plane_track_dst); + plane_track_src = plane_track_src->next, plane_track_dst = plane_track_dst->next) { + if (plane_track_src == tracking_src->act_plane_track) { + tracking_dst->act_plane_track = plane_track_dst; + break; + } + } + } + + /* Warning! Will override tracks_mapping. */ + tracking_objects_copy(&tracking_dst->objects, &tracking_src->objects, tracks_mapping, flag); + + /* Those remaining are runtime data, they will be reconstructed as needed, do not bother copying them. */ + tracking_dst->dopesheet.ok = false; + BLI_listbase_clear(&tracking_dst->dopesheet.channels); + BLI_listbase_clear(&tracking_dst->dopesheet.coverage_segments); + + tracking_dst->camera.intrinsics = NULL; + tracking_dst->stats = NULL; + + BLI_ghash_free(tracks_mapping, NULL, NULL); } /* Initialize motion tracking settings to default values, @@ -322,70 +334,70 @@ void BKE_tracking_copy(MovieTracking *tracking_dst, const MovieTracking *trackin */ void BKE_tracking_settings_init(MovieTracking *tracking) { - tracking->camera.sensor_width = 35.0f; - tracking->camera.pixel_aspect = 1.0f; - tracking->camera.units = CAMERA_UNITS_MM; + tracking->camera.sensor_width = 35.0f; + tracking->camera.pixel_aspect = 1.0f; + tracking->camera.units = CAMERA_UNITS_MM; - tracking->settings.default_motion_model = TRACK_MOTION_MODEL_TRANSLATION; - tracking->settings.default_minimum_correlation = 0.75; - tracking->settings.default_pattern_size = 21; - tracking->settings.default_search_size = 71; - tracking->settings.default_algorithm_flag |= TRACK_ALGORITHM_FLAG_USE_BRUTE; - tracking->settings.default_weight = 1.0f; - tracking->settings.dist = 1; - tracking->settings.object_distance = 1; + tracking->settings.default_motion_model = TRACK_MOTION_MODEL_TRANSLATION; + tracking->settings.default_minimum_correlation = 0.75; + tracking->settings.default_pattern_size = 21; + tracking->settings.default_search_size = 71; + tracking->settings.default_algorithm_flag |= TRACK_ALGORITHM_FLAG_USE_BRUTE; + tracking->settings.default_weight = 1.0f; + tracking->settings.dist = 1; + tracking->settings.object_distance = 1; - tracking->stabilization.scaleinf = 1.0f; - tracking->stabilization.anchor_frame = 1; - zero_v2(tracking->stabilization.target_pos); - tracking->stabilization.target_rot = 0.0f; - tracking->stabilization.scale = 1.0f; + tracking->stabilization.scaleinf = 1.0f; + tracking->stabilization.anchor_frame = 1; + zero_v2(tracking->stabilization.target_pos); + tracking->stabilization.target_rot = 0.0f; + tracking->stabilization.scale = 1.0f; - tracking->stabilization.act_track = 0; - tracking->stabilization.act_rot_track = 0; - tracking->stabilization.tot_track = 0; - tracking->stabilization.tot_rot_track = 0; + tracking->stabilization.act_track = 0; + tracking->stabilization.act_rot_track = 0; + tracking->stabilization.tot_track = 0; + tracking->stabilization.tot_rot_track = 0; - tracking->stabilization.scaleinf = 1.0f; - tracking->stabilization.locinf = 1.0f; - tracking->stabilization.rotinf = 1.0f; - tracking->stabilization.maxscale = 2.0f; - tracking->stabilization.filter = TRACKING_FILTER_BILINEAR; - tracking->stabilization.flag |= TRACKING_SHOW_STAB_TRACKS; + tracking->stabilization.scaleinf = 1.0f; + tracking->stabilization.locinf = 1.0f; + tracking->stabilization.rotinf = 1.0f; + tracking->stabilization.maxscale = 2.0f; + tracking->stabilization.filter = TRACKING_FILTER_BILINEAR; + tracking->stabilization.flag |= TRACKING_SHOW_STAB_TRACKS; - BKE_tracking_object_add(tracking, "Camera"); + BKE_tracking_object_add(tracking, "Camera"); } /* Get list base of active object's tracks. */ ListBase *BKE_tracking_get_active_tracks(MovieTracking *tracking) { - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - if (object && (object->flag & TRACKING_OBJECT_CAMERA) == 0) { - return &object->tracks; - } + if (object && (object->flag & TRACKING_OBJECT_CAMERA) == 0) { + return &object->tracks; + } - return &tracking->tracks; + return &tracking->tracks; } /* Get list base of active object's plane tracks. */ ListBase *BKE_tracking_get_active_plane_tracks(MovieTracking *tracking) { - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - if (object && (object->flag & TRACKING_OBJECT_CAMERA) == 0) { - return &object->plane_tracks; - } + if (object && (object->flag & TRACKING_OBJECT_CAMERA) == 0) { + return &object->plane_tracks; + } - return &tracking->plane_tracks; + return &tracking->plane_tracks; } /* Get reconstruction data of active object. */ MovieTrackingReconstruction *BKE_tracking_get_active_reconstruction(MovieTracking *tracking) { - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - return BKE_tracking_object_get_reconstruction(tracking, object); + return BKE_tracking_object_get_reconstruction(tracking, object); } /* Get transformation matrix for a given object which is used @@ -393,17 +405,17 @@ MovieTrackingReconstruction *BKE_tracking_get_active_reconstruction(MovieTrackin */ void BKE_tracking_get_camera_object_matrix(Scene *scene, Object *ob, float mat[4][4]) { - if (!ob) { - if (scene->camera) - ob = scene->camera; - else - ob = BKE_view_layer_camera_find(BKE_view_layer_context_active_PLACEHOLDER(scene)); - } + if (!ob) { + if (scene->camera) + ob = scene->camera; + else + ob = BKE_view_layer_camera_find(BKE_view_layer_context_active_PLACEHOLDER(scene)); + } - if (ob) - BKE_object_where_is_calc_mat4(ob, mat); - else - unit_m4(mat); + if (ob) + BKE_object_where_is_calc_mat4(ob, mat); + else + unit_m4(mat); } /* Get projection matrix for camera specified by given tracking object @@ -411,51 +423,55 @@ void BKE_tracking_get_camera_object_matrix(Scene *scene, Object *ob, float mat[4 * * NOTE: frame number should be in clip space, not scene space */ -void BKE_tracking_get_projection_matrix(MovieTracking *tracking, MovieTrackingObject *object, - int framenr, int winx, int winy, float mat[4][4]) +void BKE_tracking_get_projection_matrix(MovieTracking *tracking, + MovieTrackingObject *object, + int framenr, + int winx, + int winy, + float mat[4][4]) { - MovieReconstructedCamera *camera; - float lens = tracking->camera.focal * tracking->camera.sensor_width / (float)winx; - float viewfac, pixsize, left, right, bottom, top, clipsta, clipend; - float winmat[4][4]; - float ycor = 1.0f / tracking->camera.pixel_aspect; - float shiftx, shifty, winside = (float)min_ii(winx, winy); + MovieReconstructedCamera *camera; + float lens = tracking->camera.focal * tracking->camera.sensor_width / (float)winx; + float viewfac, pixsize, left, right, bottom, top, clipsta, clipend; + float winmat[4][4]; + float ycor = 1.0f / tracking->camera.pixel_aspect; + float shiftx, shifty, winside = (float)min_ii(winx, winy); - BKE_tracking_camera_shift_get(tracking, winx, winy, &shiftx, &shifty); + BKE_tracking_camera_shift_get(tracking, winx, winy, &shiftx, &shifty); - clipsta = 0.1f; - clipend = 1000.0f; + clipsta = 0.1f; + clipend = 1000.0f; - if (winx >= winy) - viewfac = (lens * winx) / tracking->camera.sensor_width; - else - viewfac = (ycor * lens * winy) / tracking->camera.sensor_width; + if (winx >= winy) + viewfac = (lens * winx) / tracking->camera.sensor_width; + else + viewfac = (ycor * lens * winy) / tracking->camera.sensor_width; - pixsize = clipsta / viewfac; + pixsize = clipsta / viewfac; - left = -0.5f * (float)winx + shiftx * winside; - bottom = -0.5f * (ycor) * (float)winy + shifty * winside; - right = 0.5f * (float)winx + shiftx * winside; - top = 0.5f * (ycor) * (float)winy + shifty * winside; + left = -0.5f * (float)winx + shiftx * winside; + bottom = -0.5f * (ycor) * (float)winy + shifty * winside; + right = 0.5f * (float)winx + shiftx * winside; + top = 0.5f * (ycor) * (float)winy + shifty * winside; - left *= pixsize; - right *= pixsize; - bottom *= pixsize; - top *= pixsize; + left *= pixsize; + right *= pixsize; + bottom *= pixsize; + top *= pixsize; - perspective_m4(winmat, left, right, bottom, top, clipsta, clipend); + perspective_m4(winmat, left, right, bottom, top, clipsta, clipend); - camera = BKE_tracking_camera_get_reconstructed(tracking, object, framenr); + camera = BKE_tracking_camera_get_reconstructed(tracking, object, framenr); - if (camera) { - float imat[4][4]; + if (camera) { + float imat[4][4]; - invert_m4_m4(imat, camera->mat); - mul_m4_m4m4(mat, winmat, imat); - } - else { - copy_m4_m4(mat, winmat); - } + invert_m4_m4(imat, camera->mat); + mul_m4_m4m4(mat, winmat, imat); + } + else { + copy_m4_m4(mat, winmat); + } } /*********************** clipboard *************************/ @@ -463,45 +479,45 @@ void BKE_tracking_get_projection_matrix(MovieTracking *tracking, MovieTrackingOb /* Free clipboard by freeing memory used by all tracks in it. */ void BKE_tracking_clipboard_free(void) { - MovieTrackingTrack *track = tracking_clipboard.tracks.first, *next_track; + MovieTrackingTrack *track = tracking_clipboard.tracks.first, *next_track; - while (track) { - next_track = track->next; + while (track) { + next_track = track->next; - BKE_tracking_track_free(track); - MEM_freeN(track); + BKE_tracking_track_free(track); + MEM_freeN(track); - track = next_track; - } + track = next_track; + } - BLI_listbase_clear(&tracking_clipboard.tracks); + BLI_listbase_clear(&tracking_clipboard.tracks); } /* Copy selected tracks from specified object to the clipboard. */ void BKE_tracking_clipboard_copy_tracks(MovieTracking *tracking, MovieTrackingObject *object) { - ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); - MovieTrackingTrack *track = tracksbase->first; + ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); + MovieTrackingTrack *track = tracksbase->first; - /* First drop all tracks from current clipboard. */ - BKE_tracking_clipboard_free(); + /* First drop all tracks from current clipboard. */ + BKE_tracking_clipboard_free(); - /* Then copy all selected visible tracks to it. */ - while (track) { - if (TRACK_SELECTED(track) && (track->flag & TRACK_HIDDEN) == 0) { - MovieTrackingTrack *new_track = BKE_tracking_track_duplicate(track); + /* Then copy all selected visible tracks to it. */ + while (track) { + if (TRACK_SELECTED(track) && (track->flag & TRACK_HIDDEN) == 0) { + MovieTrackingTrack *new_track = BKE_tracking_track_duplicate(track); - BLI_addtail(&tracking_clipboard.tracks, new_track); - } + BLI_addtail(&tracking_clipboard.tracks, new_track); + } - track = track->next; - } + track = track->next; + } } /* Check whether there're any tracks in the clipboard. */ bool BKE_tracking_clipboard_has_tracks(void) { - return (BLI_listbase_is_empty(&tracking_clipboard.tracks) == false); + return (BLI_listbase_is_empty(&tracking_clipboard.tracks) == false); } /* Paste tracks from clipboard to specified object. @@ -511,20 +527,20 @@ bool BKE_tracking_clipboard_has_tracks(void) */ void BKE_tracking_clipboard_paste_tracks(MovieTracking *tracking, MovieTrackingObject *object) { - ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); - MovieTrackingTrack *track = tracking_clipboard.tracks.first; + ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); + MovieTrackingTrack *track = tracking_clipboard.tracks.first; - while (track) { - MovieTrackingTrack *new_track = BKE_tracking_track_duplicate(track); - if (track->prev == NULL) { - tracking->act_track = new_track; - } + while (track) { + MovieTrackingTrack *new_track = BKE_tracking_track_duplicate(track); + if (track->prev == NULL) { + tracking->act_track = new_track; + } - BLI_addtail(tracksbase, new_track); - BKE_tracking_track_unique_name(tracksbase, new_track); + BLI_addtail(tracksbase, new_track); + BKE_tracking_track_unique_name(tracksbase, new_track); - track = track->next; - } + track = track->next; + } } /*********************** Tracks *************************/ @@ -537,81 +553,86 @@ void BKE_tracking_clipboard_paste_tracks(MovieTracking *tracking, MovieTrackingO * Width and height are clip's dimension used to scale track's * pattern and search regions. */ -MovieTrackingTrack *BKE_tracking_track_add(MovieTracking *tracking, ListBase *tracksbase, float x, float y, - int framenr, int width, int height) +MovieTrackingTrack *BKE_tracking_track_add(MovieTracking *tracking, + ListBase *tracksbase, + float x, + float y, + int framenr, + int width, + int height) { - MovieTrackingTrack *track; - MovieTrackingMarker marker; - MovieTrackingSettings *settings = &tracking->settings; + MovieTrackingTrack *track; + MovieTrackingMarker marker; + MovieTrackingSettings *settings = &tracking->settings; - float half_pattern = (float)settings->default_pattern_size / 2.0f; - float half_search = (float)settings->default_search_size / 2.0f; - float pat[2], search[2]; + float half_pattern = (float)settings->default_pattern_size / 2.0f; + float half_search = (float)settings->default_search_size / 2.0f; + float pat[2], search[2]; - pat[0] = half_pattern / (float)width; - pat[1] = half_pattern / (float)height; + pat[0] = half_pattern / (float)width; + pat[1] = half_pattern / (float)height; - search[0] = half_search / (float)width; - search[1] = half_search / (float)height; + search[0] = half_search / (float)width; + search[1] = half_search / (float)height; - track = MEM_callocN(sizeof(MovieTrackingTrack), "add_marker_exec track"); - strcpy(track->name, "Track"); + track = MEM_callocN(sizeof(MovieTrackingTrack), "add_marker_exec track"); + strcpy(track->name, "Track"); - /* fill track's settings from default settings */ - track->motion_model = settings->default_motion_model; - track->minimum_correlation = settings->default_minimum_correlation; - track->margin = settings->default_margin; - track->pattern_match = settings->default_pattern_match; - track->frames_limit = settings->default_frames_limit; - track->flag = settings->default_flag; - track->algorithm_flag = settings->default_algorithm_flag; - track->weight = settings->default_weight; - track->weight_stab = settings->default_weight; + /* fill track's settings from default settings */ + track->motion_model = settings->default_motion_model; + track->minimum_correlation = settings->default_minimum_correlation; + track->margin = settings->default_margin; + track->pattern_match = settings->default_pattern_match; + track->frames_limit = settings->default_frames_limit; + track->flag = settings->default_flag; + track->algorithm_flag = settings->default_algorithm_flag; + track->weight = settings->default_weight; + track->weight_stab = settings->default_weight; - memset(&marker, 0, sizeof(marker)); - marker.pos[0] = x; - marker.pos[1] = y; - marker.framenr = framenr; + memset(&marker, 0, sizeof(marker)); + marker.pos[0] = x; + marker.pos[1] = y; + marker.framenr = framenr; - marker.pattern_corners[0][0] = -pat[0]; - marker.pattern_corners[0][1] = -pat[1]; + marker.pattern_corners[0][0] = -pat[0]; + marker.pattern_corners[0][1] = -pat[1]; - marker.pattern_corners[1][0] = pat[0]; - marker.pattern_corners[1][1] = -pat[1]; + marker.pattern_corners[1][0] = pat[0]; + marker.pattern_corners[1][1] = -pat[1]; - negate_v2_v2(marker.pattern_corners[2], marker.pattern_corners[0]); - negate_v2_v2(marker.pattern_corners[3], marker.pattern_corners[1]); + negate_v2_v2(marker.pattern_corners[2], marker.pattern_corners[0]); + negate_v2_v2(marker.pattern_corners[3], marker.pattern_corners[1]); - copy_v2_v2(marker.search_max, search); - negate_v2_v2(marker.search_min, search); + copy_v2_v2(marker.search_max, search); + negate_v2_v2(marker.search_min, search); - BKE_tracking_marker_insert(track, &marker); + BKE_tracking_marker_insert(track, &marker); - BLI_addtail(tracksbase, track); - BKE_tracking_track_unique_name(tracksbase, track); + BLI_addtail(tracksbase, track); + BKE_tracking_track_unique_name(tracksbase, track); - return track; + return track; } /* Duplicate the specified track, result will no belong to any list. */ MovieTrackingTrack *BKE_tracking_track_duplicate(MovieTrackingTrack *track) { - MovieTrackingTrack *new_track; + MovieTrackingTrack *new_track; - new_track = MEM_callocN(sizeof(MovieTrackingTrack), "tracking_track_duplicate new_track"); + new_track = MEM_callocN(sizeof(MovieTrackingTrack), "tracking_track_duplicate new_track"); - *new_track = *track; - new_track->next = new_track->prev = NULL; + *new_track = *track; + new_track->next = new_track->prev = NULL; - new_track->markers = MEM_dupallocN(new_track->markers); + new_track->markers = MEM_dupallocN(new_track->markers); - /* Orevent duplicate from being used for 2D stabilization. - * If necessary, it shall be added explicitly. - */ - new_track->flag &= ~TRACK_USE_2D_STAB; - new_track->flag &= ~TRACK_USE_2D_STAB_ROT; + /* Orevent duplicate from being used for 2D stabilization. + * If necessary, it shall be added explicitly. + */ + new_track->flag &= ~TRACK_USE_2D_STAB; + new_track->flag &= ~TRACK_USE_2D_STAB_ROT; - return new_track; + return new_track; } /* Ensure specified track has got unique name, @@ -620,8 +641,12 @@ MovieTrackingTrack *BKE_tracking_track_duplicate(MovieTrackingTrack *track) */ void BKE_tracking_track_unique_name(ListBase *tracksbase, MovieTrackingTrack *track) { - BLI_uniquename(tracksbase, track, CTX_DATA_(BLT_I18NCONTEXT_ID_MOVIECLIP, "Track"), '.', - offsetof(MovieTrackingTrack, name), sizeof(track->name)); + BLI_uniquename(tracksbase, + track, + CTX_DATA_(BLT_I18NCONTEXT_ID_MOVIECLIP, "Track"), + '.', + offsetof(MovieTrackingTrack, name), + sizeof(track->name)); } /* Free specified track, only frees contents of a structure @@ -631,8 +656,8 @@ void BKE_tracking_track_unique_name(ListBase *tracksbase, MovieTrackingTrack *tr */ void BKE_tracking_track_free(MovieTrackingTrack *track) { - if (track->markers) - MEM_freeN(track->markers); + if (track->markers) + MEM_freeN(track->markers); } /* Set flag for all specified track's areas. @@ -642,15 +667,15 @@ void BKE_tracking_track_free(MovieTrackingTrack *track) */ void BKE_tracking_track_flag_set(MovieTrackingTrack *track, int area, int flag) { - if (area == TRACK_AREA_NONE) - return; + if (area == TRACK_AREA_NONE) + return; - if (area & TRACK_AREA_POINT) - track->flag |= flag; - if (area & TRACK_AREA_PAT) - track->pat_flag |= flag; - if (area & TRACK_AREA_SEARCH) - track->search_flag |= flag; + if (area & TRACK_AREA_POINT) + track->flag |= flag; + if (area & TRACK_AREA_PAT) + track->pat_flag |= flag; + if (area & TRACK_AREA_SEARCH) + track->search_flag |= flag; } /* Clear flag from all specified track's areas. @@ -660,15 +685,15 @@ void BKE_tracking_track_flag_set(MovieTrackingTrack *track, int area, int flag) */ void BKE_tracking_track_flag_clear(MovieTrackingTrack *track, int area, int flag) { - if (area == TRACK_AREA_NONE) - return; + if (area == TRACK_AREA_NONE) + return; - if (area & TRACK_AREA_POINT) - track->flag &= ~flag; - if (area & TRACK_AREA_PAT) - track->pat_flag &= ~flag; - if (area & TRACK_AREA_SEARCH) - track->search_flag &= ~flag; + if (area & TRACK_AREA_POINT) + track->flag &= ~flag; + if (area & TRACK_AREA_PAT) + track->pat_flag &= ~flag; + if (area & TRACK_AREA_SEARCH) + track->search_flag &= ~flag; } /* Check whether track has got marker at specified frame. @@ -677,7 +702,7 @@ void BKE_tracking_track_flag_clear(MovieTrackingTrack *track, int area, int flag */ bool BKE_tracking_track_has_marker_at_frame(MovieTrackingTrack *track, int framenr) { - return BKE_tracking_marker_get_exact(track, framenr) != NULL; + return BKE_tracking_marker_get_exact(track, framenr) != NULL; } /* Check whether track has got enabled marker at specified frame. @@ -686,9 +711,9 @@ bool BKE_tracking_track_has_marker_at_frame(MovieTrackingTrack *track, int frame */ bool BKE_tracking_track_has_enabled_marker_at_frame(MovieTrackingTrack *track, int framenr) { - MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr); + MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr); - return marker && (marker->flag & MARKER_DISABLED) == 0; + return marker && (marker->flag & MARKER_DISABLED) == 0; } /* Clear track's path: @@ -705,729 +730,762 @@ bool BKE_tracking_track_has_enabled_marker_at_frame(MovieTrackingTrack *track, i */ void BKE_tracking_track_path_clear(MovieTrackingTrack *track, int ref_frame, int action) { - int a; + int a; + + if (action == TRACK_CLEAR_REMAINED) { + a = 1; + + while (a < track->markersnr) { + if (track->markers[a].framenr > ref_frame) { + track->markersnr = a; + track->markers = MEM_reallocN(track->markers, + sizeof(MovieTrackingMarker) * track->markersnr); + + break; + } + + a++; + } + + if (track->markersnr) + tracking_marker_insert_disabled(track, &track->markers[track->markersnr - 1], false, true); + } + else if (action == TRACK_CLEAR_UPTO) { + a = track->markersnr - 1; + + while (a >= 0) { + if (track->markers[a].framenr <= ref_frame) { + memmove(track->markers, + track->markers + a, + (track->markersnr - a) * sizeof(MovieTrackingMarker)); + + track->markersnr = track->markersnr - a; + track->markers = MEM_reallocN(track->markers, + sizeof(MovieTrackingMarker) * track->markersnr); + + break; + } + + a--; + } + + if (track->markersnr) + tracking_marker_insert_disabled(track, &track->markers[0], true, true); + } + else if (action == TRACK_CLEAR_ALL) { + MovieTrackingMarker *marker, marker_new; + + marker = BKE_tracking_marker_get(track, ref_frame); + marker_new = *marker; + + MEM_freeN(track->markers); + track->markers = NULL; + track->markersnr = 0; + + BKE_tracking_marker_insert(track, &marker_new); + + tracking_marker_insert_disabled(track, &marker_new, true, true); + tracking_marker_insert_disabled(track, &marker_new, false, true); + } +} + +void BKE_tracking_tracks_join(MovieTracking *tracking, + MovieTrackingTrack *dst_track, + MovieTrackingTrack *src_track) +{ + int i = 0, a = 0, b = 0, tot; + MovieTrackingMarker *markers; + + tot = dst_track->markersnr + src_track->markersnr; + markers = MEM_callocN(tot * sizeof(MovieTrackingMarker), "tmp tracking joined tracks"); - if (action == TRACK_CLEAR_REMAINED) { - a = 1; + while (a < src_track->markersnr || b < dst_track->markersnr) { + if (b >= dst_track->markersnr) { + markers[i] = src_track->markers[a++]; + } + else if (a >= src_track->markersnr) { + markers[i] = dst_track->markers[b++]; + } + else if (src_track->markers[a].framenr < dst_track->markers[b].framenr) { + markers[i] = src_track->markers[a++]; + } + else if (src_track->markers[a].framenr > dst_track->markers[b].framenr) { + markers[i] = dst_track->markers[b++]; + } + else { + if ((src_track->markers[a].flag & MARKER_DISABLED) == 0) { + if ((dst_track->markers[b].flag & MARKER_DISABLED) == 0) { + /* both tracks are enabled on this frame, so find the whole segment + * on which tracks are intersecting and blend tracks using linear + * interpolation to prevent jumps + */ - while (a < track->markersnr) { - if (track->markers[a].framenr > ref_frame) { - track->markersnr = a; - track->markers = MEM_reallocN(track->markers, sizeof(MovieTrackingMarker) * track->markersnr); + MovieTrackingMarker *marker_a, *marker_b; + int start_a = a, start_b = b, len = 0, frame = src_track->markers[a].framenr; + int j, inverse = 0; - break; - } + inverse = (b == 0) || (dst_track->markers[b - 1].flag & MARKER_DISABLED) || + (dst_track->markers[b - 1].framenr != frame - 1); - a++; - } + /* find length of intersection */ + while (a < src_track->markersnr && b < dst_track->markersnr) { + marker_a = &src_track->markers[a]; + marker_b = &dst_track->markers[b]; - if (track->markersnr) - tracking_marker_insert_disabled(track, &track->markers[track->markersnr - 1], false, true); - } - else if (action == TRACK_CLEAR_UPTO) { - a = track->markersnr - 1; + if (marker_a->flag & MARKER_DISABLED || marker_b->flag & MARKER_DISABLED) + break; - while (a >= 0) { - if (track->markers[a].framenr <= ref_frame) { - memmove(track->markers, track->markers + a, (track->markersnr - a) * sizeof(MovieTrackingMarker)); + if (marker_a->framenr != frame || marker_b->framenr != frame) + break; - track->markersnr = track->markersnr - a; - track->markers = MEM_reallocN(track->markers, sizeof(MovieTrackingMarker) * track->markersnr); + frame++; + len++; + a++; + b++; + } - break; - } + a = start_a; + b = start_b; - a--; - } - - if (track->markersnr) - tracking_marker_insert_disabled(track, &track->markers[0], true, true); - } - else if (action == TRACK_CLEAR_ALL) { - MovieTrackingMarker *marker, marker_new; - - marker = BKE_tracking_marker_get(track, ref_frame); - marker_new = *marker; - - MEM_freeN(track->markers); - track->markers = NULL; - track->markersnr = 0; - - BKE_tracking_marker_insert(track, &marker_new); - - tracking_marker_insert_disabled(track, &marker_new, true, true); - tracking_marker_insert_disabled(track, &marker_new, false, true); - } -} - -void BKE_tracking_tracks_join(MovieTracking *tracking, MovieTrackingTrack *dst_track, MovieTrackingTrack *src_track) -{ - int i = 0, a = 0, b = 0, tot; - MovieTrackingMarker *markers; - - tot = dst_track->markersnr + src_track->markersnr; - markers = MEM_callocN(tot * sizeof(MovieTrackingMarker), "tmp tracking joined tracks"); - - while (a < src_track->markersnr || b < dst_track->markersnr) { - if (b >= dst_track->markersnr) { - markers[i] = src_track->markers[a++]; - } - else if (a >= src_track->markersnr) { - markers[i] = dst_track->markers[b++]; - } - else if (src_track->markers[a].framenr < dst_track->markers[b].framenr) { - markers[i] = src_track->markers[a++]; - } - else if (src_track->markers[a].framenr > dst_track->markers[b].framenr) { - markers[i] = dst_track->markers[b++]; - } - else { - if ((src_track->markers[a].flag & MARKER_DISABLED) == 0) { - if ((dst_track->markers[b].flag & MARKER_DISABLED) == 0) { - /* both tracks are enabled on this frame, so find the whole segment - * on which tracks are intersecting and blend tracks using linear - * interpolation to prevent jumps - */ - - MovieTrackingMarker *marker_a, *marker_b; - int start_a = a, start_b = b, len = 0, frame = src_track->markers[a].framenr; - int j, inverse = 0; - - inverse = (b == 0) || - (dst_track->markers[b - 1].flag & MARKER_DISABLED) || - (dst_track->markers[b - 1].framenr != frame - 1); - - /* find length of intersection */ - while (a < src_track->markersnr && b < dst_track->markersnr) { - marker_a = &src_track->markers[a]; - marker_b = &dst_track->markers[b]; - - if (marker_a->flag & MARKER_DISABLED || marker_b->flag & MARKER_DISABLED) - break; - - if (marker_a->framenr != frame || marker_b->framenr != frame) - break; + /* linear interpolation for intersecting frames */ + for (j = 0; j < len; j++) { + float fac = 0.5f; - frame++; - len++; - a++; - b++; - } + if (len > 1) + fac = 1.0f / (len - 1) * j; - a = start_a; - b = start_b; + if (inverse) + fac = 1.0f - fac; - /* linear interpolation for intersecting frames */ - for (j = 0; j < len; j++) { - float fac = 0.5f; + marker_a = &src_track->markers[a]; + marker_b = &dst_track->markers[b]; - if (len > 1) - fac = 1.0f / (len - 1) * j; + markers[i] = dst_track->markers[b]; + interp_v2_v2v2(markers[i].pos, marker_b->pos, marker_a->pos, fac); + a++; + b++; + i++; + } - if (inverse) - fac = 1.0f - fac; + /* this values will be incremented at the end of the loop cycle */ + a--; + b--; + i--; + } + else { + markers[i] = src_track->markers[a]; + } + } + else { + markers[i] = dst_track->markers[b]; + } - marker_a = &src_track->markers[a]; - marker_b = &dst_track->markers[b]; + a++; + b++; + } - markers[i] = dst_track->markers[b]; - interp_v2_v2v2(markers[i].pos, marker_b->pos, marker_a->pos, fac); - a++; - b++; - i++; - } + i++; + } - /* this values will be incremented at the end of the loop cycle */ - a--; b--; i--; - } - else { - markers[i] = src_track->markers[a]; - } - } - else { - markers[i] = dst_track->markers[b]; - } + MEM_freeN(dst_track->markers); - a++; - b++; - } + dst_track->markers = MEM_callocN(i * sizeof(MovieTrackingMarker), "tracking joined tracks"); + memcpy(dst_track->markers, markers, i * sizeof(MovieTrackingMarker)); - i++; - } + dst_track->markersnr = i; - MEM_freeN(dst_track->markers); + MEM_freeN(markers); - dst_track->markers = MEM_callocN(i * sizeof(MovieTrackingMarker), "tracking joined tracks"); - memcpy(dst_track->markers, markers, i * sizeof(MovieTrackingMarker)); - - dst_track->markersnr = i; - - MEM_freeN(markers); - - BKE_tracking_dopesheet_tag_update(tracking); + BKE_tracking_dopesheet_tag_update(tracking); } -MovieTrackingTrack *BKE_tracking_track_get_named(MovieTracking *tracking, MovieTrackingObject *object, const char *name) +MovieTrackingTrack *BKE_tracking_track_get_named(MovieTracking *tracking, + MovieTrackingObject *object, + const char *name) { - ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); - MovieTrackingTrack *track = tracksbase->first; + ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); + MovieTrackingTrack *track = tracksbase->first; - while (track) { - if (STREQ(track->name, name)) - return track; + while (track) { + if (STREQ(track->name, name)) + return track; - track = track->next; - } + track = track->next; + } - return NULL; + return NULL; } -MovieTrackingTrack *BKE_tracking_track_get_indexed(MovieTracking *tracking, int tracknr, ListBase **r_tracksbase) +MovieTrackingTrack *BKE_tracking_track_get_indexed(MovieTracking *tracking, + int tracknr, + ListBase **r_tracksbase) { - MovieTrackingObject *object; - int cur = 1; + MovieTrackingObject *object; + int cur = 1; - object = tracking->objects.first; - while (object) { - ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); - MovieTrackingTrack *track = tracksbase->first; + object = tracking->objects.first; + while (object) { + ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); + MovieTrackingTrack *track = tracksbase->first; - while (track) { - if (track->flag & TRACK_HAS_BUNDLE) { - if (cur == tracknr) { - *r_tracksbase = tracksbase; - return track; - } + while (track) { + if (track->flag & TRACK_HAS_BUNDLE) { + if (cur == tracknr) { + *r_tracksbase = tracksbase; + return track; + } - cur++; - } + cur++; + } - track = track->next; - } + track = track->next; + } - object = object->next; - } + object = object->next; + } - *r_tracksbase = NULL; + *r_tracksbase = NULL; - return NULL; + return NULL; } MovieTrackingTrack *BKE_tracking_track_get_active(MovieTracking *tracking) { - ListBase *tracksbase; + ListBase *tracksbase; - if (!tracking->act_track) - return NULL; + if (!tracking->act_track) + return NULL; - tracksbase = BKE_tracking_get_active_tracks(tracking); + tracksbase = BKE_tracking_get_active_tracks(tracking); - /* check that active track is in current tracks list */ - if (BLI_findindex(tracksbase, tracking->act_track) != -1) - return tracking->act_track; + /* check that active track is in current tracks list */ + if (BLI_findindex(tracksbase, tracking->act_track) != -1) + return tracking->act_track; - return NULL; + return NULL; } static bGPDlayer *track_mask_gpencil_layer_get(MovieTrackingTrack *track) { - bGPDlayer *layer; + bGPDlayer *layer; - if (!track->gpd) - return NULL; + if (!track->gpd) + return NULL; - layer = track->gpd->layers.first; + layer = track->gpd->layers.first; - while (layer) { - if (layer->flag & GP_LAYER_ACTIVE) { - bGPDframe *frame = layer->frames.first; - bool ok = false; + while (layer) { + if (layer->flag & GP_LAYER_ACTIVE) { + bGPDframe *frame = layer->frames.first; + bool ok = false; - while (frame) { - if (frame->strokes.first) { - ok = true; - break; - } + while (frame) { + if (frame->strokes.first) { + ok = true; + break; + } - frame = frame->next; - } + frame = frame->next; + } - if (ok) - return layer; - } + if (ok) + return layer; + } - layer = layer->next; - } + layer = layer->next; + } - return NULL; + return NULL; } typedef struct TrackMaskSetPixelData { - float *mask; - int mask_width; - int mask_height; + float *mask; + int mask_width; + int mask_height; } TrackMaskSetPixelData; static void track_mask_set_pixel_cb(int x, int x_end, int y, void *user_data) { - TrackMaskSetPixelData *data = (TrackMaskSetPixelData *)user_data; - size_t index = (size_t)y * data->mask_width + x; - size_t index_end = (size_t)y * data->mask_width + x_end; - do { - data->mask[index] = 1.0f; - } while (++index != index_end); + TrackMaskSetPixelData *data = (TrackMaskSetPixelData *)user_data; + size_t index = (size_t)y * data->mask_width + x; + size_t index_end = (size_t)y * data->mask_width + x_end; + do { + data->mask[index] = 1.0f; + } while (++index != index_end); } -static void track_mask_gpencil_layer_rasterize(int frame_width, int frame_height, +static void track_mask_gpencil_layer_rasterize(int frame_width, + int frame_height, const float region_min[2], bGPDlayer *layer, float *mask, int mask_width, int mask_height) { - bGPDframe *frame = layer->frames.first; - TrackMaskSetPixelData data; - - data.mask = mask; - data.mask_width = mask_width; - data.mask_height = mask_height; - - while (frame) { - bGPDstroke *stroke = frame->strokes.first; - - while (stroke) { - bGPDspoint *stroke_points = stroke->points; - if (stroke->flag & GP_STROKE_2DSPACE) { - int *mask_points, *point; - point = mask_points = MEM_callocN(2 * stroke->totpoints * sizeof(int), - "track mask rasterization points"); - for (int i = 0; i < stroke->totpoints; i++, point += 2) { - point[0] = stroke_points[i].x * frame_width - region_min[0]; - point[1] = stroke_points[i].y * frame_height - region_min[1]; - } - /* TODO: add an option to control whether AA is enabled or not */ - BLI_bitmap_draw_2d_poly_v2i_n( - 0, 0, mask_width, mask_height, - (const int (*)[2])mask_points, stroke->totpoints, - track_mask_set_pixel_cb, &data); - MEM_freeN(mask_points); - } - stroke = stroke->next; - } - frame = frame->next; - } + bGPDframe *frame = layer->frames.first; + TrackMaskSetPixelData data; + + data.mask = mask; + data.mask_width = mask_width; + data.mask_height = mask_height; + + while (frame) { + bGPDstroke *stroke = frame->strokes.first; + + while (stroke) { + bGPDspoint *stroke_points = stroke->points; + if (stroke->flag & GP_STROKE_2DSPACE) { + int *mask_points, *point; + point = mask_points = MEM_callocN(2 * stroke->totpoints * sizeof(int), + "track mask rasterization points"); + for (int i = 0; i < stroke->totpoints; i++, point += 2) { + point[0] = stroke_points[i].x * frame_width - region_min[0]; + point[1] = stroke_points[i].y * frame_height - region_min[1]; + } + /* TODO: add an option to control whether AA is enabled or not */ + BLI_bitmap_draw_2d_poly_v2i_n(0, + 0, + mask_width, + mask_height, + (const int(*)[2])mask_points, + stroke->totpoints, + track_mask_set_pixel_cb, + &data); + MEM_freeN(mask_points); + } + stroke = stroke->next; + } + frame = frame->next; + } } /* Region is in pixel space, relative to marker's center. */ -float *tracking_track_get_mask_for_region(int frame_width, int frame_height, +float *tracking_track_get_mask_for_region(int frame_width, + int frame_height, const float region_min[2], const float region_max[2], MovieTrackingTrack *track) { - float *mask = NULL; - bGPDlayer *layer = track_mask_gpencil_layer_get(track); - if (layer != NULL) { - const int mask_width = region_max[0] - region_min[0]; - const int mask_height = region_max[1] - region_min[1]; - mask = MEM_callocN(mask_width * mask_height * sizeof(float), "track mask"); - track_mask_gpencil_layer_rasterize(frame_width, frame_height, - region_min, - layer, - mask, - mask_width, mask_height); - } - return mask; -} - -float *BKE_tracking_track_get_mask(int frame_width, int frame_height, + float *mask = NULL; + bGPDlayer *layer = track_mask_gpencil_layer_get(track); + if (layer != NULL) { + const int mask_width = region_max[0] - region_min[0]; + const int mask_height = region_max[1] - region_min[1]; + mask = MEM_callocN(mask_width * mask_height * sizeof(float), "track mask"); + track_mask_gpencil_layer_rasterize( + frame_width, frame_height, region_min, layer, mask, mask_width, mask_height); + } + return mask; +} + +float *BKE_tracking_track_get_mask(int frame_width, + int frame_height, MovieTrackingTrack *track, MovieTrackingMarker *marker) { - /* Convert normalized space marker's search area to pixel-space region. */ - const float region_min[2] = {marker->search_min[0] * frame_width, - marker->search_min[1] * frame_height}; - const float region_max[2] = {marker->search_max[0] * frame_width, - marker->search_max[1] * frame_height}; - return tracking_track_get_mask_for_region(frame_width, frame_height, - region_min, - region_max, - track); + /* Convert normalized space marker's search area to pixel-space region. */ + const float region_min[2] = {marker->search_min[0] * frame_width, + marker->search_min[1] * frame_height}; + const float region_max[2] = {marker->search_max[0] * frame_width, + marker->search_max[1] * frame_height}; + return tracking_track_get_mask_for_region( + frame_width, frame_height, region_min, region_max, track); } -float BKE_tracking_track_get_weight_for_marker(MovieClip *clip, MovieTrackingTrack *track, MovieTrackingMarker *marker) +float BKE_tracking_track_get_weight_for_marker(MovieClip *clip, + MovieTrackingTrack *track, + MovieTrackingMarker *marker) { - FCurve *weight_fcurve; - float weight = track->weight; + FCurve *weight_fcurve; + float weight = track->weight; - weight_fcurve = id_data_find_fcurve(&clip->id, track, &RNA_MovieTrackingTrack, - "weight", 0, NULL); + weight_fcurve = id_data_find_fcurve( + &clip->id, track, &RNA_MovieTrackingTrack, "weight", 0, NULL); - if (weight_fcurve) { - int scene_framenr = - BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr); - weight = evaluate_fcurve(weight_fcurve, scene_framenr); - } + if (weight_fcurve) { + int scene_framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr); + weight = evaluate_fcurve(weight_fcurve, scene_framenr); + } - return weight; + return weight; } /* area - which part of marker should be selected. see TRACK_AREA_* constants */ -void BKE_tracking_track_select(ListBase *tracksbase, MovieTrackingTrack *track, int area, bool extend) -{ - if (extend) { - BKE_tracking_track_flag_set(track, area, SELECT); - } - else { - MovieTrackingTrack *cur = tracksbase->first; - - while (cur) { - if ((cur->flag & TRACK_HIDDEN) == 0) { - if (cur == track) { - BKE_tracking_track_flag_clear(cur, TRACK_AREA_ALL, SELECT); - BKE_tracking_track_flag_set(cur, area, SELECT); - } - else { - BKE_tracking_track_flag_clear(cur, TRACK_AREA_ALL, SELECT); - } - } - - cur = cur->next; - } - } +void BKE_tracking_track_select(ListBase *tracksbase, + MovieTrackingTrack *track, + int area, + bool extend) +{ + if (extend) { + BKE_tracking_track_flag_set(track, area, SELECT); + } + else { + MovieTrackingTrack *cur = tracksbase->first; + + while (cur) { + if ((cur->flag & TRACK_HIDDEN) == 0) { + if (cur == track) { + BKE_tracking_track_flag_clear(cur, TRACK_AREA_ALL, SELECT); + BKE_tracking_track_flag_set(cur, area, SELECT); + } + else { + BKE_tracking_track_flag_clear(cur, TRACK_AREA_ALL, SELECT); + } + } + + cur = cur->next; + } + } } void BKE_tracking_track_deselect(MovieTrackingTrack *track, int area) { - BKE_tracking_track_flag_clear(track, area, SELECT); + BKE_tracking_track_flag_clear(track, area, SELECT); } void BKE_tracking_tracks_deselect_all(ListBase *tracksbase) { - MovieTrackingTrack *track; + MovieTrackingTrack *track; - for (track = tracksbase->first; track; track = track->next) { - if ((track->flag & TRACK_HIDDEN) == 0) { - BKE_tracking_track_flag_clear(track, TRACK_AREA_ALL, SELECT); - } - } + for (track = tracksbase->first; track; track = track->next) { + if ((track->flag & TRACK_HIDDEN) == 0) { + BKE_tracking_track_flag_clear(track, TRACK_AREA_ALL, SELECT); + } + } } /*********************** Marker *************************/ -MovieTrackingMarker *BKE_tracking_marker_insert(MovieTrackingTrack *track, MovieTrackingMarker *marker) +MovieTrackingMarker *BKE_tracking_marker_insert(MovieTrackingTrack *track, + MovieTrackingMarker *marker) { - MovieTrackingMarker *old_marker = NULL; + MovieTrackingMarker *old_marker = NULL; - if (track->markersnr) - old_marker = BKE_tracking_marker_get_exact(track, marker->framenr); + if (track->markersnr) + old_marker = BKE_tracking_marker_get_exact(track, marker->framenr); - if (old_marker) { - /* simply replace settings for already allocated marker */ - *old_marker = *marker; + if (old_marker) { + /* simply replace settings for already allocated marker */ + *old_marker = *marker; - return old_marker; - } - else { - int a = track->markersnr; + return old_marker; + } + else { + int a = track->markersnr; - /* find position in array where to add new marker */ - while (a--) { - if (track->markers[a].framenr < marker->framenr) - break; - } + /* find position in array where to add new marker */ + while (a--) { + if (track->markers[a].framenr < marker->framenr) + break; + } - track->markersnr++; + track->markersnr++; - if (track->markers) - track->markers = MEM_reallocN(track->markers, sizeof(MovieTrackingMarker) * track->markersnr); - else - track->markers = MEM_callocN(sizeof(MovieTrackingMarker), "MovieTracking markers"); + if (track->markers) + track->markers = MEM_reallocN(track->markers, + sizeof(MovieTrackingMarker) * track->markersnr); + else + track->markers = MEM_callocN(sizeof(MovieTrackingMarker), "MovieTracking markers"); - /* shift array to "free" space for new marker */ - memmove(track->markers + a + 2, track->markers + a + 1, - (track->markersnr - a - 2) * sizeof(MovieTrackingMarker)); + /* shift array to "free" space for new marker */ + memmove(track->markers + a + 2, + track->markers + a + 1, + (track->markersnr - a - 2) * sizeof(MovieTrackingMarker)); - /* put new marker */ - track->markers[a + 1] = *marker; + /* put new marker */ + track->markers[a + 1] = *marker; - track->last_marker = a + 1; + track->last_marker = a + 1; - return &track->markers[a + 1]; - } + return &track->markers[a + 1]; + } } void BKE_tracking_marker_delete(MovieTrackingTrack *track, int framenr) { - int a = 0; + int a = 0; - while (a < track->markersnr) { - if (track->markers[a].framenr == framenr) { - if (track->markersnr > 1) { - memmove(track->markers + a, track->markers + a + 1, - (track->markersnr - a - 1) * sizeof(MovieTrackingMarker)); - track->markersnr--; - track->markers = MEM_reallocN(track->markers, sizeof(MovieTrackingMarker) * track->markersnr); - } - else { - MEM_freeN(track->markers); - track->markers = NULL; - track->markersnr = 0; - } + while (a < track->markersnr) { + if (track->markers[a].framenr == framenr) { + if (track->markersnr > 1) { + memmove(track->markers + a, + track->markers + a + 1, + (track->markersnr - a - 1) * sizeof(MovieTrackingMarker)); + track->markersnr--; + track->markers = MEM_reallocN(track->markers, + sizeof(MovieTrackingMarker) * track->markersnr); + } + else { + MEM_freeN(track->markers); + track->markers = NULL; + track->markersnr = 0; + } - break; - } + break; + } - a++; - } + a++; + } } void BKE_tracking_marker_clamp(MovieTrackingMarker *marker, int event) { - int a; - float pat_min[2], pat_max[2]; - - BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); - - if (event == CLAMP_PAT_DIM) { - for (a = 0; a < 2; a++) { - /* search shouldn't be resized smaller than pattern */ - marker->search_min[a] = min_ff(pat_min[a], marker->search_min[a]); - marker->search_max[a] = max_ff(pat_max[a], marker->search_max[a]); - } - } - else if (event == CLAMP_PAT_POS) { - float dim[2]; - - sub_v2_v2v2(dim, pat_max, pat_min); - - for (a = 0; a < 2; a++) { - int b; - /* pattern shouldn't be moved outside of search */ - if (pat_min[a] < marker->search_min[a]) { - for (b = 0; b < 4; b++) - marker->pattern_corners[b][a] += marker->search_min[a] - pat_min[a]; - } - if (pat_max[a] > marker->search_max[a]) { - for (b = 0; b < 4; b++) - marker->pattern_corners[b][a] -= pat_max[a] - marker->search_max[a]; - } - } - } - else if (event == CLAMP_SEARCH_DIM) { - for (a = 0; a < 2; a++) { - /* search shouldn't be resized smaller than pattern */ - marker->search_min[a] = min_ff(pat_min[a], marker->search_min[a]); - marker->search_max[a] = max_ff(pat_max[a], marker->search_max[a]); - } - } - else if (event == CLAMP_SEARCH_POS) { - float dim[2]; - - sub_v2_v2v2(dim, marker->search_max, marker->search_min); - - for (a = 0; a < 2; a++) { - /* search shouldn't be moved inside pattern */ - if (marker->search_min[a] > pat_min[a]) { - marker->search_min[a] = pat_min[a]; - marker->search_max[a] = marker->search_min[a] + dim[a]; - } - if (marker->search_max[a] < pat_max[a]) { - marker->search_max[a] = pat_max[a]; - marker->search_min[a] = marker->search_max[a] - dim[a]; - } - } - } + int a; + float pat_min[2], pat_max[2]; + + BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); + + if (event == CLAMP_PAT_DIM) { + for (a = 0; a < 2; a++) { + /* search shouldn't be resized smaller than pattern */ + marker->search_min[a] = min_ff(pat_min[a], marker->search_min[a]); + marker->search_max[a] = max_ff(pat_max[a], marker->search_max[a]); + } + } + else if (event == CLAMP_PAT_POS) { + float dim[2]; + + sub_v2_v2v2(dim, pat_max, pat_min); + + for (a = 0; a < 2; a++) { + int b; + /* pattern shouldn't be moved outside of search */ + if (pat_min[a] < marker->search_min[a]) { + for (b = 0; b < 4; b++) + marker->pattern_corners[b][a] += marker->search_min[a] - pat_min[a]; + } + if (pat_max[a] > marker->search_max[a]) { + for (b = 0; b < 4; b++) + marker->pattern_corners[b][a] -= pat_max[a] - marker->search_max[a]; + } + } + } + else if (event == CLAMP_SEARCH_DIM) { + for (a = 0; a < 2; a++) { + /* search shouldn't be resized smaller than pattern */ + marker->search_min[a] = min_ff(pat_min[a], marker->search_min[a]); + marker->search_max[a] = max_ff(pat_max[a], marker->search_max[a]); + } + } + else if (event == CLAMP_SEARCH_POS) { + float dim[2]; + + sub_v2_v2v2(dim, marker->search_max, marker->search_min); + + for (a = 0; a < 2; a++) { + /* search shouldn't be moved inside pattern */ + if (marker->search_min[a] > pat_min[a]) { + marker->search_min[a] = pat_min[a]; + marker->search_max[a] = marker->search_min[a] + dim[a]; + } + if (marker->search_max[a] < pat_max[a]) { + marker->search_max[a] = pat_max[a]; + marker->search_min[a] = marker->search_max[a] - dim[a]; + } + } + } } MovieTrackingMarker *BKE_tracking_marker_get(MovieTrackingTrack *track, int framenr) { - int a = track->markersnr - 1; + int a = track->markersnr - 1; - if (!track->markersnr) - return NULL; + if (!track->markersnr) + return NULL; - /* approximate pre-first framenr marker with first marker */ - if (framenr < track->markers[0].framenr) - return &track->markers[0]; + /* approximate pre-first framenr marker with first marker */ + if (framenr < track->markers[0].framenr) + return &track->markers[0]; - if (track->last_marker < track->markersnr) - a = track->last_marker; + if (track->last_marker < track->markersnr) + a = track->last_marker; - if (track->markers[a].framenr <= framenr) { - while (a < track->markersnr && track->markers[a].framenr <= framenr) { - if (track->markers[a].framenr == framenr) { - track->last_marker = a; + if (track->markers[a].framenr <= framenr) { + while (a < track->markersnr && track->markers[a].framenr <= framenr) { + if (track->markers[a].framenr == framenr) { + track->last_marker = a; - return &track->markers[a]; - } - a++; - } + return &track->markers[a]; + } + a++; + } - /* if there's no marker for exact position, use nearest marker from left side */ - return &track->markers[a - 1]; - } - else { - while (a >= 0 && track->markers[a].framenr >= framenr) { - if (track->markers[a].framenr == framenr) { - track->last_marker = a; + /* if there's no marker for exact position, use nearest marker from left side */ + return &track->markers[a - 1]; + } + else { + while (a >= 0 && track->markers[a].framenr >= framenr) { + if (track->markers[a].framenr == framenr) { + track->last_marker = a; - return &track->markers[a]; - } + return &track->markers[a]; + } - a--; - } + a--; + } - /* if there's no marker for exact position, use nearest marker from left side */ - return &track->markers[a]; - } + /* if there's no marker for exact position, use nearest marker from left side */ + return &track->markers[a]; + } - return NULL; + return NULL; } MovieTrackingMarker *BKE_tracking_marker_get_exact(MovieTrackingTrack *track, int framenr) { - MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); + MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); - if (marker->framenr != framenr) - return NULL; + if (marker->framenr != framenr) + return NULL; - return marker; + return marker; } MovieTrackingMarker *BKE_tracking_marker_ensure(MovieTrackingTrack *track, int framenr) { - MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); + MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); - if (marker->framenr != framenr) { - MovieTrackingMarker marker_new; + if (marker->framenr != framenr) { + MovieTrackingMarker marker_new; - marker_new = *marker; - marker_new.framenr = framenr; + marker_new = *marker; + marker_new.framenr = framenr; - BKE_tracking_marker_insert(track, &marker_new); - marker = BKE_tracking_marker_get(track, framenr); - } + BKE_tracking_marker_insert(track, &marker_new); + marker = BKE_tracking_marker_get(track, framenr); + } - return marker; + return marker; } -void BKE_tracking_marker_pattern_minmax(const MovieTrackingMarker *marker, float min[2], float max[2]) +void BKE_tracking_marker_pattern_minmax(const MovieTrackingMarker *marker, + float min[2], + float max[2]) { - INIT_MINMAX2(min, max); + INIT_MINMAX2(min, max); - minmax_v2v2_v2(min, max, marker->pattern_corners[0]); - minmax_v2v2_v2(min, max, marker->pattern_corners[1]); - minmax_v2v2_v2(min, max, marker->pattern_corners[2]); - minmax_v2v2_v2(min, max, marker->pattern_corners[3]); + minmax_v2v2_v2(min, max, marker->pattern_corners[0]); + minmax_v2v2_v2(min, max, marker->pattern_corners[1]); + minmax_v2v2_v2(min, max, marker->pattern_corners[2]); + minmax_v2v2_v2(min, max, marker->pattern_corners[3]); } -void BKE_tracking_marker_get_subframe_position(MovieTrackingTrack *track, float framenr, float pos[2]) +void BKE_tracking_marker_get_subframe_position(MovieTrackingTrack *track, + float framenr, + float pos[2]) { - MovieTrackingMarker *marker = BKE_tracking_marker_get(track, (int) framenr); - MovieTrackingMarker *marker_last = track->markers + (track->markersnr - 1); + MovieTrackingMarker *marker = BKE_tracking_marker_get(track, (int)framenr); + MovieTrackingMarker *marker_last = track->markers + (track->markersnr - 1); - if (marker != marker_last) { - MovieTrackingMarker *marker_next = marker + 1; + if (marker != marker_last) { + MovieTrackingMarker *marker_next = marker + 1; - if (marker_next->framenr == marker->framenr + 1) { - /* currently only do subframing inside tracked ranges, do not extrapolate tracked segments - * could be changed when / if mask parent would be interpolating position in-between - * tracked segments - */ + if (marker_next->framenr == marker->framenr + 1) { + /* currently only do subframing inside tracked ranges, do not extrapolate tracked segments + * could be changed when / if mask parent would be interpolating position in-between + * tracked segments + */ - float fac = (framenr - (int) framenr) / (marker_next->framenr - marker->framenr); + float fac = (framenr - (int)framenr) / (marker_next->framenr - marker->framenr); - interp_v2_v2v2(pos, marker->pos, marker_next->pos, fac); - } - else { - copy_v2_v2(pos, marker->pos); - } - } - else { - copy_v2_v2(pos, marker->pos); - } + interp_v2_v2v2(pos, marker->pos, marker_next->pos, fac); + } + else { + copy_v2_v2(pos, marker->pos); + } + } + else { + copy_v2_v2(pos, marker->pos); + } - /* currently track offset is always wanted to be applied here, could be made an option later */ - add_v2_v2(pos, track->offset); + /* currently track offset is always wanted to be applied here, could be made an option later */ + add_v2_v2(pos, track->offset); } /*********************** Plane 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) -{ - MovieTrackingPlaneTrack *plane_track; - MovieTrackingPlaneMarker plane_marker; - MovieTrackingTrack *track; - float tracks_min[2], tracks_max[2]; - int track_index, num_selected_tracks = 0; - - (void) tracking; /* Ignored. */ - - /* Use bounding box of selected markers as an initial size of plane. */ - INIT_MINMAX2(tracks_min, tracks_max); - for (track = tracks->first; track; track = track->next) { - if (TRACK_SELECTED(track)) { - MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); - float pattern_min[2], pattern_max[2]; - BKE_tracking_marker_pattern_minmax(marker, pattern_min, pattern_max); - add_v2_v2(pattern_min, marker->pos); - add_v2_v2(pattern_max, marker->pos); - minmax_v2v2_v2(tracks_min, tracks_max, pattern_min); - minmax_v2v2_v2(tracks_min, tracks_max, pattern_max); - num_selected_tracks++; - } - } - - if (num_selected_tracks < 4) { - return NULL; - } - - /* Allocate new plane track. */ - plane_track = MEM_callocN(sizeof(MovieTrackingPlaneTrack), "new plane track"); - - /* Use some default name. */ - strcpy(plane_track->name, "Plane Track"); - - plane_track->image_opacity = 1.0f; - - /* Use selected tracks from given list as a plane. */ - plane_track->point_tracks = - MEM_mallocN(sizeof(MovieTrackingTrack *) * num_selected_tracks, "new plane tracks array"); - for (track = tracks->first, track_index = 0; track; track = track->next) { - if (TRACK_SELECTED(track)) { - plane_track->point_tracks[track_index] = track; - track_index++; - } - } - plane_track->point_tracksnr = num_selected_tracks; - - /* Setup new plane marker and add it to the track. */ - plane_marker.framenr = framenr; - plane_marker.flag = 0; - - copy_v2_v2(plane_marker.corners[0], tracks_min); - copy_v2_v2(plane_marker.corners[2], tracks_max); - - plane_marker.corners[1][0] = tracks_max[0]; - plane_marker.corners[1][1] = tracks_min[1]; - plane_marker.corners[3][0] = tracks_min[0]; - plane_marker.corners[3][1] = tracks_max[1]; - - BKE_tracking_plane_marker_insert(plane_track, &plane_marker); - - /* Put new plane track to the list, ensure it's name is unique. */ - BLI_addtail(plane_tracks_base, plane_track); - BKE_tracking_plane_track_unique_name(plane_tracks_base, plane_track); - - return plane_track; -} - -void BKE_tracking_plane_track_unique_name(ListBase *plane_tracks_base, MovieTrackingPlaneTrack *plane_track) -{ - BLI_uniquename(plane_tracks_base, plane_track, CTX_DATA_(BLT_I18NCONTEXT_ID_MOVIECLIP, "Plane Track"), '.', - offsetof(MovieTrackingPlaneTrack, name), sizeof(plane_track->name)); +MovieTrackingPlaneTrack *BKE_tracking_plane_track_add(MovieTracking *tracking, + ListBase *plane_tracks_base, + ListBase *tracks, + int framenr) +{ + MovieTrackingPlaneTrack *plane_track; + MovieTrackingPlaneMarker plane_marker; + MovieTrackingTrack *track; + float tracks_min[2], tracks_max[2]; + int track_index, num_selected_tracks = 0; + + (void)tracking; /* Ignored. */ + + /* Use bounding box of selected markers as an initial size of plane. */ + INIT_MINMAX2(tracks_min, tracks_max); + for (track = tracks->first; track; track = track->next) { + if (TRACK_SELECTED(track)) { + MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); + float pattern_min[2], pattern_max[2]; + BKE_tracking_marker_pattern_minmax(marker, pattern_min, pattern_max); + add_v2_v2(pattern_min, marker->pos); + add_v2_v2(pattern_max, marker->pos); + minmax_v2v2_v2(tracks_min, tracks_max, pattern_min); + minmax_v2v2_v2(tracks_min, tracks_max, pattern_max); + num_selected_tracks++; + } + } + + if (num_selected_tracks < 4) { + return NULL; + } + + /* Allocate new plane track. */ + plane_track = MEM_callocN(sizeof(MovieTrackingPlaneTrack), "new plane track"); + + /* Use some default name. */ + strcpy(plane_track->name, "Plane Track"); + + plane_track->image_opacity = 1.0f; + + /* Use selected tracks from given list as a plane. */ + plane_track->point_tracks = MEM_mallocN(sizeof(MovieTrackingTrack *) * num_selected_tracks, + "new plane tracks array"); + for (track = tracks->first, track_index = 0; track; track = track->next) { + if (TRACK_SELECTED(track)) { + plane_track->point_tracks[track_index] = track; + track_index++; + } + } + plane_track->point_tracksnr = num_selected_tracks; + + /* Setup new plane marker and add it to the track. */ + plane_marker.framenr = framenr; + plane_marker.flag = 0; + + copy_v2_v2(plane_marker.corners[0], tracks_min); + copy_v2_v2(plane_marker.corners[2], tracks_max); + + plane_marker.corners[1][0] = tracks_max[0]; + plane_marker.corners[1][1] = tracks_min[1]; + plane_marker.corners[3][0] = tracks_min[0]; + plane_marker.corners[3][1] = tracks_max[1]; + + BKE_tracking_plane_marker_insert(plane_track, &plane_marker); + + /* Put new plane track to the list, ensure it's name is unique. */ + BLI_addtail(plane_tracks_base, plane_track); + BKE_tracking_plane_track_unique_name(plane_tracks_base, plane_track); + + return plane_track; +} + +void BKE_tracking_plane_track_unique_name(ListBase *plane_tracks_base, + MovieTrackingPlaneTrack *plane_track) +{ + BLI_uniquename(plane_tracks_base, + plane_track, + CTX_DATA_(BLT_I18NCONTEXT_ID_MOVIECLIP, "Plane Track"), + '.', + offsetof(MovieTrackingPlaneTrack, name), + sizeof(plane_track->name)); } /* Free specified plane track, only frees contents of a structure @@ -1437,146 +1495,135 @@ void BKE_tracking_plane_track_unique_name(ListBase *plane_tracks_base, MovieTrac */ void BKE_tracking_plane_track_free(MovieTrackingPlaneTrack *plane_track) { - if (plane_track->markers) { - MEM_freeN(plane_track->markers); - } + if (plane_track->markers) { + MEM_freeN(plane_track->markers); + } - MEM_freeN(plane_track->point_tracks); + MEM_freeN(plane_track->point_tracks); } MovieTrackingPlaneTrack *BKE_tracking_plane_track_get_named(MovieTracking *tracking, MovieTrackingObject *object, const char *name) { - ListBase *plane_tracks_base = BKE_tracking_object_get_plane_tracks(tracking, object); - MovieTrackingPlaneTrack *plane_track; + ListBase *plane_tracks_base = BKE_tracking_object_get_plane_tracks(tracking, object); + MovieTrackingPlaneTrack *plane_track; - for (plane_track = plane_tracks_base->first; - plane_track; - plane_track = plane_track->next) - { - if (STREQ(plane_track->name, name)) { - return plane_track; - } - } + for (plane_track = plane_tracks_base->first; plane_track; plane_track = plane_track->next) { + if (STREQ(plane_track->name, name)) { + return plane_track; + } + } - return NULL; + return NULL; } MovieTrackingPlaneTrack *BKE_tracking_plane_track_get_active(struct MovieTracking *tracking) { - ListBase *plane_tracks_base; + ListBase *plane_tracks_base; - if (tracking->act_plane_track == NULL) { - return NULL; - } + if (tracking->act_plane_track == NULL) { + return NULL; + } - plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - /* Check that active track is in current plane tracks list */ - if (BLI_findindex(plane_tracks_base, tracking->act_plane_track) != -1) { - return tracking->act_plane_track; - } + /* Check that active track is in current plane tracks list */ + if (BLI_findindex(plane_tracks_base, tracking->act_plane_track) != -1) { + return tracking->act_plane_track; + } - return NULL; + return NULL; } void BKE_tracking_plane_tracks_deselect_all(ListBase *plane_tracks_base) { - MovieTrackingPlaneTrack *plane_track; + MovieTrackingPlaneTrack *plane_track; - for (plane_track = plane_tracks_base->first; plane_track; plane_track = plane_track->next) { - plane_track->flag &= ~SELECT; - } + for (plane_track = plane_tracks_base->first; plane_track; plane_track = plane_track->next) { + plane_track->flag &= ~SELECT; + } } 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; + 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; + int i, track_index; + MovieTrackingTrack **new_point_tracks; - if (plane_track->point_tracksnr <= 4) { - return false; - } + 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"); + 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]; - } - } + 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--; + MEM_freeN(plane_track->point_tracks); + plane_track->point_tracks = new_point_tracks; + plane_track->point_tracksnr--; - return true; + 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); - } - } - } + 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); + } + } + } } void BKE_tracking_plane_track_replace_point_track(MovieTrackingPlaneTrack *plane_track, MovieTrackingTrack *old_track, MovieTrackingTrack *new_track) { - 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; - break; - } - } + 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; + break; + } + } } void BKE_tracking_plane_tracks_replace_point_track(MovieTracking *tracking, MovieTrackingTrack *old_track, MovieTrackingTrack *new_track) { - MovieTrackingPlaneTrack *plane_track; - ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); - for (plane_track = plane_tracks_base->first; - plane_track; - plane_track = plane_track->next) - { - if (BKE_tracking_plane_track_has_point_track(plane_track, old_track)) { - BKE_tracking_plane_track_replace_point_track(plane_track, - old_track, - new_track); - } - } + MovieTrackingPlaneTrack *plane_track; + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + for (plane_track = plane_tracks_base->first; plane_track; plane_track = plane_track->next) { + if (BKE_tracking_plane_track_has_point_track(plane_track, old_track)) { + BKE_tracking_plane_track_replace_point_track(plane_track, old_track, new_track); + } + } } /*********************** Plane Marker *************************/ @@ -1584,68 +1631,70 @@ void BKE_tracking_plane_tracks_replace_point_track(MovieTracking *tracking, MovieTrackingPlaneMarker *BKE_tracking_plane_marker_insert(MovieTrackingPlaneTrack *plane_track, MovieTrackingPlaneMarker *plane_marker) { - MovieTrackingPlaneMarker *old_plane_marker = NULL; + MovieTrackingPlaneMarker *old_plane_marker = NULL; - if (plane_track->markersnr) - old_plane_marker = BKE_tracking_plane_marker_get_exact(plane_track, plane_marker->framenr); + if (plane_track->markersnr) + old_plane_marker = BKE_tracking_plane_marker_get_exact(plane_track, plane_marker->framenr); - if (old_plane_marker) { - /* Simply replace settings in existing marker. */ - *old_plane_marker = *plane_marker; + if (old_plane_marker) { + /* Simply replace settings in existing marker. */ + *old_plane_marker = *plane_marker; - return old_plane_marker; - } - else { - int a = plane_track->markersnr; + return old_plane_marker; + } + else { + int a = plane_track->markersnr; - /* Find position in array where to add new marker. */ - /* TODO(sergey): we could use bisect to speed things up. */ - while (a--) { - if (plane_track->markers[a].framenr < plane_marker->framenr) { - break; - } - } + /* Find position in array where to add new marker. */ + /* TODO(sergey): we could use bisect to speed things up. */ + while (a--) { + if (plane_track->markers[a].framenr < plane_marker->framenr) { + break; + } + } - plane_track->markersnr++; - plane_track->markers = MEM_reallocN(plane_track->markers, - sizeof(MovieTrackingPlaneMarker) * plane_track->markersnr); + plane_track->markersnr++; + plane_track->markers = MEM_reallocN(plane_track->markers, + sizeof(MovieTrackingPlaneMarker) * plane_track->markersnr); - /* Shift array to "free" space for new marker. */ - memmove(plane_track->markers + a + 2, plane_track->markers + a + 1, - (plane_track->markersnr - a - 2) * sizeof(MovieTrackingPlaneMarker)); + /* Shift array to "free" space for new marker. */ + memmove(plane_track->markers + a + 2, + plane_track->markers + a + 1, + (plane_track->markersnr - a - 2) * sizeof(MovieTrackingPlaneMarker)); - /* Put new marker to an array. */ - plane_track->markers[a + 1] = *plane_marker; - plane_track->last_marker = a + 1; + /* Put new marker to an array. */ + plane_track->markers[a + 1] = *plane_marker; + plane_track->last_marker = a + 1; - return &plane_track->markers[a + 1]; - } + return &plane_track->markers[a + 1]; + } } void BKE_tracking_plane_marker_delete(MovieTrackingPlaneTrack *plane_track, int framenr) { - int a = 0; + int a = 0; - while (a < plane_track->markersnr) { - if (plane_track->markers[a].framenr == framenr) { - if (plane_track->markersnr > 1) { - memmove(plane_track->markers + a, plane_track->markers + a + 1, - (plane_track->markersnr - a - 1) * sizeof(MovieTrackingPlaneMarker)); - plane_track->markersnr--; - plane_track->markers = MEM_reallocN(plane_track->markers, - sizeof(MovieTrackingMarker) * plane_track->markersnr); - } - else { - MEM_freeN(plane_track->markers); - plane_track->markers = NULL; - plane_track->markersnr = 0; - } + while (a < plane_track->markersnr) { + if (plane_track->markers[a].framenr == framenr) { + if (plane_track->markersnr > 1) { + memmove(plane_track->markers + a, + plane_track->markers + a + 1, + (plane_track->markersnr - a - 1) * sizeof(MovieTrackingPlaneMarker)); + plane_track->markersnr--; + plane_track->markers = MEM_reallocN(plane_track->markers, + sizeof(MovieTrackingMarker) * plane_track->markersnr); + } + else { + MEM_freeN(plane_track->markers); + plane_track->markers = NULL; + plane_track->markersnr = 0; + } - break; - } + break; + } - a++; - } + a++; + } } /* TODO(sergey): The next couple of functions are really quite the same as point marker version, @@ -1655,892 +1704,946 @@ void BKE_tracking_plane_marker_delete(MovieTrackingPlaneTrack *plane_track, int /* Get a plane marker at given frame, * If there's no such marker, closest one from the left side will be returned. */ -MovieTrackingPlaneMarker *BKE_tracking_plane_marker_get(MovieTrackingPlaneTrack *plane_track, int framenr) +MovieTrackingPlaneMarker *BKE_tracking_plane_marker_get(MovieTrackingPlaneTrack *plane_track, + int framenr) { - int a = plane_track->markersnr - 1; + int a = plane_track->markersnr - 1; - if (!plane_track->markersnr) - return NULL; + if (!plane_track->markersnr) + return NULL; - /* Approximate pre-first framenr marker with first marker. */ - if (framenr < plane_track->markers[0].framenr) { - return &plane_track->markers[0]; - } + /* Approximate pre-first framenr marker with first marker. */ + if (framenr < plane_track->markers[0].framenr) { + return &plane_track->markers[0]; + } - if (plane_track->last_marker < plane_track->markersnr) { - a = plane_track->last_marker; - } + if (plane_track->last_marker < plane_track->markersnr) { + a = plane_track->last_marker; + } - if (plane_track->markers[a].framenr <= framenr) { - while (a < plane_track->markersnr && plane_track->markers[a].framenr <= framenr) { - if (plane_track->markers[a].framenr == framenr) { - plane_track->last_marker = a; + if (plane_track->markers[a].framenr <= framenr) { + while (a < plane_track->markersnr && plane_track->markers[a].framenr <= framenr) { + if (plane_track->markers[a].framenr == framenr) { + plane_track->last_marker = a; - return &plane_track->markers[a]; - } - a++; - } + return &plane_track->markers[a]; + } + a++; + } - /* If there's no marker for exact position, use nearest marker from left side. */ - return &plane_track->markers[a - 1]; - } - else { - while (a >= 0 && plane_track->markers[a].framenr >= framenr) { - if (plane_track->markers[a].framenr == framenr) { - plane_track->last_marker = a; + /* If there's no marker for exact position, use nearest marker from left side. */ + return &plane_track->markers[a - 1]; + } + else { + while (a >= 0 && plane_track->markers[a].framenr >= framenr) { + if (plane_track->markers[a].framenr == framenr) { + plane_track->last_marker = a; - return &plane_track->markers[a]; - } + return &plane_track->markers[a]; + } - a--; - } + a--; + } - /* If there's no marker for exact position, use nearest marker from left side. */ - return &plane_track->markers[a]; - } + /* If there's no marker for exact position, use nearest marker from left side. */ + return &plane_track->markers[a]; + } - return NULL; + return NULL; } /* Get a plane marker at exact given frame, if there's no marker at the frame, * NULL will be returned. */ -MovieTrackingPlaneMarker *BKE_tracking_plane_marker_get_exact(MovieTrackingPlaneTrack *plane_track, int framenr) +MovieTrackingPlaneMarker *BKE_tracking_plane_marker_get_exact(MovieTrackingPlaneTrack *plane_track, + int framenr) { - MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, framenr); + MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, framenr); - if (plane_marker->framenr != framenr) { - return NULL; - } + if (plane_marker->framenr != framenr) { + return NULL; + } - return plane_marker; + return plane_marker; } /* Ensure there's a marker for the given frame. */ -MovieTrackingPlaneMarker *BKE_tracking_plane_marker_ensure(MovieTrackingPlaneTrack *plane_track, int framenr) +MovieTrackingPlaneMarker *BKE_tracking_plane_marker_ensure(MovieTrackingPlaneTrack *plane_track, + int framenr) { - MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, framenr); + MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, framenr); - if (plane_marker->framenr != framenr) { - MovieTrackingPlaneMarker plane_marker_new; + if (plane_marker->framenr != framenr) { + MovieTrackingPlaneMarker plane_marker_new; - plane_marker_new = *plane_marker; - plane_marker_new.framenr = framenr; + plane_marker_new = *plane_marker; + plane_marker_new.framenr = framenr; - plane_marker = BKE_tracking_plane_marker_insert(plane_track, &plane_marker_new); - } + plane_marker = BKE_tracking_plane_marker_insert(plane_track, &plane_marker_new); + } - return plane_marker; + return plane_marker; } void BKE_tracking_plane_marker_get_subframe_corners(MovieTrackingPlaneTrack *plane_track, float framenr, float corners[4][2]) { - MovieTrackingPlaneMarker *marker = BKE_tracking_plane_marker_get(plane_track, (int)framenr); - MovieTrackingPlaneMarker *marker_last = plane_track->markers + (plane_track->markersnr - 1); - int i; - if (marker != marker_last) { - MovieTrackingPlaneMarker *marker_next = marker + 1; - if (marker_next->framenr == marker->framenr + 1) { - float fac = (framenr - (int) framenr) / (marker_next->framenr - marker->framenr); - for (i = 0; i < 4; ++i) { - interp_v2_v2v2(corners[i], marker->corners[i], - marker_next->corners[i], fac); - } - } - else { - for (i = 0; i < 4; ++i) { - copy_v2_v2(corners[i], marker->corners[i]); - } - } - } - else { - for (i = 0; i < 4; ++i) { - copy_v2_v2(corners[i], marker->corners[i]); - } - } + MovieTrackingPlaneMarker *marker = BKE_tracking_plane_marker_get(plane_track, (int)framenr); + MovieTrackingPlaneMarker *marker_last = plane_track->markers + (plane_track->markersnr - 1); + int i; + if (marker != marker_last) { + MovieTrackingPlaneMarker *marker_next = marker + 1; + if (marker_next->framenr == marker->framenr + 1) { + float fac = (framenr - (int)framenr) / (marker_next->framenr - marker->framenr); + for (i = 0; i < 4; ++i) { + interp_v2_v2v2(corners[i], marker->corners[i], marker_next->corners[i], fac); + } + } + else { + for (i = 0; i < 4; ++i) { + copy_v2_v2(corners[i], marker->corners[i]); + } + } + } + else { + for (i = 0; i < 4; ++i) { + copy_v2_v2(corners[i], marker->corners[i]); + } + } } /*********************** Object *************************/ MovieTrackingObject *BKE_tracking_object_add(MovieTracking *tracking, const char *name) { - MovieTrackingObject *object = MEM_callocN(sizeof(MovieTrackingObject), "tracking object"); + MovieTrackingObject *object = MEM_callocN(sizeof(MovieTrackingObject), "tracking object"); - if (tracking->tot_object == 0) { - /* first object is always camera */ - BLI_strncpy(object->name, "Camera", sizeof(object->name)); + if (tracking->tot_object == 0) { + /* first object is always camera */ + BLI_strncpy(object->name, "Camera", sizeof(object->name)); - object->flag |= TRACKING_OBJECT_CAMERA; - } - else { - BLI_strncpy(object->name, name, sizeof(object->name)); - } + object->flag |= TRACKING_OBJECT_CAMERA; + } + else { + BLI_strncpy(object->name, name, sizeof(object->name)); + } - BLI_addtail(&tracking->objects, object); + BLI_addtail(&tracking->objects, object); - tracking->tot_object++; - tracking->objectnr = BLI_listbase_count(&tracking->objects) - 1; + tracking->tot_object++; + tracking->objectnr = BLI_listbase_count(&tracking->objects) - 1; - object->scale = 1.0f; - object->keyframe1 = 1; - object->keyframe2 = 30; + object->scale = 1.0f; + object->keyframe1 = 1; + object->keyframe2 = 30; - BKE_tracking_object_unique_name(tracking, object); - BKE_tracking_dopesheet_tag_update(tracking); + BKE_tracking_object_unique_name(tracking, object); + BKE_tracking_dopesheet_tag_update(tracking); - return object; + return object; } bool BKE_tracking_object_delete(MovieTracking *tracking, MovieTrackingObject *object) { - MovieTrackingTrack *track; - int index = BLI_findindex(&tracking->objects, object); + MovieTrackingTrack *track; + int index = BLI_findindex(&tracking->objects, object); - if (index == -1) - return false; + if (index == -1) + return false; - if (object->flag & TRACKING_OBJECT_CAMERA) { - /* object used for camera solving can't be deleted */ - return false; - } + if (object->flag & TRACKING_OBJECT_CAMERA) { + /* object used for camera solving can't be deleted */ + return false; + } - track = object->tracks.first; - while (track) { - if (track == tracking->act_track) - tracking->act_track = NULL; + track = object->tracks.first; + while (track) { + if (track == tracking->act_track) + tracking->act_track = NULL; - track = track->next; - } + track = track->next; + } - tracking_object_free(object); - BLI_freelinkN(&tracking->objects, object); + tracking_object_free(object); + BLI_freelinkN(&tracking->objects, object); - tracking->tot_object--; + tracking->tot_object--; - if (index != 0) - tracking->objectnr = index - 1; - else - tracking->objectnr = 0; + if (index != 0) + tracking->objectnr = index - 1; + else + tracking->objectnr = 0; - BKE_tracking_dopesheet_tag_update(tracking); + BKE_tracking_dopesheet_tag_update(tracking); - return true; + return true; } void BKE_tracking_object_unique_name(MovieTracking *tracking, MovieTrackingObject *object) { - BLI_uniquename(&tracking->objects, object, DATA_("Object"), '.', - offsetof(MovieTrackingObject, name), sizeof(object->name)); + BLI_uniquename(&tracking->objects, + object, + DATA_("Object"), + '.', + offsetof(MovieTrackingObject, name), + sizeof(object->name)); } MovieTrackingObject *BKE_tracking_object_get_named(MovieTracking *tracking, const char *name) { - MovieTrackingObject *object = tracking->objects.first; + MovieTrackingObject *object = tracking->objects.first; - while (object) { - if (STREQ(object->name, name)) - return object; + while (object) { + if (STREQ(object->name, name)) + return object; - object = object->next; - } + object = object->next; + } - return NULL; + return NULL; } MovieTrackingObject *BKE_tracking_object_get_active(MovieTracking *tracking) { - return BLI_findlink(&tracking->objects, tracking->objectnr); + return BLI_findlink(&tracking->objects, tracking->objectnr); } MovieTrackingObject *BKE_tracking_object_get_camera(MovieTracking *tracking) { - MovieTrackingObject *object = tracking->objects.first; + MovieTrackingObject *object = tracking->objects.first; - while (object) { - if (object->flag & TRACKING_OBJECT_CAMERA) - return object; + while (object) { + if (object->flag & TRACKING_OBJECT_CAMERA) + return object; - object = object->next; - } + object = object->next; + } - return NULL; + return NULL; } ListBase *BKE_tracking_object_get_tracks(MovieTracking *tracking, MovieTrackingObject *object) { - if (object->flag & TRACKING_OBJECT_CAMERA) { - return &tracking->tracks; - } + if (object->flag & TRACKING_OBJECT_CAMERA) { + return &tracking->tracks; + } - return &object->tracks; + return &object->tracks; } -ListBase *BKE_tracking_object_get_plane_tracks(MovieTracking *tracking, MovieTrackingObject *object) +ListBase *BKE_tracking_object_get_plane_tracks(MovieTracking *tracking, + MovieTrackingObject *object) { - if (object->flag & TRACKING_OBJECT_CAMERA) { - return &tracking->plane_tracks; - } + if (object->flag & TRACKING_OBJECT_CAMERA) { + return &tracking->plane_tracks; + } - return &object->plane_tracks; + return &object->plane_tracks; } MovieTrackingReconstruction *BKE_tracking_object_get_reconstruction(MovieTracking *tracking, MovieTrackingObject *object) { - if (object->flag & TRACKING_OBJECT_CAMERA) { - return &tracking->reconstruction; - } + if (object->flag & TRACKING_OBJECT_CAMERA) { + return &tracking->reconstruction; + } - return &object->reconstruction; + return &object->reconstruction; } /*********************** Camera *************************/ -static int reconstructed_camera_index_get(MovieTrackingReconstruction *reconstruction, int framenr, bool nearest) +static int reconstructed_camera_index_get(MovieTrackingReconstruction *reconstruction, + int framenr, + bool nearest) { - MovieReconstructedCamera *cameras = reconstruction->cameras; - int a = 0, d = 1; + MovieReconstructedCamera *cameras = reconstruction->cameras; + int a = 0, d = 1; - if (!reconstruction->camnr) - return -1; + if (!reconstruction->camnr) + return -1; - if (framenr < cameras[0].framenr) { - if (nearest) - return 0; - else - return -1; - } + if (framenr < cameras[0].framenr) { + if (nearest) + return 0; + else + return -1; + } - if (framenr > cameras[reconstruction->camnr - 1].framenr) { - if (nearest) - return reconstruction->camnr - 1; - else - return -1; - } + if (framenr > cameras[reconstruction->camnr - 1].framenr) { + if (nearest) + return reconstruction->camnr - 1; + else + return -1; + } - if (reconstruction->last_camera < reconstruction->camnr) - a = reconstruction->last_camera; + if (reconstruction->last_camera < reconstruction->camnr) + a = reconstruction->last_camera; - if (cameras[a].framenr >= framenr) - d = -1; + if (cameras[a].framenr >= framenr) + d = -1; - while (a >= 0 && a < reconstruction->camnr) { - int cfra = cameras[a].framenr; + while (a >= 0 && a < reconstruction->camnr) { + int cfra = cameras[a].framenr; - /* check if needed framenr was "skipped" -- no data for requested frame */ + /* check if needed framenr was "skipped" -- no data for requested frame */ - if (d > 0 && cfra > framenr) { - /* interpolate with previous position */ - if (nearest) - return a - 1; - else - break; - } + if (d > 0 && cfra > framenr) { + /* interpolate with previous position */ + if (nearest) + return a - 1; + else + break; + } - if (d < 0 && cfra < framenr) { - /* interpolate with next position */ - if (nearest) - return a; - else - break; - } + if (d < 0 && cfra < framenr) { + /* interpolate with next position */ + if (nearest) + return a; + else + break; + } - if (cfra == framenr) { - reconstruction->last_camera = a; + if (cfra == framenr) { + reconstruction->last_camera = a; - return a; - } + return a; + } - a += d; - } + a += d; + } - return -1; + return -1; } static void reconstructed_camera_scale_set(MovieTrackingObject *object, float mat[4][4]) { - if ((object->flag & TRACKING_OBJECT_CAMERA) == 0) { - float smat[4][4]; + if ((object->flag & TRACKING_OBJECT_CAMERA) == 0) { + float smat[4][4]; - scale_m4_fl(smat, 1.0f / object->scale); - mul_m4_m4m4(mat, mat, smat); - } + scale_m4_fl(smat, 1.0f / object->scale); + mul_m4_m4m4(mat, mat, smat); + } } /* converts principal offset from center to offset of blender's camera */ -void BKE_tracking_camera_shift_get(MovieTracking *tracking, int winx, int winy, float *shiftx, float *shifty) +void BKE_tracking_camera_shift_get( + MovieTracking *tracking, int winx, int winy, float *shiftx, float *shifty) { - /* indeed in both of cases it should be winx -- it's just how camera shift works for blender's camera */ - *shiftx = (0.5f * winx - tracking->camera.principal[0]) / winx; - *shifty = (0.5f * winy - tracking->camera.principal[1]) / winx; + /* indeed in both of cases it should be winx -- it's just how camera shift works for blender's camera */ + *shiftx = (0.5f * winx - tracking->camera.principal[0]) / winx; + *shifty = (0.5f * winy - tracking->camera.principal[1]) / winx; } -void BKE_tracking_camera_to_blender(MovieTracking *tracking, Scene *scene, Camera *camera, int width, int height) +void BKE_tracking_camera_to_blender( + MovieTracking *tracking, Scene *scene, Camera *camera, int width, int height) { - float focal = tracking->camera.focal; + float focal = tracking->camera.focal; - camera->sensor_x = tracking->camera.sensor_width; - camera->sensor_fit = CAMERA_SENSOR_FIT_AUTO; - camera->lens = focal * camera->sensor_x / width; + camera->sensor_x = tracking->camera.sensor_width; + camera->sensor_fit = CAMERA_SENSOR_FIT_AUTO; + camera->lens = focal * camera->sensor_x / width; - scene->r.xsch = width; - scene->r.ysch = height; + scene->r.xsch = width; + scene->r.ysch = height; - scene->r.xasp = tracking->camera.pixel_aspect; - scene->r.yasp = 1.0f; + scene->r.xasp = tracking->camera.pixel_aspect; + scene->r.yasp = 1.0f; - BKE_tracking_camera_shift_get(tracking, width, height, &camera->shiftx, &camera->shifty); + BKE_tracking_camera_shift_get(tracking, width, height, &camera->shiftx, &camera->shifty); } MovieReconstructedCamera *BKE_tracking_camera_get_reconstructed(MovieTracking *tracking, - MovieTrackingObject *object, int framenr) + MovieTrackingObject *object, + int framenr) { - MovieTrackingReconstruction *reconstruction; - int a; + MovieTrackingReconstruction *reconstruction; + int a; - reconstruction = BKE_tracking_object_get_reconstruction(tracking, object); - a = reconstructed_camera_index_get(reconstruction, framenr, false); + reconstruction = BKE_tracking_object_get_reconstruction(tracking, object); + a = reconstructed_camera_index_get(reconstruction, framenr, false); - if (a == -1) - return NULL; + if (a == -1) + return NULL; - return &reconstruction->cameras[a]; + return &reconstruction->cameras[a]; } -void BKE_tracking_camera_get_reconstructed_interpolate(MovieTracking *tracking, MovieTrackingObject *object, - float framenr, float mat[4][4]) +void BKE_tracking_camera_get_reconstructed_interpolate(MovieTracking *tracking, + MovieTrackingObject *object, + float framenr, + float mat[4][4]) { - MovieTrackingReconstruction *reconstruction; - MovieReconstructedCamera *cameras; - int a; + MovieTrackingReconstruction *reconstruction; + MovieReconstructedCamera *cameras; + int a; - reconstruction = BKE_tracking_object_get_reconstruction(tracking, object); - cameras = reconstruction->cameras; - a = reconstructed_camera_index_get(reconstruction, (int)framenr, true); + reconstruction = BKE_tracking_object_get_reconstruction(tracking, object); + cameras = reconstruction->cameras; + a = reconstructed_camera_index_get(reconstruction, (int)framenr, true); - if (a == -1) { - unit_m4(mat); - return; - } + if (a == -1) { + unit_m4(mat); + return; + } - if (cameras[a].framenr != framenr && a < reconstruction->camnr - 1) { - float t = ((float)framenr - cameras[a].framenr) / (cameras[a + 1].framenr - cameras[a].framenr); - blend_m4_m4m4(mat, cameras[a].mat, cameras[a + 1].mat, t); - } - else { - copy_m4_m4(mat, cameras[a].mat); - } + if (cameras[a].framenr != framenr && a < reconstruction->camnr - 1) { + float t = ((float)framenr - cameras[a].framenr) / + (cameras[a + 1].framenr - cameras[a].framenr); + blend_m4_m4m4(mat, cameras[a].mat, cameras[a + 1].mat, t); + } + else { + copy_m4_m4(mat, cameras[a].mat); + } - reconstructed_camera_scale_set(object, mat); + reconstructed_camera_scale_set(object, mat); } /*********************** Distortion/Undistortion *************************/ MovieDistortion *BKE_tracking_distortion_new(MovieTracking *tracking, - int calibration_width, int calibration_height) + int calibration_width, + int calibration_height) { - MovieDistortion *distortion; - libmv_CameraIntrinsicsOptions camera_intrinsics_options; + MovieDistortion *distortion; + libmv_CameraIntrinsicsOptions camera_intrinsics_options; - tracking_cameraIntrinscisOptionsFromTracking(tracking, - calibration_width, - calibration_height, - &camera_intrinsics_options); + tracking_cameraIntrinscisOptionsFromTracking( + tracking, calibration_width, calibration_height, &camera_intrinsics_options); - distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create"); - distortion->intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); + distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create"); + distortion->intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); - const MovieTrackingCamera *camera = &tracking->camera; - copy_v2_v2(distortion->principal, camera->principal); - distortion->pixel_aspect = camera->pixel_aspect; - distortion->focal = camera->focal; + const MovieTrackingCamera *camera = &tracking->camera; + copy_v2_v2(distortion->principal, camera->principal); + distortion->pixel_aspect = camera->pixel_aspect; + distortion->focal = camera->focal; - return distortion; + return distortion; } -void BKE_tracking_distortion_update(MovieDistortion *distortion, MovieTracking *tracking, - int calibration_width, int calibration_height) +void BKE_tracking_distortion_update(MovieDistortion *distortion, + MovieTracking *tracking, + int calibration_width, + int calibration_height) { - libmv_CameraIntrinsicsOptions camera_intrinsics_options; + libmv_CameraIntrinsicsOptions camera_intrinsics_options; - tracking_cameraIntrinscisOptionsFromTracking(tracking, - calibration_width, - calibration_height, - &camera_intrinsics_options); + tracking_cameraIntrinscisOptionsFromTracking( + tracking, calibration_width, calibration_height, &camera_intrinsics_options); - const MovieTrackingCamera *camera = &tracking->camera; - copy_v2_v2(distortion->principal, camera->principal); - distortion->pixel_aspect = camera->pixel_aspect; - distortion->focal = camera->focal; + const MovieTrackingCamera *camera = &tracking->camera; + copy_v2_v2(distortion->principal, camera->principal); + distortion->pixel_aspect = camera->pixel_aspect; + distortion->focal = camera->focal; - libmv_cameraIntrinsicsUpdate(&camera_intrinsics_options, distortion->intrinsics); + libmv_cameraIntrinsicsUpdate(&camera_intrinsics_options, distortion->intrinsics); } void BKE_tracking_distortion_set_threads(MovieDistortion *distortion, int threads) { - libmv_cameraIntrinsicsSetThreads(distortion->intrinsics, threads); + libmv_cameraIntrinsicsSetThreads(distortion->intrinsics, threads); } MovieDistortion *BKE_tracking_distortion_copy(MovieDistortion *distortion) { - MovieDistortion *new_distortion; - - new_distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create"); - *new_distortion = *distortion; - new_distortion->intrinsics = libmv_cameraIntrinsicsCopy(distortion->intrinsics); - - return new_distortion; -} - -ImBuf *BKE_tracking_distortion_exec(MovieDistortion *distortion, MovieTracking *tracking, ImBuf *ibuf, - int calibration_width, int calibration_height, float overscan, bool undistort) -{ - ImBuf *resibuf; - - BKE_tracking_distortion_update(distortion, tracking, calibration_width, calibration_height); - - resibuf = IMB_dupImBuf(ibuf); - - if (ibuf->rect_float) { - if (undistort) { - libmv_cameraIntrinsicsUndistortFloat(distortion->intrinsics, - ibuf->rect_float, - ibuf->x, ibuf->y, - overscan, - ibuf->channels, - resibuf->rect_float); - } - else { - libmv_cameraIntrinsicsDistortFloat(distortion->intrinsics, - ibuf->rect_float, - ibuf->x, ibuf->y, - overscan, - ibuf->channels, - resibuf->rect_float); - } - - if (ibuf->rect) - imb_freerectImBuf(ibuf); - } - else { - if (undistort) { - libmv_cameraIntrinsicsUndistortByte(distortion->intrinsics, - (unsigned char *)ibuf->rect, - ibuf->x, ibuf->y, - overscan, - ibuf->channels, - (unsigned char *)resibuf->rect); - } - else { - libmv_cameraIntrinsicsDistortByte(distortion->intrinsics, - (unsigned char *)ibuf->rect, - ibuf->x, ibuf->y, - overscan, - ibuf->channels, - (unsigned char *)resibuf->rect); - } - } - - return resibuf; + MovieDistortion *new_distortion; + + new_distortion = MEM_callocN(sizeof(MovieDistortion), "BKE_tracking_distortion_create"); + *new_distortion = *distortion; + new_distortion->intrinsics = libmv_cameraIntrinsicsCopy(distortion->intrinsics); + + return new_distortion; +} + +ImBuf *BKE_tracking_distortion_exec(MovieDistortion *distortion, + MovieTracking *tracking, + ImBuf *ibuf, + int calibration_width, + int calibration_height, + float overscan, + bool undistort) +{ + ImBuf *resibuf; + + BKE_tracking_distortion_update(distortion, tracking, calibration_width, calibration_height); + + resibuf = IMB_dupImBuf(ibuf); + + if (ibuf->rect_float) { + if (undistort) { + libmv_cameraIntrinsicsUndistortFloat(distortion->intrinsics, + ibuf->rect_float, + ibuf->x, + ibuf->y, + overscan, + ibuf->channels, + resibuf->rect_float); + } + else { + libmv_cameraIntrinsicsDistortFloat(distortion->intrinsics, + ibuf->rect_float, + ibuf->x, + ibuf->y, + overscan, + ibuf->channels, + resibuf->rect_float); + } + + if (ibuf->rect) + imb_freerectImBuf(ibuf); + } + else { + if (undistort) { + libmv_cameraIntrinsicsUndistortByte(distortion->intrinsics, + (unsigned char *)ibuf->rect, + ibuf->x, + ibuf->y, + overscan, + ibuf->channels, + (unsigned char *)resibuf->rect); + } + else { + libmv_cameraIntrinsicsDistortByte(distortion->intrinsics, + (unsigned char *)ibuf->rect, + ibuf->x, + ibuf->y, + overscan, + ibuf->channels, + (unsigned char *)resibuf->rect); + } + } + + return resibuf; } void BKE_tracking_distortion_distort_v2(MovieDistortion *distortion, const float co[2], float r_co[2]) { - const float aspy = 1.0f / distortion->pixel_aspect; + const float aspy = 1.0f / distortion->pixel_aspect; - /* Normalize coords. */ - float inv_focal = 1.0f / distortion->focal; - double x = (co[0] - distortion->principal[0]) * inv_focal, - y = (co[1] - distortion->principal[1] * aspy) * inv_focal; + /* Normalize coords. */ + float inv_focal = 1.0f / distortion->focal; + double x = (co[0] - distortion->principal[0]) * inv_focal, + y = (co[1] - distortion->principal[1] * aspy) * inv_focal; - libmv_cameraIntrinsicsApply(distortion->intrinsics, x, y, &x, &y); + libmv_cameraIntrinsicsApply(distortion->intrinsics, x, y, &x, &y); - /* Result is in image coords already. */ - r_co[0] = x; - r_co[1] = y; + /* Result is in image coords already. */ + r_co[0] = x; + r_co[1] = y; } void BKE_tracking_distortion_undistort_v2(MovieDistortion *distortion, const float co[2], float r_co[2]) { - double x = co[0], y = co[1]; - libmv_cameraIntrinsicsInvert(distortion->intrinsics, x, y, &x, &y); + double x = co[0], y = co[1]; + libmv_cameraIntrinsicsInvert(distortion->intrinsics, x, y, &x, &y); - const float aspy = 1.0f / distortion->pixel_aspect; - r_co[0] = (float)x * distortion->focal + distortion->principal[0]; - r_co[1] = (float)y * distortion->focal + distortion->principal[1] * aspy; + const float aspy = 1.0f / distortion->pixel_aspect; + r_co[0] = (float)x * distortion->focal + distortion->principal[0]; + r_co[1] = (float)y * distortion->focal + distortion->principal[1] * aspy; } void BKE_tracking_distortion_free(MovieDistortion *distortion) { - libmv_cameraIntrinsicsDestroy(distortion->intrinsics); + libmv_cameraIntrinsicsDestroy(distortion->intrinsics); - MEM_freeN(distortion); + MEM_freeN(distortion); } void BKE_tracking_distort_v2(MovieTracking *tracking, const float co[2], float r_co[2]) { - const MovieTrackingCamera *camera = &tracking->camera; - const float aspy = 1.0f / tracking->camera.pixel_aspect; + const MovieTrackingCamera *camera = &tracking->camera; + const float aspy = 1.0f / tracking->camera.pixel_aspect; - libmv_CameraIntrinsicsOptions camera_intrinsics_options; - tracking_cameraIntrinscisOptionsFromTracking(tracking, - 0, 0, - &camera_intrinsics_options); - libmv_CameraIntrinsics *intrinsics = - libmv_cameraIntrinsicsNew(&camera_intrinsics_options); + libmv_CameraIntrinsicsOptions camera_intrinsics_options; + tracking_cameraIntrinscisOptionsFromTracking(tracking, 0, 0, &camera_intrinsics_options); + libmv_CameraIntrinsics *intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); - /* Normalize coordinates. */ - double x = (co[0] - camera->principal[0]) / camera->focal, - y = (co[1] - camera->principal[1] * aspy) / camera->focal; + /* Normalize coordinates. */ + double x = (co[0] - camera->principal[0]) / camera->focal, + y = (co[1] - camera->principal[1] * aspy) / camera->focal; - libmv_cameraIntrinsicsApply(intrinsics, x, y, &x, &y); - libmv_cameraIntrinsicsDestroy(intrinsics); + libmv_cameraIntrinsicsApply(intrinsics, x, y, &x, &y); + libmv_cameraIntrinsicsDestroy(intrinsics); - /* Result is in image coords already. */ - r_co[0] = x; - r_co[1] = y; + /* Result is in image coords already. */ + r_co[0] = x; + r_co[1] = y; } void BKE_tracking_undistort_v2(MovieTracking *tracking, const float co[2], float r_co[2]) { - const MovieTrackingCamera *camera = &tracking->camera; - const float aspy = 1.0f / tracking->camera.pixel_aspect; + const MovieTrackingCamera *camera = &tracking->camera; + const float aspy = 1.0f / tracking->camera.pixel_aspect; - libmv_CameraIntrinsicsOptions camera_intrinsics_options; - tracking_cameraIntrinscisOptionsFromTracking(tracking, - 0, 0, - &camera_intrinsics_options); - libmv_CameraIntrinsics *intrinsics = - libmv_cameraIntrinsicsNew(&camera_intrinsics_options); + libmv_CameraIntrinsicsOptions camera_intrinsics_options; + tracking_cameraIntrinscisOptionsFromTracking(tracking, 0, 0, &camera_intrinsics_options); + libmv_CameraIntrinsics *intrinsics = libmv_cameraIntrinsicsNew(&camera_intrinsics_options); - double x = co[0], y = co[1]; - libmv_cameraIntrinsicsInvert(intrinsics, x, y, &x, &y); - libmv_cameraIntrinsicsDestroy(intrinsics); + double x = co[0], y = co[1]; + libmv_cameraIntrinsicsInvert(intrinsics, x, y, &x, &y); + libmv_cameraIntrinsicsDestroy(intrinsics); - r_co[0] = (float)x * camera->focal + camera->principal[0]; - r_co[1] = (float)y * camera->focal + camera->principal[1] * aspy; + r_co[0] = (float)x * camera->focal + camera->principal[0]; + r_co[1] = (float)y * camera->focal + camera->principal[1] * aspy; } -ImBuf *BKE_tracking_undistort_frame(MovieTracking *tracking, ImBuf *ibuf, int calibration_width, - int calibration_height, float overscan) +ImBuf *BKE_tracking_undistort_frame(MovieTracking *tracking, + ImBuf *ibuf, + int calibration_width, + int calibration_height, + float overscan) { - MovieTrackingCamera *camera = &tracking->camera; + MovieTrackingCamera *camera = &tracking->camera; - if (camera->intrinsics == NULL) { - camera->intrinsics = BKE_tracking_distortion_new(tracking, calibration_width, calibration_height); - } + if (camera->intrinsics == NULL) { + camera->intrinsics = BKE_tracking_distortion_new( + tracking, calibration_width, calibration_height); + } - return BKE_tracking_distortion_exec(camera->intrinsics, tracking, ibuf, calibration_width, - calibration_height, overscan, true); + return BKE_tracking_distortion_exec( + camera->intrinsics, tracking, ibuf, calibration_width, calibration_height, overscan, true); } -ImBuf *BKE_tracking_distort_frame(MovieTracking *tracking, ImBuf *ibuf, int calibration_width, - int calibration_height, float overscan) +ImBuf *BKE_tracking_distort_frame(MovieTracking *tracking, + ImBuf *ibuf, + int calibration_width, + int calibration_height, + float overscan) { - MovieTrackingCamera *camera = &tracking->camera; + MovieTrackingCamera *camera = &tracking->camera; - if (camera->intrinsics == NULL) { - camera->intrinsics = BKE_tracking_distortion_new(tracking, calibration_width, calibration_height); - } + if (camera->intrinsics == NULL) { + camera->intrinsics = BKE_tracking_distortion_new( + tracking, calibration_width, calibration_height); + } - return BKE_tracking_distortion_exec(camera->intrinsics, tracking, ibuf, calibration_width, - calibration_height, overscan, false); + return BKE_tracking_distortion_exec( + camera->intrinsics, tracking, ibuf, calibration_width, calibration_height, overscan, false); } -void BKE_tracking_max_distortion_delta_across_bound(MovieTracking *tracking, rcti *rect, - bool undistort, float delta[2]) +void BKE_tracking_max_distortion_delta_across_bound(MovieTracking *tracking, + rcti *rect, + bool undistort, + float delta[2]) { - int a; - float pos[2], warped_pos[2]; - const int coord_delta = 5; - void (*apply_distortion) (MovieTracking *tracking, - const float pos[2], float out[2]); + int a; + float pos[2], warped_pos[2]; + const int coord_delta = 5; + void (*apply_distortion)(MovieTracking * tracking, const float pos[2], float out[2]); - if (undistort) { - apply_distortion = BKE_tracking_undistort_v2; - } - else { - apply_distortion = BKE_tracking_distort_v2; - } + if (undistort) { + apply_distortion = BKE_tracking_undistort_v2; + } + else { + apply_distortion = BKE_tracking_distort_v2; + } - delta[0] = delta[1] = -FLT_MAX; + delta[0] = delta[1] = -FLT_MAX; - for (a = rect->xmin; a <= rect->xmax + coord_delta; a += coord_delta) { - if (a > rect->xmax) - a = rect->xmax; + for (a = rect->xmin; a <= rect->xmax + coord_delta; a += coord_delta) { + if (a > rect->xmax) + a = rect->xmax; - /* bottom edge */ - pos[0] = a; - pos[1] = rect->ymin; + /* bottom edge */ + pos[0] = a; + pos[1] = rect->ymin; - apply_distortion(tracking, pos, warped_pos); + apply_distortion(tracking, pos, warped_pos); - delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); - delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); + delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); + delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); - /* top edge */ - pos[0] = a; - pos[1] = rect->ymax; + /* top edge */ + pos[0] = a; + pos[1] = rect->ymax; - apply_distortion(tracking, pos, warped_pos); + apply_distortion(tracking, pos, warped_pos); - delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); - delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); + delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); + delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); - if (a >= rect->xmax) - break; - } + if (a >= rect->xmax) + break; + } - for (a = rect->ymin; a <= rect->ymax + coord_delta; a += coord_delta) { - if (a > rect->ymax) - a = rect->ymax; + for (a = rect->ymin; a <= rect->ymax + coord_delta; a += coord_delta) { + if (a > rect->ymax) + a = rect->ymax; - /* left edge */ - pos[0] = rect->xmin; - pos[1] = a; + /* left edge */ + pos[0] = rect->xmin; + pos[1] = a; - apply_distortion(tracking, pos, warped_pos); + apply_distortion(tracking, pos, warped_pos); - delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); - delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); + delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); + delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); - /* right edge */ - pos[0] = rect->xmax; - pos[1] = a; + /* right edge */ + pos[0] = rect->xmax; + pos[1] = a; - apply_distortion(tracking, pos, warped_pos); + apply_distortion(tracking, pos, warped_pos); - delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); - delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); + delta[0] = max_ff(delta[0], fabsf(pos[0] - warped_pos[0])); + delta[1] = max_ff(delta[1], fabsf(pos[1] - warped_pos[1])); - if (a >= rect->ymax) - break; - } + if (a >= rect->ymax) + break; + } } /*********************** Image sampling *************************/ static void disable_imbuf_channels(ImBuf *ibuf, MovieTrackingTrack *track, bool grayscale) { - BKE_tracking_disable_channels(ibuf, track->flag & TRACK_DISABLE_RED, - track->flag & TRACK_DISABLE_GREEN, - track->flag & TRACK_DISABLE_BLUE, grayscale); + BKE_tracking_disable_channels(ibuf, + track->flag & TRACK_DISABLE_RED, + track->flag & TRACK_DISABLE_GREEN, + track->flag & TRACK_DISABLE_BLUE, + grayscale); } -ImBuf *BKE_tracking_sample_pattern(int frame_width, int frame_height, ImBuf *search_ibuf, - MovieTrackingTrack *track, MovieTrackingMarker *marker, - bool from_anchor, bool use_mask, int num_samples_x, int num_samples_y, +ImBuf *BKE_tracking_sample_pattern(int frame_width, + int frame_height, + ImBuf *search_ibuf, + MovieTrackingTrack *track, + MovieTrackingMarker *marker, + bool from_anchor, + bool use_mask, + int num_samples_x, + int num_samples_y, float pos[2]) { - ImBuf *pattern_ibuf; - double src_pixel_x[5], src_pixel_y[5]; - double warped_position_x, warped_position_y; - float *mask = NULL; - - if (num_samples_x <= 0 || num_samples_y <= 0) - return NULL; - - pattern_ibuf = IMB_allocImBuf(num_samples_x, num_samples_y, - 32, - search_ibuf->rect_float ? IB_rectfloat : IB_rect); - - tracking_get_marker_coords_for_tracking(frame_width, frame_height, marker, src_pixel_x, src_pixel_y); - - /* from_anchor means search buffer was obtained for an anchored position, - * which means applying track offset rounded to pixel space (we could not - * store search buffer with sub-pixel precision) - * - * in this case we need to alter coordinates a bit, to compensate rounded - * fractional part of offset - */ - if (from_anchor) { - int a; - - for (a = 0; a < 5; a++) { - src_pixel_x[a] += (double) ((track->offset[0] * frame_width) - ((int) (track->offset[0] * frame_width))); - src_pixel_y[a] += (double) ((track->offset[1] * frame_height) - ((int) (track->offset[1] * frame_height))); - - /* when offset is negative, rounding happens in opposite direction */ - if (track->offset[0] < 0.0f) - src_pixel_x[a] += 1.0; - if (track->offset[1] < 0.0f) - src_pixel_y[a] += 1.0; - } - } - - if (use_mask) { - mask = BKE_tracking_track_get_mask(frame_width, frame_height, track, marker); - } - - if (search_ibuf->rect_float) { - libmv_samplePlanarPatchFloat(search_ibuf->rect_float, - search_ibuf->x, search_ibuf->y, 4, - src_pixel_x, src_pixel_y, - num_samples_x, num_samples_y, - mask, - pattern_ibuf->rect_float, - &warped_position_x, - &warped_position_y); - } - else { - libmv_samplePlanarPatchByte((unsigned char *) search_ibuf->rect, - search_ibuf->x, search_ibuf->y, 4, - src_pixel_x, src_pixel_y, - num_samples_x, num_samples_y, - mask, - (unsigned char *) pattern_ibuf->rect, - &warped_position_x, - &warped_position_y); - } - - if (pos) { - pos[0] = warped_position_x; - pos[1] = warped_position_y; - } - - if (mask) { - MEM_freeN(mask); - } - - return pattern_ibuf; -} - -ImBuf *BKE_tracking_get_pattern_imbuf(ImBuf *ibuf, MovieTrackingTrack *track, MovieTrackingMarker *marker, - bool anchored, bool disable_channels) -{ - ImBuf *pattern_ibuf, *search_ibuf; - float pat_min[2], pat_max[2]; - int num_samples_x, num_samples_y; - - BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); - - num_samples_x = (pat_max[0] - pat_min[0]) * ibuf->x; - num_samples_y = (pat_max[1] - pat_min[1]) * ibuf->y; - - search_ibuf = BKE_tracking_get_search_imbuf(ibuf, track, marker, anchored, disable_channels); - - if (search_ibuf) { - pattern_ibuf = BKE_tracking_sample_pattern(ibuf->x, ibuf->y, search_ibuf, track, marker, - anchored, false, num_samples_x, num_samples_y, NULL); - - IMB_freeImBuf(search_ibuf); - } - else { - pattern_ibuf = NULL; - } + ImBuf *pattern_ibuf; + double src_pixel_x[5], src_pixel_y[5]; + double warped_position_x, warped_position_y; + float *mask = NULL; + + if (num_samples_x <= 0 || num_samples_y <= 0) + return NULL; + + pattern_ibuf = IMB_allocImBuf( + num_samples_x, num_samples_y, 32, search_ibuf->rect_float ? IB_rectfloat : IB_rect); + + tracking_get_marker_coords_for_tracking( + frame_width, frame_height, marker, src_pixel_x, src_pixel_y); + + /* from_anchor means search buffer was obtained for an anchored position, + * which means applying track offset rounded to pixel space (we could not + * store search buffer with sub-pixel precision) + * + * in this case we need to alter coordinates a bit, to compensate rounded + * fractional part of offset + */ + if (from_anchor) { + int a; + + for (a = 0; a < 5; a++) { + src_pixel_x[a] += (double)((track->offset[0] * frame_width) - + ((int)(track->offset[0] * frame_width))); + src_pixel_y[a] += (double)((track->offset[1] * frame_height) - + ((int)(track->offset[1] * frame_height))); + + /* when offset is negative, rounding happens in opposite direction */ + if (track->offset[0] < 0.0f) + src_pixel_x[a] += 1.0; + if (track->offset[1] < 0.0f) + src_pixel_y[a] += 1.0; + } + } + + if (use_mask) { + mask = BKE_tracking_track_get_mask(frame_width, frame_height, track, marker); + } + + if (search_ibuf->rect_float) { + libmv_samplePlanarPatchFloat(search_ibuf->rect_float, + search_ibuf->x, + search_ibuf->y, + 4, + src_pixel_x, + src_pixel_y, + num_samples_x, + num_samples_y, + mask, + pattern_ibuf->rect_float, + &warped_position_x, + &warped_position_y); + } + else { + libmv_samplePlanarPatchByte((unsigned char *)search_ibuf->rect, + search_ibuf->x, + search_ibuf->y, + 4, + src_pixel_x, + src_pixel_y, + num_samples_x, + num_samples_y, + mask, + (unsigned char *)pattern_ibuf->rect, + &warped_position_x, + &warped_position_y); + } + + if (pos) { + pos[0] = warped_position_x; + pos[1] = warped_position_y; + } + + if (mask) { + MEM_freeN(mask); + } + + return pattern_ibuf; +} + +ImBuf *BKE_tracking_get_pattern_imbuf(ImBuf *ibuf, + MovieTrackingTrack *track, + MovieTrackingMarker *marker, + bool anchored, + bool disable_channels) +{ + ImBuf *pattern_ibuf, *search_ibuf; + float pat_min[2], pat_max[2]; + int num_samples_x, num_samples_y; + + BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max); + + num_samples_x = (pat_max[0] - pat_min[0]) * ibuf->x; + num_samples_y = (pat_max[1] - pat_min[1]) * ibuf->y; + + search_ibuf = BKE_tracking_get_search_imbuf(ibuf, track, marker, anchored, disable_channels); + + if (search_ibuf) { + pattern_ibuf = BKE_tracking_sample_pattern(ibuf->x, + ibuf->y, + search_ibuf, + track, + marker, + anchored, + false, + num_samples_x, + num_samples_y, + NULL); + + IMB_freeImBuf(search_ibuf); + } + else { + pattern_ibuf = NULL; + } + + return pattern_ibuf; +} + +ImBuf *BKE_tracking_get_search_imbuf(ImBuf *ibuf, + MovieTrackingTrack *track, + MovieTrackingMarker *marker, + bool anchored, + bool disable_channels) +{ + ImBuf *searchibuf; + int x, y, w, h; + float search_origin[2]; + + tracking_get_search_origin_frame_pixel(ibuf->x, ibuf->y, marker, search_origin); + + x = search_origin[0]; + y = search_origin[1]; + + if (anchored) { + x += track->offset[0] * ibuf->x; + y += track->offset[1] * ibuf->y; + } + + w = (marker->search_max[0] - marker->search_min[0]) * ibuf->x; + h = (marker->search_max[1] - marker->search_min[1]) * ibuf->y; + + if (w <= 0 || h <= 0) + return NULL; + + searchibuf = IMB_allocImBuf(w, h, 32, ibuf->rect_float ? IB_rectfloat : IB_rect); + + IMB_rectcpy(searchibuf, ibuf, 0, 0, x, y, w, h); + + if (disable_channels) { + if ((track->flag & TRACK_PREVIEW_GRAYSCALE) || (track->flag & TRACK_DISABLE_RED) || + (track->flag & TRACK_DISABLE_GREEN) || (track->flag & TRACK_DISABLE_BLUE)) { + disable_imbuf_channels(searchibuf, track, true); + } + } - return pattern_ibuf; -} - -ImBuf *BKE_tracking_get_search_imbuf(ImBuf *ibuf, MovieTrackingTrack *track, MovieTrackingMarker *marker, - bool anchored, bool disable_channels) -{ - ImBuf *searchibuf; - int x, y, w, h; - float search_origin[2]; - - tracking_get_search_origin_frame_pixel(ibuf->x, ibuf->y, marker, search_origin); - - x = search_origin[0]; - y = search_origin[1]; - - if (anchored) { - x += track->offset[0] * ibuf->x; - y += track->offset[1] * ibuf->y; - } - - w = (marker->search_max[0] - marker->search_min[0]) * ibuf->x; - h = (marker->search_max[1] - marker->search_min[1]) * ibuf->y; - - if (w <= 0 || h <= 0) - return NULL; - - searchibuf = IMB_allocImBuf(w, h, 32, ibuf->rect_float ? IB_rectfloat : IB_rect); - - IMB_rectcpy(searchibuf, ibuf, 0, 0, x, y, w, h); - - if (disable_channels) { - if ((track->flag & TRACK_PREVIEW_GRAYSCALE) || - (track->flag & TRACK_DISABLE_RED) || - (track->flag & TRACK_DISABLE_GREEN) || - (track->flag & TRACK_DISABLE_BLUE)) - { - disable_imbuf_channels(searchibuf, track, true); - } - } - - return searchibuf; + return searchibuf; } /* zap channels from the imbuf that are disabled by the user. this can lead to * better tracks sometimes. however, instead of simply zeroing the channels * out, do a partial grayscale conversion so the display is better. */ -void BKE_tracking_disable_channels(ImBuf *ibuf, bool disable_red, bool disable_green, bool disable_blue, - bool grayscale) -{ - int x, y; - float scale; - - if (!disable_red && !disable_green && !disable_blue && !grayscale) - return; - - /* if only some components are selected, it's important to rescale the result - * appropriately so that e.g. if only blue is selected, it's not zeroed out. - */ - scale = (disable_red ? 0.0f : 0.2126f) + - (disable_green ? 0.0f : 0.7152f) + - (disable_blue ? 0.0f : 0.0722f); - - for (y = 0; y < ibuf->y; y++) { - for (x = 0; x < ibuf->x; x++) { - int pixel = ibuf->x * y + x; - - if (ibuf->rect_float) { - float *rrgbf = ibuf->rect_float + pixel * 4; - float r = disable_red ? 0.0f : rrgbf[0]; - float g = disable_green ? 0.0f : rrgbf[1]; - float b = disable_blue ? 0.0f : rrgbf[2]; - - if (grayscale) { - float gray = (0.2126f * r + 0.7152f * g + 0.0722f * b) / scale; - - rrgbf[0] = rrgbf[1] = rrgbf[2] = gray; - } - else { - rrgbf[0] = r; - rrgbf[1] = g; - rrgbf[2] = b; - } - } - else { - char *rrgb = (char *)ibuf->rect + pixel * 4; - char r = disable_red ? 0 : rrgb[0]; - char g = disable_green ? 0 : rrgb[1]; - char b = disable_blue ? 0 : rrgb[2]; - - if (grayscale) { - float gray = (0.2126f * r + 0.7152f * g + 0.0722f * b) / scale; - - rrgb[0] = rrgb[1] = rrgb[2] = gray; - } - else { - rrgb[0] = r; - rrgb[1] = g; - rrgb[2] = b; - } - } - } - } - - if (ibuf->rect_float) - ibuf->userflags |= IB_RECT_INVALID; +void BKE_tracking_disable_channels( + ImBuf *ibuf, bool disable_red, bool disable_green, bool disable_blue, bool grayscale) +{ + int x, y; + float scale; + + if (!disable_red && !disable_green && !disable_blue && !grayscale) + return; + + /* if only some components are selected, it's important to rescale the result + * appropriately so that e.g. if only blue is selected, it's not zeroed out. + */ + scale = (disable_red ? 0.0f : 0.2126f) + (disable_green ? 0.0f : 0.7152f) + + (disable_blue ? 0.0f : 0.0722f); + + for (y = 0; y < ibuf->y; y++) { + for (x = 0; x < ibuf->x; x++) { + int pixel = ibuf->x * y + x; + + if (ibuf->rect_float) { + float *rrgbf = ibuf->rect_float + pixel * 4; + float r = disable_red ? 0.0f : rrgbf[0]; + float g = disable_green ? 0.0f : rrgbf[1]; + float b = disable_blue ? 0.0f : rrgbf[2]; + + if (grayscale) { + float gray = (0.2126f * r + 0.7152f * g + 0.0722f * b) / scale; + + rrgbf[0] = rrgbf[1] = rrgbf[2] = gray; + } + else { + rrgbf[0] = r; + rrgbf[1] = g; + rrgbf[2] = b; + } + } + else { + char *rrgb = (char *)ibuf->rect + pixel * 4; + char r = disable_red ? 0 : rrgb[0]; + char g = disable_green ? 0 : rrgb[1]; + char b = disable_blue ? 0 : rrgb[2]; + + if (grayscale) { + float gray = (0.2126f * r + 0.7152f * g + 0.0722f * b) / scale; + + rrgb[0] = rrgb[1] = rrgb[2] = gray; + } + else { + rrgb[0] = r; + rrgb[1] = g; + rrgb[2] = b; + } + } + } + } + + if (ibuf->rect_float) + ibuf->userflags |= IB_RECT_INVALID; } /*********************** Dopesheet functions *************************/ @@ -2549,250 +2652,253 @@ void BKE_tracking_disable_channels(ImBuf *ibuf, bool disable_red, bool disable_g static int channels_alpha_sort(const void *a, const void *b) { - const MovieTrackingDopesheetChannel *channel_a = a; - const MovieTrackingDopesheetChannel *channel_b = b; + const MovieTrackingDopesheetChannel *channel_a = a; + const MovieTrackingDopesheetChannel *channel_b = b; - if (BLI_strcasecmp(channel_a->track->name, channel_b->track->name) > 0) - return 1; - else - return 0; + if (BLI_strcasecmp(channel_a->track->name, channel_b->track->name) > 0) + return 1; + else + return 0; } static int channels_total_track_sort(const void *a, const void *b) { - const MovieTrackingDopesheetChannel *channel_a = a; - const MovieTrackingDopesheetChannel *channel_b = b; + const MovieTrackingDopesheetChannel *channel_a = a; + const MovieTrackingDopesheetChannel *channel_b = b; - if (channel_a->total_frames > channel_b->total_frames) - return 1; - else - return 0; + if (channel_a->total_frames > channel_b->total_frames) + return 1; + else + return 0; } static int channels_longest_segment_sort(const void *a, const void *b) { - const MovieTrackingDopesheetChannel *channel_a = a; - const MovieTrackingDopesheetChannel *channel_b = b; + const MovieTrackingDopesheetChannel *channel_a = a; + const MovieTrackingDopesheetChannel *channel_b = b; - if (channel_a->max_segment > channel_b->max_segment) - return 1; - else - return 0; + if (channel_a->max_segment > channel_b->max_segment) + return 1; + else + return 0; } static int channels_average_error_sort(const void *a, const void *b) { - const MovieTrackingDopesheetChannel *channel_a = a; - const MovieTrackingDopesheetChannel *channel_b = b; + const MovieTrackingDopesheetChannel *channel_a = a; + const MovieTrackingDopesheetChannel *channel_b = b; - if (channel_a->track->error > channel_b->track->error) - return 1; - else - return 0; + if (channel_a->track->error > channel_b->track->error) + return 1; + else + return 0; } static int channels_alpha_inverse_sort(const void *a, const void *b) { - if (channels_alpha_sort(a, b)) - return 0; - else - return 1; + if (channels_alpha_sort(a, b)) + return 0; + else + return 1; } static int channels_total_track_inverse_sort(const void *a, const void *b) { - if (channels_total_track_sort(a, b)) - return 0; - else - return 1; + if (channels_total_track_sort(a, b)) + return 0; + else + return 1; } static int channels_longest_segment_inverse_sort(const void *a, const void *b) { - if (channels_longest_segment_sort(a, b)) - return 0; - else - return 1; + if (channels_longest_segment_sort(a, b)) + return 0; + else + return 1; } static int channels_average_error_inverse_sort(const void *a, const void *b) { - const MovieTrackingDopesheetChannel *channel_a = a; - const MovieTrackingDopesheetChannel *channel_b = b; + const MovieTrackingDopesheetChannel *channel_a = a; + const MovieTrackingDopesheetChannel *channel_b = b; - if (channel_a->track->error < channel_b->track->error) - return 1; - else - return 0; + if (channel_a->track->error < channel_b->track->error) + return 1; + else + return 0; } /* Calculate frames segments at which track is tracked continuously. */ static void tracking_dopesheet_channels_segments_calc(MovieTrackingDopesheetChannel *channel) { - MovieTrackingTrack *track = channel->track; - int i, segment; + MovieTrackingTrack *track = channel->track; + int i, segment; - channel->tot_segment = 0; - channel->max_segment = 0; - channel->total_frames = 0; + channel->tot_segment = 0; + channel->max_segment = 0; + channel->total_frames = 0; - /* TODO(sergey): looks a bit code-duplicated, need to look into - * logic de-duplication here. - */ + /* TODO(sergey): looks a bit code-duplicated, need to look into + * logic de-duplication here. + */ - /* count */ - i = 0; - while (i < track->markersnr) { - MovieTrackingMarker *marker = &track->markers[i]; + /* count */ + i = 0; + while (i < track->markersnr) { + MovieTrackingMarker *marker = &track->markers[i]; - if ((marker->flag & MARKER_DISABLED) == 0) { - int prev_fra = marker->framenr, len = 0; + if ((marker->flag & MARKER_DISABLED) == 0) { + int prev_fra = marker->framenr, len = 0; - i++; - while (i < track->markersnr) { - marker = &track->markers[i]; + i++; + while (i < track->markersnr) { + marker = &track->markers[i]; - if (marker->framenr != prev_fra + 1) - break; - if (marker->flag & MARKER_DISABLED) - break; + if (marker->framenr != prev_fra + 1) + break; + if (marker->flag & MARKER_DISABLED) + break; - prev_fra = marker->framenr; - len++; - i++; - } + prev_fra = marker->framenr; + len++; + i++; + } - channel->tot_segment++; - } + channel->tot_segment++; + } - i++; - } + i++; + } - if (!channel->tot_segment) - return; + if (!channel->tot_segment) + return; - channel->segments = MEM_callocN(2 * sizeof(int) * channel->tot_segment, "tracking channel segments"); + channel->segments = MEM_callocN(2 * sizeof(int) * channel->tot_segment, + "tracking channel segments"); - /* create segments */ - i = 0; - segment = 0; - while (i < track->markersnr) { - MovieTrackingMarker *marker = &track->markers[i]; + /* create segments */ + i = 0; + segment = 0; + while (i < track->markersnr) { + MovieTrackingMarker *marker = &track->markers[i]; - if ((marker->flag & MARKER_DISABLED) == 0) { - MovieTrackingMarker *start_marker = marker; - int prev_fra = marker->framenr, len = 0; + if ((marker->flag & MARKER_DISABLED) == 0) { + MovieTrackingMarker *start_marker = marker; + int prev_fra = marker->framenr, len = 0; - i++; - while (i < track->markersnr) { - marker = &track->markers[i]; + i++; + while (i < track->markersnr) { + marker = &track->markers[i]; - if (marker->framenr != prev_fra + 1) - break; - if (marker->flag & MARKER_DISABLED) - break; + if (marker->framenr != prev_fra + 1) + break; + if (marker->flag & MARKER_DISABLED) + break; - prev_fra = marker->framenr; - channel->total_frames++; - len++; - i++; - } + prev_fra = marker->framenr; + channel->total_frames++; + len++; + i++; + } - channel->segments[2 * segment] = start_marker->framenr; - channel->segments[2 * segment + 1] = start_marker->framenr + len; + channel->segments[2 * segment] = start_marker->framenr; + channel->segments[2 * segment + 1] = start_marker->framenr + len; - channel->max_segment = max_ii(channel->max_segment, len); - segment++; - } + channel->max_segment = max_ii(channel->max_segment, len); + segment++; + } - i++; - } + i++; + } } /* Create channels for tracks and calculate tracked segments for them. */ static void tracking_dopesheet_channels_calc(MovieTracking *tracking) { - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; - MovieTrackingTrack *track; - MovieTrackingReconstruction *reconstruction = - BKE_tracking_object_get_reconstruction(tracking, object); - ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; + MovieTrackingTrack *track; + MovieTrackingReconstruction *reconstruction = BKE_tracking_object_get_reconstruction(tracking, + object); + ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); - bool sel_only = (dopesheet->flag & TRACKING_DOPE_SELECTED_ONLY) != 0; - bool show_hidden = (dopesheet->flag & TRACKING_DOPE_SHOW_HIDDEN) != 0; + bool sel_only = (dopesheet->flag & TRACKING_DOPE_SELECTED_ONLY) != 0; + bool show_hidden = (dopesheet->flag & TRACKING_DOPE_SHOW_HIDDEN) != 0; - for (track = tracksbase->first; track; track = track->next) { - MovieTrackingDopesheetChannel *channel; + for (track = tracksbase->first; track; track = track->next) { + MovieTrackingDopesheetChannel *channel; - if (!show_hidden && (track->flag & TRACK_HIDDEN) != 0) - continue; + if (!show_hidden && (track->flag & TRACK_HIDDEN) != 0) + continue; - if (sel_only && !TRACK_SELECTED(track)) - continue; + if (sel_only && !TRACK_SELECTED(track)) + continue; - channel = MEM_callocN(sizeof(MovieTrackingDopesheetChannel), "tracking dopesheet channel"); - channel->track = track; + channel = MEM_callocN(sizeof(MovieTrackingDopesheetChannel), "tracking dopesheet channel"); + channel->track = track; - if (reconstruction->flag & TRACKING_RECONSTRUCTED) { - BLI_snprintf(channel->name, sizeof(channel->name), "%s (%.4f)", track->name, track->error); - } - else { - BLI_strncpy(channel->name, track->name, sizeof(channel->name)); - } + if (reconstruction->flag & TRACKING_RECONSTRUCTED) { + BLI_snprintf(channel->name, sizeof(channel->name), "%s (%.4f)", track->name, track->error); + } + else { + BLI_strncpy(channel->name, track->name, sizeof(channel->name)); + } - tracking_dopesheet_channels_segments_calc(channel); + tracking_dopesheet_channels_segments_calc(channel); - BLI_addtail(&dopesheet->channels, channel); - dopesheet->tot_channel++; - } + BLI_addtail(&dopesheet->channels, channel); + dopesheet->tot_channel++; + } } /* Sot dopesheet channels using given method (name, average error, total coverage, * longest tracked segment) and could also inverse the list if it's enabled. */ -static void tracking_dopesheet_channels_sort(MovieTracking *tracking, int sort_method, bool inverse) -{ - MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; - - if (inverse) { - if (sort_method == TRACKING_DOPE_SORT_NAME) { - BLI_listbase_sort(&dopesheet->channels, channels_alpha_inverse_sort); - } - else if (sort_method == TRACKING_DOPE_SORT_LONGEST) { - BLI_listbase_sort(&dopesheet->channels, channels_longest_segment_inverse_sort); - } - else if (sort_method == TRACKING_DOPE_SORT_TOTAL) { - BLI_listbase_sort(&dopesheet->channels, channels_total_track_inverse_sort); - } - else if (sort_method == TRACKING_DOPE_SORT_AVERAGE_ERROR) { - BLI_listbase_sort(&dopesheet->channels, channels_average_error_inverse_sort); - } - } - else { - if (sort_method == TRACKING_DOPE_SORT_NAME) { - BLI_listbase_sort(&dopesheet->channels, channels_alpha_sort); - } - else if (sort_method == TRACKING_DOPE_SORT_LONGEST) { - BLI_listbase_sort(&dopesheet->channels, channels_longest_segment_sort); - } - else if (sort_method == TRACKING_DOPE_SORT_TOTAL) { - BLI_listbase_sort(&dopesheet->channels, channels_total_track_sort); - } - else if (sort_method == TRACKING_DOPE_SORT_AVERAGE_ERROR) { - BLI_listbase_sort(&dopesheet->channels, channels_average_error_sort); - } - } +static void tracking_dopesheet_channels_sort(MovieTracking *tracking, + int sort_method, + bool inverse) +{ + MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; + + if (inverse) { + if (sort_method == TRACKING_DOPE_SORT_NAME) { + BLI_listbase_sort(&dopesheet->channels, channels_alpha_inverse_sort); + } + else if (sort_method == TRACKING_DOPE_SORT_LONGEST) { + BLI_listbase_sort(&dopesheet->channels, channels_longest_segment_inverse_sort); + } + else if (sort_method == TRACKING_DOPE_SORT_TOTAL) { + BLI_listbase_sort(&dopesheet->channels, channels_total_track_inverse_sort); + } + else if (sort_method == TRACKING_DOPE_SORT_AVERAGE_ERROR) { + BLI_listbase_sort(&dopesheet->channels, channels_average_error_inverse_sort); + } + } + else { + if (sort_method == TRACKING_DOPE_SORT_NAME) { + BLI_listbase_sort(&dopesheet->channels, channels_alpha_sort); + } + else if (sort_method == TRACKING_DOPE_SORT_LONGEST) { + BLI_listbase_sort(&dopesheet->channels, channels_longest_segment_sort); + } + else if (sort_method == TRACKING_DOPE_SORT_TOTAL) { + BLI_listbase_sort(&dopesheet->channels, channels_total_track_sort); + } + else if (sort_method == TRACKING_DOPE_SORT_AVERAGE_ERROR) { + BLI_listbase_sort(&dopesheet->channels, channels_average_error_sort); + } + } } static int coverage_from_count(int count) { - /* Values are actually arbitrary here, probably need to be tweaked. */ - if (count < 8) - return TRACKING_COVERAGE_BAD; - else if (count < 16) - return TRACKING_COVERAGE_ACCEPTABLE; - return TRACKING_COVERAGE_OK; + /* Values are actually arbitrary here, probably need to be tweaked. */ + if (count < 8) + return TRACKING_COVERAGE_BAD; + else if (count < 16) + return TRACKING_COVERAGE_ACCEPTABLE; + return TRACKING_COVERAGE_OK; } /* Calculate coverage of frames with tracks, this information @@ -2801,72 +2907,73 @@ static int coverage_from_count(int count) */ static void tracking_dopesheet_calc_coverage(MovieTracking *tracking) { - MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; - MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); - ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); - MovieTrackingTrack *track; - int frames, start_frame = INT_MAX, end_frame = -INT_MAX; - int *per_frame_counter; - int prev_coverage, last_segment_frame; + MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; + MovieTrackingObject *object = BKE_tracking_object_get_active(tracking); + ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object); + MovieTrackingTrack *track; + int frames, start_frame = INT_MAX, end_frame = -INT_MAX; + int *per_frame_counter; + int prev_coverage, last_segment_frame; - /* find frame boundaries */ - for (track = tracksbase->first; track; track = track->next) { - start_frame = min_ii(start_frame, track->markers[0].framenr); - end_frame = max_ii(end_frame, track->markers[track->markersnr - 1].framenr); - } + /* find frame boundaries */ + for (track = tracksbase->first; track; track = track->next) { + start_frame = min_ii(start_frame, track->markers[0].framenr); + end_frame = max_ii(end_frame, track->markers[track->markersnr - 1].framenr); + } - frames = end_frame - start_frame + 1; + frames = end_frame - start_frame + 1; - /* this is a per-frame counter of markers (how many markers belongs to the same frame) */ - per_frame_counter = MEM_callocN(sizeof(int) * frames, "per frame track counter"); + /* this is a per-frame counter of markers (how many markers belongs to the same frame) */ + per_frame_counter = MEM_callocN(sizeof(int) * frames, "per frame track counter"); - /* find per-frame markers count */ - for (track = tracksbase->first; track; track = track->next) { - for (int i = 0; i < track->markersnr; i++) { - MovieTrackingMarker *marker = &track->markers[i]; + /* find per-frame markers count */ + for (track = tracksbase->first; track; track = track->next) { + for (int i = 0; i < track->markersnr; i++) { + MovieTrackingMarker *marker = &track->markers[i]; - /* TODO: perhaps we need to add check for non-single-frame track here */ - if ((marker->flag & MARKER_DISABLED) == 0) - per_frame_counter[marker->framenr - start_frame]++; - } - } + /* TODO: perhaps we need to add check for non-single-frame track here */ + if ((marker->flag & MARKER_DISABLED) == 0) + per_frame_counter[marker->framenr - start_frame]++; + } + } - /* convert markers count to coverage and detect segments with the same coverage */ - prev_coverage = coverage_from_count(per_frame_counter[0]); - last_segment_frame = start_frame; + /* convert markers count to coverage and detect segments with the same coverage */ + prev_coverage = coverage_from_count(per_frame_counter[0]); + last_segment_frame = start_frame; - /* means only disabled tracks in the beginning, could be ignored */ - if (!per_frame_counter[0]) - prev_coverage = TRACKING_COVERAGE_OK; + /* means only disabled tracks in the beginning, could be ignored */ + if (!per_frame_counter[0]) + prev_coverage = TRACKING_COVERAGE_OK; - for (int i = 1; i < frames; i++) { - int coverage = coverage_from_count(per_frame_counter[i]); + for (int i = 1; i < frames; i++) { + int coverage = coverage_from_count(per_frame_counter[i]); - /* means only disabled tracks in the end, could be ignored */ - if (i == frames - 1 && !per_frame_counter[i]) - coverage = TRACKING_COVERAGE_OK; + /* means only disabled tracks in the end, could be ignored */ + if (i == frames - 1 && !per_frame_counter[i]) + coverage = TRACKING_COVERAGE_OK; - if (coverage != prev_coverage || i == frames - 1) { - MovieTrackingDopesheetCoverageSegment *coverage_segment; - int end_segment_frame = i - 1 + start_frame; + if (coverage != prev_coverage || i == frames - 1) { + MovieTrackingDopesheetCoverageSegment *coverage_segment; + int end_segment_frame = i - 1 + start_frame; - if (end_segment_frame == last_segment_frame) - end_segment_frame++; + if (end_segment_frame == last_segment_frame) + end_segment_frame++; - coverage_segment = MEM_callocN(sizeof(MovieTrackingDopesheetCoverageSegment), "tracking coverage segment"); - coverage_segment->coverage = prev_coverage; - coverage_segment->start_frame = last_segment_frame; - coverage_segment->end_frame = end_segment_frame; + coverage_segment = MEM_callocN(sizeof(MovieTrackingDopesheetCoverageSegment), + "tracking coverage segment"); + coverage_segment->coverage = prev_coverage; + coverage_segment->start_frame = last_segment_frame; + coverage_segment->end_frame = end_segment_frame; - BLI_addtail(&dopesheet->coverage_segments, coverage_segment); + BLI_addtail(&dopesheet->coverage_segments, coverage_segment); - last_segment_frame = end_segment_frame; - } + last_segment_frame = end_segment_frame; + } - prev_coverage = coverage; - } + prev_coverage = coverage; + } - MEM_freeN(per_frame_counter); + MEM_freeN(per_frame_counter); } /* Tag dopesheet for update, actual update will happen later @@ -2874,182 +2981,163 @@ static void tracking_dopesheet_calc_coverage(MovieTracking *tracking) */ void BKE_tracking_dopesheet_tag_update(MovieTracking *tracking) { - MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; + MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; - dopesheet->ok = false; + dopesheet->ok = false; } /* Do dopesheet update, if update is not needed nothing will happen. */ void BKE_tracking_dopesheet_update(MovieTracking *tracking) { - MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; + MovieTrackingDopesheet *dopesheet = &tracking->dopesheet; - short sort_method = dopesheet->sort_method; - bool inverse = (dopesheet->flag & TRACKING_DOPE_SORT_INVERSE) != 0; + short sort_method = dopesheet->sort_method; + bool inverse = (dopesheet->flag & TRACKING_DOPE_SORT_INVERSE) != 0; - if (dopesheet->ok) - return; + if (dopesheet->ok) + return; - tracking_dopesheet_free(dopesheet); + tracking_dopesheet_free(dopesheet); - /* channels */ - tracking_dopesheet_channels_calc(tracking); - tracking_dopesheet_channels_sort(tracking, sort_method, inverse); + /* channels */ + tracking_dopesheet_channels_calc(tracking); + tracking_dopesheet_channels_sort(tracking, sort_method, inverse); - /* frame coverage */ - tracking_dopesheet_calc_coverage(tracking); + /* frame coverage */ + tracking_dopesheet_calc_coverage(tracking); - dopesheet->ok = true; + dopesheet->ok = true; } /* NOTE: Returns NULL if the track comes from camera object, */ -MovieTrackingObject *BKE_tracking_find_object_for_track( - const MovieTracking *tracking, - const MovieTrackingTrack *track) -{ - const ListBase *tracksbase = &tracking->tracks; - if (BLI_findindex(tracksbase, track) != -1) { - return NULL; - } - MovieTrackingObject *object = tracking->objects.first; - while (object != NULL) { - if (BLI_findindex(&object->tracks, track) != -1) { - return object; - } - object = object->next; - } - return NULL; -} - -ListBase *BKE_tracking_find_tracks_list_for_track( - MovieTracking *tracking, - const MovieTrackingTrack *track) -{ - MovieTrackingObject *object = BKE_tracking_find_object_for_track(tracking, - track); - if (object != NULL) { - return &object->tracks; - } - return &tracking->tracks; +MovieTrackingObject *BKE_tracking_find_object_for_track(const MovieTracking *tracking, + const MovieTrackingTrack *track) +{ + const ListBase *tracksbase = &tracking->tracks; + if (BLI_findindex(tracksbase, track) != -1) { + return NULL; + } + MovieTrackingObject *object = tracking->objects.first; + while (object != NULL) { + if (BLI_findindex(&object->tracks, track) != -1) { + return object; + } + object = object->next; + } + return NULL; +} + +ListBase *BKE_tracking_find_tracks_list_for_track(MovieTracking *tracking, + const MovieTrackingTrack *track) +{ + MovieTrackingObject *object = BKE_tracking_find_object_for_track(tracking, track); + if (object != NULL) { + return &object->tracks; + } + return &tracking->tracks; } /* NOTE: Returns NULL if the track comes from camera object, */ MovieTrackingObject *BKE_tracking_find_object_for_plane_track( - const MovieTracking *tracking, - const MovieTrackingPlaneTrack *plane_track) -{ - const ListBase *plane_tracks_base = &tracking->plane_tracks; - if (BLI_findindex(plane_tracks_base, plane_track) != -1) { - return NULL; - } - MovieTrackingObject *object = tracking->objects.first; - while (object != NULL) { - if (BLI_findindex(&object->plane_tracks, plane_track) != -1) { - return object; - } - object = object->next; - } - return NULL; -} - -ListBase *BKE_tracking_find_tracks_list_for_plane_track( - MovieTracking *tracking, - const MovieTrackingPlaneTrack *plane_track) -{ - MovieTrackingObject *object = - BKE_tracking_find_object_for_plane_track(tracking, plane_track); - if (object != NULL) { - return &object->plane_tracks; - } - return &tracking->plane_tracks; -} - -void BKE_tracking_get_rna_path_for_track( - const struct MovieTracking *tracking, - const struct MovieTrackingTrack *track, - char *rna_path, - size_t rna_path_len) -{ - MovieTrackingObject *object = - BKE_tracking_find_object_for_track(tracking, track); - char track_name_esc[MAX_NAME * 2]; - BLI_strescape(track_name_esc, track->name, sizeof(track_name_esc)); - if (object == NULL) { - BLI_snprintf(rna_path, rna_path_len, - "tracking.tracks[\"%s\"]", - track_name_esc); - } - else { - char object_name_esc[MAX_NAME * 2]; - BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); - BLI_snprintf(rna_path, rna_path_len, - "tracking.objects[\"%s\"].tracks[\"%s\"]", - object_name_esc, - track_name_esc); - } -} - -void BKE_tracking_get_rna_path_prefix_for_track( - const struct MovieTracking *tracking, - const struct MovieTrackingTrack *track, - char *rna_path, - size_t rna_path_len) -{ - MovieTrackingObject *object = - BKE_tracking_find_object_for_track(tracking, track); - if (object == NULL) { - BLI_strncpy(rna_path, "tracking.tracks", rna_path_len); - } - else { - char object_name_esc[MAX_NAME * 2]; - BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); - BLI_snprintf(rna_path, rna_path_len, - "tracking.objects[\"%s\"]", - object_name_esc); - } -} - -void BKE_tracking_get_rna_path_for_plane_track( - const struct MovieTracking *tracking, - const struct MovieTrackingPlaneTrack *plane_track, - char *rna_path, - size_t rna_path_len) -{ - MovieTrackingObject *object = - BKE_tracking_find_object_for_plane_track(tracking, plane_track); - char track_name_esc[MAX_NAME * 2]; - BLI_strescape(track_name_esc, plane_track->name, sizeof(track_name_esc)); - if (object == NULL) { - BLI_snprintf(rna_path, rna_path_len, - "tracking.plane_tracks[\"%s\"]", - track_name_esc); - } - else { - char object_name_esc[MAX_NAME * 2]; - BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); - BLI_snprintf(rna_path, rna_path_len, - "tracking.objects[\"%s\"].plane_tracks[\"%s\"]", - object_name_esc, - track_name_esc); - } + const MovieTracking *tracking, const MovieTrackingPlaneTrack *plane_track) +{ + const ListBase *plane_tracks_base = &tracking->plane_tracks; + if (BLI_findindex(plane_tracks_base, plane_track) != -1) { + return NULL; + } + MovieTrackingObject *object = tracking->objects.first; + while (object != NULL) { + if (BLI_findindex(&object->plane_tracks, plane_track) != -1) { + return object; + } + object = object->next; + } + return NULL; +} + +ListBase *BKE_tracking_find_tracks_list_for_plane_track(MovieTracking *tracking, + const MovieTrackingPlaneTrack *plane_track) +{ + MovieTrackingObject *object = BKE_tracking_find_object_for_plane_track(tracking, plane_track); + if (object != NULL) { + return &object->plane_tracks; + } + return &tracking->plane_tracks; +} + +void BKE_tracking_get_rna_path_for_track(const struct MovieTracking *tracking, + const struct MovieTrackingTrack *track, + char *rna_path, + size_t rna_path_len) +{ + MovieTrackingObject *object = BKE_tracking_find_object_for_track(tracking, track); + char track_name_esc[MAX_NAME * 2]; + BLI_strescape(track_name_esc, track->name, sizeof(track_name_esc)); + if (object == NULL) { + BLI_snprintf(rna_path, rna_path_len, "tracking.tracks[\"%s\"]", track_name_esc); + } + else { + char object_name_esc[MAX_NAME * 2]; + BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); + BLI_snprintf(rna_path, + rna_path_len, + "tracking.objects[\"%s\"].tracks[\"%s\"]", + object_name_esc, + track_name_esc); + } +} + +void BKE_tracking_get_rna_path_prefix_for_track(const struct MovieTracking *tracking, + const struct MovieTrackingTrack *track, + char *rna_path, + size_t rna_path_len) +{ + MovieTrackingObject *object = BKE_tracking_find_object_for_track(tracking, track); + if (object == NULL) { + BLI_strncpy(rna_path, "tracking.tracks", rna_path_len); + } + else { + char object_name_esc[MAX_NAME * 2]; + BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); + BLI_snprintf(rna_path, rna_path_len, "tracking.objects[\"%s\"]", object_name_esc); + } +} + +void BKE_tracking_get_rna_path_for_plane_track(const struct MovieTracking *tracking, + const struct MovieTrackingPlaneTrack *plane_track, + char *rna_path, + size_t rna_path_len) +{ + MovieTrackingObject *object = BKE_tracking_find_object_for_plane_track(tracking, plane_track); + char track_name_esc[MAX_NAME * 2]; + BLI_strescape(track_name_esc, plane_track->name, sizeof(track_name_esc)); + if (object == NULL) { + BLI_snprintf(rna_path, rna_path_len, "tracking.plane_tracks[\"%s\"]", track_name_esc); + } + else { + char object_name_esc[MAX_NAME * 2]; + BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); + BLI_snprintf(rna_path, + rna_path_len, + "tracking.objects[\"%s\"].plane_tracks[\"%s\"]", + object_name_esc, + track_name_esc); + } } void BKE_tracking_get_rna_path_prefix_for_plane_track( - const struct MovieTracking *tracking, - const struct MovieTrackingPlaneTrack *plane_track, - char *rna_path, - size_t rna_path_len) -{ - MovieTrackingObject *object = - BKE_tracking_find_object_for_plane_track(tracking, plane_track); - if (object == NULL) { - BLI_strncpy(rna_path, "tracking.plane_tracks", rna_path_len); - } - else { - char object_name_esc[MAX_NAME * 2]; - BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); - BLI_snprintf(rna_path, rna_path_len, - "tracking.objects[\"%s\"].plane_tracks", - object_name_esc); - } + const struct MovieTracking *tracking, + const struct MovieTrackingPlaneTrack *plane_track, + char *rna_path, + size_t rna_path_len) +{ + MovieTrackingObject *object = BKE_tracking_find_object_for_plane_track(tracking, plane_track); + if (object == NULL) { + BLI_strncpy(rna_path, "tracking.plane_tracks", rna_path_len); + } + else { + char object_name_esc[MAX_NAME * 2]; + BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); + BLI_snprintf(rna_path, rna_path_len, "tracking.objects[\"%s\"].plane_tracks", object_name_esc); + } } -- cgit v1.2.3