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
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-05-13 16:11:08 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-05-13 16:11:08 +0400
commit216602fe4b90c635cd1993aa1c1a9d866b6ae2cd (patch)
tree70b676fe831dbc3ec8084fb082c1790125d9f87f /intern/cycles
parentf48fbd3f68ea7751583f258a6e8e1bf1fe945fc7 (diff)
Cycles: fix BSDF closure inputs ignoring links.
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/kernel/svm/svm.h2
-rw-r--r--intern/cycles/kernel/svm/svm_closure.h9
-rw-r--r--intern/cycles/render/nodes.cpp9
3 files changed, 15 insertions, 5 deletions
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 5bd076c9cab..51445aece6c 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -167,7 +167,7 @@ __device void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderType type,
else return;
}
else if(node.x == NODE_CLOSURE_BSDF)
- svm_node_closure_bsdf(sd, node.y, node.z, node.w, randb);
+ svm_node_closure_bsdf(sd, stack, node, randb);
else if(node.x == NODE_CLOSURE_EMISSION)
svm_node_closure_emission(sd);
else if(node.x == NODE_CLOSURE_BACKGROUND)
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index fe9edc36e95..58a916029f4 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -20,10 +20,13 @@ CCL_NAMESPACE_BEGIN
/* Closure Nodes */
-__device void svm_node_closure_bsdf(ShaderData *sd, uint type, int iparam1, int iparam2, float randb)
+__device void svm_node_closure_bsdf(ShaderData *sd, float *stack, uint4 node, float randb)
{
- float param1 = __int_as_float(iparam1);
- float param2 = __int_as_float(iparam2);
+ uint type, param1_offset, param2_offset;
+ decode_node_uchar4(node.y, &type, &param1_offset, &param2_offset, NULL);
+
+ float param1 = (stack_valid(param1_offset))? stack_load_float(stack, param1_offset): __int_as_float(node.z);
+ float param2 = (stack_valid(param2_offset))? stack_load_float(stack, param2_offset): __int_as_float(node.w);
switch(type) {
case CLOSURE_BSDF_DIFFUSE_ID:
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index d437d0dfcc1..bcce6db6171 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -987,9 +987,16 @@ void BsdfNode::compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *
}
else
compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color_in->value);
+
+ if(param1)
+ compiler.stack_assign(param1);
+ if(param2)
+ compiler.stack_assign(param2);
compiler.add_node(NODE_CLOSURE_BSDF,
- closure,
+ compiler.encode_uchar4(closure,
+ (param1)? param1->stack_offset: SVM_STACK_INVALID,
+ (param2)? param2->stack_offset: SVM_STACK_INVALID),
__float_as_int((param1)? param1->value.x: 0.0f),
__float_as_int((param2)? param2->value.x: 0.0f));
}