Cycles: fix BSDF closure inputs ignoring links.
This commit is contained in:
@@ -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)
|
||||
|
@@ -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, ¶m1_offset, ¶m2_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:
|
||||
|
@@ -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));
|
||||
}
|
||||
|
Reference in New Issue
Block a user