Cycles: Fix wrong camera-in-volume stack when camera ray hits volume domain twice

This commit is contained in:
Sergey Sharybin
2016-04-01 18:03:58 +02:00
parent 0f6f921898
commit ce44ffd74f

View File

@@ -1010,17 +1010,22 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg,
ShaderData sd; ShaderData sd;
shader_setup_from_ray(kg, &sd, isect, &volume_ray); shader_setup_from_ray(kg, &sd, isect, &volume_ray);
if(sd.flag & SD_BACKFACING) { if(sd.flag & SD_BACKFACING) {
/* If ray exited the volume and never entered to that volume bool need_add = true;
* it means that camera is inside such a volume. for(int i = 0; stack[i].shader != SHADER_NONE; ++i) {
*/ /* If ray exited the volume and never entered to that volume
bool is_enclosed = false; * it means that camera is inside such a volume.
for(int i = 0; i < enclosed_index; ++i) { */
if(enclosed_volumes[i] == sd.object) { if(i < enclosed_index && enclosed_volumes[i] == sd.object) {
is_enclosed = true; need_add = false;
break;
}
/* Don't add intersections twice. */
if(stack[i].object == sd.object) {
need_add = false;
break; break;
} }
} }
if(is_enclosed == false) { if(need_add) {
stack[stack_index].object = sd.object; stack[stack_index].object = sd.object;
stack[stack_index].shader = sd.shader; stack[stack_index].shader = sd.shader;
++stack_index; ++stack_index;