2.5 Transform Code - Preparing for Action Editor Support
authorJoshua Leung <aligorith@gmail.com>
Mon, 29 Dec 2008 06:06:59 +0000 (06:06 +0000)
committerJoshua Leung <aligorith@gmail.com>
Mon, 29 Dec 2008 06:06:59 +0000 (06:06 +0000)
* Fixed up most of the relevant Fixme's for Action Editor and/or some animation stuff

* Added keymap for action editor transforms to transform keymap.

* Added context pointer to TransInfo struct. This was needed to avoid passing context to everything. As such, renamed the old 'context' setting to options.

source/blender/editors/space_action/action_header.c
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_conversions.c
source/blender/editors/transform/transform_generics.c
source/blender/editors/transform/transform_ops.c

index d04ffd0935d84cfc1b28a5a972c4a83a87c48003..b7fb24f400bcadfb644145d11b49401becd69b6a 100644 (file)
@@ -488,12 +488,12 @@ void action_header_buttons(const bContext *C, ARegion *ar)
                
                xmax= GetButStringLength("View");
                uiDefPulldownBut(block, action_viewmenu, CTX_wm_area(C), 
-                                         "View", xco, yco, xmax-3, 24, "");
+                                         "View", xco, yco-2, xmax-3, 24, "");
                xco+= xmax;
                
                xmax= GetButStringLength("Select");
                uiDefPulldownBut(block, action_selectmenu, CTX_wm_area(C), 
-                                         "Select", xco, yco, xmax-3, 24, "");
+                                         "Select", xco, yco-2, xmax-3, 24, "");
                xco+= xmax;
                
                if ( (saction->mode == SACTCONT_DOPESHEET) ||
@@ -501,31 +501,31 @@ void action_header_buttons(const bContext *C, ARegion *ar)
                {
                        xmax= GetButStringLength("Channel");
                        uiDefPulldownBut(block, action_channelmenu, CTX_wm_area(C), 
-                                                 "Channel", xco, yco, xmax-3, 24, "");
+                                                 "Channel", xco, yco-2, xmax-3, 24, "");
                        xco+= xmax;
                }
                else if (saction->mode==SACTCONT_GPENCIL) {
                        xmax= GetButStringLength("Channel");
                        uiDefPulldownBut(block, action_gplayermenu, CTX_wm_area(C), 
-                                                 "Channel", xco, yco, xmax-3, 24, "");
+                                                 "Channel", xco, yco-2, xmax-3, 24, "");
                        xco+= xmax;
                }
                
                xmax= GetButStringLength("Marker");
                uiDefPulldownBut(block, action_markermenu, CTX_wm_area(C), 
-                                         "Marker", xco, yco, xmax-3, 24, "");
+                                         "Marker", xco, yco-2, xmax-3, 24, "");
                xco+= xmax;
                
                if (saction->mode == SACTCONT_GPENCIL) {
                        xmax= GetButStringLength("Frame");
                        uiDefPulldownBut(block, action_framemenu, CTX_wm_area(C), 
-                                                 "Frame", xco, yco, xmax-3, 24, "");
+                                                 "Frame", xco, yco-2, xmax-3, 24, "");
                        xco+= xmax;
                }
                else {
                        xmax= GetButStringLength("Key");
                        uiDefPulldownBut(block, action_keymenu, CTX_wm_area(C), 
-                                                 "Key", xco, yco, xmax-3, 24, "");
+                                                 "Key", xco, yco-2, xmax-3, 24, "");
                        xco+= xmax;
                }
        }
index 8141fe68b69ed39acb5cea6ec26522d92cd92608..124f5b610a64e147e17f3af073ca8630a867856f 100644 (file)
@@ -467,6 +467,16 @@ static void viewRedrawForce(TransInfo *t)
                // need to redraw ALL 3d view
                ED_area_tag_redraw(t->sa);
        }
+       else if (t->spacetype == SPACE_ACTION) {
+               SpaceAction *saction= CTX_wm_space_data(t->context);
+               
+               // TRANSFORM_FIX_ME
+               if (saction->lock) {
+                       // whole window...
+               }
+               else 
+                       ED_area_tag_redraw(t->sa);
+       }
 #if 0 // TRANSFORM_FIX_ME
        else if (t->spacetype==SPACE_IMAGE) {
                if (G.sima->lock) force_draw_plus(SPACE_VIEW3D, 0);
@@ -961,14 +971,14 @@ void transformEvent(TransInfo *t, wmEvent *event)
                switch(handleNDofInput(&(t->ndof), event))
                {
                        case NDOF_CONFIRM:
-                               if ((t->context & CTX_NDOF) == 0)
+                               if ((t->options & CTX_NDOF) == 0)
                                {
                                        /* Confirm on normal transform only */
                                        t->state = TRANS_CONFIRM;
                                }
                                break;
                        case NDOF_CANCEL:
-                               if (t->context & CTX_NDOF)
+                               if (t->options & CTX_NDOF)
                                {
                                        /* Cancel on pure NDOF transform */
                                        t->state = TRANS_CANCEL; 
@@ -980,7 +990,7 @@ void transformEvent(TransInfo *t, wmEvent *event)
                                }
                                break;
                        case NDOF_NOMOVE:
-                               if (t->context & CTX_NDOF)
+                               if (t->options & CTX_NDOF)
                                {
                                        /* Confirm on pure NDOF transform */
                                        t->state = TRANS_CONFIRM;
@@ -1010,7 +1020,7 @@ void transformEvent(TransInfo *t, wmEvent *event)
                        break;
                case LEFTMOUSE:
                case RIGHTMOUSE:
-                       if (t->context & CTX_TWEAK)
+                       if (t->options & CTX_TWEAK)
                                t->state = TRANS_CONFIRM;
                        break;
                case LEFTSHIFTKEY:
@@ -1033,7 +1043,7 @@ int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float
 
        t->state = TRANS_RUNNING;
 
-       t->context = CTX_NONE;
+       t->options = CTX_NONE;
        
        t->mode = TFM_DUMMY;
 
@@ -1065,13 +1075,13 @@ int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float
        return success;
 }
 
-void initTransform(bContext *C, TransInfo *t, int mode, int context, wmEvent *event)
+void initTransform(bContext *C, TransInfo *t, int mode, int options, wmEvent *event)
 {
        /* added initialize, for external calls to set stuff in TransInfo, like undo string */
 
        t->state = TRANS_RUNNING;
 
-       t->context = context;
+       t->options = options;
        
        t->mode = mode;
 
@@ -1207,7 +1217,7 @@ void transformApply(TransInfo *t)
        }
 
        /* If auto confirm is on, break after one pass */               
-       if (t->context & CTX_AUTOCONFIRM)
+       if (t->options & CTX_AUTOCONFIRM)
        {
                t->state = TRANS_CONFIRM;
        }
@@ -1250,7 +1260,8 @@ int transformEnd(TransInfo *t)
 #endif
                return 1;
        }
-
+       
+       t->context= NULL;
        t->event = NULL;
        
        return 0;
@@ -1263,7 +1274,7 @@ void initManipulator(int mode)
 #if 0 // TRANSFORM_FIX_ME
        Trans.state = TRANS_RUNNING;
 
-       Trans.context = CTX_NONE;
+       Trans.options = CTX_NONE;
        
        Trans.mode = mode;
        
@@ -4244,68 +4255,77 @@ int Align(TransInfo *t, short mval[2])
 /* This function returns the snapping 'mode' for Animation Editors only 
  * We cannot use the standard snapping due to NLA-strip scaling complexities.
  */
+// XXX these modifier checks should be keymappable
 static short getAnimEdit_SnapMode(TransInfo *t)
 {
        short autosnap= SACTSNAP_OFF;
-#if 0 // TRANSFORM_FIX_ME      
+       
        /* currently, some of these are only for the action editor */
-       if (t->spacetype == SPACE_ACTION && G.saction) {
-               switch (G.saction->autosnap) {
-               case SACTSNAP_OFF:
-                       if (G.qual == LR_CTRLKEY) 
-                               autosnap= SACTSNAP_STEP;
-                       else if (G.qual == LR_SHIFTKEY)
-                               autosnap= SACTSNAP_FRAME;
-                       else if (G.qual == LR_ALTKEY)
-                               autosnap= SACTSNAP_MARKER;
-                       else
-                               autosnap= SACTSNAP_OFF;
-                       break;
-               case SACTSNAP_STEP:
-                       autosnap= (G.qual==LR_CTRLKEY)? SACTSNAP_OFF: SACTSNAP_STEP;
-                       break;
-               case SACTSNAP_FRAME:
-                       autosnap= (G.qual==LR_SHIFTKEY)? SACTSNAP_OFF: SACTSNAP_FRAME;
-                       break;
-               case SACTSNAP_MARKER:
-                       autosnap= (G.qual==LR_ALTKEY)? SACTSNAP_OFF: SACTSNAP_MARKER;
-                       break;
+       if (t->spacetype == SPACE_ACTION) {
+               SpaceAction *saction= CTX_wm_space_data(t->context);
+               
+               if (saction) {
+                       switch (saction->autosnap) {
+                       case SACTSNAP_OFF:
+                               if (t->event->ctrl) 
+                                       autosnap= SACTSNAP_STEP;
+                               else if (t->event->shift)
+                                       autosnap= SACTSNAP_FRAME;
+                               else if (t->event->alt)
+                                       autosnap= SACTSNAP_MARKER;
+                               else
+                                       autosnap= SACTSNAP_OFF;
+                               break;
+                       case SACTSNAP_STEP:
+                               autosnap= (t->event->ctrl)? SACTSNAP_OFF: SACTSNAP_STEP;
+                               break;
+                       case SACTSNAP_FRAME:
+                               autosnap= (t->event->shift)? SACTSNAP_OFF: SACTSNAP_FRAME;
+                               break;
+                       case SACTSNAP_MARKER:
+                               autosnap= (t->event->alt)? SACTSNAP_OFF: SACTSNAP_MARKER;
+                               break;
+                       }
                }
        }
-       else if (t->spacetype == SPACE_NLA && G.snla) {
-               switch (G.snla->autosnap) {
-               case SACTSNAP_OFF:
-                       if (G.qual == LR_CTRLKEY) 
-                               autosnap= SACTSNAP_STEP;
-                       else if (G.qual == LR_SHIFTKEY)
-                               autosnap= SACTSNAP_FRAME;
-                       else if (G.qual == LR_ALTKEY)
-                               autosnap= SACTSNAP_MARKER;
-                       else
-                               autosnap= SACTSNAP_OFF;
-                       break;
-               case SACTSNAP_STEP:
-                       autosnap= (G.qual==LR_CTRLKEY)? SACTSNAP_OFF: SACTSNAP_STEP;
-                       break;
-               case SACTSNAP_FRAME:
-                       autosnap= (G.qual==LR_SHIFTKEY)? SACTSNAP_OFF: SACTSNAP_FRAME;
-                       break;
-               case SACTSNAP_MARKER:
-                       autosnap= (G.qual==LR_ALTKEY)? SACTSNAP_OFF: SACTSNAP_MARKER;
-                       break;
+       else if (t->spacetype == SPACE_NLA) {
+               SpaceAction *snla= CTX_wm_space_data(t->context);
+               
+               if (snla) {
+                       switch (snla->autosnap) {
+                       case SACTSNAP_OFF:
+                               if (t->event->ctrl) 
+                                       autosnap= SACTSNAP_STEP;
+                               else if (t->event->shift)
+                                       autosnap= SACTSNAP_FRAME;
+                               else if (t->event->alt)
+                                       autosnap= SACTSNAP_MARKER;
+                               else
+                                       autosnap= SACTSNAP_OFF;
+                               break;
+                       case SACTSNAP_STEP:
+                               autosnap= (t->event->ctrl)? SACTSNAP_OFF: SACTSNAP_STEP;
+                               break;
+                       case SACTSNAP_FRAME:
+                               autosnap= (t->event->shift)? SACTSNAP_OFF: SACTSNAP_FRAME;
+                               break;
+                       case SACTSNAP_MARKER:
+                               autosnap= (t->event->alt)? SACTSNAP_OFF: SACTSNAP_MARKER;
+                               break;
+                       }
                }
        }
        else {
-               if (G.qual == LR_CTRLKEY
+               if (t->event->ctrl
                        autosnap= SACTSNAP_STEP;
-               else if (G.qual == LR_SHIFTKEY)
+               else if (t->event->shift)
                        autosnap= SACTSNAP_FRAME;
-               else if (G.qual == LR_ALTKEY)
+               else if (t->event->alt)
                        autosnap= SACTSNAP_MARKER;
                else
                        autosnap= SACTSNAP_OFF;
        }
-#endif 
+       
        return autosnap;
 }
 
@@ -4315,23 +4335,24 @@ static short getAnimEdit_SnapMode(TransInfo *t)
  */
 static short getAnimEdit_DrawTime(TransInfo *t)
 {
-#if 0 // TRANSFORM_FIX_ME      
        short drawtime;
        
        /* currently, some of these are only for the action editor */
-       if (t->spacetype == SPACE_ACTION && G.saction) {
-               drawtime = (G.saction->flag & SACTION_DRAWTIME)? 1 : 0;
+       if (t->spacetype == SPACE_ACTION) {
+               SpaceAction *saction= CTX_wm_space_data(t->context);
+               
+               drawtime = (saction->flag & SACTION_DRAWTIME)? 1 : 0;
        }
-       else if (t->spacetype == SPACE_NLA && G.snla) {
-               drawtime = (G.snla->flag & SNLA_DRAWTIME)? 1 : 0;
+       else if (t->spacetype == SPACE_NLA) {
+               SpaceAction *snla= CTX_wm_space_data(t->context);
+               
+               drawtime = (snla->flag & SNLA_DRAWTIME)? 1 : 0;
        }
        else {
                drawtime = 0;
        }
        
        return drawtime;
-#endif
-return 0;
 }      
 
 
@@ -4340,11 +4361,11 @@ return 0;
  */
 static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, Object *ob, short autosnap)
 {
-#if 0 // TRANSFORM_FIX_ME      
        /* snap key to nearest frame? */
        if (autosnap == SACTSNAP_FRAME) {
-               short doTime= getAnimEdit_DrawTime(t);
-               double secf= FPS;
+               const Scene *scene= t->scene;
+               const short doTime= getAnimEdit_DrawTime(t);
+               const double secf= FPS;
                double val;
                
                /* convert frame to nla-action time (if needed) */
@@ -4376,15 +4397,15 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, Object *ob, short
                        val= *(td->val);
                
                /* snap to nearest marker */
-               val= (float)find_nearest_marker_time(val);
-                       
+               // XXX missing function!
+               //val= (float)find_nearest_marker_time(val);
+               
                /* convert frame out of nla-action time */
                if (ob)
                        *(td->val)= get_action_frame(ob, val);
                else
                        *(td->val)= val;
        }
-#endif
 }
 
 /* ----------------- Translation ----------------------- */
@@ -4413,10 +4434,10 @@ static void headerTimeTranslate(TransInfo *t, char *str)
                outputNumInput(&(t->num), tvec);
        }
        else {
-               Scene *scene = t->scene;
-               short autosnap= getAnimEdit_SnapMode(t);
-               short doTime = getAnimEdit_DrawTime(t);
-               double secf= FPS;
+               const Scene *scene = t->scene;
+               const short autosnap= getAnimEdit_SnapMode(t);
+               const short doTime = getAnimEdit_DrawTime(t);
+               const double secf= FPS;
                float val= t->fac;
                
                /* apply snapping + frame->seconds conversions */
@@ -4443,10 +4464,10 @@ static void applyTimeTranslate(TransInfo *t, float sval)
        Scene *scene = t->scene;
        int i;
        
-       short doTime= getAnimEdit_DrawTime(t);
-       double secf= FPS;
+       const short doTime= getAnimEdit_DrawTime(t);
+       const double secf= FPS;
        
-       short autosnap= getAnimEdit_SnapMode(t);
+       const short autosnap= getAnimEdit_SnapMode(t);
        
        float deltax, val;
        
index b8e439f5d10bce06286842fff2a69018bc769764..956efc71cd36b992274de6d55cec952a8ac38c23 100644 (file)
@@ -177,7 +177,7 @@ typedef struct TransInfo {
     int         mode;           /* current mode                         */
     int                flag;           /* generic flags for special behaviors  */
        short           state;                  /* current state (running, canceled,...)*/
-    int         context;        /* current context                      */
+    int         options;        /* current context/options for transform                      */
     float       val;            /* init value for some transformations (and rotation angle)  */
     float       fac;            /* factor for distance based transform  */
     int       (*transform)(struct TransInfo *, short *);
@@ -224,6 +224,7 @@ typedef struct TransInfo {
        /*************** NEW STUFF *********************/
 
        float           values[4];
+       struct bContext *context;
        void            *view;
        struct ScrArea  *sa;
        struct ARegion  *ar;
index cfc9a61e32c253fcd7a2431ca96c98595f6870fd..367ec8c72c4e425300698139c6e39ec2d2527b90 100644 (file)
 //#include "BIF_toolbox.h"
 
 #include "ED_types.h"
+#include "ED_anim_api.h"
+#include "ED_keyframing.h"
+#include "ED_keyframes_edit.h"
 #include "ED_view3d.h"
 
+#include "UI_view2d.h"
+
 //#include "BSE_drawipo.h"
 //#include "BSE_edit.h"
 //#include "BSE_editipo.h"
@@ -2108,7 +2113,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
        int propmode = t->flag & T_PROP_EDIT;
        int mirror = 0;
        
-       if ((t->context & CTX_NO_MIRROR) == 0 && (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR))
+       if ((t->options & CTX_NO_MIRROR) == 0 && (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR))
        {
                mirror = 1;
        }
@@ -2680,7 +2685,6 @@ static void posttrans_gpd_clean (bGPdata *gpd)
  */
 static void posttrans_ipo_clean (Ipo *ipo)
 {
-#if 0 // TRANSFORM_FIX_ME
        IpoCurve *icu;
        int i;
        
@@ -2737,40 +2741,39 @@ static void posttrans_ipo_clean (Ipo *ipo)
                /* free cache */
                MEM_freeN(selcache);
        }
-#endif
 }
 
 /* Called by special_aftertrans_update to make sure selected keyframes replace
  * any other keyframes which may reside on that frame (that is not selected).
  * remake_action_ipos should have already been called 
  */
-static void posttrans_action_clean (bAction *act)
+static void posttrans_action_clean (bAnimContext *ac, bAction *act)
 {
-#if 0 // TRANSFORM_FIX_ME
-       ListBase act_data = {NULL, NULL};
-       bActListElem *ale;
+       ListBase anim_data = {NULL, NULL};
+       bAnimListElem *ale;
        int filter;
        
        /* filter data */
-       filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
-       actdata_filter(&act_data, filter, act, ACTCONT_ACTION);
+       filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_IPOKEYS);
+       ANIM_animdata_filter(&anim_data, filter, act, ANIMCONT_ACTION);
        
        /* loop through relevant data, removing keyframes from the ipo-blocks that were attached 
         *      - all keyframes are converted in/out of global time 
         */
-       for (ale= act_data.first; ale; ale= ale->next) {
-               if (NLA_ACTION_SCALED) {
-                       actstrip_map_ipo_keys(OBACT, ale->key_data, 0, 1); 
+       for (ale= anim_data.first; ale; ale= ale->next) {
+               Object *nob= ANIM_nla_mapping_get(ac, ale);
+               
+               if (nob) {
+                       ANIM_nla_mapping_apply(nob, ale->key_data, 0, 1); 
                        posttrans_ipo_clean(ale->key_data);
-                       actstrip_map_ipo_keys(OBACT, ale->key_data, 1, 1);
+                       ANIM_nla_mapping_apply(nob, ale->key_data, 1, 1);
                }
                else 
                        posttrans_ipo_clean(ale->key_data);
        }
        
        /* free temp data */
-       BLI_freelistN(&act_data);
-#endif
+       BLI_freelistN(&anim_data);
 }
 
 /* Called by special_aftertrans_update to make sure selected keyframes replace
@@ -2948,7 +2951,6 @@ static void TimeToTransData(TransData *td, float *time, Object *ob)
  */
 static TransData *IpoToTransData(TransData *td, Ipo *ipo, Object *ob, char side, float cfra)
 {
-#if 0 // TRANSFORM_FIX_ME      
        IpoCurve *icu;
        BezTriple *bezt;
        int i;
@@ -2977,8 +2979,6 @@ static TransData *IpoToTransData(TransData *td, Ipo *ipo, Object *ob, char side,
        }
        
        return td;
-#endif
-return NULL;
 }
 
 /* helper struct for gp-frame transforms (only used here) */
@@ -3041,16 +3041,13 @@ static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl
 
 static void createTransActionData(bContext *C, TransInfo *t)
 {
-       // TRANSFORM_FIX_ME
-#if 0
+       Scene *scene= CTX_data_scene(C);
        TransData *td = NULL;
        tGPFtransdata *tfd = NULL;
-       Object *ob= NULL;
        
-       ListBase act_data = {NULL, NULL};
-       bActListElem *ale;
-       void *data;
-       short datatype;
+       bAnimContext ac;
+       ListBase anim_data = {NULL, NULL};
+       bAnimListElem *ale;
        int filter;
        
        int count=0;
@@ -3058,26 +3055,22 @@ static void createTransActionData(bContext *C, TransInfo *t)
        char side;
        
        /* determine what type of data we are operating on */
-       data = get_action_context(&datatype);
-       if (data == NULL) return;
+       if (ANIM_animdata_get_context(C, &ac) == 0)
+               return;
        
        /* filter data */
-       if (datatype == ACTCONT_GPENCIL)
-               filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT);
+       if (ac.datatype == ANIMCONT_GPENCIL)
+               filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT);
        else
-               filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
-       actdata_filter(&act_data, filter, data, datatype);
-       
-       /* is the action scaled? if so, the it should belong to the active object */
-       if (NLA_ACTION_SCALED)
-               ob= OBACT;
+               filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_IPOKEYS);
+       ANIM_animdata_filter(&anim_data, filter, ac.data, ac.datatype);
                
        /* which side of the current frame should be allowed */
        if (t->mode == TFM_TIME_EXTEND) {
                /* only side on which mouse is gets transformed */
                float xmouse, ymouse;
                
-               areamouseco_to_ipoco(G.v2d, t->imval, &xmouse, &ymouse);
+               UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], &xmouse, &ymouse);
                side = (xmouse > CFRA) ? 'R' : 'L';
        }
        else {
@@ -3085,26 +3078,28 @@ static void createTransActionData(bContext *C, TransInfo *t)
                side = 'B';
        }
        
-       /* convert current-frame to action-time (slightly less accurate, espcially under
-        * higher scaling ratios, but is faster than converting all points) 
-        */
-       if (ob) 
-               cfra = get_action_frame(ob, (float)CFRA);
-       else
-               cfra = (float)CFRA;
-       
        /* loop 1: fully select ipo-keys and count how many BezTriples are selected */
-       for (ale= act_data.first; ale; ale= ale->next) {
-               if (ale->type == ACTTYPE_GPLAYER)
-                       count += count_gplayer_frames(ale->data, side, cfra);
+       for (ale= anim_data.first; ale; ale= ale->next) {
+               Object *nob= ANIM_nla_mapping_get(&ac, ale);
+               
+               /* convert current-frame to action-time (slightly less accurate, espcially under
+                * higher scaling ratios, but is faster than converting all points) 
+                */
+               if (nob) 
+                       cfra = get_action_frame(nob, (float)CFRA);
                else
+                       cfra = (float)CFRA;
+               
+               //if (ale->type == ANIMTYPE_GPLAYER)
+               //      count += count_gplayer_frames(ale->data, side, cfra);
+               //else
                        count += count_ipo_keys(ale->key_data, side, cfra);
        }
        
        /* stop if trying to build list if nothing selected */
        if (count == 0) {
                /* cleanup temp list */
-               BLI_freelistN(&act_data);
+               BLI_freelistN(&anim_data);
                return;
        }
        
@@ -3114,7 +3109,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
        t->data= MEM_callocN(t->total*sizeof(TransData), "TransData(Action Editor)");
        td= t->data;
        
-       if (datatype == ACTCONT_GPENCIL) {
+       if (ac.datatype == ANIMCONT_GPENCIL) {
                if (t->mode == TFM_TIME_SLIDE) {
                        t->customData= MEM_callocN((sizeof(float)*2)+(sizeof(tGPFtransdata)*count), "TimeSlide + tGPFtransdata");
                        tfd= (tGPFtransdata *)( (float *)(t->customData) + 2 );
@@ -3128,20 +3123,29 @@ static void createTransActionData(bContext *C, TransInfo *t)
                t->customData= MEM_callocN(sizeof(float)*2, "TimeSlide Min/Max");
        
        /* loop 2: build transdata array */
-       for (ale= act_data.first; ale; ale= ale->next) {
-               if (ale->type == ACTTYPE_GPLAYER) {
-                       bGPDlayer *gpl= (bGPDlayer *)ale->data;
-                       int i;
-                       
-                       i = GPLayerToTransData(td, tfd, gpl, side, cfra);
-                       td += i;
-                       tfd += i;
-               }
-               else {
+       for (ale= anim_data.first; ale; ale= ale->next) {
+               //if (ale->type == ANIMTYPE_GPLAYER) {
+               //      bGPDlayer *gpl= (bGPDlayer *)ale->data;
+               //      int i;
+               //      
+               //      i = GPLayerToTransData(td, tfd, gpl, side, cfra);
+               //      td += i;
+               //      tfd += i;
+               //}
+               //else {
+                       Object *nob= ANIM_nla_mapping_get(&ac, ale);
                        Ipo *ipo= (Ipo *)ale->key_data;
                        
-                       td= IpoToTransData(td, ipo, ob, side, cfra);
-               }
+                       /* convert current-frame to action-time (slightly less accurate, espcially under
+                        * higher scaling ratios, but is faster than converting all points) 
+                        */
+                       if (nob) 
+                               cfra = get_action_frame(nob, (float)CFRA);
+                       else
+                               cfra = (float)CFRA;
+                       
+                       td= IpoToTransData(td, ipo, nob, side, cfra);
+               //}
        }
        
        /* check if we're supposed to be setting minx/maxx for TimeSlide */
@@ -3164,8 +3168,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
        }
        
        /* cleanup temp list */
-       BLI_freelistN(&act_data);
-#endif
+       BLI_freelistN(&anim_data);
 }
 
 static void createTransNlaData(bContext *C, TransInfo *t)
@@ -3968,67 +3971,99 @@ void special_aftertrans_update(TransInfo *t)
                        }
                }
        }
-#if 0 // TRANSFORM_FIX_ME
+       
        if (t->spacetype == SPACE_ACTION) {
-               void *data;
-               short datatype;
+               SpaceAction *saction= (SpaceAction *)(t->sa->spacedata.first);
+               Scene *scene= NULL;
+               bAnimContext ac;
                
                /* determine what type of data we are operating on */
-               data = get_action_context(&datatype);
-               if (data == NULL) return;
+               if (ANIM_animdata_get_context(t->context, &ac) == 0) {
+                       printf("space action transform -> special aftertrans exit. no context \n"); // XXX
+                       return;
+               }
+               
+               /* get pointers to useful data */
                ob = OBACT;
+               scene= ac.scene;
                
-               if (datatype == ACTCONT_ACTION) {
+               if (ac.datatype == ANIMCONT_DOPESHEET) {
+                       ListBase anim_data = {NULL, NULL};
+                       bAnimListElem *ale;
+                       short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_IPOKEYS);
+                       
+                       /* get channels to work on */
+                       ANIM_animdata_filter(&anim_data, filter, ac.data, ac.datatype);
+                       
+                       /* these should all be ipo-blocks */
+                       for (ale= anim_data.first; ale; ale= ale->next) {
+                               Object *nob= ANIM_nla_mapping_get(&ac, ale);
+                               Ipo *ipo= ale->key_data;
+                               IpoCurve *icu;
+                               
+                               if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 && 
+                                    ((cancelled == 0) || (duplicate)) )
+                               {
+                                       if (nob) {
+                                               ANIM_nla_mapping_apply(nob, ipo, 0, 1); 
+                                               posttrans_ipo_clean(ipo);
+                                               ANIM_nla_mapping_apply(nob, ipo, 1, 1);
+                                       }
+                                       else
+                                               posttrans_ipo_clean(ipo);
+                               }
+                       }
+                       
+                       /* free temp memory */
+                       BLI_freelistN(&anim_data);
+               }
+               else if (ac.datatype == ANIMCONT_ACTION) {
                        /* Depending on the lock status, draw necessary views */
+                       // fixme... some of this stuff is not good
                        if (ob) {
                                ob->ctime= -1234567.0f;
                                
-                               if(ob->pose || ob_get_key(ob))
-                                       DAG_object_flush_update(G.scene, ob, OB_RECALC);
+                               if (ob->pose || ob_get_key(ob))
+                                       DAG_object_flush_update(scene, ob, OB_RECALC);
                                else
-                                       DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
+                                       DAG_object_flush_update(scene, ob, OB_RECALC_OB);
                        }
                        
                        /* Do curve cleanups? */
-                       if ( (G.saction->flag & SACTION_NOTRANSKEYCULL)==0 && 
+                       if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 && 
                             ((cancelled == 0) || (duplicate)) )
                        {
-                               posttrans_action_clean((bAction *)data);
+                               posttrans_action_clean(&ac, (bAction *)ac.data);
                        }
-                       
-                       /* Do curve updates */
-                       remake_action_ipos((bAction *)data);
                }
-               else if (datatype == ACTCONT_SHAPEKEY) {
+               else if (ac.datatype == ANIMCONT_SHAPEKEY) {
                        /* fix up the Ipocurves and redraw stuff */
-                       Key *key= (Key *)data;
+                       Key *key= (Key *)ac.data;
+                       
                        if (key->ipo) {
                                IpoCurve *icu;
                                
-                               if ( (G.saction->flag & SACTION_NOTRANSKEYCULL)==0 && 
+                               if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 && 
                                     ((cancelled == 0) || (duplicate)) )
                                {
                                        posttrans_ipo_clean(key->ipo);
                                }
-                               
-                               for (icu = key->ipo->curve.first; icu; icu=icu->next) {
-                                       sort_time_ipocurve(icu);
-                                       testhandles_ipocurve(icu);
-                               }
                        }
                        
-                       DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+                       DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA);
                }
-               else if (datatype == ACTCONT_GPENCIL) {
+#if 0 // XXX future of this is still not clear
+               else if (ac.datatype == ANIMCONT_GPENCIL) {
                        /* remove duplicate frames and also make sure points are in order! */
                        if ((cancelled == 0) || (duplicate))
                        {
+                               bScreen *sc= (bScreen *)ac.data;
                                ScrArea *sa;
                                
                                /* BAD... we need to loop over all screen areas for current screen...
                                 *      - sync this with actdata_filter_gpencil() in editaction.c 
                                 */
-                               for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
+                               for (sa= sc->areabase.first; sa; sa= sa->next) {
                                        bGPdata *gpd= gpencil_data_getactive(sa);
                                        
                                        if (gpd) 
@@ -4036,9 +4071,15 @@ void special_aftertrans_update(TransInfo *t)
                                }
                        }
                }
+#endif // XXX future of this is still not clear
+               
+               /* make sure all IPO-curves are set correctly */
+               ANIM_editkeyframes_refresh(&ac);
                
-               G.saction->flag &= ~SACTION_MOVING;
+               /* clear flag that was set for time-slide drawing */
+               saction->flag &= ~SACTION_MOVING;
        }
+#if 0 // TRANSFORM_FIX_ME
        else if (t->spacetype == SPACE_NLA) {
                recalc_all_ipos();      // bad
                synchronize_action_strips();
@@ -4317,11 +4358,11 @@ void createTransData(bContext *C, TransInfo *t)
        Scene *scene = CTX_data_scene(C);
        Object *ob = OBACT;
        
-       if (t->context == CTX_TEXTURE) {
+       if (t->options == CTX_TEXTURE) {
                t->flag |= T_TEXTURE;
                createTransTexspace(C, t);
        }
-       else if (t->context == CTX_EDGE) {
+       else if (t->options == CTX_EDGE) {
                t->ext = NULL;
                t->flag |= T_EDIT;
                createTransEdge(C, t);
@@ -4331,7 +4372,7 @@ void createTransData(bContext *C, TransInfo *t)
                        sort_trans_data_dist(t);
                }
        }
-       else if (t->context == CTX_BMESH) {
+       else if (t->options == CTX_BMESH) {
                // TRANSFORM_FIX_ME
                //createTransBMeshVerts(t, G.editBMesh->bm, G.editBMesh->td);
        }
index 2073033ebb640e7c8f87134aeca6449c6dac673a..54fac3e5120aa5af2475912bdaec2f0772cd06bc 100644 (file)
@@ -444,7 +444,7 @@ void recalcData(TransInfo *t)
                                        }
                                        clipMirrorModifier(t, G.obedit);
                                }
-                               if((t->context & CTX_NO_MIRROR) == 0 && (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR))
+                               if((t->options & CTX_NO_MIRROR) == 0 && (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR))
                                        editmesh_apply_to_mirror(t);
                                
                                DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);  /* sets recalc flags */
@@ -673,7 +673,8 @@ void initTransInfo (bContext *C, TransInfo *t, wmEvent *event)
 //     if(G.obedit || (t->flag & T_POSE) ) G.moving= G_TRANSFORM_EDIT;
 //     else if(G.f & G_PARTICLEEDIT) G.moving= G_TRANSFORM_PARTICLE;
 //     else G.moving= G_TRANSFORM_OBJ;
-
+       
+       t->context= C;
        t->scene = sce;
        t->sa = sa;
        t->ar = ar;
@@ -684,7 +685,7 @@ void initTransInfo (bContext *C, TransInfo *t, wmEvent *event)
        t->flag = 0;
 
        /* setting PET flag */
-       if ((t->context & CTX_NO_PET) == 0 && (sce->proportional)) {
+       if ((t->options & CTX_NO_PET) == 0 && (sce->proportional)) {
                t->flag |= T_PROP_EDIT;
                
                if(sce->proportional == 2)
index fd3ddfaaf6b93b424cf1bb5b2efea060824ea59a..b2a865074fdd2a18f75ff39efb0254b09a0b6c22 100644 (file)
@@ -50,10 +50,10 @@ static void transformops_exit(bContext *C, wmOperator *op)
 static void transformops_data(bContext *C, wmOperator *op, wmEvent *event)
 {
        int mode    = RNA_int_get(op->ptr, "mode");
-       int context = RNA_int_get(op->ptr, "context");
+       int options = RNA_int_get(op->ptr, "options");
        TransInfo *t = MEM_callocN(sizeof(TransInfo), "TransInfo data");
        
-       initTransform(C, t, mode, context, event);
+       initTransform(C, t, mode, options, event);
 
        /* store data */
        op->customdata = t;
@@ -133,7 +133,7 @@ void TFM_OT_transform(struct wmOperatorType *ot)
        ot->poll   = ED_operator_areaactive;
 
        RNA_def_property(ot->srna, "mode", PROP_INT, PROP_NONE);
-       RNA_def_property(ot->srna, "context", PROP_INT, PROP_NONE);
+       RNA_def_property(ot->srna, "options", PROP_INT, PROP_NONE);
        
        prop = RNA_def_property(ot->srna, "value", PROP_FLOAT, PROP_VECTOR);
        RNA_def_property_array(prop, 4);
@@ -170,6 +170,18 @@ void transform_keymap_for_space(struct wmWindowManager *wm, struct ListBase *key
                        RNA_int_set(km->ptr, "mode", TFM_SHEAR);
                        
                        break;
+               case SPACE_ACTION:
+                       km= WM_keymap_add_item(keymap, "TFM_OT_transform", GKEY, KM_PRESS, 0, 0);
+                       RNA_int_set(km->ptr, "mode", TFM_TIME_TRANSLATE);
+                       
+                       km= WM_keymap_add_item(keymap, "TFM_OT_transform", EKEY, KM_PRESS, 0, 0);
+                       RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
+                       
+                       km= WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, 0, 0);
+                       RNA_int_set(km->ptr, "mode", TFM_TIME_SCALE);
+                       
+                       km= WM_keymap_add_item(keymap, "TFM_OT_transform", TKEY, KM_PRESS, 0, 0);
+                       RNA_int_set(km->ptr, "mode", TFM_TIME_SLIDE);
                default:
                        break;
        }