[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