[Bf-blender-cvs] [76fa706] soc-2016-layer_manager: Initially add visibility bits as layer property

Julian Eisel noreply at git.blender.org
Sat Aug 13 03:37:55 CEST 2016


Commit: 76fa706bef6e36b4ebac185dd26b7e71763ed9c5
Author: Julian Eisel
Date:   Sat Aug 13 03:33:02 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB76fa706bef6e36b4ebac185dd26b7e71763ed9c5

Initially add visibility bits as layer property

As decided in T38384, this adds the visibility bits as layer property for testing.
Each layer now has the 20 visibility bits that are compared to the ones from the object. The viewport header shows the bits of the active layer.

The bits currently only affect drawing.

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

M	source/blender/blenkernel/intern/object_layer.c
M	source/blender/editors/scene/layer_types.c
M	source/blender/editors/space_layers/layers_ops.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_header.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 54510f1..74e86cc 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -40,6 +40,7 @@ LayerTreeItem *BKE_objectlayer_add(LayerTree *tree, LayerTreeItem *parent, const
 	LayerTypeObject *oblayer = MEM_callocN(sizeof(LayerTypeObject), __func__);
 
 	BLI_assert(tree->type == LAYER_TREETYPE_OBJECT);
+	oblayer->visibility_bits = 1; /* Should always be same default as set in LAYERTYPE_object */
 	BKE_layeritem_register(tree, &oblayer->litem, parent, LAYER_ITEMTYPE_LAYER, name);
 
 	return &oblayer->litem;
diff --git a/source/blender/editors/scene/layer_types.c b/source/blender/editors/scene/layer_types.c
index 9b7b494..5b377ca 100644
--- a/source/blender/editors/scene/layer_types.c
+++ b/source/blender/editors/scene/layer_types.c
@@ -48,6 +48,8 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#define TOT_VISIBILITY_BITS 20
+
 
 static void layer_visibility_update_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
 {
@@ -90,14 +92,51 @@ static void object_layer_draw(const bContext *C, LayerTreeItem *litem, uiLayout
 	layer_visibility_but_draw(block, layout, litem);
 }
 
+static void layer_visibility_bit_update_cb(struct Main *UNUSED(main), Scene *scene, PointerRNA *ptr)
+{
+	LayerTreeItem *container = NULL;
+
+	BKE_LAYERTREE_ITER_START(scene->object_layers, 0, i, litem)
+	{
+		if (litem->ptr->data == ptr->data) {
+			container = litem;
+			break;
+		}
+	}
+	BKE_LAYERTREE_ITER_END;
+	BLI_assert(container && container->type->type == LAYER_ITEMTYPE_LAYER);
+
+	LayerTypeObject *oblayer = (LayerTypeObject *)container;
+	PropertyRNA *prop = RNA_struct_find_property(ptr, "visibility_bits");
+	int bits[TOT_VISIBILITY_BITS];
+
+	RNA_property_boolean_get_array(ptr, prop, bits);
+
+	oblayer->visibility_bits = 0;
+	for (int i = 0; i < TOT_VISIBILITY_BITS; i++) {
+		if (bits[i]) {
+			oblayer->visibility_bits |= (1 << i);
+		}
+	}
+}
+
 static void object_layer_draw_settings(const bContext *UNUSED(C), LayerTreeItem *litem, uiLayout *layout)
 {
 	uiLayout *split = uiLayoutSplit(layout, 0.5f, false);
 	uiItemR(split, litem->ptr, "color_set", 0, "Color Set", ICON_NONE);
+
+	uiLayout *row = uiLayoutRow(split, false);
+	uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT);
+	uiItemL(row, "Visibility Bits:", ICON_NONE);
+	uiTemplateLayers(row, litem->ptr, "visibility_bits", NULL, NULL, 0);
 }
 
 static void LAYERTYPE_object(LayerType *lt)
 {
+	/* Should always be same default as set in BKE_objectlayer_add */
+	static int default_bits[TOT_VISIBILITY_BITS] = {1};
+	PropertyRNA *prop;
+
 	lt->idname = __func__;
 	/* XXX Should re-evaluate how eLayerTreeItem_Type is used */
 	lt->type = LAYER_ITEMTYPE_LAYER;
@@ -107,6 +146,9 @@ static void LAYERTYPE_object(LayerType *lt)
 	lt->free = BKE_objectlayer_free;
 
 	RNA_def_enum(lt->srna, "color_set", rna_enum_color_sets_items, 0, "Color Set", "Custom color set for this layer");
+	prop = RNA_def_boolean_layer_member(lt->srna, "visibility_bits", TOT_VISIBILITY_BITS, default_bits,
+	                                    "Visibility Bits", "");
+	RNA_def_property_update_runtime(prop, layer_visibility_bit_update_cb);
 }
 
 
diff --git a/source/blender/editors/space_layers/layers_ops.c b/source/blender/editors/space_layers/layers_ops.c
index 2ae4232..08b53fe 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -529,6 +529,9 @@ BLI_INLINE void layer_selection_set(SpaceLayers *slayer, LayerTile *tile, const
 	if (enable) {
 		(tile->flag |= LAYERTILE_SELECTED);
 		slayer->act_tree->active_layer = tile->litem;
+
+		/* 3D view content depends on active layer so send notifier when active layer changes */
+		WM_main_add_notifier(NC_SCENE | ND_LAYER, NULL);
 	}
 	else {
 		tile->flag &= ~LAYERTILE_SELECTED;
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 6ff6808..fac3dff 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2836,7 +2836,9 @@ static void view3d_objectlayers_drawstep_draw(
 			LayerTypeObject *oblayer = (LayerTypeObject *)litem;
 			BKE_OBJECTLAYER_BASES_ITER_START(oblayer, j, base)
 			{
-				view3d_object_drawstep_draw(scene, v3d, ar, base, drawstep, drawflag, r_lay_used);
+				if (base->lay & oblayer->visibility_bits) {
+					view3d_object_drawstep_draw(scene, v3d, ar, base, drawstep, drawflag, r_lay_used);
+				}
 			}
 			BKE_OBJECTLAYER_BASES_ITER_END;
 		}
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 0713377..883486d 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -385,7 +385,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
 		unsigned int ob_lay = ob ? ob->lay : 0;
 
 		/* Layers */
-		uiTemplateLayers(layout, v3d->scenelock ? &sceneptr : &v3dptr, "layers", &v3dptr, "layers_used", ob_lay);
+		uiTemplateLayers(layout, scene->object_layers->active_layer->ptr, "visibility_bits", NULL, NULL, ob_lay);
 
 		/* Scene lock */
 		uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 4571301..e1fc05c 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -133,7 +133,7 @@ typedef struct LayerTypeObject {
 	LayerTreeItem litem;
 	Base **bases;           /* Array of objects assigned to this layer. */
 	unsigned int tot_bases; /* amount of objects assigned to this layer */
-	int pad;
+	int visibility_bits;
 } LayerTypeObject;
 
 /* ************************************************************* */




More information about the Bf-blender-cvs mailing list