[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