[Bf-blender-cvs] [0f3d558] blender-v2.77-release: Cycles: Fix wrong camera-in-volume stack when camera ray hits volume domain twice

Sergey Sharybin noreply at git.blender.org
Tue Apr 5 10:39:06 CEST 2016


Commit: 0f3d5589825819e98e2bf7350ca776673a3e598e
Author: Sergey Sharybin
Date:   Fri Apr 1 18:03:58 2016 +0200
Branches: blender-v2.77-release
https://developer.blender.org/rB0f3d5589825819e98e2bf7350ca776673a3e598e

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

===================================================================

M	intern/cycles/kernel/kernel_volume.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index ccb7436..984eb7e 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -1010,17 +1010,22 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg,
 			ShaderData sd;
 			shader_setup_from_ray(kg, &sd, isect, &volume_ray);
 			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;
+				bool need_add = true;
+				for(int i = 0; stack[i].shader != SHADER_NONE; ++i) {
+					/* If ray exited the volume and never entered to that volume
+					 * it means that camera is inside such a volume.
+					 */
+					if(i < enclosed_index && enclosed_volumes[i] == sd.object) {
+						need_add = false;
+						break;
+					}
+					/* 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;




More information about the Bf-blender-cvs mailing list