[Bf-blender-cvs] [021a7c0] soc-2016-layer_manager: Avoid recursive drawing of layer group members

Julian Eisel noreply at git.blender.org
Thu Jun 30 21:54:17 CEST 2016


Commit: 021a7c07e3ea2c1490397dd61fd89d1e85a07818
Author: Julian Eisel
Date:   Thu Jun 30 21:47:28 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB021a7c07e3ea2c1490397dd61fd89d1e85a07818

Avoid recursive drawing of layer group members

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

M	source/blender/editors/space_layers/layers_draw.c

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

diff --git a/source/blender/editors/space_layers/layers_draw.c b/source/blender/editors/space_layers/layers_draw.c
index 1075615..137aeb0 100644
--- a/source/blender/editors/space_layers/layers_draw.c
+++ b/source/blender/editors/space_layers/layers_draw.c
@@ -176,27 +176,6 @@ static void layers_tiles_draw_floating(const bContext *C, struct FloatingTileDra
 	UI_block_draw(C, block);
 }
 
-/**
- * \note Recursive.
- */
-static void layers_tiles_draw_childs(
-        const ListBase *childs, const bContext *C, uiBlock *block,
-        float *r_ofs_y, int *r_idx)
-{
-	SpaceLayers *slayer = CTX_wm_space_layers(C);
-	ARegion *ar = CTX_wm_region(C);
-	uiStyle *style = UI_style_get_dpi();
-
-	for (LayerTreeItem *litem = childs->first; litem; litem = litem->next) {
-		LayerTile *tile = BLI_ghash_lookup(slayer->tiles, litem);
-		*r_ofs_y += layer_tile_draw(tile, C, ar, block, style, *r_ofs_y, *r_idx);
-		(*r_idx)++;
-		if (!BLI_listbase_is_empty(&litem->childs)) {
-			layers_tiles_draw_childs(&litem->childs, C, block, r_ofs_y, r_idx);
-		}
-	}
-}
-
 static void layers_tiles_draw_fixed(
         const bContext *C,
         float *r_ofs_y, int *r_idx,
@@ -210,7 +189,8 @@ static void layers_tiles_draw_fixed(
 	 * fixed tiles are drawn over background of floating ones. */
 	uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
 
-	for (LayerTreeItem *litem = slayer->act_tree->items.last; litem; litem = litem->prev) {
+	BKE_LAYERTREE_ITER_START(slayer->act_tree, 0, i, litem)
+	{
 		LayerTile *tile = BLI_ghash_lookup(slayer->tiles, litem);
 		BLI_assert(tile->litem == litem);
 
@@ -226,15 +206,14 @@ static void layers_tiles_draw_fixed(
 			continue;
 		}
 
-		if (litem->type->draw) {
+		/* layers_tile_is_visible does ghash lookup for each parent until a collapsed one is found.
+		 * We could avoid some lookups but it's highly unlikely to cause a notable difference */
+		if (litem->type->draw && layers_tile_is_visible(slayer, tile)) {
 			*r_ofs_y += layer_tile_draw(tile, C, ar, block, style, *r_ofs_y, *r_idx);
 			(*r_idx)++;
-			/* draw children */
-			if (!(tile->flag & LAYERTILE_CLOSED)) {
-				layers_tiles_draw_childs(&litem->childs, C, block, r_ofs_y, r_idx);
-			}
 		}
 	}
+	BKE_LAYERTREE_ITER_END;
 
 	UI_block_end(C, block);
 	UI_block_draw(C, block);




More information about the Bf-blender-cvs mailing list