diff options
Diffstat (limited to 'intern/cycles/kernel/svm/svm_closure.h')
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index c495ebb35bd..88397005b49 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -254,10 +254,13 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * case CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID: { #ifdef __CAUSTICS_TRICKS__ if(!kernel_data.integrator.caustics_reflective && - !kernel_data.integrator.caustics_refractive && (path_flag & PATH_RAY_DIFFUSE)) { + !kernel_data.integrator.caustics_refractive && (path_flag & PATH_RAY_DIFFUSE)) + { break; } #endif + int num_closure = ccl_fetch(sd, num_closure); + /* index of refraction */ float eta = fmaxf(param2, 1e-5f); eta = (ccl_fetch(sd, flag) & SD_BACKFACING)? 1.0f/eta: eta; @@ -268,7 +271,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * float roughness = param1; /* reflection */ - ShaderClosure *sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure)); + ShaderClosure *sc = ccl_fetch_array(sd, closure, num_closure); float3 weight = sc->weight; float sample_weight = sc->sample_weight; @@ -289,8 +292,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * #endif /* refraction */ - if(ccl_fetch(sd, num_closure) < MAX_CLOSURE) { - sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure)); + if(num_closure + 1 < MAX_CLOSURE) { + sc = ccl_fetch_array(sd, closure, num_closure + 1); sc->weight = weight; sc->sample_weight = sample_weight; @@ -411,7 +414,10 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * sc->data1 = param2; sc->data2 = -stack_load_float(stack, data_node.z); - if(!(ccl_fetch(sd, type) & PRIMITIVE_ALL_CURVE)) { + if(stack_valid(data_node.y)) { + sc->T = normalize(stack_load_float3(stack, data_node.y)); + } + else if(!(ccl_fetch(sd, type) & PRIMITIVE_ALL_CURVE)) { sc->T = normalize(ccl_fetch(sd, dPdv)); sc->data2 = 0.0f; } @@ -432,14 +438,16 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * #endif #ifdef __SUBSURFACE__ -#ifndef __SPLIT_KERNEL__ -# define sc_next(sc) sc++ +# ifndef __SPLIT_KERNEL__ +# define sc_next(sc) sc++ # else -# define sc_next(sc) sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure)) +# define sc_next(sc) sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure)) # endif case CLOSURE_BSSRDF_CUBIC_ID: - case CLOSURE_BSSRDF_GAUSSIAN_ID: { + case CLOSURE_BSSRDF_GAUSSIAN_ID: + case CLOSURE_BSSRDF_BURLEY_ID: { ShaderClosure *sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure)); + float3 albedo = sc->weight; float3 weight = sc->weight * mix_weight; float sample_weight = fabsf(average(weight)); @@ -463,11 +471,11 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * sc->sample_weight = sample_weight; sc->data0 = radius.x; sc->data1 = texture_blur; - sc->data2 = 0.0f; + sc->data2 = albedo.x; sc->T.x = sharpness; -#ifdef __OSL__ +# ifdef __OSL__ sc->prim = NULL; -#endif +# endif sc->N = N; ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)type); @@ -480,11 +488,11 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * sc->sample_weight = sample_weight; sc->data0 = radius.y; sc->data1 = texture_blur; - sc->data2 = 0.0f; + sc->data2 = albedo.y; sc->T.x = sharpness; -#ifdef __OSL__ +# ifdef __OSL__ sc->prim = NULL; -#endif +# endif sc->N = N; ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)type); @@ -497,11 +505,11 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * sc->sample_weight = sample_weight; sc->data0 = radius.z; sc->data1 = texture_blur; - sc->data2 = 0.0f; + sc->data2 = albedo.z; sc->T.x = sharpness; -#ifdef __OSL__ +# ifdef __OSL__ sc->prim = NULL; -#endif +# endif sc->N = N; ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)type); |