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
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2013-12-28 05:27:48 +0400
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2013-12-28 19:57:10 +0400
commit37c4d6a50a7dc8e819ecab208f150ceb0ae1d01c (patch)
treedfb741142554015bb046ee20aedab3198637263e /intern/cycles/render/shader.cpp
parenta35db17cee5a9b47dc9624f7dfcb41f5fc185b33 (diff)
Cycles Volume Render: add flags to quickly detect when objects have a volume shader.
Diffstat (limited to 'intern/cycles/render/shader.cpp')
-rw-r--r--intern/cycles/render/shader.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 8dbff224225..2b938f459c4 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -218,6 +218,7 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc
uint *shader_flag = dscene->shader_flag.resize(shader_flag_size);
uint i = 0;
bool has_converter_blackbody = false;
+ bool has_volumes = false;
foreach(Shader *shader, scene->shaders) {
uint flag = 0;
@@ -226,8 +227,19 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc
flag |= SD_USE_MIS;
if(shader->has_surface_transparent && shader->use_transparent_shadow)
flag |= SD_HAS_TRANSPARENT_SHADOW;
- if(shader->has_volume)
+ if(shader->has_volume) {
flag |= SD_HAS_VOLUME;
+ has_volumes = true;
+
+ /* in this case we can assume transparent surface */
+ if(!shader->has_surface)
+ flag |= SD_HAS_ONLY_VOLUME;
+
+ /* todo: this could check more fine grained, to skip useless volumes
+ * enclosed inside an opaque bsdf, although we still need to handle
+ * the case with camera inside volumes too */
+ flag |= SD_HAS_TRANSPARENT_SHADOW;
+ }
if(shader->homogeneous_volume)
flag |= SD_HOMOGENEOUS_VOLUME;
if(shader->has_bssrdf_bump)
@@ -263,6 +275,9 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc
blackbody_table_offset = TABLE_OFFSET_INVALID;
}
+ /* volumes */
+ KernelIntegrator *kintegrator = &dscene->data.integrator;
+ kintegrator->use_volumes = has_volumes;
}
void ShaderManager::device_free_common(Device *device, DeviceScene *dscene, Scene *scene)