[Bf-blender-cvs] [66de653784a] master: Fix incorrect strip position if pitch was animated

Richard Antalik noreply at git.blender.org
Thu Jun 30 18:33:58 CEST 2022


Commit: 66de653784ab06ccea46413de6b2f086b5a69d30
Author: Richard Antalik
Date:   Thu Jun 30 18:26:14 2022 +0200
Branches: master
https://developer.blender.org/rB66de653784ab06ccea46413de6b2f086b5a69d30

Fix incorrect strip position if pitch was animated

Commit 302b04a5a3fc introduced new retiming system, that unified sound
pitch animation with strip speed control. Because sound playback is
handled in different way, this did not work as expected and old files
were broken. In addition animation was not copied to new property.

Revert length position and offset handling for sound strips so their
position does not change and remap fcurves to new `speed_factor`
property.

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

M	source/blender/blenloader/intern/versioning_300.c
M	source/blender/makesrna/intern/rna_sequencer.c
M	source/blender/sequencer/intern/strip_time.c

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

diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c
index 35b1367ca1e..f6cc413d220 100644
--- a/source/blender/blenloader/intern/versioning_300.c
+++ b/source/blender/blenloader/intern/versioning_300.c
@@ -595,6 +595,39 @@ static bNodeTree *add_realize_node_tree(Main *bmain)
   return node_tree;
 }
 
+static void seq_speed_factor_fix_rna_path(Sequence *seq, ListBase *fcurves)
+{
+  char name_esc[(sizeof(seq->name) - 2) * 2];
+  BLI_str_escape(name_esc, seq->name + 2, sizeof(name_esc));
+  char *path = BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].pitch", name_esc);
+  FCurve *fcu = BKE_fcurve_find(&fcurves, path, 0);
+  if (fcu != NULL) {
+    MEM_freeN(fcu->rna_path);
+    fcu->rna_path = BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].speed_factor", name_esc);
+  }
+  MEM_freeN(path);
+}
+
+static bool seq_speed_factor_set(Sequence *seq, void *user_data)
+{
+  const Scene *scene = user_data;
+  if (seq->type == SEQ_TYPE_SOUND_RAM) {
+    /* Move `pitch` animation to `speed_factor` */
+    if (scene->adt && scene->adt->action) {
+      seq_speed_factor_fix_rna_path(seq, &scene->adt->action->curves);
+    }
+    if (scene->adt && !BLI_listbase_is_empty(&scene->adt->drivers)) {
+      seq_speed_factor_fix_rna_path(seq, &scene->adt->drivers);
+    }
+
+    seq->speed_factor = seq->pitch;
+  }
+  else {
+    seq->speed_factor = 1.0f;
+  }
+  return true;
+}
+
 void do_versions_after_linking_300(Main *bmain, ReportList *UNUSED(reports))
 {
   if (MAIN_VERSION_ATLEAST(bmain, 300, 0) && !MAIN_VERSION_ATLEAST(bmain, 300, 1)) {
@@ -819,6 +852,17 @@ void do_versions_after_linking_300(Main *bmain, ReportList *UNUSED(reports))
       }
     }
   }
+
+  if (!MAIN_VERSION_ATLEAST(bmain, 303, 5)) {
+    LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
+      Editing *ed = SEQ_editing_get(scene);
+      if (ed == NULL) {
+        continue;
+      }
+      SEQ_for_each_callback(&ed->seqbase, seq_speed_factor_set, scene);
+    }
+  }
+
   /**
    * Versioning code until next subversion bump goes here.
    *
@@ -1235,17 +1279,6 @@ static bool version_merge_still_offsets(Sequence *seq, void *UNUSED(user_data))
   return true;
 }
 
-static bool seq_speed_factor_set(Sequence *seq, void *UNUSED(user_data))
-{
-  if (seq->type == SEQ_TYPE_SOUND_RAM) {
-    seq->speed_factor = seq->pitch;
-  }
-  else {
-    seq->speed_factor = 1.0f;
-  }
-  return true;
-}
-
 /* Those `version_liboverride_rnacollections_*` functions mimic the old, pre-3.0 code to find
  * anchor and source items in the given list of modifiers, constraints etc., using only the
  * `subitem_local` data of the override property operation.
@@ -3223,14 +3256,6 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
         }
       }
     }
-
-    LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
-      Editing *ed = SEQ_editing_get(scene);
-      if (ed == NULL) {
-        continue;
-      }
-      SEQ_for_each_callback(&ed->seqbase, seq_speed_factor_set, NULL);
-    }
   }
   /**
    * Versioning code until next subversion bump goes here.
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c
index f9dfb8544ca..04037a64426 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -2331,7 +2331,6 @@ static void rna_def_speed_factor(StructRNA *srna)
   RNA_def_property_float_default(prop, 1.0f);
   RNA_def_property_range(prop, 0.1f, FLT_MAX);
   RNA_def_property_ui_range(prop, 1.0f, 100.0f, 10.0, 3);
-  RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
   RNA_def_property_ui_text(prop, "Speed Factor", "Multiply playback speed");
   RNA_def_property_float_funcs(
       prop, NULL, "rna_Sequence_speed_factor_set", NULL); /* overlap test */
diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c
index d4357fe28b6..aa51813c9b8 100644
--- a/source/blender/sequencer/intern/strip_time.c
+++ b/source/blender/sequencer/intern/strip_time.c
@@ -437,15 +437,20 @@ bool SEQ_time_strip_intersects_frame(const Scene *scene,
 
 void SEQ_time_speed_factor_set(const Scene *scene, Sequence *seq, const float speed_factor)
 {
-  const float left_handle_frame = SEQ_time_left_handle_frame_get(scene, seq);
-  const float unity_start_offset = seq->startofs * seq->speed_factor;
-  const float unity_end_offset = seq->endofs * seq->speed_factor;
 
-  /* Left handle is pivot point for content scaling - it must always show same frame. */
-  seq->speed_factor = speed_factor;
-  seq->startofs = unity_start_offset / speed_factor;
-  seq->start = left_handle_frame - seq->startofs;
-  seq->endofs = unity_end_offset / speed_factor;
+  if (seq->type == SEQ_TYPE_SOUND_RAM) {
+    seq->speed_factor = speed_factor;
+  }
+  else {
+    const float left_handle_frame = SEQ_time_left_handle_frame_get(scene, seq);
+    const float unity_start_offset = seq->startofs * seq->speed_factor;
+    const float unity_end_offset = seq->endofs * seq->speed_factor;
+    /* Left handle is pivot point for content scaling - it must always show same frame. */
+    seq->speed_factor = speed_factor;
+    seq->startofs = unity_start_offset / speed_factor;
+    seq->start = left_handle_frame - seq->startofs;
+    seq->endofs = unity_end_offset / speed_factor;
+  }
 
   SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq));
   seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq));
@@ -471,6 +476,10 @@ bool SEQ_time_has_still_frames(const Scene *scene, const Sequence *seq)
  * factor */
 int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq)
 {
+  if (seq->type == SEQ_TYPE_SOUND_RAM) {
+    return seq->len;
+  }
+
   return seq->len / seq_time_playback_rate_factor_get(scene, seq);
 }



More information about the Bf-blender-cvs mailing list