[Bf-blender-cvs] [3592c95] layers: Layers - initial commit
Dalai Felinto
noreply at git.blender.org
Mon Nov 21 20:12:31 CET 2016
Commit: 3592c959e7563ad1a308a5d52d3bb261fc274153
Author: Dalai Felinto
Date: Mon Nov 21 20:10:16 2016 +0100
Branches: layers
https://developer.blender.org/rB3592c959e7563ad1a308a5d52d3bb261fc274153
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)
===================================================================
M source/blender/blenkernel/BKE_scene.h
M source/blender/blenkernel/intern/scene.c
M source/blender/blenloader/CMakeLists.txt
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/readfile.h
A source/blender/blenloader/intern/versioning_280.c
M source/blender/blenloader/intern/versioning_defaults.c
M source/blender/blenloader/intern/writefile.c
M source/blender/makesdna/DNA_object_types.h
M source/blender/makesdna/DNA_scene_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index d215295..23eadf6 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 125d696..8a02d4e 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 8cb9ef8..e40692f 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 677c900..3831bf9 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, s
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list