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:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-04-20 14:49:54 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-04-20 14:49:54 +0300
commitb9d9d93ff9631a8a982822c24c8ab6898950dd1c (patch)
tree234ce9279be810fa46d4433b19197f59309fcbfc
parent4cdd6b9bddac37d8a482cbf44cf4c94fb4d10135 (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.
-rw-r--r--intern/cycles/kernel/kernel_volume.h17
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;