[Bf-blender-cvs] [e7003bc9654] master: VSE: Reduce transform code complexity

Richard Antalik noreply at git.blender.org
Thu Jun 17 03:46:57 CEST 2021


Commit: e7003bc9654b217e5938d64fb40094035735de9b
Author: Richard Antalik
Date:   Thu Jun 17 03:40:44 2021 +0200
Branches: master
https://developer.blender.org/rBe7003bc9654b217e5938d64fb40094035735de9b

VSE: Reduce transform code complexity

Reduce complexity of sequencer transform code by removing recursivity.
This is possible by treating meta strips (mostly) as any other strip and
containing all transform code within SEQ_ functions.

Unfortunately internally meta strips still require special treatment,
but all complexity from code all over transform code seems to be
possible to contain within one function.

Functional change:
Previously adjusting handle of single image strip moved animation.
Now animation is not moved, which is behavior for all other strips.

Reviewed By: sergey, mano-wii

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

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

M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_edit.c
M	source/blender/editors/transform/transform_convert_sequencer.c
M	source/blender/makesdna/DNA_sequence_types.h
M	source/blender/sequencer/SEQ_time.h
M	source/blender/sequencer/intern/strip_time.c
M	source/blender/sequencer/intern/strip_transform.c

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

diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 5f831cbf535..b6929f12cc0 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -367,8 +367,6 @@ static void draw_seq_waveform_overlay(View2D *v2d,
 
 static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1, float x2, float y2)
 {
-  /* Don't use SEQ_ALL_BEGIN/SEQ_ALL_END here,
-   * because it changes seq->depth, which is needed for transform. */
   Sequence *seq;
   uchar col[4];
 
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 42e2a2e5549..4c8b44864f9 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -335,7 +335,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
 
   /* Check meta-strips. */
   for (seq = ed->seqbasep->first; seq; seq = seq->next) {
-    if (seq->flag & SELECT && !(seq->depth == 0 && seq->flag & SEQ_LOCK) &&
+    if (seq->flag & SELECT && !(seq->flag & SEQ_LOCK) &&
         SEQ_transform_sequence_can_be_translated(seq)) {
       if ((seq->flag & (SEQ_LEFTSEL + SEQ_RIGHTSEL)) == 0) {
         SEQ_transform_translate_sequence(
@@ -357,7 +357,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
 
   /* Test for effects and overlap. */
   for (seq = ed->seqbasep->first; seq; seq = seq->next) {
-    if (seq->flag & SELECT && !(seq->depth == 0 && seq->flag & SEQ_LOCK)) {
+    if (seq->flag & SELECT && !(seq->flag & SEQ_LOCK)) {
       seq->flag &= ~SEQ_OVERLAP;
       if (SEQ_transform_test_overlap(ed->seqbasep, seq)) {
         SEQ_transform_seqbase_shuffle(ed->seqbasep, seq, scene);
@@ -2187,7 +2187,7 @@ static Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, i
 
   seq = ed->seqbasep->first;
   while (seq) {
-    if ((seq != test) && (test->machine == seq->machine) && (test->depth == seq->depth) &&
+    if ((seq != test) && (test->machine == seq->machine) &&
         ((sel == -1) || (sel == (seq->flag & SELECT)))) {
       dist = MAXFRAME * 2;
 
diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c
index 6a09008e657..3df8da9b814 100644
--- a/source/blender/editors/transform/transform_convert_sequencer.c
+++ b/source/blender/editors/transform/transform_convert_sequencer.c
@@ -76,12 +76,9 @@ typedef struct TransSeq {
 /* This function applies the rules for transforming a strip so duplicate
  * checks don't need to be added in multiple places.
  *
- * recursive, count and flag MUST be set.
- *
- * seq->depth must be set before running this function so we know if the strips
- * are root level or not
+ * count and flag MUST be set.
  */
-static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_recursive, int *r_count, int *r_flag)
+static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_count, int *r_flag)
 {
   /* for extend we need to do some tricks */
   if (t->mode == TFM_TIME_EXTEND) {
@@ -93,13 +90,11 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_recursive, int *r_c
     int left = SEQ_transform_get_left_handle_frame(seq);
     int right = SEQ_transform_get_right_handle_frame(seq);
 
-    if (seq->depth == 0 && ((seq->flag & SELECT) == 0 || (seq->flag & SEQ_LOCK))) {
-      *r_recursive = false;
+    if (((seq->flag & SELECT) == 0 || (seq->flag & SEQ_LOCK))) {
       *r_count = 0;
       *r_flag = 0;
     }
     else {
-      *r_recursive = false;
       *r_count = 1; /* unless its set to 0, extend will never set 2 handles at once */
       *r_flag = (seq->flag | SELECT) & ~(SEQ_LEFTSEL | SEQ_RIGHTSEL);
 
@@ -131,61 +126,34 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *r_recursive, int *r_c
 
     /* *** Normal Transform *** */
 
-    if (seq->depth == 0) {
-
-      /* Count */
+    /* Count */
 
-      /* Non nested strips (resect selection and handles) */
-      if ((seq->flag & SELECT) == 0 || (seq->flag & SEQ_LOCK)) {
-        *r_recursive = false;
-        *r_count = 0;
-        *r_flag = 0;
+    /* Non nested strips (resect selection and handles) */
+    if ((seq->flag & SELECT) == 0 || (seq->flag & SEQ_LOCK)) {
+      *r_count = 0;
+      *r_flag = 0;
+    }
+    else {
+      if ((seq->flag & (SEQ_LEFTSEL | SEQ_RIGHTSEL)) == (SEQ_LEFTSEL | SEQ_RIGHTSEL)) {
+        *r_flag = seq->flag;
+        *r_count = 2; /* we need 2 transdata's */
       }
       else {
-        if ((seq->flag & (SEQ_LEFTSEL | SEQ_RIGHTSEL)) == (SEQ_LEFTSEL | SEQ_RIGHTSEL)) {
-          *r_flag = seq->flag;
-          *r_count = 2; /* we need 2 transdata's */
-        }
-        else {
-          *r_flag = seq->flag;
-          *r_count = 1; /* selected or with a handle selected */
-        }
-
-        /* Recursive */
-
-        if ((seq->type == SEQ_TYPE_META) && ((seq->flag & (SEQ_LEFTSEL | SEQ_RIGHTSEL)) == 0)) {
-          /* if any handles are selected, don't recurse */
-          *r_recursive = true;
-        }
-        else {
-          *r_recursive = false;
-        }
+        *r_flag = seq->flag;
+        *r_count = 1; /* selected or with a handle selected */
       }
     }
-    else {
-      /* Nested, different rules apply */
-
-      *r_flag = (seq->flag | SELECT) & ~(SEQ_LEFTSEL | SEQ_RIGHTSEL);
-      *r_count = 1; /* ignore the selection for nested */
-      *r_recursive = (seq->type == SEQ_TYPE_META);
-    }
   }
 }
 
 static int SeqTransCount(TransInfo *t, ListBase *seqbase, int depth)
 {
   Sequence *seq;
-  int tot = 0, recursive, count, flag;
+  int tot = 0, count, flag;
 
   for (seq = seqbase->first; seq; seq = seq->next) {
-    seq->depth = depth;
-
-    SeqTransInfo(t, seq, &recursive, &count, &flag); /* ignore the flag */
+    SeqTransInfo(t, seq, &count, &flag); /* ignore the flag */
     tot += count;
-
-    if (recursive) {
-      tot += SeqTransCount(t, &seq->seqbase, depth + 1);
-    }
   }
 
   return tot;
@@ -251,27 +219,16 @@ static TransData *SeqToTransData(
   return td;
 }
 
-static int SeqToTransData_Recursive(
+static int SeqToTransData_build(
     TransInfo *t, ListBase *seqbase, TransData *td, TransData2D *td2d, TransDataSeq *tdsq)
 {
   Sequence *seq;
-  int recursive, count, flag;
+  int count, flag;
   int tot = 0;
 
   for (seq = seqbase->first; seq; seq = seq->next) {
 
-    SeqTransInfo(t, seq, &recursive, &count, &flag);
-
-    /* add children first so recalculating metastrips does nested strips first */
-    if (recursive) {
-      int tot_children = SeqToTransData_Recursive(t, &seq->seqbase, td, td2d, tdsq);
-
-      td = td + tot_children;
-      td2d = td2d + tot_children;
-      tdsq = tdsq + tot_children;
-
-      tot += tot_children;
-    }
+    SeqTransInfo(t, seq, &count, &flag);
 
     /* use 'flag' which is derived from seq->flag but modified for special cases */
     if (flag & SELECT) {
@@ -297,13 +254,13 @@ static int SeqToTransData_Recursive(
 static void SeqTransDataBounds(TransInfo *t, ListBase *seqbase, TransSeq *ts)
 {
   Sequence *seq;
-  int recursive, count, flag;
+  int count, flag;
   int max = INT32_MIN, min = INT32_MAX;
 
   for (seq = seqbase->first; seq; seq = seq->next) {
 
     /* just to get the flag since there are corner cases where this isn't totally obvious */
-    SeqTransInfo(t, seq, &recursive, &count, &flag);
+    SeqTransInfo(t, seq, &count, &flag);
 
     /* use 'flag' which is derived from seq->flag but modified for special cases */
     if (flag & SELECT) {
@@ -347,129 +304,108 @@ static void freeSeqData(TransInfo *t, TransDataContainer *tc, TransCustomData *c
     Sequence *seq;
 
     if (!(t->state == TRANS_CANCEL)) {
+      int overlap = 0;
 
-#if 0 /* Default 2.4 behavior. */
-
-      /* flush to 2d vector from internally used 3d vector */
-      for (a = 0; a < t->total; a++, td++) {
-        if ((seq != seq_prev) && (seq->depth == 0) && (seq->flag & SEQ_OVERLAP)) {
-          seq = ((TransDataSeq *)td->extra)->seq;
-          SEQ_transform_seqbase_shuffle(seqbasep, seq, t->scene);
+      for (a = 0, seq_prev = NULL; a < tc->data_len; a++, td++, seq_prev = seq) {
+        seq = ((TransDataSeq *)td->extra)->seq;
+        if ((seq != seq_prev) && (seq->flag & SEQ_OVERLAP)) {
+          overlap = 1;
+          break;
         }
-
-        seq_prev = seq;
       }
 
-#else /* durian hack */
-      {
-        int overlap = 0;
+      if (overlap) {
+        const bool use_sync_markers = (((SpaceSeq *)t->area->spacedata.first)->flag &
+                                       SEQ_MARKER_TRANS) != 0;
+        ListBase *markers = &t->scene->markers;
 
+        bool has_effect_root = false, has_effect_any = false;
+        for (seq = seqbasep->first; seq; seq = seq->next) {
+          seq->tmp = NULL;
+        }
+
+        td = tc->data;
         for (a = 0, seq_prev = NULL; a < tc->data_len; a++, td++, seq_prev = seq) {
           seq = ((TransDataSeq *)td->extra)->seq;
-          if ((seq != seq_prev) && (seq->depth == 0) && (seq->flag & SEQ_OVERLAP)) {
-            overlap = 1;
-            break;
+          if ((seq != seq_prev)) {
+            /* check effects strips, we cant change their time */
+            if ((seq->type & SEQ_TYPE_EFFECT) && seq->seq1) {
+              has_effect_any = true;
+              has_effect_root = true;
+            }
+            else {
+              /* Tag seq with a non zero value, used by
+               * SEQ_transform_seqbase_shuffle_time to identify the ones to shuffle */
+              seq->tmp = (void *)1;
+            }
           }
         }
 
-        if (overlap) {
-          const bool use_sync_markers = (((SpaceSeq *)t->area->spacedata.first)->flag &
-                                         SEQ_MARKER_TRANS) != 0;
-          ListBase *markers = &t->scene->markers;
-
-          bool has_effect_root = false, has_effect_any = false;
-          for (seq = seqbasep->first; seq; seq = seq->next) {
-            seq->tmp = NULL;
-          }
-
+        if (t->flag & T_ALT_TRANSFORM) {
+          int minframe = MAXFRAME;
           td = tc->data;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list