VSE: Keep exiting retiming when changing speed

Add "Preserve Current Retiming" option to set speed operator. This
option is enabled by default. When changing speed of retiming segment,
the strip changes length instead of changing next segment speed.

Ref: #112343
This commit is contained in:
Richard Antalik 2023-12-13 20:39:08 +01:00
parent 5092fe60e6
commit f372ac6f61
3 changed files with 32 additions and 10 deletions

@ -553,7 +553,7 @@ static int strip_speed_set_exec(bContext *C, const wmOperator *op)
continue;
}
/* TODO: it would be nice to multiply speed with complex retiming by a factor. */
SEQ_retiming_key_speed_set(scene, seq, key, RNA_float_get(op->ptr, "speed"));
SEQ_retiming_key_speed_set(scene, seq, key, RNA_float_get(op->ptr, "speed"), false);
SEQ_relations_invalidate_cache_raw(scene, seq);
}
@ -566,9 +566,19 @@ static int segment_speed_set_exec(const bContext *C,
blender::Map<SeqRetimingKey *, Sequence *> selection)
{
Scene *scene = CTX_data_scene(C);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene));
for (auto item : selection.items()) {
SEQ_retiming_key_speed_set(scene, item.value, item.key, RNA_float_get(op->ptr, "speed"));
SEQ_retiming_key_speed_set(scene,
item.value,
item.key,
RNA_float_get(op->ptr, "speed"),
RNA_boolean_get(op->ptr, "keep_retiming"));
if (SEQ_transform_test_overlap(scene, seqbase, item.value)) {
SEQ_transform_seqbase_shuffle(seqbase, item.value, scene);
}
SEQ_relations_invalidate_cache_raw(scene, item.value);
}
@ -631,6 +641,12 @@ void SEQUENCER_OT_retiming_segment_speed_set(wmOperatorType *ot)
"New speed of retimed segment",
0.1f,
FLT_MAX);
RNA_def_boolean(ot->srna,
"keep_retiming",
true,
"Preserve Current retiming",
"Keep speed of other segments unchanged, change strip length instead");
}
/** \} */

@ -45,10 +45,8 @@ void SEQ_retiming_offset_transition_key(const Scene *scene,
SeqRetimingKey *key,
int offset);
float SEQ_retiming_key_speed_get(const Sequence *seq, const SeqRetimingKey *key);
void SEQ_retiming_key_speed_set(const Scene *scene,
Sequence *seq,
SeqRetimingKey *key,
float speed);
void SEQ_retiming_key_speed_set(
const Scene *scene, Sequence *seq, SeqRetimingKey *key, float speed, bool keep_retiming);
int SEQ_retiming_key_index_get(const Sequence *seq, const SeqRetimingKey *key);
SeqRetimingKey *SEQ_retiming_key_get_by_timeline_frame(const Scene *scene,
const Sequence *seq,

@ -996,10 +996,8 @@ void SEQ_retiming_key_timeline_frame_set(const Scene *scene,
SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq));
}
void SEQ_retiming_key_speed_set(const Scene *scene,
Sequence *seq,
SeqRetimingKey *key,
const float speed)
void SEQ_retiming_key_speed_set(
const Scene *scene, Sequence *seq, SeqRetimingKey *key, const float speed, bool keep_retiming)
{
if (key->strip_frame_index == 0) {
return;
@ -1015,10 +1013,20 @@ void SEQ_retiming_key_speed_set(const Scene *scene,
const int segment_duration = frame_retimed - frame_retimed_prev;
const int new_duration = segment_duration * speed_fac;
const int orig_timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, seq, key);
const int new_timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, seq, key_prev) +
new_duration;
SEQ_retiming_key_timeline_frame_set(scene, seq, key, new_timeline_frame);
if (keep_retiming) {
const int key_index = SEQ_retiming_key_index_get(seq, key);
const int offset = new_timeline_frame - orig_timeline_frame;
for (int i = key_index + 1; i < SEQ_retiming_keys_count(seq); i++) {
SeqRetimingKey *key_iter = &SEQ_retiming_keys_get(seq)[i];
seq_retiming_key_offset(scene, seq, key_iter, offset);
}
}
}
bool SEQ_retiming_selection_clear(const Editing *ed)