From 53624a53d9054a91688a1a988c6f3515ab601923 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sat, 17 Oct 2009 04:22:52 +0000 Subject: [PATCH] Assorted tweaks for animation editors: * Changing to the ShapeKey editor now automatically enables the value sliders * Filtering code for ShapeKey editor can now do AnimData block filtering too (internal details...) * Silenced console warnings when inserting keyframes on F-Curves with no keyframes already (for Animation Editor sliders) * Made the update code for keyframe transforms send more general depsgraph updates. Unfortuately, this still doesn't resolve the update problems with shapekeys --- source/blender/blenkernel/intern/depsgraph.c | 13 ++++++++++++- source/blender/editors/animation/anim_filter.c | 10 +++++++--- source/blender/editors/animation/keyframing.c | 2 +- source/blender/editors/space_action/action_draw.c | 13 +------------ source/blender/editors/space_action/action_header.c | 12 +++++++++++- .../blender/editors/transform/transform_generics.c | 11 ++--------- 6 files changed, 34 insertions(+), 27 deletions(-) diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 26ea17a296a..d60a26e8feb 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -2235,7 +2235,18 @@ void DAG_id_flush_update(ID *id, short flag) } } } - + + /* set flags based on ShapeKey */ + if(idtype == ID_KE) { + for(obt=bmain->object.first; obt; obt= obt->id.next) { + Key *key= ob_get_key(obt); + if(!(ob && obt == ob) && ((ID *)key == id)) { + obt->flag |= (OB_RECALC|OB_RECALC_DATA); + BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH); + } + } + } + /* set flags based on particle settings */ if(idtype == ID_PA) { ParticleSystem *psys; diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index 84da3662661..aa1bc108176 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -926,11 +926,11 @@ static int animdata_filter_nla (ListBase *anim_data, bDopeSheet *ads, AnimData * /* Include ShapeKey Data for ShapeKey Editor */ static int animdata_filter_shapekey (ListBase *anim_data, Key *key, int filter_mode) { + bAnimListElem *ale; int items = 0; /* check if channels or only F-Curves */ if ((filter_mode & ANIMFILTER_CURVESONLY) == 0) { - bAnimListElem *ale; KeyBlock *kb; /* loop through the channels adding ShapeKeys as appropriate */ @@ -959,8 +959,12 @@ static int animdata_filter_shapekey (ListBase *anim_data, Key *key, int filter_m else { /* just use the action associated with the shapekey */ // FIXME: is owner-id and having no owner/dopesheet really fine? - if (key->adt && key->adt->action) - items= animdata_filter_action(anim_data, NULL, key->adt->action, filter_mode, NULL, ANIMTYPE_NONE, (ID *)key); + if (key->adt) { + if (filter_mode & ANIMFILTER_ANIMDATA) + ANIMDATA_ADD_ANIMDATA(key) + else if (key->adt->action) + items= animdata_filter_action(anim_data, NULL, key->adt->action, filter_mode, NULL, ANIMTYPE_NONE, (ID *)key); + } } /* return the number of items added to the list */ diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 75218e6ea6e..6a16d6d0ee1 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -1430,7 +1430,7 @@ int autokeyframe_cfra_can_key(Scene *scene, ID *id) short fcurve_frame_has_keyframe (FCurve *fcu, float frame, short filter) { /* quick sanity check */ - if (fcu == NULL) + if (ELEM(NULL, fcu, fcu->bezt)) return 0; /* we either include all regardless of muting, or only non-muted */ diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 7181a6b5aa1..7f2e1bd09e4 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -258,7 +258,7 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar) if (acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT)) sel= ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT); - if (ELEM(ac->datatype, ANIMCONT_ACTION, ANIMCONT_DOPESHEET)) { + if (ELEM3(ac->datatype, ANIMCONT_ACTION, ANIMCONT_DOPESHEET, ANIMCONT_SHAPEKEY)) { switch (ale->type) { case ANIMTYPE_SUMMARY: { @@ -307,17 +307,6 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar) if (ac->datatype == ANIMCONT_ACTION) glRectf(act_start, (float)y-ACHANNEL_HEIGHT_HALF, act_end, (float)y+ACHANNEL_HEIGHT_HALF); } - else if (ac->datatype == ANIMCONT_SHAPEKEY) { - /* all frames that have a frame number less than one - * get a desaturated orange background - */ - glColor4ub(col2[0], col2[1], col2[2], 0x22); - glRectf(0.0f, (float)y-ACHANNEL_HEIGHT_HALF, 1.0f, (float)y+ACHANNEL_HEIGHT_HALF); - - /* frames one and higher get a saturated orange background */ - glColor4ub(col2[0], col2[1], col2[2], 0x44); - glRectf(1.0f, (float)y-ACHANNEL_HEIGHT_HALF, v2d->cur.xmax+EXTRA_SCROLL_PAD, (float)y+ACHANNEL_HEIGHT_HALF); - } else if (ac->datatype == ANIMCONT_GPENCIL) { /* frames less than one get less saturated background */ if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22); diff --git a/source/blender/editors/space_action/action_header.c b/source/blender/editors/space_action/action_header.c index ba5fc0893ec..aaf4b51c75e 100644 --- a/source/blender/editors/space_action/action_header.c +++ b/source/blender/editors/space_action/action_header.c @@ -69,6 +69,7 @@ enum { B_REDR= 1, + B_MODECHANGE, } eActHeader_Events; /* ********************************************************* */ @@ -254,6 +255,15 @@ static void act_editmenu(bContext *C, uiLayout *layout, void *arg_unused) static void do_action_buttons(bContext *C, void *arg, int event) { + /* special exception for mode changing - enable custom settings? */ + if (event == B_MODECHANGE) { + SpaceAction *saction= CTX_wm_space_action(C); + + /* if the new mode is ShapeKeys editor, enable sliders */ + if (saction->mode == SACTCONT_SHAPEKEY) + saction->flag |= SACTION_SLIDERS; + } + ED_area_tag_refresh(CTX_wm_area(C)); ED_area_tag_redraw(CTX_wm_area(C)); } @@ -318,7 +328,7 @@ void action_header_buttons(const bContext *C, ARegion *ar) uiBlockSetEmboss(block, UI_EMBOSS); /* MODE SELECTOR */ - uiDefButC(block, MENU, B_REDR, + uiDefButC(block, MENU, B_MODECHANGE, "Editor Mode %t|DopeSheet %x3|Action Editor %x0|ShapeKey Editor %x1|Grease Pencil %x2", xco,yco,90,YIC, &saction->mode, 0, 1, 0, 0, "Editing modes for this editor"); diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 8dc71710d82..a7a35c281fd 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -284,15 +284,8 @@ static void animedit_refresh_id_tags (Scene *scene, ID *id) if (adt) adt->recalc |= ADT_RECALC_ANIM; - /* if ID-block is Object, set recalc flags */ - switch (GS(id->name)) { - case ID_OB: - { - Object *ob= (Object *)id; - DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */ - } - break; - } + /* set recalc flags */ + DAG_id_flush_update(id, OB_RECALC); // XXX or do we want something more restrictive? } }