Curve pinning: Allow pinning object data without animated object
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 28 Sep 2016 13:18:15 +0000 (15:18 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 28 Sep 2016 13:25:05 +0000 (15:25 +0200)
Special case, so now we can pin tricky cases like animated camera DOF
without requiring to have animation on the object level.

source/blender/editors/animation/anim_channels_defines.c
source/blender/editors/animation/anim_filter.c

index 93a602b463dabfe4a5ba3702be3a562f2221bbcd..5e131435a7a1cd8504555f9aaa85ce66ad743ab8 100644 (file)
@@ -390,7 +390,10 @@ static bool acf_generic_dataexpand_setting_valid(bAnimContext *ac, bAnimListElem
                /* select is ok for most "ds*" channels (e.g. dsmat) */
                case ACHANNEL_SETTING_SELECT:
                        return true;
-                       
+
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
+                       return true;
+
                /* other flags are never supported */
                default:
                        return false;
@@ -1704,7 +1707,10 @@ static int acf_dscam_setting_flag(bAnimContext *UNUSED(ac), eAnimChannel_Setting
                        
                case ACHANNEL_SETTING_SELECT: /* selected */
                        return ADT_UI_SELECTED;
-               
+
+               case ACHANNEL_SETTING_ALWAYS_VISIBLE:
+                       return ADT_CURVES_ALWAYS_VISIBLE;
+
                default: /* unsupported */
                        return 0;
        }
@@ -1725,6 +1731,7 @@ static void *acf_dscam_setting_ptr(bAnimListElem *ale, eAnimChannel_Settings set
                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:
                        if (ca->adt)
                                return GET_ACF_FLAG_PTR(ca->adt->flag, type);
                        return NULL;
index 87c73810e6342d7ccf25d942fbb42df7be70e185..7893f26a62ac47cd3f07a6ac8f5d75cdadbb4e70 100644 (file)
@@ -2834,6 +2834,19 @@ static bool animdata_filter_base_is_ok(bDopeSheet *ads, Scene *scene, Base *base
                return true;
        }
 
+       /* Special case.
+        * We don't do recursive checks for pin, but we need to deal with tricky
+        * setup like animated camera lens without animated camera location.
+        * Without such special handle here we wouldn't be able to bin such
+        * camera data only animation to the editor.
+        */
+       if (ob->adt == NULL && ob->data != NULL) {
+               AnimData *data_adt = BKE_animdata_from_id(ob->data);
+               if (data_adt != NULL && (data_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 */