diff options
-rw-r--r-- | source/blender/editors/animation/anim_draw.c | 33 | ||||
-rw-r--r-- | source/blender/editors/include/ED_anim_api.h | 14 | ||||
-rw-r--r-- | source/blender/editors/space_graph/graph_draw.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_graph/graph_edit.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_graph/graph_select.c | 8 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 2 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 3 |
7 files changed, 55 insertions, 29 deletions
diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c index b99aefebfe7..93beb819a2b 100644 --- a/source/blender/editors/animation/anim_draw.c +++ b/source/blender/editors/animation/anim_draw.c @@ -42,6 +42,7 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_math.h" #include "BKE_animsys.h" #include "BKE_action.h" @@ -360,44 +361,56 @@ float ANIM_unit_mapping_get_factor (Scene *scene, ID *id, FCurve *fcu, short res /* helper function for ANIM_unit_mapping_apply_fcurve -> mapping callback for unit mapping */ static short bezt_unit_mapping_apply (BeztEditData *bed, BezTriple *bezt) { - /* mapping factor is stored in f1, only_keys option is stored in i1 */ - short only_keys= (short)bed->i1; + /* mapping factor is stored in f1, flags are stored in i1 */ + short only_keys= (bed->i1 & ANIM_UNITCONV_ONLYKEYS); + short sel_vs= (bed->i1 & ANIM_UNITCONV_SELVERTS); float fac= bed->f1; /* adjust BezTriple handles only if allowed to */ if (only_keys == 0) { - bezt->vec[0][1] *= fac; - bezt->vec[2][1] *= fac; + if ((sel_vs==0) || (bezt->f1 & SELECT)) + bezt->vec[0][1] *= fac; + if ((sel_vs==0) || (bezt->f3 & SELECT)) + bezt->vec[2][1] *= fac; } - bezt->vec[1][1] *= fac; + if ((sel_vs == 0) || (bezt->f2 & SELECT)) + bezt->vec[1][1] *= fac; return 0; } /* Apply/Unapply units conversions to keyframes */ -void ANIM_unit_mapping_apply_fcurve (Scene *scene, ID *id, FCurve *fcu, short restore, short only_keys) +void ANIM_unit_mapping_apply_fcurve (Scene *scene, ID *id, FCurve *fcu, short flag) { BeztEditData bed; + BeztEditFunc sel_cb; float fac; /* calculate mapping factor, and abort if nothing to change */ - fac= ANIM_unit_mapping_get_factor(scene, id, fcu, restore); + fac= ANIM_unit_mapping_get_factor(scene, id, fcu, (flag & ANIM_UNITCONV_RESTORE)); if (fac == 1.0f) return; /* init edit data * - mapping factor is stored in f1 - * - only_keys is stored in 'i1' + * - flags are stored in 'i1' */ memset(&bed, 0, sizeof(BeztEditData)); bed.f1= (float)fac; - bed.i1= (int)only_keys; + bed.i1= (int)flag; + + /* only selected? */ + if (flag & ANIM_UNITCONV_ONLYSEL) + sel_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); + else + sel_cb= NULL; /* apply to F-Curve */ - ANIM_fcurve_keys_bezier_loop(&bed, fcu, NULL, bezt_unit_mapping_apply, NULL); + ANIM_fcurve_keys_bezier_loop(&bed, fcu, sel_cb, bezt_unit_mapping_apply, NULL); // FIXME: loop here for samples should be generalised + // TODO: only sel? if (fcu->fpt) { FPoint *fpt; int i; diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h index 5b5733a3d43..1b1b31ff704 100644 --- a/source/blender/editors/include/ED_anim_api.h +++ b/source/blender/editors/include/ED_anim_api.h @@ -467,11 +467,23 @@ void ED_nla_postop_refresh(bAnimContext *ac); /* ------------- Unit Conversion Mappings ------------- */ /* anim_draw.c */ +/* flags for conversion mapping */ +typedef enum eAnimUnitConv_Flags { + /* restore to original internal values */ + ANIM_UNITCONV_RESTORE = (1<<0), + /* ignore handles (i.e. only touch main keyframes) */ + ANIM_UNITCONV_ONLYKEYS = (1<<1), + /* only touch selected BezTriples */ + ANIM_UNITCONV_ONLYSEL = (1<<2), + /* only touch selected vertices */ + ANIM_UNITCONV_SELVERTS = (1<<3), +} eAnimUnitConv_Flags; + /* Get unit conversion factor for given ID + F-Curve */ float ANIM_unit_mapping_get_factor(struct Scene *scene, struct ID *id, struct FCurve *fcu, short restore); /* Apply/Unapply units conversions to keyframes */ -void ANIM_unit_mapping_apply_fcurve(struct Scene *scene, struct ID *id, struct FCurve *fcu, short restore, short only_keys); +void ANIM_unit_mapping_apply_fcurve(struct Scene *scene, struct ID *id, struct FCurve *fcu, short flag); /* ------------- Utility macros ----------------------- */ diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 553e52ae27e..b52fc1b9e6a 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -561,7 +561,7 @@ static void draw_fcurve_curve_samples (bAnimContext *ac, ID *id, FCurve *fcu, Vi glBegin(GL_LINE_STRIP); /* apply unit mapping */ - ANIM_unit_mapping_apply_fcurve(ac->scene, id, fcu, 0, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, id, fcu, 0); /* extrapolate to left? - left-side of view comes before first keyframe? */ if (prevfpt->vec[0] > v2d->cur.xmin) { @@ -622,7 +622,7 @@ static void draw_fcurve_curve_samples (bAnimContext *ac, ID *id, FCurve *fcu, Vi } /* unapply unit mapping */ - ANIM_unit_mapping_apply_fcurve(ac->scene, id, fcu, 1, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, id, fcu, ANIM_UNITCONV_RESTORE); glEnd(); } @@ -641,7 +641,7 @@ static void draw_fcurve_curve_bezts (bAnimContext *ac, ID *id, FCurve *fcu, View glBegin(GL_LINE_STRIP); /* apply unit mapping */ - ANIM_unit_mapping_apply_fcurve(ac->scene, id, fcu, 0, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, id, fcu, 0); /* extrapolate to left? */ if (prevbezt->vec[1][0] > v2d->cur.xmin) { @@ -775,7 +775,7 @@ static void draw_fcurve_curve_bezts (bAnimContext *ac, ID *id, FCurve *fcu, View } /* unapply unit mapping */ - ANIM_unit_mapping_apply_fcurve(ac->scene, id, fcu, 1, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, id, fcu, ANIM_UNITCONV_RESTORE); glEnd(); } @@ -912,7 +912,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri } else if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) { /* apply unit mapping */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, fcu, 0, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, fcu, 0); if (fcu->bezt) { /* only draw handles/vertices on keyframes */ @@ -928,7 +928,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri } /* unapply unit mapping */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, fcu, 1, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, fcu, ANIM_UNITCONV_RESTORE); } } diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index 9842d2ae9ae..00951db61d3 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -1574,7 +1574,7 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *op) AnimData *adt= ANIM_nla_mapping_get(&ac, ale); /* apply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, 0, 1); + ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, ANIM_UNITCONV_ONLYKEYS); if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); @@ -1585,7 +1585,7 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *op) ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL); /* unapply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, 1, 1); + ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE|ANIM_UNITCONV_ONLYKEYS); } BLI_freelistN(&anim_data); @@ -1667,7 +1667,7 @@ static void snap_graph_keys(bAnimContext *ac, short mode) AnimData *adt= ANIM_nla_mapping_get(ac, ale); /* apply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 0, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 0); if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); @@ -1678,7 +1678,7 @@ static void snap_graph_keys(bAnimContext *ac, short mode) ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); /* apply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 1, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE); } BLI_freelistN(&anim_data); @@ -1791,7 +1791,7 @@ static void mirror_graph_keys(bAnimContext *ac, short mode) AnimData *adt= ANIM_nla_mapping_get(ac, ale); /* apply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 0, 1); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_ONLYKEYS); if (adt) { ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); @@ -1802,7 +1802,7 @@ static void mirror_graph_keys(bAnimContext *ac, short mode) ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve); /* unapply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 1, 1); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_ONLYKEYS|ANIM_UNITCONV_RESTORE); } BLI_freelistN(&anim_data); diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c index e9b6cb226d0..b90d5a48d9a 100644 --- a/source/blender/editors/space_graph/graph_select.c +++ b/source/blender/editors/space_graph/graph_select.c @@ -248,7 +248,7 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho FCurve *fcu= (FCurve *)ale->key_data; /* apply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 0, 1); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_ONLYKEYS); /* apply NLA mapping to all the keyframes, since it's easier than trying to * guess when a callback might use something different @@ -287,7 +287,7 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); /* unapply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 1, 1); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE|ANIM_UNITCONV_ONLYKEYS); } /* cleanup */ @@ -609,7 +609,7 @@ static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fc AnimData *adt= ANIM_nla_mapping_get(ac, ale); /* apply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 0, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 0); /* try to progressively get closer to the right point... */ if (fcu->bezt) { @@ -679,7 +679,7 @@ static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fc } /* unapply unit corrections */ - ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, 1, 0); + ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE); } /* free channels */ diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index a92af31211d..52e5a634011 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -3495,7 +3495,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t) if (fcu->bezt == NULL) continue; - ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, 0, 0); + ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, ANIM_UNITCONV_ONLYSEL|ANIM_UNITCONV_SELVERTS); /* 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++) { diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 1e3bddc769e..892ee467a69 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -408,7 +408,8 @@ void recalcData(TransInfo *t) for (ale= anim_data.first; ale; ale= ale->next) { FCurve *fcu= (FCurve *)ale->key_data; - ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, 1, 0); + // fixme: only do this for selected verts... + ANIM_unit_mapping_apply_fcurve(ac.scene, ale->id, ale->key_data, ANIM_UNITCONV_ONLYSEL|ANIM_UNITCONV_SELVERTS|ANIM_UNITCONV_RESTORE); /* watch it: if the time is wrong: do not correct handles yet */ |