From 9dcf73c7157f342cb16092b4e47864777a59a4f1 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 13 Nov 2023 19:30:12 -0300 Subject: [PATCH] Fix #114787: VSE: canceling move does not reset strip channel Probably caused by ad01cdd7fc. Once again, problems resetting values due to `td->val` and `td->loc` sharing the same pointer. This needs to be avoided, as when resetting it is always expected that one will be 1D and the other 3D. --- .../editors/transform/transform_convert.cc | 3 +++ .../transform/transform_convert_sequencer.cc | 4 ---- .../editors/transform/transform_generics.cc | 3 +++ .../transform/transform_mode_baketime.cc | 22 +++++++++++++------ .../transform/transform_mode_timeslide.cc | 18 +++++++++++---- .../transform/transform_mode_timetranslate.cc | 12 +++++++++- 6 files changed, 46 insertions(+), 16 deletions(-) diff --git a/source/blender/editors/transform/transform_convert.cc b/source/blender/editors/transform/transform_convert.cc index 0818adadc9d..27ccc92bdbf 100644 --- a/source/blender/editors/transform/transform_convert.cc +++ b/source/blender/editors/transform/transform_convert.cc @@ -1092,6 +1092,9 @@ void create_trans_data(bContext *C, TransInfo *t) t->obedit_type = -1; } t->data_type->create_trans_data(C, t); + BLI_assert_msg(!t->data_container || !t->data_container->data || + (t->data_container->data[0].val != t->data_container->data[0].loc), + "td->val is only for 1D values"); } countAndCleanTransDataContainer(t); diff --git a/source/blender/editors/transform/transform_convert_sequencer.cc b/source/blender/editors/transform/transform_convert_sequencer.cc index b0e6c8a34fe..faa814eaec4 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.cc +++ b/source/blender/editors/transform/transform_convert_sequencer.cc @@ -221,10 +221,6 @@ static TransData *SeqToTransData(Scene *scene, unit_m3(td->mtx); unit_m3(td->smtx); - /* Time Transform (extend) */ - td->val = td2d->loc; - td->ival = td2d->loc[0]; - return td; } diff --git a/source/blender/editors/transform/transform_generics.cc b/source/blender/editors/transform/transform_generics.cc index d86a38bc57a..4a94f183e72 100644 --- a/source/blender/editors/transform/transform_generics.cc +++ b/source/blender/editors/transform/transform_generics.cc @@ -841,6 +841,9 @@ void applyTransObjects(TransInfo *t) static void transdata_restore_basic(TransDataBasic *td_basic) { + BLI_assert_msg(td_basic->val != td_basic->loc, + "it shouldn't happen. `val` is for 1D, `loc` is for 3D"); + if (td_basic->val) { *td_basic->val = td_basic->ival; } diff --git a/source/blender/editors/transform/transform_mode_baketime.cc b/source/blender/editors/transform/transform_mode_baketime.cc index 78fd94bd09e..b2fe672dbaa 100644 --- a/source/blender/editors/transform/transform_mode_baketime.cc +++ b/source/blender/editors/transform/transform_mode_baketime.cc @@ -86,14 +86,22 @@ static void applyBakeTime(TransInfo *t) continue; } + float *dst, ival; if (td->val) { - *td->val = td->ival + time * td->factor; - if (td->ext->size && *td->val < *td->ext->size) { - *td->val = *td->ext->size; - } - if (td->ext->quat && *td->val > *td->ext->quat) { - *td->val = *td->ext->quat; - } + dst = td->val; + ival = td->ival; + } + else { + dst = &td->loc[0]; + ival = td->iloc[0]; + } + + *dst = ival + time * td->factor; + if (td->ext->size && *dst < *td->ext->size) { + *dst = *td->ext->size; + } + if (td->ext->quat && *dst > *td->ext->quat) { + *dst = *td->ext->quat; } } } diff --git a/source/blender/editors/transform/transform_mode_timeslide.cc b/source/blender/editors/transform/transform_mode_timeslide.cc index 5ae6049b3cc..e0ebf0cead6 100644 --- a/source/blender/editors/transform/transform_mode_timeslide.cc +++ b/source/blender/editors/transform/transform_mode_timeslide.cc @@ -85,8 +85,18 @@ static void applyTimeSlideValue(TransInfo *t, float sval, float cval) /* only apply to data if in range */ if ((sval > minx) && (sval < maxx)) { float cvalc = CLAMPIS(cval, minx, maxx); - float ival = td->ival; float timefac; + float *dst; + float ival; + + if (td->val) { + dst = td->val; + ival = td->ival; + } + else { + dst = &td->loc[0]; + ival = td->iloc[0]; + } /* NLA mapping magic here works as follows: * - "ival" goes from strip time to global time @@ -102,16 +112,16 @@ static void applyTimeSlideValue(TransInfo *t, float sval, float cval) /* left half? */ if (ival < sval) { timefac = (sval - ival) / (sval - minx); - *(td->val) = cvalc - timefac * (cvalc - minx); + *dst = cvalc - timefac * (cvalc - minx); } else { timefac = (ival - sval) / (maxx - sval); - *(td->val) = cvalc + timefac * (maxx - cvalc); + *dst = cvalc + timefac * (maxx - cvalc); } if (adt) { /* global to strip */ - *(td->val) = BKE_nla_tweakedit_remap(adt, *(td->val), NLATIME_CONVERT_UNMAP); + *dst = BKE_nla_tweakedit_remap(adt, *dst, NLATIME_CONVERT_UNMAP); } } } diff --git a/source/blender/editors/transform/transform_mode_timetranslate.cc b/source/blender/editors/transform/transform_mode_timetranslate.cc index 4a94fe1fdd5..d536dadeecc 100644 --- a/source/blender/editors/transform/transform_mode_timetranslate.cc +++ b/source/blender/editors/transform/transform_mode_timetranslate.cc @@ -82,7 +82,17 @@ static void applyTimeTranslateValue(TransInfo *t, const float deltax) /* It doesn't matter whether we apply to t->data. */ TransData *td = tc->data; for (int i = 0; i < tc->data_len; i++, td++) { - *(td->val) = td->loc[0] = td->ival + deltax * td->factor; + float *dst, ival; + if (td->val) { + dst = td->val; + ival = td->ival; + } + else { + dst = &td->loc[0]; + ival = td->iloc[0]; + } + + *dst = ival + deltax * td->factor; } } }