[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