Commit: ec0c58823d6cbe23298c65213a03cedafe67de5f
Author: Antony Riakiotakis
Date:   Tue Nov 11 18:00:47 2014 +0100
Branches: terrible_consequencer
https://developer.blender.org/rBec0c58823d6cbe23298c65213a03cedafe67de5f

First iteration of snapping based on strips - will be improved based on
imput from Mathieu.

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

M       source/blender/blenkernel/BKE_sequencer.h
M       source/blender/blenkernel/intern/sequencer.c
M       source/blender/editors/space_sequencer/sequencer_edit.c
M       source/blender/editors/space_sequencer/sequencer_intern.h
M       source/blender/editors/space_sequencer/sequencer_ops.c
M       source/blender/editors/transform/transform.c
M       source/blender/editors/transform/transform.h
M       source/blender/editors/transform/transform_conversions.c
M       source/blender/editors/transform/transform_snap.c

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

diff --git a/source/blender/blenkernel/BKE_sequencer.h 
b/source/blender/blenkernel/BKE_sequencer.h
index bbc4fd0..bff96b2 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -377,6 +377,15 @@ struct Sequence *BKE_sequence_alloc(ListBase *lb, int 
cfra, int machine);
 void BKE_sequence_alpha_mode_from_extension(struct Sequence *seq);
 void BKE_sequence_init_colorspace(struct Sequence *seq);
 
+/* RNA enums, just to be more readable */
+enum {
+       SEQ_SIDE_NONE = 0,
+       SEQ_SIDE_LEFT,
+       SEQ_SIDE_RIGHT,
+       SEQ_SIDE_BOTH
+};
+int BKE_seq_find_next_prev_edit(struct Scene *scene, int cfra, const short 
side, const bool do_skip_mute, const bool do_center, const bool do_unselected, 
int *bfl);
+
 struct Sequence *BKE_sequencer_add_image_strip(struct bContext *C, ListBase 
*seqbasep, struct SeqLoadInfo *seq_load);
 struct Sequence *BKE_sequencer_add_sound_strip(struct bContext *C, ListBase 
*seqbasep, struct SeqLoadInfo *seq_load);
 struct Sequence *BKE_sequencer_add_movie_strip(struct bContext *C, ListBase 
*seqbasep, struct SeqLoadInfo *seq_load);
diff --git a/source/blender/blenkernel/intern/sequencer.c 
b/source/blender/blenkernel/intern/sequencer.c
index 0a22faf..77ee8c8 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -892,7 +892,6 @@ void BKE_sequencer_sort(Scene *scene)
        Editing *ed = BKE_sequencer_editing_get(scene, false);
        Sequence *seq, *seqt;
 
-       
        if (ed == NULL)
                return;
 
@@ -4687,3 +4686,87 @@ bool BKE_sequence_is_valid_check(Sequence *seq)
        return true;
 }
 
+int BKE_seq_find_next_prev_edit(Scene *scene, int cfra,
+                                const short side,
+                                const bool do_skip_mute, const bool do_center, 
const bool do_unselected, int *bfl)
+{
+       Editing *ed = BKE_sequencer_editing_get(scene, false);
+       Sequence *seq;
+
+       int dist, best_dist, best_frame = cfra;
+       int dist_left, best_dist_left, best_frame_left = cfra;
+       int seq_frames[2], seq_frames_tot;
+
+       /* in case where both is passed, frame just finds the nearest end while 
frame_left the nearest start */
+
+       best_dist = MAXFRAME * 2;
+       best_dist_left = MAXFRAME * 2;
+
+       if (ed == NULL) return cfra;
+
+       for (seq = ed->seqbasep->first; seq; seq = seq->next) {
+               int i;
+
+               if (do_skip_mute && (seq->flag & SEQ_MUTE)) {
+                       continue;
+               }
+
+               if (do_unselected && (seq->flag & SELECT))
+                       continue;
+
+               if (do_center) {
+                       seq_frames[0] = (seq->startdisp + seq->enddisp) / 2;
+                       seq_frames_tot = 1;
+               }
+               else {
+                       seq_frames[0] = seq->startdisp;
+                       seq_frames[1] = seq->enddisp;
+
+                       seq_frames_tot = 2;
+               }
+
+               for (i = 0; i < seq_frames_tot; i++) {
+                       const int seq_frame = seq_frames[i];
+
+                       dist = MAXFRAME * 2;
+                       dist_left = MAXFRAME * 2;
+
+                       switch (side) {
+                               case SEQ_SIDE_LEFT:
+                                       if (seq_frame < cfra) {
+                                               dist = cfra - seq_frame;
+                                       }
+                                       break;
+                               case SEQ_SIDE_RIGHT:
+                                       if (seq_frame > cfra) {
+                                               dist = seq_frame - cfra;
+                                       }
+                                       break;
+                               case SEQ_SIDE_BOTH:
+                                       if (i == 1) {
+                                               dist = abs(seq_frame - cfra);
+                                       }
+                                       else {
+                                               dist_left = abs(cfra - 
seq_frame);
+                                       }
+                                       break;
+                       }
+
+                       if (dist < best_dist) {
+                               best_frame = seq_frame;
+                               best_dist = dist;
+                       }
+
+                       if (dist_left < best_dist_left) {
+                               best_frame_left = seq_frame;
+                               best_dist_left = dist_left;
+                       }
+
+               }
+       }
+
+       if (bfl) {
+               *bfl = best_frame_left;
+       }
+       return best_frame;
+}
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c 
b/source/blender/editors/space_sequencer/sequencer_edit.c
index 158b251..ac4a107 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -2969,74 +2969,13 @@ void SEQUENCER_OT_view_selected(wmOperatorType *ot)
        ot->flag = OPTYPE_REGISTER;
 }
 
-
-static int find_next_prev_edit(Scene *scene, int cfra,
-                               const short side,
-                               const bool do_skip_mute, const bool do_center)
-{
-       Editing *ed = BKE_sequencer_editing_get(scene, false);
-       Sequence *seq;
-       
-       int dist, best_dist, best_frame = cfra;
-       int seq_frames[2], seq_frames_tot;
-
-       best_dist = MAXFRAME * 2;
-
-       if (ed == NULL) return cfra;
-       
-       for (seq = ed->seqbasep->first; seq; seq = seq->next) {
-               int i;
-
-               if (do_skip_mute && (seq->flag & SEQ_MUTE)) {
-                       continue;
-               }
-
-               if (do_center) {
-                       seq_frames[0] = (seq->startdisp + seq->enddisp) / 2;
-                       seq_frames_tot = 1;
-               }
-               else {
-                       seq_frames[0] = seq->startdisp;
-                       seq_frames[1] = seq->enddisp;
-
-                       seq_frames_tot = 2;
-               }
-
-               for (i = 0; i < seq_frames_tot; i++) {
-                       const int seq_frame = seq_frames[i];
-
-                       dist = MAXFRAME * 2;
-
-                       switch (side) {
-                               case SEQ_SIDE_LEFT:
-                                       if (seq_frame < cfra) {
-                                               dist = cfra - seq_frame;
-                                       }
-                                       break;
-                               case SEQ_SIDE_RIGHT:
-                                       if (seq_frame > cfra) {
-                                               dist = seq_frame - cfra;
-                                       }
-                                       break;
-                       }
-
-                       if (dist < best_dist) {
-                               best_frame = seq_frame;
-                               best_dist = dist;
-                       }
-               }
-       }
-
-       return best_frame;
-}
-
 static bool strip_jump_internal(Scene *scene,
                                 const short side,
                                 const bool do_skip_mute, const bool do_center)
 {
        bool changed = false;
        int cfra = CFRA;
-       int nfra = find_next_prev_edit(scene, cfra, side, do_skip_mute, 
do_center);
+       int nfra = BKE_seq_find_next_prev_edit(scene, cfra, side, do_skip_mute, 
do_center, false, NULL);
        
        if (nfra != cfra) {
                CFRA = nfra;
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h 
b/source/blender/editors/space_sequencer/sequencer_intern.h
index 564305a..5b920f8 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -154,13 +154,6 @@ void SEQUENCER_OT_sound_strip_add(struct wmOperatorType 
*ot);
 void SEQUENCER_OT_image_strip_add(struct wmOperatorType *ot);
 void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot);
 
-/* RNA enums, just to be more readable */
-enum {
-       SEQ_SIDE_NONE = 0,
-       SEQ_SIDE_LEFT,
-       SEQ_SIDE_RIGHT,
-       SEQ_SIDE_BOTH
-};
 enum {
        SEQ_CUT_SOFT,
        SEQ_CUT_HARD
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c 
b/source/blender/editors/space_sequencer/sequencer_ops.c
index 0198a36..913d172 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -40,6 +40,8 @@
 #include "ED_markers.h"
 #include "ED_transform.h" /* transform keymap */
 
+#include "BKE_sequencer.h"
+
 #include "sequencer_intern.h"
 
 
diff --git a/source/blender/editors/transform/transform.c 
b/source/blender/editors/transform/transform.c
index 9547f0b..256cd3c 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -7121,10 +7121,11 @@ static void headerSeqSlide(TransInfo *t, float val[2], 
char str[MAX_INFO_LEN])
                            WM_bool_as_string((t->flag & T_ALT_TRANSFORM) != 
0));
 }
 
-static void applySeqSlideValue(TransInfo *t, const float val[2])
+static void applySeqSlideValue(TransInfo *t, const float val[2], int frame)
 {
        TransData *td = t->data;
        int i;
+       TransSeq *ts = t->customData;
 
        for (i = 0; i < t->total; i++, td++) {
                float tvec[2];
@@ -7139,15 +7140,21 @@ static void applySeqSlideValue(TransInfo *t, const 
float val[2])
 
                mul_v2_fl(tvec, td->factor);
 
-               td->loc[0] = td->iloc[0] + tvec[0];
+               if (t->modifiers & MOD_SNAP_INVERT) {
+                       td->loc[0] = frame + td->factor * (td->iloc[0] - 
ts->min);
+               }
+               else {
+                       td->loc[0] = td->iloc[0] + tvec[0];
+               }
+
                td->loc[1] = td->iloc[1] + tvec[1];
        }
 }
 
-static void applySeqSlide(TransInfo *t, const int UNUSED(mval[2]))
+static void applySeqSlide(TransInfo *t, const int mval[2])
 {
        char str[MAX_INFO_LEN];
-
+       int fra = 0;
        if (t->con.mode & CON_APPLY) {
                float pvec[3] = {0.0f, 0.0f, 0.0f};
                float tvec[3];
@@ -7155,7 +7162,8 @@ static void applySeqSlide(TransInfo *t, const int 
UNUSED(mval[2]))
                copy_v3_v3(t->values, tvec);
        }
        else {
-               snapGridIncrement(t, t->values);
+               fra = snapSequenceBounds(t, mval);
+               //snapGridIncrement(t, t->values);
                applyNumInput(&t->num, t->values);
        }
 
@@ -7163,7 +7171,7 @@ static void applySeqSlide(TransInfo *t, const int 
UNUSED(mval[2]))
        t->values[1] = floor(t->values[1] + 0.5f);
 
        headerSeqSlide(t, t->values, str);
-       applySeqSlideValue(t, t->values);
+       applySeqSlideValue(t, t->values, fra);
 
        recalcData(t);
 
diff --git a/source/blender/editors/transform/transform.h 
b/source/blender/editors/transform/transform.h
index 67d5563..a15bc54 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -173,6 +173,12 @@ typedef struct TransDataSeq {
 
 } TransDataSeq;
 
+typedef struct TransSeq {
+       TransDataSeq *tdseq;
+       int min;
+       int max;
+} TransSeq;
+
 /* for NLA transform (stored in td->extra pointer) */
 typedef struct TransDataNla {
        ID *id;                                         /* ID-block NLA-data is 
attached to */
@@ -588,6 +594,8 @@ typedef enum {
 void snapGridIncrement(TransInfo *t, float *val);
 void snapGridIncrementAction(TransInfo *t, float *val, GearsType action);
 
+int snapSequenceBounds(TransInfo *t, const int mval[2]);
+
 bool activeSnap(TransInfo *t);
 bool validSnap(TransInfo *t);
 
diff --git a/source/blender/editors/transform/transform_conversions.c 
b/source/blender/editors/transform/transform_conversions.c
index 903b8c3..f14b304 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -4477,11 +4477,12 @@ static TransData *SeqToTransData(TransData *td, 
TransData2D *td2d, TransDataSeq
        return td;
 }
 
-static int SeqToTransData_Recursive(TransInfo *t, ListBase *seqbase, TransData 
*td, TransData2D *td2d, TransDataSeq *tdsq)
+static int SeqToTransData_Recursive(TransInfo *t, ListBase *seqbase, TransData 
*td, TransData2D *td2d, TransDataSeq *tdsq, TransSeq *ts)
 {
        Sequence *seq;
        int recursive, count, flag;
        int tot = 0;
+       int max = INT32_MIN, min = INT32_MAX;
 
        for (seq = seqbase->first; seq; seq = seq->next)

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to