Commit: 099aae7c1c4947a7420212d4eadbc280f7f933d6
Author: Julian Eisel
Date: Sun Jun 12 03:27:25 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB099aae7c1c4947a7420212d4eadbc280f7f933d6
Fix undo/redo and file read/write
Storing/reading objects assigned to layers currently crashes since there's no
support for GHash read/write. Will probably change into array/listbase since
GHash doesn't make much sense here anyway.
===================================================================
M source/blender/blenkernel/BKE_object.h
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/makesdna/DNA_space_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_object.h
b/source/blender/blenkernel/BKE_object.h
index 19ef61c..65ffacf 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -277,11 +277,6 @@ bool BKE_object_modifier_update_subframe(struct Scene
*scene, struct Object *ob,
#include "BKE_layer.h" /* XXX */
-typedef struct LayerTypeObject {
- LayerTreeItem litem;
- struct GHash *basehash; /* The objects of this layer. */
-} LayerTypeObject;
-
LayerTreeItem *BKE_objectlayer_add(
LayerTree *tree, LayerTreeItem *parent, const char *name,
const LayerItemPollFunc poll, LayerItemDrawFunc draw,
LayerItemDrawSettingsFunc draw_settings);
diff --git a/source/blender/blenloader/intern/readfile.c
b/source/blender/blenloader/intern/readfile.c
index 5ef0549..80a1b4b 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5816,16 +5816,25 @@ static void direct_link_view_settings(FileData *fd,
ColorManagedViewSettings *vi
/**
* \note Recursive.
*/
-static void direct_link_layeritems(FileData *fd, ListBase *layeritems)
+static void direct_link_layeritems(FileData *fd, ListBase *layeritems,
LayerTree *ltree, int *counter)
{
link_list(fd, layeritems);
for (LayerTreeItem *litem = layeritems->first; litem; litem =
litem->next) {
+ ltree->items_all[*counter] = litem;
+ (*counter)++;
+ litem->free = newdataadr(fd, litem->free);
+ litem->tree = ltree;
litem->parent = newdataadr(fd, litem->parent);
if (litem->type == LAYER_ITEMTYPE_LAYER) {
LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+#if 0
+ /* TODO */
oblayer->basehash = newdataadr(fd, oblayer->basehash);
+#else
+ oblayer->basehash = NULL;
+#endif
}
- direct_link_layeritems(fd, &litem->childs);
+ direct_link_layeritems(fd, &litem->childs, ltree, counter);
}
}
#endif
@@ -6062,7 +6071,9 @@ static void direct_link_scene(FileData *fd, Scene *sce)
#ifdef WITH_ADVANCED_LAYERS
sce->object_layers = newdataadr(fd, sce->object_layers);
if (sce->object_layers) {
- direct_link_layeritems(fd, &sce->object_layers->items);
+ int counter = 0;
+ sce->object_layers->items_all = newdataadr(fd,
sce->object_layers->items_all);
+ direct_link_layeritems(fd, &sce->object_layers->items,
sce->object_layers, &counter);
}
#endif
diff --git a/source/blender/blenloader/intern/writefile.c
b/source/blender/blenloader/intern/writefile.c
index 81a4ca2..a2ac415 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -151,6 +151,7 @@
#include "BKE_constraint.h"
#include "BKE_global.h" // for G
#include "BKE_idcode.h"
+#include "BKE_layer.h"
#include "BKE_library.h" // for set_listbasepointers
#include "BKE_main.h"
#include "BKE_node.h"
@@ -2398,7 +2399,17 @@ static void write_paint(WriteData *wd, Paint *p)
static void write_layeritems(WriteData *wd, Scene *scene, ListBase *layeritems)
{
for (LayerTreeItem *litem = layeritems->first; litem; litem =
litem->next) {
- writestruct(wd, DATA, "LayerTreeItem", 1, litem);
+ if (scene->object_layers->type == LAYER_TREETYPE_OBJECT &&
litem->type == LAYER_ITEMTYPE_LAYER) {
+ LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+ writestruct(wd, DATA, "LayerTypeObject", 1, oblayer);
+#if 0
+ /* TODO hrmpf can't write hash */
+ writedata(wd, DATA, , oblayer->basehash);
+#endif
+ }
+ else {
+ writestruct(wd, DATA, "LayerTreeItem", 1, litem);
+ }
litem->tree = scene->object_layers;
write_layeritems(wd, scene, &litem->childs);
}
@@ -2593,6 +2604,7 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
#ifdef WITH_ADVANCED_LAYERS
if (sce->object_layers) {
writestruct(wd, DATA, "LayerTree", 1,
sce->object_layers);
+ writedata(wd, DATA, sizeof(LayerTreeItem *) *
sce->object_layers->tot_items, sce->object_layers->items_all);
write_layeritems(wd, sce, &sce->object_layers->items);
}
#endif
diff --git a/source/blender/makesdna/DNA_space_types.h
b/source/blender/makesdna/DNA_space_types.h
index 782c3f4..94bb7ea 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -1374,6 +1374,11 @@ typedef struct LayerTreeItem {
void (*free)(struct LayerTreeItem *);
} LayerTreeItem;
+typedef struct LayerTypeObject {
+ LayerTreeItem litem;
+ struct GHash *basehash; /* The objects of this layer. */
+} LayerTypeObject;
+
/* SpaceLayers->flag */
typedef enum eSpaceLayers_Flag {
SL_LAYERDATA_REFRESH = (1 << 0), /* recreate/update SpaceLayers layer
data, needed for undo/read/write */
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs