Refactor: Streamline tracking data copying a bit

Prepare the code to more easily support pointers remapping
for tracking objects.

Should be no functional changes.
This commit is contained in:
Sergey Sharybin
2022-10-06 16:52:23 +02:00
parent 3c479b9823
commit 4d497721ec

View File

@@ -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)