From d1972e50cbef6e2a40ffc259f10e08493511dc66 Mon Sep 17 00:00:00 2001 From: Chris Clyne Date: Thu, 26 Mar 2020 19:33:27 +0100 Subject: Add option to Copy the active view layer, and add an empty view layer Modify the view layer add operator (and underlying `BKE_view_layer_add`) to allow for copying the current view layer, as well as adding a new one but with all LayerCollections disabled by default (this is important for heavy scenes where currently adding view layers can take a long time due to enabling every collection by default). Reviewed By: mont29 Differential Revision: https://developer.blender.org/D6862 --- source/blender/blenkernel/BKE_layer.h | 11 +++++- source/blender/blenkernel/intern/layer.c | 59 +++++++++++++++++++++++++++----- source/blender/blenkernel/intern/scene.c | 2 +- 3 files changed, 62 insertions(+), 10 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index 19eb40debe6..7059675ec7d 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -44,10 +44,19 @@ struct Scene; struct View3D; struct ViewLayer; +typedef enum eViewLayerCopyMethod { + VIEWLAYER_ADD_NEW = 0, + VIEWLAYER_ADD_EMPTY = 1, + VIEWLAYER_ADD_COPY = 2, +} eViewLayerCopyMethod; + struct ViewLayer *BKE_view_layer_default_view(const struct Scene *scene); struct ViewLayer *BKE_view_layer_default_render(const struct Scene *scene); struct ViewLayer *BKE_view_layer_find(const struct Scene *scene, const char *layer_name); -struct ViewLayer *BKE_view_layer_add(struct Scene *scene, const char *name); +struct ViewLayer *BKE_view_layer_add(Scene *scene, + const char *name, + ViewLayer *view_layer_source, + const int type); /* DEPRECATED */ struct ViewLayer *BKE_view_layer_context_active_PLACEHOLDER(const struct Scene *scene); diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 8b3a46a3eb5..ffa1eecc87b 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -178,27 +178,70 @@ static ViewLayer *view_layer_add(const char *name) return view_layer; } +static void layer_collection_exclude_all(LayerCollection *layer_collection) +{ + LayerCollection *sub_collection = layer_collection->layer_collections.first; + for (; sub_collection != NULL; sub_collection = sub_collection->next) { + sub_collection->flag |= LAYER_COLLECTION_EXCLUDE; + layer_collection_exclude_all(sub_collection); + } +} + /** * Add a new view layer * by default, a view layer has the master collection */ -ViewLayer *BKE_view_layer_add(Scene *scene, const char *name) +ViewLayer *BKE_view_layer_add(Scene *scene, + const char *name, + ViewLayer *view_layer_source, + const int type) { - ViewLayer *view_layer = view_layer_add(name); + ViewLayer *view_layer_new; + + if (view_layer_source) { + name = view_layer_source->name; + } + + switch (type) { + default: + case VIEWLAYER_ADD_NEW: { + view_layer_new = view_layer_add(name); + BLI_addtail(&scene->view_layers, view_layer_new); + BKE_layer_collection_sync(scene, view_layer_new); + break; + } + case VIEWLAYER_ADD_COPY: { + /* Allocate and copy view layer data */ + view_layer_new = MEM_callocN(sizeof(ViewLayer), "View Layer"); + BLI_addtail(&scene->view_layers, view_layer_new); + BKE_view_layer_copy_data(scene, scene, view_layer_new, view_layer_source, 0); + + BLI_strncpy_utf8(view_layer_new->name, name, sizeof(view_layer_new->name)); + break; + } + case VIEWLAYER_ADD_EMPTY: { + view_layer_new = view_layer_add(name); + BLI_addtail(&scene->view_layers, view_layer_new); - BLI_addtail(&scene->view_layers, view_layer); + /* Initialise layercollections */ + BKE_layer_collection_sync(scene, view_layer_new); + layer_collection_exclude_all(view_layer_new->layer_collections.first); + + /* Update collections after changing visibility */ + BKE_layer_collection_sync(scene, view_layer_new); + break; + } + } /* unique name */ BLI_uniquename(&scene->view_layers, - view_layer, + view_layer_new, DATA_("ViewLayer"), '.', offsetof(ViewLayer, name), - sizeof(view_layer->name)); - - BKE_layer_collection_sync(scene, view_layer); + sizeof(view_layer_new->name)); - return view_layer; + return view_layer_new; } void BKE_view_layer_free(ViewLayer *view_layer) diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 23bd7ae3c8c..b12402d74fc 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -211,7 +211,7 @@ static void scene_init_data(ID *id) /* Master Collection */ scene->master_collection = BKE_collection_master_add(); - BKE_view_layer_add(scene, "View Layer"); + BKE_view_layer_add(scene, "View Layer", NULL, VIEWLAYER_ADD_NEW); } static void scene_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) -- cgit v1.2.3