Cycles: Deduplicate sphere intersection test #112031
|
@ -10,53 +10,6 @@ CCL_NAMESPACE_BEGIN
|
|||
|
||||
#ifdef __POINTCLOUD__
|
||||
|
||||
ccl_device_forceinline bool point_intersect_test(const float4 point,
|
||||
const float3 ray_P,
|
||||
const float3 ray_D,
|
||||
const float ray_tmin,
|
||||
const float ray_tmax,
|
||||
ccl_private float *t)
|
||||
{
|
||||
const float3 center = float4_to_float3(point);
|
||||
const float radius = point.w;
|
||||
|
||||
const float rd2 = 1.0f / dot(ray_D, ray_D);
|
||||
|
||||
const float3 c0 = center - ray_P;
|
||||
const float projC0 = dot(c0, ray_D) * rd2;
|
||||
const float3 perp = c0 - projC0 * ray_D;
|
||||
const float l2 = dot(perp, perp);
|
||||
const float r2 = radius * radius;
|
||||
if (!(l2 <= r2)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const float td = sqrt((r2 - l2) * rd2);
|
||||
const float t_front = projC0 - td;
|
||||
const bool valid_front = (ray_tmin <= t_front) & (t_front <= ray_tmax);
|
||||
|
||||
/* Always back-face culling for now. */
|
||||
# if 0
|
||||
const float t_back = projC0 + td;
|
||||
const bool valid_back = (ray_tmin <= t_back) & (t_back <= ray_tmax);
|
||||
|
||||
/* check if there is a first hit */
|
||||
const bool valid_first = valid_front | valid_back;
|
||||
if (!valid_first) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*t = (valid_front) ? t_front : t_back;
|
||||
return true;
|
||||
# else
|
||||
if (!valid_front) {
|
||||
return false;
|
||||
}
|
||||
*t = t_front;
|
||||
return true;
|
||||
# endif
|
||||
}
|
||||
|
||||
ccl_device_forceinline bool point_intersect(KernelGlobals kg,
|
||||
ccl_private Intersection *isect,
|
||||
const float3 ray_P,
|
||||
|
@ -71,8 +24,8 @@ ccl_device_forceinline bool point_intersect(KernelGlobals kg,
|
|||
const float4 point = (type & PRIMITIVE_MOTION) ? motion_point(kg, object, prim, time) :
|
||||
kernel_data_fetch(points, prim);
|
||||
|
||||
if (!point_intersect_test(point, ray_P, ray_D, ray_tmin, ray_tmax, &isect->t)) {
|
||||
return false;
|
||||
float3 discard;
|
||||
if (!ray_sphere_intersect(ray_P, ray_D, ray_tmin, ray_tmax, float4_to_float3(point), point.w, &discard, &isect->t)) {
|
||||
}
|
||||
|
||||
isect->prim = prim;
|
||||
|
|
Loading…
Reference in New Issue