diff options
Diffstat (limited to 'source/blender/editors/space_action')
-rw-r--r-- | source/blender/editors/space_action/action_data.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_action/action_draw.c | 55 | ||||
-rw-r--r-- | source/blender/editors/space_action/space_action.c | 9 |
3 files changed, 65 insertions, 1 deletions
diff --git a/source/blender/editors/space_action/action_data.c b/source/blender/editors/space_action/action_data.c index 9ff46d96207..57f9138ec3a 100644 --- a/source/blender/editors/space_action/action_data.c +++ b/source/blender/editors/space_action/action_data.c @@ -71,7 +71,7 @@ /* ACTION CREATION */ /* Helper function to find the active AnimData block from the Action Editor context */ -AnimData *ED_actedit_animdata_from_context(bContext *C, ID **r_adt_id_owner) +AnimData *ED_actedit_animdata_from_context(const bContext *C, ID **r_adt_id_owner) { SpaceAction *saction = (SpaceAction *)CTX_wm_space_data(C); Object *ob = CTX_data_active_object(C); diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 6f1a90e56a5..bc13b7f2b1b 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -131,6 +131,54 @@ void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *region) /* extra padding for lengths (to go under scrollers) */ #define EXTRA_SCROLL_PAD 100.0f +/* Draw manually set intended playback frame ranges for actions. */ +static void draw_channel_action_ranges(bAnimContext *ac, ListBase *anim_data, View2D *v2d) +{ + /* Variables for coalescing the Y region of one action. */ + bAction *cur_action = NULL; + AnimData *cur_adt = NULL; + float cur_ymax; + + /* Walk through channels, grouping contiguous spans referencing the same action. */ + float ymax = ACHANNEL_FIRST_TOP(ac) + ACHANNEL_SKIP / 2; + float ystep = ACHANNEL_STEP(ac); + float ymin = ymax - ystep; + + for (bAnimListElem *ale = anim_data->first; ale; ale = ale->next, ymax = ymin, ymin -= ystep) { + bAction *action = NULL; + AnimData *adt = NULL; + + /* check if visible */ + if (IN_RANGE(ymin, v2d->cur.ymin, v2d->cur.ymax) || + IN_RANGE(ymax, v2d->cur.ymin, v2d->cur.ymax)) { + /* check if anything to show for this channel */ + if (ale->datatype != ALE_NONE) { + action = ANIM_channel_action_get(ale); + + if (action) { + adt = ale->adt; + } + } + } + + /* Extend the current region, or flush and restart. */ + if (action != cur_action || adt != cur_adt) { + if (cur_action) { + ANIM_draw_action_framerange(cur_adt, cur_action, v2d, ymax, cur_ymax); + } + + cur_action = action; + cur_adt = adt; + cur_ymax = ymax; + } + } + + /* Flush the last region. */ + if (cur_action) { + ANIM_draw_action_framerange(cur_adt, cur_action, v2d, ymax, cur_ymax); + } +} + /* draw keyframes in each channel */ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *region) { @@ -166,6 +214,13 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *region int height = ACHANNEL_TOT_HEIGHT(ac, items); v2d->tot.ymin = -height; + /* Draw the manual frame ranges for actions in the background of the dopesheet. + * The action editor has already drawn the range for its action so it's not needed. */ + if (ac->datatype == ANIMCONT_DOPESHEET) { + draw_channel_action_ranges(ac, &anim_data, v2d); + } + + /* Draw the background strips. */ GPUVertFormat *format = immVertexFormat(); uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index 738eeb21e2e..ebb28f3a208 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -25,6 +25,7 @@ #include <string.h> #include "DNA_action_types.h" +#include "DNA_anim_types.h" #include "DNA_collection_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -35,6 +36,7 @@ #include "BLI_utildefines.h" #include "BKE_context.h" +#include "BKE_nla.h" #include "BKE_screen.h" #include "RNA_access.h" @@ -204,6 +206,13 @@ static void action_main_region_draw(const bContext *C, ARegion *region) /* start and end frame */ ANIM_draw_framerange(scene, v2d); + /* Draw the manually set intended playback frame range highlight in the Action editor. */ + if (ELEM(saction->mode, SACTCONT_ACTION, SACTCONT_SHAPEKEY) && saction->action) { + AnimData *adt = ED_actedit_animdata_from_context(C, NULL); + + ANIM_draw_action_framerange(adt, saction->action, v2d, -FLT_MAX, FLT_MAX); + } + /* data */ if (ANIM_animdata_get_context(C, &ac)) { draw_channel_strips(&ac, saction, region); |