diff options
Diffstat (limited to 'source/blender/blenkernel/intern/layer.c')
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 226 |
1 files changed, 159 insertions, 67 deletions
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index ac582ff69ca..06d69b6ff61 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -39,6 +39,7 @@ #include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" #include "DNA_workspace_types.h" +#include "DNA_world_types.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_debug.h" @@ -55,7 +56,8 @@ static CLG_LogRef LOG = {"bke.layercollection"}; /* Set of flags which are dependent on a collection settings. */ -static const short g_base_collection_flags = (BASE_VISIBLE_DEPSGRAPH | BASE_VISIBLE_VIEWLAYER | +static const short g_base_collection_flags = (BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | + BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT | BASE_SELECTABLE | BASE_ENABLED_VIEWPORT | BASE_ENABLED_RENDER | BASE_HOLDOUT | BASE_INDIRECT_ONLY); @@ -282,9 +284,10 @@ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user) MEM_freeN(view_layer); } -void BKE_view_layer_selected_objects_tag(ViewLayer *view_layer, const int tag) +void BKE_view_layer_selected_objects_tag(const Scene *scene, ViewLayer *view_layer, const int tag) { - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + BKE_view_layer_synced_ensure(scene, view_layer); + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { if ((base->flag & BASE_SELECTED) != 0) { base->object->flag |= tag; } @@ -307,9 +310,10 @@ static bool find_scene_collection_in_scene_collections(ListBase *lb, const Layer return false; } -Object *BKE_view_layer_camera_find(ViewLayer *view_layer) +Object *BKE_view_layer_camera_find(const Scene *scene, ViewLayer *view_layer) { - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + BKE_view_layer_synced_ensure(scene, view_layer); + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { if (base->object->type == OB_CAMERA) { return base->object; } @@ -377,6 +381,8 @@ static void view_layer_bases_hash_create(ViewLayer *view_layer, const bool do_ba Base *BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob) { + BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0, + "View layer out of sync, invoke BKE_view_layer_synced_ensure."); if (!view_layer->object_bases_hash) { view_layer_bases_hash_create(view_layer, false); } @@ -384,11 +390,10 @@ Base *BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob) return BLI_ghash_lookup(view_layer->object_bases_hash, ob); } -void BKE_view_layer_base_deselect_all(ViewLayer *view_layer) +void BKE_view_layer_base_deselect_all(const Scene *scene, ViewLayer *view_layer) { - Base *base; - - for (base = view_layer->object_bases.first; base; base = base->next) { + BKE_view_layer_synced_ensure(scene, view_layer); + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { base->flag &= ~BASE_SELECTED; } } @@ -500,7 +505,9 @@ void BKE_view_layer_copy_data(Scene *scene_dst, /* Copy layer collections and object bases. */ /* Inline 'BLI_duplicatelist' and update the active base. */ BLI_listbase_clear(&view_layer_dst->object_bases); - LISTBASE_FOREACH (Base *, base_src, &view_layer_src->object_bases) { + BLI_assert_msg((view_layer_src->flag & VIEW_LAYER_OUT_OF_SYNC) == 0, + "View Layer Object Base out of sync, invoke BKE_view_layer_synced_ensure."); + LISTBASE_FOREACH (const Base *, base_src, &view_layer_src->object_bases) { Base *base_dst = MEM_dupallocN(base_src); BLI_addtail(&view_layer_dst->object_bases, base_dst); if (view_layer_src->basact == base_src) { @@ -571,7 +578,7 @@ void BKE_view_layer_rename(Main *bmain, Scene *scene, ViewLayer *view_layer, con } /* Dependency graph uses view layer name based lookups. */ - DEG_id_tag_update(&scene->id, 0); + DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); } /* LayerCollection */ @@ -955,6 +962,36 @@ static void layer_collection_resync_unused_layers_free(ViewLayer *view_layer, } } +void BKE_view_layer_need_resync_tag(struct ViewLayer *view_layer) +{ + view_layer->flag |= VIEW_LAYER_OUT_OF_SYNC; +} + +void BKE_view_layer_synced_ensure(const Scene *scene, struct ViewLayer *view_layer) +{ + if (view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) { + BKE_layer_collection_sync(scene, view_layer); + view_layer->flag &= ~VIEW_LAYER_OUT_OF_SYNC; + } +} + +void BKE_scene_view_layers_synced_ensure(const Scene *scene) +{ + LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { + BKE_view_layer_synced_ensure(scene, view_layer); + } +} + +void BKE_main_view_layers_synced_ensure(const Main *bmain) +{ + for (const Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) { + BKE_scene_view_layers_synced_ensure(scene); + } + + /* NOTE: This is not (yet?) covered by the dirty tag and differed re-sync system */ + BKE_layer_collection_local_sync_all(bmain); +} + static void layer_collection_objects_sync(ViewLayer *view_layer, LayerCollection *layer, ListBase *r_lb_new_object_bases, @@ -997,11 +1034,12 @@ static void layer_collection_objects_sync(ViewLayer *view_layer, } if ((collection_restrict & COLLECTION_HIDE_VIEWPORT) == 0) { - base->flag_from_collection |= (BASE_ENABLED_VIEWPORT | BASE_VISIBLE_DEPSGRAPH); + base->flag_from_collection |= (BASE_ENABLED_VIEWPORT | + BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT); if ((layer_restrict & LAYER_COLLECTION_HIDE) == 0) { - base->flag_from_collection |= BASE_VISIBLE_VIEWLAYER; + base->flag_from_collection |= BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT; } - if (((collection_restrict & COLLECTION_HIDE_SELECT) == 0)) { + if ((collection_restrict & COLLECTION_HIDE_SELECT) == 0) { base->flag_from_collection |= BASE_SELECTABLE; } } @@ -1011,7 +1049,7 @@ static void layer_collection_objects_sync(ViewLayer *view_layer, } /* Holdout and indirect only */ - if ((layer->flag & LAYER_COLLECTION_HOLDOUT) || (base->object->visibility_flag & OB_HOLDOUT)) { + if ((layer->flag & LAYER_COLLECTION_HOLDOUT)) { base->flag_from_collection |= BASE_HOLDOUT; } if (layer->flag & LAYER_COLLECTION_INDIRECT_ONLY) { @@ -1047,8 +1085,14 @@ static void layer_collection_sync(ViewLayer *view_layer, BLI_assert(layer_resync->is_used); + uint64_t skipped_children = 0; LISTBASE_FOREACH (CollectionChild *, child, &layer_resync->collection->children) { Collection *child_collection = child->collection; + /* Collection relations may not have rebuild yet. */ + if (child_collection == NULL) { + skipped_children++; + continue; + } LayerCollectionResync *child_layer_resync = layer_collection_resync_find(layer_resync, child_collection); @@ -1153,7 +1197,7 @@ static void layer_collection_sync(ViewLayer *view_layer, /* Replace layer collection list with new one. */ layer_resync->layer->layer_collections = new_lb_layer; - BLI_assert(BLI_listbase_count(&layer_resync->collection->children) == + BLI_assert(BLI_listbase_count(&layer_resync->collection->children) - skipped_children == BLI_listbase_count(&new_lb_layer)); /* Update bases etc. for objects. */ @@ -1339,7 +1383,7 @@ void BKE_scene_collection_sync(const Scene *scene) } LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); } } @@ -1405,7 +1449,10 @@ void BKE_main_collection_sync_remap(const Main *bmain) /** \name Object Selection * \{ */ -bool BKE_layer_collection_objects_select(ViewLayer *view_layer, LayerCollection *lc, bool deselect) +bool BKE_layer_collection_objects_select(const Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc, + bool deselect) { if (lc->collection->flag & COLLECTION_HIDE_SELECT) { return false; @@ -1414,6 +1461,7 @@ bool BKE_layer_collection_objects_select(ViewLayer *view_layer, LayerCollection bool changed = false; if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) { + BKE_view_layer_synced_ensure(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); @@ -1435,30 +1483,34 @@ bool BKE_layer_collection_objects_select(ViewLayer *view_layer, LayerCollection } LISTBASE_FOREACH (LayerCollection *, iter, &lc->layer_collections) { - changed |= BKE_layer_collection_objects_select(view_layer, iter, deselect); + changed |= BKE_layer_collection_objects_select(scene, view_layer, iter, deselect); } return changed; } -bool BKE_layer_collection_has_selected_objects(ViewLayer *view_layer, LayerCollection *lc) +bool BKE_layer_collection_has_selected_objects(const Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc) { if (lc->collection->flag & COLLECTION_HIDE_SELECT) { return false; } if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) { + BKE_view_layer_synced_ensure(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); - if (base && (base->flag & BASE_SELECTED) && (base->flag & BASE_VISIBLE_DEPSGRAPH)) { + if (base && (base->flag & BASE_SELECTED) && + (base->flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT)) { return true; } } } LISTBASE_FOREACH (LayerCollection *, iter, &lc->layer_collections) { - if (BKE_layer_collection_has_selected_objects(view_layer, iter)) { + if (BKE_layer_collection_has_selected_objects(scene, view_layer, iter)) { return true; } } @@ -1491,7 +1543,8 @@ void BKE_base_set_visible(Scene *scene, ViewLayer *view_layer, Base *base, bool { if (!extend) { /* Make only one base visible. */ - LISTBASE_FOREACH (Base *, other, &view_layer->object_bases) { + BKE_view_layer_synced_ensure(scene, view_layer); + LISTBASE_FOREACH (Base *, other, BKE_view_layer_object_bases_get(view_layer)) { other->flag |= BASE_HIDDEN; } @@ -1502,17 +1555,17 @@ void BKE_base_set_visible(Scene *scene, ViewLayer *view_layer, Base *base, bool base->flag ^= BASE_HIDDEN; } - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); } bool BKE_base_is_visible(const View3D *v3d, const Base *base) { - if ((base->flag & BASE_VISIBLE_DEPSGRAPH) == 0) { + if ((base->flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT) == 0) { return false; } if (v3d == NULL) { - return base->flag & BASE_VISIBLE_VIEWLAYER; + return base->flag & BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT; } if ((v3d->localvd) && ((v3d->local_view_uuid & base->local_view_bits) == 0)) { @@ -1527,7 +1580,7 @@ bool BKE_base_is_visible(const View3D *v3d, const Base *base) return (v3d->local_collections_uuid & base->local_collections_bits) != 0; } - return base->flag & BASE_VISIBLE_VIEWLAYER; + return base->flag & BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT; } bool BKE_object_is_visible_in_viewport(const View3D *v3d, const struct Object *ob) @@ -1553,7 +1606,7 @@ bool BKE_object_is_visible_in_viewport(const View3D *v3d, const struct Object *o /* If not using local collection the object may still be in a hidden collection. */ if ((v3d->flag & V3D_LOCAL_COLLECTIONS) == 0) { - return (ob->base_flag & BASE_VISIBLE_VIEWLAYER) != 0; + return (ob->base_flag & BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT) != 0; } return true; @@ -1581,7 +1634,7 @@ static void layer_collection_flag_unset_recursive(LayerCollection *lc, const int } } -void BKE_layer_collection_isolate_global(Scene *scene, +void BKE_layer_collection_isolate_global(Scene *UNUSED(scene), ViewLayer *view_layer, LayerCollection *lc, bool extend) @@ -1626,7 +1679,7 @@ void BKE_layer_collection_isolate_global(Scene *scene, BKE_layer_collection_activate(view_layer, lc); } - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); } static void layer_collection_local_visibility_set_recursive(LayerCollection *layer_collection, @@ -1647,9 +1700,10 @@ static void layer_collection_local_visibility_unset_recursive(LayerCollection *l } } -static void layer_collection_local_sync(ViewLayer *view_layer, +static void layer_collection_local_sync(const Scene *scene, + ViewLayer *view_layer, LayerCollection *layer_collection, - const unsigned short local_collections_uuid, + const ushort local_collections_uuid, bool visible) { if ((layer_collection->local_collections_bits & local_collections_uuid) == 0) { @@ -1662,6 +1716,7 @@ static void layer_collection_local_sync(ViewLayer *view_layer, continue; } + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, cob->ob); base->local_collections_bits |= local_collections_uuid; } @@ -1669,26 +1724,27 @@ static void layer_collection_local_sync(ViewLayer *view_layer, LISTBASE_FOREACH (LayerCollection *, child, &layer_collection->layer_collections) { if ((child->flag & LAYER_COLLECTION_EXCLUDE) == 0) { - layer_collection_local_sync(view_layer, child, local_collections_uuid, visible); + layer_collection_local_sync(scene, view_layer, child, local_collections_uuid, visible); } } } -void BKE_layer_collection_local_sync(ViewLayer *view_layer, const View3D *v3d) +void BKE_layer_collection_local_sync(const Scene *scene, ViewLayer *view_layer, const View3D *v3d) { if (no_resync) { return; } - const unsigned short local_collections_uuid = v3d->local_collections_uuid; + const ushort local_collections_uuid = v3d->local_collections_uuid; /* Reset flags and set the bases visible by default. */ - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + BKE_view_layer_synced_ensure(scene, view_layer); + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { base->local_collections_bits &= ~local_collections_uuid; } LISTBASE_FOREACH (LayerCollection *, layer_collection, &view_layer->layer_collections) { - layer_collection_local_sync(view_layer, layer_collection, local_collections_uuid, true); + layer_collection_local_sync(scene, view_layer, layer_collection, local_collections_uuid, true); } } @@ -1707,7 +1763,7 @@ void BKE_layer_collection_local_sync_all(const Main *bmain) } View3D *v3d = area->spacedata.first; if (v3d->flag & V3D_LOCAL_COLLECTIONS) { - BKE_layer_collection_local_sync(view_layer, v3d); + BKE_layer_collection_local_sync(scene, view_layer, v3d); } } } @@ -1715,10 +1771,8 @@ void BKE_layer_collection_local_sync_all(const Main *bmain) } } -void BKE_layer_collection_isolate_local(ViewLayer *view_layer, - const View3D *v3d, - LayerCollection *lc, - bool extend) +void BKE_layer_collection_isolate_local( + const Scene *scene, ViewLayer *view_layer, const View3D *v3d, LayerCollection *lc, bool extend) { LayerCollection *lc_master = view_layer->layer_collections.first; bool hide_it = extend && ((v3d->local_collections_uuid & lc->local_collections_bits) != 0); @@ -1758,36 +1812,43 @@ void BKE_layer_collection_isolate_local(ViewLayer *view_layer, layer_collection_local_visibility_set_recursive(lc, v3d->local_collections_uuid); } - BKE_layer_collection_local_sync(view_layer, v3d); + BKE_layer_collection_local_sync(scene, view_layer, v3d); } -static void layer_collection_bases_show_recursive(ViewLayer *view_layer, LayerCollection *lc) +static void layer_collection_bases_show_recursive(const Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc) { if ((lc->flag & LAYER_COLLECTION_EXCLUDE) == 0) { + BKE_view_layer_synced_ensure(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); base->flag &= ~BASE_HIDDEN; } } LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc->layer_collections) { - layer_collection_bases_show_recursive(view_layer, lc_iter); + layer_collection_bases_show_recursive(scene, view_layer, lc_iter); } } -static void layer_collection_bases_hide_recursive(ViewLayer *view_layer, LayerCollection *lc) +static void layer_collection_bases_hide_recursive(const Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc) { if ((lc->flag & LAYER_COLLECTION_EXCLUDE) == 0) { + BKE_view_layer_synced_ensure(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); base->flag |= BASE_HIDDEN; } } LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc->layer_collections) { - layer_collection_bases_hide_recursive(view_layer, lc_iter); + layer_collection_bases_hide_recursive(scene, view_layer, lc_iter); } } -void BKE_layer_collection_set_visible(ViewLayer *view_layer, +void BKE_layer_collection_set_visible(const Scene *scene, + ViewLayer *view_layer, LayerCollection *lc, const bool visible, const bool hierarchy) @@ -1795,11 +1856,11 @@ void BKE_layer_collection_set_visible(ViewLayer *view_layer, if (hierarchy) { if (visible) { layer_collection_flag_unset_recursive(lc, LAYER_COLLECTION_HIDE); - layer_collection_bases_show_recursive(view_layer, lc); + layer_collection_bases_show_recursive(scene, view_layer, lc); } else { layer_collection_flag_set_recursive(lc, LAYER_COLLECTION_HIDE); - layer_collection_bases_hide_recursive(view_layer, lc); + layer_collection_bases_hide_recursive(scene, view_layer, lc); } } else { @@ -1894,6 +1955,7 @@ bool BKE_view_layer_has_collection(const ViewLayer *view_layer, const Collection bool BKE_scene_has_object(Scene *scene, Object *ob) { LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { return true; @@ -1933,7 +1995,7 @@ static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in_v, con ObjectsVisibleIteratorData *data_in = data_in_v; ViewLayer *view_layer = data_in->view_layer; const View3D *v3d = data_in->v3d; - Base *base = view_layer->object_bases.first; + Base *base = BKE_view_layer_object_bases_get(view_layer)->first; /* when there are no objects */ if (base == NULL) { @@ -2010,12 +2072,13 @@ 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_DEPSGRAPH | BASE_SELECTED); + objects_iterator_begin( + iter, data_in, BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | BASE_SELECTED); } void BKE_view_layer_selected_objects_iterator_next(BLI_Iterator *iter) { - objects_iterator_next(iter, BASE_VISIBLE_DEPSGRAPH | BASE_SELECTED); + objects_iterator_next(iter, BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | BASE_SELECTED); } void BKE_view_layer_selected_objects_iterator_end(BLI_Iterator *iter) @@ -2052,7 +2115,8 @@ 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_DEPSGRAPH | BASE_SELECTED); + objects_iterator_begin( + iter, data_in, BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | BASE_SELECTED); if (iter->valid) { if (BKE_object_is_libdata((Object *)iter->current) == false) { /* First object is valid (selectable and not libdata) -> all good. */ @@ -2069,7 +2133,7 @@ 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_DEPSGRAPH | BASE_SELECTED); + objects_iterator_next(iter, BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | BASE_SELECTED); } while (iter->valid && BKE_object_is_libdata((Object *)iter->current) != false); } @@ -2086,12 +2150,13 @@ 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_DEPSGRAPH | BASE_SELECTED); + objects_iterator_begin( + iter, data_in, BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | BASE_SELECTED); } void BKE_view_layer_selected_bases_iterator_next(BLI_Iterator *iter) { - object_bases_iterator_next(iter, BASE_VISIBLE_DEPSGRAPH | BASE_SELECTED); + object_bases_iterator_next(iter, BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | BASE_SELECTED); } void BKE_view_layer_selected_bases_iterator_end(BLI_Iterator *iter) @@ -2218,7 +2283,8 @@ void BKE_base_eval_flags(Base *base) * 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_DEPSGRAPH | BASE_VISIBLE_VIEWLAYER | BASE_SELECTABLE); + base->flag &= ~(BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT | + BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT | BASE_SELECTABLE); } /* Deselect unselectable objects. */ @@ -2228,18 +2294,19 @@ void BKE_base_eval_flags(Base *base) } static void layer_eval_view_layer(struct Depsgraph *depsgraph, - struct Scene *UNUSED(scene), + struct Scene *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); + BKE_view_layer_synced_ensure(scene, view_layer); + const int num_object_bases = BLI_listbase_count(BKE_view_layer_object_bases_get(view_layer)); 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; - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { view_layer->object_bases_array[base_index++] = base; } } @@ -2269,10 +2336,11 @@ static void write_layer_collections(BlendWriter *writer, ListBase *lb) } } -void BKE_view_layer_blend_write(BlendWriter *writer, ViewLayer *view_layer) +void BKE_view_layer_blend_write(BlendWriter *writer, const Scene *scene, ViewLayer *view_layer) { + BKE_view_layer_synced_ensure(scene, view_layer); BLO_write_struct(writer, ViewLayer, view_layer); - BLO_write_struct_list(writer, Base, &view_layer->object_bases); + BLO_write_struct_list(writer, Base, BKE_view_layer_object_bases_get(view_layer)); if (view_layer->id_properties) { IDP_BlendWrite(writer, view_layer->id_properties); @@ -2302,7 +2370,7 @@ static void direct_link_layer_collections(BlendDataReader *reader, ListBase *lb, BLO_read_data_address(reader, &lc->scene_collection); #endif - /* Master collection is not a real data-lock. */ + /* Master collection is not a real data-block. */ if (master) { BLO_read_data_address(reader, &lc->collection); } @@ -2342,7 +2410,7 @@ static void lib_link_layer_collection(BlendLibReader *reader, LayerCollection *layer_collection, bool master) { - /* Master collection is not a real data-lock. */ + /* Master collection is not a real data-block. */ if (!master) { BLO_read_id_address(reader, lib, &layer_collection->collection); } @@ -2383,7 +2451,7 @@ void BKE_view_layer_blend_read_lib(BlendLibReader *reader, Library *lib, ViewLay BLO_read_id_address(reader, lib, &view_layer->mat_override); - IDP_BlendReadLib(reader, view_layer->id_properties); + IDP_BlendReadLib(reader, lib, view_layer->id_properties); } /** \} */ @@ -2588,12 +2656,36 @@ ViewLayer *BKE_view_layer_find_with_lightgroup(struct Scene *scene, return NULL; } -void BKE_view_layer_rename_lightgroup(ViewLayer *view_layer, +void BKE_view_layer_rename_lightgroup(Scene *scene, + ViewLayer *view_layer, ViewLayerLightgroup *lightgroup, const char *name) { + char old_name[64]; + BLI_strncpy_utf8(old_name, lightgroup->name, sizeof(old_name)); BLI_strncpy_utf8(lightgroup->name, name, sizeof(lightgroup->name)); viewlayer_lightgroup_make_name_unique(view_layer, lightgroup); + + if (scene != NULL) { + /* Update objects in the scene to refer to the new name instead. */ + FOREACH_SCENE_OBJECT_BEGIN (scene, ob) { + if (!ID_IS_LINKED(ob) && ob->lightgroup != NULL) { + LightgroupMembership *lgm = ob->lightgroup; + if (STREQ(lgm->name, old_name)) { + BLI_strncpy_utf8(lgm->name, lightgroup->name, sizeof(lgm->name)); + } + } + } + FOREACH_SCENE_OBJECT_END; + + /* Update the scene's world to refer to the new name instead. */ + if (scene->world != NULL && !ID_IS_LINKED(scene->world) && scene->world->lightgroup != NULL) { + LightgroupMembership *lgm = scene->world->lightgroup; + if (STREQ(lgm->name, old_name)) { + BLI_strncpy_utf8(lgm->name, lightgroup->name, sizeof(lgm->name)); + } + } + } } void BKE_lightgroup_membership_get(struct LightgroupMembership *lgm, char *name) |