diff --git a/release/scripts/keyingsets/keyingsets_builtins.py b/release/scripts/keyingsets/keyingsets_builtins.py index c5417ba3d66..bf5c66ad01d 100644 --- a/release/scripts/keyingsets/keyingsets_builtins.py +++ b/release/scripts/keyingsets/keyingsets_builtins.py @@ -11,8 +11,7 @@ from keyingsets_utils import * # Location class BUILTIN_KSI_Location(bpy.types.KeyingSetInfo): - bl_idname = "Location" - bl_builtin = True + bl_label = "Location" # poll - use predefined callback for selected bones/objects poll = RKS_POLL_selected_items @@ -25,8 +24,7 @@ class BUILTIN_KSI_Location(bpy.types.KeyingSetInfo): # Rotation class BUILTIN_KSI_Rotation(bpy.types.KeyingSetInfo): - bl_idname = "Rotation" - bl_builtin = True + bl_label = "Rotation" # poll - use predefined callback for selected bones/objects poll = RKS_POLL_selected_items @@ -39,8 +37,7 @@ class BUILTIN_KSI_Rotation(bpy.types.KeyingSetInfo): # Scale class BUILTIN_KSI_Scaling(bpy.types.KeyingSetInfo): - bl_idname = "Scaling" - bl_builtin = True + bl_label = "Scaling" # poll - use predefined callback for selected bones/objects poll = RKS_POLL_selected_items @@ -55,8 +52,7 @@ class BUILTIN_KSI_Scaling(bpy.types.KeyingSetInfo): # LocRot class BUILTIN_KSI_LocRot(bpy.types.KeyingSetInfo): - bl_idname = "LocRot" - bl_builtin = True + bl_label = "LocRot" # poll - use predefined callback for selected bones/objects poll = RKS_POLL_selected_items @@ -73,8 +69,7 @@ class BUILTIN_KSI_LocRot(bpy.types.KeyingSetInfo): # LocScale class BUILTIN_KSI_LocScale(bpy.types.KeyingSetInfo): - bl_idname = "LocScale" - bl_builtin = True + bl_label = "LocScale" # poll - use predefined callback for selected bones/objects poll = RKS_POLL_selected_items @@ -91,8 +86,7 @@ class BUILTIN_KSI_LocScale(bpy.types.KeyingSetInfo): # LocRotScale class BUILTIN_KSI_LocRotScale(bpy.types.KeyingSetInfo): - bl_idname = "LocRotScale" - bl_builtin = True + bl_label = "LocRotScale" # poll - use predefined callback for selected bones/objects poll = RKS_POLL_selected_items @@ -111,8 +105,7 @@ class BUILTIN_KSI_LocRotScale(bpy.types.KeyingSetInfo): # RotScale class BUILTIN_KSI_RotScale(bpy.types.KeyingSetInfo): - bl_idname = "RotScale" - bl_builtin = True + bl_label = "RotScale" # poll - use predefined callback for selected bones/objects poll = RKS_POLL_selected_items @@ -131,8 +124,7 @@ class BUILTIN_KSI_RotScale(bpy.types.KeyingSetInfo): # Location class BUILTIN_KSI_VisualLoc(bpy.types.KeyingSetInfo): - bl_idname = "Visual Location" - bl_builtin = True + bl_label = "Visual Location" insertkey_visual = True @@ -147,8 +139,7 @@ class BUILTIN_KSI_VisualLoc(bpy.types.KeyingSetInfo): # Rotation class BUILTIN_KSI_VisualRot(bpy.types.KeyingSetInfo): - bl_idname = "Visual Rotation" - bl_builtin = True + bl_label = "Visual Rotation" insertkey_visual = True @@ -163,8 +154,7 @@ class BUILTIN_KSI_VisualRot(bpy.types.KeyingSetInfo): # VisualLocRot class BUILTIN_KSI_VisualLocRot(bpy.types.KeyingSetInfo): - bl_idname = "Visual LocRot" - bl_builtin = True + bl_label = "Visual LocRot" insertkey_visual = True @@ -185,8 +175,7 @@ class BUILTIN_KSI_VisualLocRot(bpy.types.KeyingSetInfo): # Available class BUILTIN_KSI_Available(bpy.types.KeyingSetInfo): - bl_idname = "Available" - bl_builtin = True + bl_label = "Available" # poll - use predefined callback for selected objects # TODO: this should really check whether the selected object (or datablock) diff --git a/release/scripts/ui/properties_scene.py b/release/scripts/ui/properties_scene.py index 7cdb42b832b..714f22f5ca6 100644 --- a/release/scripts/ui/properties_scene.py +++ b/release/scripts/ui/properties_scene.py @@ -101,7 +101,6 @@ class SCENE_PT_keying_sets(SceneButtonsPanel): col = row.column() col.prop(ks, "name") - col.prop(ks, "absolute") subcol = col.column() subcol.operator_context = 'INVOKE_DEFAULT' diff --git a/release/scripts/ui/space_time.py b/release/scripts/ui/space_time.py index 2f2fad59e9f..cfd5fdfce0b 100644 --- a/release/scripts/ui/space_time.py +++ b/release/scripts/ui/space_time.py @@ -77,7 +77,7 @@ class TIME_HT_header(bpy.types.Header): layout.separator() row = layout.row(align=True) - row.prop_object(scene, "active_keying_set", scene, "keying_sets", text="") + row.prop_object(scene, "active_keying_set", scene, "all_keying_sets", text="") row.operator("anim.keyframe_insert", text="", icon='KEY_HLT') row.operator("anim.keyframe_delete", text="", icon='KEY_DEHLT') diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index a2749a5a457..9fb442f8600 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -769,11 +769,11 @@ static short animsys_remap_path (AnimMapper *remap, char *path, char **dst) /* Write the given value to a setting using RNA, and return success */ static short animsys_write_rna_setting (PointerRNA *ptr, char *path, int array_index, float value) { - // printf("%p %s %i %f\n", ptr, path, array_index, value); - PropertyRNA *prop; PointerRNA new_ptr; + //printf("%p %s %i %f\n", ptr, path, array_index, value); + /* get property to write to */ if (RNA_path_resolve(ptr, path, &new_ptr, &prop)) { @@ -781,7 +781,7 @@ static short animsys_write_rna_setting (PointerRNA *ptr, char *path, int array_i if (RNA_property_animateable(&new_ptr, prop)) { int array_len= RNA_property_array_length(&new_ptr, prop); - + if(array_len && array_index >= array_len) { if (G.f & G_DEBUG) { @@ -789,10 +789,10 @@ static short animsys_write_rna_setting (PointerRNA *ptr, char *path, int array_i (ptr && ptr->id.data) ? (((ID *)ptr->id.data)->name+2) : "", path, array_index, array_len-1); } - + return 0; } - + switch (RNA_property_type(prop)) { case PROP_BOOLEAN: @@ -1003,7 +1003,12 @@ static void nlastrip_evaluate_controls (NlaStrip *strip, float ctime) animsys_evaluate_fcurves(&strip_ptr, &strip->fcurves, NULL, ctime); } - if (strip->flag & NLASTRIP_FLAG_USR_TIME && strip->flag & NLASTRIP_FLAG_USR_TIME_CYCLIC) + /* if user can control the evaluation time (using F-Curves), consider the option which allows this time to be clamped + * to lie within extents of the action-clip, so that a steady changing rate of progress through several cycles of the clip + * can be achieved easily + */ + // NOTE: if we add any more of these special cases, we better group them up nicely... + if ((strip->flag & NLASTRIP_FLAG_USR_TIME) && (strip->flag & NLASTRIP_FLAG_USR_TIME_CYCLIC)) strip->strip_time= fmod(strip->strip_time - strip->actstart, strip->actend - strip->actstart); } @@ -1740,7 +1745,7 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re */ // TODO: need to double check that this all works correctly if ((recalc & ADT_RECALC_ANIM) || (adt->recalc & ADT_RECALC_ANIM)) - { + { /* evaluate NLA data */ if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF)) { diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c index a93220aeb67..db9f5b4b97d 100644 --- a/source/blender/editors/animation/keyingsets.c +++ b/source/blender/editors/animation/keyingsets.c @@ -521,20 +521,12 @@ KeyingSet *ANIM_builtin_keyingset_get_named (KeyingSet *prevKS, const char name[ /* Add the given KeyingSetInfo to the list of type infos, and create an appropriate builtin set too */ void ANIM_keyingset_info_register (const bContext *C, KeyingSetInfo *ksi) { - Scene *scene = CTX_data_scene(C); - ListBase *list = NULL; KeyingSet *ks; - /* determine the KeyingSet list to include the new KeyingSet in */ - if (ksi->builtin==0 && scene) - list = &scene->keyingsets; - else - list = &builtin_keyingsets; - /* create a new KeyingSet * - inherit name and keyframing settings from the typeinfo */ - ks = BKE_keyingset_add(list, ksi->name, ksi->builtin, ksi->keyingflag); + ks = BKE_keyingset_add(&builtin_keyingsets, ksi->name, 1, ksi->keyingflag); /* link this KeyingSet with its typeinfo */ memcpy(&ks->typeinfo, ksi->name, sizeof(ks->typeinfo)); @@ -549,8 +541,10 @@ void ANIM_keyingset_info_unregister (const bContext *C, KeyingSetInfo *ksi) Scene *scene = CTX_data_scene(C); KeyingSet *ks, *ksn; - /* find relevant scene KeyingSets which use this, and remove them */ - for (ks= scene->keyingsets.first; ks; ks= ksn) { + /* find relevant builtin KeyingSets which use this, and remove them */ + // TODO: this isn't done now, since unregister is really only used atm when we + // reload the scripts, which kindof defeats the purpose of "builtin"? + for (ks= builtin_keyingsets.first; ks; ks= ksn) { ksn = ks->next; /* remove if matching typeinfo name */ @@ -560,11 +554,6 @@ void ANIM_keyingset_info_unregister (const bContext *C, KeyingSetInfo *ksi) } } - /* do the same with builtin sets? */ - // TODO: this isn't done now, since unregister is really only used atm when we - // reload the scripts, which kindof defeats the purpose of "builtin"? - - /* free the type info */ BLI_freelinkN(&keyingset_type_infos, ksi); } @@ -595,18 +584,49 @@ void ANIM_keyingset_infos_exit () /* Get the active Keying Set for the Scene provided */ KeyingSet *ANIM_scene_get_active_keyingset (Scene *scene) { - if (ELEM(NULL, scene, scene->keyingsets.first)) + /* if no scene, we've got no hope of finding the Keying Set */ + if (scene == NULL) return NULL; /* currently, there are several possibilities here: * - 0: no active keying set * - > 0: one of the user-defined Keying Sets, but indices start from 0 (hence the -1) - * - < 0: a builtin keying set (XXX this isn't enabled yet so that we don't get errors on reading back files) + * - < 0: a builtin keying set */ if (scene->active_keyingset > 0) return BLI_findlink(&scene->keyingsets, scene->active_keyingset-1); - else // for now... - return NULL; + else + return BLI_findlink(&builtin_keyingsets, (-scene->active_keyingset)-1); +} + +/* Get the index of the Keying Set provided, for the given Scene */ +int ANIM_scene_get_keyingset_index (Scene *scene, KeyingSet *ks) +{ + int index; + + /* if no KeyingSet provided, have none */ + if (ks == NULL) + return 0; + + /* check if the KeyingSet exists in scene list */ + if (scene) { + /* get index and if valid, return + * - (absolute) Scene KeyingSets are from (>= 1) + */ + index = BLI_findindex(&scene->keyingsets, ks); + if (index != -1) + return (index + 1); + } + + /* still here, so try builtins list too + * - builtins are from (<= -1) + * - none/invalid is (= 0) + */ + index = BLI_findindex(&builtin_keyingsets, ks); + if (index != -1) + return -(index + 1); + else + return 0; } /* Check if KeyingSet can be used in the current context */ diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index c0821b3ff55..b1407ac8f2e 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -127,8 +127,6 @@ typedef struct KeyingSetInfo { char name[64]; /* keying settings */ short keyingflag; - /* builtin? */ - short builtin; /* polling callbacks */ /* callback for polling the context for whether the right data is available */ @@ -190,6 +188,9 @@ void ANIM_keyingset_infos_exit(void); /* Get the active KeyingSet for the given scene */ struct KeyingSet *ANIM_scene_get_active_keyingset(struct Scene *scene); +/* Get the index of the Keying Set provided, for the given Scene */ +int ANIM_scene_get_keyingset_index(struct Scene *scene, struct KeyingSet *ks); + /* Check if KeyingSet can be used in the current context */ short ANIM_keyingset_context_ok_poll(struct bContext *C, struct KeyingSet *ks); diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index ebb251c32ca..61abe8bc9fe 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -362,18 +362,13 @@ static void rna_def_keyingset_info(BlenderRNA *brna) RNA_define_verify_sdna(0); // not in sdna - /* Name */ - prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE); + /* Name */ + prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); RNA_def_property_ui_text(prop, "Name", ""); RNA_def_struct_name_property(srna, prop); RNA_def_property_flag(prop, PROP_REGISTER); - prop= RNA_def_property(srna, "bl_builtin", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "builtin", 1); - RNA_def_property_ui_text(prop, "BuiltIn", "Keying Set type is required internally."); - RNA_def_property_flag(prop, PROP_REGISTER); - rna_def_common_keying_flags(srna, 1); /* '1' arg here is to indicate that we need these to be set on registering */ RNA_define_verify_sdna(1); @@ -471,6 +466,7 @@ static void rna_def_keyingset(BlenderRNA *brna) /* Name */ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Name", ""); + RNA_def_struct_ui_icon(srna, ICON_KEY_HLT); // TODO: we need a dedicated icon RNA_def_struct_name_property(srna, prop); /* TypeInfo associated with Relative KeyingSet (only) */ @@ -501,7 +497,7 @@ static void rna_def_keyingset(BlenderRNA *brna) /* Flags */ prop= RNA_def_property(srna, "absolute", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYINGSET_ABSOLUTE); - RNA_def_property_ui_text(prop, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)"); + RNA_def_property_ui_text(prop, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)"); /* Keyframing Flags */ rna_def_common_keying_flags(srna, 0); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 746fb451663..07d7b063ffb 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -167,6 +167,7 @@ EnumPropertyItem image_type_items[] = { #include "ED_view3d.h" #include "ED_object.h" #include "ED_mesh.h" +#include "ED_keyframing.h" #include "RE_pipeline.h" @@ -359,46 +360,60 @@ static void rna_Scene_frame_update(bContext *C, PointerRNA *ptr) sound_seek_scene(C); } -static int rna_Scene_active_keying_set_editable(PointerRNA *ptr) -{ - Scene *scene= (Scene *)ptr->data; - - /* only editable if there are some Keying Sets to change to */ - return (scene->keyingsets.first != NULL); -} - static PointerRNA rna_Scene_active_keying_set_get(PointerRNA *ptr) { Scene *scene= (Scene *)ptr->data; - return rna_pointer_inherit_refine(ptr, &RNA_KeyingSet, BLI_findlink(&scene->keyingsets, scene->active_keyingset-1)); + return rna_pointer_inherit_refine(ptr, &RNA_KeyingSet, ANIM_scene_get_active_keyingset(scene)); } static void rna_Scene_active_keying_set_set(PointerRNA *ptr, PointerRNA value) { Scene *scene= (Scene *)ptr->data; KeyingSet *ks= (KeyingSet*)value.data; - scene->active_keyingset= BLI_findindex(&scene->keyingsets, ks) + 1; -} - -static int rna_Scene_active_keying_set_index_get(PointerRNA *ptr) -{ - Scene *scene= (Scene *)ptr->data; - return MAX2(scene->active_keyingset-1, 0); -} - -static void rna_Scene_active_keying_set_index_set(PointerRNA *ptr, int value) -{ - Scene *scene= (Scene *)ptr->data; - scene->active_keyingset= value+1; + + scene->active_keyingset= ANIM_scene_get_keyingset_index(scene, ks); } +#if 0 // XXX: these need to be fixed up first... static void rna_Scene_active_keying_set_index_range(PointerRNA *ptr, int *min, int *max) { Scene *scene= (Scene *)ptr->data; - + + // FIXME: would need access to builtin keyingsets list to count min... *min= 0; - *max= BLI_countlist(&scene->keyingsets)-1; - *max= MAX2(0, *max); + *max= 0; +} +#endif + +// XXX: evil... builtin_keyingsets is defined in keyingsets.c! +// TODO: make API function to retrieve this... +extern ListBase builtin_keyingsets; + +static void rna_Scene_all_keyingsets_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +{ + Scene *scene= (Scene*)ptr->data; + + /* start going over the scene KeyingSets first, while we still have pointer to it + * but only if we have any Keying Sets to use... + */ + if (scene->keyingsets.first) + rna_iterator_listbase_begin(iter, &scene->keyingsets, NULL); + else + rna_iterator_listbase_begin(iter, &builtin_keyingsets, NULL); +} + +static void rna_Scene_all_keyingsets_next(CollectionPropertyIterator *iter) +{ + ListBaseIterator *internal= iter->internal; + KeyingSet *ks= (KeyingSet*)internal->link; + + /* if we've run out of links in Scene list, jump over to the builtins list unless we're there already */ + if ((ks->next == NULL) && (ks != builtin_keyingsets.last)) + internal->link= (Link*)builtin_keyingsets.first; + else + internal->link= (Link*)ks->next; + + iter->valid= (internal->link != NULL); } @@ -2831,21 +2846,26 @@ void RNA_def_scene(BlenderRNA *brna) prop= RNA_def_property(srna, "keying_sets", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "keyingsets", NULL); RNA_def_property_struct_type(prop, "KeyingSet"); - RNA_def_property_ui_text(prop, "Keying Sets", "Keying Sets for this Scene"); + RNA_def_property_ui_text(prop, "Absolute Keying Sets", "Absolute Keying Sets for this Scene"); + RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL); + + prop= RNA_def_property(srna, "all_keying_sets", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_funcs(prop, "rna_Scene_all_keyingsets_begin", "rna_Scene_all_keyingsets_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0); + RNA_def_property_struct_type(prop, "KeyingSet"); + RNA_def_property_ui_text(prop, "All Keying Sets", "All Keying Sets available for use (builtins and Absolute Keying Sets for this Scene)"); RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL); prop= RNA_def_property(srna, "active_keying_set", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "KeyingSet"); RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_editable_func(prop, "rna_Scene_active_keying_set_editable"); RNA_def_property_pointer_funcs(prop, "rna_Scene_active_keying_set_get", "rna_Scene_active_keying_set_set", NULL); RNA_def_property_ui_text(prop, "Active Keying Set", "Active Keying Set used to insert/delete keyframes"); RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL); prop= RNA_def_property(srna, "active_keying_set_index", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "active_keyingset"); - RNA_def_property_int_funcs(prop, "rna_Scene_active_keying_set_index_get", "rna_Scene_active_keying_set_index_set", "rna_Scene_active_keying_set_index_range"); - RNA_def_property_ui_text(prop, "Active Keying Set Index", "Current Keying Set index"); + //RNA_def_property_int_funcs(prop, NULL, NULL, "rna_Scene_active_keying_set_index_range"); // XXX + RNA_def_property_ui_text(prop, "Active Keying Set Index", "Current Keying Set index (negative for 'builtin' and positive for 'absolute')"); RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL); /* Tool Settings */