From ab9f03555c1a79bfdf4ecc17b2f2ce3cbd84994b Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Fri, 4 Jul 2025 10:11:34 +0200 Subject: [PATCH] Fix #141384: Anim Channel Pinning: object data pin only for cameras As mentioned in 98c7e75897, the idea of "pinning" was to have certain animation always visible (regardless of object selection -- e.g. animating camera movement even while animating something else). dea7ef4dd9 added a special case that would also include the object regardless of it being selected or not if its **object data** is animated and pinned. It only fully implemented that for Cameras though (that was the primary request at that time), leaving ugly blank/empty space (pin icon missing) for other object data types. It is understandable that it only did it for Cameras a that time, but there is no reason to **not** do it for other (viewport selectable) object data types as well (animators might as well be interested in pinning other types as well for timing reference) -- which is what this PR does. Adding this to 4.5 (since it fixes the blank space (even though it is somewhat adding a feature as well...) Pull Request: https://projects.blender.org/blender/blender/pulls/141396 --- .../animation/anim_channels_defines.cc | 112 ++++++++++++------ 1 file changed, 74 insertions(+), 38 deletions(-) diff --git a/source/blender/editors/animation/anim_channels_defines.cc b/source/blender/editors/animation/anim_channels_defines.cc index afcf91f3d98..481b5ce0784 100644 --- a/source/blender/editors/animation/anim_channels_defines.cc +++ b/source/blender/editors/animation/anim_channels_defines.cc @@ -755,7 +755,7 @@ static int acf_object_setting_flag(bAnimContext * /*ac*/, *r_neg = true; return ADT_CURVES_NOT_VISIBLE; - case ACHANNEL_SETTING_ALWAYS_VISIBLE: + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ return ADT_CURVES_ALWAYS_VISIBLE; default: /* unsupported */ @@ -781,9 +781,9 @@ static void *acf_object_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(ob->nlaflag, r_type); /* XXX */ - case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ - case ACHANNEL_SETTING_ALWAYS_VISIBLE: + case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (ob->adt) { return GET_ACF_FLAG_PTR(ob->adt->flag, r_type); } @@ -887,7 +887,7 @@ static bool acf_group_setting_valid(bAnimContext *ac, case ACHANNEL_SETTING_VISIBLE: /* Only available in Graph Editor */ return (ac->spacetype == SPACE_GRAPH); - case ACHANNEL_SETTING_ALWAYS_VISIBLE: + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ return ELEM(ac->spacetype, SPACE_ACTION, SPACE_GRAPH); default: /* always supported */ @@ -929,7 +929,7 @@ static int acf_group_setting_flag(bAnimContext *ac, eAnimChannel_Settings settin *r_neg = true; return AGRP_NOTVISIBLE; - case ACHANNEL_SETTING_ALWAYS_VISIBLE: + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ return ADT_CURVES_ALWAYS_VISIBLE; default: @@ -1812,6 +1812,9 @@ static int acf_dslight_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -1831,9 +1834,10 @@ static void *acf_dslight_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(la->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (la->adt) { return GET_ACF_FLAG_PTR(la->adt->flag, r_type); } @@ -2072,7 +2076,7 @@ static int acf_dscam_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; - case ACHANNEL_SETTING_ALWAYS_VISIBLE: + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ return ADT_CURVES_ALWAYS_VISIBLE; default: /* unsupported */ @@ -2094,10 +2098,10 @@ static void *acf_dscam_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(ca->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ - case ACHANNEL_SETTING_ALWAYS_VISIBLE: + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (ca->adt) { return GET_ACF_FLAG_PTR(ca->adt->flag, r_type); } @@ -2167,6 +2171,9 @@ static int acf_dscur_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -2186,9 +2193,10 @@ static void *acf_dscur_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(cu->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (cu->adt) { return GET_ACF_FLAG_PTR(cu->adt->flag, r_type); } @@ -2518,6 +2526,9 @@ static int acf_dsmball_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -2537,9 +2548,10 @@ static void *acf_dsmball_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(mb->flag2, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (mb->adt) { return GET_ACF_FLAG_PTR(mb->adt->flag, r_type); } @@ -2601,6 +2613,9 @@ static int acf_dsarm_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -2620,9 +2635,10 @@ static void *acf_dsarm_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(arm->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (arm->adt) { return GET_ACF_FLAG_PTR(arm->adt->flag, r_type); } @@ -2861,6 +2877,9 @@ static int acf_dsmesh_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -2880,9 +2899,10 @@ static void *acf_dsmesh_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(mesh->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (mesh->adt) { return GET_ACF_FLAG_PTR(mesh->adt->flag, r_type); } @@ -2945,6 +2965,9 @@ static int acf_dslat_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -2964,9 +2987,10 @@ static void *acf_dslat_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(lt->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (lt->adt) { return GET_ACF_FLAG_PTR(lt->adt->flag, r_type); } @@ -3112,6 +3136,9 @@ static int acf_dscurves_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -3131,9 +3158,10 @@ static void *acf_dscurves_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(curves->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (curves->adt) { return GET_ACF_FLAG_PTR(curves->adt->flag, r_type); } @@ -3195,6 +3223,9 @@ static int acf_dspointcloud_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -3214,9 +3245,10 @@ static void *acf_dspointcloud_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(pointcloud->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (pointcloud->adt) { return GET_ACF_FLAG_PTR(pointcloud->adt->flag, r_type); } @@ -3278,6 +3310,9 @@ static int acf_dsvolume_setting_flag(bAnimContext * /*ac*/, case ACHANNEL_SETTING_SELECT: /* selected */ return ADT_UI_SELECTED; + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ + return ADT_CURVES_ALWAYS_VISIBLE; + default: /* unsupported */ return 0; } @@ -3297,9 +3332,10 @@ static void *acf_dsvolume_setting_ptr(bAnimListElem *ale, case ACHANNEL_SETTING_EXPAND: /* expanded */ return GET_ACF_FLAG_PTR(volume->flag, r_type); - case ACHANNEL_SETTING_SELECT: /* selected */ - case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ - case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_SELECT: /* selected */ + case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */ + case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */ + case ACHANNEL_SETTING_ALWAYS_VISIBLE: /* pin */ if (volume->adt) { return GET_ACF_FLAG_PTR(volume->adt->flag, r_type); }