[Bf-blender-cvs] [a208942] soc-2016-layer_manager: Use a pointer hash table to get a LayerTile from a LayerTreeItem

Julian Eisel noreply at git.blender.org
Sat May 28 03:12:57 CEST 2016


Commit: a2089424342914c4765b4d54ae98dc20824d9489
Author: Julian Eisel
Date:   Sat May 28 03:04:39 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBa2089424342914c4765b4d54ae98dc20824d9489

Use a pointer hash table to get a LayerTile from a LayerTreeItem

Avoids having to store the LayerTile in a void * member of the LayerTreeItem.
LayerTile is layer manager editor struct for info on drawing a LayerTreeItem (which is a more primitive blender kernel struct).

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/editors/space_layers/layers_draw.c
M	source/blender/editors/space_layers/layers_intern.h
M	source/blender/editors/space_layers/layers_ops.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 eae34f7..4df019d 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -105,9 +105,6 @@ typedef struct LayerTreeItem {
 	LayerItemDrawFunc draw;
 	/* drawing of the expanded layer settings (gear wheel icon) */
 	LayerItemDrawSettingsFunc draw_settings;
-
-	/* Ugly, but we use this to store LayerTile data for drawing in layer manager editor. */
-	void *drawdata;
 } LayerTreeItem;
 
 struct LayerTreeItem *BKE_layeritem_add(
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index c7c8c8c..9270e07 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -157,9 +157,6 @@ 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);
-	if (litem->drawdata) {
-		MEM_freeN(litem->drawdata);
-	}
 
 	if (remove_children) {
 		for (LayerTreeItem *child = litem->childs.first, *child_next; child; child = child_next) {
diff --git a/source/blender/editors/space_layers/layers_draw.c b/source/blender/editors/space_layers/layers_draw.c
index f48bf0b..63cb1ab 100644
--- a/source/blender/editors/space_layers/layers_draw.c
+++ b/source/blender/editors/space_layers/layers_draw.c
@@ -22,6 +22,8 @@
  *  \ingroup splayers
  */
 
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 #include "BLI_listbase.h"
 #include "BLI_rect.h"
 
@@ -63,6 +65,7 @@ static int layer_tile_indent_level_get(const LayerTreeItem *litem)
 typedef struct TileDrawInfo {
 	const bContext *C;
 	ARegion *ar;
+	SpaceLayers *slayer;
 	uiBlock *block;
 	uiStyle *style;
 
@@ -73,7 +76,7 @@ static bool layer_tile_draw_cb(LayerTreeItem *litem, void *userdata)
 {
 	TileDrawInfo *drawinfo = userdata;
 	View2D *v2d = &drawinfo->ar->v2d;
-	LayerTile *tile = litem->drawdata;
+	LayerTile *tile = BLI_ghash_lookup(drawinfo->slayer->tiles, litem);
 	const float padx = 4.0f * UI_DPI_FAC;
 
 	const float ofs_x = layer_tile_indent_level_get(litem) * LAYERITEM_INDENT_SIZE;
@@ -126,7 +129,7 @@ void layers_tiles_draw(const bContext *C, ARegion *ar)
 	SpaceLayers *slayer = CTX_wm_space_layers(C);
 
 	uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
-	TileDrawInfo drawinfo = {C, ar, block, UI_style_get_dpi()};
+	TileDrawInfo drawinfo = {C, ar, slayer, block, UI_style_get_dpi()};
 
 	BKE_layertree_iterate(slayer->act_tree, layer_tile_draw_cb, &drawinfo);
 
diff --git a/source/blender/editors/space_layers/layers_intern.h b/source/blender/editors/space_layers/layers_intern.h
index 36db06f..f3de55b 100644
--- a/source/blender/editors/space_layers/layers_intern.h
+++ b/source/blender/editors/space_layers/layers_intern.h
@@ -45,11 +45,11 @@ void layers_tiles_draw(const struct bContext *C, struct ARegion *ar);
 void layer_group_draw(struct LayerTreeItem *litem, struct uiLayout *layout);
 
 /* layers_util.c */
-LayerTile *layers_tile_add(struct LayerTreeItem *litem);
+LayerTile *layers_tile_add(const struct SpaceLayers *slayer, struct LayerTreeItem *litem);
 LayerTile *layers_tile_find_at_coordinate(
-        const struct SpaceLayers *slayer, ARegion *ar, const int co[2],
+        struct SpaceLayers *slayer, ARegion *ar, const int co[2],
         int *r_tile_idx);
-bool layers_any_selected(const struct LayerTree *ltree);
+bool layers_any_selected(struct SpaceLayers *slayer, const struct LayerTree *ltree);
 
 /* layers_ops.c */
 void layers_operatortypes(void);
diff --git a/source/blender/editors/space_layers/layers_ops.c b/source/blender/editors/space_layers/layers_ops.c
index c0185fc..3efe3bc 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -26,6 +26,8 @@
 #include "BKE_layer.h"
 
 #include "BLI_compiler_attrs.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 #include "BLI_listbase.h"
 
 #include "DNA_windowmanager_types.h"
@@ -55,7 +57,7 @@ static int layer_add_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *
 	else {
 		BLI_assert(0);
 	}
-	layers_tile_add(new_item);
+	layers_tile_add(slayer, new_item);
 
 	WM_event_add_notifier(C, NC_SCENE | ND_LAYER, NULL);
 
@@ -77,13 +79,18 @@ static void LAYERS_OT_layer_add(wmOperatorType *ot)
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
+typedef struct {
+	SpaceLayers *slayer;
+	LayerTreeItem *group;
+} GroupAddSelectedData;
+
 static bool layer_group_add_selected_cb(LayerTreeItem *litem, void *customdata)
 {
-	LayerTreeItem *group = customdata;
-	LayerTile *tile = litem->drawdata;
+	GroupAddSelectedData *gadata = customdata;
+	LayerTile *tile = BLI_ghash_lookup(gadata->slayer->tiles, litem);
 
 	if (tile->flag & LAYERTILE_SELECTED) {
-		BKE_layeritem_group_assign(group, litem);
+		BKE_layeritem_group_assign(gadata->group, litem);
 	}
 
 	return true;
@@ -97,10 +104,11 @@ static int layer_group_add_invoke(bContext *C, wmOperator *UNUSED(op), const wmE
 	LayerTreeItem *new_group = BKE_layeritem_add(
 		            scene->object_layers, NULL, LAYER_ITEMTYPE_GROUP, LAYERGROUP_DEFAULT_NAME,
 		            NULL, layer_group_draw, NULL);
-	layers_tile_add(new_group);
+	layers_tile_add(slayer, new_group);
 
 	/* Add selected items to group */
-	BKE_layertree_iterate(slayer->act_tree, layer_group_add_selected_cb, new_group);
+	GroupAddSelectedData gadata = {slayer, new_group};
+	BKE_layertree_iterate(slayer->act_tree, layer_group_add_selected_cb, &gadata);
 
 	WM_event_add_notifier(C, NC_SCENE | ND_LAYER, NULL);
 	return OPERATOR_FINISHED;
@@ -174,7 +182,7 @@ typedef struct LayerSelectData {
 static bool layer_select_cb(LayerTreeItem *litem, void *customdata)
 {
 	LayerSelectData *sdata = customdata;
-	LayerTile *tile = litem->drawdata;
+	LayerTile *tile = BLI_ghash_lookup(sdata->slayer->tiles, litem);
 
 	BLI_assert((sdata->from == -1 && sdata->to == -1) || sdata->from < sdata->to);
 
@@ -284,7 +292,7 @@ static int layer_select_all_toggle_invoke(bContext *C, wmOperator *UNUSED(op), c
 	SpaceLayers *slayer = CTX_wm_space_layers(C);
 
 	/* if a tile was found we deselect all, else we select all */
-	layers_selection_set_all(slayer, !layers_any_selected(slayer->act_tree));
+	layers_selection_set_all(slayer, !layers_any_selected(slayer, slayer->act_tree));
 	ED_region_tag_redraw(CTX_wm_region(C));
 
 	return OPERATOR_FINISHED;
diff --git a/source/blender/editors/space_layers/layers_util.c b/source/blender/editors/space_layers/layers_util.c
index bbaba45..bde548d 100644
--- a/source/blender/editors/space_layers/layers_util.c
+++ b/source/blender/editors/space_layers/layers_util.c
@@ -24,6 +24,8 @@
  * Utility functions for layer manager editor.
  */
 
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 #include "BLI_listbase.h"
 
 #include "BKE_layer.h"
@@ -39,15 +41,16 @@
 /**
  * Allocate and register a LayerTile for \a litem.
  */
-LayerTile *layers_tile_add(LayerTreeItem *litem)
+LayerTile *layers_tile_add(const SpaceLayers *slayer, LayerTreeItem *litem)
 {
 	LayerTile *tile = MEM_callocN(sizeof(LayerTile), __func__);
-	litem->drawdata = tile;
+	BLI_ghash_insert(slayer->tiles, litem, tile);
 	return tile;
 }
 
-typedef struct LayerIsectData {
+typedef struct {
 	/* input values */
+	SpaceLayers *slayer;
 	View2D *v2d;
 	int co_x, co_y;
 
@@ -57,15 +60,15 @@ typedef struct LayerIsectData {
 	/* return values */
 	LayerTile *r_result;
 	int r_idx; /* index of r_result */
-} LayerIsectData;
+} LayerIsectCheckData;
 
 static bool layers_tile_find_at_coordinate_cb(LayerTreeItem *litem, void *customdata)
 {
-	LayerIsectData *idata = customdata;
+	LayerIsectCheckData *idata = customdata;
 
 	idata->ofs_y += litem->height;
 	if (idata->co_y >= -idata->v2d->cur.ymin - idata->ofs_y) {
-		idata->r_result = litem->drawdata;
+		idata->r_result = BLI_ghash_lookup(idata->slayer->tiles, litem);
 		/* found tile, stop iterating */
 		return false;
 	}
@@ -79,10 +82,10 @@ static bool layers_tile_find_at_coordinate_cb(LayerTreeItem *litem, void *custom
  * \param r_tile_idx: Returns the index of the result, -1 if no tile was found.
  */
 LayerTile *layers_tile_find_at_coordinate(
-        const SpaceLayers *slayer, ARegion *ar, const int co[2],
+        SpaceLayers *slayer, ARegion *ar, const int co[2],
         int *r_tile_idx)
 {
-	LayerIsectData idata = {&ar->v2d, co[0], co[1]};
+	LayerIsectCheckData idata = {slayer, &ar->v2d, co[0], co[1]};
 	BKE_layertree_iterate(slayer->act_tree, layers_tile_find_at_coordinate_cb, &idata);
 
 	/* return values */
@@ -92,9 +95,11 @@ LayerTile *layers_tile_find_at_coordinate(
 	return idata.r_result;
 }
 
-static bool layers_has_selected_cb(LayerTreeItem *litem, void *UNUSED(customdata))
+static bool layers_has_selected_cb(LayerTreeItem *litem, void *customdata)
 {
-	LayerTile *tile = litem->drawdata;
+	SpaceLayers *slayer = customdata;
+	LayerTile *tile = BLI_ghash_lookup(slayer->tiles, litem);
+
 	if (tile->flag & LAYERTILE_SELECTED) {
 		/* false tells iterator to stop */
 		return false;
@@ -102,8 +107,8 @@ static bool layers_has_selected_cb(LayerTreeItem *litem, void *UNUSED(customdata
 	return true;
 }
 
-bool layers_any_selected(const LayerTree *ltree)
+bool layers_any_selected(SpaceLayers *slayer, const LayerTree *ltree)
 {
 	/* returns false if iterator was stopped because layers_has_selected_cb found a selected tile */
-	return BKE_layertree_iterate(ltree, layers_has_selected_cb, NULL) == false;
+	return BKE_layertree_iterate(ltree, layers_has_selected_cb, slayer) == false;
 }
diff --git a/source/blender/editors/space_layers/space_layers.c b/source/blender/editors/space_layers/space_layers.c
index 142da89..4594938 100644
--- a/source/blender/editors/space_layers/space_layers.c
+++ b/source/blender/editors/space_layers/space_layers.c
@@ -32,6 +32,7 @@
 #include "BKE_layer.h"
 #include "BKE_screen.h"
 
+#include "BLI_ghash.h"
 #include "BLI_listbase.h"
 
 #include "ED_screen.h"
@@ -58,6 +59,7 @@ static SpaceLink *layers_new(const bContext *C)
 	slayer->spacetype = SPACE_LAYERS;
 	slayer->last_selected = -1;
 	slayer->act_tree = scene->object_layers;
+	slayer->tiles = BLI_ghash_ptr_new("SpaceLaye

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list