diff options
author | Peter Kim <pk15950@gmail.com> | 2022-09-08 07:00:12 +0300 |
---|---|---|
committer | Peter Kim <pk15950@gmail.com> | 2022-09-08 07:00:12 +0300 |
commit | 00dcfdf916c69672210b006e62d966f1bc2fbeb7 (patch) | |
tree | 0cbb1b91fe26c750197126085b74224a795a103c /source/blender/sequencer/intern/strip_transform.c | |
parent | a39532670f6b668da7be5810fb1f844b82feeba3 (diff) | |
parent | d5934974219135102f364f57c45a8b1465e2b8d9 (diff) |
Merge branch 'master' into xr-devxr-dev
Diffstat (limited to 'source/blender/sequencer/intern/strip_transform.c')
-rw-r--r-- | source/blender/sequencer/intern/strip_transform.c | 192 |
1 files changed, 82 insertions, 110 deletions
diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c index 19caf12ff2a..a7361cbb1f9 100644 --- a/source/blender/sequencer/intern/strip_transform.c +++ b/source/blender/sequencer/intern/strip_transform.c @@ -34,15 +34,6 @@ static CLG_LogRef LOG = {"seq.strip_transform"}; -static int seq_tx_get_start(Sequence *seq) -{ - return seq->start; -} -static int seq_tx_get_end(Sequence *seq) -{ - return seq->start + seq->len; -} - bool SEQ_transform_single_image_check(Sequence *seq) { return ((seq->len == 1) && @@ -91,64 +82,23 @@ bool SEQ_transform_seqbase_isolated_sel_check(ListBase *seqbase) return true; } -void SEQ_transform_handle_xlimits(const Scene *scene, Sequence *seq, int leftflag, int rightflag) -{ - if (leftflag) { - if (SEQ_time_left_handle_frame_get(seq) >= SEQ_time_right_handle_frame_get(seq)) { - SEQ_time_left_handle_frame_set(scene, seq, SEQ_time_right_handle_frame_get(seq) - 1); - } - - if (SEQ_transform_single_image_check(seq) == 0) { - if (SEQ_time_left_handle_frame_get(seq) >= seq_tx_get_end(seq)) { - SEQ_time_left_handle_frame_set(scene, seq, seq_tx_get_end(seq) - 1); - } - - /* TODO: This doesn't work at the moment. */ -#if 0 - if (seq_tx_get_start(seq) >= seq_tx_get_final_right(seq, 0)) { - int ofs; - ofs = seq_tx_get_start(seq) - seq_tx_get_final_right(seq, 0); - seq->start -= ofs; - seq_tx_set_final_left(seq, seq_tx_get_final_left(seq, 0) + ofs); - } -#endif - } - } - - if (rightflag) { - if (SEQ_time_right_handle_frame_get(seq) <= SEQ_time_left_handle_frame_get(seq)) { - SEQ_time_right_handle_frame_set(scene, seq, SEQ_time_left_handle_frame_get(seq) + 1); - } - - if (SEQ_transform_single_image_check(seq) == 0) { - if (SEQ_time_right_handle_frame_get(seq) <= seq_tx_get_start(seq)) { - SEQ_time_right_handle_frame_set(scene, seq, seq_tx_get_start(seq) + 1); - } - } - } - - /* sounds cannot be extended past their endpoints */ - if (seq->type == SEQ_TYPE_SOUND_RAM) { - CLAMP(seq->startofs, 0, MAXFRAME); - CLAMP(seq->endofs, 0, MAXFRAME); - } -} - void SEQ_transform_fix_single_image_seq_offsets(const Scene *scene, Sequence *seq) { - int left, start, offset; + int left, start; if (!SEQ_transform_single_image_check(seq)) { return; } /* make sure the image is always at the start since there is only one, * adjusting its start should be ok */ - left = SEQ_time_left_handle_frame_get(seq); + left = SEQ_time_left_handle_frame_get(scene, seq); start = seq->start; if (start != left) { - offset = left - start; - SEQ_time_left_handle_frame_set(scene, seq, SEQ_time_left_handle_frame_get(seq) - offset); - SEQ_time_right_handle_frame_set(scene, seq, SEQ_time_right_handle_frame_get(seq) - offset); + const int offset = left - start; + SEQ_time_left_handle_frame_set( + scene, seq, SEQ_time_left_handle_frame_get(scene, seq) - offset); + SEQ_time_right_handle_frame_set( + scene, seq, SEQ_time_right_handle_frame_get(scene, seq) - offset); seq->start += offset; } } @@ -158,20 +108,22 @@ bool SEQ_transform_sequence_can_be_translated(Sequence *seq) return !(seq->type & SEQ_TYPE_EFFECT) || (SEQ_effect_get_num_inputs(seq->type) == 0); } -bool SEQ_transform_test_overlap_seq_seq(Sequence *seq1, Sequence *seq2) +bool SEQ_transform_test_overlap_seq_seq(const Scene *scene, Sequence *seq1, Sequence *seq2) { return (seq1 != seq2 && seq1->machine == seq2->machine && - ((SEQ_time_right_handle_frame_get(seq1) <= SEQ_time_left_handle_frame_get(seq2)) || - (SEQ_time_left_handle_frame_get(seq1) >= SEQ_time_right_handle_frame_get(seq2))) == 0); + ((SEQ_time_right_handle_frame_get(scene, seq1) <= + SEQ_time_left_handle_frame_get(scene, seq2)) || + (SEQ_time_left_handle_frame_get(scene, seq1) >= + SEQ_time_right_handle_frame_get(scene, seq2))) == 0); } -bool SEQ_transform_test_overlap(ListBase *seqbasep, Sequence *test) +bool SEQ_transform_test_overlap(const Scene *scene, ListBase *seqbasep, Sequence *test) { Sequence *seq; seq = seqbasep->first; while (seq) { - if (SEQ_transform_test_overlap_seq_seq(test, seq)) { + if (SEQ_transform_test_overlap_seq_seq(scene, test, seq)) { return true; } @@ -194,14 +146,16 @@ void SEQ_transform_translate_sequence(Scene *evil_scene, Sequence *seq, int delt SEQ_transform_translate_sequence(evil_scene, seq_child, delta); } /* Move meta start/end points. */ - SEQ_time_left_handle_frame_set(evil_scene, seq, SEQ_time_left_handle_frame_get(seq) + delta); - SEQ_time_right_handle_frame_set(evil_scene, seq, SEQ_time_right_handle_frame_get(seq) + delta); + SEQ_time_left_handle_frame_set( + evil_scene, seq, SEQ_time_left_handle_frame_get(evil_scene, seq) + delta); + SEQ_time_right_handle_frame_set( + evil_scene, seq, SEQ_time_right_handle_frame_get(evil_scene, seq) + delta); } else { /* All other strip types. */ seq->start += delta; /* Only to make files usable in older versions. */ - seq->startdisp = SEQ_time_left_handle_frame_get(seq); - seq->enddisp = SEQ_time_right_handle_frame_get(seq); + seq->startdisp = SEQ_time_left_handle_frame_get(evil_scene, seq); + seq->enddisp = SEQ_time_right_handle_frame_get(evil_scene, seq); } SEQ_offset_animdata(evil_scene, seq, delta); @@ -219,7 +173,7 @@ bool SEQ_transform_seqbase_shuffle_ex(ListBase *seqbasep, BLI_assert(ELEM(channel_delta, -1, 1)); test->machine += channel_delta; - while (SEQ_transform_test_overlap(seqbasep, test)) { + while (SEQ_transform_test_overlap(evil_scene, seqbasep, test)) { if ((channel_delta > 0) ? (test->machine >= MAXSEQ) : (test->machine < 1)) { break; } @@ -232,17 +186,17 @@ bool SEQ_transform_seqbase_shuffle_ex(ListBase *seqbasep, * nicer to move it to the end */ Sequence *seq; - int new_frame = SEQ_time_right_handle_frame_get(test); + int new_frame = SEQ_time_right_handle_frame_get(evil_scene, test); for (seq = seqbasep->first; seq; seq = seq->next) { if (seq->machine == orig_machine) { - new_frame = max_ii(new_frame, SEQ_time_right_handle_frame_get(seq)); + new_frame = max_ii(new_frame, SEQ_time_right_handle_frame_get(evil_scene, seq)); } } test->machine = orig_machine; - new_frame = new_frame + - (test->start - SEQ_time_left_handle_frame_get(test)); /* adjust by the startdisp */ + new_frame = new_frame + (test->start - SEQ_time_left_handle_frame_get( + evil_scene, test)); /* adjust by the startdisp */ SEQ_transform_translate_sequence(evil_scene, test, new_frame - test->start); return false; } @@ -255,16 +209,20 @@ bool SEQ_transform_seqbase_shuffle(ListBase *seqbasep, Sequence *test, Scene *ev return SEQ_transform_seqbase_shuffle_ex(seqbasep, test, evil_scene, 1); } -static bool shuffle_seq_test_overlap(const Sequence *seq1, const Sequence *seq2, const int offset) +static bool shuffle_seq_test_overlap(const Scene *scene, + const Sequence *seq1, + const Sequence *seq2, + const int offset) { - return ( - seq1 != seq2 && seq1->machine == seq2->machine && - ((SEQ_time_right_handle_frame_get(seq1) + offset <= SEQ_time_left_handle_frame_get(seq2)) || - (SEQ_time_left_handle_frame_get(seq1) + offset >= SEQ_time_right_handle_frame_get(seq2))) == - 0); + return (seq1 != seq2 && seq1->machine == seq2->machine && + ((SEQ_time_right_handle_frame_get(scene, seq1) + offset <= + SEQ_time_left_handle_frame_get(scene, seq2)) || + (SEQ_time_left_handle_frame_get(scene, seq1) + offset >= + SEQ_time_right_handle_frame_get(scene, seq2))) == 0); } -static int shuffle_seq_time_offset_get(SeqCollection *strips_to_shuffle, +static int shuffle_seq_time_offset_get(const Scene *scene, + SeqCollection *strips_to_shuffle, ListBase *seqbasep, char dir) { @@ -276,7 +234,7 @@ static int shuffle_seq_time_offset_get(SeqCollection *strips_to_shuffle, all_conflicts_resolved = true; SEQ_ITERATOR_FOREACH (seq, strips_to_shuffle) { LISTBASE_FOREACH (Sequence *, seq_other, seqbasep) { - if (!shuffle_seq_test_overlap(seq, seq_other, offset)) { + if (!shuffle_seq_test_overlap(scene, seq, seq_other, offset)) { continue; } if (SEQ_relation_is_effect_of_strip(seq_other, seq)) { @@ -293,13 +251,13 @@ static int shuffle_seq_time_offset_get(SeqCollection *strips_to_shuffle, if (dir == 'L') { offset = min_ii(offset, - SEQ_time_left_handle_frame_get(seq_other) - - SEQ_time_right_handle_frame_get(seq)); + SEQ_time_left_handle_frame_get(scene, seq_other) - + SEQ_time_right_handle_frame_get(scene, seq)); } else { offset = max_ii(offset, - SEQ_time_right_handle_frame_get(seq_other) - - SEQ_time_left_handle_frame_get(seq)); + SEQ_time_right_handle_frame_get(scene, seq_other) - + SEQ_time_left_handle_frame_get(scene, seq)); } } } @@ -315,8 +273,8 @@ bool SEQ_transform_seqbase_shuffle_time(SeqCollection *strips_to_shuffle, ListBase *markers, const bool use_sync_markers) { - int offset_l = shuffle_seq_time_offset_get(strips_to_shuffle, seqbasep, 'L'); - int offset_r = shuffle_seq_time_offset_get(strips_to_shuffle, seqbasep, 'R'); + int offset_l = shuffle_seq_time_offset_get(evil_scene, strips_to_shuffle, seqbasep, 'L'); + int offset_r = shuffle_seq_time_offset_get(evil_scene, strips_to_shuffle, seqbasep, 'R'); int offset = (-offset_l < offset_r) ? offset_l : offset_r; if (offset) { @@ -359,7 +317,8 @@ static SeqCollection *extract_standalone_strips(SeqCollection *transformed_strip } /* Query strips positioned after left edge of transformed strips bound-box. */ -static SeqCollection *query_right_side_strips(ListBase *seqbase, +static SeqCollection *query_right_side_strips(const Scene *scene, + ListBase *seqbase, SeqCollection *transformed_strips, SeqCollection *time_dependent_strips) { @@ -367,7 +326,7 @@ static SeqCollection *query_right_side_strips(ListBase *seqbase, { Sequence *seq; SEQ_ITERATOR_FOREACH (seq, transformed_strips) { - minframe = min_ii(minframe, SEQ_time_left_handle_frame_get(seq)); + minframe = min_ii(minframe, SEQ_time_left_handle_frame_get(scene, seq)); } } @@ -380,7 +339,7 @@ static SeqCollection *query_right_side_strips(ListBase *seqbase, continue; } - if ((seq->flag & SELECT) == 0 && SEQ_time_left_handle_frame_get(seq) >= minframe) { + if ((seq->flag & SELECT) == 0 && SEQ_time_left_handle_frame_get(scene, seq) >= minframe) { SEQ_collection_append_strip(seq, collection); } } @@ -398,7 +357,7 @@ static void seq_transform_handle_expand_to_fit(Scene *scene, ListBase *markers = &scene->markers; SeqCollection *right_side_strips = query_right_side_strips( - seqbasep, transformed_strips, time_dependent_strips); + scene, seqbasep, transformed_strips, time_dependent_strips); /* Temporarily move right side strips beyond timeline boundary. */ Sequence *seq; @@ -424,7 +383,8 @@ static void seq_transform_handle_expand_to_fit(Scene *scene, SEQ_collection_free(right_side_strips); } -static SeqCollection *query_overwrite_targets(ListBase *seqbasep, +static SeqCollection *query_overwrite_targets(const Scene *scene, + ListBase *seqbasep, SeqCollection *transformed_strips) { SeqCollection *collection = SEQ_query_unselected_strips(seqbasep); @@ -438,7 +398,7 @@ static SeqCollection *query_overwrite_targets(ListBase *seqbasep, if (seq == seq_transformed) { SEQ_collection_remove_strip(seq, collection); } - if (SEQ_transform_test_overlap_seq_seq(seq, seq_transformed)) { + if (SEQ_transform_test_overlap_seq_seq(scene, seq, seq_transformed)) { does_overlap = true; } } @@ -463,23 +423,32 @@ typedef enum eOvelapDescrition { STRIP_OVERLAP_RIGHT_SIDE, } eOvelapDescrition; -static eOvelapDescrition overlap_description_get(const Sequence *transformed, +static eOvelapDescrition overlap_description_get(const Scene *scene, + const Sequence *transformed, const Sequence *target) { - if (SEQ_time_left_handle_frame_get(transformed) <= SEQ_time_left_handle_frame_get(target) && - SEQ_time_right_handle_frame_get(transformed) >= SEQ_time_right_handle_frame_get(target)) { + if (SEQ_time_left_handle_frame_get(scene, transformed) <= + SEQ_time_left_handle_frame_get(scene, target) && + SEQ_time_right_handle_frame_get(scene, transformed) >= + SEQ_time_right_handle_frame_get(scene, target)) { return STRIP_OVERLAP_IS_FULL; } - if (SEQ_time_left_handle_frame_get(transformed) > SEQ_time_left_handle_frame_get(target) && - SEQ_time_right_handle_frame_get(transformed) < SEQ_time_right_handle_frame_get(target)) { + if (SEQ_time_left_handle_frame_get(scene, transformed) > + SEQ_time_left_handle_frame_get(scene, target) && + SEQ_time_right_handle_frame_get(scene, transformed) < + SEQ_time_right_handle_frame_get(scene, target)) { return STRIP_OVERLAP_IS_INSIDE; } - if (SEQ_time_left_handle_frame_get(transformed) <= SEQ_time_left_handle_frame_get(target) && - SEQ_time_left_handle_frame_get(target) <= SEQ_time_right_handle_frame_get(transformed)) { + if (SEQ_time_left_handle_frame_get(scene, transformed) <= + SEQ_time_left_handle_frame_get(scene, target) && + SEQ_time_left_handle_frame_get(scene, target) <= + SEQ_time_right_handle_frame_get(scene, transformed)) { return STRIP_OVERLAP_LEFT_SIDE; } - if (SEQ_time_left_handle_frame_get(transformed) <= SEQ_time_right_handle_frame_get(target) && - SEQ_time_right_handle_frame_get(target) <= SEQ_time_right_handle_frame_get(transformed)) { + if (SEQ_time_left_handle_frame_get(scene, transformed) <= + SEQ_time_right_handle_frame_get(scene, target) && + SEQ_time_right_handle_frame_get(scene, target) <= + SEQ_time_right_handle_frame_get(scene, transformed)) { return STRIP_OVERLAP_RIGHT_SIDE; } return STRIP_OVERLAP_NONE; @@ -499,14 +468,14 @@ static void seq_transform_handle_overwrite_split(Scene *scene, scene, seqbasep, target, - SEQ_time_left_handle_frame_get(transformed), + SEQ_time_left_handle_frame_get(scene, transformed), SEQ_SPLIT_SOFT, NULL); SEQ_edit_strip_split(bmain, scene, seqbasep, split_strip, - SEQ_time_right_handle_frame_get(transformed), + SEQ_time_right_handle_frame_get(scene, transformed), SEQ_SPLIT_SOFT, NULL); SEQ_edit_flag_for_removal(scene, seqbasep, split_strip); @@ -521,11 +490,12 @@ static void seq_transform_handle_overwrite_trim(Scene *scene, Sequence *target, const eOvelapDescrition overlap) { - SeqCollection *targets = SEQ_query_by_reference(target, seqbasep, SEQ_query_strip_effect_chain); + SeqCollection *targets = SEQ_query_by_reference( + target, scene, seqbasep, SEQ_query_strip_effect_chain); /* Expand collection by adding all target's children, effects and their children. */ if ((target->type & SEQ_TYPE_EFFECT) != 0) { - SEQ_collection_expand(seqbasep, targets, SEQ_query_strip_effect_chain); + SEQ_collection_expand(scene, seqbasep, targets, SEQ_query_strip_effect_chain); } /* Trim all non effects, that have influence on effect length which is overlapping. */ @@ -535,11 +505,13 @@ static void seq_transform_handle_overwrite_trim(Scene *scene, continue; } if (overlap == STRIP_OVERLAP_LEFT_SIDE) { - SEQ_time_left_handle_frame_set(scene, seq, SEQ_time_right_handle_frame_get(transformed)); + SEQ_time_left_handle_frame_set( + scene, seq, SEQ_time_right_handle_frame_get(scene, transformed)); } else { BLI_assert(overlap == STRIP_OVERLAP_RIGHT_SIDE); - SEQ_time_right_handle_frame_set(scene, seq, SEQ_time_left_handle_frame_get(transformed)); + SEQ_time_right_handle_frame_set( + scene, seq, SEQ_time_left_handle_frame_get(scene, transformed)); } } SEQ_collection_free(targets); @@ -549,7 +521,7 @@ static void seq_transform_handle_overwrite(Scene *scene, ListBase *seqbasep, SeqCollection *transformed_strips) { - SeqCollection *targets = query_overwrite_targets(seqbasep, transformed_strips); + SeqCollection *targets = query_overwrite_targets(scene, seqbasep, transformed_strips); SeqCollection *strips_to_delete = SEQ_collection_create(__func__); Sequence *target; @@ -560,7 +532,7 @@ static void seq_transform_handle_overwrite(Scene *scene, continue; } - const eOvelapDescrition overlap = overlap_description_get(transformed, target); + const eOvelapDescrition overlap = overlap_description_get(scene, transformed, target); if (overlap == STRIP_OVERLAP_IS_FULL) { SEQ_collection_append_strip(target, strips_to_delete); @@ -629,7 +601,7 @@ void SEQ_transform_handle_overlap(Scene *scene, * In some cases other strips can be overlapping still, see T90646. */ Sequence *seq; SEQ_ITERATOR_FOREACH (seq, transformed_strips) { - if (SEQ_transform_test_overlap(seqbasep, seq)) { + if (SEQ_transform_test_overlap(scene, seqbasep, seq)) { SEQ_transform_seqbase_shuffle(seqbasep, seq, scene); } seq->flag &= ~SEQ_OVERLAP; @@ -642,7 +614,7 @@ void SEQ_transform_offset_after_frame(Scene *scene, const int timeline_frame) { LISTBASE_FOREACH (Sequence *, seq, seqbase) { - if (SEQ_time_left_handle_frame_get(seq) >= timeline_frame) { + if (SEQ_time_left_handle_frame_get(scene, seq) >= timeline_frame) { SEQ_transform_translate_sequence(scene, seq, delta); SEQ_relations_invalidate_cache_preprocessed(scene, seq); } |