diff options
author | Thomas Dinges <blender@dingto.org> | 2014-09-11 16:50:31 +0400 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2014-09-11 16:51:48 +0400 |
commit | 61e58c378a4676dea439f12851512ea9282e5d68 (patch) | |
tree | bbf83cdafacd80fb76fcc65d922002e457eee2cf /intern/cycles | |
parent | 149ca1320b183632921c5c06110ee910a768eb93 (diff) |
Fix T41784, Re-enabling transparent shadows in Cycles doesn't work correctly
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/render/integrator.cpp | 17 | ||||
-rw-r--r-- | intern/cycles/render/shader.cpp | 6 |
2 files changed, 13 insertions, 10 deletions
diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp index b7a87ac14da..ec2960d15e1 100644 --- a/intern/cycles/render/integrator.cpp +++ b/intern/cycles/render/integrator.cpp @@ -92,11 +92,20 @@ void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene kintegrator->transparent_max_bounce = transparent_max_bounce + 1; kintegrator->transparent_min_bounce = transparent_min_bounce + 1; - /* At this point kintegrator->transparent_shadows is set automatically - * based on whether shaders use transparent shadows (see shader.cpp). - * If user doesn't want transparent shadows, force them off. */ - if(!transparent_shadows) + /* Transparent Shadows + * We only need to enable transparent shadows, if we actually have + * transparent shaders in the scene. Otherwise we can disable it + * to improve performance a bit. */ + if(transparent_shadows) { + foreach(Shader *shader, scene->shaders) { + /* keep this in sync with SD_HAS_TRANSPARENT_SHADOW in shader.cpp */ + if((shader->has_surface_transparent && shader->use_transparent_shadow) || shader->has_volume) + kintegrator->transparent_shadows = true; + } + } + else { kintegrator->transparent_shadows = false; + } kintegrator->volume_max_steps = volume_max_steps; kintegrator->volume_step_size = volume_step_size; diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 927918689f1..d76e511859a 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -325,7 +325,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc uint i = 0; bool has_converter_blackbody = false; bool has_volumes = false; - bool has_transparent_shadows = false; foreach(Shader *shader, scene->shaders) { uint flag = 0; @@ -368,10 +367,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc shader_flag[i++] = flag; shader_flag[i++] = shader->pass_id; - - /* Check if we need transparent shadows */ - if(flag & SD_HAS_TRANSPARENT_SHADOW) - has_transparent_shadows = true; } device->tex_alloc("__shader_flag", dscene->shader_flag); @@ -402,7 +397,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc /* integrator */ KernelIntegrator *kintegrator = &dscene->data.integrator; kintegrator->use_volumes = has_volumes; - kintegrator->transparent_shadows = has_transparent_shadows; } void ShaderManager::device_free_common(Device *device, DeviceScene *dscene, Scene *scene) |