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.
This commit is contained in:
@@ -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)
|
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);
|
SceneCollection *scene_collection = collection_add(owner_id, sc_parent, type, name_custom);
|
||||||
BKE_layer_sync_new_scene_collection(owner_id, sc_parent, scene_collection);
|
BKE_layer_sync_new_scene_collection(owner_id, sc_parent, scene_collection);
|
||||||
return scene_collection;
|
return scene_collection;
|
||||||
|
@@ -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)
|
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;
|
LayerCollection *layer_collection_dst = (LayerCollection *)layer_collections_dst->first;
|
||||||
const LayerCollection *layer_collection_src = (const LayerCollection *)layer_collections_src->first;
|
const LayerCollection *layer_collection_src = (const LayerCollection *)layer_collections_src->first;
|
||||||
while (layer_collection_dst != NULL) {
|
while (layer_collection_dst != NULL) {
|
||||||
|
@@ -342,7 +342,8 @@ static int collection_new_exec(bContext *C, wmOperator *UNUSED(op))
|
|||||||
Main *bmain = CTX_data_main(C);
|
Main *bmain = CTX_data_main(C);
|
||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
ViewLayer *view_layer = CTX_data_view_layer(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);
|
BKE_collection_link(view_layer, scene_collection);
|
||||||
|
|
||||||
DEG_relations_tag_update(bmain);
|
DEG_relations_tag_update(bmain);
|
||||||
|
@@ -62,6 +62,7 @@ endmacro()
|
|||||||
|
|
||||||
VIEW_LAYER_TEST(active_collection)
|
VIEW_LAYER_TEST(active_collection)
|
||||||
VIEW_LAYER_TEST(background_set)
|
VIEW_LAYER_TEST(background_set)
|
||||||
|
VIEW_LAYER_TEST(collection_new_sync)
|
||||||
VIEW_LAYER_TEST(collection_rename_a)
|
VIEW_LAYER_TEST(collection_rename_a)
|
||||||
VIEW_LAYER_TEST(collection_rename_b)
|
VIEW_LAYER_TEST(collection_rename_b)
|
||||||
VIEW_LAYER_TEST(evaluation_render_settings_a)
|
VIEW_LAYER_TEST(evaluation_render_settings_a)
|
||||||
|
47
tests/python/view_layer/test_collection_new_sync.py
Normal file
47
tests/python/view_layer/test_collection_new_sync.py
Normal file
@@ -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()
|
Reference in New Issue
Block a user