Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-12-22 00:51:55 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-12-22 00:51:55 +0400
commitc287a09b40cf9010c36363d4ee61f7a88c6bad7d (patch)
tree0b06cf9b90b0b1acf758ce25833b95b754e00b92 /intern/cycles/blender/blender_session.cpp
parentb65061e2ae95e92dea8b1009bf0cf4e02254dac2 (diff)
Cycles: support for multiple render layers. It currently renders each layer
entirely before moving on to the next.
Diffstat (limited to 'intern/cycles/blender/blender_session.cpp')
-rw-r--r--intern/cycles/blender/blender_session.cpp75
1 files changed, 51 insertions, 24 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 1803dd36beb..d8c65c7a607 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -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_
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 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_
last_redraw_time = 0.0f;
create_session();
+ session->start();
}
BlenderSession::~BlenderSession()
@@ -99,11 +102,9 @@ void BlenderSession::create_session()
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,42 +115,67 @@ void BlenderSession::free_session()
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);
+
+ 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;
- /* write result */
- write_render_result();
+ /* 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;
-
- 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);
+ /* 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);
delete [] pixels;
}
@@ -164,6 +190,7 @@ void BlenderSession::synchronize()
scene->params.modified(scene_params)) {
free_session();
create_session();
+ session->start();
return;
}