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

Reply via email to