[Bf-blender-cvs] [bcfed08] soc-2016-layer_manager: Get file read/write and undo to work - finally

Julian Eisel noreply at git.blender.org
Mon Jul 11 18:55:21 CEST 2016


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 */




More information about the Bf-blender-cvs mailing list