diff options
Diffstat (limited to 'intern/cycles/kernel/geom/geom_triangle_intersect.h')
-rw-r--r-- | intern/cycles/kernel/geom/geom_triangle_intersect.h | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/intern/cycles/kernel/geom/geom_triangle_intersect.h b/intern/cycles/kernel/geom/geom_triangle_intersect.h index a3b23115ae4..a2b1e050e58 100644 --- a/intern/cycles/kernel/geom/geom_triangle_intersect.h +++ b/intern/cycles/kernel/geom/geom_triangle_intersect.h @@ -73,10 +73,11 @@ ccl_device_inline bool triangle_intersect(KernelGlobals *kg, /* Special ray intersection routines for local intersection. In that case we * only want to intersect with primitives in the same object, and if case of * multiple hits we pick a single random primitive as the intersection point. + * Returns whether traversal should be stopped. */ #ifdef __BVH_LOCAL__ -ccl_device_inline void triangle_intersect_local( +ccl_device_inline bool triangle_intersect_local( KernelGlobals *kg, LocalIntersection *local_isect, float3 P, @@ -92,7 +93,7 @@ ccl_device_inline void triangle_intersect_local( * already know we are only intersecting the right object. */ if(object == OBJECT_NONE) { if(kernel_tex_fetch(__prim_object, prim_addr) != local_object) { - return; + return false; } } @@ -115,7 +116,12 @@ ccl_device_inline void triangle_intersect_local( #endif &u, &v, &t)) { - return; + return false; + } + + /* If no actual hit information is requested, just return here. */ + if(max_hits == 0) { + return true; } int hit; @@ -123,7 +129,7 @@ ccl_device_inline void triangle_intersect_local( /* Record up to max_hits intersections. */ for(int i = min(max_hits, local_isect->num_hits) - 1; i >= 0; --i) { if(local_isect->hits[i].t == t) { - return; + return false; } } @@ -138,13 +144,13 @@ ccl_device_inline void triangle_intersect_local( hit = lcg_step_uint(lcg_state) % local_isect->num_hits; if(hit >= max_hits) - return; + return false; } } else { /* Record closest intersection only. */ if(local_isect->num_hits && t > local_isect->hits[0].t) { - return; + return false; } hit = 0; @@ -167,6 +173,8 @@ ccl_device_inline void triangle_intersect_local( tri_c = float4_to_float3(kernel_tex_fetch(__prim_tri_verts, tri_vindex+2)); #endif local_isect->Ng[hit] = normalize(cross(tri_b - tri_a, tri_c - tri_a)); + + return false; } #endif /* __BVH_LOCAL__ */ |