diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/blenkernel/intern/layer.c | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/blenkernel/intern/layer.c')
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 1805 |
1 files changed, 918 insertions, 887 deletions
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 95c8f9b7ee2..133deb13836 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -56,92 +56,89 @@ #include "MEM_guardedalloc.h" /* Set of flags which are dependent on a collection settings. */ -static const short g_base_collection_flags = ( - BASE_VISIBLE | - BASE_SELECTABLE | - BASE_ENABLED_VIEWPORT | - BASE_ENABLED_RENDER | - BASE_HOLDOUT | - BASE_INDIRECT_ONLY); +static const short g_base_collection_flags = (BASE_VISIBLE | BASE_SELECTABLE | + BASE_ENABLED_VIEWPORT | BASE_ENABLED_RENDER | + BASE_HOLDOUT | BASE_INDIRECT_ONLY); /* prototype */ static void object_bases_iterator_next(BLI_Iterator *iter, const int flag); - /*********************** Layer Collections and bases *************************/ static LayerCollection *layer_collection_add(ListBase *lb_parent, Collection *collection) { - LayerCollection *lc = MEM_callocN(sizeof(LayerCollection), "Collection Base"); - lc->collection = collection; - BLI_addtail(lb_parent, lc); + LayerCollection *lc = MEM_callocN(sizeof(LayerCollection), "Collection Base"); + lc->collection = collection; + BLI_addtail(lb_parent, lc); - return lc; + return lc; } static void layer_collection_free(ViewLayer *view_layer, LayerCollection *lc) { - if (lc == view_layer->active_collection) { - view_layer->active_collection = NULL; - } + if (lc == view_layer->active_collection) { + view_layer->active_collection = NULL; + } - for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) { - layer_collection_free(view_layer, nlc); - } + for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) { + layer_collection_free(view_layer, nlc); + } - BLI_freelistN(&lc->layer_collections); + BLI_freelistN(&lc->layer_collections); } static Base *object_base_new(Object *ob) { - Base *base = MEM_callocN(sizeof(Base), "Object Base"); - base->object = ob; - BKE_scene_object_base_flag_sync_from_object(base); - return base; + Base *base = MEM_callocN(sizeof(Base), "Object Base"); + base->object = ob; + BKE_scene_object_base_flag_sync_from_object(base); + return base; } /********************************* View Layer ********************************/ - /* RenderLayer */ /* Returns the default view layer to view in workspaces if there is * none linked to the workspace yet. */ ViewLayer *BKE_view_layer_default_view(const Scene *scene) { - for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - if (!(view_layer->flag & VIEW_LAYER_RENDER)) { - return view_layer; - } - } + for (ViewLayer *view_layer = scene->view_layers.first; view_layer; + view_layer = view_layer->next) { + if (!(view_layer->flag & VIEW_LAYER_RENDER)) { + return view_layer; + } + } - BLI_assert(scene->view_layers.first); - return scene->view_layers.first; + BLI_assert(scene->view_layers.first); + return scene->view_layers.first; } /* Returns the default view layer to render if we need to render just one. */ ViewLayer *BKE_view_layer_default_render(const Scene *scene) { - for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - if (view_layer->flag & VIEW_LAYER_RENDER) { - return view_layer; - } - } + for (ViewLayer *view_layer = scene->view_layers.first; view_layer; + view_layer = view_layer->next) { + if (view_layer->flag & VIEW_LAYER_RENDER) { + return view_layer; + } + } - BLI_assert(scene->view_layers.first); - return scene->view_layers.first; + BLI_assert(scene->view_layers.first); + return scene->view_layers.first; } /* Returns view layer with matching name, or NULL if not found. */ ViewLayer *BKE_view_layer_find(const Scene *scene, const char *layer_name) { - for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - if (STREQ(view_layer->name, layer_name)) { - return view_layer; - } - } + for (ViewLayer *view_layer = scene->view_layers.first; view_layer; + view_layer = view_layer->next) { + if (STREQ(view_layer->name, layer_name)) { + return view_layer; + } + } - return NULL; + return NULL; } /** @@ -151,28 +148,28 @@ ViewLayer *BKE_view_layer_find(const Scene *scene, const char *layer_name) */ ViewLayer *BKE_view_layer_context_active_PLACEHOLDER(const Scene *scene) { - BLI_assert(scene->view_layers.first); - return scene->view_layers.first; + BLI_assert(scene->view_layers.first); + return scene->view_layers.first; } static ViewLayer *view_layer_add(const char *name) { - if (!name) { - name = DATA_("View Layer"); - } + if (!name) { + name = DATA_("View Layer"); + } - ViewLayer *view_layer = MEM_callocN(sizeof(ViewLayer), "View Layer"); - view_layer->flag = VIEW_LAYER_RENDER | VIEW_LAYER_FREESTYLE; + ViewLayer *view_layer = MEM_callocN(sizeof(ViewLayer), "View Layer"); + view_layer->flag = VIEW_LAYER_RENDER | VIEW_LAYER_FREESTYLE; - BLI_strncpy_utf8(view_layer->name, name, sizeof(view_layer->name)); + BLI_strncpy_utf8(view_layer->name, name, sizeof(view_layer->name)); - /* Pure rendering pipeline settings. */ - view_layer->layflag = 0x7FFF; /* solid ztra halo edge strand */ - view_layer->passflag = SCE_PASS_COMBINED | SCE_PASS_Z; - view_layer->pass_alpha_threshold = 0.5f; - BKE_freestyle_config_init(&view_layer->freestyle_config); + /* Pure rendering pipeline settings. */ + view_layer->layflag = 0x7FFF; /* solid ztra halo edge strand */ + view_layer->passflag = SCE_PASS_COMBINED | SCE_PASS_Z; + view_layer->pass_alpha_threshold = 0.5f; + BKE_freestyle_config_init(&view_layer->freestyle_config); - return view_layer; + return view_layer; } /** @@ -181,23 +178,26 @@ static ViewLayer *view_layer_add(const char *name) */ ViewLayer *BKE_view_layer_add(Scene *scene, const char *name) { - ViewLayer *view_layer = view_layer_add(name); + ViewLayer *view_layer = view_layer_add(name); - BLI_addtail(&scene->view_layers, view_layer); + BLI_addtail(&scene->view_layers, view_layer); - /* unique name */ - BLI_uniquename( - &scene->view_layers, view_layer, DATA_("ViewLayer"), '.', - offsetof(ViewLayer, name), sizeof(view_layer->name)); + /* unique name */ + BLI_uniquename(&scene->view_layers, + view_layer, + DATA_("ViewLayer"), + '.', + offsetof(ViewLayer, name), + sizeof(view_layer->name)); - BKE_layer_collection_sync(scene, view_layer); + BKE_layer_collection_sync(scene, view_layer); - return view_layer; + return view_layer; } void BKE_view_layer_free(ViewLayer *view_layer) { - BKE_view_layer_free_ex(view_layer, true); + BKE_view_layer_free_ex(view_layer, true); } /** @@ -205,41 +205,41 @@ void BKE_view_layer_free(ViewLayer *view_layer) */ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user) { - view_layer->basact = NULL; + view_layer->basact = NULL; - BLI_freelistN(&view_layer->object_bases); + BLI_freelistN(&view_layer->object_bases); - if (view_layer->object_bases_hash) { - BLI_ghash_free(view_layer->object_bases_hash, NULL, NULL); - } + if (view_layer->object_bases_hash) { + BLI_ghash_free(view_layer->object_bases_hash, NULL, NULL); + } - for (LayerCollection *lc = view_layer->layer_collections.first; lc; lc = lc->next) { - layer_collection_free(view_layer, lc); - } - BLI_freelistN(&view_layer->layer_collections); + for (LayerCollection *lc = view_layer->layer_collections.first; lc; lc = lc->next) { + layer_collection_free(view_layer, lc); + } + BLI_freelistN(&view_layer->layer_collections); - for (ViewLayerEngineData *sled = view_layer->drawdata.first; sled; sled = sled->next) { - if (sled->storage) { - if (sled->free) { - sled->free(sled->storage); - } - MEM_freeN(sled->storage); - } - } - BLI_freelistN(&view_layer->drawdata); + for (ViewLayerEngineData *sled = view_layer->drawdata.first; sled; sled = sled->next) { + if (sled->storage) { + if (sled->free) { + sled->free(sled->storage); + } + MEM_freeN(sled->storage); + } + } + BLI_freelistN(&view_layer->drawdata); - MEM_SAFE_FREE(view_layer->stats); + MEM_SAFE_FREE(view_layer->stats); - BKE_freestyle_config_free(&view_layer->freestyle_config, do_id_user); + BKE_freestyle_config_free(&view_layer->freestyle_config, do_id_user); - if (view_layer->id_properties) { - IDP_FreeProperty(view_layer->id_properties); - MEM_freeN(view_layer->id_properties); - } + if (view_layer->id_properties) { + IDP_FreeProperty(view_layer->id_properties); + MEM_freeN(view_layer->id_properties); + } - MEM_SAFE_FREE(view_layer->object_bases_array); + MEM_SAFE_FREE(view_layer->object_bases_array); - MEM_freeN(view_layer); + MEM_freeN(view_layer); } /** @@ -247,27 +247,27 @@ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user) */ void BKE_view_layer_selected_objects_tag(ViewLayer *view_layer, const int tag) { - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if ((base->flag & BASE_SELECTED) != 0) { - base->object->flag |= tag; - } - else { - base->object->flag &= ~tag; - } - } + for (Base *base = view_layer->object_bases.first; base; base = base->next) { + if ((base->flag & BASE_SELECTED) != 0) { + base->object->flag |= tag; + } + else { + base->object->flag &= ~tag; + } + } } static bool find_scene_collection_in_scene_collections(ListBase *lb, const LayerCollection *lc) { - for (LayerCollection *lcn = lb->first; lcn; lcn = lcn->next) { - if (lcn == lc) { - return true; - } - if (find_scene_collection_in_scene_collections(&lcn->layer_collections, lc)) { - return true; - } - } - return false; + for (LayerCollection *lcn = lb->first; lcn; lcn = lcn->next) { + if (lcn == lc) { + return true; + } + if (find_scene_collection_in_scene_collections(&lcn->layer_collections, lc)) { + return true; + } + } + return false; } /** @@ -279,13 +279,13 @@ static bool find_scene_collection_in_scene_collections(ListBase *lb, const Layer */ Object *BKE_view_layer_camera_find(ViewLayer *view_layer) { - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if (base->object->type == OB_CAMERA) { - return base->object; - } - } + for (Base *base = view_layer->object_bases.first; base; base = base->next) { + if (base->object->type == OB_CAMERA) { + return base->object; + } + } - return NULL; + return NULL; } /** @@ -293,94 +293,96 @@ Object *BKE_view_layer_camera_find(ViewLayer *view_layer) */ ViewLayer *BKE_view_layer_find_from_collection(const Scene *scene, LayerCollection *lc) { - for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - if (find_scene_collection_in_scene_collections(&view_layer->layer_collections, lc)) { - return view_layer; - } - } + for (ViewLayer *view_layer = scene->view_layers.first; view_layer; + view_layer = view_layer->next) { + if (find_scene_collection_in_scene_collections(&view_layer->layer_collections, lc)) { + return view_layer; + } + } - return NULL; + return NULL; } /* Base */ static void view_layer_bases_hash_create(ViewLayer *view_layer) { - static ThreadMutex hash_lock = BLI_MUTEX_INITIALIZER; + static ThreadMutex hash_lock = BLI_MUTEX_INITIALIZER; - if (view_layer->object_bases_hash == NULL) { - BLI_mutex_lock(&hash_lock); + if (view_layer->object_bases_hash == NULL) { + BLI_mutex_lock(&hash_lock); - if (view_layer->object_bases_hash == NULL) { - view_layer->object_bases_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__); + if (view_layer->object_bases_hash == NULL) { + view_layer->object_bases_hash = BLI_ghash_new( + BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__); - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if (base->object) { - BLI_ghash_insert(view_layer->object_bases_hash, base->object, base); - } - } - } + for (Base *base = view_layer->object_bases.first; base; base = base->next) { + if (base->object) { + BLI_ghash_insert(view_layer->object_bases_hash, base->object, base); + } + } + } - BLI_mutex_unlock(&hash_lock); - } + BLI_mutex_unlock(&hash_lock); + } } Base *BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob) { - if (!view_layer->object_bases_hash) { - view_layer_bases_hash_create(view_layer); - } + if (!view_layer->object_bases_hash) { + view_layer_bases_hash_create(view_layer); + } - return BLI_ghash_lookup(view_layer->object_bases_hash, ob); + return BLI_ghash_lookup(view_layer->object_bases_hash, ob); } void BKE_view_layer_base_deselect_all(ViewLayer *view_layer) { - Base *base; + Base *base; - for (base = view_layer->object_bases.first; base; base = base->next) { - base->flag &= ~BASE_SELECTED; - } + for (base = view_layer->object_bases.first; base; base = base->next) { + base->flag &= ~BASE_SELECTED; + } } void BKE_view_layer_base_select(Base *selbase) { - if ((selbase->flag & BASE_SELECTABLE) != 0) { - selbase->flag |= BASE_SELECTED; - } + if ((selbase->flag & BASE_SELECTABLE) != 0) { + selbase->flag |= BASE_SELECTED; + } } void BKE_view_layer_base_select_and_set_active(struct ViewLayer *view_layer, Base *selbase) { - view_layer->basact = selbase; - BKE_view_layer_base_select(selbase); + view_layer->basact = selbase; + BKE_view_layer_base_select(selbase); } /**************************** Copy View Layer and Layer Collections ***********************/ -static void layer_collections_copy_data( - ViewLayer *view_layer_dst, const ViewLayer *view_layer_src, - ListBase *layer_collections_dst, const ListBase *layer_collections_src) +static void layer_collections_copy_data(ViewLayer *view_layer_dst, + const ViewLayer *view_layer_src, + ListBase *layer_collections_dst, + const ListBase *layer_collections_src) { - BLI_duplicatelist(layer_collections_dst, layer_collections_src); + BLI_duplicatelist(layer_collections_dst, layer_collections_src); - LayerCollection *layer_collection_dst = layer_collections_dst->first; - const LayerCollection *layer_collection_src = layer_collections_src->first; + LayerCollection *layer_collection_dst = layer_collections_dst->first; + const LayerCollection *layer_collection_src = layer_collections_src->first; - while (layer_collection_dst != NULL) { - layer_collections_copy_data( - view_layer_dst, - view_layer_src, - &layer_collection_dst->layer_collections, - &layer_collection_src->layer_collections); + while (layer_collection_dst != NULL) { + layer_collections_copy_data(view_layer_dst, + view_layer_src, + &layer_collection_dst->layer_collections, + &layer_collection_src->layer_collections); - if (layer_collection_src == view_layer_src->active_collection) { - view_layer_dst->active_collection = layer_collection_dst; - } + if (layer_collection_src == view_layer_src->active_collection) { + view_layer_dst->active_collection = layer_collection_dst; + } - layer_collection_dst = layer_collection_dst->next; - layer_collection_src = layer_collection_src->next; - } + layer_collection_dst = layer_collection_dst->next; + layer_collection_src = layer_collection_src->next; + } } /** @@ -388,81 +390,87 @@ static void layer_collections_copy_data( * * \param flag: Copying options (see BKE_library.h's LIB_ID_COPY_... flags for more). */ -void BKE_view_layer_copy_data( - Scene *scene_dst, const Scene *UNUSED(scene_src), - ViewLayer *view_layer_dst, const ViewLayer *view_layer_src, - const int flag) -{ - if (view_layer_dst->id_properties != NULL) { - view_layer_dst->id_properties = IDP_CopyProperty_ex(view_layer_dst->id_properties, flag); - } - BKE_freestyle_config_copy(&view_layer_dst->freestyle_config, &view_layer_src->freestyle_config, flag); - - view_layer_dst->stats = NULL; - - /* Clear temporary data. */ - BLI_listbase_clear(&view_layer_dst->drawdata); - view_layer_dst->object_bases_array = NULL; - view_layer_dst->object_bases_hash = NULL; - - /* Copy layer collections and object bases. */ - /* Inline 'BLI_duplicatelist' and update the active base. */ - BLI_listbase_clear(&view_layer_dst->object_bases); - for (Base *base_src = view_layer_src->object_bases.first; base_src; base_src = base_src->next) { - Base *base_dst = MEM_dupallocN(base_src); - BLI_addtail(&view_layer_dst->object_bases, base_dst); - if (view_layer_src->basact == base_src) { - view_layer_dst->basact = base_dst; - } - } - - view_layer_dst->active_collection = NULL; - layer_collections_copy_data( - view_layer_dst, - view_layer_src, - &view_layer_dst->layer_collections, - &view_layer_src->layer_collections); - - LayerCollection *lc_scene_dst = view_layer_dst->layer_collections.first; - lc_scene_dst->collection = scene_dst->master_collection; +void BKE_view_layer_copy_data(Scene *scene_dst, + const Scene *UNUSED(scene_src), + ViewLayer *view_layer_dst, + const ViewLayer *view_layer_src, + const int flag) +{ + if (view_layer_dst->id_properties != NULL) { + view_layer_dst->id_properties = IDP_CopyProperty_ex(view_layer_dst->id_properties, flag); + } + BKE_freestyle_config_copy( + &view_layer_dst->freestyle_config, &view_layer_src->freestyle_config, flag); + + view_layer_dst->stats = NULL; + + /* Clear temporary data. */ + BLI_listbase_clear(&view_layer_dst->drawdata); + view_layer_dst->object_bases_array = NULL; + view_layer_dst->object_bases_hash = NULL; + + /* Copy layer collections and object bases. */ + /* Inline 'BLI_duplicatelist' and update the active base. */ + BLI_listbase_clear(&view_layer_dst->object_bases); + for (Base *base_src = view_layer_src->object_bases.first; base_src; base_src = base_src->next) { + Base *base_dst = MEM_dupallocN(base_src); + BLI_addtail(&view_layer_dst->object_bases, base_dst); + if (view_layer_src->basact == base_src) { + view_layer_dst->basact = base_dst; + } + } + + view_layer_dst->active_collection = NULL; + layer_collections_copy_data(view_layer_dst, + view_layer_src, + &view_layer_dst->layer_collections, + &view_layer_src->layer_collections); + + LayerCollection *lc_scene_dst = view_layer_dst->layer_collections.first; + lc_scene_dst->collection = scene_dst->master_collection; } void BKE_view_layer_rename(Main *bmain, Scene *scene, ViewLayer *view_layer, const char *newname) { - char oldname[sizeof(view_layer->name)]; + char oldname[sizeof(view_layer->name)]; - BLI_strncpy(oldname, view_layer->name, sizeof(view_layer->name)); + BLI_strncpy(oldname, view_layer->name, sizeof(view_layer->name)); - BLI_strncpy_utf8(view_layer->name, newname, sizeof(view_layer->name)); - BLI_uniquename(&scene->view_layers, view_layer, DATA_("ViewLayer"), '.', offsetof(ViewLayer, name), sizeof(view_layer->name)); + BLI_strncpy_utf8(view_layer->name, newname, sizeof(view_layer->name)); + BLI_uniquename(&scene->view_layers, + view_layer, + DATA_("ViewLayer"), + '.', + offsetof(ViewLayer, name), + sizeof(view_layer->name)); - if (scene->nodetree) { - bNode *node; - int index = BLI_findindex(&scene->view_layers, view_layer); + if (scene->nodetree) { + bNode *node; + int index = BLI_findindex(&scene->view_layers, view_layer); - for (node = scene->nodetree->nodes.first; node; node = node->next) { - if (node->type == CMP_NODE_R_LAYERS && node->id == NULL) { - if (node->custom1 == index) - BLI_strncpy(node->name, view_layer->name, NODE_MAXSTR); - } - } - } + for (node = scene->nodetree->nodes.first; node; node = node->next) { + if (node->type == CMP_NODE_R_LAYERS && node->id == NULL) { + if (node->custom1 == index) + BLI_strncpy(node->name, view_layer->name, NODE_MAXSTR); + } + } + } - /* Fix all the animation data and windows which may link to this. */ - BKE_animdata_fix_paths_rename_all(NULL, "view_layers", oldname, view_layer->name); + /* Fix all the animation data and windows which may link to this. */ + BKE_animdata_fix_paths_rename_all(NULL, "view_layers", oldname, view_layer->name); - /* WM can be missing on startup. */ - wmWindowManager *wm = bmain->wm.first; - if (wm) { - for (wmWindow *win = wm->windows.first; win; win = win->next) { - if (win->scene == scene && STREQ(win->view_layer_name, oldname)) { - STRNCPY(win->view_layer_name, view_layer->name); - } - } - } + /* WM can be missing on startup. */ + wmWindowManager *wm = bmain->wm.first; + if (wm) { + for (wmWindow *win = wm->windows.first; win; win = win->next) { + if (win->scene == scene && STREQ(win->view_layer_name, oldname)) { + STRNCPY(win->view_layer_name, view_layer->name); + } + } + } - /* Dependency graph uses view layer name based lookups. */ - DEG_id_tag_update(&scene->id, 0); + /* Dependency graph uses view layer name based lookups. */ + DEG_id_tag_update(&scene->id, 0); } /* LayerCollection */ @@ -472,21 +480,21 @@ void BKE_view_layer_rename(Main *bmain, Scene *scene, ViewLayer *view_layer, con */ static LayerCollection *collection_from_index(ListBase *lb, const int number, int *i) { - for (LayerCollection *lc = lb->first; lc; lc = lc->next) { - if (*i == number) { - return lc; - } + for (LayerCollection *lc = lb->first; lc; lc = lc->next) { + if (*i == number) { + return lc; + } - (*i)++; - } + (*i)++; + } - for (LayerCollection *lc = lb->first; lc; lc = lc->next) { - LayerCollection *lc_nested = collection_from_index(&lc->layer_collections, number, i); - if (lc_nested) { - return lc_nested; - } - } - return NULL; + for (LayerCollection *lc = lb->first; lc; lc = lc->next) { + LayerCollection *lc_nested = collection_from_index(&lc->layer_collections, number, i); + if (lc_nested) { + return lc_nested; + } + } + return NULL; } /** @@ -494,8 +502,8 @@ static LayerCollection *collection_from_index(ListBase *lb, const int number, in */ LayerCollection *BKE_layer_collection_from_index(ViewLayer *view_layer, const int index) { - int i = 0; - return collection_from_index(&view_layer->layer_collections, index, &i); + int i = 0; + return collection_from_index(&view_layer->layer_collections, index, &i); } /** @@ -503,7 +511,7 @@ LayerCollection *BKE_layer_collection_from_index(ViewLayer *view_layer, const in */ LayerCollection *BKE_layer_collection_get_active(ViewLayer *view_layer) { - return view_layer->active_collection; + return view_layer->active_collection; } /* @@ -511,12 +519,12 @@ LayerCollection *BKE_layer_collection_get_active(ViewLayer *view_layer) */ bool BKE_layer_collection_activate(ViewLayer *view_layer, LayerCollection *lc) { - if (lc->flag & LAYER_COLLECTION_EXCLUDE) { - return false; - } + if (lc->flag & LAYER_COLLECTION_EXCLUDE) { + return false; + } - view_layer->active_collection = lc; - return true; + view_layer->active_collection = lc; + return true; } /** @@ -524,26 +532,26 @@ bool BKE_layer_collection_activate(ViewLayer *view_layer, LayerCollection *lc) */ LayerCollection *BKE_layer_collection_activate_parent(ViewLayer *view_layer, LayerCollection *lc) { - CollectionParent *parent = lc->collection->parents.first; + CollectionParent *parent = lc->collection->parents.first; - if (parent) { - lc = BKE_layer_collection_first_from_scene_collection(view_layer, parent->collection); - } - else { - lc = NULL; - } + if (parent) { + lc = BKE_layer_collection_first_from_scene_collection(view_layer, parent->collection); + } + else { + lc = NULL; + } - if (lc && (lc->flag & LAYER_COLLECTION_EXCLUDE)) { - /* Don't activate excluded collections. */ - return BKE_layer_collection_activate_parent(view_layer, lc); - } + if (lc && (lc->flag & LAYER_COLLECTION_EXCLUDE)) { + /* Don't activate excluded collections. */ + return BKE_layer_collection_activate_parent(view_layer, lc); + } - if (!lc) { - lc = view_layer->layer_collections.first; - } + if (!lc) { + lc = view_layer->layer_collections.first; + } - view_layer->active_collection = lc; - return lc; + view_layer->active_collection = lc; + return lc; } /** @@ -551,11 +559,11 @@ LayerCollection *BKE_layer_collection_activate_parent(ViewLayer *view_layer, Lay */ static int collection_count(ListBase *lb) { - int i = 0; - for (LayerCollection *lc = lb->first; lc; lc = lc->next) { - i += collection_count(&lc->layer_collections) + 1; - } - return i; + int i = 0; + for (LayerCollection *lc = lb->first; lc; lc = lc->next) { + i += collection_count(&lc->layer_collections) + 1; + } + return i; } /** @@ -564,7 +572,7 @@ static int collection_count(ListBase *lb) */ int BKE_layer_collection_count(ViewLayer *view_layer) { - return collection_count(&view_layer->layer_collections); + return collection_count(&view_layer->layer_collections); } /** @@ -572,21 +580,21 @@ int BKE_layer_collection_count(ViewLayer *view_layer) */ static int index_from_collection(ListBase *lb, const LayerCollection *lc, int *i) { - for (LayerCollection *lcol = lb->first; lcol; lcol = lcol->next) { - if (lcol == lc) { - return *i; - } + for (LayerCollection *lcol = lb->first; lcol; lcol = lcol->next) { + if (lcol == lc) { + return *i; + } - (*i)++; - } + (*i)++; + } - for (LayerCollection *lcol = lb->first; lcol; lcol = lcol->next) { - int i_nested = index_from_collection(&lcol->layer_collections, lc, i); - if (i_nested != -1) { - return i_nested; - } - } - return -1; + for (LayerCollection *lcol = lb->first; lcol; lcol = lcol->next) { + int i_nested = index_from_collection(&lcol->layer_collections, lc, i); + if (i_nested != -1) { + return i_nested; + } + } + return -1; } /** @@ -594,8 +602,8 @@ static int index_from_collection(ListBase *lb, const LayerCollection *lc, int *i */ int BKE_layer_collection_findindex(ViewLayer *view_layer, const LayerCollection *lc) { - int i = 0; - return index_from_collection(&view_layer->layer_collections, lc, &i); + int i = 0; + return index_from_collection(&view_layer->layer_collections, lc, &i); } /*********************************** Syncing ********************************* @@ -610,142 +618,150 @@ int BKE_layer_collection_findindex(ViewLayer *view_layer, const LayerCollection * in at least one layer collection. That list is also synchronized here, and * stores state like selection. */ -static short layer_collection_sync( - ViewLayer *view_layer, const ListBase *lb_scene, - ListBase *lb_layer, ListBase *new_object_bases, - short parent_exclude, short parent_restrict, short parent_layer_restrict) -{ - /* TODO: support recovery after removal of intermediate collections, reordering, .. - * For local edits we can make editing operating do the appropriate thing, but for - * linking we can only sync after the fact. */ - - /* Remove layer collections that no longer have a corresponding scene collection. */ - for (LayerCollection *lc = lb_layer->first; lc;) { - /* Note ID remap can set lc->collection to NULL when deleting collections. */ - LayerCollection *lc_next = lc->next; - Collection *collection = (lc->collection) ? - BLI_findptr(lb_scene, lc->collection, offsetof(CollectionChild, collection)) : NULL; - - if (!collection) { - if (lc == view_layer->active_collection) { - view_layer->active_collection = NULL; - } - - /* Free recursively. */ - layer_collection_free(view_layer, lc); - BLI_freelinkN(lb_layer, lc); - } - - lc = lc_next; - } - - /* Add layer collections for any new scene collections, and ensure order is the same. */ - ListBase new_lb_layer = {NULL, NULL}; - short runtime_flag = 0; - - for (const CollectionChild *child = lb_scene->first; child; child = child->next) { - Collection *collection = child->collection; - LayerCollection *lc = BLI_findptr(lb_layer, collection, offsetof(LayerCollection, collection)); - - if (lc) { - BLI_remlink(lb_layer, lc); - BLI_addtail(&new_lb_layer, lc); - } - else { - lc = layer_collection_add(&new_lb_layer, collection); - lc->flag = parent_exclude; - } - - /* Collection restrict is inherited. */ - short child_restrict = parent_restrict; - short child_layer_restrict = parent_layer_restrict; - if (!(collection->flag & COLLECTION_IS_MASTER)) { - child_restrict |= collection->flag; - child_layer_restrict |= lc->flag; - } - - /* Sync child collections. */ - short child_runtime_flag = layer_collection_sync( - view_layer, &collection->children, - &lc->layer_collections, new_object_bases, - lc->flag, child_restrict, child_layer_restrict); - - /* Layer collection exclude is not inherited. */ - if (lc->flag & LAYER_COLLECTION_EXCLUDE) { - lc->runtime_flag = 0; - continue; - } - else { - lc->runtime_flag = child_runtime_flag; - } - - if (((child_restrict & COLLECTION_RESTRICT_VIEW) == 0) && - ((child_layer_restrict & LAYER_COLLECTION_RESTRICT_VIEW) == 0)) - { - lc->runtime_flag |= LAYER_COLLECTION_VISIBLE; - } - - /* Sync objects, except if collection was excluded. */ - for (CollectionObject *cob = collection->gobject.first; cob; cob = cob->next) { - if (cob->ob == NULL) { - continue; - } - - void **base_p; - Base *base; - if (BLI_ghash_ensure_p(view_layer->object_bases_hash, cob->ob, &base_p)) { - /* Move from old base list to new base list. Base might have already - * been moved to the new base list and the first/last test ensure that - * case also works. */ - base = *base_p; - if (!ELEM(base, new_object_bases->first, new_object_bases->last)) { - BLI_remlink(&view_layer->object_bases, base); - BLI_addtail(new_object_bases, base); - } - } - else { - /* Create new base. */ - base = object_base_new(cob->ob); - *base_p = base; - BLI_addtail(new_object_bases, base); - } - - if ((child_restrict & COLLECTION_RESTRICT_VIEW) == 0) { - base->flag_from_collection |= BASE_ENABLED_VIEWPORT; - if ((child_layer_restrict & LAYER_COLLECTION_RESTRICT_VIEW) == 0) { - base->flag_from_collection |= BASE_VISIBLE; - if (((child_restrict & COLLECTION_RESTRICT_SELECT) == 0)) { - base->flag_from_collection |= BASE_SELECTABLE; - } - } - } - - if ((child_restrict & COLLECTION_RESTRICT_RENDER) == 0) { - base->flag_from_collection |= BASE_ENABLED_RENDER; - } - - /* Holdout and indirect only */ - if (lc->flag & LAYER_COLLECTION_HOLDOUT) { - base->flag_from_collection |= BASE_HOLDOUT; - } - if (lc->flag & LAYER_COLLECTION_INDIRECT_ONLY) { - base->flag_from_collection |= BASE_INDIRECT_ONLY; - } - - lc->runtime_flag |= LAYER_COLLECTION_HAS_OBJECTS; - - /* Make sure flags on base are usable right away. */ - BKE_base_eval_flags(base); - } - - runtime_flag |= lc->runtime_flag; - } - - /* Replace layer collection list with new one. */ - *lb_layer = new_lb_layer; - BLI_assert(BLI_listbase_count(lb_scene) == BLI_listbase_count(lb_layer)); - - return runtime_flag; +static short layer_collection_sync(ViewLayer *view_layer, + const ListBase *lb_scene, + ListBase *lb_layer, + ListBase *new_object_bases, + short parent_exclude, + short parent_restrict, + short parent_layer_restrict) +{ + /* TODO: support recovery after removal of intermediate collections, reordering, .. + * For local edits we can make editing operating do the appropriate thing, but for + * linking we can only sync after the fact. */ + + /* Remove layer collections that no longer have a corresponding scene collection. */ + for (LayerCollection *lc = lb_layer->first; lc;) { + /* Note ID remap can set lc->collection to NULL when deleting collections. */ + LayerCollection *lc_next = lc->next; + Collection *collection = (lc->collection) ? + BLI_findptr(lb_scene, + lc->collection, + offsetof(CollectionChild, collection)) : + NULL; + + if (!collection) { + if (lc == view_layer->active_collection) { + view_layer->active_collection = NULL; + } + + /* Free recursively. */ + layer_collection_free(view_layer, lc); + BLI_freelinkN(lb_layer, lc); + } + + lc = lc_next; + } + + /* Add layer collections for any new scene collections, and ensure order is the same. */ + ListBase new_lb_layer = {NULL, NULL}; + short runtime_flag = 0; + + for (const CollectionChild *child = lb_scene->first; child; child = child->next) { + Collection *collection = child->collection; + LayerCollection *lc = BLI_findptr(lb_layer, collection, offsetof(LayerCollection, collection)); + + if (lc) { + BLI_remlink(lb_layer, lc); + BLI_addtail(&new_lb_layer, lc); + } + else { + lc = layer_collection_add(&new_lb_layer, collection); + lc->flag = parent_exclude; + } + + /* Collection restrict is inherited. */ + short child_restrict = parent_restrict; + short child_layer_restrict = parent_layer_restrict; + if (!(collection->flag & COLLECTION_IS_MASTER)) { + child_restrict |= collection->flag; + child_layer_restrict |= lc->flag; + } + + /* Sync child collections. */ + short child_runtime_flag = layer_collection_sync(view_layer, + &collection->children, + &lc->layer_collections, + new_object_bases, + lc->flag, + child_restrict, + child_layer_restrict); + + /* Layer collection exclude is not inherited. */ + if (lc->flag & LAYER_COLLECTION_EXCLUDE) { + lc->runtime_flag = 0; + continue; + } + else { + lc->runtime_flag = child_runtime_flag; + } + + if (((child_restrict & COLLECTION_RESTRICT_VIEW) == 0) && + ((child_layer_restrict & LAYER_COLLECTION_RESTRICT_VIEW) == 0)) { + lc->runtime_flag |= LAYER_COLLECTION_VISIBLE; + } + + /* Sync objects, except if collection was excluded. */ + for (CollectionObject *cob = collection->gobject.first; cob; cob = cob->next) { + if (cob->ob == NULL) { + continue; + } + + void **base_p; + Base *base; + if (BLI_ghash_ensure_p(view_layer->object_bases_hash, cob->ob, &base_p)) { + /* Move from old base list to new base list. Base might have already + * been moved to the new base list and the first/last test ensure that + * case also works. */ + base = *base_p; + if (!ELEM(base, new_object_bases->first, new_object_bases->last)) { + BLI_remlink(&view_layer->object_bases, base); + BLI_addtail(new_object_bases, base); + } + } + else { + /* Create new base. */ + base = object_base_new(cob->ob); + *base_p = base; + BLI_addtail(new_object_bases, base); + } + + if ((child_restrict & COLLECTION_RESTRICT_VIEW) == 0) { + base->flag_from_collection |= BASE_ENABLED_VIEWPORT; + if ((child_layer_restrict & LAYER_COLLECTION_RESTRICT_VIEW) == 0) { + base->flag_from_collection |= BASE_VISIBLE; + if (((child_restrict & COLLECTION_RESTRICT_SELECT) == 0)) { + base->flag_from_collection |= BASE_SELECTABLE; + } + } + } + + if ((child_restrict & COLLECTION_RESTRICT_RENDER) == 0) { + base->flag_from_collection |= BASE_ENABLED_RENDER; + } + + /* Holdout and indirect only */ + if (lc->flag & LAYER_COLLECTION_HOLDOUT) { + base->flag_from_collection |= BASE_HOLDOUT; + } + if (lc->flag & LAYER_COLLECTION_INDIRECT_ONLY) { + base->flag_from_collection |= BASE_INDIRECT_ONLY; + } + + lc->runtime_flag |= LAYER_COLLECTION_HAS_OBJECTS; + + /* Make sure flags on base are usable right away. */ + BKE_base_eval_flags(base); + } + + runtime_flag |= lc->runtime_flag; + } + + /* Replace layer collection list with new one. */ + *lb_layer = new_lb_layer; + BLI_assert(BLI_listbase_count(lb_scene) == BLI_listbase_count(lb_layer)); + + return runtime_flag; } /** @@ -755,102 +771,108 @@ static short layer_collection_sync( */ void BKE_layer_collection_sync(const Scene *scene, ViewLayer *view_layer) { - if (!scene->master_collection) { - /* Happens for old files that don't have versioning applied yet. */ - return; - } - - /* Free cache. */ - MEM_SAFE_FREE(view_layer->object_bases_array); - - /* Create object to base hash if it does not exist yet. */ - if (!view_layer->object_bases_hash) { - view_layer_bases_hash_create(view_layer); - } - - /* Clear visible and selectable flags to be reset. */ - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - base->flag &= ~g_base_collection_flags; - base->flag_from_collection &= ~g_base_collection_flags; - } - - /* Generate new layer connections and object bases when collections changed. */ - CollectionChild child = {NULL, NULL, scene->master_collection}; - const ListBase collections = {&child, &child}; - ListBase new_object_bases = {NULL, NULL}; - - const short parent_exclude = 0, parent_restrict = 0, parent_layer_restrict = 0; - layer_collection_sync( - view_layer, &collections, - &view_layer->layer_collections, &new_object_bases, - parent_exclude, parent_restrict, parent_layer_restrict); - - /* Any remaning object bases are to be removed. */ - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if (view_layer->basact == base) { - view_layer->basact = NULL; - } - - if (base->object) { - BLI_ghash_remove(view_layer->object_bases_hash, base->object, NULL, NULL); - } - } - - BLI_freelistN(&view_layer->object_bases); - view_layer->object_bases = new_object_bases; - - /* Always set a valid active collection. */ - LayerCollection *active = view_layer->active_collection; - - if (active && (active->flag & LAYER_COLLECTION_EXCLUDE)) { - BKE_layer_collection_activate_parent(view_layer, active); - } - else if (active == NULL) { - view_layer->active_collection = view_layer->layer_collections.first; - } + if (!scene->master_collection) { + /* Happens for old files that don't have versioning applied yet. */ + return; + } + + /* Free cache. */ + MEM_SAFE_FREE(view_layer->object_bases_array); + + /* Create object to base hash if it does not exist yet. */ + if (!view_layer->object_bases_hash) { + view_layer_bases_hash_create(view_layer); + } + + /* Clear visible and selectable flags to be reset. */ + for (Base *base = view_layer->object_bases.first; base; base = base->next) { + base->flag &= ~g_base_collection_flags; + base->flag_from_collection &= ~g_base_collection_flags; + } + + /* Generate new layer connections and object bases when collections changed. */ + CollectionChild child = {NULL, NULL, scene->master_collection}; + const ListBase collections = {&child, &child}; + ListBase new_object_bases = {NULL, NULL}; + + const short parent_exclude = 0, parent_restrict = 0, parent_layer_restrict = 0; + layer_collection_sync(view_layer, + &collections, + &view_layer->layer_collections, + &new_object_bases, + parent_exclude, + parent_restrict, + parent_layer_restrict); + + /* Any remaning object bases are to be removed. */ + for (Base *base = view_layer->object_bases.first; base; base = base->next) { + if (view_layer->basact == base) { + view_layer->basact = NULL; + } + + if (base->object) { + BLI_ghash_remove(view_layer->object_bases_hash, base->object, NULL, NULL); + } + } + + BLI_freelistN(&view_layer->object_bases); + view_layer->object_bases = new_object_bases; + + /* Always set a valid active collection. */ + LayerCollection *active = view_layer->active_collection; + + if (active && (active->flag & LAYER_COLLECTION_EXCLUDE)) { + BKE_layer_collection_activate_parent(view_layer, active); + } + else if (active == NULL) { + view_layer->active_collection = view_layer->layer_collections.first; + } } void BKE_scene_collection_sync(const Scene *scene) { - for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - BKE_layer_collection_sync(scene, view_layer); - } + for (ViewLayer *view_layer = scene->view_layers.first; view_layer; + view_layer = view_layer->next) { + BKE_layer_collection_sync(scene, view_layer); + } } void BKE_main_collection_sync(const Main *bmain) { - /* TODO: if a single collection changed, figure out which - * scenes it belongs to and only update those. */ + /* TODO: if a single collection changed, figure out which + * scenes it belongs to and only update those. */ - /* TODO: optimize for file load so only linked collections get checked? */ + /* TODO: optimize for file load so only linked collections get checked? */ - for (const Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) { - BKE_scene_collection_sync(scene); - } + for (const Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) { + BKE_scene_collection_sync(scene); + } } void BKE_main_collection_sync_remap(const Main *bmain) { - /* On remapping of object or collection pointers free caches. */ - /* TODO: try to make this faster */ + /* On remapping of object or collection pointers free caches. */ + /* TODO: try to make this faster */ - for (const Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) { - for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - MEM_SAFE_FREE(view_layer->object_bases_array); + for (const Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) { + for (ViewLayer *view_layer = scene->view_layers.first; view_layer; + view_layer = view_layer->next) { + MEM_SAFE_FREE(view_layer->object_bases_array); - if (view_layer->object_bases_hash) { - BLI_ghash_free(view_layer->object_bases_hash, NULL, NULL); - view_layer->object_bases_hash = NULL; - } - } - } + if (view_layer->object_bases_hash) { + BLI_ghash_free(view_layer->object_bases_hash, NULL, NULL); + view_layer->object_bases_hash = NULL; + } + } + } - for (Collection *collection = bmain->collections.first; collection; collection = collection->id.next) { - BKE_collection_object_cache_free(collection); - DEG_id_tag_update_ex((Main *)bmain, &collection->id, ID_RECALC_COPY_ON_WRITE); - } + for (Collection *collection = bmain->collections.first; collection; + collection = collection->id.next) { + BKE_collection_object_cache_free(collection); + DEG_id_tag_update_ex((Main *)bmain, &collection->id, ID_RECALC_COPY_ON_WRITE); + } - BKE_main_collection_sync(bmain); + BKE_main_collection_sync(bmain); } /* ---------------------------------------------------------------------- */ @@ -863,77 +885,79 @@ void BKE_main_collection_sync_remap(const Main *bmain) */ bool BKE_layer_collection_objects_select(ViewLayer *view_layer, LayerCollection *lc, bool deselect) { - if (lc->collection->flag & COLLECTION_RESTRICT_SELECT) { - return false; - } + if (lc->collection->flag & COLLECTION_RESTRICT_SELECT) { + return false; + } - bool changed = false; + bool changed = false; - if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) { - for (CollectionObject *cob = lc->collection->gobject.first; cob; cob = cob->next) { - Base *base = BKE_view_layer_base_find(view_layer, cob->ob); + if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) { + for (CollectionObject *cob = lc->collection->gobject.first; cob; cob = cob->next) { + Base *base = BKE_view_layer_base_find(view_layer, cob->ob); - if (base) { - if (deselect) { - if (base->flag & BASE_SELECTED) { - base->flag &= ~BASE_SELECTED; - changed = true; - } - } - else { - if ((base->flag & BASE_SELECTABLE) && !(base->flag & BASE_SELECTED)) { - base->flag |= BASE_SELECTED; - changed = true; - } - } - } - } - } + if (base) { + if (deselect) { + if (base->flag & BASE_SELECTED) { + base->flag &= ~BASE_SELECTED; + changed = true; + } + } + else { + if ((base->flag & BASE_SELECTABLE) && !(base->flag & BASE_SELECTED)) { + base->flag |= BASE_SELECTED; + changed = true; + } + } + } + } + } - for (LayerCollection *iter = lc->layer_collections.first; iter; iter = iter->next) { - changed |= BKE_layer_collection_objects_select(view_layer, iter, deselect); - } + for (LayerCollection *iter = lc->layer_collections.first; iter; iter = iter->next) { + changed |= BKE_layer_collection_objects_select(view_layer, iter, deselect); + } - return changed; + return changed; } bool BKE_layer_collection_has_selected_objects(ViewLayer *view_layer, LayerCollection *lc) { - if (lc->collection->flag & COLLECTION_RESTRICT_SELECT) { - return false; - } + if (lc->collection->flag & COLLECTION_RESTRICT_SELECT) { + return false; + } - if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) { - for (CollectionObject *cob = lc->collection->gobject.first; cob; cob = cob->next) { - Base *base = BKE_view_layer_base_find(view_layer, cob->ob); + if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) { + for (CollectionObject *cob = lc->collection->gobject.first; cob; cob = cob->next) { + Base *base = BKE_view_layer_base_find(view_layer, cob->ob); - if (base && (base->flag & BASE_SELECTED) && (base->flag & BASE_VISIBLE)) { - return true; - } - } - } + if (base && (base->flag & BASE_SELECTED) && (base->flag & BASE_VISIBLE)) { + return true; + } + } + } - for (LayerCollection *iter = lc->layer_collections.first; iter; iter = iter->next) { - if (BKE_layer_collection_has_selected_objects(view_layer, iter)) { - return true; - } - } + for (LayerCollection *iter = lc->layer_collections.first; iter; iter = iter->next) { + if (BKE_layer_collection_has_selected_objects(view_layer, iter)) { + return true; + } + } - return false; + return false; } -bool BKE_layer_collection_has_layer_collection(LayerCollection *lc_parent, LayerCollection *lc_child) +bool BKE_layer_collection_has_layer_collection(LayerCollection *lc_parent, + LayerCollection *lc_child) { - if (lc_parent == lc_child) { - return true; - } + if (lc_parent == lc_child) { + return true; + } - for (LayerCollection *lc_iter = lc_parent->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { - if (BKE_layer_collection_has_layer_collection(lc_iter, lc_child)) { - return true; - } - } - return false; + for (LayerCollection *lc_iter = lc_parent->layer_collections.first; lc_iter; + lc_iter = lc_iter->next) { + if (BKE_layer_collection_has_layer_collection(lc_iter, lc_child)) { + return true; + } + } + return false; } /* ---------------------------------------------------------------------- */ @@ -941,36 +965,36 @@ bool BKE_layer_collection_has_layer_collection(LayerCollection *lc_parent, Layer /* Update after toggling visibility of an object base. */ void BKE_base_set_visible(Scene *scene, ViewLayer *view_layer, Base *base, bool extend) { - if (!extend) { - /* Make only one base visible. */ - for (Base *other = view_layer->object_bases.first; other; other = other->next) { - other->flag |= BASE_HIDDEN; - } + if (!extend) { + /* Make only one base visible. */ + for (Base *other = view_layer->object_bases.first; other; other = other->next) { + other->flag |= BASE_HIDDEN; + } - base->flag &= ~BASE_HIDDEN; - } - else { - /* Toggle visibility of one base. */ - base->flag ^= BASE_HIDDEN; - } + base->flag &= ~BASE_HIDDEN; + } + else { + /* Toggle visibility of one base. */ + base->flag ^= BASE_HIDDEN; + } - BKE_layer_collection_sync(scene, view_layer); + BKE_layer_collection_sync(scene, view_layer); } static void layer_collection_flag_set_recursive(LayerCollection *lc, const int flag) { - lc->flag |= flag; - for (LayerCollection *lc_iter = lc->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { - layer_collection_flag_set_recursive(lc_iter, flag); - } + lc->flag |= flag; + for (LayerCollection *lc_iter = lc->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { + layer_collection_flag_set_recursive(lc_iter, flag); + } } static void layer_collection_flag_unset_recursive(LayerCollection *lc, const int flag) { - lc->flag &= ~flag; - for (LayerCollection *lc_iter = lc->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { - layer_collection_flag_unset_recursive(lc_iter, flag); - } + lc->flag &= ~flag; + for (LayerCollection *lc_iter = lc->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { + layer_collection_flag_unset_recursive(lc_iter, flag); + } } /** @@ -983,88 +1007,94 @@ static void layer_collection_flag_unset_recursive(LayerCollection *lc, const int * * Return whether depsgraph needs update. */ -bool BKE_layer_collection_isolate(Scene *scene, ViewLayer *view_layer, LayerCollection *lc, bool extend) -{ - bool depsgraph_need_update = false; - LayerCollection *lc_master = view_layer->layer_collections.first; - bool hide_it = extend && (lc->runtime_flag & LAYER_COLLECTION_VISIBLE); - - if ((!ID_IS_LINKED(lc->collection) && !hide_it)) { - if (lc->collection->flag & COLLECTION_RESTRICT_VIEW) { - lc->collection->flag &= ~COLLECTION_RESTRICT_VIEW; - depsgraph_need_update = true; - } - } - - if (!extend) { - /* Hide all collections . */ - for (LayerCollection *lc_iter = lc_master->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { - layer_collection_flag_set_recursive(lc_iter, LAYER_COLLECTION_RESTRICT_VIEW); - } - } - - /* Make all the direct parents visible. */ - if (hide_it) { - lc->flag |= LAYER_COLLECTION_RESTRICT_VIEW; - } - else { - LayerCollection *lc_parent = lc; - for (LayerCollection *lc_iter = lc_master->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { - if (BKE_layer_collection_has_layer_collection(lc_iter, lc)) { - lc_parent = lc_iter; - break; - } - } - - while (lc_parent != lc) { - if (!ID_IS_LINKED(lc_parent->collection)) { - if (lc_parent->collection->flag & COLLECTION_RESTRICT_VIEW) { - lc_parent->collection->flag &= ~COLLECTION_RESTRICT_VIEW; - depsgraph_need_update = true; - } - } - - lc_parent->flag &= ~LAYER_COLLECTION_RESTRICT_VIEW; - - for (LayerCollection *lc_iter = lc_parent->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { - if (BKE_layer_collection_has_layer_collection(lc_iter, lc)) { - lc_parent = lc_iter; - break; - } - } - } - - /* Make all the children visible, but respect their disable state. */ - layer_collection_flag_unset_recursive(lc, LAYER_COLLECTION_RESTRICT_VIEW); - - BKE_layer_collection_activate(view_layer, lc); - } - - BKE_layer_collection_sync(scene, view_layer); - - return depsgraph_need_update; +bool BKE_layer_collection_isolate(Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc, + bool extend) +{ + bool depsgraph_need_update = false; + LayerCollection *lc_master = view_layer->layer_collections.first; + bool hide_it = extend && (lc->runtime_flag & LAYER_COLLECTION_VISIBLE); + + if ((!ID_IS_LINKED(lc->collection) && !hide_it)) { + if (lc->collection->flag & COLLECTION_RESTRICT_VIEW) { + lc->collection->flag &= ~COLLECTION_RESTRICT_VIEW; + depsgraph_need_update = true; + } + } + + if (!extend) { + /* Hide all collections . */ + for (LayerCollection *lc_iter = lc_master->layer_collections.first; lc_iter; + lc_iter = lc_iter->next) { + layer_collection_flag_set_recursive(lc_iter, LAYER_COLLECTION_RESTRICT_VIEW); + } + } + + /* Make all the direct parents visible. */ + if (hide_it) { + lc->flag |= LAYER_COLLECTION_RESTRICT_VIEW; + } + else { + LayerCollection *lc_parent = lc; + for (LayerCollection *lc_iter = lc_master->layer_collections.first; lc_iter; + lc_iter = lc_iter->next) { + if (BKE_layer_collection_has_layer_collection(lc_iter, lc)) { + lc_parent = lc_iter; + break; + } + } + + while (lc_parent != lc) { + if (!ID_IS_LINKED(lc_parent->collection)) { + if (lc_parent->collection->flag & COLLECTION_RESTRICT_VIEW) { + lc_parent->collection->flag &= ~COLLECTION_RESTRICT_VIEW; + depsgraph_need_update = true; + } + } + + lc_parent->flag &= ~LAYER_COLLECTION_RESTRICT_VIEW; + + for (LayerCollection *lc_iter = lc_parent->layer_collections.first; lc_iter; + lc_iter = lc_iter->next) { + if (BKE_layer_collection_has_layer_collection(lc_iter, lc)) { + lc_parent = lc_iter; + break; + } + } + } + + /* Make all the children visible, but respect their disable state. */ + layer_collection_flag_unset_recursive(lc, LAYER_COLLECTION_RESTRICT_VIEW); + + BKE_layer_collection_activate(view_layer, lc); + } + + BKE_layer_collection_sync(scene, view_layer); + + return depsgraph_need_update; } static void layer_collection_bases_show_recursive(ViewLayer *view_layer, LayerCollection *lc) { - for (CollectionObject *cob = lc->collection->gobject.first; cob; cob = cob->next) { - Base *base = BKE_view_layer_base_find(view_layer, cob->ob); - base->flag &= ~BASE_HIDDEN; - } - for (LayerCollection *lc_iter = lc->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { - layer_collection_bases_show_recursive(view_layer, lc_iter); - } + for (CollectionObject *cob = lc->collection->gobject.first; cob; cob = cob->next) { + Base *base = BKE_view_layer_base_find(view_layer, cob->ob); + base->flag &= ~BASE_HIDDEN; + } + for (LayerCollection *lc_iter = lc->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { + layer_collection_bases_show_recursive(view_layer, lc_iter); + } } static void layer_collection_bases_hide_recursive(ViewLayer *view_layer, LayerCollection *lc) { - for (CollectionObject *cob = lc->collection->gobject.first; cob; cob = cob->next) { - Base *base = BKE_view_layer_base_find(view_layer, cob->ob); - base->flag |= BASE_HIDDEN; - } - for (LayerCollection *lc_iter = lc->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { - layer_collection_bases_hide_recursive(view_layer, lc_iter); - } + for (CollectionObject *cob = lc->collection->gobject.first; cob; cob = cob->next) { + Base *base = BKE_view_layer_base_find(view_layer, cob->ob); + base->flag |= BASE_HIDDEN; + } + for (LayerCollection *lc_iter = lc->layer_collections.first; lc_iter; lc_iter = lc_iter->next) { + layer_collection_bases_hide_recursive(view_layer, lc_iter); + } } /** @@ -1073,72 +1103,75 @@ static void layer_collection_bases_hide_recursive(ViewLayer *view_layer, LayerCo * * Return true if depsgraph needs update. */ -bool BKE_layer_collection_set_visible(ViewLayer *view_layer, LayerCollection *lc, const bool visible, const bool hierarchy) -{ - bool depsgraph_changed = false; - - if (visible && - (!ID_IS_LINKED(lc->collection)) && - ((lc->collection->flag & COLLECTION_RESTRICT_VIEW) != 0)) - { - lc->collection->flag &= ~COLLECTION_RESTRICT_VIEW; - depsgraph_changed = true; - } - - if (hierarchy) { - if (visible) { - layer_collection_flag_unset_recursive(lc, LAYER_COLLECTION_RESTRICT_VIEW); - layer_collection_bases_show_recursive(view_layer, lc); - } - else { - layer_collection_flag_set_recursive(lc, LAYER_COLLECTION_RESTRICT_VIEW); - layer_collection_bases_hide_recursive(view_layer, lc); - } - } - else { - if (visible) { - lc->flag &= ~LAYER_COLLECTION_RESTRICT_VIEW; - } - else { - lc->flag |= LAYER_COLLECTION_RESTRICT_VIEW; - } - } - return depsgraph_changed; +bool BKE_layer_collection_set_visible(ViewLayer *view_layer, + LayerCollection *lc, + const bool visible, + const bool hierarchy) +{ + bool depsgraph_changed = false; + + if (visible && (!ID_IS_LINKED(lc->collection)) && + ((lc->collection->flag & COLLECTION_RESTRICT_VIEW) != 0)) { + lc->collection->flag &= ~COLLECTION_RESTRICT_VIEW; + depsgraph_changed = true; + } + + if (hierarchy) { + if (visible) { + layer_collection_flag_unset_recursive(lc, LAYER_COLLECTION_RESTRICT_VIEW); + layer_collection_bases_show_recursive(view_layer, lc); + } + else { + layer_collection_flag_set_recursive(lc, LAYER_COLLECTION_RESTRICT_VIEW); + layer_collection_bases_hide_recursive(view_layer, lc); + } + } + else { + if (visible) { + lc->flag &= ~LAYER_COLLECTION_RESTRICT_VIEW; + } + else { + lc->flag |= LAYER_COLLECTION_RESTRICT_VIEW; + } + } + return depsgraph_changed; } /* ---------------------------------------------------------------------- */ -static LayerCollection *find_layer_collection_by_scene_collection(LayerCollection *lc, const Collection *collection) +static LayerCollection *find_layer_collection_by_scene_collection(LayerCollection *lc, + const Collection *collection) { - if (lc->collection == collection) { - return lc; - } + if (lc->collection == collection) { + return lc; + } - for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) { - LayerCollection *found = find_layer_collection_by_scene_collection(nlc, collection); - if (found) { - return found; - } - } - return NULL; + for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) { + LayerCollection *found = find_layer_collection_by_scene_collection(nlc, collection); + if (found) { + return found; + } + } + return NULL; } /** * Return the first matching LayerCollection in the ViewLayer for the Collection. */ -LayerCollection *BKE_layer_collection_first_from_scene_collection(ViewLayer *view_layer, const Collection *collection) +LayerCollection *BKE_layer_collection_first_from_scene_collection(ViewLayer *view_layer, + const Collection *collection) { - for (LayerCollection *layer_collection = view_layer->layer_collections.first; - layer_collection != NULL; - layer_collection = layer_collection->next) - { - LayerCollection *found = find_layer_collection_by_scene_collection(layer_collection, collection); + for (LayerCollection *layer_collection = view_layer->layer_collections.first; + layer_collection != NULL; + layer_collection = layer_collection->next) { + LayerCollection *found = find_layer_collection_by_scene_collection(layer_collection, + collection); - if (found != NULL) { - return found; - } - } - return NULL; + if (found != NULL) { + return found; + } + } + return NULL; } /** @@ -1146,7 +1179,7 @@ LayerCollection *BKE_layer_collection_first_from_scene_collection(ViewLayer *vie */ bool BKE_view_layer_has_collection(ViewLayer *view_layer, const Collection *collection) { - return BKE_layer_collection_first_from_scene_collection(view_layer, collection) != NULL; + return BKE_layer_collection_first_from_scene_collection(view_layer, collection) != NULL; } /** @@ -1154,13 +1187,14 @@ bool BKE_view_layer_has_collection(ViewLayer *view_layer, const Collection *coll */ bool BKE_scene_has_object(Scene *scene, Object *ob) { - for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - Base *base = BKE_view_layer_base_find(view_layer, ob); - if (base) { - return true; - } - } - return false; + for (ViewLayer *view_layer = scene->view_layers.first; view_layer; + view_layer = view_layer->next) { + Base *base = BKE_view_layer_base_find(view_layer, ob); + if (base) { + return true; + } + } + return false; } /** \} */ @@ -1172,94 +1206,94 @@ bool BKE_scene_has_object(Scene *scene, Object *ob) * \{ */ typedef struct LayerObjectBaseIteratorData { - View3D *v3d; - Base *base; + View3D *v3d; + Base *base; } LayerObjectBaseIteratorData; static bool object_bases_iterator_is_valid(View3D *v3d, Base *base, const int flag) { - BLI_assert((v3d == NULL) || (v3d->spacetype == SPACE_VIEW3D)); + BLI_assert((v3d == NULL) || (v3d->spacetype == SPACE_VIEW3D)); - /* Any flag satisfies the condition. */ - if (flag == ~0) { - return (base->flag != 0); - } + /* Any flag satisfies the condition. */ + if (flag == ~0) { + return (base->flag != 0); + } - /* Flags may be more than one flag, so we can't check != 0. */ - return BASE_VISIBLE(v3d, base) && ((base->flag & flag) == flag); + /* Flags may be more than one flag, so we can't check != 0. */ + return BASE_VISIBLE(v3d, base) && ((base->flag & flag) == flag); } static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in_v, const int flag) { - ObjectsVisibleIteratorData *data_in = data_in_v; - ViewLayer *view_layer = data_in->view_layer; - View3D *v3d = data_in->v3d; - Base *base = view_layer->object_bases.first; + ObjectsVisibleIteratorData *data_in = data_in_v; + ViewLayer *view_layer = data_in->view_layer; + View3D *v3d = data_in->v3d; + Base *base = view_layer->object_bases.first; - /* when there are no objects */ - if (base == NULL) { - iter->data = NULL; - iter->valid = false; - return; - } + /* when there are no objects */ + if (base == NULL) { + iter->data = NULL; + iter->valid = false; + return; + } - LayerObjectBaseIteratorData *data = MEM_callocN(sizeof(LayerObjectBaseIteratorData), __func__); - iter->data = data; + LayerObjectBaseIteratorData *data = MEM_callocN(sizeof(LayerObjectBaseIteratorData), __func__); + iter->data = data; - data->v3d = v3d; - data->base = base; + data->v3d = v3d; + data->base = base; - if (object_bases_iterator_is_valid(v3d, base, flag) == false) { - object_bases_iterator_next(iter, flag); - } - else { - iter->current = base; - } + if (object_bases_iterator_is_valid(v3d, base, flag) == false) { + object_bases_iterator_next(iter, flag); + } + else { + iter->current = base; + } } static void object_bases_iterator_next(BLI_Iterator *iter, const int flag) { - LayerObjectBaseIteratorData *data = iter->data; - Base *base = data->base->next; + LayerObjectBaseIteratorData *data = iter->data; + Base *base = data->base->next; - while (base) { - if (object_bases_iterator_is_valid(data->v3d, base, flag)) { - iter->current = base; - data->base = base; - return; - } - base = base->next; - } + while (base) { + if (object_bases_iterator_is_valid(data->v3d, base, flag)) { + iter->current = base; + data->base = base; + return; + } + base = base->next; + } - iter->valid = false; + iter->valid = false; } static void object_bases_iterator_end(BLI_Iterator *iter) { - MEM_SAFE_FREE(iter->data); + MEM_SAFE_FREE(iter->data); } static void objects_iterator_begin(BLI_Iterator *iter, void *data_in, const int flag) { - object_bases_iterator_begin(iter, data_in, flag); + object_bases_iterator_begin(iter, data_in, flag); - if (iter->valid) { - iter->current = ((Base *)iter->current)->object; - } + if (iter->valid) { + iter->current = ((Base *)iter->current)->object; + } } static void objects_iterator_next(BLI_Iterator *iter, const int flag) { - object_bases_iterator_next(iter, flag); + object_bases_iterator_next(iter, flag); - if (iter->valid) { - iter->current = ((Base *)iter->current)->object; - } + if (iter->valid) { + iter->current = ((Base *)iter->current)->object; + } } static void objects_iterator_end(BLI_Iterator *iter) { - object_bases_iterator_end(iter); + object_bases_iterator_end(iter); } /* -------------------------------------------------------------------- */ @@ -1269,17 +1303,17 @@ static void objects_iterator_end(BLI_Iterator *iter) void BKE_view_layer_selected_objects_iterator_begin(BLI_Iterator *iter, void *data_in) { - objects_iterator_begin(iter, data_in, BASE_VISIBLE | BASE_SELECTED); + objects_iterator_begin(iter, data_in, BASE_VISIBLE | BASE_SELECTED); } void BKE_view_layer_selected_objects_iterator_next(BLI_Iterator *iter) { - objects_iterator_next(iter, BASE_VISIBLE | BASE_SELECTED); + objects_iterator_next(iter, BASE_VISIBLE | BASE_SELECTED); } void BKE_view_layer_selected_objects_iterator_end(BLI_Iterator *iter) { - objects_iterator_end(iter); + objects_iterator_end(iter); } /** \} */ @@ -1290,17 +1324,17 @@ void BKE_view_layer_selected_objects_iterator_end(BLI_Iterator *iter) void BKE_view_layer_visible_objects_iterator_begin(BLI_Iterator *iter, void *data_in) { - objects_iterator_begin(iter, data_in, 0); + objects_iterator_begin(iter, data_in, 0); } void BKE_view_layer_visible_objects_iterator_next(BLI_Iterator *iter) { - objects_iterator_next(iter, 0); + objects_iterator_next(iter, 0); } void BKE_view_layer_visible_objects_iterator_end(BLI_Iterator *iter) { - objects_iterator_end(iter); + objects_iterator_end(iter); } /** \} */ @@ -1311,30 +1345,30 @@ void BKE_view_layer_visible_objects_iterator_end(BLI_Iterator *iter) void BKE_view_layer_selected_editable_objects_iterator_begin(BLI_Iterator *iter, void *data_in) { - objects_iterator_begin(iter, data_in, BASE_VISIBLE | BASE_SELECTED); - if (iter->valid) { - if (BKE_object_is_libdata((Object *)iter->current) == false) { - // First object is valid (selectable and not libdata) -> all good. - return; - } - else { - // Object is selectable but not editable -> search for another one. - BKE_view_layer_selected_editable_objects_iterator_next(iter); - } - } + objects_iterator_begin(iter, data_in, BASE_VISIBLE | BASE_SELECTED); + if (iter->valid) { + if (BKE_object_is_libdata((Object *)iter->current) == false) { + // First object is valid (selectable and not libdata) -> all good. + return; + } + else { + // Object is selectable but not editable -> search for another one. + BKE_view_layer_selected_editable_objects_iterator_next(iter); + } + } } void BKE_view_layer_selected_editable_objects_iterator_next(BLI_Iterator *iter) { - // Search while there are objects and the one we have is not editable (editable = not libdata). - do { - objects_iterator_next(iter, BASE_VISIBLE | BASE_SELECTED); - } while (iter->valid && BKE_object_is_libdata((Object *)iter->current) != false); + // Search while there are objects and the one we have is not editable (editable = not libdata). + do { + objects_iterator_next(iter, BASE_VISIBLE | BASE_SELECTED); + } while (iter->valid && BKE_object_is_libdata((Object *)iter->current) != false); } void BKE_view_layer_selected_editable_objects_iterator_end(BLI_Iterator *iter) { - objects_iterator_end(iter); + objects_iterator_end(iter); } /** \} */ @@ -1345,17 +1379,17 @@ void BKE_view_layer_selected_editable_objects_iterator_end(BLI_Iterator *iter) void BKE_view_layer_selected_bases_iterator_begin(BLI_Iterator *iter, void *data_in) { - objects_iterator_begin(iter, data_in, BASE_VISIBLE | BASE_SELECTED); + objects_iterator_begin(iter, data_in, BASE_VISIBLE | BASE_SELECTED); } void BKE_view_layer_selected_bases_iterator_next(BLI_Iterator *iter) { - object_bases_iterator_next(iter, BASE_VISIBLE | BASE_SELECTED); + object_bases_iterator_next(iter, BASE_VISIBLE | BASE_SELECTED); } void BKE_view_layer_selected_bases_iterator_end(BLI_Iterator *iter) { - object_bases_iterator_end(iter); + object_bases_iterator_end(iter); } /** \} */ @@ -1366,17 +1400,17 @@ void BKE_view_layer_selected_bases_iterator_end(BLI_Iterator *iter) void BKE_view_layer_visible_bases_iterator_begin(BLI_Iterator *iter, void *data_in) { - object_bases_iterator_begin(iter, data_in, 0); + object_bases_iterator_begin(iter, data_in, 0); } void BKE_view_layer_visible_bases_iterator_next(BLI_Iterator *iter) { - object_bases_iterator_next(iter, 0); + object_bases_iterator_next(iter, 0); } void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter) { - object_bases_iterator_end(iter); + object_bases_iterator_end(iter); } /** \} */ @@ -1387,63 +1421,62 @@ void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter) static bool base_is_in_mode(struct ObjectsInModeIteratorData *data, Base *base) { - return BASE_VISIBLE(data->v3d, base) && - (base->object->type == data->object_type) && - (base->object->mode & data->object_mode) != 0; + return BASE_VISIBLE(data->v3d, base) && (base->object->type == data->object_type) && + (base->object->mode & data->object_mode) != 0; } void BKE_view_layer_bases_in_mode_iterator_begin(BLI_Iterator *iter, void *data_in) { - struct ObjectsInModeIteratorData *data = data_in; - Base *base = data->base_active; + struct ObjectsInModeIteratorData *data = data_in; + Base *base = data->base_active; - /* when there are no objects */ - if (base == NULL) { - iter->valid = false; - return; - } - iter->data = data_in; - iter->current = base; + /* when there are no objects */ + if (base == NULL) { + iter->valid = false; + return; + } + iter->data = data_in; + iter->current = base; - /* default type is active object type */ - if (data->object_type < 0) { - data->object_type = base->object->type; - } + /* default type is active object type */ + if (data->object_type < 0) { + data->object_type = base->object->type; + } - if (!base_is_in_mode(data, base)) { - BKE_view_layer_bases_in_mode_iterator_next(iter); - } + if (!base_is_in_mode(data, base)) { + BKE_view_layer_bases_in_mode_iterator_next(iter); + } } void BKE_view_layer_bases_in_mode_iterator_next(BLI_Iterator *iter) { - struct ObjectsInModeIteratorData *data = iter->data; - Base *base = iter->current; - - if (base == data->base_active) { - /* first step */ - base = data->view_layer->object_bases.first; - if (base == data->base_active) { - base = base->next; - } - } - else { - base = base->next; - } - - while (base) { - if ((base != data->base_active) && base_is_in_mode(data, base)) { - iter->current = base; - return; - } - base = base->next; - } - iter->valid = false; + struct ObjectsInModeIteratorData *data = iter->data; + Base *base = iter->current; + + if (base == data->base_active) { + /* first step */ + base = data->view_layer->object_bases.first; + if (base == data->base_active) { + base = base->next; + } + } + else { + base = base->next; + } + + while (base) { + if ((base != data->base_active) && base_is_in_mode(data, base)) { + iter->current = base; + return; + } + base = base->next; + } + iter->valid = false; } void BKE_view_layer_bases_in_mode_iterator_end(BLI_Iterator *UNUSED(iter)) { - /* do nothing */ + /* do nothing */ } /** \} */ @@ -1454,60 +1487,58 @@ void BKE_view_layer_bases_in_mode_iterator_end(BLI_Iterator *UNUSED(iter)) * and stores those in base->flag. BASE_VISIBLE is based on viewport visibility. */ void BKE_base_eval_flags(Base *base) { - /* Apply collection flags. */ - base->flag &= ~g_base_collection_flags; - base->flag |= (base->flag_from_collection & g_base_collection_flags); - - /* Apply object restrictions. */ - const int object_restrict = base->object->restrictflag; - if (object_restrict & OB_RESTRICT_VIEW) { - base->flag &= ~BASE_ENABLED_VIEWPORT; - } - if (object_restrict & OB_RESTRICT_RENDER) { - base->flag &= ~BASE_ENABLED_RENDER; - } - if (object_restrict & OB_RESTRICT_SELECT) { - base->flag &= ~BASE_SELECTABLE; - } - - /* Apply viewport visibility by default. The dependency graph for render - * can change these again, but for tools we always want the viewport - * visibility to be in sync regardless if depsgraph was evaluated. */ - if (!(base->flag & BASE_ENABLED_VIEWPORT) || (base->flag & BASE_HIDDEN)) { - base->flag &= ~(BASE_VISIBLE | BASE_SELECTABLE); - } - - /* Deselect unselectable objects. */ - if (!(base->flag & BASE_SELECTABLE)) { - base->flag &= ~BASE_SELECTED; - } -} - -static void layer_eval_view_layer( - struct Depsgraph *depsgraph, - struct Scene *UNUSED(scene), - ViewLayer *view_layer) -{ - DEG_debug_print_eval(depsgraph, __func__, view_layer->name, view_layer); - - /* Create array of bases, for fast index-based lookup. */ - const int num_object_bases = BLI_listbase_count(&view_layer->object_bases); - MEM_SAFE_FREE(view_layer->object_bases_array); - view_layer->object_bases_array = MEM_malloc_arrayN( - num_object_bases, sizeof(Base *), "view_layer->object_bases_array"); - int base_index = 0; - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - view_layer->object_bases_array[base_index++] = base; - } -} - -void BKE_layer_eval_view_layer_indexed( - struct Depsgraph *depsgraph, - struct Scene *scene, - int view_layer_index) -{ - BLI_assert(view_layer_index >= 0); - ViewLayer *view_layer = BLI_findlink(&scene->view_layers, view_layer_index); - BLI_assert(view_layer != NULL); - layer_eval_view_layer(depsgraph, scene, view_layer); + /* Apply collection flags. */ + base->flag &= ~g_base_collection_flags; + base->flag |= (base->flag_from_collection & g_base_collection_flags); + + /* Apply object restrictions. */ + const int object_restrict = base->object->restrictflag; + if (object_restrict & OB_RESTRICT_VIEW) { + base->flag &= ~BASE_ENABLED_VIEWPORT; + } + if (object_restrict & OB_RESTRICT_RENDER) { + base->flag &= ~BASE_ENABLED_RENDER; + } + if (object_restrict & OB_RESTRICT_SELECT) { + base->flag &= ~BASE_SELECTABLE; + } + + /* Apply viewport visibility by default. The dependency graph for render + * can change these again, but for tools we always want the viewport + * visibility to be in sync regardless if depsgraph was evaluated. */ + if (!(base->flag & BASE_ENABLED_VIEWPORT) || (base->flag & BASE_HIDDEN)) { + base->flag &= ~(BASE_VISIBLE | BASE_SELECTABLE); + } + + /* Deselect unselectable objects. */ + if (!(base->flag & BASE_SELECTABLE)) { + base->flag &= ~BASE_SELECTED; + } +} + +static void layer_eval_view_layer(struct Depsgraph *depsgraph, + struct Scene *UNUSED(scene), + ViewLayer *view_layer) +{ + DEG_debug_print_eval(depsgraph, __func__, view_layer->name, view_layer); + + /* Create array of bases, for fast index-based lookup. */ + const int num_object_bases = BLI_listbase_count(&view_layer->object_bases); + MEM_SAFE_FREE(view_layer->object_bases_array); + view_layer->object_bases_array = MEM_malloc_arrayN( + num_object_bases, sizeof(Base *), "view_layer->object_bases_array"); + int base_index = 0; + for (Base *base = view_layer->object_bases.first; base; base = base->next) { + view_layer->object_bases_array[base_index++] = base; + } +} + +void BKE_layer_eval_view_layer_indexed(struct Depsgraph *depsgraph, + struct Scene *scene, + int view_layer_index) +{ + BLI_assert(view_layer_index >= 0); + ViewLayer *view_layer = BLI_findlink(&scene->view_layers, view_layer_index); + BLI_assert(view_layer != NULL); + layer_eval_view_layer(depsgraph, scene, view_layer); } |