From 3592c959e7563ad1a308a5d52d3bb261fc274153 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Mon, 21 Nov 2016 20:10:16 +0100 Subject: Layers - initial commit This is mostly DNA + doversion and some util functions. I need to look at the layer-manager branch to see how Julian Eisel (Severin) managed to handle nested lists (required for collections). Also, since I think doversioning may get more complex as the project evolves, I started the vesioning_280.c file. And the changes in readfile.c were so that I could include into the versioning_280.c file only the DNA_* that were really needed. (if someone feels like doing a cleanup, I'm sure the other versioning_*.c files could use the same treatment) --- source/blender/blenkernel/BKE_scene.h | 7 ++ source/blender/blenkernel/intern/scene.c | 137 ++++++++++++++++++++- source/blender/blenloader/CMakeLists.txt | 1 + source/blender/blenloader/intern/readfile.c | 40 ++++++ source/blender/blenloader/intern/readfile.h | 3 + source/blender/blenloader/intern/versioning_280.c | 116 +++++++++++++++++ .../blenloader/intern/versioning_defaults.c | 3 + source/blender/blenloader/intern/writefile.c | 25 ++++ source/blender/makesdna/DNA_object_types.h | 4 +- source/blender/makesdna/DNA_scene_types.h | 71 +++++++++-- 10 files changed, 395 insertions(+), 12 deletions(-) create mode 100644 source/blender/blenloader/intern/versioning_280.c diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index d2152950bff..23eadf6ac84 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -44,6 +44,8 @@ struct Main; struct Object; struct QuicktimeCodecData; struct RenderData; +struct LayerCollection; +struct SceneLayer; struct SceneRenderLayer; struct Scene; struct UnitSettings; @@ -124,6 +126,11 @@ void BKE_scene_update_tagged(struct EvaluationContext *eval_ctx, struct Main *bm void BKE_scene_update_for_newframe(struct EvaluationContext *eval_ctx, struct Main *bmain, struct Scene *sce, unsigned int lay); void BKE_scene_update_for_newframe_ex(struct EvaluationContext *eval_ctx, struct Main *bmain, struct Scene *sce, unsigned int lay, bool do_invisible_flush); +struct SceneLayer *BKE_scene_add_layer(struct Scene *sce, const char *name); +bool BKE_scene_remove_layer(struct Main *main, struct Scene *scene, struct SceneLayer *sl); +struct LayerCollection *BKE_scene_add_collection(struct SceneLayer *sl, const char *name); +bool BKE_scene_remove_collection(struct Main *main, struct SceneLayer *sl, struct LayerCollection *lc); + struct SceneRenderLayer *BKE_scene_add_render_layer(struct Scene *sce, const char *name); bool BKE_scene_remove_render_layer(struct Main *main, struct Scene *scene, struct SceneRenderLayer *srl); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 125d6962332..8a02d4e6a0a 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -155,22 +155,25 @@ static void remove_sequencer_fcurves(Scene *sce) Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type) { Scene *scen; + SceneLayer *sl, *new_sl; SceneRenderLayer *srl, *new_srl; FreestyleLineSet *lineset; ToolSettings *ts; Base *base, *obase; if (type == SCE_COPY_EMPTY) { - ListBase rl, rv; + ListBase rl, rv, sl; scen = BKE_scene_add(bmain, sce->id.name + 2); rl = scen->r.layers; rv = scen->r.views; + sl = scen->layers; curvemapping_free_data(&scen->r.mblur_shutter_curve); scen->r = sce->r; scen->r.layers = rl; scen->r.actlay = 0; scen->r.views = rv; + scen->layers = sl; scen->unit = sce->unit; scen->physics_settings = sce->physics_settings; scen->gm = sce->gm; @@ -244,6 +247,36 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type) } new_srl = new_srl->next; } + + BLI_duplicatelist(&(scen->layers), &(sce->layers)); + new_sl = scen->layers.first; + for (sl = sce->layers.first; sl; sl->next) { + sl->obedit = NULL; + + BLI_duplicatelist(&(new_sl->base), &(sl->base)); + + obase = sl->base.first; + base = new_sl->base.first; + + while (base) { + id_us_plus(&base->object->id); + if (obase == sl->basact) new_sl->basact = base; + + obase = obase->next; + base = base->next; + } + + BLI_duplicatelist(&(new_sl->collections), &(sl->collections)); + + LayerCollection *lcn = new_sl->collections.first; + for (LayerCollection *lc = sl->collections.first; lc; lc = lc->next) { + BLI_duplicatelist(&(lcn->elements), &(lc->elements)); + BLI_duplicatelist(&(lcn->overrides), &(lc->overrides)); + lcn = lcn->next; + } + + new_sl = new_sl->next; + } } /* copy color management settings */ @@ -372,6 +405,7 @@ void BKE_scene_make_local(Main *bmain, Scene *sce, const bool lib_local) /** Free (or release) any data used by this scene (does not free the scene itself). */ void BKE_scene_free(Scene *sce) { + SceneLayer *sl; SceneRenderLayer *srl; BKE_animdata_free((ID *)sce, false); @@ -462,6 +496,18 @@ void BKE_scene_free(Scene *sce) BKE_previewimg_free(&sce->preview); curvemapping_free_data(&sce->r.mblur_shutter_curve); + + for (sl = sce->layers.first; sl; sl = sl->next) { + sl->basact = NULL; + BLI_freelistN(&sl->base); + + for (LayerCollection *lc = sl->collections.first; lc; lc = lc->next) { + BLI_freelistN(&lc->elements); + BLI_freelistN(&lc->overrides); + } + BLI_freelistN(&sl->collections); + } + BLI_freelistN(&sce->layers); } void BKE_scene_init(Scene *sce) @@ -792,6 +838,8 @@ void BKE_scene_init(Scene *sce) sce->toolsettings->gpencil_v2d_align = GP_PROJECT_VIEWSPACE; sce->toolsettings->gpencil_seq_align = GP_PROJECT_VIEWSPACE; sce->toolsettings->gpencil_ima_align = GP_PROJECT_VIEWSPACE; + + BKE_scene_add_layer(sce, NULL); } Scene *BKE_scene_add(Main *bmain, const char *name) @@ -1986,6 +2034,93 @@ void BKE_scene_update_for_newframe_ex(EvaluationContext *eval_ctx, Main *bmain, #endif } +LayerCollection *BKE_scene_add_collection(SceneLayer *sl, const char *name) +{ + LayerCollection *lc; + + lc = MEM_callocN(sizeof(LayerCollection), "new layer collection"); + BLI_strncpy(lc->name, name, sizeof(lc->name)); + BLI_uniquename(&sl->collections, lc, DATA_("Collection"), '.', offsetof(LayerCollection, name), sizeof(lc->name)); + BLI_addtail(&sl->collections, lc); + + return lc; +} + + +bool BKE_scene_remove_collection(Main *bmain, SceneLayer *sl, LayerCollection *lc) +{ + const int act = BLI_findindex(&sl->collections, lc); + if (act == -1) { + return false; + } + else if ( (sl->collections.first == sl->collections.last) && + (sl->collections.first == lc)) + { + /* ensure 1 layer is kept */ + return false; + } + + BLI_remlink(&sl->collections, lc); + + BLI_freelistN(&lc->elements); + BLI_freelistN(&lc->overrides); + MEM_freeN(lc); + + /* TODO only change active_collection if necessary */ + sl->active_collection = 0; + + return true; +} + +/* return default layer */ +SceneLayer *BKE_scene_add_layer(Scene *sce, const char *name) +{ + SceneLayer *sl; + + if (!name) + name = DATA_("SceneLayer"); + + sl = MEM_callocN(sizeof(SceneLayer), "new scene layer"); + BLI_strncpy(sl->name, name, sizeof(sl->name)); + BLI_uniquename(&sce->layers, sl, DATA_("Layer"), '.', offsetof(SceneLayer, name), sizeof(sl->name)); + + /* Initial collection */ + BKE_scene_add_collection(sl, "Collection"); + BLI_addtail(&sce->layers, sl); + return sl; +} + +bool BKE_scene_remove_layer(Main *bmain, Scene *scene, SceneLayer *sl) +{ + const int act = BLI_findindex(&scene->layers, sl); + if (act == -1) { + return false; + } + else if ( (scene->layers.first == scene->layers.last) && + (scene->layers.first == sl)) + { + /* ensure 1 layer is kept */ + return false; + } + + BLI_remlink(&scene->layers, sl); + + BLI_freelistN(&sl->base); + + for (LayerCollection *lc = sl->collections.first; lc; lc = lc->next) { + BLI_freelistN(&lc->elements); + BLI_freelistN(&lc->overrides); + } + + BLI_freelistN(&sl->collections); + MEM_freeN(sl); + + /* TODO only change active_layer if necessary */ + scene->active_layer = 0; + + return true; +} + /* return default layer, also used to patch old files */ SceneRenderLayer *BKE_scene_add_render_layer(Scene *sce, const char *name) { diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt index 8cb9ef837b2..e40692f4a88 100644 --- a/source/blender/blenloader/CMakeLists.txt +++ b/source/blender/blenloader/CMakeLists.txt @@ -53,6 +53,7 @@ set(SRC intern/versioning_250.c intern/versioning_260.c intern/versioning_270.c + intern/versioning_280.c intern/versioning_defaults.c intern/versioning_legacy.c intern/writefile.c diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 677c90051f7..3831bf92d17 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5234,6 +5234,7 @@ static void lib_link_scene(FileData *fd, Main *main) Scene *sce; Base *base, *next; Sequence *seq; + SceneLayer *sl; SceneRenderLayer *srl; FreestyleModuleConfig *fmc; FreestyleLineSet *fls; @@ -5359,6 +5360,22 @@ static void lib_link_scene(FileData *fd, Main *main) sce->nodetree->id.lib = sce->id.lib; composite_patch(sce->nodetree, sce); } + + for (sl = sce->layers.first; sl; sl = sl->next) { + for (base = sl->base.first; base; base = next) { + next = base->next; + + base->object = newlibadr_us(fd, sce->id.lib, base->object); + + if (base->object == NULL) { + blo_reportf_wrap(fd->reports, RPT_WARNING, TIP_("LIB: object lost from scene: '%s'"), + sce->id.name + 2); + BLI_remlink(&sl->base, base); + if (base == sl->basact) sl->basact = NULL; + MEM_freeN(base); + } + } + } for (srl = sce->r.layers.first; srl; srl = srl->next) { srl->mat_override = newlibadr_us(fd, sce->id.lib, srl->mat_override); @@ -5486,6 +5503,7 @@ static void direct_link_scene(FileData *fd, Scene *sce) Sequence *seq; MetaStack *ms; RigidBodyWorld *rbw; + SceneLayer *sl; SceneRenderLayer *srl; sce->theDag = NULL; @@ -5719,6 +5737,20 @@ static void direct_link_scene(FileData *fd, Scene *sce) sce->preview = direct_link_preview_image(fd, sce->preview); direct_link_curvemapping(fd, &sce->r.mblur_shutter_curve); + + link_list(fd, &(sce->layers)); + + for (sl = sce->layers.first; sl; sl = sl->next) { + sl->obedit = NULL; + link_list(fd, &(sl->base)); + sl->basact = newdataadr(fd, sl->basact); + link_list(fd, &(sl->collections)); + + for (LayerCollection *lc = sl->collections.first; lc; lc = lc->next) { + link_list(fd, &(lc->elements)); + link_list(fd, &(lc->overrides)); + } + } } /* ************ READ WM ***************** */ @@ -7959,6 +7991,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) blo_do_versions_250(fd, lib, main); blo_do_versions_260(fd, lib, main); blo_do_versions_270(fd, lib, main); + blo_do_versions_280(fd, lib, main); /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ /* WATCH IT 2!: Userdef struct init see do_versions_userdef() above! */ @@ -8988,6 +9021,7 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) static void expand_scene(FileData *fd, Main *mainvar, Scene *sce) { Base *base; + SceneLayer *sl; SceneRenderLayer *srl; FreestyleModuleConfig *module; FreestyleLineSet *lineset; @@ -9054,6 +9088,12 @@ static void expand_scene(FileData *fd, Main *mainvar, Scene *sce) } expand_doit(fd, mainvar, sce->clip); + + for (sl = sce->layers.first; sl; sl = sl->next) { + for (base = sl->base.first; base; base = base->next) { + expand_doit(fd, mainvar, base->object); + } + } } static void expand_camera(FileData *fd, Main *mainvar, Camera *ca) diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index 7719aaa2b0d..06d4c903382 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -34,6 +34,8 @@ #define __READFILE_H__ #include "zlib.h" +#include "DNA_sdna_types.h" +#include "DNA_space_types.h" #include "DNA_windowmanager_types.h" /* for ReportType */ struct OldNewMap; @@ -169,6 +171,7 @@ void blo_do_versions_pre250(struct FileData *fd, struct Library *lib, struct Mai void blo_do_versions_250(struct FileData *fd, struct Library *lib, struct Main *main); void blo_do_versions_260(struct FileData *fd, struct Library *lib, struct Main *main); void blo_do_versions_270(struct FileData *fd, struct Library *lib, struct Main *main); +void blo_do_versions_280(struct FileData *fd, struct Library *lib, struct Main *main); #endif diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c new file mode 100644 index 00000000000..3353a6df000 --- /dev/null +++ b/source/blender/blenloader/intern/versioning_280.c @@ -0,0 +1,116 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + * + */ + +/** \file blender/blenloader/intern/versioning_280.c + * \ingroup blenloader + */ + +/* for MinGW32 definition of NULL, could use BLI_blenlib.h instead too */ +#include + +/* allow readfile to use deprecated functionality */ +#define DNA_DEPRECATED_ALLOW + +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_genfile.h" + +#include "BKE_main.h" +#include "BKE_scene.h" + +#include "BLI_listbase.h" +#include "BLI_string.h" + +#include "BLO_readfile.h" + +#include "readfile.h" + +#include "MEM_guardedalloc.h" + +void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) +{ + if (!DNA_struct_elem_find(fd->filesdna, "Scene", "ListBase", "layers")) { + for (Scene *scene = main->scene.first; scene; scene = scene->id.next) { + SceneLayer *layer = MEM_callocN(sizeof(SceneLayer), "initial scene layer"); + LayerCollection *collections[20] = {NULL}; + scene->active_layer = 0; + + BLI_addhead(&scene->layers, layer); + int lay_used = 0; + + for (int i = 0; i < 20; i++) { + LayerCollection *collection = MEM_callocN(sizeof(LayerCollection), "doversion layer collections"); + collection->flag = COLLECTION_SELECTABLE; + + if (scene->lay & (1 << i)) { + collection->flag |= COLLECTION_VISIBLE; + } + + BLI_snprintf(collection->name, sizeof(collection->name), "%d", i); + collections[i] = collection; + } + + Base *base = scene->base.first; + while (base) { + Base *base_new = MEM_dupallocN(base); + BLI_addtail(&layer->base, base_new); + + if (base == scene->basact) { + layer->basact = base_new; + } + + lay_used |= base->lay & ((1 << 20) - 1); /* ignore localview */ + + for (int i = 0; i < 20; i++) { + if ((base->lay & (1 << i)) != 0) { + LinkData *link = MEM_callocN(sizeof(LinkData), "doversion linkdata"); + link->data = base_new; + BLI_addtail(&collections[i]->elements, link); + } + } + base = base->next; + } + + /* We should always have at least one layer, and one collection at all times */ + if (lay_used == 0) { + lay_used = (1 << 0); + } + + /* Cleanup */ + for (int i = 0; i < 20; i++) { + if ((lay_used & (1 << i)) != 0) { + BLI_addtail(&layer->collections, collections[i]); + } + else { + MEM_freeN(collections[i]); + } + } + + /* + * TODO handle existing SceneRenderLayer + * for (SceneRenderLayer *srl = scene->r.layers.first; srl; srl = srl->next); + */ + } + } + +} diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c index 01ef5d6a606..0e74c3f6170 100644 --- a/source/blender/blenloader/intern/versioning_defaults.c +++ b/source/blender/blenloader/intern/versioning_defaults.c @@ -25,6 +25,9 @@ * \ingroup blenloader */ +/* allow readfile to use deprecated functionality */ +#define DNA_DEPRECATED_ALLOW + #include "BLI_utildefines.h" #include "BLI_listbase.h" #include "BLI_math.h" diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index d8097f1a50a..31e81358a38 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -2407,10 +2407,12 @@ static void write_scenes(WriteData *wd, ListBase *scebase) Base *base; Editing *ed; Sequence *seq; + LayerCollection *lc; MetaStack *ms; Strip *strip; TimeMarker *marker; TransformOrientation *ts; + SceneLayer *sl; SceneRenderLayer *srl; SceneRenderView *srv; ToolSettings *tos; @@ -2585,6 +2587,29 @@ static void write_scenes(WriteData *wd, ListBase *scebase) writestruct(wd, DATA, TransformOrientation, 1, ts); } + /* writing scene layers to the blend file */ + for (sl = sce->layers.first; sl; sl = sl->next) { + writestruct(wd, DATA, SceneLayer, 1, sl); + + base = sl->base.first; + while (base) { + writestruct(wd, DATA, Base, 1, base); + base = base->next; + } + + for (lc = sl->collections.first; lc; lc = lc->next) { + writestruct(wd, DATA, LayerCollection, 1, lc); + + for (LinkData *link = lc->elements.first; link; link = link->next) { + writestruct(wd, DATA, LinkData, 1, link); + } + + for (CollectionOverride *ov = lc->overrides.first; ov; ov = ov->next) { + writestruct(wd, DATA, CollectionOverride, 1, ov); + } + } + } + for (srl = sce->r.layers.first; srl; srl = srl->next) { writestruct(wd, DATA, SceneRenderLayer, 1, srl); for (fmc = srl->freestyleConfig.modules.first; fmc; fmc = fmc->next) { diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index ccde6549d9c..6306e7b69c8 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -142,8 +142,8 @@ typedef struct Object { ListBase defbase; /* list of bDeformGroup (vertex groups) names and flag only */ ListBase modifiers; /* list of ModifierData structures */ - int mode; /* Local object mode */ - int restore_mode; /* Keep track of what mode to return to after toggling a mode */ + int mode DNA_DEPRECATED; /* Local object mode - deprecated in 2.8 */ + int restore_mode DNA_DEPRECATED; /* Keep track of what mode to return to after toggling a mode - deprecated in 2.8 */ /* materials */ struct Material **mat; /* material slots */ diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index cf367bf3205..8e5a1203334 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -69,15 +69,58 @@ struct ColorSpace; /* ************************************************************* */ /* Scene Data */ -/* Base - Wrapper for referencing Objects in a Scene */ +/* Base - Wrapper for referencing Objects in a SceneLayer */ typedef struct Base { struct Base *next, *prev; - unsigned int lay, selcol; + unsigned int lay DNA_DEPRECATED; /* deprecated in 2.8 */ + unsigned int selcol; int flag; short sx, sy; struct Object *object; } Base; +/* ************************************************************* */ + +typedef struct CollectionOverride { + struct CollectionOverride *next, *prev; + char name[64]; /* MAX_NAME */ + /* TODO - proper data */ +} CollectionOverride; + +/* Layers Data */ +typedef struct LayerCollection { + struct LayerCollection *next, *prev; + char name[64]; /* MAX_NAME */ + short flag; + short pad[3]; + ListBase elements; + ListBase overrides; + /* TODO nesting */ + /* TODO dynamic adding of elements (name based) */ +} LayerCollection; + +/* Render Layer */ +typedef struct SceneLayer { + struct SceneLayer *next, *prev; + + char name[64]; /* MAX_NAME */ + + char engine[32]; /* render engine */ + + int mode; /* active object mode */ + int restore_mode; /* Keep track of what mode to return to after toggling a mode */ + int pad; + short active_collection; + short pad2; + + ListBase base; + struct Base *basact; /* active base */ + struct Object *obedit; /* name replaces old G.obedit */ + + ListBase collections; +} SceneLayer; + + /* ************************************************************* */ /* Output Format Data */ @@ -665,8 +708,8 @@ typedef struct RenderData { rcti disprect; /* information on different layers to be rendered */ - ListBase layers; - short actlay; + ListBase layers DNA_DEPRECATED; /* deprecated in 2.8 */ + short actlay DNA_DEPRECATED; /* deprecated in 2.8 */ /* number of mblur samples */ short mblur_samples; @@ -748,7 +791,7 @@ typedef struct RenderData { float unit_line_thickness; /* in pixels */ /* render engine */ - char engine[32]; + char engine[32] DNA_DEPRECATED; /* deprecated in 2.8 */ /* Cycles baking */ struct BakeData bake; @@ -1549,9 +1592,9 @@ typedef struct Scene { struct Scene *set; - ListBase base; - struct Base *basact; /* active base */ - struct Object *obedit; /* name replaces old G.obedit */ + ListBase base DNA_DEPRECATED; + struct Base *basact DNA_DEPRECATED; /* active base - deprecated in 2.8 */ + struct Object *obedit DNA_DEPRECATED; /* name replaces old G.obedit - deprecated in 2.8 */ float cursor[3]; /* 3d cursor location */ float twcent[3]; /* center for transform widget */ @@ -1594,7 +1637,9 @@ typedef struct Scene { void *pad1; struct DagForest *theDag; short dagflags; - short pad3; + + /* to be named (workflow layers, view layers, render layers, ...) */ + short active_layer; /* User-Defined KeyingSets */ int active_keyingset; /* index of the active KeyingSet. first KeyingSet has index 1, 'none' active is 0, 'add new' is -1 */ @@ -1628,6 +1673,9 @@ typedef struct Scene { struct RigidBodyWorld *rigidbody_world; struct PreviewImage *preview; + + /* to be named (workflow layers, view layers, render layers, ...) */ + ListBase layers; } Scene; /* **************** RENDERDATA ********************* */ @@ -2219,6 +2267,11 @@ typedef enum eGPencil_Placement_Flags { #define USER_UNIT_OPT_SPLIT 1 #define USER_UNIT_ROT_RADIANS 2 +/* Collection */ +/* Collection->flag */ +#define COLLECTION_VISIBLE (1 << 0) +#define COLLECTION_SELECTABLE (1 << 1) + #ifdef __cplusplus } #endif -- cgit v1.2.3