[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