diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-04-20 14:49:54 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-04-20 14:49:54 +0300 |
commit | b9d9d93ff9631a8a982822c24c8ab6898950dd1c (patch) | |
tree | 234ce9279be810fa46d4433b19197f59309fcbfc /intern | |
parent | 4cdd6b9bddac37d8a482cbf44cf4c94fb4d10135 (diff) |
Fix T48162: GPU render gives wrong results in certain volume setups
ideally this part of code should be de-duplicated across __VOLUME_INTERSECT_ALL
and regular code.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/kernel_volume.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index ed4f6b2d99b..c499773b980 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -1061,14 +1061,23 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg, /* 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) { + bool need_add = true; + for(int i = 0; i < enclosed_index && need_add; ++i) { + /* If ray exited the volume and never entered to that volume + * it means that camera is inside such a volume. + */ if(enclosed_volumes[i] == sd.object) { - is_enclosed = true; + need_add = false; + } + } + for(int i = 0; i < stack_index && need_add; ++i) { + /* Don't add intersections twice. */ + if(stack[i].object == sd.object) { + need_add = false; break; } } - if(is_enclosed == false) { + if(need_add) { stack[stack_index].object = sd.object; stack[stack_index].shader = sd.shader; ++stack_index; |