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:
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user