15 const int shader_flags,
18 const float r_sq =
sqr(klight->spot.radius);
22 const float d =
sqrtf(d_sq);
25 ls->eval_fac = klight->spot.eval_fac;
27 if (klight->spot.is_sphere) {
38 if (has_transmission) {
40 ls->pdf = M_1_2PI_F * 0.5f;
53 ls->P =
P + ls->D * ls->t;
55 ls->P = ls->Ng * klight->spot.radius + klight->co;
68 const float invarea = (r_sq > 0.0f) ? 1.0f / (r_sq *
M_PI_F) : 1.0f;
77 ls->v = 1.0f - uv.
x - uv.
y;
101 const float radius = klight->spot.radius;
103 if (klight->spot.is_sphere) {
105 const float r_sq =
sqr(radius);
106 const float t_sq =
sqr(ls->t);
109 const float jacobian_solid_angle_to_area = 0.5f *
fabsf(d_sq - r_sq - t_sq) /
110 (radius * ls->t * t_sq);
111 ls->pdf =
sphere_light_pdf(d_sq, r_sq,
N, ls->D, path_flag) * jacobian_solid_angle_to_area;
117 ls->pdf = ls->eval_fac * 4.0f *
M_PI_F;
127 ls->v = 1.0f - uv.
x - uv.
y;
134 const float radius = klight->spot.radius;
135 if (radius == 0.0f) {
139 if (klight->spot.is_sphere) {
147 ray->P, ray->D, ray->tmin, ray->tmax, klight->co, diskN, radius, &
P, t);
159 const float r_sq =
sqr(klight->spot.radius);
161 ls->eval_fac = klight->spot.eval_fac;
163 if (klight->spot.is_sphere) {
164 const float d_sq =
len_squared(ray_P - klight->co);
171 const float invarea = (r_sq > 0.0f) ? 1.0f / (r_sq *
M_PI_F) : 1.0f;
185 ls->v = 1.0f - uv.
x - uv.
y;
190template<
bool in_volume_segment>
202 if (in_volume_segment) {
207 const float radius = klight->spot.radius;
209 if (klight->spot.is_sphere) {
210 if (min_distance > radius) {
213 distance.x = min_distance / cos_theta_u;
223 const float hypotenus =
sqrtf(
sqr(radius) +
sqr(min_distance));
224 cos_theta_u = min_distance / hypotenus;
226 distance.x = 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)
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
#define ccl_device_forceinline
#define ccl_device_inline
#define CCL_NAMESPACE_END
@ SD_BSDF_HAS_TRANSMISSION
@ PATH_RAY_MIS_HAD_TRANSMISSION
ccl_device float3 disk_light_sample(float3 n, float2 rand)
ccl_device float light_pdf_area_to_solid_angle(const float3 Ng, const float3 I, float t)
ccl_device_inline bool point_light_intersect(const ccl_global KernelLight *klight, const ccl_private Ray *ccl_restrict ray, ccl_private float *t)
CCL_NAMESPACE_BEGIN ccl_device_inline bool point_light_sample(const ccl_global KernelLight *klight, const float2 rand, const float3 P, const float3 N, const int shader_flags, ccl_private LightSample *ls)
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_inline bool point_light_sample_from_intersection(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_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_forceinline void point_light_mnee_sample_update(const ccl_global KernelLight *klight, ccl_private LightSample *ls, const float3 P, const float3 N, const uint32_t path_flag)
ccl_device_inline float2 one_float2()
ccl_device_inline float len_squared(const float2 a)
ccl_device_inline float2 normalize_len(const float2 a, ccl_private float *t)
ccl_device_inline float3 safe_normalize_len(const float3 a, ccl_private float *t)
ccl_device bool ray_disk_intersect(float3 ray_P, float3 ray_D, float ray_tmin, float ray_tmax, float3 disk_P, float3 disk_N, float disk_radius, ccl_private float3 *isect_P, ccl_private float *isect_t)
CCL_NAMESPACE_BEGIN ccl_device bool ray_sphere_intersect(float3 ray_P, float3 ray_D, float ray_tmin, float ray_tmax, float3 sphere_P, float sphere_radius, ccl_private float3 *isect_P, ccl_private float *isect_t)
ccl_device_inline void sample_cos_hemisphere(const float3 N, 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)
ccl_device_inline float sqr(float a)
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)