[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41957] trunk/blender/source/blender: Added methods new and remove to scene.render.layers, so now render layers

Sergey Sharybin sergey.vfx at gmail.com
Fri Nov 18 08:11:55 CET 2011


Revision: 41957
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41957
Author:   nazgul
Date:     2011-11-18 07:11:54 +0000 (Fri, 18 Nov 2011)
Log Message:
-----------
Added methods new and remove to scene.render.layers, so now render layers
can be created and removed from scripts.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_scene.h
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/render/render_shading.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c

Modified: trunk/blender/source/blender/blenkernel/BKE_scene.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_scene.h	2011-11-18 05:14:13 UTC (rev 41956)
+++ trunk/blender/source/blender/blenkernel/BKE_scene.h	2011-11-18 07:11:54 UTC (rev 41957)
@@ -44,6 +44,7 @@
 struct Object;
 struct QuicktimeCodecData;
 struct RenderData;
+struct SceneRenderLayer;
 struct Scene;
 struct Text;
 struct Text;
@@ -93,7 +94,8 @@
 
 void scene_update_for_newframe(struct Main *bmain, struct Scene *sce, unsigned int lay);
 
-void scene_add_render_layer(struct Scene *sce);
+struct SceneRenderLayer *scene_add_render_layer(struct Scene *sce, const char *name);
+int scene_remove_render_layer(struct Main *main, struct Scene *scene, struct SceneRenderLayer *srl);
 
 /* render profile */
 int get_render_subsurf_level(struct RenderData *r, int level);

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2011-11-18 05:14:13 UTC (rev 41956)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2011-11-18 07:11:54 UTC (rev 41957)
@@ -44,6 +44,7 @@
 
 #include "DNA_anim_types.h"
 #include "DNA_group_types.h"
+#include "DNA_node_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
@@ -483,7 +484,7 @@
 	sce->r.osa= 8;
 
 	/* note; in header_info.c the scene copy happens..., if you add more to renderdata it has to be checked there */
-	scene_add_render_layer(sce);
+	scene_add_render_layer(sce, NULL);
 	
 	/* game data */
 	sce->gm.stereoflag = STEREO_NOSTEREO;
@@ -1086,13 +1087,16 @@
 }
 
 /* return default layer, also used to patch old files */
-void scene_add_render_layer(Scene *sce)
+SceneRenderLayer *scene_add_render_layer(Scene *sce, const char *name)
 {
 	SceneRenderLayer *srl;
 //	int tot= 1 + BLI_countlist(&sce->r.layers);
-	
+
+	if(!name)
+		name= "RenderLayer";
+
 	srl= MEM_callocN(sizeof(SceneRenderLayer), "new render layer");
-	strcpy(srl->name, "RenderLayer");
+	strcpy(srl->name, name);
 	BLI_uniquename(&sce->r.layers, srl, "RenderLayer", '.', offsetof(SceneRenderLayer, name), sizeof(srl->name));
 	BLI_addtail(&sce->r.layers, srl);
 
@@ -1100,8 +1104,40 @@
 	srl->lay= (1<<20) -1;
 	srl->layflag= 0x7FFF;	/* solid ztra halo edge strand */
 	srl->passflag= SCE_PASS_COMBINED|SCE_PASS_Z;
+
+	return srl;
 }
 
+int scene_remove_render_layer(Main *main, Scene *scene, SceneRenderLayer *srl)
+{
+	Scene *sce;
+	int act= BLI_findindex(&scene->r.layers, srl);
+
+	if(BLI_countlist(&scene->r.layers) <= 1)
+		return 0;
+
+	BLI_remlink(&scene->r.layers, srl);
+	MEM_freeN(srl);
+
+	scene->r.actlay= 0;
+
+	for(sce = main->scene.first; sce; sce = sce->id.next) {
+		if(sce->nodetree) {
+			bNode *node;
+			for(node = sce->nodetree->nodes.first; node; node = node->next) {
+				if(node->type==CMP_NODE_R_LAYERS && (Scene*)node->id==scene) {
+					if(node->custom1==act)
+						node->custom1= 0;
+					else if(node->custom1>act)
+						node->custom1--;
+				}
+			}
+		}
+	}
+
+	return 1;
+}
+
 /* render simplification */
 
 int get_render_subsurf_level(RenderData *r, int lvl)

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2011-11-18 05:14:13 UTC (rev 41956)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2011-11-18 07:11:54 UTC (rev 41957)
@@ -8947,7 +8947,7 @@
 			if(sce->r.yparts<2) sce->r.yparts= 4;
 			/* adds default layer */
 			if(sce->r.layers.first==NULL)
-				scene_add_render_layer(sce);
+				scene_add_render_layer(sce, NULL);
 			else {
 				SceneRenderLayer *srl;
 				/* new layer flag for sky, was default for solid */

Modified: trunk/blender/source/blender/editors/render/render_shading.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_shading.c	2011-11-18 05:14:13 UTC (rev 41956)
+++ trunk/blender/source/blender/editors/render/render_shading.c	2011-11-18 07:11:54 UTC (rev 41957)
@@ -519,7 +519,7 @@
 {
 	Scene *scene= CTX_data_scene(C);
 
-	scene_add_render_layer(scene);
+	scene_add_render_layer(scene, NULL);
 	scene->r.actlay= BLI_countlist(&scene->r.layers) - 1;
 
 	WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
@@ -543,33 +543,12 @@
 
 static int render_layer_remove_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	Scene *scene = CTX_data_scene(C), *sce;
-	SceneRenderLayer *rl;
-	int act= scene->r.actlay;
+	Scene *scene = CTX_data_scene(C);
+	SceneRenderLayer *rl = BLI_findlink(&scene->r.layers, scene->r.actlay);
 
-	if(BLI_countlist(&scene->r.layers) <= 1)
+	if(!scene_remove_render_layer(CTX_data_main(C), scene, rl))
 		return OPERATOR_CANCELLED;
-	
-	rl= BLI_findlink(&scene->r.layers, scene->r.actlay);
-	BLI_remlink(&scene->r.layers, rl);
-	MEM_freeN(rl);
 
-	scene->r.actlay= 0;
-
-	for(sce = CTX_data_main(C)->scene.first; sce; sce = sce->id.next) {
-		if(sce->nodetree) {
-			bNode *node;
-			for(node = sce->nodetree->nodes.first; node; node = node->next) {
-				if(node->type==CMP_NODE_R_LAYERS && (Scene*)node->id==scene) {
-					if(node->custom1==act)
-						node->custom1= 0;
-					else if(node->custom1>act)
-						node->custom1--;
-				}
-			}
-		}
-	}
-
 	WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
 	
 	return OPERATOR_FINISHED;

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene.c	2011-11-18 05:14:13 UTC (rev 41956)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene.c	2011-11-18 07:11:54 UTC (rev 41957)
@@ -734,6 +734,25 @@
 	if (index != -1) rd->actlay= index;
 }
 
+static SceneRenderLayer *rna_RenderLayer_add(ID *id, RenderData *UNUSED(rd), const char *name)
+{
+	Scene *scene= (Scene *)id;
+	SceneRenderLayer *srl= scene_add_render_layer(scene, name);
+
+	WM_main_add_notifier(NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+	return srl;
+}
+
+static void rna_RenderLayer_remove(ID *id, RenderData *UNUSED(rd), Main *bmain, SceneRenderLayer *srl)
+{
+	Scene *scene= (Scene *)id;
+
+	scene_remove_render_layer(bmain, scene, srl);
+
+	WM_main_add_notifier(NC_SCENE|ND_RENDER_OPTIONS, NULL);
+}
+
 static void rna_RenderSettings_engine_set(PointerRNA *ptr, int value)
 {
 	RenderData *rd= (RenderData*)ptr->data;
@@ -2186,8 +2205,8 @@
 	StructRNA *srna;
 	PropertyRNA *prop;
 
-	// FunctionRNA *func;
-	// PropertyRNA *parm; 
+	FunctionRNA *func;
+	PropertyRNA *parm;
 
 	RNA_def_property_srna(cprop, "RenderLayers");
 	srna= RNA_def_struct(brna, "RenderLayers", NULL);
@@ -2209,6 +2228,19 @@
 	RNA_def_property_ui_text(prop, "Active Render Layer", "Active Render Layer");
 	RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
 
+	func= RNA_def_function(srna, "new", "rna_RenderLayer_add");
+	RNA_def_function_ui_description(func, "Add a render layer to scene");
+	RNA_def_function_flag(func, FUNC_USE_SELF_ID);
+	parm= RNA_def_string(func, "name", "RenderLayer", 0, "", "New name for the marker (not unique)");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	parm= RNA_def_pointer(func, "render_layer", "SceneRenderLayer", "", "Newly created render layer");
+	RNA_def_function_return(func, parm);
+
+	func= RNA_def_function(srna, "remove", "rna_RenderLayer_remove");
+	RNA_def_function_ui_description(func, "Remove a render layer");
+	RNA_def_function_flag(func, FUNC_USE_MAIN|FUNC_USE_SELF_ID);
+	parm= RNA_def_pointer(func, "layer", "SceneRenderLayer", "", "Timeline marker to remove");
+	RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 
 static void rna_def_scene_render_data(BlenderRNA *brna)




More information about the Bf-blender-cvs mailing list