[Bf-blender-cvs] [9c78c8469f4] temp-vse-preview-transform: Limit transform and gizmos to strips that are selected and visible at current frame

Richard Antalik noreply at git.blender.org
Mon Aug 30 00:01:29 CEST 2021


Commit: 9c78c8469f427185c6622f8e7e575827c91155cf
Author: Richard Antalik
Date:   Thu Aug 26 08:49:50 2021 +0200
Branches: temp-vse-preview-transform
https://developer.blender.org/rB9c78c8469f427185c6622f8e7e575827c91155cf

Limit transform and gizmos to strips that are selected and visible at current frame

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

M	source/blender/editors/transform/transform.h
M	source/blender/editors/transform/transform_convert_sequencer_image.c
M	source/blender/editors/transform/transform_gizmo_2d.c
M	source/blender/sequencer/SEQ_iterator.h
M	source/blender/sequencer/intern/iterator.c
M	source/blender/sequencer/intern/render.c

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

diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 383953f0d5e..7094ca2ea38 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -97,7 +97,6 @@ typedef enum {
   CTX_OBMODE_XFORM_SKIP_CHILDREN = (1 << 14),
   /** Enable edge scrolling in 2D views */
   CTX_VIEW2D_EDGE_PAN = (1 << 15),
-  /* test */
 } eTContext;
 
 /** #TransInfo.flag */
diff --git a/source/blender/editors/transform/transform_convert_sequencer_image.c b/source/blender/editors/transform/transform_convert_sequencer_image.c
index 55d69da1a2d..28ae7914b2f 100644
--- a/source/blender/editors/transform/transform_convert_sequencer_image.c
+++ b/source/blender/editors/transform/transform_convert_sequencer_image.c
@@ -96,11 +96,12 @@ void createTransSeqImageData(TransInfo *t)
 {
   Editing *ed = SEQ_editing_get(t->scene, false);
   ListBase *seqbase = SEQ_active_seqbase_get(ed);
-  SeqCollection *selected_strips = SEQ_query_selected_strips(seqbase);
+  SeqCollection *strips = Seq_query_rendered_strips(seqbase, t->scene->r.cfra, 0);
+  SEQ_filter_selected_strips(strips);
 
-  const int count = SEQ_collection_len(selected_strips);
+  const int count = SEQ_collection_len(strips);
   if (ed == NULL || count == 0) {
-    SEQ_collection_free(selected_strips);
+    SEQ_collection_free(strips);
     return;
   }
 
@@ -112,13 +113,13 @@ void createTransSeqImageData(TransInfo *t)
   TransDataSeq *tdseq = MEM_callocN(tc->data_len * sizeof(TransDataSeq), "TransSeq TransDataSeq");
 
   Sequence *seq;
-  SEQ_ITERATOR_FOREACH (seq, selected_strips) {
+  SEQ_ITERATOR_FOREACH (seq, strips) {
     SeqToTransData(seq, td++, td2d++, tdseq++, 0);
     SeqToTransData(seq, td++, td2d++, tdseq++, 1);
     SeqToTransData(seq, td++, td2d++, tdseq++, 2);
   }
 
-  SEQ_collection_free(selected_strips);
+  SEQ_collection_free(strips);
 }
 
 void recalcData_sequencer_image(TransInfo *t)
diff --git a/source/blender/editors/transform/transform_gizmo_2d.c b/source/blender/editors/transform/transform_gizmo_2d.c
index f86d757294c..ce71c50a5ed 100644
--- a/source/blender/editors/transform/transform_gizmo_2d.c
+++ b/source/blender/editors/transform/transform_gizmo_2d.c
@@ -51,6 +51,7 @@
 
 #include "SEQ_iterator.h"
 #include "SEQ_sequencer.h"
+#include "SEQ_time.h"
 
 #include "transform.h" /* own include */
 
@@ -247,18 +248,19 @@ static float gizmo2d_calc_rotation(const bContext *C)
   Scene *scene = CTX_data_scene(C);
   Editing *ed = SEQ_editing_get(scene, false);
   ListBase *seqbase = SEQ_active_seqbase_get(ed);
-  SeqCollection *selected_strips = SEQ_query_selected_strips(seqbase);
+  SeqCollection *strips = Seq_query_rendered_strips(seqbase, scene->r.cfra, 0);
+  SEQ_filter_selected_strips(strips);
 
   Sequence *seq;
-  SEQ_ITERATOR_FOREACH (seq, selected_strips) {
+  SEQ_ITERATOR_FOREACH (seq, strips) {
     if (seq == ed->act_seq) {
       StripTransform *transform = seq->strip->transform;
-      SEQ_collection_free(selected_strips);
+      SEQ_collection_free(strips);
       return transform->rotation;
     }
   }
 
-  SEQ_collection_free(selected_strips);
+  SEQ_collection_free(strips);
   return 0.0f;
 }
 
@@ -276,24 +278,25 @@ static bool gizmo2d_calc_center(const bContext *C, float r_center[2])
   else if (area->spacetype == SPACE_SEQ) {
     Scene *scene = CTX_data_scene(C);
     ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene, false));
-    SeqCollection *selected_strips = SEQ_query_selected_strips(seqbase);
+    SeqCollection *strips = Seq_query_rendered_strips(seqbase, scene->r.cfra, 0);
+    SEQ_filter_selected_strips(strips);
 
-    if (SEQ_collection_len(selected_strips) <= 0) {
-      SEQ_collection_free(selected_strips);
+    if (SEQ_collection_len(strips) <= 0) {
+      SEQ_collection_free(strips);
       return false;
     }
 
     has_select = true;
     Sequence *seq;
-    SEQ_ITERATOR_FOREACH (seq, selected_strips) {
+    SEQ_ITERATOR_FOREACH (seq, strips) {
       StripTransform *transform = seq->strip->transform;
       r_center[0] += transform->xofs;
       r_center[1] += transform->yofs;
     }
-    r_center[0] /= SEQ_collection_len(selected_strips);
-    r_center[1] /= SEQ_collection_len(selected_strips);
+    r_center[0] /= SEQ_collection_len(strips);
+    r_center[1] /= SEQ_collection_len(strips);
 
-    SEQ_collection_free(selected_strips);
+    SEQ_collection_free(strips);
   }
   return has_select;
 }
diff --git a/source/blender/sequencer/SEQ_iterator.h b/source/blender/sequencer/SEQ_iterator.h
index 9fca25653e1..e17544b3973 100644
--- a/source/blender/sequencer/SEQ_iterator.h
+++ b/source/blender/sequencer/SEQ_iterator.h
@@ -82,11 +82,15 @@ SeqCollection *SEQ_query_by_reference(struct Sequence *seq_reference,
                                                           SeqCollection *collection));
 SeqCollection *SEQ_query_selected_strips(struct ListBase *seqbase);
 SeqCollection *SEQ_query_unselected_strips(struct ListBase *seqbase);
-SeqCollection *SEQ_query_all_strips(struct ListBase *seqbase);
-SeqCollection *SEQ_query_all_strips_recursive(struct ListBase *seqbase);
+SeqCollection *SEQ_query_all_strips(ListBase *seqbase);
+SeqCollection *SEQ_query_all_strips_recursive(ListBase *seqbase);
+SeqCollection *Seq_query_rendered_strips(ListBase *seqbase,
+                                         const int timeline_frame,
+                                         const int displayed_channel);
 void SEQ_query_strip_effect_chain(struct Sequence *seq_reference,
                                   struct ListBase *seqbase,
                                   SeqCollection *collection);
+void SEQ_filter_selected_strips(SeqCollection *collection);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/sequencer/intern/iterator.c b/source/blender/sequencer/intern/iterator.c
index 58f68205f51..b1b66b7c1b5 100644
--- a/source/blender/sequencer/intern/iterator.c
+++ b/source/blender/sequencer/intern/iterator.c
@@ -37,6 +37,8 @@
 #include "BKE_scene.h"
 
 #include "SEQ_iterator.h"
+#include "SEQ_time.h"
+#include "render.h"
 
 /* -------------------------------------------------------------------- */
 /** \Iterator API
@@ -340,6 +342,114 @@ SeqCollection *SEQ_query_selected_strips(ListBase *seqbase)
   return collection;
 }
 
+static SeqCollection *query_strips_at_frame(ListBase *seqbase, const int timeline_frame)
+{
+  SeqCollection *collection = SEQ_collection_create(__func__);
+
+  LISTBASE_FOREACH (Sequence *, seq, seqbase) {
+    if (SEQ_time_strip_intersects_frame(seq, timeline_frame)) {
+      SEQ_collection_append_strip(seq, collection);
+    }
+  }
+  return collection;
+}
+
+static void collection_filter_channel_up_to_incl(SeqCollection *collection, const int channel)
+{
+  Sequence *seq;
+  SEQ_ITERATOR_FOREACH (seq, collection) {
+    if (seq->machine <= channel) {
+      continue;
+    }
+    SEQ_collection_remove_strip(seq, collection);
+  }
+}
+
+static bool seq_is_effect_of(const Sequence *seq_effect, const Sequence *possibly_input)
+{
+  if (seq_effect->seq1 == possibly_input || seq_effect->seq2 == possibly_input ||
+      seq_effect->seq3 == possibly_input) {
+    return true;
+  }
+  return false;
+}
+
+/* Check if seq must be rendered. This depends on whole stack in some cases, not only seq itself.
+ * Order of applying these conditions is important. */
+static bool must_render_strip(const Sequence *seq, SeqCollection *strips_at_timeline_frame)
+{
+  bool seq_have_effect_in_stack = false;
+  Sequence *seq_iter;
+  SEQ_ITERATOR_FOREACH (seq_iter, strips_at_timeline_frame) {
+    /* Strips is below another strip with replace blending are not rendered. */
+    if (seq_iter->blend_mode == SEQ_BLEND_REPLACE && seq->machine < seq_iter->machine) {
+      return false;
+    }
+
+    if ((seq_iter->type & SEQ_TYPE_EFFECT) != 0 && seq_is_effect_of(seq_iter, seq)) {
+      /* Strips in same channel or higher than its effect are rendered. */
+      if (seq->machine >= seq_iter->machine) {
+        return true;
+      }
+      /* Mark that this strip has effect in stack, that is above the strip. */
+      seq_have_effect_in_stack = true;
+    }
+  }
+
+  /* All effects are rendered (with respect to conditions above). */
+  if ((seq->type & SEQ_TYPE_EFFECT) != 0) {
+    return true;
+  }
+
+  /* If strip has effects in stack, and all effects are above this strip, it is not rendered. */
+  if (seq_have_effect_in_stack) {
+    return false;
+  }
+
+  return true;
+}
+
+/* Remove strips we don't want to render from collection. */
+static void collection_filter_rendered_strips(SeqCollection *collection)
+{
+  Sequence *seq;
+
+  /* Remove sound strips and muted strips from collection, because these are not rendered.
+   * Function #must_render_strip() don't have to check for these strips anymore. */
+  SEQ_ITERATOR_FOREACH (seq, collection) {
+    if (seq->type == SEQ_TYPE_SOUND_RAM || (seq->flag & SEQ_MUTE) != 0) {
+      SEQ_collection_remove_strip(seq, collection);
+    }
+  }
+
+  SEQ_ITERATOR_FOREACH (seq, collection) {
+    if (must_render_strip(seq, collection)) {
+      continue;
+    }
+    SEQ_collection_remove_strip(seq, collection);
+  }
+}
+
+/**
+ * Query strips that are rendered at \a timeline_frame when \a displayed channel is viewed
+ *
+ * \param seqbase: ListBase in which strips are queried
+ * \param timeline_frame: viewed frame
+ * \param displayed_channel: viewed channel. when set to 0, no channel filter is applied
+ * \return strip collection
+ */
+SeqCollection *Seq_query_rendered_strips(ListBase *seqbase,
+                                         const int timeline_frame,
+                                         const int displayed_channel)
+{
+  SeqCollection *collection = query_strips_at_frame(seqbase, timeline_frame);
+  if (displayed_channel != 0) {
+    collection_filter_channel_up_to_incl(collection, displayed_channel);
+  }
+  collection_filter_rendered_strips(collection);
+  return collection;
+}
+
 /**
  * Query all unselected strips in seqbase.
  *
@@ -396,3 +506,13 @@ void SEQ_query_strip_effect_chain(Sequence *seq_reference,
     }
   }
 }
+
+void SEQ_filter_selected_strips(SeqCollection *collection)
+{
+  Sequence *seq;
+  SEQ_IT

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list