예제 #1
0
void BlenderSession::write_render_result()
{
	/* get state */
	RenderBuffers *buffers = session->buffers;

	/* copy data from device */
	if(!buffers->copy_from_device())
		return;

	BufferParams& params = buffers->params;
	float exposure = scene->film->exposure;
	double total_time, sample_time;
	int sample;

	session->progress.get_sample(sample, total_time, sample_time);

	vector<float> pixels(params.width*params.height*4);

	/* copy each pass */
	BL::RenderLayer::passes_iterator b_iter;
	
	for(b_rlay.passes.begin(b_iter); b_iter != b_rlay.passes.end(); ++b_iter) {
		BL::RenderPass b_pass(*b_iter);

		/* find matching pass type */
		PassType pass_type = get_pass_type(b_pass);
		int components = b_pass.channels();

		/* copy pixels */
		if(buffers->get_pass(pass_type, exposure, sample, components, &pixels[0]))
			rna_RenderPass_rect_set(&b_pass.ptr, &pixels[0]);
	}

	/* copy combined pass */
	if(buffers->get_pass(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
		rna_RenderLayer_rect_set(&b_rlay.ptr, &pixels[0]);

	/* tag result as updated */
	RE_engine_update_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data);
}