[Bf-blender-cvs] [f7a14c116c4] master: VSE: Move whole strip chain to meta

Richard Antalik noreply at git.blender.org
Tue May 18 23:42:50 CEST 2021


Commit: f7a14c116c4de9a0ac2a07d7c6fa3097a018a668
Author: Richard Antalik
Date:   Tue May 18 23:28:00 2021 +0200
Branches: master
https://developer.blender.org/rBf7a14c116c4de9a0ac2a07d7c6fa3097a018a668

VSE: Move whole strip chain to meta

Python API function Sequence.move_to_meta() did delete effect chain
when strip with effects was moved.

Use iterator API to query effect strips and move whole chain to meta.

Reviewed By: sergey

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

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

M	source/blender/editors/space_sequencer/sequencer_select.c
M	source/blender/sequencer/SEQ_iterator.h
M	source/blender/sequencer/intern/iterator.c
M	source/blender/sequencer/intern/strip_edit.c

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

diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index e08af8f0977..3128ec06b68 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -1621,37 +1621,6 @@ static bool select_grouped_time_overlap(Editing *ed, Sequence *actseq)
   return changed;
 }
 
-/* Query all effect strips that are directly or indirectly connected to seq_reference. */
-static void query_strip_effect_chain(Sequence *seq_reference,
-                                     ListBase *seqbase,
-                                     SeqCollection *collection)
-{
-  if (!SEQ_collection_append_strip(seq_reference, collection)) {
-    return; /* Strip is already in set, so all effects connected to it are as well. */
-  }
-
-  /* Find all strips that seq_reference is connected to. */
-  if (seq_reference->type & SEQ_TYPE_EFFECT) {
-    if (seq_reference->seq1) {
-      query_strip_effect_chain(seq_reference->seq1, seqbase, collection);
-    }
-    if (seq_reference->seq2) {
-      query_strip_effect_chain(seq_reference->seq2, seqbase, collection);
-    }
-    if (seq_reference->seq3) {
-      query_strip_effect_chain(seq_reference->seq3, seqbase, collection);
-    }
-  }
-
-  /* Find all strips connected to seq_reference. */
-  LISTBASE_FOREACH (Sequence *, seq_test, seqbase) {
-    if (seq_test->seq1 == seq_reference || seq_test->seq2 == seq_reference ||
-        seq_test->seq3 == seq_reference) {
-      query_strip_effect_chain(seq_test, seqbase, collection);
-    }
-  }
-}
-
 /* Query strips that are in lower channel and intersect in time with seq_reference. */
 static void query_lower_channel_strips(Sequence *seq_reference,
                                        ListBase *seqbase,
@@ -1681,7 +1650,7 @@ static bool select_grouped_effect_link(Editing *ed,
   SeqCollection *collection = SEQ_query_selected_strips(seqbase);
   const int selected_strip_count = BLI_gset_len(collection->set);
   SEQ_collection_expand(seqbase, collection, query_lower_channel_strips);
-  SEQ_collection_expand(seqbase, collection, query_strip_effect_chain);
+  SEQ_collection_expand(seqbase, collection, SEQ_query_strip_effect_chain);
 
   /* Check if other strips will be affected. */
   const bool changed = BLI_gset_len(collection->set) > selected_strip_count;
diff --git a/source/blender/sequencer/SEQ_iterator.h b/source/blender/sequencer/SEQ_iterator.h
index b4068bac1d0..5f0836f5ca9 100644
--- a/source/blender/sequencer/SEQ_iterator.h
+++ b/source/blender/sequencer/SEQ_iterator.h
@@ -86,6 +86,9 @@ SeqCollection *SEQ_query_by_reference(struct Sequence *seq_reference,
                                                           SeqCollection *collection));
 SeqCollection *SEQ_query_selected_strips(struct ListBase *seqbase);
 SeqCollection *SEQ_query_all_strips_recursive(ListBase *seqbase);
+void SEQ_query_strip_effect_chain(struct Sequence *seq_reference,
+                                  struct ListBase *seqbase,
+                                  SeqCollection *collection);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/sequencer/intern/iterator.c b/source/blender/sequencer/intern/iterator.c
index e49594f91f5..5225fc925e8 100644
--- a/source/blender/sequencer/intern/iterator.c
+++ b/source/blender/sequencer/intern/iterator.c
@@ -230,3 +230,42 @@ SeqCollection *SEQ_query_selected_strips(ListBase *seqbase)
   }
   return collection;
 }
+
+/**
+ * Query all effect strips that are directly or indirectly connected to seq_reference.
+ * This includes all effects of seq_reference, strips used by another inputs and their effects, so
+ * that whole chain is fully independent of other strips.
+ *
+ * \param seq_reference: reference strip
+ * \param seqbase: ListBase in which strips are queried
+ * \param collection: collection to be filled
+ */
+void SEQ_query_strip_effect_chain(Sequence *seq_reference,
+                                  ListBase *seqbase,
+                                  SeqCollection *collection)
+{
+  if (!SEQ_collection_append_strip(seq_reference, collection)) {
+    return; /* Strip is already in set, so all effects connected to it are as well. */
+  }
+
+  /* Find all strips that seq_reference is connected to. */
+  if (seq_reference->type & SEQ_TYPE_EFFECT) {
+    if (seq_reference->seq1) {
+      SEQ_query_strip_effect_chain(seq_reference->seq1, seqbase, collection);
+    }
+    if (seq_reference->seq2) {
+      SEQ_query_strip_effect_chain(seq_reference->seq2, seqbase, collection);
+    }
+    if (seq_reference->seq3) {
+      SEQ_query_strip_effect_chain(seq_reference->seq3, seqbase, collection);
+    }
+  }
+
+  /* Find all strips connected to seq_reference. */
+  LISTBASE_FOREACH (Sequence *, seq_test, seqbase) {
+    if (seq_test->seq1 == seq_reference || seq_test->seq2 == seq_reference ||
+        seq_test->seq3 == seq_reference) {
+      SEQ_query_strip_effect_chain(seq_test, seqbase, collection);
+    }
+  }
+}
diff --git a/source/blender/sequencer/intern/strip_edit.c b/source/blender/sequencer/intern/strip_edit.c
index f1d4592fdec..a26fb0244b6 100644
--- a/source/blender/sequencer/intern/strip_edit.c
+++ b/source/blender/sequencer/intern/strip_edit.c
@@ -43,6 +43,7 @@
 #include "SEQ_add.h"
 #include "SEQ_edit.h"
 #include "SEQ_effects.h"
+#include "SEQ_iterator.h"
 #include "SEQ_relations.h"
 #include "SEQ_sequencer.h"
 #include "SEQ_time.h"
@@ -251,22 +252,26 @@ bool SEQ_edit_move_strip_to_meta(Scene *scene,
     return false;
   }
 
-  /* Remove users of src_seq. Ideally these could be moved into meta as well, but this would be
-   * best to do with generalized iterator as described in D10337. */
-  sequencer_flag_users_for_removal(scene, seqbase, src_seq);
-  SEQ_edit_remove_flagged_sequences(scene, seqbase);
+  SeqCollection *collection = SEQ_collection_create();
+  SEQ_collection_append_strip(src_seq, collection);
+  SEQ_collection_expand(seqbase, collection, SEQ_query_strip_effect_chain);
 
-  /* Move to meta. */
-  BLI_remlink(seqbase, src_seq);
-  BLI_addtail(&dst_seqm->seqbase, src_seq);
-  SEQ_relations_invalidate_cache_preprocessed(scene, src_seq);
-
-  /* Update meta. */
-  SEQ_time_update_sequence(scene, dst_seqm);
-  if (SEQ_transform_test_overlap(&dst_seqm->seqbase, src_seq)) {
-    SEQ_transform_seqbase_shuffle(&dst_seqm->seqbase, src_seq, scene);
+  Sequence *seq;
+  SEQ_ITERATOR_FOREACH (seq, collection) {
+    /* Move to meta. */
+    BLI_remlink(seqbase, seq);
+    BLI_addtail(&dst_seqm->seqbase, seq);
+    SEQ_relations_invalidate_cache_preprocessed(scene, seq);
+
+    /* Update meta. */
+    SEQ_time_update_sequence(scene, dst_seqm);
+    if (SEQ_transform_test_overlap(&dst_seqm->seqbase, seq)) {
+      SEQ_transform_seqbase_shuffle(&dst_seqm->seqbase, seq, scene);
+    }
   }
 
+  SEQ_collection_free(collection);
+
   return true;
 }



More information about the Bf-blender-cvs mailing list