16 transformed_ray.
z = -transformed_ray.
z;
18 return transformed_ray;
24 return smoothstepf((ray.z - spot->cos_half_spot_angle) * spot->spot_smooth);
28 const float half_cot_half_spot_angle,
33 const float factor = half_cot_half_spot_angle / ray.z;
36 *u = ray.y * factor + 0.5f;
37 *
v = -(ray.x + ray.y) * factor;
40template<
bool in_volume_segment>
45 const int shader_flags,
48 const float r_sq =
sqr(klight->spot.radius);
52 const float d =
sqrtf(d_sq);
55 ls->eval_fac = klight->spot.eval_fac;
57 if (klight->spot.is_sphere) {
63 const float one_minus_cos_half_spot_spread = 1.0f - klight->spot.cos_half_larger_spread;
66 if (in_volume_segment || one_minus_cos_half_angle < one_minus_cos_half_spot_spread) {
73 -klight->spot.dir, one_minus_cos_half_spot_spread, rand, &
cos_theta, &ls->pdf);
76 P, ls->D, 0.0f,
FLT_MAX, klight->co, klight->spot.radius, &ls->P, &ls->t))
86 if (has_transmission) {
88 ls->pdf = M_1_2PI_F * 0.5f;
101 if (!in_volume_segment && ls->eval_fac == 0.0f) {
109 ls->P =
P + ls->D * ls->t;
117 ls->P = ls->Ng * klight->spot.radius + klight->co;
120 spot_light_uv(local_ray, klight->spot.half_cot_half_spot_angle, &ls->u, &ls->v);
135 if (!in_volume_segment && ls->eval_fac == 0.0f) {
140 const float invarea = (r_sq > 0.0f) ? 1.0f / (r_sq *
M_PI_F) : 1.0f;
144 spot_light_uv(local_ray, klight->spot.half_cot_half_spot_angle, &ls->u, &ls->v);
174 ls->eval_fac = klight->spot.eval_fac;
176 const float radius = klight->spot.radius;
177 bool use_attenuation =
true;
179 if (klight->spot.is_sphere) {
181 const float r_sq =
sqr(radius);
182 const float t_sq =
sqr(ls->t);
185 const float jacobian_solid_angle_to_area = 0.5f *
fabsf(d_sq - r_sq - t_sq) /
186 (radius * ls->t * t_sq);
187 ls->pdf =
spot_light_pdf(&klight->spot, d_sq, r_sq,
N, ls->D, path_flag) *
188 jacobian_solid_angle_to_area;
192 use_attenuation = (d_sq > r_sq);
196 ls->pdf = ls->eval_fac * 4.0f *
M_PI_F;
203 if (use_attenuation) {
208 spot_light_uv(local_ray, klight->spot.half_cot_half_spot_angle, &ls->u, &ls->v);
216 if (
dot(ray->D, ray->P - klight->co) >= 0.0f) {
231 const float r_sq =
sqr(klight->spot.radius);
232 const float d_sq =
len_squared(ray_P - klight->co);
234 ls->eval_fac = klight->spot.eval_fac;
236 if (klight->spot.is_sphere) {
237 ls->pdf =
spot_light_pdf(&klight->spot, d_sq, r_sq,
N, ray_D, path_flag);
243 const float invarea = (r_sq > 0.0f) ? 1.0f / (r_sq *
M_PI_F) : 1.0f;
254 if (!klight->spot.is_sphere || d_sq > r_sq) {
257 if (ls->eval_fac == 0) {
262 spot_light_uv(local_ray, klight->spot.half_cot_half_spot_angle, &ls->u, &ls->v);
275 float3 local_P =
P + klight->spot.dir * klight->spot.ray_segment_dp;
282 axis, local_P, local_D,
sqr(klight->spot.cos_half_spot_angle), t_range);
285template<
bool in_volume_segment>
299 const float radius = klight->spot.radius;
301 if (klight->spot.is_sphere) {
302 cos_theta_u = (min_distance > radius) ?
cos_from_sin(radius / min_distance) : -1.0f;
304 if (in_volume_segment) {
308 distance = (min_distance > radius) ? min_distance *
make_float2(1.0f / cos_theta_u, 1.0f) :
312 const float hypotenus =
sqrtf(
sqr(radius) +
sqr(min_distance));
313 cos_theta_u = min_distance / hypotenus;
315 if (in_volume_segment) {
319 distance.x = hypotenus;
326 const float cos_min_outgoing_angle =
cosf(
331 klight->spot.spot_smooth);
MINLINE float safe_sqrtf(float a)
ATTR_WARN_UNUSED_RESULT const BMVert * v
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
struct BoundingCone { packed_float3 axis; float theta_o; float theta_e;} BoundingCone
@ 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_device float fast_acosf(float x)
ccl_device_inline float2 one_float2()
ccl_device_inline float len_squared(const float2 a)
ccl_device_inline float2 safe_normalize(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_inline bool ray_cone_intersect(const float3 axis, const float3 P, float3 D, const float cos_angle_sq, ccl_private float2 *t_range)
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_NAMESPACE_BEGIN ccl_device float3 spot_light_to_local(const ccl_global KernelLight *klight, const float3 ray)
ccl_device void spot_light_uv(const float3 ray, const float half_cot_half_spot_angle, ccl_private float *u, ccl_private float *v)
ccl_device float spot_light_attenuation(const ccl_global KernelSpotLight *spot, const float3 ray)
ccl_device_inline bool spot_light_valid_ray_segment(const ccl_global KernelLight *klight, const float3 P, const float3 D, ccl_private float2 *t_range)
ccl_device_inline bool spot_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_inline bool spot_light_intersect(const ccl_global KernelLight *klight, const ccl_private Ray *ccl_restrict ray, ccl_private float *t)
ccl_device_forceinline float spot_light_pdf(const ccl_global KernelSpotLight *spot, const float d_sq, const float r_sq, const float3 N, const float3 D, const uint32_t path_flag)
ccl_device_forceinline void spot_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 bool spot_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 bool spot_light_tree_parameters(const ccl_global KernelLight *klight, const float3 centroid, const float3 P, const ccl_private BoundingCone &bcone, ccl_private float &cos_theta_u, ccl_private float2 &distance, ccl_private float3 &point_to_centroid, ccl_private float &energy)
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 smoothstepf(float f)
ccl_device_inline float cos_from_sin(const float s)