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.
This commit is contained in:
Germano Cavalcante 2023-11-13 19:30:12 -03:00
parent 8f362a175d
commit 9dcf73c715
6 changed files with 46 additions and 16 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}