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:
parent
5092fe60e6
commit
f372ac6f61
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user