diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2018-02-09 14:04:00 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2018-02-09 14:05:27 +0300 |
commit | 25074be697cb5726328aa5d064a60788c1da6aeb (patch) | |
tree | e75abc47e1d5c0db7ab4fe4db1d5989f7015c101 | |
parent | 37e53ca5f3496f9a09f46afd1e4ff2f1d2d153df (diff) |
Fix collection syncing when creating new collections from the outliner
We were not passing a scene collection parent to the BKE_collection_add
function, which in turn made syncing not work.
Right now we:
* Explicitly pass the master collection in this case
* Fallback to the master collection in other cases
With unittest.
-rw-r--r-- | source/blender/blenkernel/intern/collection.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 1 | ||||
-rw-r--r-- | source/blender/editors/space_outliner/outliner_collections.c | 3 | ||||
-rw-r--r-- | tests/python/view_layer/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/python/view_layer/test_collection_new_sync.py | 47 |
5 files changed, 55 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index 729be02bfc7..69168c4dd3d 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -111,6 +111,10 @@ static SceneCollection *collection_add(ID *owner_id, SceneCollection *sc_parent, */ SceneCollection *BKE_collection_add(ID *owner_id, SceneCollection *sc_parent, const int type, const char *name_custom) { + if (sc_parent == NULL) { + sc_parent = BKE_collection_master(owner_id); + } + SceneCollection *scene_collection = collection_add(owner_id, sc_parent, type, name_custom); BKE_layer_sync_new_scene_collection(owner_id, sc_parent, scene_collection); return scene_collection; diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 9807c6e4f10..cb7b72bdabd 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -375,6 +375,7 @@ static void layer_collection_sync_flags( static void layer_collections_sync_flags(ListBase *layer_collections_dst, const ListBase *layer_collections_src) { + BLI_assert(BLI_listbase_count(layer_collections_dst) == BLI_listbase_count(layer_collections_src)); LayerCollection *layer_collection_dst = (LayerCollection *)layer_collections_dst->first; const LayerCollection *layer_collection_src = (const LayerCollection *)layer_collections_src->first; while (layer_collection_dst != NULL) { diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c index be4c8f62085..3d5f12a94fd 100644 --- a/source/blender/editors/space_outliner/outliner_collections.c +++ b/source/blender/editors/space_outliner/outliner_collections.c @@ -342,7 +342,8 @@ static int collection_new_exec(bContext *C, wmOperator *UNUSED(op)) Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); - SceneCollection *scene_collection = BKE_collection_add(&scene->id, NULL, COLLECTION_TYPE_NONE, NULL); + SceneCollection *scene_collection_parent = BKE_collection_master(&scene->id); + SceneCollection *scene_collection = BKE_collection_add(&scene->id, scene_collection_parent, COLLECTION_TYPE_NONE, NULL); BKE_collection_link(view_layer, scene_collection); DEG_relations_tag_update(bmain); diff --git a/tests/python/view_layer/CMakeLists.txt b/tests/python/view_layer/CMakeLists.txt index e308e2e0952..cc5a3ba54b1 100644 --- a/tests/python/view_layer/CMakeLists.txt +++ b/tests/python/view_layer/CMakeLists.txt @@ -62,6 +62,7 @@ endmacro() VIEW_LAYER_TEST(active_collection) VIEW_LAYER_TEST(background_set) +VIEW_LAYER_TEST(collection_new_sync) VIEW_LAYER_TEST(collection_rename_a) VIEW_LAYER_TEST(collection_rename_b) VIEW_LAYER_TEST(evaluation_render_settings_a) diff --git a/tests/python/view_layer/test_collection_new_sync.py b/tests/python/view_layer/test_collection_new_sync.py new file mode 100644 index 00000000000..582e6c13d89 --- /dev/null +++ b/tests/python/view_layer/test_collection_new_sync.py @@ -0,0 +1,47 @@ +# ############################################################ +# Importing - Same For All Render Layer Tests +# ############################################################ + +import unittest +import os +import sys + +from view_layer_common import * + + +# ############################################################ +# Testing +# ############################################################ + +class UnitTesting(ViewLayerTesting): + def test_view_layer_syncing(self): + """ + See if we can copy view layers. + """ + import bpy + scene = bpy.context.scene + view_layer = scene.view_layers.new("All") + + self.assertEqual(len(view_layer.collections), 1) + self.assertEqual(view_layer.collections[0].collection, scene.master_collection) + + self.assertEqual( + {collection.name for collection in view_layer.collections[0].collections}, + {'Collection 1'}) + + self.assertEqual( + bpy.ops.outliner.collection_new(), + {'FINISHED'}) + + self.assertEqual( + {collection.name for collection in view_layer.collections[0].collections}, + {'Collection 1', 'Collection 2'}) + + +# ############################################################ +# Main - Same For All Render Layer Tests +# ############################################################ + +if __name__ == '__main__': + UnitTesting._extra_arguments = setup_extra_arguments(__file__) + unittest.main() |