[Bf-blender-cvs] [dd61b7d346] render-layers: Add scene active layer

Dalai Felinto noreply at git.blender.org
Wed Jan 25 18:03:06 CET 2017


Commit: dd61b7d346fe8ead3405c9168c43919ac4187049
Author: Dalai Felinto
Date:   Wed Jan 25 18:02:09 2017 +0100
Branches: render-layers
https://developer.blender.org/rBdd61b7d346fe8ead3405c9168c43919ac4187049

Add scene active layer

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

M	release/scripts/startup/bl_ui/properties_render_layer.py
M	source/blender/blenkernel/intern/context.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/editors/render/render_shading.c
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c
M	tests/python/bl_render_layer.py

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

diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index 9b8bc237db..639e6fa6c9 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -35,7 +35,7 @@ class RenderLayerButtonsPanel:
 
 class RENDERLAYER_UL_renderlayers(UIList):
     def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
-        # assert(isinstance(item, bpy.types.SceneRenderLayer)
+        # assert(isinstance(item, bpy.types.SceneLayer)
         layer = item
         if self.layout_type in {'DEFAULT', 'COMPACT'}:
             layout.prop(layer, "name", text="", icon_value=icon, emboss=False)
@@ -62,7 +62,7 @@ class RENDERLAYER_PT_layers(RenderLayerButtonsPanel, Panel):
 
         row = layout.row()
         col = row.column()
-        col.template_list("RENDERLAYER_UL_renderlayers", "", rd, "layers", rd.layers, "active_index", rows=2)
+        col.template_list("RENDERLAYER_UL_renderlayers", "", scene, "render_layers", scene.render_layers, "active_index", rows=2)
 
         col = row.column()
         sub = col.column(align=True)
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index f31b844155..8025732efe 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -907,9 +907,9 @@ SceneLayer *CTX_data_scene_layer(const bContext *C)
 	}
 	else {
 		Scene *scene = CTX_data_scene(C);
-		/* temporary, waiting for workspace or scene active layer */
-		TODO_LAYER_CONTEXT;
-		return scene->render_layers.last;
+		sl = BLI_findlink(&scene->render_layers, scene->active_layer);
+		BLI_assert(sl);
+		return sl;
 	}
 }
 
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 40cba30437..f7b396b11c 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -57,7 +57,13 @@ static void object_bases_Iterator_next(Iterator *iter, const int flag);
  */
 SceneLayer *BKE_scene_layer_add(Scene *scene, const char *name)
 {
+	if (!name) {
+		name = DATA_("Render Layer");
+	}
+
 	SceneLayer *sl = MEM_callocN(sizeof(SceneLayer), "Scene Layer");
+	sl->flag |= SCENE_LAYER_RENDER;
+
 	BLI_addtail(&scene->render_layers, sl);
 
 	/* unique name */
@@ -85,9 +91,11 @@ bool BKE_scene_layer_remove(Main *bmain, Scene *scene, SceneLayer *sl)
 	}
 
 	BLI_remlink(&scene->render_layers, sl);
+
 	BKE_scene_layer_free(sl);
 	MEM_freeN(sl);
 
+	scene->active_layer = 0;
 	/* TODO WORKSPACE: set active_layer to 0 */
 
 	for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) {
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 6706a33b6b..28952795b4 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -78,6 +78,8 @@ void blo_do_versions_after_linking_280(Main *main)
 					}
 				}
 
+				scene->active_layer = 0;
+
 				if (!BKE_scene_uses_blender_game(scene)) {
 					for (SceneRenderLayer *srl = scene->r.layers.first; srl; srl = srl->next) {
 
@@ -107,6 +109,10 @@ void blo_do_versions_after_linking_280(Main *main)
 
 						/* TODO: passes, samples, mask_layesr, exclude, ... */
 					}
+
+					if (BLI_findlink(&scene->render_layers, scene->r.actlay)) {
+						scene->active_layer = scene->r.actlay;
+					}
 				}
 
 				SceneLayer *sl = BKE_scene_layer_add(scene, "Render Layer");
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 837573ad17..984aa6e43c 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -54,6 +54,7 @@
 #include "BKE_font.h"
 #include "BKE_global.h"
 #include "BKE_image.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_linestyle.h"
 #include "BKE_main.h"
@@ -626,11 +627,11 @@ static int render_layer_add_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	Scene *scene = CTX_data_scene(C);
 
-	BKE_scene_add_render_layer(scene, NULL);
-	scene->r.actlay = BLI_listbase_count(&scene->r.layers) - 1;
+	BKE_scene_layer_add(scene, NULL);
+	scene->active_layer = BLI_listbase_count(&scene->render_layers) - 1;
 
 	DAG_id_tag_update(&scene->id, 0);
-	WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene);
+	WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene);
 	
 	return OPERATOR_FINISHED;
 }
@@ -652,10 +653,11 @@ void SCENE_OT_render_layer_add(wmOperatorType *ot)
 static int render_layer_remove_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	Scene *scene = CTX_data_scene(C);
-	SceneRenderLayer *rl = BLI_findlink(&scene->r.layers, scene->r.actlay);
+	SceneLayer *sl = BLI_findlink(&scene->render_layers, scene->active_layer);
 
-	if (!BKE_scene_remove_render_layer(CTX_data_main(C), scene, rl))
+	if (!BKE_scene_layer_remove(CTX_data_main(C), scene, sl)) {
 		return OPERATOR_CANCELLED;
+	}
 
 	DAG_id_tag_update(&scene->id, 0);
 	WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene);
diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h
index b1f988945f..d45334a227 100644
--- a/source/blender/makesdna/DNA_layer_types.h
+++ b/source/blender/makesdna/DNA_layer_types.h
@@ -62,7 +62,8 @@ typedef struct SceneLayer {
 	char name[64]; /* MAX_NAME */
 	char engine[32]; /* render engine */
 	short active_collection;
-	short pad[3];
+	short flag;
+	short pad[2];
 	ListBase object_bases;      /* ObjectBase */
 	struct ObjectBase *basact;
 	ListBase layer_collections; /* LayerCollection */
@@ -92,6 +93,11 @@ enum {
 	COLLECTION_FOLDED     = (1 << 2),
 };
 
+/* SceneLayer->flag */
+enum {
+	SCENE_LAYER_RENDER = (1 << 0),
+};
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 648002ea85..cb267002a5 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1711,6 +1711,8 @@ typedef struct Scene {
 
 	ListBase render_layers;
 	struct SceneCollection *collection;
+	int active_layer;
+	int pad4;
 } Scene;
 
 /* **************** RENDERDATA ********************* */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 018ce7a98f..64feb82020 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -2532,6 +2532,44 @@ static int rna_SceneLayer_multiple_engines_get(PointerRNA *UNUSED(ptr))
 	return (BLI_listbase_count(&R_engines) > 1);
 }
 
+static int rna_SceneLayer_active_layer_index_get(PointerRNA *ptr)
+{
+	Scene *scene = (Scene *)ptr->data;
+	return scene->active_layer;
+}
+
+static void rna_SceneLayer_active_layer_index_set(PointerRNA *ptr, int value)
+{
+	Scene *scene = (Scene *)ptr->data;
+	int num_layers = BLI_listbase_count(&scene->render_layers);
+	scene->active_layer = min_ff(value, num_layers - 1);
+}
+
+static void rna_SceneLayer_active_layer_index_range(
+        PointerRNA *ptr, int *min, int *max, int *UNUSED(softmin), int *UNUSED(softmax))
+{
+	Scene *scene = (Scene *)ptr->data;
+
+	*min = 0;
+	*max = max_ii(0, BLI_listbase_count(&scene->render_layers) - 1);
+}
+
+static PointerRNA rna_SceneLayer_active_layer_get(PointerRNA *ptr)
+{
+	Scene *scene = (Scene *)ptr->data;
+	SceneLayer *sl = BLI_findlink(&scene->render_layers, scene->active_layer);
+
+	return rna_pointer_inherit_refine(ptr, &RNA_SceneLayer, sl);
+}
+
+static void rna_SceneLayer_active_layer_set(PointerRNA *ptr, PointerRNA value)
+{
+	Scene *scene = (Scene *)ptr->data;
+	SceneLayer *sl = (SceneLayer *)value.data;
+	const int index = BLI_findindex(&scene->render_layers, sl);
+	if (index != -1) scene->active_layer = index;
+}
+
 static SceneLayer *rna_SceneLayer_new(ID *id, Scene *UNUSED(sce), const char *name)
 {
 	Scene *scene = (Scene *)id;
@@ -5680,6 +5718,12 @@ static void rna_def_scene_layer(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Objects", "All the objects in this layer");
 	rna_def_layer_objects(brna, prop);
 
+	/* layer options */
+	prop = RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", SCENE_LAYER_RENDER);
+	RNA_def_property_ui_text(prop, "Enabled", "Disable or enable the render layer");
+	RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL);
+
 	/* engine */
 	prop = RNA_def_property(srna, "engine", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_items(prop, engine_items);
@@ -5700,12 +5744,29 @@ static void rna_def_scene_layers(BlenderRNA *brna, PropertyRNA *cprop)
 	StructRNA *srna;
 	FunctionRNA *func;
 	PropertyRNA *parm;
+	PropertyRNA *prop;
 
 	RNA_def_property_srna(cprop, "SceneLayers");
 	srna = RNA_def_struct(brna, "SceneLayers", NULL);
 	RNA_def_struct_sdna(srna, "Scene");
 	RNA_def_struct_ui_text(srna, "Render Layers", "Collection of render layers");
 
+	prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
+	RNA_def_property_int_sdna(prop, NULL, "active_layer");
+	RNA_def_property_int_funcs(prop, "rna_SceneLayer_active_layer_index_get",
+	                           "rna_SceneLayer_active_layer_index_set",
+	                           "rna_SceneLayer_active_layer_index_range");
+	RNA_def_property_ui_text(prop, "Active Layer Index", "Active index in render layer array");
+	RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL);
+
+	prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+	RNA_def_property_struct_type(prop, "SceneLayer");
+	RNA_def_property_pointer_funcs(prop, "rna_SceneLayer_active_layer_get",
+	                               "rna_SceneLayer_active_layer_set", NULL, NULL);
+	RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL);
+	RNA_def_property_ui_text(prop, "Active Render Layer", "Active Render Layer");
+	RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL);
+
 	func = RNA_def_function(srna, "new", "rna_SceneLayer_new");
 	RNA_def_function_ui_description(func, "Add a render layer to scene");
 	RNA_def_function_flag(func, FUNC_USE_SELF_ID);
diff --git a/tests

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list