Commit: 98c7e7589754500eb4a24825f71e46dd77e29983
Author: Sergey Sharybin
Date:   Mon Sep 12 15:31:28 2016 +0200
Branches: master
https://developer.blender.org/rB98c7e7589754500eb4a24825f71e46dd77e29983

Graph editor: Add channel option to make it persistent on display

The idea is to allow certain animation channels to be always visible in
animation editors. So, for example, one can pin Camera animation to the
editor so it is always possible to refine/tweak camera animation when
animating something else in the scene.

There is probably some more polishing required, and some current
limitations could be solved in the future but should be a good starting
point already.

Currently only works for object without recursing into deeper datablock
(so for example, it's not possible to pin object material animation).

Studio request by Colin Levy.

===================================================================

M       source/blender/editors/animation/anim_channels_defines.c
M       source/blender/editors/animation/anim_channels_edit.c
M       source/blender/editors/animation/anim_filter.c
M       source/blender/editors/include/ED_anim_api.h
M       source/blender/makesdna/DNA_anim_types.h

===================================================================

diff --git a/source/blender/editors/animation/anim_channels_defines.c 
b/source/blender/editors/animation/anim_channels_defines.c
index d727ea0..be92b03 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -529,7 +529,10 @@ static bool acf_scene_setting_valid(bAnimContext *ac, 
bAnimListElem *UNUSED(ale)
                case ACHANNEL_SETTING_SELECT:
                case ACHANNEL_SETTING_EXPAND:
                        return true;
-                       
+
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
+                       return false;
+
                default:
                        return false;
        }
@@ -555,7 +558,7 @@ static int acf_scene_setting_flag(bAnimContext *UNUSED(ac), 
eAnimChannel_Setting
                case ACHANNEL_SETTING_VISIBLE: /* visible (only in Graph 
Editor) */
                        *neg = true;
                        return ADT_CURVES_NOT_VISIBLE;
-                       
+
                default: /* unsupported */
                        return 0;
        }
@@ -682,7 +685,10 @@ static bool acf_object_setting_valid(bAnimContext *ac, 
bAnimListElem *ale, eAnim
                case ACHANNEL_SETTING_SELECT:
                case ACHANNEL_SETTING_EXPAND:
                        return true;
-                       
+
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
+                       return ((ac) && (ac->spacetype == SPACE_IPO) && 
(ob->adt));
+
                default:
                        return false;
        }
@@ -708,7 +714,10 @@ static int acf_object_setting_flag(bAnimContext 
*UNUSED(ac), eAnimChannel_Settin
                case ACHANNEL_SETTING_VISIBLE: /* visible (only in Graph 
Editor) */
                        *neg = true;
                        return ADT_CURVES_NOT_VISIBLE;
-                       
+
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
+                       return ADT_CURVES_ALWAYS_VISIBLE;
+
                default: /* unsupported */
                        return 0;
        }
@@ -732,6 +741,7 @@ static void *acf_object_setting_ptr(bAnimListElem *ale, 
eAnimChannel_Settings se
                        
                case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */
                case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor 
only) */
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
                        if (ob->adt)
                                return GET_ACF_FLAG_PTR(ob->adt->flag, type);
                        return NULL;
@@ -839,7 +849,10 @@ static bool acf_group_setting_valid(bAnimContext *ac, 
bAnimListElem *UNUSED(ale)
                /* conditionally supported */
                case ACHANNEL_SETTING_VISIBLE: /* Only available in Graph 
Editor */
                        return (ac->spacetype == SPACE_IPO);
-                       
+
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
+                       return false;
+
                default: /* always supported */
                        return true;
        }
@@ -965,7 +978,10 @@ static bool acf_fcurve_setting_valid(bAnimContext *ac, 
bAnimListElem *ale, eAnim
                                
                case ACHANNEL_SETTING_VISIBLE: /* Only available in Graph 
Editor */
                        return (ac->spacetype == SPACE_IPO);
-                       
+
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
+                       return false;
+
                /* always available */
                default:
                        return true;
@@ -3749,7 +3765,9 @@ void ANIM_channel_draw(bAnimContext *ac, bAnimListElem 
*ale, float yminc, float
         *      - in Grease Pencil mode, color swatches for layer color
         */
        if (ac->sl) {
-               if ((ac->spacetype == SPACE_IPO) && acf->has_setting(ac, ale, 
ACHANNEL_SETTING_VISIBLE)) {
+               if ((ac->spacetype == SPACE_IPO) &&
+                   (acf->has_setting(ac, ale, ACHANNEL_SETTING_VISIBLE) ||
+                    acf->has_setting(ac, ale, 
ACHANNEL_SETTING_ALWAYS_VISIBLE))) {
                        /* for F-Curves, draw color-preview of curve behind 
checkbox */
                        if (ELEM(ale->type, ANIMTYPE_FCURVE, 
ANIMTYPE_NLACURVE)) {
                                FCurve *fcu = (FCurve *)ale->data;
@@ -3763,9 +3781,13 @@ void ANIM_channel_draw(bAnimContext *ac, bAnimListElem 
*ale, float yminc, float
                                 */
                                glRectf(offset, yminc, offset + ICON_WIDTH, 
ymaxc);
                        }
-                       
                        /* icon is drawn as widget now... */
-                       offset += ICON_WIDTH; 
+                       if (acf->has_setting(ac, ale, 
ACHANNEL_SETTING_VISIBLE)) {
+                               offset += ICON_WIDTH;
+                       }
+                       if (acf->has_setting(ac, ale, 
ACHANNEL_SETTING_ALWAYS_VISIBLE)) {
+                               offset += ICON_WIDTH;
+                       }
                }
                else if ((ac->spacetype == SPACE_NLA) && acf->has_setting(ac, 
ale, ACHANNEL_SETTING_SOLO)) {
                        /* just skip - drawn as widget now */
@@ -4110,6 +4132,11 @@ static void draw_setting_widget(bAnimContext *ac, 
bAnimListElem *ale, const bAni
                                tooltip = TIP_("Channels are visible in Graph 
Editor for editing");
                        break;
 
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
+                       icon = ICON_UNPINNED;
+                       tooltip = TIP_("Channels are visible in Graph Editor 
for editing");
+                       break;
+
                case ACHANNEL_SETTING_MOD_OFF:  /* modifiers disabled */
                        icon = ICON_MODIFIER;
                        usetoggle = false;
@@ -4219,6 +4246,7 @@ static void draw_setting_widget(bAnimContext *ac, 
bAnimListElem *ale, const bAni
                                case ACHANNEL_SETTING_MUTE: /* General - muting 
flags */
                                case ACHANNEL_SETTING_PINNED: /* NLA Actions - 
'map/nomap' */
                                case ACHANNEL_SETTING_MOD_OFF:
+                               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
                                        UI_but_funcN_set(but, 
achannel_setting_flush_widget_cb, MEM_dupallocN(ale), 
SET_INT_IN_POINTER(setting));
                                        break;
                                        
@@ -4282,10 +4310,20 @@ void ANIM_channel_draw_widgets(const bContext *C, 
bAnimContext *ac, bAnimListEle
         *      - in Grease Pencil mode, color swatches for layer color
         */
        if (ac->sl) {
-               if ((ac->spacetype == SPACE_IPO) && acf->has_setting(ac, ale, 
ACHANNEL_SETTING_VISIBLE)) {
+               if ((ac->spacetype == SPACE_IPO) &&
+                   (acf->has_setting(ac, ale, ACHANNEL_SETTING_VISIBLE) ||
+                    acf->has_setting(ac, ale, 
ACHANNEL_SETTING_ALWAYS_VISIBLE)))
+               {
+                       /* pin toggle  */
+                       if (acf->has_setting(ac, ale, 
ACHANNEL_SETTING_ALWAYS_VISIBLE)) {
+                               draw_setting_widget(ac, ale, acf, block, 
offset, ymid, ACHANNEL_SETTING_ALWAYS_VISIBLE);
+                               offset += ICON_WIDTH;
+                       }
                        /* visibility toggle  */
-                       draw_setting_widget(ac, ale, acf, block, offset, ymid, 
ACHANNEL_SETTING_VISIBLE);
-                       offset += ICON_WIDTH; 
+                       if (acf->has_setting(ac, ale, 
ACHANNEL_SETTING_VISIBLE)) {
+                               draw_setting_widget(ac, ale, acf, block, 
offset, ymid, ACHANNEL_SETTING_VISIBLE);
+                               offset += ICON_WIDTH;
+                       }
                }
                else if ((ac->spacetype == SPACE_NLA) && acf->has_setting(ac, 
ale, ACHANNEL_SETTING_SOLO)) {
                        /* 'solo' setting for NLA Tracks */
diff --git a/source/blender/editors/animation/anim_channels_edit.c 
b/source/blender/editors/animation/anim_channels_edit.c
index cb65a9a..4cbdf77 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -435,7 +435,11 @@ void ANIM_flush_setting_anim_channels(bAnimContext *ac, 
ListBase *anim_data, bAn
        /* sanity check */
        if (ELEM(NULL, anim_data, anim_data->first))
                return;
-       
+
+       if (setting == ACHANNEL_SETTING_ALWAYS_VISIBLE) {
+               return;
+       }
+
        /* find the channel that got changed */
        for (ale = anim_data->first; ale; ale = ale->next) {
                /* compare data, and type as main way of identifying the 
channel */
diff --git a/source/blender/editors/animation/anim_filter.c 
b/source/blender/editors/animation/anim_filter.c
index 5cd305f..ca207a7 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -2825,7 +2825,12 @@ static bool animdata_filter_base_is_ok(bDopeSheet *ads, 
Scene *scene, Base *base
                if ((ob->adt) && (ob->adt->flag & ADT_CURVES_NOT_VISIBLE))
                        return false;
        }
-       
+
+       /* Pinned curves are visible regardless of selection flags. */
+       if ((ob->adt) && (ob->adt->flag & ADT_CURVES_ALWAYS_VISIBLE)) {
+               //return true;
+       }
+
        /* check selection and object type filters */
        if ((ads->filterflag & ADS_FILTER_ONLYSEL) && !((base->flag & SELECT) 
/*|| (base == sce->basact)*/)) {
                /* only selected should be shown */
diff --git a/source/blender/editors/include/ED_anim_api.h 
b/source/blender/editors/include/ED_anim_api.h
index bfd89e9..b761139 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -417,7 +417,8 @@ typedef enum eAnimChannel_Settings {
        ACHANNEL_SETTING_VISIBLE  = 4,  /* only for Graph Editor */
        ACHANNEL_SETTING_SOLO     = 5,  /* only for NLA Tracks */
        ACHANNEL_SETTING_PINNED   = 6,  /* only for NLA Actions */
-       ACHANNEL_SETTING_MOD_OFF  = 7
+       ACHANNEL_SETTING_MOD_OFF  = 7,
+       ACHANNEL_SETTING_ALWAYS_VISIBLE = 8,  /* channel is pinned and always 
visible */
 } eAnimChannel_Settings;
 
 
diff --git a/source/blender/makesdna/DNA_anim_types.h 
b/source/blender/makesdna/DNA_anim_types.h
index 31fe8fe..e50a263 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -939,7 +939,10 @@ typedef enum eAnimData_Flag {
        ADT_UI_ACTIVE           = (1<<15),
 
                /* F-Curves from this AnimData block are not visible in the 
Graph Editor */
-       ADT_CURVES_NOT_VISIBLE  = (1<<16)
+       ADT_CURVES_NOT_VISIBLE  = (1<<16),
+
+               /* F-Curves from this AnimData block are always visible */
+       ADT_CURVES_ALWAYS_VISIBLE = (1<<17),
 } eAnimData_Flag;
 
 /* Animation Data recalculation settings (to be set by depsgraph) */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to