[Bf-blender-cvs] [5190bd9] soc-2016-layer_manager: Optimize base lookups by storing index in bases
Julian Eisel
noreply at git.blender.org
Fri Aug 12 15:34:29 CEST 2016
Commit: 5190bd94cbf486c052f5ac5824d65b638c42871d
Author: Julian Eisel
Date: Fri Aug 12 03:05:19 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB5190bd94cbf486c052f5ac5824d65b638c42871d
Optimize base lookups by storing index in bases
===================================================================
M source/blender/blenkernel/intern/object_layer.c
M source/blender/editors/space_layers/layers_ops.c
M source/blender/makesdna/DNA_scene_types.h
===================================================================
diff --git a/source/blender/blenkernel/intern/object_layer.c b/source/blender/blenkernel/intern/object_layer.c
index 165cbfa..b04a102 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -73,18 +73,18 @@ void BKE_objectlayer_base_assign_ex(Base *base, LayerTreeItem *litem, const bool
{
LayerTypeObject *oblayer = (LayerTypeObject *)litem;
- oblayer->tot_bases++;
-
if (!has_reserved) {
- objectlayer_array_resize(oblayer, oblayer->tot_bases);
+ objectlayer_array_resize(oblayer, oblayer->tot_bases + 1);
}
/* offset current elements to give space for new one at start of array */
- if (add_head && oblayer->tot_bases > 1) {
- memmove(oblayer->bases[1], oblayer->bases[0], sizeof(*oblayer->bases) * oblayer->tot_bases - 1);
+ if (add_head && oblayer->tot_bases > 0) {
+ memmove(oblayer->bases[1], oblayer->bases[0], sizeof(*oblayer->bases) * oblayer->tot_bases);
}
- oblayer->bases[add_head ? 0 : oblayer->tot_bases - 1] = base;
base->layer = litem;
+ base->index = add_head ? 0 : oblayer->tot_bases;
+ oblayer->bases[base->index] = base;
+ oblayer->tot_bases++;
}
/**
@@ -199,19 +199,20 @@ Base *BKE_objectlayer_base_last_find(const LayerTree *ltree)
Base *BKE_objectlayer_base_next_find(const Base *prev)
{
- bool found_prev = false;
- BKE_LAYERTREE_ITER_START(prev->layer->tree, prev->layer->index, i, litem)
+ LayerTypeObject *oblayer = (LayerTypeObject *)prev->layer;
+
+ /* can directly access if next object is on same layer as prev */
+ if ((prev->index + 1) < oblayer->tot_bases) {
+ return oblayer->bases[prev->index + 1];
+ }
+ /* else, have to do lookup starting from next layer */
+ BKE_LAYERTREE_ITER_START(prev->layer->tree, prev->layer->index + 1, i, litem)
{
if (litem->type->type == LAYER_ITEMTYPE_LAYER) {
- LayerTypeObject *oblayer = (LayerTypeObject *)litem;
- BKE_OBJECTLAYER_BASES_ITER_START(oblayer, j, base_iter)
+ LayerTypeObject *oblayer_iter = (LayerTypeObject *)litem;
+ BKE_OBJECTLAYER_BASES_ITER_START(oblayer_iter, j, base_iter)
{
- if (found_prev) {
- return base_iter;
- }
- else if (base_iter == prev) {
- found_prev = true;
- }
+ return base_iter;
}
BKE_OBJECTLAYER_BASES_ITER_END;
}
diff --git a/source/blender/editors/space_layers/layers_ops.c b/source/blender/editors/space_layers/layers_ops.c
index c144db8..5c977b4 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -184,6 +184,7 @@ static int layer_remove_exec(bContext *C, wmOperator *op)
break;
}
}
+ /* XXX else, what happens to objects? */
layers_tile_remove(slayer, tile, true);
BKE_layeritem_remove(litem, true);
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index caa2434..c0ca1b3 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -79,6 +79,7 @@ typedef struct Base {
short sx, sy;
struct Object *object;
struct LayerTreeItem *layer; /* The layer this base is assigned to. Synced with Object.layer */
+ int index, pad; /* the index of this Base within the object layer */
} Base;
/* ------------------------------------------- */
More information about the Bf-blender-cvs
mailing list