Commit: bcfed0836728010602018feba397d03b66e785a4
Author: Julian Eisel
Date:   Mon Jul 11 18:52:51 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBbcfed0836728010602018feba397d03b66e785a4

Get file read/write and undo to work - finally

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

M       source/blender/blenkernel/BKE_layer.h
M       source/blender/blenkernel/intern/layer.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/makesdna/DNA_scene_types.h

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

diff --git a/source/blender/blenkernel/BKE_layer.h 
b/source/blender/blenkernel/BKE_layer.h
index 8564490..c6a9544 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -95,6 +95,7 @@ typedef struct LayerType {
 
 void BKE_layertype_append(void (*ltfunc)(LayerType *));
 void BKE_layertypes_free(void);
+LayerType *BKE_layertype_get(const eLayerTree_Type type_id);
 
 /* -------------------------------------------------------------------- */
 /* Layer Tree Item */
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index ca8256c..7f08e4f 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -157,6 +157,13 @@ void BKE_layertypes_free(void)
        }
 }
 
+/* TODO if we want to support custom (in .py defined) layer types, using 
eLayerTree_Type
+ * will not be reliable. Could use string instead, just like operators */
+LayerType *BKE_layertype_get(const eLayerTree_Type type_id)
+{
+       return layertypes[type_id];
+}
+
 /** \} */ /* Layer Type */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 4fc8344..8361602 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -101,6 +101,8 @@
 #include "DNA_movieclip_types.h"
 #include "DNA_mask_types.h"
 
+#include "RNA_access.h"
+
 #include "MEM_guardedalloc.h"
 
 #include "BLI_endian_switch.h"
@@ -2157,6 +2159,17 @@ static void direct_link_id(FileData *fd, ID *id)
        }
 }
 
+
+/* ************ READ Base *************** */
+
+static void direct_link_bases(FileData *fd, ListBase *bases)
+{
+       link_list(fd, bases);
+       for (Base *base = bases->first; base; base = base->next) {
+               base->layer = newdataadr(fd, base->layer);
+       }
+}
+
 /* ************ READ CurveMapping *************** */
 
 /* cuma itself has been read! */
@@ -5836,13 +5849,20 @@ static void direct_link_layeritems(FileData *fd, 
ListBase *layeritems, LayerTree
 
                litem->tree = ltree;
                litem->parent = newdataadr(fd, litem->parent);
+               litem->type = BKE_layertype_get(litem->type_id);
+
+               /* custom property stuff */
                litem->prop = newdataadr(fd, litem->prop);
                IDP_DirectLinkGroup_OrFree(&litem->prop, (fd->flags & 
FD_FLAGS_SWITCH_ENDIAN), fd);
+               /* recreate rna pointer */
+               litem->ptr = MEM_callocN(sizeof(PointerRNA), "Read 
LayerTreeItem.ptr");
+               RNA_pointer_create(NULL, litem->type->srna, litem->prop, 
litem->ptr);
 
                if (litem->type->type == LAYER_ITEMTYPE_LAYER) {
                        LayerTypeObject *oblayer = (LayerTypeObject *)litem;
-                       if (oblayer->bases) {
-                               oblayer->bases = newdataadr(fd, oblayer->bases);
+                       oblayer->bases = newdataadr(fd, oblayer->bases);
+                       for (int i = 0; i < oblayer->tot_bases; i++) {
+                               oblayer->bases[i] = newdataadr(fd, 
oblayer->bases[i]);
                        }
                }
                direct_link_layeritems(fd, &litem->childs, ltree, counter);
@@ -5870,9 +5890,9 @@ static void direct_link_scene(FileData *fd, Scene *sce)
        
        /* set users to one by default, not in lib-link, this will increase it 
for compo nodes */
        id_us_ensure_real(&sce->id);
-       
-       link_list(fd, &(sce->base));
-       
+
+       direct_link_bases(fd, &sce->base);
+
        sce->adt = newdataadr(fd, sce->adt);
        direct_link_animdata(fd, sce->adt);
        
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index 156f9af..9098002 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2635,6 +2635,7 @@ static void write_layeritems(WriteData *wd, Scene *scene, 
ListBase *layeritems)
                if (scene->object_layers->type == LAYER_TREETYPE_OBJECT && 
litem->type->type == LAYER_ITEMTYPE_LAYER) {
                        LayerTypeObject *oblayer = (LayerTypeObject *)litem;
                        writestruct(wd, DATA, LayerTypeObject, 1, oblayer);
+                       writedata(wd, DATA, sizeof(*oblayer->bases) * 
oblayer->tot_bases, oblayer->bases);
                }
                else {
                        writestruct(wd, DATA, LayerTreeItem, 1, litem);
diff --git a/source/blender/makesdna/DNA_scene_types.h 
b/source/blender/makesdna/DNA_scene_types.h
index d601911..9c0f534 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -108,8 +108,9 @@ typedef struct LayerTreeItem {
        struct LayerTreeItem *next, *prev;
 
        struct LayerType *type;
+       int type_id;    /* eLayerTreeItem_Type item to get LayerType pointer - 
needed for file read */
 
-       int index, pad; /* index of the item - stored to avoid loockups */
+       int index;      /* index of the item - stored to avoid loockups */
        char name[64];  /* MAX_NAME */
 
        LayerTree *tree; /* pointer back to layer tree - TODO check if needed */

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

Reply via email to