Fix T40338: Vertex transform origin ignores Normalize option in graph editor
Simply apply unit scale on curve transdata and un-apply on flush. Needs some more intense testing tho.
This commit is contained in:
@@ -3553,12 +3553,17 @@ static void createTransActionData(bContext *C, TransInfo *t)
|
||||
|
||||
/* ********************* GRAPH EDITOR ************************* */
|
||||
|
||||
typedef struct TransDataGraph {
|
||||
float unit_scale;
|
||||
} TransDataGraph;
|
||||
|
||||
/* Helper function for createTransGraphEditData, which is responsible for associating
|
||||
* source data with transform data
|
||||
*/
|
||||
static void bezt_to_transdata(TransData *td, TransData2D *td2d, AnimData *adt, BezTriple *bezt,
|
||||
static void bezt_to_transdata(TransData *td, TransData2D *td2d, TransDataGraph *tdg,
|
||||
AnimData *adt, BezTriple *bezt,
|
||||
int bi, short selected, short ishandle, short intvals,
|
||||
float mtx[3][3], float smtx[3][3])
|
||||
float mtx[3][3], float smtx[3][3], float unit_scale)
|
||||
{
|
||||
float *loc = bezt->vec[bi];
|
||||
const float *cent = bezt->vec[1];
|
||||
@@ -3572,25 +3577,26 @@ static void bezt_to_transdata(TransData *td, TransData2D *td2d, AnimData *adt, B
|
||||
|
||||
if (adt) {
|
||||
td2d->loc[0] = BKE_nla_tweakedit_remap(adt, loc[0], NLATIME_CONVERT_MAP);
|
||||
td2d->loc[1] = loc[1];
|
||||
td2d->loc[1] = loc[1] * unit_scale;
|
||||
td2d->loc[2] = 0.0f;
|
||||
td2d->loc2d = loc;
|
||||
|
||||
td->loc = td2d->loc;
|
||||
td->center[0] = BKE_nla_tweakedit_remap(adt, cent[0], NLATIME_CONVERT_MAP);
|
||||
td->center[1] = cent[1];
|
||||
td->center[1] = cent[1] * unit_scale;
|
||||
td->center[2] = 0.0f;
|
||||
|
||||
copy_v3_v3(td->iloc, td->loc);
|
||||
}
|
||||
else {
|
||||
td2d->loc[0] = loc[0];
|
||||
td2d->loc[1] = loc[1];
|
||||
td2d->loc[1] = loc[1] * unit_scale;
|
||||
td2d->loc[2] = 0.0f;
|
||||
td2d->loc2d = loc;
|
||||
|
||||
td->loc = td2d->loc;
|
||||
copy_v3_v3(td->center, cent);
|
||||
td->center[1] *= unit_scale;
|
||||
copy_v3_v3(td->iloc, td->loc);
|
||||
}
|
||||
|
||||
@@ -3631,6 +3637,8 @@ static void bezt_to_transdata(TransData *td, TransData2D *td2d, AnimData *adt, B
|
||||
/* copy space-conversion matrices for dealing with non-uniform scales */
|
||||
copy_m3_m3(td->mtx, mtx);
|
||||
copy_m3_m3(td->smtx, smtx);
|
||||
|
||||
tdg->unit_scale = unit_scale;
|
||||
}
|
||||
|
||||
static void createTransGraphEditData(bContext *C, TransInfo *t)
|
||||
@@ -3642,6 +3650,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
|
||||
|
||||
TransData *td = NULL;
|
||||
TransData2D *td2d = NULL;
|
||||
TransDataGraph *tdg = NULL;
|
||||
|
||||
bAnimContext ac;
|
||||
ListBase anim_data = {NULL, NULL};
|
||||
@@ -3749,9 +3758,12 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
|
||||
t->data = MEM_callocN(t->total * sizeof(TransData), "TransData (Graph Editor)");
|
||||
/* for each 2d vert a 3d vector is allocated, so that they can be treated just as if they were 3d verts */
|
||||
t->data2d = MEM_callocN(t->total * sizeof(TransData2D), "TransData2D (Graph Editor)");
|
||||
t->customData = MEM_callocN(t->total * sizeof(TransDataGraph), "TransDataGraph");
|
||||
t->flag |= T_FREE_CUSTOMDATA;
|
||||
|
||||
td = t->data;
|
||||
td2d = t->data2d;
|
||||
tdg = t->customData;
|
||||
|
||||
/* precompute space-conversion matrices for dealing with non-uniform scaling of Graph Editor */
|
||||
unit_m3(mtx);
|
||||
@@ -3778,7 +3790,6 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
|
||||
FCurve *fcu = (FCurve *)ale->key_data;
|
||||
short intvals = (fcu->flag & FCURVE_INT_VALUES);
|
||||
float unit_scale;
|
||||
float scaled_mtx[3][3], scaled_smtx[3][3];
|
||||
|
||||
/* convert current-frame to action-time (slightly less accurate, especially under
|
||||
* higher scaling ratios, but is faster than converting all points)
|
||||
@@ -3794,11 +3805,6 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
|
||||
|
||||
unit_scale = ANIM_unit_mapping_get_factor(ac.scene, ale->id, ale->key_data, anim_map_flag);
|
||||
|
||||
copy_m3_m3(scaled_mtx, mtx);
|
||||
copy_m3_m3(scaled_smtx, smtx);
|
||||
mul_v3_fl(scaled_mtx[1], unit_scale);
|
||||
mul_v3_fl(scaled_smtx[1], 1.0f / unit_scale);
|
||||
|
||||
/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse (if applicable) */
|
||||
for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) {
|
||||
if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) {
|
||||
@@ -3815,7 +3821,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
|
||||
if (!ELEM4(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE, TFM_TIME_DUPLICATE) || !(sel2)) {
|
||||
if (sel1) {
|
||||
hdata = initTransDataCurveHandles(td, bezt);
|
||||
bezt_to_transdata(td++, td2d++, adt, bezt, 0, 1, 1, intvals, scaled_mtx, scaled_smtx);
|
||||
bezt_to_transdata(td++, td2d++, tdg++, adt, bezt, 0, 1, 1, intvals, mtx, smtx, unit_scale);
|
||||
}
|
||||
else {
|
||||
/* h1 = 0; */ /* UNUSED */
|
||||
@@ -3824,7 +3830,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
|
||||
if (sel3) {
|
||||
if (hdata == NULL)
|
||||
hdata = initTransDataCurveHandles(td, bezt);
|
||||
bezt_to_transdata(td++, td2d++, adt, bezt, 2, 1, 1, intvals, scaled_mtx, scaled_smtx);
|
||||
bezt_to_transdata(td++, td2d++, tdg++, adt, bezt, 2, 1, 1, intvals, mtx, smtx, unit_scale);
|
||||
}
|
||||
else {
|
||||
/* h2 = 0; */ /* UNUSED */
|
||||
@@ -3846,7 +3852,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
|
||||
hdata = initTransDataCurveHandles(td, bezt);
|
||||
}
|
||||
|
||||
bezt_to_transdata(td++, td2d++, adt, bezt, 1, 1, 0, intvals, scaled_mtx, scaled_smtx);
|
||||
bezt_to_transdata(td++, td2d++, tdg++, adt, bezt, 1, 1, 0, intvals, mtx, smtx, unit_scale);
|
||||
|
||||
}
|
||||
/* special hack (must be done after initTransDataCurveHandles(), as that stores handle settings to restore...):
|
||||
@@ -4084,13 +4090,18 @@ void flushTransGraphData(TransInfo *t)
|
||||
SpaceIpo *sipo = (SpaceIpo *)t->sa->spacedata.first;
|
||||
TransData *td;
|
||||
TransData2D *td2d;
|
||||
TransDataGraph *tdg;
|
||||
Scene *scene = t->scene;
|
||||
double secf = FPS;
|
||||
int a;
|
||||
|
||||
/* flush to 2d vector from internally used 3d vector */
|
||||
for (a = 0, td = t->data, td2d = t->data2d; a < t->total; a++, td++, td2d++) {
|
||||
for (a = 0, td = t->data, td2d = t->data2d, tdg = t->customData;
|
||||
a < t->total;
|
||||
a++, td++, td2d++, tdg++)
|
||||
{
|
||||
AnimData *adt = (AnimData *)td->extra; /* pointers to relevant AnimData blocks are stored in the td->extra pointers */
|
||||
float unit_scale = tdg->unit_scale;
|
||||
|
||||
/* handle snapping for time values
|
||||
* - we should still be in NLA-mapping timespace
|
||||
@@ -4148,7 +4159,7 @@ void flushTransGraphData(TransInfo *t)
|
||||
if (td->flag & TD_INTVALUES)
|
||||
td2d->loc2d[1] = floorf(td2d->loc[1] + 0.5f);
|
||||
else
|
||||
td2d->loc2d[1] = td2d->loc[1];
|
||||
td2d->loc2d[1] = td2d->loc[1] / unit_scale;
|
||||
|
||||
if ((td->flag & TD_MOVEHANDLE1) && td2d->h1) {
|
||||
td2d->h1[0] = td2d->ih1[0] + td->loc[0] - td->iloc[0];
|
||||
|
||||
Reference in New Issue
Block a user