Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / animation / anim_filter.c
index e18560b95aff10e238940239f72f92ad566856f2..90830223077d259e3c0b6d147c3efe3848863b16 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;
+       SceneLayer *sl = ac->scene_layer;
        Object *ob;
        Key *key;
        
-       ob = OBACT;
+       ob = OBACT_NEW(sl);
        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->scene_layer = CTX_data_scene_layer(C);
+       ac->obact = (ac->scene_layer->basact) ? ac->scene_layer->basact->object : NULL;
        ac->sa = sa;
        ac->ar = ar;
        ac->sl = sl;
@@ -1683,15 +1686,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;
+               SceneLayer *sl = (SceneLayer *)ac->scene_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 = sl->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;
@@ -1707,14 +1711,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;
                                }
@@ -2631,7 +2635,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);
@@ -2855,7 +2859,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;
        
@@ -2873,7 +2877,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 */
@@ -2908,7 +2912,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;
        }
@@ -2936,15 +2940,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, SceneLayer *sl, 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(&sl->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 = sl->object_bases.first; base; base = base->next) {
+               if (animdata_filter_base_is_ok(ads, base, filter_mode)) {
                        sorted_bases[num_bases++] = base;
                }
        }
@@ -2962,8 +2966,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;
+       SceneLayer *sl = (SceneLayer *)ac->scene_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");
@@ -3000,14 +3005,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))
+           (sl->object_bases.first != sl->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, sl, filter_mode, &num_bases);
                if (sorted_bases) {
                        /* Add the necessary channels for these bases... */
                        for (size_t i = 0; i < num_bases; i++) {
@@ -3024,8 +3029,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 = sl->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);
                        }