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-28 00:37:24 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-09-28 00:37:24 +0400
commitcdee3435c67abebb633cb09410c4a87d42ff61e3 (patch)
tree9647e36a3661caab918e7726a5971b58b444d403 /intern/cycles/kernel/kernel_emission.h
parent136d27b350355232ebe4d0a13427777445334b05 (diff)
Cycles: internal changes that should have no effect on user level yet, added
shader flags for various purposes, and some code for light types other than points.
Diffstat (limited to 'intern/cycles/kernel/kernel_emission.h')
-rw-r--r--intern/cycles/kernel/kernel_emission.h43
1 files changed, 22 insertions, 21 deletions
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 58c9183e58a..13c48464088 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -63,15 +63,11 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
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_sample_pdf(kg, &ls, -omega_in, t);
+ float pdf = light_sample_pdf(kg, &ls, -ls.D, ls.t);
/* evaluate closure */
- *eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -omega_in);
+ *eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D);
if(is_zero(*eval) || pdf == 0.0f)
return false;
@@ -80,7 +76,7 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
/* evaluate BSDF at shading point */
float bsdf_pdf;
- float3 bsdf_eval = shader_bsdf_eval(kg, sd, omega_in, &bsdf_pdf);
+ float3 bsdf_eval = shader_bsdf_eval(kg, sd, ls.D, &bsdf_pdf);
*eval *= bsdf_eval/pdf;
@@ -92,29 +88,34 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
float mis_weight = power_heuristic(pdf, bsdf_pdf);
*eval *= mis_weight;
}
- else {
+ else if(!(ls.shader & SHADER_AREA_LIGHT)) {
/* ensure point light works in Watts, this should be handled
* elsewhere but for now together with the diffuse emission
* closure it works out to the right value */
*eval *= 0.25f;
+
+ /* XXX verify with other light types */
}
-#if 0
- /* todo: implement this in light */
- bool no_shadow = true;
+ if(ls.shader & SHADER_CAST_SHADOW) {
+ /* setup ray */
+ ray->P = ray_offset(sd->P, sd->Ng);
- if(no_shadow) {
- ray->t = 0.0f;
+ if(ls.t == FLT_MAX) {
+ /* distant light */
+ ray->D = ls.D;
+ ray->t = ls.t;
+ }
+ else {
+ /* other lights, avoid self-intersection */
+ ray->D = ray_offset(ls.P, ls.Ng) - ray->P;
+ ray->D = normalize_len(ray->D, &ray->t);
+ }
}
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
+ /* signal to not cast shadow ray */
+ ray->t = 0.0f;
}
-#endif
return true;
}
@@ -126,7 +127,7 @@ __device float3 indirect_emission(KernelGlobals *kg, ShaderData *sd, float t, in
/* evaluate emissive closure */
float3 L = shader_emissive_eval(kg, sd);
- if(!(path_flag & PATH_RAY_SINGULAR)) {
+ if(!(path_flag & PATH_RAY_SINGULAR) && (sd->flag & SD_SAMPLE_AS_LIGHT)) {
/* multiple importance sampling */
float pdf = triangle_light_pdf(kg, sd->Ng, sd->I, t);
float mis_weight = power_heuristic(bsdf_pdf, pdf);