Commit: 7c8be33d14a3de8f0dfff91bf3e9dc55f81d0c30
Author: Sergey Sharybin
Date:   Wed May 28 19:45:06 2014 +0600
https://developer.blender.org/rB7c8be33d14a3de8f0dfff91bf3e9dc55f81d0c30

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.

===================================================================

M       source/blender/editors/transform/transform_conversions.c

===================================================================

diff --git a/source/blender/editors/transform/transform_conversions.c 
b/source/blender/editors/transform/transform_conversions.c
index cd58adc..96e7547 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];

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to