[Bf-blender-cvs] [a0c235d] soc-2016-layer_manager: Give objects info about the layer they're in

Julian Eisel noreply at git.blender.org
Thu Jul 7 00:35:44 CEST 2016


Commit: a0c235df33662df65f25dea2807aca7babb02aa3
Author: Julian Eisel
Date:   Thu Jul 7 00:33:52 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBa0c235df33662df65f25dea2807aca7babb02aa3

Give objects info about the layer they're in

We can avoid quite some lookups by doing this.
It's technically not complete yet, but will continue work in a separate commit.

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object_layer.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/makesdna/DNA_scene_types.h

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index a77166d..60fa0b2 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -282,9 +282,9 @@ bool BKE_object_modifier_update_subframe(struct Scene *scene, struct Object *ob,
 struct LayerTreeItem *BKE_objectlayer_add(struct LayerTree *tree, struct LayerTreeItem *parent, const char *name);
 void BKE_objectlayer_free(struct LayerTreeItem *litem);
 void BKE_objectlayer_base_assign(struct Base *base, struct LayerTreeItem *litem, const bool has_reserved);
-void BKE_objectlayer_base_unassign(const struct Base *base, struct LayerTreeItem *litem);
+void BKE_objectlayer_base_unassign(struct Base *base, struct LayerTreeItem *litem);
+void BKE_objectlayer_bases_unassign_all(struct LayerTreeItem *litem, const bool unset_base_layer);
 void BKE_objectlayer_base_entries_reserve(struct LayerTreeItem *litem, const unsigned int nentries_reserve);
-struct LayerTypeObject *BKE_objectlayer_from_base(struct LayerTree *ltree, const struct Base *base, const bool inverse);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/object_layer.c b/source/blender/blenkernel/intern/object_layer.c
index 21eec49..5d1b6f6 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -74,12 +74,13 @@ void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem, const bool ha
 		objectlayer_array_resize(oblayer, oblayer->tot_bases);
 	}
 	oblayer->bases[oblayer->tot_bases - 1] = base;
+	base->layer = litem;
 }
 
 /**
  * Un-assign \a base from object layer \a litem.
  */
-void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem)
+void BKE_objectlayer_base_unassign(Base *base, LayerTreeItem *litem)
 {
 	LayerTypeObject *oblayer = (LayerTypeObject *)litem;
 
@@ -92,45 +93,40 @@ void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem)
 			has_base = true;
 		}
 	}
+	base->layer = NULL;
 
 	objectlayer_array_resize(oblayer, --oblayer->tot_bases);
 }
 
 /**
- * Reserve memory for \a nentries_reserve number of entries. Use to avoid multiple
- * allocations, but note that it's up to you to insert the entries correctly.
+ * Unassign all bases.
+ * \param unset_base_layer: Unset Base.layer of all bases in the layer. This is done in an extra
+ *                          loop which can be avoided in some cases, so making it optional.
  */
-void BKE_objectlayer_base_entries_reserve(LayerTreeItem *litem, const unsigned int nentries_reserve)
+void BKE_objectlayer_bases_unassign_all(LayerTreeItem *litem, const bool unset_base_layer)
 {
 	LayerTypeObject *oblayer = (LayerTypeObject *)litem;
-	objectlayer_array_resize(oblayer, nentries_reserve);
+
+	if (!oblayer->bases)
+		return;
+
+	if (unset_base_layer) {
+		BKE_OBJECTLAYER_BASES_ITER_START(oblayer, i, base)
+		{
+			base->layer = NULL;
+		}
+		BKE_OBJECTLAYER_BASES_ITER_END;
+	}
+	MEM_freeN(oblayer->bases);
+	oblayer->tot_bases = 0;
 }
 
 /**
- * Find the first layer that has \a base in it.
- * \param inverse: Do inverse loockup to find last layer rather than first one.
+ * Reserve memory for \a nentries_reserve number of entries. Use to avoid multiple
+ * allocations, but note that it's up to you to insert the entries correctly.
  */
-LayerTypeObject *BKE_objectlayer_from_base(LayerTree *ltree, const Base *base, const bool inverse)
+void BKE_objectlayer_base_entries_reserve(LayerTreeItem *litem, const unsigned int nentries_reserve)
 {
-	BLI_assert(ltree->type == LAYER_TREETYPE_OBJECT);
-
-	/* XXX Does (n^2) lookup. Bases/Objects should have some layer info instead. */
-	for (int i = inverse ? ltree->tot_items - 1 : 0;
-	     inverse ? i >= 0 : i < ltree->tot_items;
-	     inverse ? i-- : i++)
-	{
-		LayerTreeItem *litem = ltree->items_all[i];
-		if (litem->type->type == LAYER_ITEMTYPE_LAYER) {
-			LayerTypeObject *oblayer = (LayerTypeObject *)litem;
-			BKE_OBJECTLAYER_BASES_ITER_START(oblayer, j, iterbase)
-			{
-				if (iterbase == base) {
-					return oblayer;
-				}
-			}
-			BKE_OBJECTLAYER_BASES_ITER_END;
-		}
-	}
-
-	return NULL;
+	LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+	objectlayer_array_resize(oblayer, nentries_reserve);
 }
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index aaa4e33..b93bb7d 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -7583,7 +7583,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
 
 		if (is_wire_color) {
 #ifdef WITH_ADVANCED_LAYERS
-			ThemeWireColor *wcol = view3d_layer_color_from_base(scene->object_layers, base);
+			ThemeWireColor *wcol = view3d_layer_color_from_base(base);
 			if (wcol) {
 				if (base->flag & SELECT) {
 					ob_wire_col = (unsigned char *)(scene->basact == base ? wcol->active : wcol->select);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 80b7ecd..c0d63c7 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -125,11 +125,10 @@ extern void bl_debug_color_set(const unsigned int col);
 #endif
 
 #ifdef WITH_ADVANCED_LAYERS
-ThemeWireColor *view3d_layer_color_from_base(LayerTree *ltree, const Base *base)
+ThemeWireColor *view3d_layer_color_from_base(const Base *base)
 {
 	bTheme *btheme = UI_GetTheme();
-	LayerTypeObject *oblayer = BKE_objectlayer_from_base(ltree, base, true);
-	const int col_idx = oblayer ? RNA_enum_get(oblayer->litem.ptr, "color_set") : 0;
+	const int col_idx = base->layer ? RNA_enum_get(base->layer->ptr, "color_set") : 0;
 
 	return (col_idx > 0) ? &btheme->tarm[col_idx - 1] : NULL;
 }
@@ -2234,7 +2233,7 @@ static void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, Base *bas
 
 	if (is_wire_color) {
 #ifdef WITH_ADVANCED_LAYERS
-		ThemeWireColor *wcol = view3d_layer_color_from_base(scene->object_layers, base);
+		ThemeWireColor *wcol = view3d_layer_color_from_base(base);
 		if (wcol) {
 			glColor3ubv((unsigned char *)(base->flag & SELECT ? wcol->select : wcol->solid));
 
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index c970483..fb514bf 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -193,7 +193,7 @@ void ED_view3d_draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d);
 void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag);
 
 #ifdef WITH_ADVANCED_LAYERS
-struct ThemeWireColor *view3d_layer_color_from_base(struct LayerTree *ltree, const Base *base);
+struct ThemeWireColor *view3d_layer_color_from_base(const Base *base);
 #endif
 void circf(float x, float y, float rad);
 void circ(float x, float y, float rad);
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 11500c6..09377c3 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -77,6 +77,7 @@ typedef struct Base {
 	int flag;
 	short sx, sy;
 	struct Object *object;
+	struct LayerTreeItem *layer; /* The layer this base is assigned to (might need to add to object struct as well) */
 } Base;
 
 /* ------------------------------------------- */




More information about the Bf-blender-cvs mailing list