diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 10754ed6b9f..94a48e6c42d 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -431,6 +431,7 @@ class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel): class CyclesWorld_PT_volume(CyclesButtonsPanel, Panel): bl_label = "Volume" bl_context = "world" + bl_options = {'DEFAULT_CLOSED'} @classmethod def poll(cls, context): @@ -460,6 +461,7 @@ class CyclesMaterial_PT_surface(CyclesButtonsPanel, Panel): class CyclesMaterial_PT_volume(CyclesButtonsPanel, Panel): bl_label = "Volume" bl_context = "material" + bl_options = {'DEFAULT_CLOSED'} @classmethod def poll(cls, context): diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 62e02f1a01a..9628f96bcab 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -179,7 +179,7 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT svm_node_closure_emission(sd, stack, node); break; case NODE_CLOSURE_BACKGROUND: - svm_node_closure_background(sd, node); + svm_node_closure_background(sd, stack, node); break; case NODE_CLOSURE_HOLDOUT: svm_node_closure_holdout(sd, stack, node); 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; } diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index e6aff8590ad..9c72c01417a 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1370,7 +1370,7 @@ void BackgroundNode::compile(SVMCompiler& compiler) else compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color_in->value*strength_in->value.x); - compiler.add_node(NODE_CLOSURE_BACKGROUND, CLOSURE_BACKGROUND_ID); + compiler.add_node(NODE_CLOSURE_BACKGROUND, compiler.closure_mix_weight_offset()); } void BackgroundNode::compile(OSLCompiler& compiler)