diff options
Diffstat (limited to 'intern/cycles/kernel/closure/bsdf_diffuse.h')
-rw-r--r-- | intern/cycles/kernel/closure/bsdf_diffuse.h | 146 |
1 files changed, 90 insertions, 56 deletions
diff --git a/intern/cycles/kernel/closure/bsdf_diffuse.h b/intern/cycles/kernel/closure/bsdf_diffuse.h index 946c460a70e..76b50548455 100644 --- a/intern/cycles/kernel/closure/bsdf_diffuse.h +++ b/intern/cycles/kernel/closure/bsdf_diffuse.h @@ -36,107 +36,141 @@ CCL_NAMESPACE_BEGIN typedef ccl_addr_space struct DiffuseBsdf { - SHADER_CLOSURE_BASE; + SHADER_CLOSURE_BASE; } DiffuseBsdf; /* DIFFUSE */ ccl_device int bsdf_diffuse_setup(DiffuseBsdf *bsdf) { - bsdf->type = CLOSURE_BSDF_DIFFUSE_ID; - return SD_BSDF|SD_BSDF_HAS_EVAL; + bsdf->type = CLOSURE_BSDF_DIFFUSE_ID; + return SD_BSDF | SD_BSDF_HAS_EVAL; } ccl_device bool bsdf_diffuse_merge(const ShaderClosure *a, const ShaderClosure *b) { - const DiffuseBsdf *bsdf_a = (const DiffuseBsdf*)a; - const DiffuseBsdf *bsdf_b = (const DiffuseBsdf*)b; + const DiffuseBsdf *bsdf_a = (const DiffuseBsdf *)a; + const DiffuseBsdf *bsdf_b = (const DiffuseBsdf *)b; - return (isequal_float3(bsdf_a->N, bsdf_b->N)); + return (isequal_float3(bsdf_a->N, bsdf_b->N)); } -ccl_device float3 bsdf_diffuse_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +ccl_device float3 bsdf_diffuse_eval_reflect(const ShaderClosure *sc, + const float3 I, + const float3 omega_in, + float *pdf) { - const DiffuseBsdf *bsdf = (const DiffuseBsdf*)sc; - float3 N = bsdf->N; + const DiffuseBsdf *bsdf = (const DiffuseBsdf *)sc; + float3 N = bsdf->N; - float cos_pi = fmaxf(dot(N, omega_in), 0.0f) * M_1_PI_F; - *pdf = cos_pi; - return make_float3(cos_pi, cos_pi, cos_pi); + float cos_pi = fmaxf(dot(N, omega_in), 0.0f) * M_1_PI_F; + *pdf = cos_pi; + return make_float3(cos_pi, cos_pi, cos_pi); } -ccl_device float3 bsdf_diffuse_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +ccl_device float3 bsdf_diffuse_eval_transmit(const ShaderClosure *sc, + const float3 I, + const float3 omega_in, + float *pdf) { - return make_float3(0.0f, 0.0f, 0.0f); + return make_float3(0.0f, 0.0f, 0.0f); } -ccl_device int bsdf_diffuse_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf) +ccl_device int bsdf_diffuse_sample(const ShaderClosure *sc, + float3 Ng, + float3 I, + float3 dIdx, + float3 dIdy, + float randu, + float randv, + float3 *eval, + float3 *omega_in, + float3 *domega_in_dx, + float3 *domega_in_dy, + float *pdf) { - const DiffuseBsdf *bsdf = (const DiffuseBsdf*)sc; - float3 N = bsdf->N; + const DiffuseBsdf *bsdf = (const DiffuseBsdf *)sc; + float3 N = bsdf->N; - // distribution over the hemisphere - sample_cos_hemisphere(N, randu, randv, omega_in, pdf); + // distribution over the hemisphere + sample_cos_hemisphere(N, randu, randv, omega_in, pdf); - if(dot(Ng, *omega_in) > 0.0f) { - *eval = make_float3(*pdf, *pdf, *pdf); + if (dot(Ng, *omega_in) > 0.0f) { + *eval = make_float3(*pdf, *pdf, *pdf); #ifdef __RAY_DIFFERENTIALS__ - // TODO: find a better approximation for the diffuse bounce - *domega_in_dx = (2 * dot(N, dIdx)) * N - dIdx; - *domega_in_dy = (2 * dot(N, dIdy)) * N - dIdy; + // TODO: find a better approximation for the diffuse bounce + *domega_in_dx = (2 * dot(N, dIdx)) * N - dIdx; + *domega_in_dy = (2 * dot(N, dIdy)) * N - dIdy; #endif - } - else - *pdf = 0.0f; + } + else + *pdf = 0.0f; - return LABEL_REFLECT|LABEL_DIFFUSE; + return LABEL_REFLECT | LABEL_DIFFUSE; } /* TRANSLUCENT */ ccl_device int bsdf_translucent_setup(DiffuseBsdf *bsdf) { - bsdf->type = CLOSURE_BSDF_TRANSLUCENT_ID; - return SD_BSDF|SD_BSDF_HAS_EVAL; + bsdf->type = CLOSURE_BSDF_TRANSLUCENT_ID; + return SD_BSDF | SD_BSDF_HAS_EVAL; } -ccl_device float3 bsdf_translucent_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +ccl_device float3 bsdf_translucent_eval_reflect(const ShaderClosure *sc, + const float3 I, + const float3 omega_in, + float *pdf) { - return make_float3(0.0f, 0.0f, 0.0f); + return make_float3(0.0f, 0.0f, 0.0f); } -ccl_device float3 bsdf_translucent_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf) +ccl_device float3 bsdf_translucent_eval_transmit(const ShaderClosure *sc, + const float3 I, + const float3 omega_in, + float *pdf) { - const DiffuseBsdf *bsdf = (const DiffuseBsdf*)sc; - float3 N = bsdf->N; + const DiffuseBsdf *bsdf = (const DiffuseBsdf *)sc; + float3 N = bsdf->N; - float cos_pi = fmaxf(-dot(N, omega_in), 0.0f) * M_1_PI_F; - *pdf = cos_pi; - return make_float3 (cos_pi, cos_pi, cos_pi); + float cos_pi = fmaxf(-dot(N, omega_in), 0.0f) * M_1_PI_F; + *pdf = cos_pi; + return make_float3(cos_pi, cos_pi, cos_pi); } -ccl_device int bsdf_translucent_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf) +ccl_device int bsdf_translucent_sample(const ShaderClosure *sc, + float3 Ng, + float3 I, + float3 dIdx, + float3 dIdy, + float randu, + float randv, + float3 *eval, + float3 *omega_in, + float3 *domega_in_dx, + float3 *domega_in_dy, + float *pdf) { - const DiffuseBsdf *bsdf = (const DiffuseBsdf*)sc; - float3 N = bsdf->N; - - // we are viewing the surface from the right side - send a ray out with cosine - // distribution over the hemisphere - sample_cos_hemisphere (-N, randu, randv, omega_in, pdf); - if(dot(Ng, *omega_in) < 0) { - *eval = make_float3(*pdf, *pdf, *pdf); + const DiffuseBsdf *bsdf = (const DiffuseBsdf *)sc; + float3 N = bsdf->N; + + // we are viewing the surface from the right side - send a ray out with cosine + // distribution over the hemisphere + sample_cos_hemisphere(-N, randu, randv, omega_in, pdf); + if (dot(Ng, *omega_in) < 0) { + *eval = make_float3(*pdf, *pdf, *pdf); #ifdef __RAY_DIFFERENTIALS__ - // TODO: find a better approximation for the diffuse bounce - *domega_in_dx = -((2 * dot(N, dIdx)) * N - dIdx); - *domega_in_dy = -((2 * dot(N, dIdy)) * N - dIdy); + // TODO: find a better approximation for the diffuse bounce + *domega_in_dx = -((2 * dot(N, dIdx)) * N - dIdx); + *domega_in_dy = -((2 * dot(N, dIdy)) * N - dIdy); #endif - } - else { - *pdf = 0; - } - return LABEL_TRANSMIT|LABEL_DIFFUSE; + } + else { + *pdf = 0; + } + return LABEL_TRANSMIT | LABEL_DIFFUSE; } CCL_NAMESPACE_END -#endif /* __BSDF_DIFFUSE_H__ */ +#endif /* __BSDF_DIFFUSE_H__ */ |