[Bf-blender-cvs] [fe38715600c] master: Refactor: Unify storage for motion tracking camera and objects

Sergey Sharybin noreply at git.blender.org
Tue Nov 22 11:54:22 CET 2022


Commit: fe38715600c8c22d67c32275bb1e23352fdc553a
Author: Sergey Sharybin
Date:   Tue Oct 4 17:39:57 2022 +0200
Branches: master
https://developer.blender.org/rBfe38715600c8c22d67c32275bb1e23352fdc553a

Refactor: Unify storage for motion tracking camera and objects

Historically tracks and reconstruction for motion tracking camera
object were stored in the motion tracking structure. This is because
the data structures pre-dates object tracking support, and it was
never changed to preserve compatibility.

Now the compatibility code supports more tricks and allows to change
the ownership without breaking any compatibility. This is what this
change does: it moves tracks from motion tracking structure to the
motion tracking camera object, and does it in a way that no
compatibility is broken.

One of the side-effects of this change is that the active track is
now stored on motion tracking object level, which allows to change
active motion tracking object without loosing active track. Other
than that there are no expected user-level changes.

===================================================================

M	source/blender/blenkernel/BKE_tracking.h
M	source/blender/blenkernel/intern/movieclip.c
M	source/blender/blenkernel/intern/tracking.c
M	source/blender/blenkernel/intern/tracking_solver.c
M	source/blender/blenkernel/intern/tracking_stabilize.c
M	source/blender/blenkernel/intern/tracking_util.c
M	source/blender/blenkernel/tracking_private.h
M	source/blender/blenloader/intern/versioning_260.c
M	source/blender/blenloader/intern/versioning_400.cc
M	source/blender/editors/space_clip/clip_dopesheet_ops.c
M	source/blender/editors/space_clip/clip_graph_ops.c
M	source/blender/editors/space_clip/clip_utils.c
M	source/blender/editors/space_clip/tracking_ops.c
M	source/blender/editors/space_clip/tracking_ops_plane.c
M	source/blender/editors/space_clip/tracking_select.c
M	source/blender/makesdna/DNA_tracking_types.h
M	source/blender/makesdna/intern/dna_rename_defs.h
M	source/blender/makesrna/intern/rna_tracking.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index 32de8545313..b34403b3033 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -839,7 +839,7 @@ void BKE_tracking_get_rna_path_prefix_for_plane_track(
 
 #define MARKER_VISIBLE(sc, track, marker) \
   (((marker)->flag & MARKER_DISABLED) == 0 || ((sc)->flag & SC_HIDE_DISABLED) == 0 || \
-   ((sc)->clip->tracking.act_track == track))
+   (BKE_tracking_track_get_active(&(sc)->clip->tracking) == track))
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index 9945f896972..dd2a9f582cf 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -69,6 +69,10 @@
 
 #include "BLO_read_write.h"
 
+/* Convert camera object to legacy format where the camera tracks are stored in the MovieTracking
+ * structure when saving .blend file. */
+#define USE_LEGACY_CAMERA_OBJECT_FORMAT_ON_SAVE 1
+
 static void free_buffers(MovieClip *clip);
 
 static void movie_clip_init_data(ID *id)
@@ -117,18 +121,11 @@ static void movie_clip_foreach_id(ID *id, LibraryForeachIDData *data)
 
   BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, movie_clip->gpd, IDWALK_CB_USER);
 
-  LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking->tracks) {
-    BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, track->gpd, IDWALK_CB_USER);
-  }
   LISTBASE_FOREACH (MovieTrackingObject *, object, &tracking->objects) {
     LISTBASE_FOREACH (MovieTrackingTrack *, track, &object->tracks) {
       BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, track->gpd, IDWALK_CB_USER);
     }
   }
-
-  LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking->plane_tracks) {
-    BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, plane_track->image, IDWALK_CB_USER);
-  }
 }
 
 static void movie_clip_foreach_cache(ID *id,
@@ -200,7 +197,29 @@ static void movieclip_blend_write(BlendWriter *writer, ID *id, const void *id_ad
   clip->tracking.stats = NULL;
 
   MovieTracking *tracking = &clip->tracking;
-  MovieTrackingObject *object;
+
+#if USE_LEGACY_CAMERA_OBJECT_FORMAT_ON_SAVE
+  const bool is_undo = BLO_write_is_undo(writer);
+
+  /* When using legacy format for camera object assign the list of camera tracks to the
+   * MovieTracking object. Do it in-place as it simplifies the code a bit, and it is not
+   * supposed to cause threading issues as no other code is meant to access the legacy fields. */
+  if (!is_undo) {
+    MovieTrackingObject *active_tracking_object = BKE_tracking_object_get_active(tracking);
+    MovieTrackingObject *tracking_camera_object = BKE_tracking_object_get_camera(tracking);
+    BLI_assert(active_tracking_object != NULL);
+    BLI_assert(tracking_camera_object != NULL);
+
+    tracking->tracks_legacy = tracking_camera_object->tracks;
+    tracking->plane_tracks_legacy = tracking_camera_object->plane_tracks;
+
+    /* The active track in the tracking structure used to be shared across all tracking objects. */
+    tracking->act_track_legacy = active_tracking_object->active_track;
+    tracking->act_plane_track_legacy = active_tracking_object->active_plane_track;
+
+    tracking->reconstruction_legacy = tracking_camera_object->reconstruction;
+  }
+#endif
 
   BLO_write_id_struct(writer, MovieClip, id_address, &clip->id);
   BKE_id_blend_write(writer, &clip->id);
@@ -209,20 +228,40 @@ static void movieclip_blend_write(BlendWriter *writer, ID *id, const void *id_ad
     BKE_animdata_blend_write(writer, clip->adt);
   }
 
-  write_movieTracks(writer, &tracking->tracks);
-  write_moviePlaneTracks(writer, &tracking->plane_tracks);
-  write_movieReconstruction(writer, &tracking->reconstruction);
-
-  object = tracking->objects.first;
-  while (object) {
-    BLO_write_struct(writer, MovieTrackingObject, object);
+  LISTBASE_FOREACH (MovieTrackingObject *, object, &tracking->objects) {
+#if USE_LEGACY_CAMERA_OBJECT_FORMAT_ON_SAVE
+    /* When saving camers object in the legacy format clear the list of tracks. This is because the
+     * tracking object code is generic and assumes object owns the tracks in the list. For the
+     * camera tracks that is not the case in the legacy format. */
+    if (!is_undo && (object->flag & TRACKING_OBJECT_CAMERA)) {
+      MovieTrackingObject legacy_object = *object;
+      BLI_listbase_clear(&legacy_object.tracks);
+      BLI_listbase_clear(&legacy_object.plane_tracks);
+      legacy_object.active_track = NULL;
+      legacy_object.active_plane_track = NULL;
+      memset(&legacy_object.reconstruction, 0, sizeof(legacy_object.reconstruction));
+      BLO_write_struct_at_address(writer, MovieTrackingObject, object, &legacy_object);
+    }
+    else
+#endif
+    {
+      BLO_write_struct(writer, MovieTrackingObject, object);
+    }
 
     write_movieTracks(writer, &object->tracks);
     write_moviePlaneTracks(writer, &object->plane_tracks);
     write_movieReconstruction(writer, &object->reconstruction);
+  }
 
-    object = object->next;
+#if USE_LEGACY_CAMERA_OBJECT_FORMAT_ON_SAVE
+  if (!is_undo) {
+    BLI_listbase_clear(&tracking->tracks_legacy);
+    BLI_listbase_clear(&tracking->plane_tracks_legacy);
+    tracking->act_track_legacy = NULL;
+    tracking->act_plane_track_legacy = NULL;
+    memset(&tracking->reconstruction_legacy, 0, sizeof(tracking->reconstruction_legacy));
   }
+#endif
 }
 
 static void direct_link_movieReconstruction(BlendDataReader *reader,
@@ -262,12 +301,12 @@ static void movieclip_blend_read_data(BlendDataReader *reader, ID *id)
   BLO_read_data_address(reader, &clip->adt);
   BKE_animdata_blend_read_data(reader, clip->adt);
 
-  direct_link_movieTracks(reader, &tracking->tracks);
-  direct_link_moviePlaneTracks(reader, &tracking->plane_tracks);
-  direct_link_movieReconstruction(reader, &tracking->reconstruction);
+  direct_link_movieTracks(reader, &tracking->tracks_legacy);
+  direct_link_moviePlaneTracks(reader, &tracking->plane_tracks_legacy);
+  direct_link_movieReconstruction(reader, &tracking->reconstruction_legacy);
 
-  BLO_read_data_address(reader, &clip->tracking.act_track);
-  BLO_read_data_address(reader, &clip->tracking.act_plane_track);
+  BLO_read_data_address(reader, &clip->tracking.act_track_legacy);
+  BLO_read_data_address(reader, &clip->tracking.act_plane_track_legacy);
 
   clip->anim = NULL;
   clip->tracking_context = NULL;
@@ -290,6 +329,9 @@ static void movieclip_blend_read_data(BlendDataReader *reader, ID *id)
     direct_link_movieTracks(reader, &object->tracks);
     direct_link_moviePlaneTracks(reader, &object->plane_tracks);
     direct_link_movieReconstruction(reader, &object->reconstruction);
+
+    BLO_read_data_address(reader, &object->active_track);
+    BLO_read_data_address(reader, &object->active_plane_track);
   }
 }
 
@@ -316,9 +358,6 @@ static void movieclip_blend_read_lib(BlendLibReader *reader, ID *id)
 
   BLO_read_id_address(reader, clip->id.lib, &clip->gpd);
 
-  lib_link_movieTracks(reader, clip, &tracking->tracks);
-  lib_link_moviePlaneTracks(reader, clip, &tracking->plane_tracks);
-
   LISTBASE_FOREACH (MovieTrackingObject *, object, &tracking->objects) {
     lib_link_movieTracks(reader, clip, &object->tracks);
     lib_link_moviePlaneTracks(reader, clip, &object->plane_tracks);
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index 2a7ebe2a421..b953c160dbc 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -149,9 +149,6 @@ static void tracking_dopesheet_free(MovieTrackingDopesheet *dopesheet)
 
 void BKE_tracking_free(MovieTracking *tracking)
 {
-  tracking_tracks_free(&tracking->tracks);
-  tracking_plane_tracks_free(&tracking->plane_tracks);
-  tracking_reconstruction_free(&tracking->reconstruction);
   tracking_objects_free(&tracking->objects);
 
   if (tracking->camera.intrinsics) {
@@ -247,8 +244,7 @@ static void tracking_reconstruction_copy(TrackingCopyContext *UNUSED(ctx),
 }
 
 /* Copy stabilization structure. */
-static void tracking_stabilization_copy(TrackingCopyContext *UNUSED(ctx),
-                                        MovieTrackingStabilization *stabilization_dst,
+static void tracking_stabilization_copy(MovieTrackingStabilization *stabilization_dst,
                                         const MovieTrackingStabilization *stabilization_src,
                                         const int UNUSED(flag))
 {
@@ -268,6 +264,17 @@ static void tracking_object_copy(MovieTrackingObject *object_dst,
   tracking_reconstruction_copy(
       &ctx, &object_dst->reconstruction, &object_src->reconstruction, flag);
 
+  if (object_src->active_track) {
+    object_dst->active_track = BLI_ghash_lookup(ctx.old_to_new_track_map,
+                                                object_src->active_track);
+    BLI_assert(object_dst->active_track != NULL);
+  }
+  if (object_src->active_plane_track) {
+    object_dst->active_plane_track = BLI_ghash_lookup(ctx.old_to_new_track_map,
+                                                      object_src->active_plane_track);
+    BLI_assert(object_dst->active_plane_track != NULL);
+  }
+
   tracking_copy_context_delete(&ctx);
 }
 
@@ -291,25 +298,7 @@ void BKE_tracking_copy(MovieTracking *tracking_dst,
 {
   *tracking_dst = *tracking_src;
 
-  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(ctx.old_to_new_track_map, tracking_src->act_track);
-    BLI_assert(tracking_dst->act_track != NULL);
-  }
-  if (tracking_src->act_plane_track) {
-    tracking_dst->act_plane_track = BLI_ghash_lookup(ctx.old_to_new_track_map,
-                                                     tracking

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list