diff --git a/source/blender/editors/space_action/action_header.c b/source/blender/editors/space_action/action_header.c index d04ffd0935d..b7fb24f400b 100644 --- a/source/blender/editors/space_action/action_header.c +++ b/source/blender/editors/space_action/action_header.c @@ -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; } } diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 8141fe68b69..124f5b610a6 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -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; diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index b8e439f5d10..956efc71cd3 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -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; diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index cfc9a61e32c..367ec8c72c4 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -120,8 +120,13 @@ //#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; - ob = OBACT; + if (ANIM_animdata_get_context(t->context, &ac) == 0) { + printf("space action transform -> special aftertrans exit. no context \n"); // XXX + return; + } - if (datatype == ACTCONT_ACTION) { + /* get pointers to useful data */ + ob = OBACT; + scene= ac.scene; + + 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 - G.saction->flag &= ~SACTION_MOVING; + /* make sure all IPO-curves are set correctly */ + ANIM_editkeyframes_refresh(&ac); + + /* 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); } diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 2073033ebb6..54fac3e5120 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -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) diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index fd3ddfaaf6b..b2a865074fd 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -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; }