Cycles: support for multiple render layers. It currently renders each layer

entirely before moving on to the next.
This commit is contained in:
Brecht Van Lommel
2011-12-21 20:51:55 +00:00
parent b65061e2ae
commit c287a09b40
7 changed files with 96 additions and 56 deletions

View File

@@ -160,18 +160,17 @@ class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
scene = context.scene scene = context.scene
rd = scene.render rd = scene.render
# row = layout.row() row = layout.row()
# row.template_list(rd, "layers", rd.layers, "active_index", rows=2) row.template_list(rd, "layers", rd.layers, "active_index", rows=2)
# col = row.column(align=True) col = row.column(align=True)
# col.operator("scene.render_layer_add", icon='ZOOMIN', text="") col.operator("scene.render_layer_add", icon='ZOOMIN', text="")
# col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="") col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="")
row = layout.row() row = layout.row()
# rl = rd.layers.active rl = rd.layers.active
rl = rd.layers[0]
row.prop(rl, "name") 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() split = layout.split()
@@ -183,6 +182,7 @@ class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
layout.separator() layout.separator()
rl = rd.layers[0]
layout.prop(rl, "material_override", text="Material") layout.prop(rl, "material_override", text="Material")

View File

@@ -232,8 +232,10 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated)
BL::Object::material_slots_iterator slot; BL::Object::material_slots_iterator slot;
for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) { for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) {
if(render_layer.material_override) BL::Material material_override = render_layers.front().material_override;
find_shader(render_layer.material_override, used_shaders, scene->default_surface);
if(material_override)
find_shader(material_override, used_shaders, scene->default_surface);
else else
find_shader(slot->material(), used_shaders, scene->default_surface); find_shader(slot->material(), used_shaders, scene->default_surface);
} }

View File

@@ -203,7 +203,7 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob,
void BlenderSync::sync_objects(BL::SpaceView3D b_v3d) void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
{ {
/* layer data */ /* layer data */
uint scene_layer = render_layer.scene_layer; uint scene_layer = render_layers.front().scene_layer;
/* prepare for sync */ /* prepare for sync */
light_map.pre_sync(); light_map.pre_sync();

View File

@@ -40,7 +40,8 @@
CCL_NAMESPACE_BEGIN CCL_NAMESPACE_BEGIN
BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_, BL::Scene b_scene_) 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 */ /* offline render */
BL::RenderSettings r = b_scene.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_, 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_) 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 */ /* 3d view render */
width = width_; width = width_;
@@ -64,6 +66,7 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_
last_redraw_time = 0.0f; last_redraw_time = 0.0f;
create_session(); create_session();
session->start();
} }
BlenderSession::~BlenderSession() BlenderSession::~BlenderSession()
@@ -99,11 +102,9 @@ void BlenderSession::create_session()
session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this)); session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this));
session->set_pause(BlenderSync::get_session_pause(b_scene, background)); 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); BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
session->reset(buffer_params, session_params.samples); session->reset(buffer_params, session_params.samples);
session->start();
} }
void BlenderSession::free_session() void BlenderSession::free_session()
@@ -114,42 +115,67 @@ void BlenderSession::free_session()
void BlenderSession::render() 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()) /* create render result */
return; 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 */ BL::RenderSettings r = b_scene.render();
write_render_result(); 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() void BlenderSession::write_render_result()
{ {
/* get result */ /* get state */
RenderBuffers *buffers = session->buffers; RenderBuffers *buffers = session->buffers;
float exposure = scene->film->exposure; float exposure = scene->film->exposure;
double total_time, sample_time; double total_time, sample_time;
int sample; int sample;
session->progress.get_sample(sample, total_time, sample_time); session->progress.get_sample(sample, total_time, sample_time);
/* get pixels */
float4 *pixels = buffers->copy_from_device(exposure, sample); float4 *pixels = buffers->copy_from_device(exposure, sample);
if(!pixels) if(!pixels)
return; return;
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height); /* write pixels */
int w = buffer_params.width, h = buffer_params.height; 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; delete [] pixels;
} }
@@ -164,6 +190,7 @@ void BlenderSession::synchronize()
scene->params.modified(scene_params)) { scene->params.modified(scene_params)) {
free_session(); free_session();
create_session(); create_session();
session->start();
return; return;
} }

View File

@@ -69,6 +69,8 @@ public:
BL::Scene b_scene; BL::Scene b_scene;
BL::SpaceView3D b_v3d; BL::SpaceView3D b_v3d;
BL::RegionView3D b_rv3d; BL::RegionView3D b_rv3d;
BL::RenderResult b_rr;
BL::RenderLayer b_rlay;
string last_status; string last_status;
float last_progress; float last_progress;

View File

@@ -48,7 +48,8 @@ BlenderSync::BlenderSync(BL::BlendData b_data_, BL::Scene b_scene_, Scene *scene
light_map(&scene_->lights), light_map(&scene_->lights),
world_map(NULL), world_map(NULL),
world_recalc(false), world_recalc(false),
experimental(false) experimental(false),
active_layer(0)
{ {
scene = scene_; scene = scene_;
preview = preview_; preview = preview_;
@@ -120,10 +121,10 @@ bool BlenderSync::sync_recalc()
return recalc; 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_render_layers(b_v3d);
sync_integrator(); sync_integrator(layer);
sync_film(); sync_film();
sync_shaders(); sync_shaders();
sync_objects(b_v3d); sync_objects(b_v3d);
@@ -131,7 +132,7 @@ void BlenderSync::sync_data(BL::SpaceView3D b_v3d)
/* Integrator */ /* Integrator */
void BlenderSync::sync_integrator() void BlenderSync::sync_integrator(int layer)
{ {
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
@@ -153,7 +154,7 @@ void BlenderSync::sync_integrator()
integrator->no_caustics = get_boolean(cscene, "no_caustics"); integrator->no_caustics = get_boolean(cscene, "no_caustics");
integrator->seed = get_int(cscene, "seed"); integrator->seed = get_int(cscene, "seed");
integrator->layer_flag = render_layer.layer; integrator->layer_flag = render_layers[layer].layer;
if(integrator->modified(previntegrator)) if(integrator->modified(previntegrator))
integrator->tag_update(scene); integrator->tag_update(scene);
@@ -185,27 +186,32 @@ void BlenderSync::sync_film()
/* Render Layer */ /* 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) { if(b_v3d) {
render_layer.scene_layer = get_layer(b_v3d.layers()); RenderLayerInfo rlay;
render_layer.layer = render_layer.scene_layer;
render_layer.material_override = PointerRNA_NULL; rlay.scene_layer = get_layer(b_v3d.layers());
rlay.layer = rlay.scene_layer;
rlay.material_override = PointerRNA_NULL;
render_layers.push_back(rlay);
} }
else { else {
BL::RenderSettings r = b_scene.render(); BL::RenderSettings r = b_scene.render();
BL::RenderSettings::layers_iterator b_rlay; BL::RenderSettings::layers_iterator b_rlay;
bool first = true;
for(r.layers.begin(b_rlay); b_rlay != r.layers.end(); ++b_rlay) { for(r.layers.begin(b_rlay); b_rlay != r.layers.end(); ++b_rlay) {
/* single layer for now */ /* single layer for now */
if(first) { RenderLayerInfo rlay;
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();
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);
} }
} }
} }

View File

@@ -54,7 +54,7 @@ public:
/* sync */ /* sync */
bool sync_recalc(); bool sync_recalc();
void sync_data(BL::SpaceView3D b_v3d); void sync_data(BL::SpaceView3D b_v3d, int layer = 0);
void sync_camera(int width, int height); void sync_camera(int width, int height);
void sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height); void sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height);
@@ -70,10 +70,10 @@ private:
void sync_materials(); void sync_materials();
void sync_objects(BL::SpaceView3D b_v3d); void sync_objects(BL::SpaceView3D b_v3d);
void sync_film(); void sync_film();
void sync_integrator(); void sync_integrator(int layer);
void sync_view(); void sync_view();
void sync_world(); void sync_world();
void sync_render_layer(BL::SpaceView3D b_v3d); void sync_render_layers(BL::SpaceView3D b_v3d);
void sync_shaders(); void sync_shaders();
void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree); void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
@@ -112,7 +112,10 @@ private:
uint scene_layer; uint scene_layer;
uint layer; uint layer;
BL::Material material_override; BL::Material material_override;
} render_layer; };
vector<RenderLayerInfo> render_layers;
int active_layer;
}; };
CCL_NAMESPACE_END CCL_NAMESPACE_END