From e80ac54a22214a8ecc499aa70f59bb61fcba4fa3 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 25 Aug 2009 04:05:37 +0000 Subject: 2.5 - Keying Sets API (now usable from Py-Scripts) Wrapped the Keying Sets API with RNA Functions so that they can now be called from Py-Scripts. This will ultimately be useful for riggers to create Keying Sets which can get loaded up/created for animators to use after importing their rig. I've created a demo for this, which can be found at: http://www.pasteall.org/blend/552 Notes: - Kazanbas, I've had to create a rna_scene_api.c here to hold some of the relevant functions. Hopefully this won't cause you too much pain when you do your next merge from 2.5 to your branch ;) - I've noticed that there seem to be a few cases mentioned in the demo which don't totally work yet. I'll commit some fixes for those later. --- source/blender/makesrna/RNA_enum_types.h | 2 + source/blender/makesrna/intern/makesrna.c | 4 +- source/blender/makesrna/intern/rna_animation.c | 20 +++-- source/blender/makesrna/intern/rna_animation_api.c | 89 ++++++++++++++++++ source/blender/makesrna/intern/rna_internal.h | 2 + source/blender/makesrna/intern/rna_scene.c | 3 + source/blender/makesrna/intern/rna_scene_api.c | 100 +++++++++++++++++++++ 7 files changed, 209 insertions(+), 11 deletions(-) create mode 100644 source/blender/makesrna/intern/rna_animation_api.c create mode 100644 source/blender/makesrna/intern/rna_scene_api.c (limited to 'source/blender/makesrna') diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 46d8c50caa6..06be0e69be5 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -41,6 +41,8 @@ extern EnumPropertyItem boidrule_type_items[]; extern EnumPropertyItem beztriple_handle_type_items[]; extern EnumPropertyItem beztriple_interpolation_mode_items[]; +extern EnumPropertyItem keyingset_path_grouping_items[]; + extern EnumPropertyItem fmodifier_type_items[]; extern EnumPropertyItem nla_mode_extend_items[]; diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 83178f32d5f..fa3a5a40686 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -1942,7 +1942,7 @@ RNAProcessItem PROCESS_ITEMS[]= { {"rna_ID.c", NULL, RNA_def_ID}, {"rna_texture.c", NULL, RNA_def_texture}, {"rna_action.c", NULL, RNA_def_action}, - {"rna_animation.c", NULL, RNA_def_animation}, + {"rna_animation.c", "rna_animation_api.c", RNA_def_animation}, {"rna_actuator.c", NULL, RNA_def_actuator}, {"rna_armature.c", NULL, RNA_def_armature}, {"rna_boid.c", NULL, RNA_def_boid}, @@ -1975,7 +1975,7 @@ RNAProcessItem PROCESS_ITEMS[]= { {"rna_pose.c", NULL, RNA_def_pose}, {"rna_property.c", NULL, RNA_def_gameproperty}, {"rna_render.c", NULL, RNA_def_render}, - {"rna_scene.c", NULL, RNA_def_scene}, + {"rna_scene.c", "rna_scene_api.c", RNA_def_scene}, {"rna_screen.c", NULL, RNA_def_screen}, {"rna_sculpt_paint.c", NULL, RNA_def_sculpt_paint}, {"rna_sensor.c", NULL, RNA_def_sensor}, diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index e334e2b5e90..7652987ac86 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -36,6 +36,14 @@ #include "MEM_guardedalloc.h" +/* exported for use in API */ +EnumPropertyItem keyingset_path_grouping_items[] = { + {KSP_GROUP_NAMED, "NAMED", 0, "Named Group", ""}, + {KSP_GROUP_NONE, "NONE", 0, "None", ""}, + {KSP_GROUP_KSNAME, "KEYINGSET", 0, "Keying Set Name", ""}, + {KSP_GROUP_TEMPLATE_ITEM, "TEMPLATE", 0, "Innermost Context-Item Name", ""}, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME static int rna_AnimData_action_editable(PointerRNA *ptr) @@ -90,13 +98,6 @@ void rna_def_keyingset_path(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem prop_mode_grouping_items[] = { - {KSP_GROUP_NAMED, "NAMED", 0, "Named Group", ""}, - {KSP_GROUP_NONE, "NONE", 0, "None", ""}, - {KSP_GROUP_KSNAME, "KEYINGSET", 0, "Keying Set Name", ""}, - {KSP_GROUP_TEMPLATE_ITEM, "TEMPLATE", 0, "Innermost Context-Item Name", ""}, - {0, NULL, 0, NULL, NULL}}; - srna= RNA_def_struct(brna, "KeyingSetPath", NULL); RNA_def_struct_sdna(srna, "KS_Path"); RNA_def_struct_ui_text(srna, "Keying Set Path", "Path to a setting for use in a Keying Set."); @@ -112,7 +113,7 @@ void rna_def_keyingset_path(BlenderRNA *brna) /* Grouping */ prop= RNA_def_property(srna, "grouping", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "groupmode"); - RNA_def_property_enum_items(prop, prop_mode_grouping_items); + RNA_def_property_enum_items(prop, keyingset_path_grouping_items); RNA_def_property_ui_text(prop, "Grouping Method", "Method used to define which Group-name to use."); /* Path + Array Index */ @@ -170,7 +171,8 @@ void rna_def_keyingset(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_MATRIX); RNA_def_property_ui_text(prop, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'."); - + /* Keying Set API */ + RNA_api_keyingset(srna); } /* --- */ diff --git a/source/blender/makesrna/intern/rna_animation_api.c b/source/blender/makesrna/intern/rna_animation_api.c new file mode 100644 index 00000000000..6af87335e02 --- /dev/null +++ b/source/blender/makesrna/intern/rna_animation_api.c @@ -0,0 +1,89 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Joshua Leung + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include + +#include "RNA_define.h" +#include "RNA_enum_types.h" +#include "RNA_types.h" + +#include "DNA_anim_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + +#ifdef RNA_RUNTIME + +#include "BKE_animsys.h" + +static void rna_KeyingSet_add_destination(KeyingSet *keyingset, ReportList *reports, + ID *id, char rna_path[], int array_index, int entire_array, + int grouping_method, char group_name[]) +{ + short flag = 0; + + /* validate flags */ + if (entire_array) + flag |= KSP_FLAG_WHOLE_ARRAY; + + /* if data is valid, call the API function for this */ + if (keyingset) { + BKE_keyingset_add_destination(keyingset, id, group_name, rna_path, array_index, flag, grouping_method); + } + else { + BKE_report(reports, RPT_ERROR, "Keying Set Destination could not be added."); + } +} + +#else + +void RNA_api_keyingset(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + /* Add Destination */ + func= RNA_def_function(srna, "add_destination", "rna_KeyingSet_add_destination"); + RNA_def_function_ui_description(func, "Add a new destination for the Keying Set."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + /* ID-block for target */ + parm= RNA_def_pointer(func, "target_id", "ID", "Target ID", "ID-Datablock for the destination."); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* rna-path */ + parm= RNA_def_string(func, "rna_path", "", 256, "RNA-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough + RNA_def_property_flag(parm, PROP_REQUIRED); + parm=RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Array Index", "If applicable, the index ", 0, INT_MAX); + /* flags */ + parm=RNA_def_boolean(func, "entire_array", 1, "Entire Array", "When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used."); + /* grouping */ + parm=RNA_def_enum(func, "grouping_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use."); + parm=RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name)."); +} + +#endif + diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 579441691ff..bd28085692f 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -197,9 +197,11 @@ void rna_Object_update_data(struct bContext *C, struct PointerRNA *ptr); /* API functions */ +void RNA_api_keyingset(struct StructRNA *srna); void RNA_api_main(struct StructRNA *srna); void RNA_api_mesh(struct StructRNA *srna); void RNA_api_object(struct StructRNA *srna); +void RNA_api_scene(struct StructRNA *srna); void RNA_api_ui_layout(struct StructRNA *srna); void RNA_api_wm(struct StructRNA *srna); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 40e3efc9e46..592836c8278 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1995,6 +1995,9 @@ void RNA_def_scene(BlenderRNA *brna) rna_def_scene_render_data(brna); rna_def_scene_game_data(brna); rna_def_scene_render_layer(brna); + + /* Scene API */ + RNA_api_scene(srna); } #endif diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c new file mode 100644 index 00000000000..26047ab5dc3 --- /dev/null +++ b/source/blender/makesrna/intern/rna_scene_api.c @@ -0,0 +1,100 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Joshua Leung + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include + +#include "RNA_define.h" +#include "RNA_enum_types.h" +#include "RNA_types.h" + +#include "DNA_anim_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + +#ifdef RNA_RUNTIME + +#include "BKE_animsys.h" + +// Scene API stuff from kazanbas branch here... + + +static KeyingSet *rna_Scene_add_keying_set(Scene *sce, ReportList *reports, + char name[], int absolute, int insertkey_needed, int insertkey_visual) +{ + KeyingSet *ks= NULL; + short flag=0, keyingflag=0; + + /* validate flags */ + if (absolute) + flag |= KEYINGSET_ABSOLUTE; + if (insertkey_needed) + keyingflag |= INSERTKEY_NEEDED; + if (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 ks; + } + else { + BKE_report(reports, RPT_ERROR, "Keying Set could not be added."); + return NULL; + } +} + +#else + +void RNA_api_scene(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + // Scene API stuff from kazanbas branch here... + + /* Add Keying Set */ + func= RNA_def_function(srna, "add_keying_set", "rna_Scene_add_keying_set"); + RNA_def_function_ui_description(func, "Add a new Keying Set to Scene."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + /* returns the new KeyingSet */ + parm= RNA_def_pointer(func, "keyingset", "KeyingSet", "", "Newly created Keying Set."); + RNA_def_function_return(func, parm); + /* name */ + RNA_def_string(func, "name", "KeyingSet", 64, "Name", "Name of Keying Set"); + /* flags */ + RNA_def_boolean(func, "absolute", 1, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)"); + /* keying flags */ + RNA_def_boolean(func, "insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves."); + RNA_def_boolean(func, "insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'."); +} + +#endif + -- cgit v1.2.3