[Bf-blender-cvs] [edbbe3bcbc3] tracking_scopes: Tracking: Implement previous/next keyframe scopes

Sergey Sharybin noreply at git.blender.org
Mon Mar 1 15:58:22 CET 2021


Commit: edbbe3bcbc3edd2bd57a7e86bcba5a6771bd21a6
Author: Sergey Sharybin
Date:   Mon Feb 22 16:30:47 2021 +0100
Branches: tracking_scopes
https://developer.blender.org/rBedbbe3bcbc3edd2bd57a7e86bcba5a6771bd21a6

Tracking: Implement previous/next keyframe scopes

The purpose of these scopes is to give more visual reference to a VFX artist:
this way the artist can (re)position the marker more accurately when it starts
to slide. Before this change it was always more of a guess work about where
exactly the marker was at the previous keyframe.

There are some weak aspects of the patch related on some rather annoying
duplicated lines about calling an utility function for each of 3 scopes.
Ideally there needs to be some sort of foreach scope utility, but it is not as
trivial as it sounds since the editors implementation code is in ED module,
which is not available by blenloader and blenkernel.

The interface aspects still needs some work. Currently it is 3 scopes placed in
one column. Maybe it needs to be a flow, or some collapsable box?

Differential Revision: https://developer.blender.org/D10567

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

M	release/scripts/startup/bl_ui/space_clip.py
M	source/blender/blenkernel/BKE_movieclip.h
M	source/blender/blenkernel/intern/movieclip.c
M	source/blender/blenkernel/intern/screen.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_290.c
M	source/blender/editors/include/ED_clip.h
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/space_clip/clip_editor.c
M	source/blender/editors/space_clip/clip_intern.h
M	source/blender/editors/space_clip/clip_utils.c
M	source/blender/editors/space_clip/space_clip.c
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index 96920af1c7e..bfdc941f8f4 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -729,7 +729,17 @@ class CLIP_PT_track(CLIP_PT_tracking_panel, Panel):
         icon = 'LOCKED' if act_track.lock else 'UNLOCKED'
         sub.prop(act_track, "lock", text="", icon=icon)
 
-        layout.template_track(sc, "scopes")
+        col = layout.column()
+        col.label(text="Previous Keyframe")
+        col.template_track(sc, "scopes_prev")
+
+        col = layout.column()
+        col.label(text="Current Marker")
+        col.template_track(sc, "scopes")
+
+        col = layout.column()
+        col.label(text="Next Marker")
+        col.template_track(sc, "scopes_next")
 
         row = layout.row(align=True)
         sub = row.row(align=True)
diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h
index d33eabeb7e0..bf681b38bda 100644
--- a/source/blender/blenkernel/BKE_movieclip.h
+++ b/source/blender/blenkernel/BKE_movieclip.h
@@ -71,9 +71,35 @@ void BKE_movieclip_get_aspect(struct MovieClip *clip, float *aspx, float *aspy);
 bool BKE_movieclip_has_frame(struct MovieClip *clip, struct MovieClipUser *user);
 void BKE_movieclip_user_set_frame(struct MovieClipUser *user, int framenr);
 
-void BKE_movieclip_update_scopes(struct MovieClip *clip,
+/* -------------------------------------------------------------------- */
+/** \name Scopes
+ * \{ */
+
+typedef enum eScopesMarkerReference {
+  /* User marker which is a reference for the current frame from the "left" side. */
+  MOVIE_CLIP_SCOPES_REFERENCE_PREVIOUS,
+
+  /* Use marker from the current clip position. */
+  MOVIE_CLIP_SCOPES_REFERENCE_CURRENT,
+
+  /* User marker which is a reference for the current frame from the "right" side. */
+  MOVIE_CLIP_SCOPES_REFERENCE_NEXT,
+} eScopesMarkerReference;
+
+void BKE_movieclip_scopes_update(struct MovieClip *clip,
                                  struct MovieClipUser *user,
-                                 struct MovieClipScopes *scopes);
+                                 struct MovieClipScopes *scopes,
+                                 const eScopesMarkerReference reference);
+
+/* Initialize scopes settings to their desired defaults for a new space clip.
+ *
+ * NOTE: Overrides existing settings in the scopes. */
+void BKE_movieclip_scopes_init_defaults(struct MovieClipScopes *scopes);
+
+/* Reset any runtime fields (such as pointers) and tag the scopes for a update. */
+void BKE_movieclip_scopes_reset_runtime(struct MovieClipScopes *scopes);
+
+/** \} */
 
 void BKE_movieclip_get_cache_segments(struct MovieClip *clip,
                                       struct MovieClipUser *user,
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index 017a73593ee..6945e2bfbc6 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -1709,7 +1709,82 @@ void BKE_movieclip_reload(Main *bmain, MovieClip *clip)
   }
 }
 
-void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClipScopes *scopes)
+/* Get marker which acts as a keyframe for the current one and has lower frame than the given
+ * one.
+ *
+ * If there is no such keyframed marker `NULL` is returned.
+ *
+ * TODO(sergey): Move to BKE so that proportional editing patch can use this function as well. */
+static MovieTrackingMarker *marker_previous_keyframe_get(MovieTrackingTrack *track,
+                                                         MovieTrackingMarker *marker)
+{
+  /* Start with the previous marker, so that if the current marker is a keyframe by itself it is
+   * not used as a result. */
+  MovieTrackingMarker *marker_it = marker - 1;
+
+  while (marker_it >= track->markers) {
+    if (marker_it->flag & MARKER_DISABLED) {
+      return NULL;
+    }
+    if ((marker_it->flag & MARKER_TRACKED) == 0) {
+      return marker_it;
+    }
+    --marker_it;
+  }
+
+  return NULL;
+}
+
+static MovieTrackingMarker *marker_next_keyframe_get(MovieTrackingTrack *track,
+                                                     MovieTrackingMarker *marker)
+{
+  /* Start with the next marker, so that if the current marker is a keyframe by itself it is
+   * not used as a result. */
+  MovieTrackingMarker *marker_it = marker + 1;
+
+  const MovieTrackingMarker *marker_end = track->markers + track->markersnr;
+
+  while (marker_it < marker_end) {
+    if (marker_it->flag & MARKER_DISABLED) {
+      return NULL;
+    }
+    if ((marker_it->flag & MARKER_TRACKED) == 0) {
+      return marker_it;
+    }
+    ++marker_it;
+  }
+
+  return NULL;
+}
+
+static MovieTrackingMarker *reference_marker_for_scopes_get(MovieClip *clip,
+                                                            MovieClipUser *user,
+                                                            MovieTrackingTrack *track,
+                                                            const eScopesMarkerReference reference)
+{
+  const int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, user->framenr);
+  MovieTrackingMarker *current_marker = BKE_tracking_marker_get(track, clip_framenr);
+
+  switch (reference) {
+    case MOVIE_CLIP_SCOPES_REFERENCE_PREVIOUS:
+      return marker_previous_keyframe_get(track, current_marker);
+
+    case MOVIE_CLIP_SCOPES_REFERENCE_CURRENT:
+      return current_marker;
+
+    case MOVIE_CLIP_SCOPES_REFERENCE_NEXT:
+      return marker_next_keyframe_get(track, current_marker);
+  }
+
+  BLI_assert(!"Unhandled marker reference, should never happen.");
+
+  return NULL;
+}
+
+void BKE_movieclip_scopes_update(MovieClip *clip,
+                                 MovieClipUser *user,
+                                 MovieClipScopes *scopes,
+                                 const eScopesMarkerReference reference)
 {
   if (scopes->ok) {
     return;
@@ -1741,8 +1816,10 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip
     return;
   }
 
-  const int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, user->framenr);
-  MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
+  MovieTrackingMarker *marker = reference_marker_for_scopes_get(clip, user, track, reference);
+  if (marker == NULL) {
+    return;
+  }
 
   scopes->marker = marker;
   scopes->track = track;
@@ -1751,7 +1828,10 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip
     scopes->track_disabled = true;
   }
   else {
-    ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, user);
+    MovieClipUser marker_user = *user;
+    marker_user.framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
+
+    ImBuf *ibuf = BKE_movieclip_get_ibuf(clip, &marker_user);
 
     scopes->track_disabled = false;
 
@@ -1801,6 +1881,27 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip
     scopes->slide_scale[0] = pat_max[0] - pat_min[0];
     scopes->slide_scale[1] = pat_max[1] - pat_min[1];
   }
+
+  /* Disallow modifying marker of the references: they are not easily visible
+   * within their context so their modification is kind of not possible in an
+   * accurate manner.
+   * If really needed or requested by artists. this can be supported, but then
+   * the event handling code would need to be updated accordingly. */
+  if (reference != MOVIE_CLIP_SCOPES_REFERENCE_CURRENT) {
+    scopes->track_locked = true;
+  }
+}
+
+void BKE_movieclip_scopes_init_defaults(MovieClipScopes *scopes)
+{
+  scopes->track_preview_height = 120;
+}
+
+void BKE_movieclip_scopes_reset_runtime(MovieClipScopes *scopes)
+{
+  scopes->track_search = NULL;
+  scopes->track_preview = NULL;
+  scopes->ok = false;
 }
 
 static void movieclip_build_proxy_ibuf(
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 8b911143668..f036410a48a 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -59,6 +59,7 @@
 #include "BKE_idtype.h"
 #include "BKE_lib_id.h"
 #include "BKE_lib_query.h"
+#include "BKE_movieclip.h"
 #include "BKE_node.h"
 #include "BKE_screen.h"
 #include "BKE_workspace.h"
@@ -1685,11 +1686,11 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area)
       BLO_read_data_address(reader, &sfile->asset_params);
     }
     else if (sl->spacetype == SPACE_CLIP) {
-      SpaceClip *sclip = (SpaceClip *)sl;
+      SpaceClip *space_clip = (SpaceClip *)sl;
 
-      sclip->scopes.track_search = NULL;
-      sclip->scopes.track_preview = NULL;
-      sclip->scopes.ok = 0;
+      BKE_movieclip_scopes_reset_runtime(&space_clip->scopes);
+      BKE_movieclip_scopes_reset_runtime(&space_clip->scopes_prev);
+      BKE_movieclip_scopes_reset_runtime(&space_clip->scopes_next);
     }
   }
 
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index c0293c1f8f2..88f91ee3604 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -88,6 +88,7 @@
 #include "BKE_main_idmap.h"
 #include "BKE_material.h"
 #include "BKE_modifier.h"
+#include "BKE_movieclip.h"
 #include "BKE_node.h" /* for tree type defines */
 #include "BKE_object.h"
 #include "BKE_packedFile.h"
@@ -2981,7 +2982,9 @@ static void lib_link_workspace_layout_restore(struct IDNameLib_Map *id_map,
           sclip->mask_info.mask = restore_pointer_by_name(
               id_map, (ID *)sclip->mask_info.mask, USER_REAL);
 
-          sclip->scopes.ok = 0;
+          BKE_movieclip_scopes_reset_runtime(&sclip->scopes);
+          BKE_movieclip_scopes_reset_runtime(&sclip->scopes_next);
+          BKE_movieclip_scopes_reset_runtime(&sclip->scopes_prev);
         }
       }
     }
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index b05d5ae7d26..7b33ece9ed7 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -59,6 +59,7 @@
 #include "BKE

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list