diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-09-12 17:13:56 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-09-12 17:13:56 +0400 |
commit | ebc653463ddfd9f8b893b6acbcc6465972e6abc6 (patch) | |
tree | 6b3cc2ba3f04994cf9f8d8f5bca6d63cfe2c9d1f /intern/cycles/kernel/kernel_emission.h | |
parent | c40492205b4369de3babe63b43d127ca622773ec (diff) |
Cycles:
* Fix missing update when editing objects with emission materials.
* Fix preview pass rendering set to 1 not showing full resolution.
* Fix CUDA runtime compiling failing due to missing cache directory.
* Use settings from first render layer for visibility and material override.
And a bunch of incomplete and still disabled code mostly related to closure
sampling.
Diffstat (limited to 'intern/cycles/kernel/kernel_emission.h')
-rw-r--r-- | intern/cycles/kernel/kernel_emission.h | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 6b6033e9ebd..58c9183e58a 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -46,20 +46,29 @@ __device float3 direct_emissive_eval(KernelGlobals *kg, float rando, return eval; } -__device bool direct_emission(KernelGlobals *kg, ShaderData *sd, float randt, float rando, - float randu, float randv, Ray *ray, float3 *eval) +__device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, + float randt, float rando, float randu, float randv, Ray *ray, float3 *eval) { - /* sample a position on a light */ LightSample ls; - light_sample(kg, randt, randu, randv, sd->P, &ls); +#ifdef __MULTI_LIGHT__ + if(lindex != -1) { + /* sample position on a specified light */ + light_select(kg, lindex, randu, randv, sd->P, &ls); + } + else +#endif + { + /* sample a light and position on int */ + light_sample(kg, randt, randu, randv, sd->P, &ls); + } /* compute incoming direction and distance */ float t; float3 omega_in = normalize_len(ls.P - sd->P, &t); /* compute pdf */ - float pdf = light_pdf(kg, &ls, -omega_in, t); + float pdf = light_sample_pdf(kg, &ls, -omega_in, t); /* evaluate closure */ *eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -omega_in); @@ -67,6 +76,8 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, float randt, fl if(is_zero(*eval) || pdf == 0.0f) return false; + /* todo: use visbility flag to skip lights */ + /* evaluate BSDF at shading point */ float bsdf_pdf; float3 bsdf_eval = shader_bsdf_eval(kg, sd, omega_in, &bsdf_pdf); @@ -88,10 +99,22 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, float randt, fl *eval *= 0.25f; } - /* setup ray */ - ray->P = ray_offset(sd->P, sd->Ng); - ray->D = ray_offset(ls.P, ls.Ng) - ray->P; - ray->D = normalize_len(ray->D, &ray->t); +#if 0 + /* todo: implement this in light */ + bool no_shadow = true; + + if(no_shadow) { + ray->t = 0.0f; + } + else { +#endif + /* setup ray */ + ray->P = ray_offset(sd->P, sd->Ng); + ray->D = ray_offset(ls.P, ls.Ng) - ray->P; + ray->D = normalize_len(ray->D, &ray->t); +#if 0 + } +#endif return true; } |