diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-05-28 17:45:06 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-05-28 17:45:06 +0400 |
commit | 7c8be33d14a3de8f0dfff91bf3e9dc55f81d0c30 (patch) | |
tree | 3cc9dd78aaf50f61022e3de34b3bd5d96de90a98 /source/blender/editors/transform/transform_conversions.c | |
parent | dcf2a071a008787946d6a15f134c012570e17a48 (diff) |
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.
Diffstat (limited to 'source/blender/editors/transform/transform_conversions.c')
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index cd58adc2991..96e75471c15 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -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]; |