Commit: 27a3110a1b9fc64fbabe7a98a5d5579ff17c4fc6 Author: Sergey Sharybin Date: Thu Oct 6 16:52:23 2022 +0200 Branches: tracking_refactor_v3 https://developer.blender.org/rB27a3110a1b9fc64fbabe7a98a5d5579ff17c4fc6
Refactor: Streamline tracking data copying a bit Prepare the code to more easily support pointers remapping for tracking objects. Should be no functional changes. =================================================================== M source/blender/blenkernel/intern/tracking.c =================================================================== diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 1577ea06608..2a7ebe2a421 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -161,14 +161,33 @@ void BKE_tracking_free(MovieTracking *tracking) tracking_dopesheet_free(&tracking->dopesheet); } +typedef struct TrackingCopyContext { + /* Map from point and plane track pointer from the source object to the destination object. */ + GHash *old_to_new_track_map; + GHash *old_to_new_plane_track_map; +} TrackingCopyContext; + +static TrackingCopyContext tracking_copy_context_new(void) +{ + TrackingCopyContext ctx = {}; + ctx.old_to_new_track_map = BLI_ghash_ptr_new(__func__); + ctx.old_to_new_plane_track_map = BLI_ghash_ptr_new(__func__); + return ctx; +} + +static void tracking_copy_context_delete(TrackingCopyContext *ctx) +{ + BLI_ghash_free(ctx->old_to_new_track_map, NULL, NULL); + BLI_ghash_free(ctx->old_to_new_plane_track_map, NULL, NULL); +} + /* Copy the whole list of tracks. */ -static void tracking_tracks_copy(ListBase *tracks_dst, +static void tracking_tracks_copy(TrackingCopyContext *ctx, + ListBase *tracks_dst, const ListBase *tracks_src, - GHash *tracks_mapping, const int flag) { BLI_listbase_clear(tracks_dst); - BLI_ghash_clear(tracks_mapping, NULL, NULL); LISTBASE_FOREACH (MovieTrackingTrack *, track_src, tracks_src) { MovieTrackingTrack *track_dst = MEM_dupallocN(track_src); @@ -179,16 +198,17 @@ static void tracking_tracks_copy(ListBase *tracks_dst, id_us_plus(&track_dst->gpd->id); } BLI_addtail(tracks_dst, track_dst); - BLI_ghash_insert(tracks_mapping, track_src, track_dst); + + BLI_ghash_insert(ctx->old_to_new_track_map, 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, +static void tracking_plane_tracks_copy(TrackingCopyContext *ctx, + ListBase *plane_tracks_list_dst, const ListBase *plane_tracks_list_src, - GHash *tracks_mapping, const int flag) { BLI_listbase_clear(plane_tracks_list_dst); @@ -201,18 +221,22 @@ static void tracking_plane_tracks_copy(ListBase *plane_tracks_list_dst, 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_dst->point_tracks[i] = BLI_ghash_lookup(ctx->old_to_new_track_map, plane_track_src->point_tracks[i]); + BLI_assert(plane_track_dst->point_tracks[i] != NULL); } 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); + + BLI_ghash_insert(ctx->old_to_new_plane_track_map, plane_track_src, plane_track_dst); } } /* Copy reconstruction structure. */ -static void tracking_reconstruction_copy(MovieTrackingReconstruction *reconstruction_dst, +static void tracking_reconstruction_copy(TrackingCopyContext *UNUSED(ctx), + MovieTrackingReconstruction *reconstruction_dst, const MovieTrackingReconstruction *reconstruction_src, const int UNUSED(flag)) { @@ -223,7 +247,8 @@ static void tracking_reconstruction_copy(MovieTrackingReconstruction *reconstruc } /* Copy stabilization structure. */ -static void tracking_stabilization_copy(MovieTrackingStabilization *stabilization_dst, +static void tracking_stabilization_copy(TrackingCopyContext *UNUSED(ctx), + MovieTrackingStabilization *stabilization_dst, const MovieTrackingStabilization *stabilization_src, const int UNUSED(flag)) { @@ -233,27 +258,29 @@ static void tracking_stabilization_copy(MovieTrackingStabilization *stabilizatio /* Copy tracking object. */ static void tracking_object_copy(MovieTrackingObject *object_dst, const MovieTrackingObject *object_src, - GHash *tracks_mapping, const int flag) { + TrackingCopyContext ctx = tracking_copy_context_new(); + *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); + tracking_tracks_copy(&ctx, &object_dst->tracks, &object_src->tracks, flag); + tracking_plane_tracks_copy(&ctx, &object_dst->plane_tracks, &object_src->plane_tracks, flag); + tracking_reconstruction_copy( + &ctx, &object_dst->reconstruction, &object_src->reconstruction, flag); + + tracking_copy_context_delete(&ctx); } /* Copy list of tracking objects. */ static void tracking_objects_copy(ListBase *objects_dst, const ListBase *objects_src, - GHash *tracks_mapping, const int flag) { BLI_listbase_clear(objects_dst); LISTBASE_FOREACH (MovieTrackingObject *, object_src, objects_src) { MovieTrackingObject *object_dst = MEM_mallocN(sizeof(*object_dst), __func__); - tracking_object_copy(object_dst, object_src, tracks_mapping, flag); + tracking_object_copy(object_dst, object_src, flag); BLI_addtail(objects_dst, object_dst); } } @@ -262,33 +289,29 @@ 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); + TrackingCopyContext ctx = tracking_copy_context_new(); + tracking_tracks_copy(&ctx, &tracking_dst->tracks, &tracking_src->tracks, flag); + tracking_plane_tracks_copy(&ctx, &tracking_dst->plane_tracks, &tracking_src->plane_tracks, flag); + tracking_reconstruction_copy( + &ctx, &tracking_dst->reconstruction, &tracking_src->reconstruction, flag); + tracking_stabilization_copy( + &ctx, &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); + tracking_dst->act_track = BLI_ghash_lookup(ctx.old_to_new_track_map, tracking_src->act_track); + BLI_assert(tracking_dst->act_track != NULL); } 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; - } - } + tracking_dst->act_plane_track = BLI_ghash_lookup(ctx.old_to_new_track_map, + tracking_src->act_plane_track); + BLI_assert(tracking_dst->act_plane_track != NULL); } - /* Warning! Will override tracks_mapping. */ - tracking_objects_copy(&tracking_dst->objects, &tracking_src->objects, tracks_mapping, flag); + tracking_copy_context_delete(&ctx); + + tracking_objects_copy(&tracking_dst->objects, &tracking_src->objects, flag); /* Those remaining are runtime data, they will be reconstructed as needed, * do not bother copying them. */ @@ -298,8 +321,6 @@ void BKE_tracking_copy(MovieTracking *tracking_dst, tracking_dst->camera.intrinsics = NULL; tracking_dst->stats = NULL; - - BLI_ghash_free(tracks_mapping, NULL, NULL); } void BKE_tracking_settings_init(MovieTracking *tracking) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs