32 template<
bool in_volume_segment>
50 ls->shader = klight->shader_id;
74 float radius = klight->distant.radius;
75 float invarea = klight->distant.invarea;
85 float costheta =
dot(lightD,
D);
86 ls->pdf = invarea / (costheta * costheta * costheta);
87 ls->eval_fac = ls->pdf;
89 #ifdef __BACKGROUND_MIS__
92 float3 D = -background_light_sample(kg,
P, randu, randv, &ls->pdf);
102 ls->P =
make_float3(klight->co[0], klight->co[1], klight->co[2]);
106 const float radius = klight->spot.radius;
108 klight->spot.dir[0], klight->spot.dir[1], klight->spot.dir[2]);
117 const float invarea = klight->spot.invarea;
124 ls->eval_fac = (0.25f *
M_1_PI_F) * invarea;
128 dir, klight->spot.spot_angle, klight->spot.spot_smooth, -ls->D);
129 if (!in_volume_segment && ls->eval_fac == 0.0f) {
141 float radius = klight->spot.radius;
149 ls->pdf = klight->spot.invarea;
155 ls->eval_fac =
M_1_PI_F * 0.25f * klight->spot.invarea;
156 if (!in_volume_segment && ls->eval_fac == 0.0f) {
168 klight->area.axisu[0], klight->area.axisu[1], klight->area.axisu[2]);
170 klight->area.axisv[0], klight->area.axisv[1], klight->area.axisv[2]);
171 float3 Ng =
make_float3(klight->area.dir[0], klight->area.dir[1], klight->area.dir[2]);
172 float invarea =
fabsf(klight->area.invarea);
173 bool is_round = (klight->area.invarea < 0.0f);
175 if (!in_volume_segment) {
176 if (
dot(ls->P -
P, Ng) > 0.0f) {
183 if (is_round || in_volume_segment) {
184 inplane =
ellipse_sample(axisu * 0.5f, axisv * 0.5f, randu, randv);
191 float3 sample_axisu = axisu;
192 float3 sample_axisv = axisv;
194 if (!in_volume_segment && klight->area.tan_spread > 0.0f) {
196 P, Ng, &ls->P, &sample_axisu, &sample_axisv, klight->area.tan_spread)) {
201 ls->pdf =
rect_light_sample(
P, &ls->P, sample_axisu, sample_axisv, randu, randv,
true);
202 inplane = ls->P - inplane;
205 const float light_u =
dot(inplane, axisu) * (1.0f /
dot(axisu, axisu));
206 const float light_v =
dot(inplane, axisv) * (1.0f /
dot(axisv, axisv));
209 ls->u = light_v + 0.5f;
210 ls->v = -light_u - light_v;
215 ls->eval_fac = 0.25f * invarea;
217 if (klight->area.tan_spread > 0.0f) {
220 ls->D, ls->Ng, klight->area.tan_spread, klight->area.normalize_spread);
231 return in_volume_segment || (ls->pdf > 0.0f);
239 const int last_object,
260 klight->use_caustics) {
273 float t = 0.0f, u = 0.0f,
v = 0.0f;
278 const float radius = klight->spot.radius;
279 if (radius == 0.0f) {
285 if (
dot(ray->D, lightN) >= 0.0f) {
291 ray->P, ray->D, ray->tmin, ray->tmax, lightP, lightN, radius, &
P, &
t)) {
298 const float radius = klight->spot.radius;
299 if (radius == 0.0f) {
307 ray->P, ray->D, ray->tmin, ray->tmax, lightP, lightN, radius, &
P, &
t)) {
313 const float invarea =
fabsf(klight->area.invarea);
314 const bool is_round = (klight->area.invarea < 0.0f);
315 if (invarea == 0.0f) {
320 klight->area.axisu[0], klight->area.axisu[1], klight->area.axisu[2]);
322 klight->area.axisv[0], klight->area.axisv[1], klight->area.axisv[2]);
323 const float3 Ng =
make_float3(klight->area.dir[0], klight->area.dir[1], klight->area.dir[2]);
326 if (
dot(ray->D, Ng) >= 0.0f) {
373 const int shader = klight->shader_id;
374 const float radius = klight->distant.radius;
383 if (radius == 0.0f) {
403 float costheta =
dot(-lightD, ray_D);
404 float cosangle = klight->distant.cosangle;
409 ls->shader = klight->shader_id;
412 if (costheta < cosangle)
417 ls->shader = klight->shader_id;
432 float invarea = klight->distant.invarea;
433 ls->pdf = invarea / (costheta * costheta * costheta);
434 ls->eval_fac = ls->pdf;
446 const int lamp = isect->prim;
450 ls->shader = klight->shader_id;
451 ls->object = isect->object;
452 ls->prim = isect->prim;
456 ls->P = ray_P + ray_D * ls->t;
462 const float3 dir =
make_float3(klight->spot.dir[0], klight->spot.dir[1], klight->spot.dir[2]);
468 float invarea = klight->spot.invarea;
469 ls->eval_fac = (0.25f *
M_1_PI_F) * invarea;
474 dir, klight->spot.spot_angle, klight->spot.spot_smooth, -ls->D);
476 if (ls->eval_fac == 0.0f) {
485 if (ls->t != FLT_MAX)
497 float invarea = klight->spot.invarea;
498 ls->eval_fac = (0.25f *
M_1_PI_F) * invarea;
501 if (ls->eval_fac == 0.0f) {
510 if (ls->t != FLT_MAX)
517 float invarea =
fabsf(klight->area.invarea);
520 klight->area.axisu[0], klight->area.axisu[1], klight->area.axisu[2]);
522 klight->area.axisv[0], klight->area.axisv[1], klight->area.axisv[2]);
523 float3 Ng =
make_float3(klight->area.dir[0], klight->area.dir[1], klight->area.dir[2]);
531 const bool is_round = (klight->area.invarea < 0.0f);
536 float3 sample_axisu = axisu;
537 float3 sample_axisv = axisv;
539 if (klight->area.tan_spread > 0.0f) {
541 ray_P, Ng, &light_P, &sample_axisu, &sample_axisv, klight->area.tan_spread)) {
546 ls->pdf =
rect_light_sample(ray_P, &light_P, sample_axisu, sample_axisv, 0, 0,
false);
548 ls->eval_fac = 0.25f * invarea;
550 if (klight->area.tan_spread > 0.0f) {
553 ls->D, ls->Ng, klight->area.tan_spread, klight->area.normalize_spread);
554 if (ls->eval_fac == 0.0f) {
560 kernel_assert(!
"Invalid lamp type in light_sample_from_intersection");
575 bool has_motion =
false;
587 #ifdef __OBJECT_MOTION__
588 float object_time = (
time >= 0.0f) ?
time : 0.5f;
589 Transform tfm = object_fetch_transform_motion_test(kg,
object, object_time,
NULL);
612 return t *
t * pdf / cos_pi;
633 if (longest_edge_squared > distance_to_plane * distance_to_plane) {
636 const float3 Px = sd->P + sd->I *
t;
648 const float solid_angle = alpha +
beta + gamma -
M_PI_F;
651 if (
UNLIKELY(solid_angle == 0.0f)) {
665 return pdf / solid_angle;
680 pdf = pdf * area_pre /
area;
686 template<
bool in_volume_segment>
710 float area = 0.5f * Nl;
726 float distance_to_plane =
fabsf(
dot(N0,
V[0] -
P) /
dot(N0, N0));
728 if (!in_volume_segment && (longest_edge_squared > distance_to_plane * distance_to_plane)) {
746 const float cos_alpha =
dot(u02, u01);
747 const float cos_beta = -
dot(u01, u12);
748 const float cos_gamma =
dot(u02, u12);
755 const float solid_angle = alpha +
beta + gamma -
M_PI_F;
760 const float cos_c =
dot(
A,
B);
761 const float sin_alpha =
fast_sinf(alpha);
762 const float product = sin_alpha * cos_c;
766 const float phi = randu * solid_angle - alpha;
769 const float u =
t - cos_alpha;
770 const float v = s + product;
775 const float det = ((
v * s + u *
t) * sin_alpha);
777 q = ((
v *
t - u * s) * cos_alpha -
v) / det;
779 const float temp =
max(1.0f - q * q, 0.0f);
785 const float z = 1.0f - randv * (1.0f -
dot(C_,
B));
790 P, ls->D, 0.0f, FLT_MAX,
V[0],
V[1],
V[2], &ls->u, &ls->v, &ls->t)) {
795 ls->P =
P + ls->D * ls->t;
798 if (
UNLIKELY(solid_angle == 0.0f)) {
809 ls->pdf = pdf / solid_angle;
826 const float t = 1.0f - u -
v;
827 ls->P = u *
V[0] +
v *
V[1] +
t *
V[2];
831 if (has_motion &&
area != 0.0f) {
837 ls->pdf = ls->pdf * area_pre /
area;
857 int half_len =
len >> 1;
858 int middle = first + half_len;
871 int index =
clamp(first - 1, 0,
kernel_data.integrator.num_distribution - 1);
877 *randu = (
r - distr_min) / (distr_max - distr_min);
889 template<
bool in_volume_segment>
903 const int prim = kdistribution->prim;
907 const int object = kdistribution->mesh_light.object_id;
915 const int shader_flag = kdistribution->mesh_light.shader_flag;
916 triangle_light_sample<in_volume_segment>(kg, prim,
object, randu, randv,
time, ls,
P);
917 ls->shader |= shader_flag;
918 return (ls->pdf > 0.0f);
921 const int lamp = -prim - 1;
927 return light_sample<in_volume_segment>(kg,
lamp, randu, randv,
P, path_flag, ls);
939 return light_distribution_sample<true>(kg, randu, randv,
time,
P, bounce, path_flag, ls);
951 return light_distribution_sample<false>(kg, randu, randv,
time,
P, bounce, path_flag, ls);
963 triangle_light_sample<false>(kg, ls->prim, ls->object, randu, randv,
time, ls,
P);
964 return (ls->pdf > 0.0f);
967 return light_sample<false>(kg, ls->lamp, randu, randv,
P, 0, ls);
MINLINE float safe_sqrtf(float a)
void map_to_sphere(float *r_u, float *r_v, float x, float y, float z)
NSNotificationCenter * center
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
ATTR_WARN_UNUSED_RESULT const BMVert * v
ccl_device float spot_light_attenuation(float3 dir, float spot_angle, float spot_smooth, float3 N)
ccl_device float3 disk_light_sample(float3 v, float randu, float randv)
ccl_device bool light_spread_clamp_area_light(const float3 P, const float3 lightNg, ccl_private float3 *lightP, ccl_private float3 *axisu, ccl_private float3 *axisv, const float tan_spread)
ccl_device_inline float3 ellipse_sample(float3 ru, float3 rv, float randu, float randv)
ccl_device float3 distant_light_sample(float3 D, float radius, float randu, float randv)
ccl_device float light_spread_attenuation(const float3 D, const float3 lightNg, const float tan_spread, const float normalize_spread)
ccl_device float lamp_light_pdf(KernelGlobals kg, const float3 Ng, const float3 I, float t)
CCL_NAMESPACE_BEGIN ccl_device_inline float rect_light_sample(float3 P, ccl_private float3 *light_p, float3 axisu, float3 axisv, float randu, float randv, bool sample_coord)
#define kernel_assert(cond)
#define ccl_device_forceinline
#define ccl_device_inline
#define ccl_device_noinline
#define CCL_NAMESPACE_END
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
ccl_device_inline Transform object_fetch_transform(KernelGlobals kg, int object, enum ObjectTransform type)
ccl_device_inline int lamp_lightgroup(KernelGlobals kg, int lamp)
ccl_device_inline int object_lightgroup(KernelGlobals kg, int object)
ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float *randu)
ccl_device bool light_sample_from_distant_ray(KernelGlobals kg, const float3 ray_D, const int lamp, ccl_private LightSample *ccl_restrict ls)
ccl_device bool lights_intersect(KernelGlobals kg, IntegratorState state, ccl_private const Ray *ccl_restrict ray, ccl_private Intersection *ccl_restrict isect, const int last_prim, const int last_object, const int last_type, const uint32_t path_flag)
ccl_device_inline bool triangle_world_space_vertices(KernelGlobals kg, int object, int prim, float time, float3 V[3])
ccl_device_inline bool light_sample(KernelGlobals kg, const int lamp, const float randu, const float randv, const float3 P, const uint32_t path_flag, ccl_private LightSample *ls)
ccl_device_inline bool light_distribution_sample_from_volume_segment(KernelGlobals kg, float randu, const float randv, const float time, const float3 P, const int bounce, const uint32_t path_flag, ccl_private LightSample *ls)
ccl_device_inline bool light_distribution_sample_from_position(KernelGlobals kg, float randu, const float randv, const float time, const float3 P, const int bounce, const uint32_t path_flag, ccl_private LightSample *ls)
ccl_device_forceinline void triangle_light_sample(KernelGlobals kg, int prim, int object, float randu, float randv, float time, ccl_private LightSample *ls, const float3 P)
ccl_device bool light_sample_from_intersection(KernelGlobals kg, ccl_private const Intersection *ccl_restrict isect, const float3 ray_P, const float3 ray_D, ccl_private LightSample *ccl_restrict ls)
CCL_NAMESPACE_BEGIN struct LightSample LightSample
ccl_device_inline bool light_select_reached_max_bounces(KernelGlobals kg, int index, int bounce)
ccl_device_inline float triangle_light_pdf_area(KernelGlobals kg, const float3 Ng, const float3 I, float t)
ccl_device_forceinline float triangle_light_pdf(KernelGlobals kg, ccl_private const ShaderData *sd, float t)
ccl_device_inline bool light_distribution_sample_new_position(KernelGlobals kg, const float randu, const float randv, const float time, const float3 P, ccl_private LightSample *ls)
@ PATH_MNEE_CULL_LIGHT_CONNECTION
@ PATH_RAY_SHADOW_CATCHER_PASS
@ SHADER_EXCLUDE_SHADOW_CATCHER
@ SD_OBJECT_SHADOW_CATCHER
@ SD_OBJECT_TRANSFORM_APPLIED
@ SD_OBJECT_HAS_VERTEX_MOTION
@ SD_OBJECT_NEGATIVE_SCALE_APPLIED
ccl_device void fast_sincosf(float x, ccl_private float *sine, ccl_private float *cosine)
ccl_device float fast_acosf(float x)
ccl_device float fast_sinf(float x)
ccl_device_inline float2 safe_normalize(const float2 &a)
ccl_device_inline float2 normalize_len(const float2 &a, float *t)
ccl_device_inline float3 zero_float3()
ccl_device_inline float3 safe_normalize_len(const float3 a, ccl_private float *t)
ccl_device_inline float len_squared(const float3 a)
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_device bool ray_quad_intersect(float3 ray_P, float3 ray_D, float ray_tmin, float ray_tmax, float3 quad_P, float3 quad_u, float3 quad_v, float3 quad_n, ccl_private float3 *isect_P, ccl_private float *isect_t, ccl_private float *isect_u, ccl_private float *isect_v, bool ellipse)
ccl_device_forceinline bool ray_triangle_intersect(const float3 ray_P, const float3 ray_D, const float ray_tmin, const float ray_tmax, const float3 tri_a, const float3 tri_b, const float3 tri_c, ccl_private float *isect_u, ccl_private float *isect_v, ccl_private float *isect_t)
ccl_device_inline void motion_triangle_vertices(KernelGlobals kg, int object, int prim, float time, float3 verts[3])
static void area(int d1, int d2, int e1, int e2, float weights[2])
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, 3 > cross(const vec_base< T, 3 > &a, const vec_base< T, 3 > &b)
T clamp(const T &a, const T &min, const T &max)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
IntegratorStateCPU *ccl_restrict IntegratorState
#define INTEGRATOR_STATE(state, nested_struct, member)
ccl_device_inline void triangle_vertices(KernelGlobals kg, int prim, float3 P[3])
ccl_device_inline float triangle_area(ccl_private const float3 &v1, ccl_private const float3 &v2, ccl_private const float3 &v3)
ccl_device_inline float beta(float x, float y)
BLI_INLINE float D(const float *data, const int res[3], int x, int y, int z)
CCL_NAMESPACE_BEGIN struct Window V