[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(&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. @@




More information about the Bf-blender-cvs mailing list