Cycles: ray visibility panel is now also available for the world, works same as

meshes and lamps. The light path node already made this possible but it's a bit
faster to render this way and convenient.
This commit is contained in:
Brecht Van Lommel 2013-06-10 20:34:34 +00:00
parent d16a608f6d
commit 9d3ad07f14
8 changed files with 78 additions and 10 deletions

@ -589,6 +589,12 @@ class CyclesVisibilitySettings(bpy.types.PropertyGroup):
type=cls, type=cls,
) )
bpy.types.World.cycles_visibility = PointerProperty(
name="Cycles Visibility Settings",
description="Cycles visibility settings",
type=cls,
)
cls.camera = BoolProperty( cls.camera = BoolProperty(
name="Camera", name="Camera",
description="Object visibility for camera rays", description="Object visibility for camera rays",

@ -542,7 +542,9 @@ class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
flow.prop(visibility, "diffuse") flow.prop(visibility, "diffuse")
flow.prop(visibility, "glossy") flow.prop(visibility, "glossy")
flow.prop(visibility, "transmission") flow.prop(visibility, "transmission")
flow.prop(visibility, "shadow")
if ob.type != 'LAMP':
flow.prop(visibility, "shadow")
def find_node(material, nodetype): def find_node(material, nodetype):
@ -777,6 +779,29 @@ class CyclesWorld_PT_mist(CyclesButtonsPanel, Panel):
layout.prop(world.mist_settings, "falloff") layout.prop(world.mist_settings, "falloff")
class CyclesWorld_PT_ray_visibility(CyclesButtonsPanel, Panel):
bl_label = "Ray Visibility"
bl_context = "world"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
return CyclesButtonsPanel.poll(context) and context.world
def draw(self, context):
layout = self.layout
world = context.world
visibility = world.cycles_visibility
flow = layout.column_flow()
flow.prop(visibility, "camera")
flow.prop(visibility, "diffuse")
flow.prop(visibility, "glossy")
flow.prop(visibility, "transmission")
class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel): class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
bl_label = "Settings" bl_label = "Settings"
bl_context = "world" bl_context = "world"

@ -895,8 +895,8 @@ void BlenderSync::sync_world(bool update_all)
graph->connect(closure->output("Background"), out->input("Surface")); graph->connect(closure->output("Background"), out->input("Surface"));
} }
/* AO */
if(b_world) { if(b_world) {
/* AO */
BL::WorldLighting b_light = b_world.light_settings(); BL::WorldLighting b_light = b_world.light_settings();
if(b_light.use_ambient_occlusion()) if(b_light.use_ambient_occlusion())
@ -905,6 +905,17 @@ void BlenderSync::sync_world(bool update_all)
background->ao_factor = 0.0f; background->ao_factor = 0.0f;
background->ao_distance = b_light.distance(); background->ao_distance = b_light.distance();
/* visibility */
PointerRNA cvisibility = RNA_pointer_get(&b_world.ptr, "cycles_visibility");
uint visibility = 0;
visibility |= get_boolean(cvisibility, "camera")? PATH_RAY_CAMERA: 0;
visibility |= get_boolean(cvisibility, "diffuse")? PATH_RAY_DIFFUSE: 0;
visibility |= get_boolean(cvisibility, "glossy")? PATH_RAY_GLOSSY: 0;
visibility |= get_boolean(cvisibility, "transmission")? PATH_RAY_TRANSMIT: 0;
background->visibility = visibility;
} }
shader->set_graph(graph); shader->set_graph(graph);

@ -199,11 +199,9 @@ __device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int p
#ifdef __PASSES__ #ifdef __PASSES__
/* use visibility flag to skip lights */ /* use visibility flag to skip lights */
if(ls.shader & SHADER_EXCLUDE_ANY) { if(ls.shader & SHADER_EXCLUDE_ANY) {
if((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (path_flag & PATH_RAY_DIFFUSE)) if(((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (path_flag & PATH_RAY_DIFFUSE)) ||
return false; ((ls.shader & SHADER_EXCLUDE_GLOSSY) && (path_flag & PATH_RAY_GLOSSY)) ||
if((ls.shader & SHADER_EXCLUDE_GLOSSY) && (path_flag & PATH_RAY_GLOSSY)) ((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (path_flag & PATH_RAY_TRANSMIT)))
return false;
if((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (path_flag & PATH_RAY_TRANSMIT))
return false; return false;
} }
#endif #endif
@ -229,9 +227,21 @@ __device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int p
__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf) __device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf)
{ {
#ifdef __BACKGROUND__ #ifdef __BACKGROUND__
int shader = kernel_data.background.shader;
/* use visibility flag to skip lights */
if(shader & SHADER_EXCLUDE_ANY) {
if(((shader & SHADER_EXCLUDE_DIFFUSE) && (path_flag & PATH_RAY_DIFFUSE)) ||
((shader & SHADER_EXCLUDE_GLOSSY) && (path_flag & PATH_RAY_GLOSSY)) ||
((shader & SHADER_EXCLUDE_TRANSMIT) && (path_flag & PATH_RAY_TRANSMIT)) ||
((shader & SHADER_EXCLUDE_CAMERA) && (path_flag & PATH_RAY_CAMERA)))
return make_float3(0.0f, 0.0f, 0.0f);
}
/* evaluate background closure */ /* evaluate background closure */
ShaderData sd; ShaderData sd;
shader_setup_from_background(kg, &sd, ray); shader_setup_from_background(kg, &sd, ray);
float3 L = shader_eval_background(kg, &sd, path_flag, SHADER_CONTEXT_EMISSION); float3 L = shader_eval_background(kg, &sd, path_flag, SHADER_CONTEXT_EMISSION);
#ifdef __BACKGROUND_MIS__ #ifdef __BACKGROUND_MIS__

@ -329,7 +329,8 @@ typedef enum ShaderFlag {
SHADER_EXCLUDE_DIFFUSE = (1 << 27), SHADER_EXCLUDE_DIFFUSE = (1 << 27),
SHADER_EXCLUDE_GLOSSY = (1 << 26), SHADER_EXCLUDE_GLOSSY = (1 << 26),
SHADER_EXCLUDE_TRANSMIT = (1 << 25), SHADER_EXCLUDE_TRANSMIT = (1 << 25),
SHADER_EXCLUDE_ANY = (SHADER_EXCLUDE_DIFFUSE|SHADER_EXCLUDE_GLOSSY|SHADER_EXCLUDE_TRANSMIT), SHADER_EXCLUDE_CAMERA = (1 << 24),
SHADER_EXCLUDE_ANY = (SHADER_EXCLUDE_DIFFUSE|SHADER_EXCLUDE_GLOSSY|SHADER_EXCLUDE_TRANSMIT|SHADER_EXCLUDE_CAMERA),
SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT|SHADER_USE_MIS|SHADER_EXCLUDE_ANY) SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT|SHADER_USE_MIS|SHADER_EXCLUDE_ANY)
} ShaderFlag; } ShaderFlag;

@ -37,6 +37,8 @@ Background::Background()
use = true; use = true;
visibility = ~0;
transparent = false; transparent = false;
need_update = true; need_update = true;
} }
@ -64,6 +66,15 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene
else else
kbackground->shader = scene->shader_manager->get_shader_id(scene->default_empty); kbackground->shader = scene->shader_manager->get_shader_id(scene->default_empty);
if(!(visibility & PATH_RAY_DIFFUSE))
kbackground->shader |= SHADER_EXCLUDE_DIFFUSE;
if(!(visibility & PATH_RAY_GLOSSY))
kbackground->shader |= SHADER_EXCLUDE_GLOSSY;
if(!(visibility & PATH_RAY_TRANSMIT))
kbackground->shader |= SHADER_EXCLUDE_TRANSMIT;
if(!(visibility & PATH_RAY_CAMERA))
kbackground->shader |= SHADER_EXCLUDE_CAMERA;
need_update = false; need_update = false;
} }
@ -76,7 +87,8 @@ bool Background::modified(const Background& background)
return !(transparent == background.transparent && return !(transparent == background.transparent &&
use == background.use && use == background.use &&
ao_factor == background.ao_factor && ao_factor == background.ao_factor &&
ao_distance == background.ao_distance); ao_distance == background.ao_distance &&
visibility == background.visibility);
} }
void Background::tag_update(Scene *scene) void Background::tag_update(Scene *scene)

@ -34,6 +34,8 @@ public:
bool use; bool use;
uint visibility;
bool transparent; bool transparent;
bool need_update; bool need_update;

@ -173,7 +173,8 @@ bool Integrator::modified(const Integrator& integrator)
ao_samples == integrator.ao_samples && ao_samples == integrator.ao_samples &&
mesh_light_samples == integrator.mesh_light_samples && mesh_light_samples == integrator.mesh_light_samples &&
subsurface_samples == integrator.subsurface_samples && subsurface_samples == integrator.subsurface_samples &&
motion_blur == integrator.motion_blur); motion_blur == integrator.motion_blur &&
sampling_pattern == integrator.sampling_pattern);
} }
void Integrator::tag_update(Scene *scene) void Integrator::tag_update(Scene *scene)