diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-02-07 21:32:01 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-02-07 21:32:01 +0400 |
commit | 4a427a441b37ad0539e3c758b31a384edf8b7c76 (patch) | |
tree | b8b4a69ec083d547068f2a30b76e13100f813e90 /intern | |
parent | b67b1c8564cedfc425892f6b071210b724366523 (diff) |
Fix #30049: cycles noise texture producing nan values with some
texture coordinates, due to int overflow.
Also minor tweak in shader code to avoid copying uninitialized
values, should have no effect though because they were not used.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/kernel_shader.h | 11 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_noise.h | 5 |
2 files changed, 9 insertions, 7 deletions
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index 7e0b0ff4d0f..46ef5d2022a 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -368,12 +368,13 @@ __device int shader_bsdf_sample(KernelGlobals *kg, const ShaderData *sd, #else label = svm_bsdf_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf); #endif + if(*pdf != 0.0f) { + bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass); - bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass); - - if(sd->num_closure > 1 && *pdf != 0.0f) { - float sweight = sc->sample_weight; - _shader_bsdf_multi_eval(sd, *omega_in, pdf, sampled, bsdf_eval, *pdf*sweight, sweight); + if(sd->num_closure > 1) { + float sweight = sc->sample_weight; + _shader_bsdf_multi_eval(sd, *omega_in, pdf, sampled, bsdf_eval, *pdf*sweight, sweight); + } } return label; diff --git a/intern/cycles/kernel/svm/svm_noise.h b/intern/cycles/kernel/svm/svm_noise.h index 28ad028ad0e..1d3ace061ab 100644 --- a/intern/cycles/kernel/svm/svm_noise.h +++ b/intern/cycles/kernel/svm/svm_noise.h @@ -84,8 +84,9 @@ __device uint phash(int kx, int ky, int kz, int3 p) __device float floorfrac(float x, int* i) { - *i = quick_floor(x); - return x - *i; + float f = floorf(x); + *i = (int)f; + return x - f; } __device float fade(float t) |