[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