diff options
-rw-r--r-- | source/blender/editors/animation/anim_ops.c | 3 | ||||
-rw-r--r-- | source/blender/editors/animation/keyframing.c | 148 | ||||
-rw-r--r-- | source/blender/editors/include/ED_keyframing.h | 7 |
3 files changed, 152 insertions, 6 deletions
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c index 3f69aeaf857..b51fa223eb3 100644 --- a/source/blender/editors/animation/anim_ops.c +++ b/source/blender/editors/animation/anim_ops.c @@ -382,6 +382,9 @@ void ED_operatortypes_anim(void) WM_operatortype_append(ANIM_OT_delete_keyframe); WM_operatortype_append(ANIM_OT_insert_keyframe_old); WM_operatortype_append(ANIM_OT_delete_keyframe_old); + + WM_operatortype_append(ANIM_OT_keyingset_add_new); + WM_operatortype_append(ANIM_OT_keyingset_add_destination); } void ED_keymap_anim(wmWindowManager *wm) diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index d28bae9b12e..1cdebe8f14e 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -870,14 +870,139 @@ short deletekey (ID *id, const char group[], const char rna_path[], int array_in } /* ******************************************* */ -/* KEYFRAME MODIFICATION */ +/* KEYINGSETS */ -/* mode for common_modifykey */ -enum { - COMMONKEY_MODE_INSERT = 0, - COMMONKEY_MODE_DELETE, -} eCommonModifyKey_Modes; +/* Operators ------------------------------------------- */ + +/* These operators are only provided for scripting/macro usage, not for direct + * calling from the UI since they wrap some of the data-access API code for these + * (defined in blenkernel) which have quite a few properties. + */ + +/* ----- */ + +static int keyingset_add_destination_exec (bContext *C, wmOperator *op) +{ + //PointerRNA *ptr; + KeyingSet *ks= NULL; + ID *id= NULL; + char rna_path[256], group_name[64]; // xxx + short groupmode=0, flag=0; + int array_index=0; + + /* get settings from operator properties */ +#if 0 // XXX - why can't we have something like this in the RNA-access API? + if ( (ptr = RNA_property_pointer_get(op->ptr, "keyingset")) ) + ks= (KeyingSet *)ptr->data; + if ( (ptr = RNA_property_pointer_get(op->ptr, "id")) ) + id= (ID *)ptr->id; +#endif + + groupmode= RNA_enum_get(op->ptr, "grouping_method"); + RNA_string_get(op->ptr, "group_name", group_name); + + RNA_string_get(op->ptr, "rna_path", rna_path); + array_index= RNA_int_get(op->ptr, "array_index"); + + if (RNA_boolean_get(op->ptr, "entire_array")) + flag |= KSP_FLAG_WHOLE_ARRAY; + + /* if enough args are provided, call API method */ + if (ks) { + BKE_keyingset_add_destination(ks, id, group_name, rna_path, array_index, flag, groupmode); + return OPERATOR_FINISHED; + } + else { + BKE_report(op->reports, RPT_ERROR, "Keying Set could not be added."); + return OPERATOR_CANCELLED; + } +} + +void ANIM_OT_keyingset_add_destination (wmOperatorType *ot) +{ + // XXX: this is also defined in rna_animation.c + static EnumPropertyItem prop_mode_grouping_items[] = { + {KSP_GROUP_NAMED, "NAMED", "Named Group", ""}, + {KSP_GROUP_NONE, "NONE", "None", ""}, + {KSP_GROUP_KSNAME, "KEYINGSET", "Keying Set Name", ""}, + {0, NULL, NULL, NULL}}; + + /* identifiers */ + ot->name= "Add Keying Set Destination"; + ot->idname= "ANIM_OT_keyingset_add_destination"; + + /* callbacks */ + ot->exec= keyingset_add_destination_exec; + ot->poll= ED_operator_scene_editable; + + /* props */ + /* pointers */ // xxx - do we want to directly expose these? + RNA_def_pointer_runtime(ot->srna, "keyingset", &RNA_KeyingSet, "Keying Set", "Keying Set to add destination to."); + RNA_def_pointer_runtime(ot->srna, "id", &RNA_ID, "ID", "ID-block for the destination."); + /* grouping */ + RNA_def_enum(ot->srna, "grouping_method", prop_mode_grouping_items, KSP_GROUP_NAMED, "Grouping Method", "Method used to define which Group-name to use."); + RNA_def_string(ot->srna, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name)."); + /* rna-path */ + RNA_def_string(ot->srna, "rna_path", "", 256, "RNA-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough + RNA_def_int(ot->srna, "array_index", 0, 0, INT_MAX, "Array Index", "If applicable, the index ", 0, INT_MAX); + /* flags */ + RNA_def_boolean(ot->srna, "entire_array", 1, "Entire Array", "hen an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used."); + +} + +/* ----- */ + +static int keyingset_add_new_exec (bContext *C, wmOperator *op) +{ + Scene *sce= CTX_data_scene(C); + KeyingSet *ks= NULL; + short flag=0, keyingflag=0; + char name[64]; + + /* get settings from operator properties */ + RNA_string_get(op->ptr, "name", name); + + if (RNA_boolean_get(op->ptr, "absolute")) + flag |= KEYINGSET_ABSOLUTE; + if (RNA_boolean_get(op->ptr, "insertkey_needed")) + keyingflag |= INSERTKEY_NEEDED; + if (RNA_boolean_get(op->ptr, "insertkey_visual")) + keyingflag |= INSERTKEY_MATRIX; + + /* call the API func, and set the active keyingset index */ + ks= BKE_keyingset_add(&sce->keyingsets, name, flag, keyingflag); + + if (ks) { + sce->active_keyingset= BLI_countlist(&sce->keyingsets); + return OPERATOR_FINISHED; + } + else { + BKE_report(op->reports, RPT_ERROR, "Keying Set could not be added."); + return OPERATOR_CANCELLED; + } +} + +void ANIM_OT_keyingset_add_new (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Keying Set"; + ot->idname= "ANIM_OT_keyingset_add_new"; + + /* callbacks */ + ot->exec= keyingset_add_new_exec; + ot->poll= ED_operator_scene_editable; + + /* props */ + /* name */ + RNA_def_string(ot->srna, "name", "KeyingSet", 64, "Name", "Name of Keying Set"); + /* flags */ + RNA_def_boolean(ot->srna, "absolute", 1, "Absolute", "Keying Set defines specifc paths/settings to be keyframed (i.e. is not reliant on context info)"); + /* keying flags */ + RNA_def_boolean(ot->srna, "insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves."); + RNA_def_boolean(ot->srna, "insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'."); +} +/* UI API --------------------------------------------- */ /* Build menu-string of available keying-sets (allocates memory for string) * NOTE: mode must not be longer than 64 chars @@ -918,6 +1043,17 @@ char *ANIM_build_keyingsets_menu (ListBase *list, short for_edit) return str; } + + +/* ******************************************* */ +/* KEYFRAME MODIFICATION */ + +/* mode for common_modifykey */ +enum { + COMMONKEY_MODE_INSERT = 0, + COMMONKEY_MODE_DELETE, +} eCommonModifyKey_Modes; + #if 0 // XXX old keyingsets code based on adrcodes... to be restored in due course /* --------- KeyingSet Adrcode Getters ------------ */ diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index 78ba65d9814..b2846fc0bd9 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -69,6 +69,13 @@ short deletekey(struct ID *id, const char group[], const char rna_path[], int ar /* Generate menu of KeyingSets */ char *ANIM_build_keyingsets_menu(struct ListBase *list, short for_edit); +/* KeyingSet Editing Operators: + * These can add a new KeyingSet and/or add 'destinations' to the KeyingSets, + * acting as a means by which they can be added outside the Outliner. + */ +void ANIM_OT_keyingset_add_new(struct wmOperatorType *ot); +void ANIM_OT_keyingset_add_destination(struct wmOperatorType *ot); + /* Main Keyframe Management operators: * These handle keyframes management from various spaces. They only make use of * Keying Sets. |