diff options
author | Dalai Felinto <dalai@blender.org> | 2020-09-09 12:38:44 +0300 |
---|---|---|
committer | Dalai Felinto <dalai@blender.org> | 2020-09-09 17:58:06 +0300 |
commit | a5db981b0ea044313239c3cc2ee92d19a8f682ea (patch) | |
tree | 2f2dc1bb4d5bcf97a50fb03b44d01c6afd925250 /source/blender/blenkernel/intern/layer.c | |
parent | f8aad78830c185af50ab08f9362d637a23746447 (diff) |
Fix T76346: Moving objects in outliner doesn't update local collections
The fix involves going over ALL the possible combinations of viewlayers
and viewports and re-sync.
I tested this with multiple windows, multiple scenes and multiple
viewlayers.
Since (for now?) the operation of syncing the local layer collections is
not too expensive, this is not so bad. In theory we could improve this
by checking if the collection the object was moved to and from is in the
scene before iterating over it. I don't think it is worthy though.
Thanks Arun Parolikkal for the initial attempt on D8342.
Final patch reviewed by Brecht Van Lommel.
Diffstat (limited to 'source/blender/blenkernel/intern/layer.c')
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 4da59ff302d..2f1ad2559f9 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -931,6 +931,8 @@ void BKE_main_collection_sync(const Main *bmain) for (const Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) { BKE_scene_collection_sync(scene); } + + BKE_layer_collection_local_sync_all(bmain); } void BKE_main_collection_sync_remap(const Main *bmain) @@ -1246,6 +1248,28 @@ void BKE_layer_collection_local_sync(ViewLayer *view_layer, const View3D *v3d) } /** + * Sync the local collection for all the viewports. + */ +void BKE_layer_collection_local_sync_all(Main *bmain) +{ + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + if (area->spacetype != SPACE_VIEW3D) { + continue; + } + View3D *v3d = area->spacedata.first; + if (v3d->flag & V3D_LOCAL_COLLECTIONS) { + BKE_layer_collection_local_sync(view_layer, v3d); + } + } + } + } + } +} + +/** * Isolate the collection locally * * Same as BKE_layer_collection_isolate_local but for a viewport |