Fix T46678: Extending left handle of a VSE multicam effect strip with snap creates frame stills.
Also fixes cache handling for those strips, they need more radical flushing...
This commit is contained in:
@@ -314,6 +314,7 @@ void BKE_sequence_tx_set_final_left(struct Sequence *seq, int val);
|
||||
void BKE_sequence_tx_set_final_right(struct Sequence *seq, int val);
|
||||
void BKE_sequence_tx_handle_xlimits(struct Sequence *seq, int leftflag, int rightflag);
|
||||
bool BKE_sequence_tx_test(struct Sequence *seq);
|
||||
bool BKE_sequence_tx_fullupdate_test(struct Sequence *seq);
|
||||
bool BKE_sequence_single_check(struct Sequence *seq);
|
||||
void BKE_sequence_single_fix(struct Sequence *seq);
|
||||
bool BKE_sequence_test_overlap(struct ListBase *seqbasep, struct Sequence *test);
|
||||
|
||||
@@ -4252,6 +4252,17 @@ bool BKE_sequence_tx_test(Sequence *seq)
|
||||
return !(seq->type & SEQ_TYPE_EFFECT) || (BKE_sequence_effect_get_num_inputs(seq->type) == 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return \a true if given \a seq needs a complete cleanup of its cache when it is transformed.
|
||||
*
|
||||
* Some (effect) strip types need a complete recache of themselves when they are transformed, because
|
||||
* they do not 'contain' anything and do not have any explicit relations to other strips.
|
||||
*/
|
||||
bool BKE_sequence_tx_fullupdate_test(Sequence *seq)
|
||||
{
|
||||
return BKE_sequence_tx_test(seq) && ELEM(seq->type, SEQ_TYPE_ADJUSTMENT, SEQ_TYPE_MULTICAM);
|
||||
}
|
||||
|
||||
static bool seq_overlap(Sequence *seq1, Sequence *seq2)
|
||||
{
|
||||
return (seq1 != seq2 && seq1->machine == seq2->machine &&
|
||||
|
||||
@@ -1206,6 +1206,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
|
||||
BKE_sequence_tx_set_final_right(seq, snap_frame);
|
||||
}
|
||||
BKE_sequence_tx_handle_xlimits(seq, seq->flag & SEQ_LEFTSEL, seq->flag & SEQ_RIGHTSEL);
|
||||
BKE_sequence_single_fix(seq);
|
||||
}
|
||||
BKE_sequence_calc(scene, seq);
|
||||
}
|
||||
@@ -2516,6 +2517,7 @@ static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
#if 1
|
||||
BKE_sequence_tx_set_final_left(ms->parseq, ms->disp_range[0]);
|
||||
BKE_sequence_tx_set_final_right(ms->parseq, ms->disp_range[1]);
|
||||
BKE_sequence_single_fix(seq);
|
||||
BKE_sequence_calc(scene, ms->parseq);
|
||||
#else
|
||||
if (BKE_sequence_test_overlap(ed->seqbasep, ms->parseq))
|
||||
|
||||
@@ -951,7 +951,13 @@ static void recalcData_sequencer(TransInfo *t)
|
||||
Sequence *seq = tdsq->seq;
|
||||
|
||||
if (seq != seq_prev) {
|
||||
BKE_sequence_invalidate_dependent(t->scene, seq);
|
||||
if (BKE_sequence_tx_fullupdate_test(seq)) {
|
||||
/* A few effect strip types need a complete recache on transform. */
|
||||
BKE_sequence_invalidate_cache(t->scene, seq);
|
||||
}
|
||||
else {
|
||||
BKE_sequence_invalidate_dependent(t->scene, seq);
|
||||
}
|
||||
}
|
||||
|
||||
seq_prev = seq;
|
||||
|
||||
Reference in New Issue
Block a user