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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to