diff options
author | Joshua Leung <aligorith@gmail.com> | 2009-10-13 15:21:02 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2009-10-13 15:21:02 +0400 |
commit | de818dace53343a1fcbb03d8e535a77617c037fa (patch) | |
tree | ea7fb3911d8d3409488577fe0c89e3d89b527471 /source/blender/editors/animation/keyframes_edit.c | |
parent | f4d29269866a3bc4f9346bf24753d72da2456fc9 (diff) |
DopeSheet: DopeSheet Summary Channel
Added a summary channel that appears as the first channel in the DopeSheet. For now, this is disabled by default, but can be enabled using the 'Summary' toggle in the header between the mode selector and the standard filtering options. This has been done, since there is a possibility that it will make the DopeSheet run a bit slower.
In this channel you can do everything that you can normally do with DopeSheet channels (i.e. select, transform, edit, etc). It might be worth noting though that care probably needs to be taken when trying to use Copy/Paste, since that is still a bit fidgety...
In the process, I've fixed a few bugs, mostly with selection:
- Selecting keyframes in scene summaries wouldn't work
- Border select only worked in F-Curve and Group channels
Diffstat (limited to 'source/blender/editors/animation/keyframes_edit.c')
-rw-r--r-- | source/blender/editors/animation/keyframes_edit.c | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c index 7f0d3b4503d..3b2830e9045 100644 --- a/source/blender/editors/animation/keyframes_edit.c +++ b/source/blender/editors/animation/keyframes_edit.c @@ -310,16 +310,48 @@ static short scene_keys_bezier_loop(BeztEditData *bed, Scene *sce, BeztEditFunc return 0; /* Scene's own animation */ - if (sce->adt) - adt_keys_bezier_loop(bed, sce->adt, bezt_ok, bezt_cb, fcu_cb, filterflag); + if (sce->adt) { + if (adt_keys_bezier_loop(bed, sce->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + return 1; + } /* World */ - if (wo && wo->adt) - adt_keys_bezier_loop(bed, wo->adt, bezt_ok, bezt_cb, fcu_cb, filterflag); + if (wo && wo->adt) { + if (adt_keys_bezier_loop(bed, wo->adt, bezt_ok, bezt_cb, fcu_cb, filterflag)) + return 1; + } return 0; } +/* This function is used to loop over the keyframe data in a DopeSheet summary */ +static short summary_keys_bezier_loop(BeztEditData *bed, bAnimContext *ac, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag) +{ + ListBase anim_data = {NULL, NULL}; + bAnimListElem *ale; + int filter, ret_code=0; + + /* sanity check */ + if (ac == NULL) + return 0; + + /* get F-Curves to take keyframes from */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); + + /* loop through each F-Curve, working on the keyframes until the first curve aborts */ + for (ale= anim_data.first; ale; ale= ale->next) { + ret_code= ANIM_fcurve_keys_bezier_loop(bed, ale->data, bezt_ok, bezt_cb, fcu_cb); + + if (ret_code) + break; + } + + BLI_freelistN(&anim_data); + + return ret_code; +} + /* --- */ /* This function is used to apply operation to all keyframes, regardless of the type */ @@ -347,6 +379,8 @@ short ANIM_animchannel_keys_bezier_loop(BeztEditData *bed, bAnimListElem *ale, B return ob_keys_bezier_loop(bed, (Object *)ale->key_data, bezt_ok, bezt_cb, fcu_cb, filterflag); case ALE_SCE: /* scene */ return scene_keys_bezier_loop(bed, (Scene *)ale->data, bezt_ok, bezt_cb, fcu_cb, filterflag); + case ALE_ALL: /* 'all' (DopeSheet summary) */ + return summary_keys_bezier_loop(bed, (bAnimContext *)ale->data, bezt_ok, bezt_cb, fcu_cb, filterflag); } return 0; @@ -377,6 +411,8 @@ short ANIM_animchanneldata_keys_bezier_loop(BeztEditData *bed, void *data, int k return ob_keys_bezier_loop(bed, (Object *)data, bezt_ok, bezt_cb, fcu_cb, filterflag); case ALE_SCE: /* scene */ return scene_keys_bezier_loop(bed, (Scene *)data, bezt_ok, bezt_cb, fcu_cb, filterflag); + case ALE_ALL: /* 'all' (DopeSheet summary) */ + return summary_keys_bezier_loop(bed, (bAnimContext *)data, bezt_ok, bezt_cb, fcu_cb, filterflag); } return 0; |