[Bf-blender-cvs] [0fbe59b] soc-2016-layer_manager: Support undo/redo and file read/write for layer manager
Julian Eisel
noreply at git.blender.org
Sat Jun 4 20:02:12 CEST 2016
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(<ree->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. @@
More information about the Bf-blender-cvs
mailing list