Fix VSE retiming last key position incorrect

Last key is drawn on the right edge of the strip, but that is end of
the frame, which it should be bound to. Because of this, drawing code
and operators must consider, that this key is always displaced.

This was not done in 86a0d0015a and caused issues like #113755 that was
fixed incorrectly.
This commit is contained in:
Richard Antalik 2023-10-24 04:57:00 +02:00
parent 79b1eacba9
commit dadbb5c5f7
3 changed files with 7 additions and 4 deletions

@ -71,6 +71,9 @@ static float strip_y_rescale(const Sequence *seq, const float y_value)
static float key_x_get(const Scene *scene, const Sequence *seq, const SeqRetimingKey *key)
{
if (SEQ_retiming_is_last_key(seq, key)) {
return SEQ_retiming_key_timeline_frame_get(scene, seq, key) + 1;
}
return SEQ_retiming_key_timeline_frame_get(scene, seq, key);
}

@ -113,7 +113,7 @@ void SEQ_retiming_data_ensure(Sequence *seq)
seq->retiming_keys = (SeqRetimingKey *)MEM_calloc_arrayN(2, sizeof(SeqRetimingKey), __func__);
SeqRetimingKey *key = seq->retiming_keys + 1;
key->strip_frame_index = seq->len;
key->strip_frame_index = seq->len - 1;
key->retiming_factor = 1.0f;
seq->retiming_keys_num = 2;
}
@ -565,7 +565,7 @@ float SEQ_retiming_key_speed_get(const Sequence *seq, const SeqRetimingKey *key)
const SeqRetimingKey *key_prev = key - 1;
const int frame_index_max = seq->len;
const int frame_index_max = seq->len - 1;
const int frame_retimed_prev = round_fl_to_int(key_prev->retiming_factor * frame_index_max);
const int frame_index_prev = key_prev->strip_frame_index;
const int frame_retimed = round_fl_to_int(key->retiming_factor * frame_index_max);

@ -504,8 +504,8 @@ int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq)
if (SEQ_retiming_is_active(seq)) {
const SeqRetimingKey *key_start = seq->retiming_keys;
const SeqRetimingKey *key_end = seq->retiming_keys + (SEQ_retiming_keys_count(seq) - 1);
return key_end->strip_frame_index / seq_time_media_playback_rate_factor_get(scene, seq) -
(key_start->strip_frame_index) / seq_time_media_playback_rate_factor_get(scene, seq);
return (key_end->strip_frame_index + 1) / seq_time_media_playback_rate_factor_get(scene, seq) -
key_start->strip_frame_index / seq_time_media_playback_rate_factor_get(scene, seq);
}
return seq->len / seq_time_media_playback_rate_factor_get(scene, seq);