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:
parent
8f362a175d
commit
9dcf73c715
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue