Fix VSE strip channel skip overlapping strips
D1096 by @mangostaniko (with some edits)
This commit is contained in:
parent
26d7ac5077
commit
27b2ab8cf4
Notes:
blender-bot
2023-02-14 14:54:36 +01:00
Referenced by commit ecbbb02c88
, Fix T46628: Strips overlapping in VSE
Referenced by issue #27450, Inability to move the pasted strip (image, video) towards at the lower channel
|
@ -314,7 +314,11 @@ struct Sequence *BKE_sequence_metastrip(ListBase *seqbase /* = ed->seqbase */, s
|
|||
|
||||
void BKE_sequencer_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs);
|
||||
void BKE_sequencer_dupe_animdata(struct Scene *scene, const char *name_src, const char *name_dst);
|
||||
bool BKE_sequence_base_shuffle(struct ListBase *seqbasep, struct Sequence *test, struct Scene *evil_scene);
|
||||
bool BKE_sequence_base_shuffle_ex(
|
||||
struct ListBase *seqbasep, struct Sequence *test, struct Scene *evil_scene,
|
||||
int channel_delta);
|
||||
bool BKE_sequence_base_shuffle(
|
||||
struct ListBase *seqbasep, struct Sequence *test, struct Scene *evil_scene);
|
||||
bool BKE_sequence_base_shuffle_time(ListBase *seqbasep, struct Scene *evil_scene);
|
||||
bool BKE_sequence_base_isolated_sel_check(struct ListBase *seqbase);
|
||||
void BKE_sequencer_free_imbuf(struct Scene *scene, struct ListBase *seqbasep, bool for_render);
|
||||
|
|
|
@ -3764,21 +3764,23 @@ Sequence *BKE_sequencer_foreground_frame_get(Scene *scene, int frame)
|
|||
}
|
||||
|
||||
/* return 0 if there werent enough space */
|
||||
bool BKE_sequence_base_shuffle(ListBase *seqbasep, Sequence *test, Scene *evil_scene)
|
||||
bool BKE_sequence_base_shuffle_ex(ListBase *seqbasep, Sequence *test, Scene *evil_scene, int channel_delta)
|
||||
{
|
||||
int orig_machine = test->machine;
|
||||
test->machine++;
|
||||
const int orig_machine = test->machine;
|
||||
BLI_assert(ELEM(channel_delta, -1, 1));
|
||||
|
||||
test->machine += channel_delta;
|
||||
BKE_sequence_calc(evil_scene, test);
|
||||
while (BKE_sequence_test_overlap(seqbasep, test) ) {
|
||||
if (test->machine >= MAXSEQ) {
|
||||
while (BKE_sequence_test_overlap(seqbasep, test)) {
|
||||
if ((channel_delta > 0) ? (test->machine >= MAXSEQ) : (test->machine <= 1)) {
|
||||
break;
|
||||
}
|
||||
test->machine++;
|
||||
|
||||
test->machine += channel_delta;
|
||||
BKE_sequence_calc(evil_scene, test); // XXX - I don't think this is needed since were only moving vertically, Campbell.
|
||||
}
|
||||
|
||||
|
||||
if (test->machine >= MAXSEQ) {
|
||||
if ((test->machine < 1) || (test->machine > MAXSEQ)) {
|
||||
/* Blender 2.4x would remove the strip.
|
||||
* nicer to move it to the end */
|
||||
|
||||
|
@ -3802,6 +3804,11 @@ bool BKE_sequence_base_shuffle(ListBase *seqbasep, Sequence *test, Scene *evil_s
|
|||
}
|
||||
}
|
||||
|
||||
bool BKE_sequence_base_shuffle(ListBase *seqbasep, Sequence *test, Scene *evil_scene)
|
||||
{
|
||||
return BKE_sequence_base_shuffle_ex(seqbasep, test, evil_scene, 1);
|
||||
}
|
||||
|
||||
static int shuffle_seq_time_offset_test(ListBase *seqbasep, char dir)
|
||||
{
|
||||
int offset = 0;
|
||||
|
|
|
@ -290,11 +290,14 @@ static void rna_Sequence_channel_set(PointerRNA *ptr, int value)
|
|||
Scene *scene = (Scene *)ptr->id.data;
|
||||
Editing *ed = BKE_sequencer_editing_get(scene, false);
|
||||
ListBase *seqbase = BKE_sequence_seqbase(&ed->seqbase, seq);
|
||||
|
||||
seq->machine = value;
|
||||
|
||||
/* check channel increment or decrement */
|
||||
const int channel_delta = (value >= seq->machine) ? 1 : -1;
|
||||
seq->machine = value;
|
||||
|
||||
if (BKE_sequence_test_overlap(seqbase, seq)) {
|
||||
BKE_sequence_base_shuffle(seqbase, seq, scene); /* XXX - BROKEN!, uses context seqbasep */
|
||||
/* XXX - BROKEN!, uses context seqbasep */
|
||||
BKE_sequence_base_shuffle_ex(seqbase, seq, scene, channel_delta);
|
||||
}
|
||||
BKE_sequencer_sort(scene);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue