From 18ce2bfac63046acb484857498caf0af7178c094 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 16 Aug 2017 10:31:02 +0200 Subject: Depsgraph/Layers: Keep original visibility when doing full scene copy Originally we were not respecting the original visibility flags of the collections. However this is required for Copy-on-write (CoW). Remember to update the svn lib tests folder. I had to update some of the json files there. Also adding a new unittest for this particular issue: Test render_layer_scene_copy_f --- tests/python/render_layer/CMakeLists.txt | 1 + tests/python/render_layer/test_scene_copy_d.py | 2 +- tests/python/render_layer/test_scene_copy_f.py | 94 ++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 tests/python/render_layer/test_scene_copy_f.py (limited to 'tests/python') diff --git a/tests/python/render_layer/CMakeLists.txt b/tests/python/render_layer/CMakeLists.txt index b3c064289a0..5ff985073e3 100644 --- a/tests/python/render_layer/CMakeLists.txt +++ b/tests/python/render_layer/CMakeLists.txt @@ -170,5 +170,6 @@ RENDER_LAYER_TEST(scene_copy_b) RENDER_LAYER_TEST(scene_copy_c) RENDER_LAYER_TEST(scene_copy_d) RENDER_LAYER_TEST(scene_copy_e) +RENDER_LAYER_TEST(scene_copy_f) RENDER_LAYER_TEST(scene_delete) RENDER_LAYER_TEST(scene_write_read) diff --git a/tests/python/render_layer/test_scene_copy_d.py b/tests/python/render_layer/test_scene_copy_d.py index 54988f49036..f398650eade 100644 --- a/tests/python/render_layer/test_scene_copy_d.py +++ b/tests/python/render_layer/test_scene_copy_d.py @@ -16,7 +16,7 @@ from render_layer_common import * class UnitTesting(RenderLayerTesting): def test_scene_layers_link(self): """ - See if scene copying 'FULL_COPY' is working for scene layers + See if scene copying 'LINK_OBJECTS' is working for scene layers """ import os ROOT = self.get_root() diff --git a/tests/python/render_layer/test_scene_copy_f.py b/tests/python/render_layer/test_scene_copy_f.py new file mode 100644 index 00000000000..fd4298675f2 --- /dev/null +++ b/tests/python/render_layer/test_scene_copy_f.py @@ -0,0 +1,94 @@ +# ############################################################ +# Importing - Same For All Render Layer Tests +# ############################################################ + +import unittest +import os +import sys + +from render_layer_common import * + + +# ############################################################ +# Testing +# ############################################################ + +class UnitTesting(RenderLayerTesting): + def test_shared_layer_collections_copy_full(self): + """ + See if scene copying 'FULL_COPY' is keeping collections visibility + and selectability. + """ + import os + import bpy + + scene = bpy.context.scene + + hide_lookup = [0, 1, 1, 0] + hide_lookup_sub = [1, 0, 1] + + hide_select_lookup = [0, 0, 1, 1] + hide_select_lookup_sub = [1, 0, 1, 0] + new_collections = [] + + # clean everything + for layer in scene.render_layers: + while layer.collections: + layer.collections.unlink(layer.collections[0]) + + # create new collections + for i in range(4): + collection = scene.master_collection.collections.new(str(i)) + new_collections.append(collection) + + for j in range(3): + sub_collection = collection.collections.new("{0}:{1}".format(i, j)) + + # link to the original scene + for layer in scene.render_layers: + for i, collection in enumerate(new_collections): + layer.collections.link(collection) + self.assertEqual(layer.collections[-1], layer.collections[i]) + + layer.collections[i].hide = hide_lookup[i] + layer.collections[i].hide_select = hide_select_lookup[i] + + for j, sub_collection in enumerate(layer.collections[i].collections): + sub_collection.hide = hide_lookup_sub[j] + sub_collection.hide_select = hide_select_lookup_sub[j] + + # copy scene + bpy.ops.scene.new(type='FULL_COPY') + new_scene = bpy.context.scene + self.assertNotEqual(scene, new_scene) + + # update depsgrah + scene.update() # update depsgraph + + # compare scenes + for h, layer in enumerate(scene.render_layers): + new_layer = new_scene.render_layers[h] + + for i, collection in enumerate(layer.collections): + new_collection = new_layer.collections[i] + self.assertEqual(collection.hide, new_collection.hide) + self.assertEqual(collection.hide_select, new_collection.hide_select) + + for j, sub_collection in enumerate(layer.collections[i].collections): + new_sub_collection = new_collection.collections[j] + self.assertEqual(sub_collection.hide, new_sub_collection.hide) + self.assertEqual(sub_collection.hide_select, new_sub_collection.hide_select) + + +# ############################################################ +# Main - Same For All Render Layer Tests +# ############################################################ + +if __name__ == '__main__': + import sys + + extra_arguments = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [] + sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 2:] if "--" in sys.argv else []) + + UnitTesting._extra_arguments = extra_arguments + unittest.main() -- cgit v1.2.3