[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