22 const int shader_flags,
25 const float r_sq =
sqr(klight->spot.radius);
29 const float d =
sqrtf(d_sq);
32 ls->eval_fac = klight->spot.eval_fac;
34 if (klight->spot.is_sphere) {
45 if (has_transmission) {
60 ls->P =
P + ls->D * ls->t;
62 ls->P = ls->Ng * klight->spot.radius + klight->co;
75 const float invarea = (r_sq > 0.0f) ? 1.0f / (r_sq *
M_PI_F) : 1.0f;
84 ls->v = 1.0f - uv.
x - uv.
y;
90 const float d_sq,
const float r_sq,
const float3 N,
const float3 D,
const uint32_t path_flag)
105 const uint32_t path_flag)
109 const float radius = klight->spot.radius;
111 if (klight->spot.is_sphere) {
113 const float r_sq =
sqr(radius);
114 const float t_sq =
sqr(ls->t);
117 const float jacobian_solid_angle_to_area = 0.5f *
fabsf(d_sq - r_sq - t_sq) /
118 (radius * ls->t * t_sq);
119 ls->pdf =
sphere_light_pdf(d_sq, r_sq,
N, ls->D, path_flag) * jacobian_solid_angle_to_area;
125 ls->pdf = ls->eval_fac * 4.0f *
M_PI_F;
135 ls->v = 1.0f - uv.
x - uv.
y;
142 const float radius = klight->spot.radius;
143 if (radius == 0.0f) {
147 if (klight->spot.is_sphere) {
155 ray->P, ray->D, ray->tmin, ray->tmax, klight->co, diskN, radius, &
P, t);
163 const uint32_t path_flag,
167 const float r_sq =
sqr(klight->spot.radius);
169 ls->eval_fac = klight->spot.eval_fac;
171 if (klight->spot.is_sphere) {
172 const float d_sq =
len_squared(ray_P - klight->co);
179 const float invarea = (r_sq > 0.0f) ? 1.0f / (r_sq *
M_PI_F) : 1.0f;
193 ls->v = 1.0f - uv.
x - uv.
y;
198template<
bool in_volume_segment>
210 if (in_volume_segment) {
215 const float radius = klight->spot.radius;
217 if (klight->spot.is_sphere) {
218 if (min_distance > radius) {
221 distance.x = min_distance / cos_theta_u;
231 const float hypotenus =
sqrtf(
sqr(radius) +
sqr(min_distance));
232 cos_theta_u = min_distance / hypotenus;
MINLINE float safe_sqrtf(float a)
bool map_to_sphere(float *r_u, float *r_v, float x, float y, float z)
ccl_device_inline float cos_theta(const float3 w)
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
#define ccl_device_forceinline
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
VecBase< float, D > normalize(VecOp< float, D >) RET
float distance(VecOp< float, D >, VecOp< float, D >) RET
ccl_device_inline Transform lamp_get_inverse_transform(KernelGlobals kg, const ccl_global KernelLight *klight)
@ SD_BSDF_HAS_TRANSMISSION
@ PATH_RAY_MIS_HAD_TRANSMISSION
ccl_device float3 disk_light_sample(const float3 n, const float2 rand)
ccl_device float light_pdf_area_to_solid_angle(const float3 Ng, const float3 I, const float t)
CCL_NAMESPACE_BEGIN ccl_device_inline bool point_light_sample(KernelGlobals kg, const ccl_global KernelLight *klight, const float2 rand, const float3 P, const float3 N, const int shader_flags, ccl_private LightSample *ls)
ccl_device_inline bool point_light_intersect(const ccl_global KernelLight *klight, const ccl_private Ray *ccl_restrict ray, ccl_private float *t)
ccl_device_forceinline void point_light_mnee_sample_update(KernelGlobals kg, const ccl_global KernelLight *klight, ccl_private LightSample *ls, const float3 P, const float3 N, const uint32_t path_flag)
ccl_device_forceinline bool point_light_tree_parameters(const ccl_global KernelLight *klight, const float3 centroid, const float3 P, ccl_private float &cos_theta_u, ccl_private float2 &distance, ccl_private float3 &point_to_centroid)
ccl_device_forceinline float sphere_light_pdf(const float d_sq, const float r_sq, const float3 N, const float3 D, const uint32_t path_flag)
ccl_device_inline bool point_light_sample_from_intersection(KernelGlobals kg, const ccl_global KernelLight *klight, const float3 ray_P, const float3 ray_D, const float3 N, const uint32_t path_flag, ccl_private LightSample *ccl_restrict ls)
ccl_device_inline float sin_sqr_to_one_minus_cos(const float s_sq)
ccl_device_inline float one_minus_cos(const float angle)
ccl_device_inline float cos_from_sin(const float s)
ccl_device_inline float2 one_float2()
ccl_device_inline float len_squared(const float2 a)
ccl_device_inline float3 safe_normalize_len(const float3 a, ccl_private float *t)
ccl_device bool ray_disk_intersect(const float3 ray_P, const float3 ray_D, const float ray_tmin, const float ray_tmax, const float3 disk_P, const float3 disk_N, const float disk_radius, ccl_private float3 *isect_P, ccl_private float *isect_t)
CCL_NAMESPACE_BEGIN ccl_device bool ray_sphere_intersect(const float3 ray_P, const float3 ray_D, const float ray_tmin, const float ray_tmax, const float3 sphere_P, const float sphere_radius, ccl_private float3 *isect_P, ccl_private float *isect_t)
ccl_device_inline void sample_cos_hemisphere(const float3 N, const float2 rand_in, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device float3 sample_uniform_sphere(const float2 rand)
ccl_device_inline float3 sample_uniform_cone(const float3 N, const float one_minus_cos_angle, const float2 rand, ccl_private float *cos_theta, ccl_private float *pdf)
ccl_device_inline float pdf_cos_hemisphere(const float3 N, const float3 D)