Esempio n. 1
0
void BlenderSession::render()
{
	/* get buffer parameters */
	SessionParams session_params = BlenderSync::get_session_params(b_userpref, b_scene, background);
	BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
	int w = buffer_params.width, h = buffer_params.height;

	/* 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);

	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;

		/* add passes */
		vector<Pass> passes;
		Pass::add(PASS_COMBINED, passes);

		if(session_params.device.advanced_shading) {
			BL::RenderLayer::passes_iterator b_pass_iter;
			
			for(b_rlay.passes.begin(b_pass_iter); b_pass_iter != b_rlay.passes.end(); ++b_pass_iter) {
				BL::RenderPass b_pass(*b_pass_iter);
				PassType pass_type = get_pass_type(b_pass);

				if(pass_type != PASS_NONE)
					Pass::add(pass_type, passes);
			}
		}

		buffer_params.passes = passes;
		scene->film->passes = passes;
		scene->film->tag_update(scene);

		/* update session */
		session->reset(buffer_params, session_params.samples);

		/* 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);
}