[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42807] trunk/blender/intern/cycles/ blender: Cycles: support for multiple render layers.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Dec 21 21:51:56 CET 2011


Revision: 42807
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42807
Author:   blendix
Date:     2011-12-21 20:51:55 +0000 (Wed, 21 Dec 2011)
Log Message:
-----------
Cycles: support for multiple render layers. It currently renders each layer
entirely before moving on to the next.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/addon/ui.py
    trunk/blender/intern/cycles/blender/blender_mesh.cpp
    trunk/blender/intern/cycles/blender/blender_object.cpp
    trunk/blender/intern/cycles/blender/blender_session.cpp
    trunk/blender/intern/cycles/blender/blender_session.h
    trunk/blender/intern/cycles/blender/blender_sync.cpp
    trunk/blender/intern/cycles/blender/blender_sync.h

Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py	2011-12-21 20:51:43 UTC (rev 42806)
+++ trunk/blender/intern/cycles/blender/addon/ui.py	2011-12-21 20:51:55 UTC (rev 42807)
@@ -160,18 +160,17 @@
         scene = context.scene
         rd = scene.render
 
-        # row = layout.row()
-        # row.template_list(rd, "layers", rd.layers, "active_index", rows=2)
+        row = layout.row()
+        row.template_list(rd, "layers", rd.layers, "active_index", rows=2)
 
-        # col = row.column(align=True)
-        # col.operator("scene.render_layer_add", icon='ZOOMIN', text="")
-        # col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="")
+        col = row.column(align=True)
+        col.operator("scene.render_layer_add", icon='ZOOMIN', text="")
+        col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="")
 
         row = layout.row()
-        # rl = rd.layers.active
-        rl = rd.layers[0]
+        rl = rd.layers.active
         row.prop(rl, "name")
-        #row.prop(rd, "use_single_layer", text="", icon_only=True)
+        row.prop(rd, "use_single_layer", text="", icon_only=True)
 
         split = layout.split()
 
@@ -183,6 +182,7 @@
 
         layout.separator()
 
+        rl = rd.layers[0]
         layout.prop(rl, "material_override", text="Material")
 
 

Modified: trunk/blender/intern/cycles/blender/blender_mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_mesh.cpp	2011-12-21 20:51:43 UTC (rev 42806)
+++ trunk/blender/intern/cycles/blender/blender_mesh.cpp	2011-12-21 20:51:55 UTC (rev 42807)
@@ -232,8 +232,10 @@
 
 	BL::Object::material_slots_iterator slot;
 	for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) {
-		if(render_layer.material_override)
-			find_shader(render_layer.material_override, used_shaders, scene->default_surface);
+		BL::Material material_override = render_layers.front().material_override;
+
+		if(material_override)
+			find_shader(material_override, used_shaders, scene->default_surface);
 		else
 			find_shader(slot->material(), used_shaders, scene->default_surface);
 	}

Modified: trunk/blender/intern/cycles/blender/blender_object.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_object.cpp	2011-12-21 20:51:43 UTC (rev 42806)
+++ trunk/blender/intern/cycles/blender/blender_object.cpp	2011-12-21 20:51:55 UTC (rev 42807)
@@ -203,7 +203,7 @@
 void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
 {
 	/* layer data */
-	uint scene_layer = render_layer.scene_layer;
+	uint scene_layer = render_layers.front().scene_layer;
 	
 	/* prepare for sync */
 	light_map.pre_sync();

Modified: trunk/blender/intern/cycles/blender/blender_session.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.cpp	2011-12-21 20:51:43 UTC (rev 42806)
+++ trunk/blender/intern/cycles/blender/blender_session.cpp	2011-12-21 20:51:55 UTC (rev 42807)
@@ -40,7 +40,8 @@
 CCL_NAMESPACE_BEGIN
 
 BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_, BL::Scene b_scene_)
-: b_engine(b_engine_), b_data(b_data_), b_scene(b_scene_), b_v3d(PointerRNA_NULL), b_rv3d(PointerRNA_NULL)
+: b_engine(b_engine_), b_data(b_data_), b_scene(b_scene_), b_v3d(PointerRNA_NULL), b_rv3d(PointerRNA_NULL),
+  b_rr(PointerRNA_NULL), b_rlay(PointerRNA_NULL)
 {
 	/* offline render */
 	BL::RenderSettings r = b_scene.render();
@@ -55,7 +56,8 @@
 
 BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_, BL::Scene b_scene_,
 	BL::SpaceView3D b_v3d_, BL::RegionView3D b_rv3d_, int width_, int height_)
-: b_engine(b_engine_), b_data(b_data_), b_scene(b_scene_), b_v3d(b_v3d_), b_rv3d(b_rv3d_)
+: b_engine(b_engine_), b_data(b_data_), b_scene(b_scene_), b_v3d(b_v3d_), b_rv3d(b_rv3d_),
+  b_rr(PointerRNA_NULL), b_rlay(PointerRNA_NULL)
 {
 	/* 3d view render */
 	width = width_;
@@ -64,6 +66,7 @@
 	last_redraw_time = 0.0f;
 
 	create_session();
+	session->start();
 }
 
 BlenderSession::~BlenderSession()
@@ -99,11 +102,9 @@
 	session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this));
 	session->set_pause(BlenderSync::get_session_pause(b_scene, background));
 
-	/* start rendering */
+	/* set buffer parameters */
 	BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
-
 	session->reset(buffer_params, session_params.samples);
-	session->start();
 }
 
 void BlenderSession::free_session()
@@ -114,43 +115,68 @@
 
 void BlenderSession::render()
 {
-	session->wait();
+	/* get buffer parameters */
+	BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
+	int w = buffer_params.width, h = buffer_params.height;
 
-	if(session->progress.get_cancel())
-		return;
+	/* create render result */
+	RenderResult *rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, 0, 0, w, h);
+	PointerRNA rrptr;
+	RNA_pointer_create(NULL, &RNA_RenderResult, rrp, &rrptr);
+	b_rr = BL::RenderResult(rrptr);
 
-	/* write result */
-	write_render_result();
+	BL::RenderSettings r = b_scene.render();
+	BL::RenderResult::layers_iterator b_iter;
+	BL::RenderLayers b_rr_layers(r.ptr);
+	
+	int active = 0;
+
+	/* render each layer */
+	for(b_rr.layers.begin(b_iter); b_iter != b_rr.layers.end(); ++b_iter, ++active) {
+		/* single layer render */
+		if(r.use_single_layer())
+			active = b_rr_layers.active_index();
+
+		/* set layer */
+		b_rlay = *b_iter;
+
+		/* update scene */
+		sync->sync_data(b_v3d, active);
+
+		/* render */
+		session->start();
+		session->wait();
+
+		if(session->progress.get_cancel())
+			break;
+
+		/* write result */
+		write_render_result();
+	}
+
+	/* delete render result */
+	RE_engine_end_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data);
 }
 
 void BlenderSession::write_render_result()
 {
-	/* get result */
+	/* get state */
 	RenderBuffers *buffers = session->buffers;
 	float exposure = scene->film->exposure;
 	double total_time, sample_time;
 	int sample;
 	session->progress.get_sample(sample, total_time, sample_time);
 
+	/* get pixels */
 	float4 *pixels = buffers->copy_from_device(exposure, sample);
 
 	if(!pixels)
 		return;
 
-	BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
-	int w = buffer_params.width, h = buffer_params.height;
+	/* write pixels */
+	rna_RenderLayer_rect_set(&b_rlay.ptr, (float*)pixels);
+	RE_engine_update_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data);
 
-	struct RenderResult *rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, 0, 0, w, h);
-	PointerRNA rrptr;
-	RNA_pointer_create(NULL, &RNA_RenderResult, rrp, &rrptr);
-	BL::RenderResult rr(rrptr);
-
-	BL::RenderResult::layers_iterator layer;
-	rr.layers.begin(layer);
-	rna_RenderLayer_rect_set(&layer->ptr, (float*)pixels);
-
-	RE_engine_end_result((RenderEngine*)b_engine.ptr.data, rrp);
-
 	delete [] pixels;
 }
 
@@ -164,6 +190,7 @@
 	   scene->params.modified(scene_params)) {
 		free_session();
 		create_session();
+		session->start();
 		return;
 	}
 

Modified: trunk/blender/intern/cycles/blender/blender_session.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.h	2011-12-21 20:51:43 UTC (rev 42806)
+++ trunk/blender/intern/cycles/blender/blender_session.h	2011-12-21 20:51:55 UTC (rev 42807)
@@ -69,6 +69,8 @@
 	BL::Scene b_scene;
 	BL::SpaceView3D b_v3d;
 	BL::RegionView3D b_rv3d;
+	BL::RenderResult b_rr;
+	BL::RenderLayer b_rlay;
 
 	string last_status;
 	float last_progress;

Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp	2011-12-21 20:51:43 UTC (rev 42806)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp	2011-12-21 20:51:55 UTC (rev 42807)
@@ -48,7 +48,8 @@
   light_map(&scene_->lights),
   world_map(NULL),
   world_recalc(false),
-  experimental(false)
+  experimental(false),
+  active_layer(0)
 {
 	scene = scene_;
 	preview = preview_;
@@ -120,10 +121,10 @@
 	return recalc;
 }
 
-void BlenderSync::sync_data(BL::SpaceView3D b_v3d)
+void BlenderSync::sync_data(BL::SpaceView3D b_v3d, int layer)
 {
-	sync_render_layer(b_v3d);
-	sync_integrator();
+	sync_render_layers(b_v3d);
+	sync_integrator(layer);
 	sync_film();
 	sync_shaders();
 	sync_objects(b_v3d);
@@ -131,7 +132,7 @@
 
 /* Integrator */
 
-void BlenderSync::sync_integrator()
+void BlenderSync::sync_integrator(int layer)
 {
 	PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
 
@@ -153,7 +154,7 @@
 
 	integrator->no_caustics = get_boolean(cscene, "no_caustics");
 	integrator->seed = get_int(cscene, "seed");
-	integrator->layer_flag = render_layer.layer;
+	integrator->layer_flag = render_layers[layer].layer;
 
 	if(integrator->modified(previntegrator))
 		integrator->tag_update(scene);
@@ -185,27 +186,32 @@
 
 /* Render Layer */
 
-void BlenderSync::sync_render_layer(BL::SpaceView3D b_v3d)
+void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d)
 {
+	render_layers.clear();
+
 	if(b_v3d) {
-		render_layer.scene_layer = get_layer(b_v3d.layers());
-		render_layer.layer = render_layer.scene_layer;
-		render_layer.material_override = PointerRNA_NULL;
+		RenderLayerInfo rlay;
+
+		rlay.scene_layer = get_layer(b_v3d.layers());
+		rlay.layer = rlay.scene_layer;
+		rlay.material_override = PointerRNA_NULL;
+
+		render_layers.push_back(rlay);
 	}
 	else {
 		BL::RenderSettings r = b_scene.render();
 		BL::RenderSettings::layers_iterator b_rlay;
-		bool first = true;
 
 		for(r.layers.begin(b_rlay); b_rlay != r.layers.end(); ++b_rlay) {
 			/* single layer for now */
-			if(first) {
-				render_layer.scene_layer = get_layer(b_scene.layers());
-				render_layer.layer = get_layer(b_rlay->layers());
-				render_layer.material_override = b_rlay->material_override();
+			RenderLayerInfo rlay;
 
-				first = false;
-			}
+			rlay.scene_layer = get_layer(b_scene.layers());
+			rlay.layer = get_layer(b_rlay->layers());
+			rlay.material_override = b_rlay->material_override();
+
+			render_layers.push_back(rlay);
 		}
 	}
 }

Modified: trunk/blender/intern/cycles/blender/blender_sync.h

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list