Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorThomas Dinges <blender@dingto.org>2014-09-11 16:50:31 +0400
committerThomas Dinges <blender@dingto.org>2014-09-11 16:51:48 +0400
commit61e58c378a4676dea439f12851512ea9282e5d68 (patch)
treebbf83cdafacd80fb76fcc65d922002e457eee2cf /intern
parent149ca1320b183632921c5c06110ee910a768eb93 (diff)
Fix T41784, Re-enabling transparent shadows in Cycles doesn't work correctly
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/render/integrator.cpp17
-rw-r--r--intern/cycles/render/shader.cpp6
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)