[Bf-blender-cvs] [2da4fcf] soc-2016-layer_manager: Register layer type info as shared layer data

Julian Eisel noreply at git.blender.org
Sun Jun 19 19:47:49 CEST 2016


Commit: 2da4fcfe77ab6f0739a21f3718ddd71e4cfbb698
Author: Julian Eisel
Date:   Sun Jun 19 18:37:52 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB2da4fcfe77ab6f0739a21f3718ddd71e4cfbb698

Register layer type info as shared layer data

Each layer type is now registered as LayerType instance, working really similar to operator types. This will allow us to create custom layer types from .py, but also makes it easier and more efficient to create layer data that's shared between all layers of a type.

Also removed unneeded layer poll callback.

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/blender.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/object_layer.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/space_layers/layers_draw.c
M	source/blender/editors/space_layers/layers_types.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/creator/creator.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index cc30933..fb16e78 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -68,26 +68,47 @@ int  BKE_layertree_get_totitems(const LayerTree *ltree);
 #define BKE_LAYERTREE_ITER_END } (void)0
 
 /* -------------------------------------------------------------------- */
+/* Layer Types */
+
+void BKE_layertypes_init(void);
+void BKE_layertypes_free(void);
+
+void BKE_layertype_append(void (*ltfunc)(struct LayerType *));
+
+/* -------------------------------------------------------------------- */
 /* Layer Tree Item */
 
-typedef short (*LayerItemPollFunc)(const struct bContext *, struct LayerTreeItem *);
 typedef void  (*LayerItemDrawFunc)(const struct bContext *, struct LayerTreeItem *, struct uiLayout *layout);
 typedef void  (*LayerItemDrawSettingsFunc)(const struct bContext *, struct LayerTreeItem *, struct uiLayout *layout);
 
 typedef enum eLayerTreeItem_Type {
-	LAYER_ITEMTYPE_LAYER,
+	LAYER_ITEMTYPE_LAYER = 0,
 	LAYER_ITEMTYPE_GROUP, /* layer group */
 	LAYER_ITEMTYPE_COMP,  /* compositing layer (wireframes, SSAO, blending type, etc) */
+
+	LAYER_ITEMTYPE_TOT,   /* always last! */
 } eLayerTreeItem_Type;
 
+typedef struct LayerType {
+	eLayerTreeItem_Type type; /* eLayerTreeItem_Type */
+
+	/* drawing of the item in the list */
+	void (*draw)(const struct bContext *, struct LayerTreeItem *, struct uiLayout *); /* LayerItemDrawFunc */
+	/* drawing of the expanded layer settings (gear wheel icon) */
+	void (*draw_settings)(const struct bContext *, struct LayerTreeItem *, struct uiLayout *); /* LayerItemDrawSettingsFunc */
+
+	/* Optional free callback. Don't free item itself! */
+	void (*free)(struct LayerTreeItem *);
+} LayerType;
+
 LayerTreeItem *BKE_layeritem_add(
         LayerTree *tree, LayerTreeItem *parent,
         const eLayerTreeItem_Type type, const char *name,
-        const LayerItemPollFunc poll, LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings);
+        LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings);
 void BKE_layeritem_register(
         LayerTree *tree, LayerTreeItem *litem, LayerTreeItem *parent,
         const eLayerTreeItem_Type type, const char *name,
-        const LayerItemPollFunc poll, LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings);
+        LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings);
 void BKE_layeritem_remove(LayerTreeItem *litem, const bool remove_children);
 
 void BKE_layeritem_move(LayerTreeItem *litem, const int newidx);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index e4cbdba..8ae9cc2 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -284,7 +284,8 @@ bool BKE_object_modifier_update_subframe(struct Scene *scene, struct Object *ob,
 
 LayerTreeItem *BKE_objectlayer_add(
         LayerTree *tree, LayerTreeItem *parent, const char *name,
-        const LayerItemPollFunc poll, LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings);
+        LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings);
+void BKE_objectlayer_free(LayerTreeItem *litem);
 void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem);
 void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem);
 
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 15492fb..073f22c 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -54,6 +54,7 @@
 #include "BKE_global.h"
 #include "BKE_idprop.h"
 #include "BKE_image.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_node.h"
 #include "BKE_report.h"
@@ -81,6 +82,7 @@ void BKE_blender_free(void)
 	BKE_main_free(G.main);
 	G.main = NULL;
 
+	BKE_layertypes_free();
 	BKE_spacetypes_free();      /* after free main, it uses space callbacks */
 	
 	IMB_exit();
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index ed76f58..372ef1f 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -36,6 +36,7 @@
 #include "BKE_context.h"
 #include "BKE_idprop.h"
 #include "BKE_layer.h" /* own include */
+#include "BKE_object.h"
 
 #include "BLI_listbase.h"
 #include "BLI_string.h"
@@ -117,6 +118,63 @@ int BKE_layertree_get_totitems(const LayerTree *ltree)
 
 
 /* -------------------------------------------------------------------- */
+/** \name Layer Type
+ *
+ * Layer types store information that is shared between all layers of
+ * the given type. They work just like operator and operator types.
+ *
+ * \{ */
+
+/**
+ * Array of all registered layer types. The index of a layer type matches items
+ * in eLayerTreeItem_Type. Length should always match #LAYER_ITEMTYPE_TOT.
+*/
+static LayerType *layertypes[LAYER_ITEMTYPE_TOT] = {NULL};
+
+
+static void LAYERTYPE_object(LayerType *lt)
+{
+	/* XXX Will probably get own layer type */
+	lt->type = LAYER_ITEMTYPE_LAYER;
+
+	lt->free = BKE_objectlayer_free;
+}
+
+static void LAYERTYPE_group(LayerType *lt)
+{
+	lt->type = LAYER_ITEMTYPE_GROUP;
+}
+
+void BKE_layertype_append(void (*ltfunc)(LayerType *))
+{
+	LayerType *lt = MEM_callocN(sizeof(LayerType), __func__);
+	ltfunc(lt);
+
+	BLI_assert(lt->type >= 0 && lt->type < LAYER_ITEMTYPE_TOT);
+	layertypes[lt->type] = lt;
+}
+
+/**
+ * Startup initialization of layer types.
+ */
+void BKE_layertypes_init(void)
+{
+	BKE_layertype_append(LAYERTYPE_object);
+	BKE_layertype_append(LAYERTYPE_group);
+}
+
+void BKE_layertypes_free(void)
+{
+	for (int i = 0; i < ARRAY_SIZE(layertypes); i++) {
+		if (layertypes[i]) {
+			MEM_freeN(layertypes[i]);
+		}
+	}
+}
+
+/** \} */ /* Layer Type */
+
+/* -------------------------------------------------------------------- */
 /** \name Layer Tree Item
  *
  * An item of the layer tree (layer, layer group, compositing layer, etc).
@@ -133,24 +191,23 @@ int BKE_layertree_get_totitems(const LayerTree *ltree)
 void BKE_layeritem_register(
         LayerTree *tree, LayerTreeItem *litem, LayerTreeItem *parent,
         const eLayerTreeItem_Type type, const char *name,
-        const LayerItemPollFunc poll, LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings)
+        LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings)
 {
-	litem->type = type;
+	litem->type = layertypes[type];
 	litem->index = tree->tot_items;
 	litem->tree = tree;
 	BLI_strncpy(litem->name, name, sizeof(litem->name));
 
 	/* callbacks */
-	litem->poll = poll;
-	litem->draw = draw;
-	litem->draw_settings = draw_settings;
+	litem->type->draw = draw;
+	litem->type->draw_settings = draw_settings;
 
 	/* add to item array */
 	tree->items_all = MEM_reallocN(tree->items_all, sizeof(*tree->items_all) * ++tree->tot_items);
 	tree->items_all[tree->tot_items - 1] = litem;
 
 	if (parent) {
-		BLI_assert(ELEM(parent->type, LAYER_ITEMTYPE_GROUP));
+		BLI_assert(ELEM(parent->type->type, LAYER_ITEMTYPE_GROUP));
 		BLI_assert(parent->tree == tree);
 
 		litem->parent = parent;
@@ -171,17 +228,17 @@ void BKE_layeritem_register(
 LayerTreeItem *BKE_layeritem_add(
         LayerTree *tree, LayerTreeItem *parent,
         const eLayerTreeItem_Type type, const char *name,
-        const LayerItemPollFunc poll, LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings)
+        LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings)
 {
 	LayerTreeItem *litem = MEM_callocN(sizeof(LayerTreeItem), __func__);
-	BKE_layeritem_register(tree, litem, parent, type, name, poll, draw, draw_settings);
+	BKE_layeritem_register(tree, litem, parent, type, name, draw, draw_settings);
 	return litem;
 }
 
 static void layeritem_free(LayerTreeItem *litem)
 {
-	if (litem->free) {
-		litem->free(litem);
+	if (litem->type->free) {
+		litem->type->free(litem);
 	}
 
 	if (litem->prop) {
@@ -265,7 +322,7 @@ void BKE_layeritem_group_assign(LayerTreeItem *group, LayerTreeItem *item)
 {
 	ListBase *oldlist = item->parent ? &item->parent->childs : &item->tree->items;
 
-	BLI_assert(group->type == LAYER_ITEMTYPE_GROUP);
+	BLI_assert(group->type->type == LAYER_ITEMTYPE_GROUP);
 	BLI_assert(BLI_findindex(oldlist, item) != -1);
 
 	item->parent = group;
diff --git a/source/blender/blenkernel/intern/object_layer.c b/source/blender/blenkernel/intern/object_layer.c
index ff9d79e..62829cd 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -33,27 +33,26 @@
 #include "MEM_guardedalloc.h"
 
 
-static void objectlayer_free(LayerTreeItem *litem)
-{
-	LayerTypeObject *oblayer = (LayerTypeObject *)litem;
-	if (oblayer->bases) {
-		MEM_freeN(oblayer->bases);
-	}
-}
-
 LayerTreeItem *BKE_objectlayer_add(
         LayerTree *tree, LayerTreeItem *parent, const char *name,
-        const LayerItemPollFunc poll, LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings)
+        LayerItemDrawFunc draw, LayerItemDrawSettingsFunc draw_settings)
 {
 	LayerTypeObject *oblayer = MEM_callocN(sizeof(LayerTypeObject), __func__);
 
 	BLI_assert(tree->type == LAYER_TREETYPE_OBJECT);
-	BKE_layeritem_register(tree, &oblayer->litem, parent, LAYER_ITEMTYPE_LAYER, name, poll, draw, draw_settings);
-	oblayer->litem.free = objectlayer_free;
+	BKE_layeritem_register(tree, &oblayer->litem, parent, LAYER_ITEMTYPE_LAYER, name, draw, draw_settings);
 
 	return &oblayer->litem;
 }
 
+void BKE_objectlayer_free(LayerTreeItem *litem)
+{
+	LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+	if (oblayer->bases) {
+		MEM_freeN(oblayer->bases);
+	}
+}
+
 static void objectlayer_array_resize(LayerTypeObject *oblayer, unsigned int new_tot_objects)
 {
 	if (new_tot_objects > 0) {
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ce4347f..aee659a 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5834,7 +5834,7 @@ static void direct_link_layeritems(FileData *fd, ListBase *layeritems, LayerTree
 		litem->prop = newdataadr(fd, litem->prop);
 		IDP_D

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list