Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-09-12 17:13:56 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-09-12 17:13:56 +0400
commitebc653463ddfd9f8b893b6acbcc6465972e6abc6 (patch)
tree6b3cc2ba3f04994cf9f8d8f5bca6d63cfe2c9d1f /intern/cycles/kernel/kernel_emission.h
parentc40492205b4369de3babe63b43d127ca622773ec (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.h41
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;
}