Commit: 0fbe59bcf6a81706ed4830c1b8bf799dcf6bd51c
Author: Julian Eisel
Date:   Sat Jun 4 19:56:36 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB0fbe59bcf6a81706ed4830c1b8bf799dcf6bd51c

Support undo/redo and file read/write for layer manager

It's not 100% working yet, there's still some listbase issue going on, but I 
didn't get any crashes on runtime, so it's mostly fine.

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

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/editors/space_layers/layers_intern.h
M       source/blender/editors/space_layers/layers_types.c
M       source/blender/editors/space_layers/layers_util.c
M       source/blender/editors/space_layers/space_layers.c
M       source/blender/makesdna/DNA_space_types.h

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

diff --git a/source/blender/blenkernel/BKE_layer.h 
b/source/blender/blenkernel/BKE_layer.h
index d6471ee..8f9795c 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -31,14 +31,15 @@
 #define __BKE_LAYER_H__
 
 struct bContext;
-struct LayerTreeItem;
 struct uiLayout;
 
+#include "DNA_space_types.h"
+
 
 /* -------------------------------------------------------------------- */
 /* Layer Tree */
 
-typedef bool (*LayerTreeIterFunc)(struct LayerTreeItem *, void *);
+typedef bool (*LayerTreeIterFunc)(LayerTreeItem *, void *);
 
 /**
  * LayerTree.type
@@ -51,19 +52,11 @@ typedef enum eLayerTree_Type {
 //     ...
 } eLayerTree_Type;
 
-typedef struct LayerTree {
-       eLayerTree_Type type;
-
-       /* LayerTreeItem - Only items of the first level in the hierarchy, 
these may have children then.
-        * TODO check if worth using array instead */
-       ListBase items;
-} LayerTree;
-
-
-struct LayerTree *BKE_layertree_new(const eLayerTree_Type type);
-void BKE_layertree_delete(struct LayerTree *ltree);
+LayerTree *BKE_layertree_new(const eLayerTree_Type type);
+void BKE_layertree_delete(LayerTree *ltree);
 
 bool BKE_layertree_iterate(const LayerTree *ltree, LayerTreeIterFunc foreach, 
void *customdata);
+int  BKE_layertree_get_totitems(const LayerTree *ltree);
 
 /* -------------------------------------------------------------------- */
 /* Layer Tree Item */
@@ -78,29 +71,7 @@ typedef enum eLayerTreeItem_Type {
        LAYER_ITEMTYPE_COMP,  /* compositing layer (wireframes, SSAO, blending 
type, etc) */
 } eLayerTreeItem_Type;
 
-/**
- * \brief An item of the layer tree.
- * Used as a base struct for the individual layer tree item types (layer, 
layer group, compositing layer, etc).
- */
-typedef struct LayerTreeItem {
-       struct LayerTreeItem *next, *prev;
-
-       eLayerTreeItem_Type type;
-       char name[64]; /* MAX_NAME */
-
-       LayerTree *tree; /* pointer back to layer tree - TODO check if needed */
-       struct LayerTreeItem *parent; /* the group this item belongs to */
-       ListBase childs;
-
-       /* item is grayed out if this check fails */
-       LayerItemPollFunc poll;
-       /* drawing of the item in the list */
-       LayerItemDrawFunc draw;
-       /* drawing of the expanded layer settings (gear wheel icon) */
-       LayerItemDrawSettingsFunc draw_settings;
-} LayerTreeItem;
-
-struct LayerTreeItem *BKE_layeritem_add(
+LayerTreeItem *BKE_layeritem_add(
         LayerTree *tree, LayerTreeItem *parent,
         const eLayerTreeItem_Type type, const char *name,
         const LayerItemPollFunc poll, LayerItemDrawFunc draw, 
LayerItemDrawSettingsFunc draw_settings);
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index 48a2a19..31be0c8 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -40,6 +40,7 @@
 #include "BLI_string.h"
 
 #include "DNA_defs.h"
+#include "DNA_space_types.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -58,9 +59,6 @@ LayerTree *BKE_layertree_new(const eLayerTree_Type type)
        return ltree;
 }
 
-/**
- * \note Recursive
- */
 void BKE_layertree_delete(LayerTree *ltree)
 {
        for (LayerTreeItem *litem = ltree->items.first, *next_litem; litem; 
litem = next_litem) {
@@ -101,6 +99,11 @@ bool BKE_layertree_iterate(const LayerTree *ltree, 
LayerTreeIterFunc foreach, vo
        return layertree_iterate_list(&ltree->items, foreach, customdata);
 }
 
+int BKE_layertree_get_totitems(const LayerTree *ltree)
+{
+       return ltree->tot_items;
+}
+
 /** \} */ /* Layer Tree */
 
 
@@ -134,6 +137,8 @@ LayerTreeItem *BKE_layeritem_add(
        litem->draw = draw;
        litem->draw_settings = draw_settings;
 
+       tree->tot_items++;
+
        if (parent) {
                BLI_assert(ELEM(parent->type, LAYER_ITEMTYPE_GROUP));
                BLI_assert(parent->tree == tree);
@@ -158,12 +163,14 @@ LayerTreeItem *BKE_layeritem_add(
 void BKE_layeritem_remove(LayerTreeItem *litem, const bool remove_children)
 {
        BLI_remlink(litem->parent ? &litem->parent->childs : 
&litem->tree->items, litem);
+       litem->tree->tot_items--;
 
        if (remove_children) {
                for (LayerTreeItem *child = litem->childs.first, *child_next; 
child; child = child_next) {
                        child_next = child->next;
                        BKE_layeritem_remove(child, true);
                }
+               BLI_assert(BLI_listbase_is_empty(&litem->childs));
        }
 
        MEM_freeN(litem);
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 464fc0a..7e7d8a2 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5802,6 +5802,20 @@ static void direct_link_view_settings(FileData *fd, 
ColorManagedViewSettings *vi
                direct_link_curvemapping(fd, view_settings->curve_mapping);
 }
 
+#ifdef WITH_ADVANCED_LAYERS
+/**
+ * \note Recursive.
+ */
+static void direct_link_layeritems(FileData *fd, ListBase *layeritems)
+{
+       link_list(fd, layeritems);
+       for (LayerTreeItem *litem = layeritems->first; litem; litem = 
litem->next) {
+               litem->parent = newdataadr(fd, litem->parent);
+               direct_link_layeritems(fd, &litem->childs);
+       }
+}
+#endif
+
 static void direct_link_scene(FileData *fd, Scene *sce)
 {
        Editing *ed;
@@ -6031,6 +6045,12 @@ static void direct_link_scene(FileData *fd, Scene *sce)
                        rbw->ltime = (float)rbw->pointcache->startframe;
                }
        }
+#ifdef WITH_ADVANCED_LAYERS
+       sce->object_layers = newdataadr(fd, sce->object_layers);
+       if (sce->object_layers) {
+               direct_link_layeritems(fd, &sce->object_layers->items);
+       }
+#endif
 
        sce->preview = direct_link_preview_image(fd, sce->preview);
 
@@ -6370,6 +6390,12 @@ static void lib_link_screen(FileData *fd, Main *main)
                                                
                                                slogic->gpd = newlibadr_us(fd, 
sc->id.lib, slogic->gpd);
                                        }
+#ifdef WITH_ADVANCED_LAYERS
+                                       else if (sl->spacetype == SPACE_LAYERS) 
{
+                                               SpaceLayers *slayer = 
(SpaceLayers *)sl;
+                                               slayer->flag |= 
SL_LAYERDATA_REFRESH;
+                                       }
+#endif
                                }
                        }
                        sc->id.tag &= ~LIB_TAG_NEED_LINK;
@@ -6725,6 +6751,12 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen 
*curscreen, Scene *cursc
                                        
                                        slogic->gpd = 
restore_pointer_by_name(newmain, (ID *)slogic->gpd, USER_REAL);
                                }
+#ifdef WITH_ADVANCED_LAYERS
+                               else if (sl->spacetype == SPACE_LAYERS) {
+                                       SpaceLayers *slayer = (SpaceLayers *)sl;
+                                       slayer->flag |= SL_LAYERDATA_REFRESH;
+                               }
+#endif
                        }
                }
        }
@@ -7117,6 +7149,13 @@ static bool direct_link_screen(FileData *fd, bScreen *sc)
                                sclip->scopes.track_preview = NULL;
                                sclip->scopes.ok = 0;
                        }
+#ifdef WITH_ADVANCED_LAYERS
+                       else if (sl->spacetype == SPACE_LAYERS) {
+                               SpaceLayers *slayer = (SpaceLayers *)sl;
+                               slayer->flag |= SL_LAYERDATA_REFRESH;
+                               slayer->tiles = newdataadr(fd, slayer->tiles);
+                       }
+#endif
                }
                
                BLI_listbase_clear(&sa->actionzones);
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index 7a41136..81a4ca2 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2391,6 +2391,20 @@ static void write_paint(WriteData *wd, Paint *p)
                write_curvemapping(wd, p->cavity_curve);
 }
 
+#ifdef WITH_ADVANCED_LAYERS
+/**
+ * \note Recursive.
+ */
+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);
+               litem->tree = scene->object_layers;
+               write_layeritems(wd, scene, &litem->childs);
+       }
+}
+#endif
+
 static void write_scenes(WriteData *wd, ListBase *scebase)
 {
        Scene *sce;
@@ -2576,6 +2590,13 @@ static void write_scenes(WriteData *wd, ListBase 
*scebase)
                write_previews(wd, sce->preview);
                write_curvemapping_curves(wd, &sce->r.mblur_shutter_curve);
 
+#ifdef WITH_ADVANCED_LAYERS
+               if (sce->object_layers) {
+                       writestruct(wd, DATA, "LayerTree", 1, 
sce->object_layers);
+                       write_layeritems(wd, sce, &sce->object_layers->items);
+               }
+#endif
+
                sce= sce->id.next;
        }
        /* flush helps the compression for undo-save */
diff --git a/source/blender/editors/space_layers/layers_intern.h 
b/source/blender/editors/space_layers/layers_intern.h
index 219a993..f5a46d6 100644
--- a/source/blender/editors/space_layers/layers_intern.h
+++ b/source/blender/editors/space_layers/layers_intern.h
@@ -57,6 +57,8 @@ void object_layer_draw(const struct bContext *C, struct 
LayerTreeItem *litem, st
 void object_layer_draw_settings(const struct bContext *C, struct LayerTreeItem 
*litem, struct uiLayout *layout);
 
 /* layers_util.c */
+void       layers_data_refresh(const struct Scene *scene, struct SpaceLayers 
*slayer);
+void       layers_tilehash_delete(SpaceLayers *slayer);
 LayerTile *layers_tile_add(const struct SpaceLayers *slayer, struct 
LayerTreeItem *litem);
 void       layers_tile_remove(const struct SpaceLayers *slayer, LayerTile 
*tile, const bool remove_children);
 LayerTile *layers_tile_find_at_coordinate(
diff --git a/source/blender/editors/space_layers/layers_types.c 
b/source/blender/editors/space_layers/layers_types.c
index 3a4b5de..f305aa1 100644
--- a/source/blender/editors/space_layers/layers_types.c
+++ b/source/blender/editors/space_layers/layers_types.c
@@ -29,6 +29,7 @@
 #include "BKE_layer.h"
 
 #include "DNA_ID.h"
+#include "DNA_space_types.h"
 
 #include "ED_object.h"
 
diff --git a/source/blender/editors/space_layers/layers_util.c 
b/source/blender/editors/space_layers/layers_util.c
index 40d71a2..be50876 100644
--- a/source/blender/editors/space_layers/layers_util.c
+++ b/source/blender/editors/space_layers/layers_util.c
@@ -39,6 +39,35 @@
 
 #include "UI_interface.h"
 
+
+static bool layers_tile_recreate_cb(LayerTreeItem *litem, void *customdata)
+{
+       SpaceLayers *slayer = customdata;
+       layers_tile_add(slayer, litem);
+       return true;
+}
+
+/**
+ * Refresh data after undo/file read. Should be called before drawing if 
SL_LAYERDATA_REFRESH flag is set.
+ */
+void layers_data_refresh(const Scene *scene, SpaceLayers *slayer)
+{
+       slayer->act_tree = scene->object_layers;
+
+       if (slayer->tiles) {
+               layers_tilehash_delete(slayer);
+       }
+       slayer->tiles = BLI_ghash_ptr_new_ex("Layer tiles hash", 
BKE_layertree_get_totitems(slayer->act_tree));
+       BKE_layertree_iterate(slayer->act_tree, layers_tile_recreate_cb, 
slayer);


@@ Diff output truncated at 10240 characters. @@

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

Reply via email to