Fix #120834: Retiming does not work as expected.

This happened, because of lazy initialization of clicked retiming keys.
When the key is moved, the speed changed in respect to strip start, not
(uninitialized, but drawn) key at left handle.

Initialize both keys when any virtual key is selected.
This commit is contained in:
Richard Antalik
2024-04-28 03:41:52 +02:00
parent 4987ef010c
commit fd96b81821
4 changed files with 10 additions and 4 deletions

View File

@@ -331,7 +331,7 @@ int sequencer_retiming_box_select_exec(bContext *C, wmOperator *op);
/* `sequencer_retiming_draw.cc` */
void sequencer_draw_retiming(const bContext *C, SeqQuadsBatch *quads);
blender::Vector<Sequence *> sequencer_visible_strips_get(const bContext *C);
SeqRetimingKey *try_to_realize_virtual_key(const bContext *C, Sequence *seq, const int mval[2]);
SeqRetimingKey *try_to_realize_virtual_keys(const bContext *C, Sequence *seq, const int mval[2]);
SeqRetimingKey *retiming_mousover_key_get(const bContext *C, const int mval[2], Sequence **r_seq);
int left_fake_key_frame_get(const bContext *C, const Sequence *seq);
int right_fake_key_frame_get(const bContext *C, const Sequence *seq);

View File

@@ -738,7 +738,7 @@ int sequencer_retiming_key_select_exec(bContext *C, wmOperator *op)
/* Try to realize "fake" key, since it is clicked on. */
if (key == nullptr && seq_key_owner != nullptr) {
key = try_to_realize_virtual_key(C, seq_key_owner, mval);
key = try_to_realize_virtual_keys(C, seq_key_owner, mval);
}
const bool deselect_all = RNA_boolean_get(op->ptr, "deselect_all");

View File

@@ -173,7 +173,7 @@ static bool retiming_fake_key_is_clicked(const bContext *C,
return distance < RETIME_KEY_MOUSEOVER_THRESHOLD;
}
SeqRetimingKey *try_to_realize_virtual_key(const bContext *C, Sequence *seq, const int mval[2])
SeqRetimingKey *try_to_realize_virtual_keys(const bContext *C, Sequence *seq, const int mval[2])
{
Scene *scene = CTX_data_scene(C);
SeqRetimingKey *key = nullptr;
@@ -196,6 +196,12 @@ SeqRetimingKey *try_to_realize_virtual_key(const bContext *C, Sequence *seq, con
key = SEQ_retiming_add_key(scene, seq, frame);
}
/* Ensure both keys are realized, but return only one that was clicked on. */
if (key != nullptr) {
SEQ_retiming_add_key(scene, seq, SEQ_time_right_handle_frame_get(scene, seq));
SEQ_retiming_add_key(scene, seq, SEQ_time_left_handle_frame_get(scene, seq));
}
return key;
}

View File

@@ -989,7 +989,7 @@ int sequencer_select_exec(bContext *C, wmOperator *op)
/* Realize "fake" key, if it is clicked on. */
if (key == nullptr && seq_key_test != nullptr) {
key = try_to_realize_virtual_key(C, seq_key_test, mval);
key = try_to_realize_virtual_keys(C, seq_key_test, mval);
}
bool retiming_key_clicked = (key != nullptr);