Fix FOREACH_SCENE_COLLECTION/FOREACH_SCENE_OBJECT for nested collections
authorDalai Felinto <dfelinto@gmail.com>
Wed, 3 Jan 2018 21:28:19 +0000 (19:28 -0200)
committerDalai Felinto <dfelinto@gmail.com>
Wed, 3 Jan 2018 21:33:00 +0000 (19:33 -0200)
This fixes any function that relied on these iterators such as:
* Outliner Same Type
* Metaballs
* scene.objects

We were not considering the collections when there was collections nested
to the collections nested to the master collection.

It includes a unittest.

source/blender/blenkernel/intern/collection.c
tests/python/view_layer/CMakeLists.txt
tests/python/view_layer/test_scene_objects.py [new file with mode: 0644]

index e2b10de575cdb87f1355ebee6b6e4f91f36c1f9a..4830e9456cdde18ce6f758f2da701fc78e1adc39 100644 (file)
@@ -725,6 +725,7 @@ void BKE_scene_collections_iterator_begin(BLI_Iterator *iter, void *data_in)
 
        data->owner_id = owner_id;
        iter->data = data;
+       iter->valid = true;
 
        scene_collections_array(owner_id, (SceneCollection ***)&data->array, &data->tot);
        BLI_assert(data->tot != 0);
index eaaf25b38890e95026971fd4774605976ca870cf..3f7149a67ad12744437ad23f1064e90951d81765 100644 (file)
@@ -178,5 +178,6 @@ VIEW_LAYER_TEST(scene_copy_d)
 VIEW_LAYER_TEST(scene_copy_e)
 VIEW_LAYER_TEST(scene_copy_f)
 VIEW_LAYER_TEST(scene_delete)
+VIEW_LAYER_TEST(scene_objects)
 VIEW_LAYER_TEST(scene_write_read)
 VIEW_LAYER_TEST(view_layer_rename)
diff --git a/tests/python/view_layer/test_scene_objects.py b/tests/python/view_layer/test_scene_objects.py
new file mode 100644 (file)
index 0000000..3fae126
--- /dev/null
@@ -0,0 +1,58 @@
+# ############################################################
+# Importing - Same For All Render Layer Tests
+# ############################################################
+
+import unittest
+import os
+import sys
+
+from view_layer_common import *
+
+
+# ############################################################
+# Testing
+# ############################################################
+
+class UnitTesting(ViewLayerTesting):
+    def test_scene_objects_a(self):
+        """
+        Test vanilla scene
+        """
+        import bpy
+
+        scene = bpy.context.scene
+        self.assertEqual(len(scene.objects), 3)
+
+    def test_scene_objects_b(self):
+        """
+        Test scene with nested collections
+        """
+        import bpy
+        scene = bpy.context.scene
+
+        # move default objects to a nested collection
+        master_collection = scene.master_collection
+        collection = master_collection.collections[0]
+        collection_nested = collection.collections.new()
+
+        for ob in collection.objects:
+            collection_nested.objects.link(ob)
+
+        while collection.objects:
+            collection.objects.unlink(collection.objects[0])
+
+        self.assertEqual(len(scene.objects), 3)
+
+
+# ############################################################
+# 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()