Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-10-19 04:13:41 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-10-19 04:13:41 +0400
commit72e47de8b58c250598c384cc19419d190746b080 (patch)
tree017969113c5d6abfff9733f6397adfa61973d5a1 /intern
parent97e58e499d8969b344333449514499cf1f5fdfce (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')
-rw-r--r--intern/cycles/blender/addon/ui.py2
-rw-r--r--intern/cycles/kernel/svm/svm.h2
-rw-r--r--intern/cycles/kernel/svm/svm_closure.h45
-rw-r--r--intern/cycles/render/nodes.cpp2
4 files changed, 38 insertions, 13 deletions
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)