Cycles: support for multiple render layers. It currently renders each layer
entirely before moving on to the next.
This commit is contained in:
@@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user