Cycles: fix BSDF closure inputs ignoring links.

This commit is contained in:
Brecht Van Lommel
2011-05-13 12:11:08 +00:00
parent f48fbd3f68
commit 216602fe4b
3 changed files with 15 additions and 5 deletions

View File

@@ -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)

View File

@@ -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:

View File

@@ -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));
}