merge from master
[blender.git] / source / blender / editors / animation / anim_filter.c
index aa31458aa5bc325769eb7a31c97389bd77cd60bc..85bcfb603cdb23272d687883a0ca89553023b571 100644 (file)
@@ -74,6 +74,7 @@
 #include "DNA_gpencil_types.h"
 #include "DNA_object_types.h"
 #include "DNA_userdef_types.h"
+#include "DNA_layer_types.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -90,6 +91,7 @@
 #include "BKE_global.h"
 #include "BKE_group.h"
 #include "BKE_key.h"
+#include "BKE_layer.h"
 #include "BKE_main.h"
 #include "BKE_material.h"
 #include "BKE_modifier.h"
@@ -130,11 +132,11 @@ static void animedit_get_yscale_factor(bAnimContext *ac)
 /* Note: there's a similar function in key.c (BKE_key_from_object) */
 static Key *actedit_get_shapekeys(bAnimContext *ac)
 {
-       Scene *scene = ac->scene;
+       ViewLayer *view_layer = ac->view_layer;
        Object *ob;
        Key *key;
        
-       ob = OBACT;
+       ob = OBACT(view_layer);
        if (ob == NULL) 
                return NULL;
        
@@ -378,8 +380,9 @@ bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
        ac->scene = scene;
        if (scene) {
                ac->markers = ED_context_get_markers(C);
-               ac->obact = (scene->basact) ?  scene->basact->object : NULL;
        }
+       ac->view_layer = CTX_data_view_layer(C);
+       ac->obact = (ac->view_layer->basact) ? ac->view_layer->basact->object : NULL;
        ac->sa = sa;
        ac->ar = ar;
        ac->sl = sl;
@@ -1671,15 +1674,16 @@ static size_t animdata_filter_gpencil(bAnimContext *ac, ListBase *anim_data, voi
        
        if (ads->filterflag & ADS_FILTER_GP_3DONLY) {
                Scene *scene = (Scene *)ads->source;
+               ViewLayer *view_layer = (ViewLayer *)ac->view_layer;
                Base *base;
-               
+
                /* Active scene's GPencil block first - No parent item needed... */
                if (scene->gpd) {
                        items += animdata_filter_gpencil_data(anim_data, ads, scene->gpd, filter_mode);
                }
                
                /* Objects in the scene */
-               for (base = scene->base.first; base; base = base->next) {
+               for (base = view_layer->object_bases.first; base; base = base->next) {
                        /* Only consider this object if it has got some GP data (saving on all the other tests) */
                        if (base->object && base->object->gpd) {
                                Object *ob = base->object;
@@ -1695,14 +1699,14 @@ static size_t animdata_filter_gpencil(bAnimContext *ac, ListBase *anim_data, voi
                                 */
                                if ((filter_mode & ANIMFILTER_DATA_VISIBLE) && !(ads->filterflag & ADS_FILTER_INCL_HIDDEN)) {
                                        /* layer visibility - we check both object and base, since these may not be in sync yet */
-                                       if ((scene->lay & (ob->lay | base->lay)) == 0) continue;
+                                       if ((base->flag & BASE_VISIBLED) == 0) continue;
                                        
                                        /* outliner restrict-flag */
                                        if (ob->restrictflag & OB_RESTRICT_VIEW) continue;
                                }
                                
                                /* check selection and object type filters */
-                               if ( (ads->filterflag & ADS_FILTER_ONLYSEL) && !((base->flag & SELECT) /*|| (base == scene->basact)*/) ) {
+                               if ( (ads->filterflag & ADS_FILTER_ONLYSEL) && !((base->flag & BASE_SELECTED) /*|| (base == scene->basact)*/) ) {
                                        /* only selected should be shown */
                                        continue;
                                }
@@ -1942,25 +1946,26 @@ static size_t animdata_filter_ds_nodetree(bAnimContext *ac, ListBase *anim_data,
 
 static size_t animdata_filter_ds_linestyle(bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, Scene *sce, int filter_mode)
 {
-       SceneRenderLayer *srl;
+       ViewLayer *view_layer;
        FreestyleLineSet *lineset;
        size_t items = 0;
        
-       for (srl = sce->r.layers.first; srl; srl = srl->next) {
-               for (lineset = srl->freestyleConfig.linesets.first; lineset; lineset = lineset->next) {
+       for (view_layer = sce->view_layers.first; view_layer; view_layer = view_layer->next) {
+               for (lineset = view_layer->freestyle_config.linesets.first; lineset; lineset = lineset->next) {
                        if (lineset->linestyle) {
                                lineset->linestyle->id.tag |= LIB_TAG_DOIT;
                        }
                }
        }
        
-       for (srl = sce->r.layers.first; srl; srl = srl->next) {
+       for (view_layer = sce->view_layers.first; view_layer; view_layer = view_layer->next) {
                /* skip render layers without Freestyle enabled */
-               if (!(srl->layflag & SCE_LAY_FRS))
+               if ((view_layer->flag & VIEW_LAYER_FREESTYLE) == 0) {
                        continue;
-               
+               }
+
                /* loop over linesets defined in the render layer */
-               for (lineset = srl->freestyleConfig.linesets.first; lineset; lineset = lineset->next) {
+               for (lineset = view_layer->freestyle_config.linesets.first; lineset; lineset = lineset->next) {
                        FreestyleLineStyle *linestyle = lineset->linestyle;
                        ListBase tmp_data = {NULL, NULL};
                        size_t tmp_items = 0;
@@ -2619,7 +2624,7 @@ static size_t animdata_filter_dopesheet_ob(bAnimContext *ac, ListBase *anim_data
                if (filter_mode & ANIMFILTER_LIST_CHANNELS) {
                        /* check if filtering by selection */
                        // XXX: double-check on this - most of the time, a lot of tools need to filter out these channels!
-                       if (ANIMCHANNEL_SELOK((base->flag & SELECT))) {
+                       if (ANIMCHANNEL_SELOK((base->flag & BASE_SELECTED))) {
                                /* check if filtering by active status */
                                if (ANIMCHANNEL_ACTIVEOK(ob)) {
                                        ANIMCHANNEL_NEW_CHANNEL(base, ANIMTYPE_OBJECT, ob);
@@ -2843,7 +2848,7 @@ static size_t animdata_filter_dopesheet_movieclips(bAnimContext *ac, ListBase *a
 }
 
 /* Helper for animdata_filter_dopesheet() - For checking if an object should be included or not */
-static bool animdata_filter_base_is_ok(bDopeSheet *ads, Scene *scene, Base *base, int filter_mode)
+static bool animdata_filter_base_is_ok(bDopeSheet *ads, Base *base, int filter_mode)
 {
        Object *ob = base->object;
        
@@ -2861,7 +2866,7 @@ static bool animdata_filter_base_is_ok(bDopeSheet *ads, Scene *scene, Base *base
         */
        if ((filter_mode & ANIMFILTER_DATA_VISIBLE) && !(ads->filterflag & ADS_FILTER_INCL_HIDDEN)) {
                /* layer visibility - we check both object and base, since these may not be in sync yet */
-               if ((scene->lay & (ob->lay | base->lay)) == 0)
+               if ((base->flag & BASE_VISIBLED) == 0)
                        return false;
                
                /* outliner restrict-flag */
@@ -2896,7 +2901,7 @@ static bool animdata_filter_base_is_ok(bDopeSheet *ads, Scene *scene, Base *base
        }
 
        /* check selection and object type filters */
-       if ((ads->filterflag & ADS_FILTER_ONLYSEL) && !((base->flag & SELECT) /*|| (base == sce->basact)*/)) {
+       if ((ads->filterflag & ADS_FILTER_ONLYSEL) && !((base->flag & BASE_SELECTED) /*|| (base == sce->basact)*/)) {
                /* only selected should be shown */
                return false;
        }
@@ -2924,15 +2929,15 @@ static int ds_base_sorting_cmp(const void *base1_ptr, const void *base2_ptr)
 }
 
 /* Get a sorted list of all the bases - for inclusion in dopesheet (when drawing channels) */
-static Base **animdata_filter_ds_sorted_bases(bDopeSheet *ads, Scene *scene, int filter_mode, size_t *r_usable_bases)
+static Base **animdata_filter_ds_sorted_bases(bDopeSheet *ads, ViewLayer *view_layer, int filter_mode, size_t *r_usable_bases)
 {
        /* Create an array with space for all the bases, but only containing the usable ones */
-       size_t tot_bases = BLI_listbase_count(&scene->base);
+       size_t tot_bases = BLI_listbase_count(&view_layer->object_bases);
        size_t num_bases = 0;
        
        Base **sorted_bases = MEM_mallocN(sizeof(Base *) * tot_bases, "Dopesheet Usable Sorted Bases");
-       for (Base *base = scene->base.first; base; base = base->next) {
-               if (animdata_filter_base_is_ok(ads, scene, base, filter_mode)) {
+       for (Base *base = view_layer->object_bases.first; base; base = base->next) {
+               if (animdata_filter_base_is_ok(ads, base, filter_mode)) {
                        sorted_bases[num_bases++] = base;
                }
        }
@@ -2950,8 +2955,9 @@ static Base **animdata_filter_ds_sorted_bases(bDopeSheet *ads, Scene *scene, int
 static size_t animdata_filter_dopesheet(bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, int filter_mode)
 {
        Scene *scene = (Scene *)ads->source;
+       ViewLayer *view_layer = (ViewLayer *)ac->view_layer;
        size_t items = 0;
-       
+
        /* check that we do indeed have a scene */
        if ((ads->source == NULL) || (GS(ads->source->name) != ID_SCE)) {
                printf("Dope Sheet Error: No scene!\n");
@@ -2988,14 +2994,14 @@ static size_t animdata_filter_dopesheet(bAnimContext *ac, ListBase *anim_data, b
         *  - Don't do this if there's just a single object
         */
        if ((filter_mode & ANIMFILTER_LIST_CHANNELS) && !(ads->flag & ADS_FLAG_NO_DB_SORT) &&
-           (scene->base.first != scene->base.last))
+           (view_layer->object_bases.first != view_layer->object_bases.last))
        {
                /* Filter list of bases (i.e. objects), sort them, then add their contents normally... */
                // TODO: Cache the old sorted order - if the set of bases hasn't changed, don't re-sort...
                Base **sorted_bases;
                size_t num_bases;
                
-               sorted_bases = animdata_filter_ds_sorted_bases(ads, scene, filter_mode, &num_bases);
+               sorted_bases = animdata_filter_ds_sorted_bases(ads, view_layer, filter_mode, &num_bases);
                if (sorted_bases) {
                        /* Add the necessary channels for these bases... */
                        for (size_t i = 0; i < num_bases; i++) {
@@ -3012,8 +3018,8 @@ static size_t animdata_filter_dopesheet(bAnimContext *ac, ListBase *anim_data, b
                /* Filter and add contents of each base (i.e. object) without them sorting first
                 * NOTE: This saves performance in cases where order doesn't matter
                 */
-               for (Base *base = scene->base.first; base; base = base->next) {
-                       if (animdata_filter_base_is_ok(ads, scene, base, filter_mode)) {
+               for (Base *base = view_layer->object_bases.first; base; base = base->next) {
+                       if (animdata_filter_base_is_ok(ads, base, filter_mode)) {
                                /* since we're still here, this object should be usable */
                                items += animdata_filter_dopesheet_ob(ac, anim_data, ads, base, filter_mode);
                        }