diff options
author | Chris Clyne <lateasusual> | 2020-03-26 21:33:27 +0300 |
---|---|---|
committer | Bastien Montagne <b.mont29@gmail.com> | 2020-03-26 21:36:51 +0300 |
commit | d1972e50cbef6e2a40ffc259f10e08493511dc66 (patch) | |
tree | 1a32794c1c85fef8bc1307ecd7fb2ad562c20b91 /source/blender/blenkernel/intern/layer.c | |
parent | 839f0cfa41f2f209774b3a7d222529954a788466 (diff) |
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
Diffstat (limited to 'source/blender/blenkernel/intern/layer.c')
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 59 |
1 files changed, 51 insertions, 8 deletions
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) |