[Bf-blender-cvs] [b4799b2] render-layers: RNA (start), and some refactor (scene.main_collection)

Dalai Felinto noreply at git.blender.org
Fri Dec 2 17:56:12 CET 2016


Commit: b4799b23eceac635f583f88eaa7141e1021404ce
Author: Dalai Felinto
Date:   Fri Dec 2 16:29:10 2016 +0100
Branches: render-layers
https://developer.blender.org/rBb4799b23eceac635f583f88eaa7141e1021404ce

RNA (start), and some refactor (scene.main_collection)

Instead of storing a libstbase in scene, we simply store a collection, the api (RNA) is much more clear now

===================================================================

M	source/blender/blenkernel/BKE_collection.h
M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/readfile.h
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_scene.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h
index cf11202..e286efe 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -32,12 +32,11 @@ extern "C" {
 #endif
 
 struct SceneCollection;
-struct ListBase;
 struct Object;
 struct Scene;
 
-struct SceneCollection *BKE_collection_add(struct Scene *scene, struct ListBase *lb, const char *name);
-void BKE_collection_remove(struct Scene *scene, struct SceneCollection *sc);
+struct SceneCollection *BKE_collection_add(struct Scene *scene, struct SceneCollection *sc_parent, const char *name);
+bool BKE_collection_remove(struct Scene *scene, struct SceneCollection *sc);
 struct SceneCollection *BKE_collection_master(struct Scene *scene);
 void BKE_collection_object_add(struct Scene *scene, struct SceneCollection *sc, struct Object *object);
 
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 726a8cc..41603f2 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -42,19 +42,15 @@
  * Add a collection to a collection ListBase and syncronize all render layers
  * The ListBase is NULL when the collection is to be added to the master collection
  */
-SceneCollection *BKE_collection_add(Scene *scene, ListBase *lb, const char *name)
+SceneCollection *BKE_collection_add(Scene *scene, SceneCollection *sc_parent, const char *name)
 {
 	SceneCollection *sc = MEM_callocN(sizeof(SceneCollection), "New Collection");
+	SceneCollection *sc_master = BKE_collection_master(scene);
+
 	BLI_strncpy(sc->name, name, sizeof(sc->name));
-	BLI_uniquename(&scene->collections, sc, DATA_("Collection"), '.', offsetof(SceneCollection, name), sizeof(sc->name));
+	BLI_uniquename(&sc_master->collections, sc, DATA_("Collection"), '.', offsetof(SceneCollection, name), sizeof(sc->name));
 
-	if (lb) {
-		BLI_addtail(lb, sc);
-	}
-	else {
-		SceneCollection *sc_master = BKE_collection_master(scene);
-		BLI_addtail(&sc_master->collections, sc);
-	}
+	BLI_addtail(&sc_parent->collections, sc);
 
 	TODO_LAYER_SYNC;
 	return sc;
@@ -79,16 +75,16 @@ static void collection_free(SceneCollection *sc)
 
 /* unlink the collection recursively
  * return true if unlinked */
-static bool collection_remlink(SceneCollection *sc, SceneCollection *sc_gone)
+static bool collection_remlink(SceneCollection *sc_parent, SceneCollection *sc_gone)
 {
-	for (SceneCollection *nsc = sc->collections.first; nsc; nsc = nsc->next)
+	for (SceneCollection *sc = sc_parent->collections.first; sc; sc = sc->next)
 	{
-		if (nsc == sc_gone) {
-			BLI_remlink(&sc->collections, sc_gone);
+		if (sc == sc_gone) {
+			BLI_remlink(&sc_parent->collections, sc_gone);
 			return true;
 		}
 
-		if (collection_remlink(nsc, sc_gone)) {
+		if (collection_remlink(sc, sc_gone)) {
 			return true;
 		}
 	}
@@ -98,12 +94,19 @@ static bool collection_remlink(SceneCollection *sc, SceneCollection *sc_gone)
 /*
  * Remove a collection from the scene, and syncronize all render layers
  */
-void BKE_collection_remove(Scene *scene, SceneCollection *sc)
+bool BKE_collection_remove(Scene *scene, SceneCollection *sc)
 {
 	SceneCollection *sc_master = BKE_collection_master(scene);
 
-	/* unlink from the main collection tree */
-	collection_remlink(sc_master, sc);
+	/* the master collection cannot be removed */
+	if (sc == sc_master) {
+		return false;
+	}
+
+	/* unlink from the respective collection tree */
+	if (!collection_remlink(sc_master, sc)) {
+		BLI_assert(false);
+	}
 
 	/* clear the collection items */
 	collection_free(sc);
@@ -112,6 +115,8 @@ void BKE_collection_remove(Scene *scene, SceneCollection *sc)
 	TODO_LAYER_SYNC;
 
 	MEM_freeN(sc);
+
+	return true;
 }
 
 /*
@@ -119,7 +124,7 @@ void BKE_collection_remove(Scene *scene, SceneCollection *sc)
  */
 SceneCollection *BKE_collection_master(Scene *scene)
 {
-	return scene->collections.first;
+	return &scene->collection;
 }
 
 /*
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index c2a810e..bf3aa34 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -148,7 +148,7 @@ CollectionBase *BKE_collection_link(SceneLayer *sl, SceneCollection *sc)
 static void collection_base_free(SceneLayer *sl, CollectionBase *cb)
 {
 	for (CollectionBase *ncb = cb->collection_bases.first; ncb; ncb = ncb->next) {
-		for (LinkData *link = ncb->object_bases.first; link; link = link->data) {
+		for (LinkData *link = ncb->object_bases.first; link; link = link->next) {
 			scene_layer_object_base_unref(sl, link->data);
 		}
 
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 677c900..a43e5c4 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -7959,6 +7959,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! */
@@ -7966,14 +7967,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
 	/* don't forget to set version number in BKE_blender_version.h! */
 }
 
-#if 0 // XXX: disabled for now... we still don't have this in the right place in the loading code for it to work
 static void do_versions_after_linking(FileData *fd, Library *lib, Main *main)
 {
-	/* old Animation System (using IPO's) needs to be converted to the new Animato system */
-	if (main->versionfile < 250)
-		do_versions_ipos_to_animato(main);
+	blo_do_versions_280_after_linking(fd, lib, main);
 }
-#endif
 
 static void lib_link_all(FileData *fd, Main *main)
 {
@@ -8173,7 +8170,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
 	blo_join_main(&mainlist);
 	
 	lib_link_all(fd, bfd->main);
-	//do_versions_after_linking(fd, NULL, bfd->main); // XXX: not here (or even in this function at all)! this causes crashes on many files - Aligorith (July 04, 2010)
+	do_versions_after_linking(fd, NULL, bfd->main);
 	lib_verify_nodetree(bfd->main, true);
 	fix_relpaths_library(fd->relabase, bfd->main); /* make all relative paths, relative to the open blend file */
 	
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index 06d4c90..796a514 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -172,6 +172,7 @@ void blo_do_versions_250(struct FileData *fd, struct Library *lib, struct 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);
+void blo_do_versions_280_after_linking(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
index f9290f3..6b85648 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -46,87 +46,95 @@
 
 #include "MEM_guardedalloc.h"
 
-void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
+void blo_do_versions_280_after_linking(FileData *fd, Library *UNUSED(lib), Main *main)
 {
-	if (!DNA_struct_elem_find(fd->filesdna, "Scene", "ListBase", "render_layers")) {
-		for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+	if (!MAIN_VERSION_ATLEAST(main, 280, 0)) {
+		if (!DNA_struct_elem_find(fd->filesdna, "Scene", "ListBase", "render_layers")) {
+			for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
 
-			BKE_collection_add(scene, &scene->collections, "Master Collection");
+				SceneCollection *sc_master = BKE_collection_master(scene);
+				BLI_strncpy(sc_master->name, "Master Collection", sizeof(sc_master->name));
 
-			SceneCollection *collections[20] = {NULL};
-			bool is_visible[20];
+				SceneCollection *collections[20] = {NULL};
+				bool is_visible[20];
 
-			int lay_used = 0;
-			for (int i = 0; i < 20; i++) {
-				char name[MAX_NAME];
+				int lay_used = 0;
+				for (int i = 0; i < 20; i++) {
+					char name[MAX_NAME];
 
-				BLI_snprintf(name, sizeof(collections[i]->name), "%d", i + 1);
-				collections[i] = BKE_collection_add(scene, NULL, name);
+					BLI_snprintf(name, sizeof(collections[i]->name), "%d", i + 1);
+					collections[i] = BKE_collection_add(scene, sc_master, name);
 
-				is_visible[i] = (scene->lay & (1 << i));
-			}
+					is_visible[i] = (scene->lay & (1 << i));
+				}
 
-			for (Base *base = scene->base.first; base; base = base->next) {
-				lay_used |= base->lay & ((1 << 20) - 1); /* ignore localview */
+				for (Base *base = scene->base.first; base; base = base->next) {
+					lay_used |= base->lay & ((1 << 20) - 1); /* ignore localview */
 
-				for (int i = 0; i < 20; i++) {
-					if ((base->lay & (1 << i)) != 0) {
-						BKE_collection_object_add(scene, collections[i], base->object);
+					for (int i = 0; i < 20; i++) {
+						if ((base->lay & (1 << i)) != 0) {
+							BKE_collection_object_add(scene, collections[i], base->object);
+						}
 					}
 				}
-			}
 
-			if (!BKE_scene_uses_blender_game(scene)) {
-				for (SceneRenderLayer *srl = scene->r.layers.first; srl; srl = srl->next) {
+				if (!BKE_scene_uses_blender_game(scene)) {
+					for (SceneRenderLayer *srl = scene->r.layers.first; srl; srl = srl->next) {
 
-					SceneLayer *sl = BKE_scene_layer_add(scene, srl->name);
-					BKE_scene_layer_engine_set(sl, scene->r.engine);
+						SceneLayer *sl = BKE_scene_layer_add(scene, srl->name);
+						BKE_scene_layer_engine_set(sl, scene->r.engine);
 
-					if (srl->mat_override) {
-						BKE_collection_override_datablock_add((CollectionBase *)sl->collection_bases.first, "material", (ID *)srl->mat_override);
-		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list