diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-08-21 16:20:38 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-08-21 16:20:38 +0400 |
commit | 0b42f14079f4a746592f184ec61783e7ca13c9be (patch) | |
tree | d1cca4f287ed54b85bc59ae0fc9464fdb17857e4 /intern | |
parent | 76a4d91dc4214c1b3992e9389d434356033ac108 (diff) |
Fix #36526: SSS + hair crash after recent changes.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/kernel_bvh.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_bvh_subsurface.h | 10 |
2 files changed, 9 insertions, 5 deletions
diff --git a/intern/cycles/kernel/kernel_bvh.h b/intern/cycles/kernel/kernel_bvh.h index 4d37b6ddcf4..21320dadb44 100644 --- a/intern/cycles/kernel/kernel_bvh.h +++ b/intern/cycles/kernel/kernel_bvh.h @@ -794,7 +794,7 @@ __device_inline void bvh_triangle_intersect_subsurface(KernelGlobals *kg, Inters #if defined(__SUBSURFACE__) && defined(__HAIR__) #define BVH_FUNCTION_NAME bvh_intersect_subsurface_hair -#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR|BVH_HAIR_MINIMUM_WIDTH +#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR #include "kernel_bvh_subsurface.h" #endif @@ -806,7 +806,7 @@ __device_inline void bvh_triangle_intersect_subsurface(KernelGlobals *kg, Inters #if defined(__SUBSURFACE__) && defined(__HAIR__) && defined(__OBJECT_MOTION__) #define BVH_FUNCTION_NAME bvh_intersect_subsurface_hair_motion -#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR|BVH_HAIR_MINIMUM_WIDTH|BVH_MOTION +#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR|BVH_MOTION #include "kernel_bvh_subsurface.h" #endif diff --git a/intern/cycles/kernel/kernel_bvh_subsurface.h b/intern/cycles/kernel/kernel_bvh_subsurface.h index ac30bea6a9d..4446c1821d5 100644 --- a/intern/cycles/kernel/kernel_bvh_subsurface.h +++ b/intern/cycles/kernel/kernel_bvh_subsurface.h @@ -207,7 +207,13 @@ __device uint BVH_FUNCTION_NAME(KernelGlobals *kg, const Ray *ray, Intersection --stackPtr; /* primitive intersection */ - while(primAddr < primAddr2) { + for(; primAddr < primAddr2; primAddr++) { +#if FEATURE(BVH_HAIR) + uint segment = kernel_tex_fetch(__prim_segment, primAddr); + if(segment != ~0) + continue; +#endif + /* only primitives from the same object */ uint tri_object = (object == ~0)? kernel_tex_fetch(__prim_object, primAddr): object; @@ -216,8 +222,6 @@ __device uint BVH_FUNCTION_NAME(KernelGlobals *kg, const Ray *ray, Intersection /* intersect ray against primitive */ bvh_triangle_intersect_subsurface(kg, isect_array, P, idir, object, primAddr, tmax, &num_hits, lcg_state, max_hits); } - - primAddr++; } } #if FEATURE(BVH_INSTANCING) |