[Bf-blender-cvs] [4d497721ecd] master: Refactor: Streamline tracking data copying a bit
Sergey Sharybin
noreply at git.blender.org
Tue Nov 22 11:54:21 CET 2022
Commit: 4d497721ecd11f08b832c6b083b1ecc45f692279
Author: Sergey Sharybin
Date: Thu Oct 6 16:52:23 2022 +0200
Branches: master
https://developer.blender.org/rB4d497721ecd11f08b832c6b083b1ecc45f692279
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)
More information about the Bf-blender-cvs
mailing list