diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2015-04-08 15:31:11 +0300 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2015-04-08 15:31:11 +0300 |
commit | c5c60099c536d2d5276c79eff9c6bda0e9d6dd60 (patch) | |
tree | 0b1832c40638991e04257d0098f1c6d3b5ece7f8 /source/blender/editors/transform/transform_conversions.c | |
parent | 40984f6c8650cca2784c9be7371e86e8e91bbf37 (diff) |
Proportional editing in action editor: display circle in center of
region.
It's -really- hard getting the center of selection here in the y axis, I
feel this is the best compromise.
Diffstat (limited to 'source/blender/editors/transform/transform_conversions.c')
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 23648c242f7..e11da84954b 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -58,6 +58,7 @@ #include "BLI_linklist_stack.h" #include "BLI_string.h" #include "BLI_bitmap.h" +#include "BLI_rect.h" #include "BKE_DerivedMesh.h" #include "BKE_action.h" @@ -3402,13 +3403,14 @@ static int count_masklayer_frames(MaskLayer *masklay, char side, float cfra, boo /* This function assigns the information to transdata */ -static void TimeToTransData(TransData *td, float *time, AnimData *adt) +static void TimeToTransData(TransData *td, float *time, AnimData *adt, float ypos) { /* memory is calloc'ed, so that should zero everything nicely for us */ td->val = time; td->ival = *(time); td->center[0] = td->ival; + td->center[1] = ypos; /* store the AnimData where this keyframe exists as a keyframe of the * active action as td->extra. @@ -3423,7 +3425,7 @@ static void TimeToTransData(TransData *td, float *time, AnimData *adt) * 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 *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, FCurve *fcu, AnimData *adt, char side, float cfra, bool propedit) +static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, FCurve *fcu, AnimData *adt, char side, float cfra, bool propedit, float ypos) { BezTriple *bezt; TransData2D *td2d = *td2dv; @@ -3437,7 +3439,7 @@ static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, FC if (propedit || (bezt->f2 & SELECT)) { /* note this MUST match count_fcurve_keys(), so can't use BEZSELECTED() macro */ /* only add if on the right 'side' of the current frame */ if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) { - TimeToTransData(td, bezt->vec[1], adt); + TimeToTransData(td, bezt->vec[1], adt, ypos); if (bezt->f2 & SELECT) td->flag |= TD_SELECTED; @@ -3492,7 +3494,7 @@ void flushTransIntFrameActionData(TransInfo *t) * The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data * on the named side are used. */ -static int GPLayerToTransData(TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl, char side, float cfra, bool propedit) +static int GPLayerToTransData(TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl, char side, float cfra, bool propedit, float ypos) { bGPDframe *gpf; int count = 0; @@ -3506,6 +3508,7 @@ static int GPLayerToTransData(TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl, td->ival = (float)gpf->framenum; td->center[0] = td->ival; + td->center[1] = ypos; tfd->val = (float)gpf->framenum; tfd->sdata = &gpf->framenum; @@ -3522,7 +3525,7 @@ static int GPLayerToTransData(TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl, } /* refer to comment above #GPLayerToTransData, this is the same but for masks */ -static int MaskLayerToTransData(TransData *td, tGPFtransdata *tfd, MaskLayer *masklay, char side, float cfra, bool propedit) +static int MaskLayerToTransData(TransData *td, tGPFtransdata *tfd, MaskLayer *masklay, char side, float cfra, bool propedit, float ypos) { MaskLayerShape *masklay_shape; int count = 0; @@ -3536,6 +3539,7 @@ static int MaskLayerToTransData(TransData *td, tGPFtransdata *tfd, MaskLayer *ma td->ival = (float)masklay_shape->frame; td->center[0] = td->ival; + td->center[1] = ypos; tfd->val = (float)masklay_shape->frame; tfd->sdata = &masklay_shape->frame; @@ -3559,6 +3563,14 @@ static void createTransActionData(bContext *C, TransInfo *t) TransData2D *td2d = NULL; tGPFtransdata *tfd = NULL; + rcti *mask = &t->ar->v2d.mask; + rctf *datamask = &t->ar->v2d.cur; + + float xsize = BLI_rctf_size_x(datamask); + float ysize = BLI_rctf_size_y(datamask); + float xmask = BLI_rcti_size_x(mask); + float ymask = BLI_rcti_size_y(mask); + bAnimContext ac; ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -3567,6 +3579,7 @@ static void createTransActionData(bContext *C, TransInfo *t) int count = 0; float cfra; + float ypos = 1.0f / ((ysize / xsize) * (xmask / ymask)) * BLI_rctf_cent_y(&t->ar->v2d.cur); /* determine what type of data we are operating on */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -3668,7 +3681,7 @@ static void createTransActionData(bContext *C, TransInfo *t) bGPDlayer *gpl = (bGPDlayer *)ale->data; int i; - i = GPLayerToTransData(td, tfd, gpl, t->frame_side, cfra, propedit); + i = GPLayerToTransData(td, tfd, gpl, t->frame_side, cfra, propedit, ypos); td += i; tfd += i; } @@ -3676,7 +3689,7 @@ static void createTransActionData(bContext *C, TransInfo *t) MaskLayer *masklay = (MaskLayer *)ale->data; int i; - i = MaskLayerToTransData(td, tfd, masklay, t->frame_side, cfra, propedit); + i = MaskLayerToTransData(td, tfd, masklay, t->frame_side, cfra, propedit, ypos); td += i; tfd += i; } @@ -3684,7 +3697,7 @@ static void createTransActionData(bContext *C, TransInfo *t) AnimData *adt = ANIM_nla_mapping_get(&ac, ale); FCurve *fcu = (FCurve *)ale->key_data; - td = ActionFCurveToTransData(td, &td2d, fcu, adt, t->frame_side, cfra, propedit); + td = ActionFCurveToTransData(td, &td2d, fcu, adt, t->frame_side, cfra, propedit, ypos); } } |