Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/tracking.c
| Show First 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | void BKE_tracking_free(MovieTracking *tracking) | ||||
| if (tracking->camera.intrinsics) | if (tracking->camera.intrinsics) | ||||
| BKE_tracking_distortion_free(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. */ | /* Copy the whole list of tracks. */ | ||||
| static void tracking_tracks_copy(ListBase *tracks_dst, const ListBase *tracks_src, GHash *tracks_mapping) | 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_listbase_clear(tracks_dst); | ||||
| BLI_ghash_clear(tracks_mapping, NULL, NULL); | BLI_ghash_clear(tracks_mapping, NULL, NULL); | ||||
| for (track_src = tracks_src->first; track_src != NULL; track_src = track_src->next) { | for (track_src = tracks_src->first; track_src != NULL; track_src = track_src->next) { | ||||
| track_dst = MEM_dupallocN(track_src); | track_dst = MEM_dupallocN(track_src); | ||||
| if (track_src->markers) { | if (track_src->markers) { | ||||
| track_dst->markers = MEM_dupallocN(track_src->markers); | track_dst->markers = MEM_dupallocN(track_src->markers); | ||||
| } | } | ||||
| if ((flag & LIB_ID_COPY_NO_USER_REFCOUNT) == 0) { | |||||
| id_us_plus(&track_dst->gpd->id); | id_us_plus(&track_dst->gpd->id); | ||||
| } | |||||
| BLI_addtail(tracks_dst, track_dst); | BLI_addtail(tracks_dst, track_dst); | ||||
| BLI_ghash_insert(tracks_mapping, track_src, 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). | /* 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. */ | * WARNING: implies tracking_[dst/src] and their tracks have already been copied. */ | ||||
| static void tracking_plane_tracks_copy(ListBase *plane_tracks_dst, const ListBase *plane_tracks_src, GHash *tracks_mapping) | static void tracking_plane_tracks_copy( | ||||
| ListBase *plane_tracks_dst, const ListBase *plane_tracks_src, GHash *tracks_mapping, const int flag) | |||||
| { | { | ||||
| MovieTrackingPlaneTrack *plane_track_dst, *plane_track_src; | MovieTrackingPlaneTrack *plane_track_dst, *plane_track_src; | ||||
| BLI_listbase_clear(plane_tracks_dst); | BLI_listbase_clear(plane_tracks_dst); | ||||
| for (plane_track_src = plane_tracks_src->first; plane_track_src != NULL; plane_track_src = plane_track_src->next) { | for (plane_track_src = plane_tracks_src->first; plane_track_src != NULL; plane_track_src = plane_track_src->next) { | ||||
| plane_track_dst = MEM_dupallocN(plane_tracks_src); | plane_track_dst = MEM_dupallocN(plane_tracks_src); | ||||
| if (plane_track_src->markers) { | if (plane_track_src->markers) { | ||||
| plane_track_dst->markers = MEM_dupallocN(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__); | 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++) { | 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]); | plane_track_dst->point_tracks[i] = BLI_ghash_lookup(tracks_mapping, plane_track_src->point_tracks[i]); | ||||
| } | } | ||||
| if ((flag & LIB_ID_COPY_NO_USER_REFCOUNT) == 0) { | |||||
| id_us_plus(&plane_track_dst->image->id); | id_us_plus(&plane_track_dst->image->id); | ||||
| } | |||||
| BLI_addtail(plane_tracks_dst, plane_track_dst); | BLI_addtail(plane_tracks_dst, plane_track_dst); | ||||
| } | } | ||||
| } | } | ||||
| /* Copy reconstruction structure. */ | /* Copy reconstruction structure. */ | ||||
| static void tracking_reconstruction_copy( | static void tracking_reconstruction_copy( | ||||
| MovieTrackingReconstruction *reconstruction_dst, const MovieTrackingReconstruction *reconstruction_src) | MovieTrackingReconstruction *reconstruction_dst, const MovieTrackingReconstruction *reconstruction_src, | ||||
| const int UNUSED(flag)) | |||||
| { | { | ||||
| *reconstruction_dst = *reconstruction_src; | *reconstruction_dst = *reconstruction_src; | ||||
| if (reconstruction_src->cameras) { | if (reconstruction_src->cameras) { | ||||
| reconstruction_dst->cameras = MEM_dupallocN(reconstruction_src->cameras); | reconstruction_dst->cameras = MEM_dupallocN(reconstruction_src->cameras); | ||||
| } | } | ||||
| } | } | ||||
| /* Copy stabilization structure. */ | /* Copy stabilization structure. */ | ||||
| static void tracking_stabilization_copy( | static void tracking_stabilization_copy( | ||||
| MovieTrackingStabilization *stabilization_dst, const MovieTrackingStabilization *stabilization_src) | MovieTrackingStabilization *stabilization_dst, const MovieTrackingStabilization *stabilization_src, | ||||
| const int UNUSED(flag)) | |||||
| { | { | ||||
| *stabilization_dst = *stabilization_src; | *stabilization_dst = *stabilization_src; | ||||
| } | } | ||||
| /* Copy tracking object. */ | /* Copy tracking object. */ | ||||
| static void tracking_object_copy( | static void tracking_object_copy( | ||||
| MovieTrackingObject *object_dst, const MovieTrackingObject *object_src, GHash *tracks_mapping) | MovieTrackingObject *object_dst, const MovieTrackingObject *object_src, GHash *tracks_mapping, const int flag) | ||||
| { | { | ||||
| *object_dst = *object_src; | *object_dst = *object_src; | ||||
| tracking_tracks_copy(&object_dst->tracks, &object_src->tracks, tracks_mapping); | 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); | tracking_plane_tracks_copy(&object_dst->plane_tracks, &object_src->plane_tracks, tracks_mapping, flag); | ||||
| tracking_reconstruction_copy(&object_dst->reconstruction, &object_src->reconstruction); | tracking_reconstruction_copy(&object_dst->reconstruction, &object_src->reconstruction, flag); | ||||
| } | } | ||||
| /* Copy list of tracking objects. */ | /* Copy list of tracking objects. */ | ||||
| static void tracking_objects_copy(ListBase *objects_dst, const ListBase *objects_src, GHash *tracks_mapping) | 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) { | for (object_src = objects_src->first; object_src != NULL; object_src = object_src->next) { | ||||
| object_dst = MEM_mallocN(sizeof(*object_dst), __func__); | object_dst = MEM_mallocN(sizeof(*object_dst), __func__); | ||||
| tracking_object_copy(object_dst, object_src, tracks_mapping); | tracking_object_copy(object_dst, object_src, tracks_mapping, flag); | ||||
| BLI_addtail(objects_dst, object_dst); | BLI_addtail(objects_dst, object_dst); | ||||
| } | } | ||||
| } | } | ||||
| /* Copy tracking structure content. */ | /* Copy tracking structure content. */ | ||||
| void BKE_tracking_copy(MovieTracking *tracking_dst, const MovieTracking *tracking_src) | void BKE_tracking_copy(MovieTracking *tracking_dst, const MovieTracking *tracking_src, const int flag) | ||||
| { | { | ||||
| GHash *tracks_mapping = BLI_ghash_ptr_new(__func__); | GHash *tracks_mapping = BLI_ghash_ptr_new(__func__); | ||||
| *tracking_dst = *tracking_src; | *tracking_dst = *tracking_src; | ||||
| tracking_tracks_copy(&tracking_dst->tracks, &tracking_src->tracks, tracks_mapping); | 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); | tracking_plane_tracks_copy(&tracking_dst->plane_tracks, &tracking_src->plane_tracks, tracks_mapping, flag); | ||||
| tracking_reconstruction_copy(&tracking_dst->reconstruction, &tracking_src->reconstruction); | tracking_reconstruction_copy(&tracking_dst->reconstruction, &tracking_src->reconstruction, flag); | ||||
| tracking_stabilization_copy(&tracking_dst->stabilization, &tracking_src->stabilization); | tracking_stabilization_copy(&tracking_dst->stabilization, &tracking_src->stabilization, flag); | ||||
| if (tracking_src->act_track) { | if (tracking_src->act_track) { | ||||
| tracking_dst->act_track = BLI_ghash_lookup(tracks_mapping, tracking_src->act_track); | tracking_dst->act_track = BLI_ghash_lookup(tracks_mapping, tracking_src->act_track); | ||||
| } | } | ||||
| if (tracking_src->act_plane_track) { | if (tracking_src->act_plane_track) { | ||||
| MovieTrackingPlaneTrack *plane_track_src, *plane_track_dst; | MovieTrackingPlaneTrack *plane_track_src, *plane_track_dst; | ||||
| for (plane_track_src = tracking_src->plane_tracks.first, plane_track_dst = tracking_dst->plane_tracks.first; | 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); | !ELEM(NULL, plane_track_src, plane_track_dst); | ||||
| plane_track_src = plane_track_src->next, plane_track_dst = plane_track_dst->next) | plane_track_src = plane_track_src->next, plane_track_dst = plane_track_dst->next) | ||||
| { | { | ||||
| if (plane_track_src == tracking_src->act_plane_track) { | if (plane_track_src == tracking_src->act_plane_track) { | ||||
| tracking_dst->act_plane_track = plane_track_dst; | tracking_dst->act_plane_track = plane_track_dst; | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* Warning! Will override tracks_mapping. */ | /* Warning! Will override tracks_mapping. */ | ||||
| tracking_objects_copy(&tracking_dst->objects, &tracking_src->objects, 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. */ | /* Those remaining are runtime data, they will be reconstructed as needed, do not bother copying them. */ | ||||
| tracking_dst->dopesheet.ok = false; | tracking_dst->dopesheet.ok = false; | ||||
| BLI_listbase_clear(&tracking_dst->dopesheet.channels); | BLI_listbase_clear(&tracking_dst->dopesheet.channels); | ||||
| BLI_listbase_clear(&tracking_dst->dopesheet.coverage_segments); | BLI_listbase_clear(&tracking_dst->dopesheet.coverage_segments); | ||||
| tracking_dst->camera.intrinsics = NULL; | tracking_dst->camera.intrinsics = NULL; | ||||
| tracking_dst->stats = NULL; | tracking_dst->stats = NULL; | ||||
| ▲ Show 20 Lines • Show All 2,588 Lines • Show Last 20 Lines | |||||