diff options
Diffstat (limited to 'source/blender/editors/transform/transform_snap_sequencer.c')
-rw-r--r-- | source/blender/editors/transform/transform_snap_sequencer.c | 114 |
1 files changed, 90 insertions, 24 deletions
diff --git a/source/blender/editors/transform/transform_snap_sequencer.c b/source/blender/editors/transform/transform_snap_sequencer.c index 7715388bf52..7dc361ff5bb 100644 --- a/source/blender/editors/transform/transform_snap_sequencer.c +++ b/source/blender/editors/transform/transform_snap_sequencer.c @@ -15,6 +15,7 @@ #include "BKE_context.h" #include "ED_screen.h" +#include "ED_transform.h" #include "UI_view2d.h" @@ -33,7 +34,6 @@ typedef struct TransSeqSnapData { int *target_snap_points; int source_snap_point_count; int target_snap_point_count; - int final_snap_frame; } TransSeqSnapData; /* -------------------------------------------------------------------- */ @@ -58,9 +58,7 @@ static int cmp_fn(const void *a, const void *b) return (*(int *)a - *(int *)b); } -static void seq_snap_source_points_build(const TransInfo *UNUSED(t), - TransSeqSnapData *snap_data, - SeqCollection *snap_sources) +static void seq_snap_source_points_build(TransSeqSnapData *snap_data, SeqCollection *snap_sources) { int i = 0; Sequence *seq; @@ -121,15 +119,17 @@ static SeqCollection *seq_collection_extract_effects(SeqCollection *collection) return effects; } -static SeqCollection *query_snap_targets(const TransInfo *t, SeqCollection *snap_sources) +static SeqCollection *query_snap_targets(Scene *scene, + SeqCollection *snap_sources, + bool exclude_selected) { - Editing *ed = SEQ_editing_get(t->scene); + Editing *ed = SEQ_editing_get(scene); ListBase *seqbase = SEQ_active_seqbase_get(ed); ListBase *channels = SEQ_channels_displayed_get(ed); - const short snap_flag = SEQ_tool_settings_snap_flag_get(t->scene); + const short snap_flag = SEQ_tool_settings_snap_flag_get(scene); SeqCollection *snap_targets = SEQ_collection_create(__func__); LISTBASE_FOREACH (Sequence *, seq, seqbase) { - if (seq->flag & SELECT) { + if (exclude_selected && seq->flag & SELECT) { continue; /* Selected are being transformed. */ } if (SEQ_render_is_muted(channels, seq) && (snap_flag & SEQ_SNAP_IGNORE_MUTED)) { @@ -152,12 +152,8 @@ static SeqCollection *query_snap_targets(const TransInfo *t, SeqCollection *snap return snap_targets; } -static int seq_get_snap_target_points_count(const TransInfo *t, - TransSeqSnapData *UNUSED(snap_data), - SeqCollection *snap_targets) +static int seq_get_snap_target_points_count(short snap_mode, SeqCollection *snap_targets) { - const short snap_mode = t->tsnap.mode; - int count = 2; /* Strip start and end are always used. */ if (snap_mode & SEQ_SNAP_TO_STRIP_HOLD) { @@ -173,23 +169,21 @@ static int seq_get_snap_target_points_count(const TransInfo *t, return count; } -static void seq_snap_target_points_alloc(const TransInfo *t, +static void seq_snap_target_points_alloc(short snap_mode, TransSeqSnapData *snap_data, SeqCollection *snap_targets) { - const size_t point_count = seq_get_snap_target_points_count(t, snap_data, snap_targets); + const size_t point_count = seq_get_snap_target_points_count(snap_mode, snap_targets); snap_data->target_snap_points = MEM_callocN(sizeof(int) * point_count, __func__); memset(snap_data->target_snap_points, 0, sizeof(int)); snap_data->target_snap_point_count = point_count; } -static void seq_snap_target_points_build(const TransInfo *t, +static void seq_snap_target_points_build(Scene *scene, + short snap_mode, TransSeqSnapData *snap_data, SeqCollection *snap_targets) { - const Scene *scene = t->scene; - const short snap_mode = t->tsnap.mode; - int i = 0; if (snap_mode & SEQ_SNAP_TO_CURRENT_FRAME) { @@ -246,11 +240,12 @@ TransSeqSnapData *transform_snap_sequencer_data_alloc(const TransInfo *t) return NULL; } + Scene *scene = t->scene; TransSeqSnapData *snap_data = MEM_callocN(sizeof(TransSeqSnapData), __func__); - ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(t->scene)); + ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene)); SeqCollection *snap_sources = SEQ_query_selected_strips(seqbase); - SeqCollection *snap_targets = query_snap_targets(t, snap_sources); + SeqCollection *snap_targets = query_snap_targets(scene, snap_sources, true); if (SEQ_collection_len(snap_sources) == 0) { SEQ_collection_free(snap_targets); @@ -261,11 +256,12 @@ TransSeqSnapData *transform_snap_sequencer_data_alloc(const TransInfo *t) /* Build arrays of snap points. */ seq_snap_source_points_alloc(snap_data, snap_sources); - seq_snap_source_points_build(t, snap_data, snap_sources); + seq_snap_source_points_build(snap_data, snap_sources); SEQ_collection_free(snap_sources); - seq_snap_target_points_alloc(t, snap_data, snap_targets); - seq_snap_target_points_build(t, snap_data, snap_targets); + short snap_mode = t->tsnap.mode; + seq_snap_target_points_alloc(snap_mode, snap_data, snap_targets); + seq_snap_target_points_build(scene, snap_mode, snap_data, snap_targets); SEQ_collection_free(snap_targets); return snap_data; @@ -321,3 +317,73 @@ void transform_snap_sequencer_apply_translate(TransInfo *t, float *vec) { *vec += t->tsnap.snapPoint[0] - t->tsnap.snapTarget[0]; } + +static int transform_snap_sequencer_to_closest_strip_ex(TransInfo *t, int frame_1, int frame_2) +{ + Scene *scene = t->scene; + TransSeqSnapData *snap_data = MEM_callocN(sizeof(TransSeqSnapData), __func__); + + SeqCollection *empty_col = SEQ_collection_create(__func__); + SeqCollection *snap_targets = query_snap_targets(scene, empty_col, false); + SEQ_collection_free(empty_col); + + snap_data->source_snap_points = MEM_callocN(sizeof(int) * 2, __func__); + snap_data->source_snap_point_count = 2; + BLI_assert(frame_1 <= frame_2); + snap_data->source_snap_points[0] = frame_1; + snap_data->source_snap_points[1] = frame_2; + + short snap_mode = t->tsnap.mode; + /* Build arrays of snap points. */ + seq_snap_target_points_alloc(snap_mode, snap_data, snap_targets); + seq_snap_target_points_build(scene, snap_mode, snap_data, snap_targets); + SEQ_collection_free(snap_targets); + + t->tsnap.seq_context = snap_data; + bool snap_success = transform_snap_sequencer_calc(t); + transform_snap_sequencer_data_free(snap_data); + t->tsnap.seq_context = NULL; + + float snap_offset = 0; + if (snap_success) { + t->tsnap.status |= (POINT_INIT | TARGET_INIT); + transform_snap_sequencer_apply_translate(t, &snap_offset); + } + else { + t->tsnap.status &= ~(POINT_INIT | TARGET_INIT); + } + + return snap_offset; +} + +bool ED_transform_snap_sequencer_to_closest_strip_calc(Scene *scene, + ARegion *region, + int frame_1, + int frame_2, + int *r_snap_distance, + float *r_snap_frame) +{ + TransInfo t; + t.scene = scene; + t.region = region; + t.values[0] = 0; + t.data_type = TC_SEQ_DATA; + + t.tsnap.mode = SEQ_tool_settings_snap_mode_get(scene); + *r_snap_distance = transform_snap_sequencer_to_closest_strip_ex(&t, frame_1, frame_2); + *r_snap_frame = t.tsnap.snapPoint[0]; + return validSnap(&t); +} + +void ED_draw_sequencer_snap_point(struct bContext *C, float snap_point) +{ + /* Reuse the snapping drawing code from the transform system. */ + TransInfo t; + t.mode = TFM_SEQ_SLIDE; + t.modifiers = MOD_SNAP; + t.spacetype = SPACE_SEQ; + t.tsnap.status = (POINT_INIT | TARGET_INIT); + t.tsnap.snapPoint[0] = snap_point; + + drawSnapping(C, &t); +} |