diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-10-19 04:13:41 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-10-19 04:13:41 +0400 |
commit | 72e47de8b58c250598c384cc19419d190746b080 (patch) | |
tree | 017969113c5d6abfff9733f6397adfa61973d5a1 /intern/cycles/kernel/svm/svm_closure.h | |
parent | 97e58e499d8969b344333449514499cf1f5fdfce (diff) |
Cycles: fix some issues with mix shaders when the weight for an emission shader
was 0.0, and background shader mix wasn't working.
Diffstat (limited to 'intern/cycles/kernel/svm/svm_closure.h')
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index 90636380e43..fcda7ac6fe1 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -236,7 +236,6 @@ __device void svm_node_closure_volume(KernelGlobals *kg, ShaderData *sd, float * __device void svm_node_closure_emission(ShaderData *sd, float *stack, uint4 node) { #ifdef __MULTI_CLOSURE__ - ShaderClosure *sc = svm_node_closure_get(sd); uint mix_weight_offset = node.y; if(stack_valid(mix_weight_offset)) { @@ -245,31 +244,52 @@ __device void svm_node_closure_emission(ShaderData *sd, float *stack, uint4 node if(mix_weight == 0.0f) return; + ShaderClosure *sc = svm_node_closure_get(sd); sc->weight *= mix_weight; + sc->type = CLOSURE_EMISSION_ID; } + else { + ShaderClosure *sc = svm_node_closure_get(sd); + sc->type = CLOSURE_EMISSION_ID; + } + #else ShaderClosure *sc = &sd->closure; + sc->type = CLOSURE_EMISSION_ID; #endif - sc->type = CLOSURE_EMISSION_ID; sd->flag |= SD_EMISSION; } -__device void svm_node_closure_background(ShaderData *sd, uint4 node) +__device void svm_node_closure_background(ShaderData *sd, float *stack, uint4 node) { #ifdef __MULTI_CLOSURE__ - ShaderClosure *sc = svm_node_closure_get(sd); + uint mix_weight_offset = node.y; + + if(stack_valid(mix_weight_offset)) { + float mix_weight = stack_load_float(stack, mix_weight_offset); + + if(mix_weight == 0.0f) + return; + + ShaderClosure *sc = svm_node_closure_get(sd); + sc->weight *= mix_weight; + sc->type = CLOSURE_BACKGROUND_ID; + } + else { + ShaderClosure *sc = svm_node_closure_get(sd); + sc->type = CLOSURE_BACKGROUND_ID; + } + #else ShaderClosure *sc = &sd->closure; -#endif - sc->type = CLOSURE_BACKGROUND_ID; +#endif } __device void svm_node_closure_holdout(ShaderData *sd, float *stack, uint4 node) { #ifdef __MULTI_CLOSURE__ - ShaderClosure *sc = svm_node_closure_get(sd); uint mix_weight_offset = node.y; if(stack_valid(mix_weight_offset)) { @@ -278,17 +298,20 @@ __device void svm_node_closure_holdout(ShaderData *sd, float *stack, uint4 node) if(mix_weight == 0.0f) return; + ShaderClosure *sc = svm_node_closure_get(sd); sc->weight = make_float3(mix_weight, mix_weight, mix_weight); + sc->type = CLOSURE_HOLDOUT_ID; } - else + else { + ShaderClosure *sc = svm_node_closure_get(sd); sc->weight = make_float3(1.0f, 1.0f, 1.0f); - - sc->sample_weight = 0.0f; + sc->type = CLOSURE_HOLDOUT_ID; + } #else ShaderClosure *sc = &sd->closure; + sc->type = CLOSURE_HOLDOUT_ID; #endif - sc->type = CLOSURE_HOLDOUT_ID; sd->flag |= SD_HOLDOUT; } |