Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDalai Felinto <dalai@blender.org>2020-09-09 12:38:44 +0300
committerDalai Felinto <dalai@blender.org>2020-09-09 17:58:06 +0300
commita5db981b0ea044313239c3cc2ee92d19a8f682ea (patch)
tree2f2dc1bb4d5bcf97a50fb03b44d01c6afd925250 /source/blender
parentf8aad78830c185af50ab08f9362d637a23746447 (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')
-rw-r--r--source/blender/blenkernel/BKE_layer.h1
-rw-r--r--source/blender/blenkernel/intern/layer.c24
2 files changed, 25 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 52503f08153..b903545bd3b 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -99,6 +99,7 @@ void BKE_main_collection_sync(const struct Main *bmain);
void BKE_scene_collection_sync(const struct Scene *scene);
void BKE_layer_collection_sync(const struct Scene *scene, struct ViewLayer *view_layer);
void BKE_layer_collection_local_sync(struct ViewLayer *view_layer, const struct View3D *v3d);
+void BKE_layer_collection_local_sync_all(struct Main *bmain);
void BKE_main_collection_sync_remap(const struct Main *bmain);
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