Cycles: Support per-render layer world AO settings

This is sort of extension of existing Use Environment option which now allows to
disable AO on the render layer basis.

Useful in cases like disabling AO for the background because it might make it
too flat and so.

Reviewers: juicyfruit, dingto, brecht

Reviewed By: brecht

Subscribers: eyecandy, venomgfx

Differential Revision: https://developer.blender.org/D1633
This commit is contained in:
Sergey Sharybin 2015-11-24 13:21:40 +05:00
parent 31cc60e76b
commit fa6bdfd622
8 changed files with 34 additions and 12 deletions

View File

@ -387,6 +387,7 @@ class CyclesRender_PT_layer_options(CyclesButtonsPanel, Panel):
col = split.column()
col.prop(rl, "use_sky", "Use Environment")
col.prop(rl, "use_ao", "Use AO")
col.prop(rl, "use_solid", "Use Surfaces")
col.prop(rl, "use_strand", "Use Hair")

View File

@ -1188,7 +1188,8 @@ void BlenderSync::sync_world(bool update_all)
else
background->transparent = b_scene.render().alpha_mode() == BL::RenderSettings::alpha_mode_TRANSPARENT;
background->use = render_layer.use_background;
background->use_shader = render_layer.use_background_shader;
background->use_ao = render_layer.use_background_ao;
if(background->modified(prevbackground))
background->tag_update(scene);

View File

@ -327,7 +327,8 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer)
render_layer.exclude_layer = 0;
render_layer.holdout_layer = 0;
render_layer.material_override = PointerRNA_NULL;
render_layer.use_background = true;
render_layer.use_background_shader = true;
render_layer.use_background_ao = true;
render_layer.use_hair = true;
render_layer.use_surfaces = true;
render_layer.use_viewport_visibility = true;
@ -359,7 +360,8 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer)
render_layer.layer |= render_layer.holdout_layer;
render_layer.material_override = b_rlay->material_override();
render_layer.use_background = b_rlay->use_sky();
render_layer.use_background_shader = b_rlay->use_sky();
render_layer.use_background_ao = b_rlay->use_ao();
render_layer.use_surfaces = b_rlay->use_solid();
render_layer.use_hair = b_rlay->use_strand();
render_layer.use_viewport_visibility = false;

View File

@ -150,7 +150,8 @@ private:
: scene_layer(0), layer(0),
holdout_layer(0), exclude_layer(0),
material_override(PointerRNA_NULL),
use_background(true),
use_background_shader(true),
use_background_ao(true),
use_surfaces(true),
use_hair(true),
use_viewport_visibility(false),
@ -164,7 +165,8 @@ private:
uint holdout_layer;
uint exclude_layer;
BL::Material material_override;
bool use_background;
bool use_background_shader;
bool use_background_ao;
bool use_surfaces;
bool use_hair;
bool use_viewport_visibility;

View File

@ -33,7 +33,8 @@ Background::Background()
ao_factor = 0.0f;
ao_distance = FLT_MAX;
use = true;
use_shader = true;
use_ao = false;
visibility = PATH_RAY_ALL_VISIBILITY;
shader = 0;
@ -53,7 +54,7 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene
device_free(device, dscene);
if(use)
if(use_shader)
shader = scene->default_background;
else
shader = scene->default_empty;
@ -61,8 +62,14 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene
/* set shader index and transparent option */
KernelBackground *kbackground = &dscene->data.background;
kbackground->ao_factor = ao_factor;
kbackground->ao_distance = ao_distance;
if(use_ao) {
kbackground->ao_factor = ao_factor;
kbackground->ao_distance = ao_distance;
}
else {
kbackground->ao_factor = 0.0f;
kbackground->ao_distance = FLT_MAX;
}
kbackground->transparent = transparent;
kbackground->surface_shader = scene->shader_manager->get_shader_id(shader);
@ -100,7 +107,8 @@ void Background::device_free(Device * /*device*/, DeviceScene * /*dscene*/)
bool Background::modified(const Background& background)
{
return !(transparent == background.transparent &&
use == background.use &&
use_shader == background.use_shader &&
use_ao == background.use_ao &&
ao_factor == background.ao_factor &&
ao_distance == background.ao_distance &&
visibility == background.visibility);

View File

@ -30,7 +30,8 @@ public:
float ao_factor;
float ao_distance;
bool use;
bool use_shader;
bool use_ao;
uint visibility;
uint shader;

View File

@ -204,7 +204,8 @@ typedef struct SceneRenderLayer {
#define SCE_LAY_SKY 16
#define SCE_LAY_STRAND 32
#define SCE_LAY_FRS 64
/* flags between 128 and 0x8000 are set to 1 already, for future options */
#define SCE_LAY_AO 128
/* flags between 256 and 0x8000 are set to 1 already, for future options */
#define SCE_LAY_ALL_Z 0x8000
#define SCE_LAY_XOR 0x10000

View File

@ -2782,6 +2782,12 @@ void rna_def_render_layer_common(StructRNA *srna, int scene)
if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "use_ao", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_AO);
RNA_def_property_ui_text(prop, "AO", "Render AO in this Layer");
if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "use_edge_enhance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_EDGE);
RNA_def_property_ui_text(prop, "Edge", "Render Edge-enhance in this Layer (only works for Solid faces)");