diff options
Diffstat (limited to 'intern/cycles/kernel/kernel_light.h')
-rw-r--r-- | intern/cycles/kernel/kernel_light.h | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index fffa9afb342..d4cc36d1495 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -297,7 +297,7 @@ ccl_device_inline float background_portal_pdf(KernelGlobals *kg, float3 axisu = make_float3(data1.y, data1.z, data1.w); float3 axisv = make_float3(data2.y, data2.z, data2.w); - if(!ray_quad_intersect(P, direction, 1e-4f, FLT_MAX, lightpos, axisu, axisv, dir, NULL, NULL)) + if(!ray_quad_intersect(P, direction, 1e-4f, FLT_MAX, lightpos, axisu, axisv, dir, NULL, NULL, NULL, NULL)) continue; portal_pdf += area_light_sample(P, &lightpos, axisu, axisv, 0.0f, 0.0f, false); @@ -585,6 +585,10 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg, return false; } } + float2 uv = map_to_sphere(ls->Ng); + ls->u = uv.x; + ls->v = uv.y; + ls->pdf *= lamp_light_pdf(kg, ls->Ng, -ls->D, ls->t); } else { @@ -600,11 +604,16 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg, return false; } + float3 inplane = ls->P; ls->pdf = area_light_sample(P, &ls->P, axisu, axisv, randu, randv, true); + inplane = ls->P - inplane; + ls->u = dot(inplane, axisu) * (1.0f / dot(axisu, axisu)) + 0.5f; + ls->v = dot(inplane, axisv) * (1.0f / dot(axisv, axisv)) + 0.5f; + ls->Ng = D; ls->D = normalize_len(ls->P - P, &ls->t); @@ -706,6 +715,9 @@ ccl_device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D, if(ls->eval_fac == 0.0f) return false; } + float2 uv = map_to_sphere(ls->Ng); + ls->u = uv.x; + ls->v = uv.y; /* compute pdf */ if(ls->t != FLT_MAX) @@ -730,8 +742,10 @@ ccl_device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D, float3 light_P = make_float3(data0.y, data0.z, data0.w); - if(!ray_quad_intersect(P, D, 0.0f, t, - light_P, axisu, axisv, Ng, &ls->P, &ls->t)) + if(!ray_quad_intersect(P, D, 0.0f, t, light_P, + axisu, axisv, Ng, + &ls->P, &ls->t, + &ls->u, &ls->v)) { return false; } @@ -887,4 +901,3 @@ ccl_device int light_select_num_samples(KernelGlobals *kg, int index) } CCL_NAMESPACE_END - |