Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Clyne <lateasusual>2020-03-26 21:33:27 +0300
committerBastien Montagne <b.mont29@gmail.com>2020-03-26 21:36:51 +0300
commitd1972e50cbef6e2a40ffc259f10e08493511dc66 (patch)
tree1a32794c1c85fef8bc1307ecd7fb2ad562c20b91 /source/blender/blenkernel
parent839f0cfa41f2f209774b3a7d222529954a788466 (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')
-rw-r--r--source/blender/blenkernel/BKE_layer.h11
-rw-r--r--source/blender/blenkernel/intern/layer.c59
-rw-r--r--source/blender/blenkernel/intern/scene.c2
3 files changed, 62 insertions, 10 deletions
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)