Cycles: Don't check shader for volume when checking if camera is inside volume

Intersection code already ignores objects without volume closure so checking it
afterwards is not needed.
This commit is contained in:
Sergey Sharybin 2014-11-04 19:57:15 +01:00
parent 4a9b912b96
commit 1073c6ae8e

@ -992,31 +992,29 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg,
ShaderData sd;
shader_setup_from_ray(kg, &sd, &isect, &volume_ray, 0, 0);
if(sd.flag & SD_HAS_VOLUME) {
if(sd.flag & SD_BACKFACING) {
/* If ray exited the volume and never entered to that volume
* it means that camera is inside such a volume.
*/
bool is_enclosed = false;
for(int i = 0; i < enclosed_index; ++i) {
if(enclosed_volumes[i] == sd.object) {
is_enclosed = true;
break;
}
}
if(is_enclosed == false) {
stack[stack_index].object = sd.object;
stack[stack_index].shader = sd.shader;
++stack_index;
if(sd.flag & SD_BACKFACING) {
/* If ray exited the volume and never entered to that volume
* it means that camera is inside such a volume.
*/
bool is_enclosed = false;
for(int i = 0; i < enclosed_index; ++i) {
if(enclosed_volumes[i] == sd.object) {
is_enclosed = true;
break;
}
}
else {
/* If ray from camera enters the volume, this volume shouldn't
* be added to the stak on exit.
*/
enclosed_volumes[enclosed_index++] = sd.object;
if(is_enclosed == false) {
stack[stack_index].object = sd.object;
stack[stack_index].shader = sd.shader;
++stack_index;
}
}
else {
/* If ray from camera enters the volume, this volume shouldn't
* be added to the stak on exit.
*/
enclosed_volumes[enclosed_index++] = sd.object;
}
/* Move ray forward. */
volume_ray.P = ray_offset(sd.P, -sd.Ng);