diff options
Diffstat (limited to 'intern/cycles/kernel/geom/geom_motion_triangle_intersect.h')
-rw-r--r-- | intern/cycles/kernel/geom/geom_motion_triangle_intersect.h | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/intern/cycles/kernel/geom/geom_motion_triangle_intersect.h b/intern/cycles/kernel/geom/geom_motion_triangle_intersect.h index 542843edc84..ec7bfad7349 100644 --- a/intern/cycles/kernel/geom/geom_motion_triangle_intersect.h +++ b/intern/cycles/kernel/geom/geom_motion_triangle_intersect.h @@ -218,9 +218,10 @@ ccl_device_inline bool motion_triangle_intersect( /* Special ray intersection routines for local intersections. 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 motion_triangle_intersect_local( +ccl_device_inline bool motion_triangle_intersect_local( KernelGlobals *kg, LocalIntersection *local_isect, float3 P, @@ -237,7 +238,7 @@ ccl_device_inline void motion_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; } } @@ -258,7 +259,12 @@ ccl_device_inline void motion_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; @@ -266,7 +272,7 @@ ccl_device_inline void motion_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; } } @@ -282,13 +288,13 @@ ccl_device_inline void motion_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; @@ -307,6 +313,8 @@ ccl_device_inline void motion_triangle_intersect_local( /* Record geometric normal. */ local_isect->Ng[hit] = normalize(cross(verts[1] - verts[0], verts[2] - verts[0])); + + return false; } #endif /* __BVH_LOCAL__ */ |