Revision: 28628
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28628
Author:   joeedh
Date:     2010-05-06 21:54:43 +0200 (Thu, 06 May 2010)

Log Message:
-----------
keyframe transform, both through dopesheet/action editor and graph editor, 
works a bit better with handles.  handles now follow keyframes properly in 
frame snap mode, in situations where they would move (but the keyframe would 
not) in undesirable ways before.  also hopefully fixed vector scope crash in 
image editor.  and disabled snapping to seconds (ever); this can be a seperate 
option, silently switching to second snapping in frame snapping mode is 
absolutely evil.  also, the action editor draws in hundredth of seconds, not 
seconds, so it didn't even work.  Aligorith: I hope this code is ok, if not 
feel free to rewrite it.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface_draw.c
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c

Modified: trunk/blender/source/blender/editors/interface/interface_draw.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_draw.c     
2010-05-06 19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/interface/interface_draw.c     
2010-05-06 19:54:43 UTC (rev 28628)
@@ -1088,9 +1088,13 @@
 
        glTranslatef(centerx, centery, 0.f);
        glScalef(diam, diam, 0.f);
-       glVertexPointer(2, GL_FLOAT, 0, scopes->vecscope);
-       glDrawArrays(GL_POINTS, 0, scopes->waveform_tot);
 
+       /*apparently this can sometimes be NULL? - joeedh*/
+       if (scopes) {
+               glVertexPointer(2, GL_FLOAT, 0, scopes->vecscope);
+               glDrawArrays(GL_POINTS, 0, scopes->waveform_tot);
+       }
+
        glDisableClientState(GL_VERTEX_ARRAY);
        glPopMatrix();
        

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c  2010-05-06 
19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform.c  2010-05-06 
19:54:43 UTC (rev 28628)
@@ -202,17 +202,32 @@
 
                UI_view2d_to_region_no_clip(t->view, v[0], v[1], adr, adr+1);
        }
-       else if(ELEM3(t->spacetype, SPACE_IPO, SPACE_NLA, SPACE_ACTION)) {
+       else if(t->spacetype == SPACE_ACTION) {
+               SpaceAction *sact = t->sa->spacedata.first;
                int out[2] = {0, 0};
 
-               UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], 
out, out+1);
+               if (sact->flag & SACTION_DRAWTIME) {
+                       //vec[0] = vec[0]/((t->scene->r.frs_sec / 
t->scene->r.frs_sec_base));
+
+                       UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], 
vec[1], out, out+1);
+               } else {
+                       UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], 
vec[1], out, out+1);
+               }
+
                adr[0]= out[0];
                adr[1]= out[1];
        }
+       else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) {
+               int out[2] = {0, 0};
+
+               UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], 
out, out+1);
+               adr[0]= out[0];
+               adr[1]= out[1];
+       }
        else if(t->spacetype==SPACE_SEQ) { /* XXX not tested yet, but should 
work */
                int out[2] = {0, 0};
 
-               UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], 
out, out+1);
+               UI_view2d_to_region_no_clip((View2D *)t->view, vec[0], vec[1], 
out, out+1);
                adr[0]= out[0];
                adr[1]= out[1];
        }
@@ -5285,12 +5300,12 @@
 /* This function is used by Animation Editor specific transform functions to do
  * the Snap Keyframe to Nearest Frame/Marker
  */
-static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, AnimData *adt, 
short autosnap)
+static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D 
*td2d, AnimData *adt, short autosnap)
 {
        /* snap key to nearest frame? */
        if (autosnap == SACTSNAP_FRAME) {
                const Scene *scene= t->scene;
-               const short doTime= getAnimEdit_DrawTime(t);
+               const short doTime= 0; //XXX doesn't work - 
getAnimEdit_DrawTime(t);
                const double secf= FPS;
                double val;
 
@@ -5332,6 +5347,14 @@
                else
                        *(td->val)= val;
        }
+
+       if ((td->flag & TD_MOVEHANDLE1) && td2d->h1) {
+               td2d->h1[0] = td2d->ih1[0] + *td->val - td->ival;
+       }
+
+       if ((td->flag & TD_MOVEHANDLE2) && td2d->h2) {
+               td2d->h2[0] = td2d->ih2[0] + *td->val - td->ival;
+       }
 }
 
 /* ----------------- Translation ----------------------- */
@@ -5394,6 +5417,7 @@
 static void applyTimeTranslate(TransInfo *t, float sval)
 {
        TransData *td = t->data;
+       TransData2D *td2d = t->data2d;
        Scene *scene = t->scene;
        int i;
 
@@ -5402,16 +5426,18 @@
 
        const short autosnap= getAnimEdit_SnapMode(t);
 
-       float deltax, val;
+       float deltax, val, valprev;
 
        /* it doesn't matter whether we apply to t->data or t->data2d, but 
t->data2d is more convenient */
-       for (i = 0 ; i < t->total; i++, td++) {
+       for (i = 0 ; i < t->total; i++, td++, td2d++) {
                /* it is assumed that td->extra is a pointer to the AnimData,
                 * whose active action is where this keyframe comes from
                 * (this is only valid when not in NLA)
                 */
                AnimData *adt= (t->spacetype != SPACE_NLA) ? td->extra : NULL;
 
+               valprev = *td->val;
+
                /* check if any need to apply nla-mapping */
                if (adt && t->spacetype != SPACE_SEQ) {
                        deltax = t->values[0];
@@ -5441,7 +5467,7 @@
                }
 
                /* apply nearest snapping */
-               doAnimEdit_SnapFrame(t, td, adt, autosnap);
+               doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap);
        }
 }
 
@@ -5652,6 +5678,7 @@
 static void applyTimeScale(TransInfo *t) {
        Scene *scene = t->scene;
        TransData *td = t->data;
+       TransData2D *td2d = t->data2d;
        int i;
 
        const short autosnap= getAnimEdit_SnapMode(t);
@@ -5659,7 +5686,7 @@
        const double secf= FPS;
 
 
-       for (i = 0 ; i < t->total; i++, td++) {
+       for (i = 0 ; i < t->total; i++, td++, td2d++) {
                /* it is assumed that td->extra is a pointer to the AnimData,
                 * whose active action is where this keyframe comes from
                 * (this is only valid when not in NLA)
@@ -5685,7 +5712,7 @@
                *(td->val) += startx;
 
                /* apply nearest snapping */
-               doAnimEdit_SnapFrame(t, td, adt, autosnap);
+               doAnimEdit_SnapFrame(t, td, td2d, adt, autosnap);
        }
 }
 

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h  2010-05-06 
19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform.h  2010-05-06 
19:54:43 UTC (rev 28628)
@@ -151,6 +151,9 @@
 typedef struct TransData2D {
        float loc[3];           /* Location of data used to transform (x,y,0) */
        float *loc2d;           /* Pointer to real 2d location of data */
+
+       float *h1, *h2;     /* Pointer to handle locations, if handles aren't 
being moved independantly*/
+       float ih1[2], ih2[2];
 } TransData2D;
 
 /* we need to store 2 handles for each transdata incase the other handle wasnt 
selected */
@@ -427,6 +430,8 @@
 #define TD_NOTIMESNAP          (1 << 14)       /* for Graph Editor autosnap, 
indicates that point should not undergo autosnapping */
 #define TD_INTVALUES           (1 << 15)       /* for Graph Editor - curves 
that can only have int-values need their keyframes tagged with this */
 #define TD_MIRROR_EDGE         (1 << 16)       /* For editmode mirror, clamp 
to x = 0 */
+#define TD_MOVEHANDLE1         (1 << 17)       /* For fcurve handles, move 
them along with their keyframes */
+#define TD_MOVEHANDLE2         (1 << 18)
 
 /* transsnap->status */
 #define SNAP_FORCED            1

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c      
2010-05-06 19:16:45 UTC (rev 28627)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c      
2010-05-06 19:54:43 UTC (rev 28628)
@@ -2972,9 +2972,8 @@
                        bezt->f1 |= SELECT;
                        bezt->f3 |= SELECT;
 
-                       /* increment by 3, as there are 3 points (3 * 
x-coordinates) that need transform */
                        if (FrameOnMouseSide(side, bezt->vec[1][0], cfra))
-                               count += 3;
+                               count += 1;
                }
        }
 
@@ -3023,9 +3022,10 @@
  * The 'side' argument is needed for the extend mode. 'B' = both sides, 
'R'/'L' mean only data
  * on the named side are used.
  */
-static TransData *FCurveToTransData(TransData *td, FCurve *fcu, AnimData *adt, 
char side, float cfra)
+static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, 
FCurve *fcu, AnimData *adt, char side, float cfra)
 {
        BezTriple *bezt;
+       TransData2D *td2d = *td2dv;
        int i;
 
        if (fcu == NULL)
@@ -3036,19 +3036,24 @@
                if (BEZSELECTED(bezt)) {
                        /* only add if on the right 'side' of the current frame 
*/
                        if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
-                               /* each control point needs to be added 
separetely */
-                               TimeToTransData(td, bezt->vec[0], adt);
-                               td++;
-
                                TimeToTransData(td, bezt->vec[1], adt);
-                               td++;
 
-                               TimeToTransData(td, bezt->vec[2], adt);
+                               /*set flags to move handles as necassary*/
+                               td->flag |= TD_MOVEHANDLE1|TD_MOVEHANDLE2;
+                               td2d->h1 = bezt->vec[0];
+                               td2d->h2 = bezt->vec[2];
+
+                               VECCOPY2D(td2d->ih1, td2d->h1);
+                               VECCOPY2D(td2d->ih2, td2d->h2);
+
                                td++;
+                               td2d++;
                        }
                }
        }
 
+       *td2dv = td2d;
+
        return td;
 }
 
@@ -3116,6 +3121,7 @@
 {
        Scene *scene= t->scene;
        TransData *td = NULL;
+       TransData2D *td2d = NULL;
        tGPFtransdata *tfd = NULL;
        
        bAnimContext ac;
@@ -3179,7 +3185,9 @@
        t->total= count;
        
        t->data= MEM_callocN(t->total*sizeof(TransData), "TransData(Action 
Editor)");
+       t->data2d= MEM_callocN(t->total*sizeof(TransData2D), "transdata2d");
        td= t->data;
+       td2d = t->data2d;
        
        if (ac.datatype == ANIMCONT_GPENCIL) {
                if (t->mode == TFM_TIME_SLIDE) {
@@ -3216,7 +3224,7 @@
                        else
                                cfra = (float)CFRA;
                        
-                       td= FCurveToTransData(td, fcu, adt, t->frame_side, 
cfra);
+                       td= ActionFCurveToTransData(td, &td2d, fcu, adt, 
t->frame_side, cfra);
                //}
        }
        
@@ -3248,8 +3256,11 @@
 /* Helper function for createTransGraphEditData, which is reponsible for 
associating
  * source data with transform data
  */
-static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData 
*adt, float *loc, float *cent, short selected, short ishandle, short intvals)
+static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData 
*adt, BezTriple *bezt, int bi, short selected, short ishandle, short intvals)
 {
+       float *loc = bezt->vec[bi];
+       float *cent = bezt->vec[1];
+
        /* New location from td gets dumped onto the old-location of td2d, 
which then
         * gets copied to the actual data at td2d->loc2d (bezt->vec[n])
         *
@@ -3280,7 +3291,17 @@
                VECCOPY(td->center, cent);
                VECCOPY(td->iloc, td->loc);
        }
-       
+
+       if (td->flag & TD_MOVEHANDLE1) {
+               td2d->h1 = bezt->vec[0];
+               VECCOPY2D(td2d->ih1, td2d->h1);
+       } else td2d->h1 = NULL;
+
+       if (td->flag & TD_MOVEHANDLE2) {
+               td2d->h2 = bezt->vec[2];
+               VECCOPY2D(td2d->ih2, td2d->h2);
+       } else td2d->h2 = NULL;
+
        memset(td->axismtx, 0, sizeof(td->axismtx));
        td->axismtx[2][2] = 1.0f;
        
@@ -3300,7 +3321,7 @@
                td->flag |= TD_NOTIMESNAP;
        if (intvals)
                td->flag |= TD_INTVALUES;
-       
+
        unit_m3(td->mtx);
        unit_m3(td->smtx);
 }
@@ -3362,11 +3383,11 @@
                /* F-Curve may not have any keyframes */
                if (fcu->bezt == NULL)
                        continue;
-               
+
                /* only include BezTriples whose 'keyframe' occurs on the same 
side of the current frame as mouse */
                for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
                        if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], 
cfra)) {
-                               if (sipo->around == V3D_LOCAL) {
+                               if (sipo->around == V3D_LOCAL && !ELEM(t->mode, 
TFM_TRANSLATION, TFM_TIME_TRANSLATE)) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to