Commit: cb11ab9b0928690a4982c2fd6392d758c23dc172
Author: Dalai Felinto
Date:   Wed Nov 30 12:39:55 2016 +0100
Branches: render-layers
https://developer.blender.org/rBcb11ab9b0928690a4982c2fd6392d758c23dc172

More versioning, and more DNA

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

M       source/blender/blenkernel/BKE_collection.h
M       source/blender/blenkernel/BKE_layer.h
M       source/blender/blenkernel/intern/collection.c
M       source/blender/blenkernel/intern/layer.c
M       source/blender/blenloader/intern/versioning_280.c
M       source/blender/makesdna/DNA_layer_types.h

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

diff --git a/source/blender/blenkernel/BKE_collection.h 
b/source/blender/blenkernel/BKE_collection.h
index 892799c..af43270 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -46,4 +46,3 @@ void BKE_collection_object_add(struct Scene *scene, struct 
Collection *collectio
 #endif
 
 #endif /* __BKE_COLLECTION_H__ */
-
diff --git a/source/blender/blenkernel/BKE_layer.h 
b/source/blender/blenkernel/BKE_layer.h
index 2489a62..2b95496 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -32,15 +32,26 @@ extern "C" {
 #endif
 
 #define TODO_LAYER_SYNC
+#define TODO_LAYER_OVERRIDE
 
+struct CollectionBase;
+struct ID;
 struct RenderLayer;
 struct Scene;
 
 struct RenderLayer *BKE_render_layer_add(struct Scene *scene, const char 
*name);
 
+void BKE_render_layer_engine_set(struct RenderLayer *rl, const char *engine);
+
+struct CollectionBase *BKE_collection_link(struct RenderLayer *rl, struct 
Collection *cl);
+
+void BKE_collection_unlink(struct RenderLayer *rl, struct CollectionBase *cb);
+
+void BKE_collection_override_datablock_add(struct CollectionBase *cb, const 
char *data_path, struct ID *id);
+
+
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* __BKE_LAYER_H__ */
-
diff --git a/source/blender/blenkernel/intern/collection.c 
b/source/blender/blenkernel/intern/collection.c
index f753747..5b7131b 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -32,6 +32,7 @@
 #include "BKE_layer.h"
 #include "BKE_library.h"
 
+#include "DNA_ID.h"
 #include "DNA_layer_types.h"
 #include "DNA_scene_types.h"
 
@@ -39,71 +40,71 @@
 
 Collection *BKE_collection_add(Scene *scene, ListBase *lb, const char *name)
 {
-       Collection *collection = MEM_callocN(sizeof(Collection), "New 
Collection");
-       BLI_strncpy(collection->name, name, sizeof(collection->name));
-       BLI_uniquename(&scene->collections, collection, DATA_("Collection"), 
'.', offsetof(Collection, name), sizeof(collection->name));
+       Collection *cl = MEM_callocN(sizeof(Collection), "New Collection");
+       BLI_strncpy(cl->name, name, sizeof(cl->name));
+       BLI_uniquename(&scene->collections, cl, DATA_("Collection"), '.', 
offsetof(Collection, name), sizeof(cl->name));
 
        if (lb) {
-               BLI_addtail(lb, collection);
+               BLI_addtail(lb, cl);
        }
        else {
-               Collection *collection_master = BKE_collection_master(scene);
-               BLI_addtail(&collection_master->collections, collection);
+               Collection *cl_master = BKE_collection_master(scene);
+               BLI_addtail(&cl_master->collections, cl);
        }
 
        TODO_LAYER_SYNC;
-       return collection;
+       return cl;
 }
 
 /* free the collection items recursively */
-static void collection_free(Collection *collection)
+static void collection_free(Collection *cl)
 {
-       for (LinkData *link = collection->objects.first; link; link = 
link->next) {
+       for (LinkData *link = cl->objects.first; link; link = link->next) {
                id_us_min(link->data);
        }
 
-       for (LinkData *link = collection->filter_objects.first; link; link = 
link->next) {
+       for (LinkData *link = cl->filter_objects.first; link; link = 
link->next) {
                id_us_min(link->data);
        }
 
-       for (Collection *cl = collection->collections.first; cl; cl = cl->next) 
{
-               collection_free(cl);
+       for (Collection *ncl = cl->collections.first; ncl; ncl = ncl->next) {
+               collection_free(ncl);
        }
-       BLI_freelistN(&collection->collections);
+       BLI_freelistN(&cl->collections);
 }
 
 /* unlink the collection recursively
  * return true if unlinked */
-static bool collection_unlink(Collection *collection, Collection *gone)
+static bool collection_remlink(Collection *cl, Collection *cl_gone)
 {
-       for (Collection *nc = collection->collections.first; nc; nc = nc->next)
+       for (Collection *ncl = cl->collections.first; ncl; ncl = ncl->next)
        {
-               if (nc == gone) {
-                       BLI_remlink(&collection->collections, gone);
+               if (ncl == cl_gone) {
+                       BLI_remlink(&cl->collections, cl_gone);
                        return true;
                }
 
-               if (collection_unlink(nc, gone)) {
+               if (collection_remlink(ncl, cl_gone)) {
                        return true;
                }
        }
        return false;
 }
 
-void BKE_collection_remove(Scene *scene, Collection *collection)
+void BKE_collection_remove(Scene *scene, Collection *cl)
 {
-       Collection *master = BKE_collection_master(scene);
+       Collection *cl_master = BKE_collection_master(scene);
 
        /* unlink from the main collection tree */
-       collection_unlink(master, collection);
+       collection_remlink(cl_master, cl);
 
        /* clear the collection items */
-       collection_free(collection);
+       collection_free(cl);
 
        /* TODO: check all layers that use this collection and clear them */
        TODO_LAYER_SYNC;
 
-       MEM_freeN(collection);
+       MEM_freeN(cl);
 }
 
 Collection *BKE_collection_master(Scene *scene)
@@ -111,10 +112,9 @@ Collection *BKE_collection_master(Scene *scene)
        return scene->collections.first;
 }
 
-void BKE_collection_object_add(struct Scene *scene, struct Collection 
*collection, struct Object *object)
+void BKE_collection_object_add(struct Scene *scene, struct Collection *cl, 
struct Object *ob)
 {
-       BLI_addtail(&collection->objects, BLI_genericNodeN(object));
-       id_us_plus((ID *)object);
+       BLI_addtail(&cl->objects, BLI_genericNodeN(ob));
+       id_us_plus((ID *)ob);
        TODO_LAYER_SYNC;
 }
-
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index a638248..0ed7bb1 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -24,40 +24,137 @@
  *  \ingroup bke
  */
 
-#include "BKE_collection.h"
-#include "BKE_layer.h"
-
 #include "BLI_listbase.h"
 #include "BLI_string.h"
 
-#include "MEM_guardedalloc.h"
+#include "BKE_collection.h"
+#include "BKE_layer.h"
 
+#include "DNA_ID.h"
 #include "DNA_layer_types.h"
+#include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 
+#include "MEM_guardedalloc.h"
+
 /* prototype */
-CollectionBase *collection_base_add(RenderLayer *rl, Collection *collection);
+CollectionBase *collection_base_add(RenderLayer *rl, ListBase *lb, Collection 
*collection);
+
+/* RenderLayer */
 
 RenderLayer *BKE_render_layer_add(Scene *scene, const char *name)
 {
        RenderLayer *rl = MEM_callocN(sizeof(RenderLayer), "Render Layer");
        BLI_strncpy(rl->name, name, sizeof(rl->name));
 
-       Collection *collection = BKE_collection_master(scene);
-       CollectionBase *collection_base = collection_base_add(rl, collection);
+       Collection *cl = BKE_collection_master(scene);
+       collection_base_add(rl, &rl->collection_bases, cl);
        return rl;
 }
 
-CollectionBase *collection_base_add(RenderLayer *rl, Collection *collection)
+void BKE_render_layer_engine_set(struct RenderLayer *rl, const char *engine)
 {
-       CollectionBase *base = MEM_callocN(sizeof(CollectionBase), "Collection 
Base");
-       BLI_addhead(&rl->collection_bases, base);
+       BLI_strncpy(rl->engine, engine, sizeof(rl->engine));
+}
+
+/* ObjectBase */
 
-       base->collection = collection;
-       base->flag = COLLECTION_VISIBLE + COLLECTION_SELECTABLE + 
COLLECTION_FOLDED;
+static void render_layer_object_base_unref(RenderLayer* rl, ObjectBase *base)
+{
+       base->refcount--;
 
-       TODO_LAYER_SYNC;
-       /* TODO: add objects and collections to sl->object_bases, and 
sl->collection_bases */
+       /* It only exists in the RenderLayer */
+       if (base->refcount == 1) {
+               if (rl->basact == base) {
+                       rl->basact = NULL;
+               }
+       }
+
+       BLI_remlink(&rl->object_bases, base);
+       MEM_freeN(base);
+}
+
+static ObjectBase *object_base_add(RenderLayer *rl, Object *ob)
+{
+       ObjectBase *base = MEM_callocN(sizeof(ObjectBase), "Object Base");
+       base->object = ob;
+       BLI_addtail(&rl->object_bases, base);
        return base;
 }
 
+/* CollectionBase */
+
+CollectionBase *BKE_collection_link(RenderLayer *rl, Collection *cl)
+{
+       CollectionBase *base = collection_base_add(rl, &rl->collection_bases, 
cl);
+       return base;
+}
+
+static void collection_base_free(RenderLayer *rl, CollectionBase *cb)
+{
+       for (CollectionBase *ncb = cb->collection_bases.first; ncb; ncb = 
ncb->next) {
+               for (LinkData *link = ncb->object_bases.first; link; link = 
link->data) {
+                       render_layer_object_base_unref(rl, link->data);
+               }
+
+               BLI_freelistN(&ncb->object_bases);
+               collection_base_free(rl, ncb);
+       }
+}
+
+void BKE_collection_unlink(RenderLayer *rl, CollectionBase *cb)
+{
+       collection_base_free(rl, cb);
+
+       BLI_remlink(&rl->collection_bases, cb);
+       MEM_freeN(cb);
+}
+
+static void object_base_populate(RenderLayer *rl, CollectionBase *cb, ListBase 
*objects)
+{
+       for (LinkData *link = objects->first; link; link = link->next) {
+               ObjectBase *base = BLI_findptr(&rl->object_bases, link->data, 
offsetof(ObjectBase, object));
+
+               if (base == NULL) {
+                       base = object_base_add(rl, link->data);
+               }
+               else {
+                       /* only add an object once */
+                       if (BLI_findptr(&cb->object_bases, base, 
offsetof(LinkData, data))) {
+                               continue;
+                       }
+               }
+
+               base->refcount++;
+               BLI_addtail(&cb->object_bases, BLI_genericNodeN(base));
+       }
+}
+
+static void collection_base_populate(RenderLayer *rl, CollectionBase *cb, 
Collection *cl)
+{
+       object_base_populate(rl, cb, &cl->objects);
+       object_base_populate(rl, cb, &cl->filter_objects);
+
+       for (Collection *ncl = cl->collections.first; ncl; ncl = ncl->next) {
+               collection_base_add(rl, &cb->collection_bases, ncl);
+       }
+}
+
+CollectionBase *collection_base_add(RenderLayer *rl, ListBase *lb, Collection 
*cl)
+{
+       CollectionBase *cb = MEM_callocN(sizeof(CollectionBase), "Collection 
Base");
+       BLI_addtail(lb, cb);
+
+       cb->collection = cl;
+       cb->flag = COLLECTION_VISIBLE + COLLECTION_SELECTABLE + 
COLLECTION_FOLDED;
+
+       collection_base_populate(rl, cb, cl);
+       return cb;
+}
+
+/* Override */
+
+void BKE_collection_override_datablock_add(CollectionBase *UNUSED(cb), const 
char *UNUSED(data_path), ID *UNUSED(id))
+{
+       TODO_LAYER_OVERRIDE;
+}
diff --git a/source/blender/blenloader/intern/versioning_280.c 
b/source/blender/blenloader/intern/versioning_280.c
index 63a8aa3..6982508 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -52,10 +52,6 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), 
Main *main)
                for (Scene *scene = main->scene.first; scene; scene = 
scene->id.next) {
 
                        BKE_collection_add(scene, &scene->coll

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to