Fix FOREACH_SCENE_COLLECTION/FOREACH_SCENE_OBJECT for nested collections

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.
This commit is contained in:
Dalai Felinto 2018-01-03 19:28:19 -02:00
parent 10f0635d32
commit e1cbac715a
3 changed files with 60 additions and 0 deletions

View 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);

View 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)

View File

@ -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()