diff options
-rw-r--r-- | source/blender/blenkernel/BKE_fcurve.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/fcurve.c | 2 | ||||
-rw-r--r-- | source/blender/editors/animation/keyframing.c | 19 | ||||
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface.c | 5 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_anim.c | 27 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_anim_types.h | 1 |
7 files changed, 50 insertions, 6 deletions
diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h index a1176b91312..ff2880ab311 100644 --- a/source/blender/blenkernel/BKE_fcurve.h +++ b/source/blender/blenkernel/BKE_fcurve.h @@ -99,6 +99,7 @@ void driver_variable_name_validate(struct DriverVar *dvar); struct DriverVar *driver_add_new_variable(struct ChannelDriver *driver); float driver_get_variable_value(struct ChannelDriver *driver, struct DriverVar *dvar); +float evaluate_driver(struct ChannelDriver *driver, const float evaltime); /* ************** F-Curve Modifiers *************** */ diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 70fdcd12cf7..891ab7999fe 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -1777,7 +1777,7 @@ float driver_get_variable_value(ChannelDriver *driver, DriverVar *dvar) * - "evaltime" is the frame at which F-Curve is being evaluated * - has to return a float value */ -static float evaluate_driver(ChannelDriver *driver, const float evaltime) +float evaluate_driver(ChannelDriver *driver, const float evaltime) { DriverVar *dvar; diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 8841a05bcd8..0b0a24a24ef 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -930,6 +930,12 @@ bool insert_keyframe_direct(ReportList *reports, PointerRNA ptr, PropertyRNA *pr /* update F-Curve flags to ensure proper behaviour for property type */ update_autoflags_fcurve_direct(fcu, prop); + /* adjust frame on which to add keyframe */ + if ((flag & INSERTKEY_DRIVER) && (fcu->driver)) { + /* for making it easier to add corrective drivers... */ + cfra = evaluate_driver(fcu->driver, cfra); + } + /* obtain value to give keyframe */ if ( (flag & INSERTKEY_MATRIX) && (visualkey_can_use(&ptr, prop)) ) @@ -1743,6 +1749,7 @@ static int insert_key_button_exec(bContext *C, wmOperator *op) PointerRNA ptr = {{NULL}}; PropertyRNA *prop = NULL; char *path; + uiBut *but; float cfra = (float)CFRA; short success = 0; int index; @@ -1753,6 +1760,7 @@ static int insert_key_button_exec(bContext *C, wmOperator *op) flag = ANIM_get_keyframing_flags(scene, 1); /* try to insert keyframe using property retrieved from UI */ + but = UI_context_active_but_get(C); UI_context_active_but_prop_get(C, &ptr, &prop, &index); if ((ptr.id.data && ptr.data && prop) && RNA_property_animateable(&ptr, prop)) { @@ -1766,6 +1774,17 @@ static int insert_key_button_exec(bContext *C, wmOperator *op) success = insert_keyframe_direct(op->reports, ptr, prop, fcu, cfra, ts->keyframe_type, 0); } + else if (UI_but_flag_is_set(but, UI_BUT_DRIVEN)) { + /* Driven property - Find driver */ + FCurve *fcu; + int driven, special; + + fcu = rna_get_fcurve_context_ui(C, &ptr, prop, index, NULL, NULL, &driven, &special); + + if (fcu && driven) { + success = insert_keyframe_direct(op->reports, ptr, prop, fcu, cfra, ts->keyframe_type, INSERTKEY_DRIVER); + } + } else { /* standard properties */ path = RNA_path_from_ID_to_property(&ptr, prop); diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index a2408812643..9aad340d2fb 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -495,6 +495,7 @@ bool UI_but_active_drop_color(struct bContext *C); void UI_but_flag_enable(uiBut *but, int flag); void UI_but_flag_disable(uiBut *but, int flag); +bool UI_but_flag_is_set(uiBut *but, int flag); void UI_but_drawflag_enable(uiBut *but, int flag); void UI_but_drawflag_disable(uiBut *but, int flag); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index daef84c311f..fac1267cc62 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -3984,6 +3984,11 @@ void UI_but_flag_disable(uiBut *but, int flag) but->flag &= ~flag; } +bool UI_but_flag_is_set(uiBut *but, int flag) +{ + return (but->flag & flag) != 0; +} + void UI_but_drawflag_enable(uiBut *but, int flag) { but->drawflag |= flag; diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 178fda043b6..46967742652 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -242,24 +242,41 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra) WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); } } - else if (!driven) { + else if (driven) { + /* Driver - Try to insert keyframe using the driver's input as the frame, + * making it easier to set up corrective drivers + */ + if (IS_AUTOKEY_ON(scene)) { + ReportList *reports = CTX_wm_reports(C); + ToolSettings *ts = scene->toolsettings; + PointerRNA ptr = {{NULL}}; + PropertyRNA *prop = NULL; + int index; + + UI_context_active_but_prop_get(C, &ptr, &prop, &index); + + insert_keyframe_direct(reports, ptr, prop, fcu, cfra, ts->keyframe_type, INSERTKEY_DRIVER); + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); + } + } + else { id = but->rnapoin.id.data; - + /* TODO: this should probably respect the keyingset only option for anim */ if (autokeyframe_cfra_can_key(scene, id)) { ReportList *reports = CTX_wm_reports(C); ToolSettings *ts = scene->toolsettings; short flag = ANIM_get_keyframing_flags(scene, 1); - + fcu->flag &= ~FCURVE_SELECTED; - + /* Note: We use but->rnaindex instead of fcu->array_index, * because a button may control all items of an array at once. * E.g., color wheels (see T42567). */ BLI_assert((fcu->array_index == but->rnaindex) || (but->rnaindex == -1)); insert_keyframe(reports, id, action, ((fcu->grp) ? (fcu->grp->name) : (NULL)), fcu->rna_path, but->rnaindex, cfra, ts->keyframe_type, flag); - + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL); } } diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index fc32bbd1e99..c8ba61db87e 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -834,6 +834,7 @@ typedef enum eInsertKeyFlags { /* Allow to make a full copy of new key into existing one, if any, instead of 'reusing' existing handles. * Used by copy/paste code. */ INSERTKEY_OVERWRITE_FULL = (1<<7), + INSERTKEY_DRIVER = (1<<8), /* for driver FCurves, use driver's "input" value - for easier corrective driver setup */ } eInsertKeyFlags; /* ************************************************ */ |