[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