Fix #33335: cycles SVM closure issue in recent bugfix, incorrectly tagging
node as done.
This commit is contained in:
@@ -487,7 +487,7 @@ void SVMCompiler::generate_closure(ShaderNode *node, set<ShaderNode*>& done)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done)
|
void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, set<ShaderNode*>& closure_done)
|
||||||
{
|
{
|
||||||
/* todo: the weaks point here is that unlike the single closure sampling
|
/* todo: the weaks point here is that unlike the single closure sampling
|
||||||
* we will evaluate all nodes even if they are used as input for closures
|
* we will evaluate all nodes even if they are used as input for closures
|
||||||
@@ -495,10 +495,10 @@ void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& don
|
|||||||
* nodes at runtime, especially if they are tangled up */
|
* nodes at runtime, especially if they are tangled up */
|
||||||
|
|
||||||
/* only generate once */
|
/* only generate once */
|
||||||
if(done.find(node) != done.end())
|
if(closure_done.find(node) != closure_done.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
done.insert(node);
|
closure_done.insert(node);
|
||||||
|
|
||||||
if(node->name == ustring("mix_closure") || node->name == ustring("add_closure")) {
|
if(node->name == ustring("mix_closure") || node->name == ustring("add_closure")) {
|
||||||
/* weighting is already taken care of in ShaderGraph::transform_multi_closure */
|
/* weighting is already taken care of in ShaderGraph::transform_multi_closure */
|
||||||
@@ -506,9 +506,9 @@ void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& don
|
|||||||
ShaderInput *cl2in = node->input("Closure2");
|
ShaderInput *cl2in = node->input("Closure2");
|
||||||
|
|
||||||
if(cl1in->link)
|
if(cl1in->link)
|
||||||
generate_multi_closure(cl1in->link->parent, done);
|
generate_multi_closure(cl1in->link->parent, done, closure_done);
|
||||||
if(cl2in->link)
|
if(cl2in->link)
|
||||||
generate_multi_closure(cl2in->link->parent, done);
|
generate_multi_closure(cl2in->link->parent, done, closure_done);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* execute dependencies for closure */
|
/* execute dependencies for closure */
|
||||||
@@ -543,6 +543,8 @@ void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& don
|
|||||||
if(node->name == ustring("transparent"))
|
if(node->name == ustring("transparent"))
|
||||||
current_shader->has_surface_transparent = true;
|
current_shader->has_surface_transparent = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done.insert(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -613,8 +615,10 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
|
|||||||
if(generate) {
|
if(generate) {
|
||||||
set<ShaderNode*> done;
|
set<ShaderNode*> done;
|
||||||
|
|
||||||
if(use_multi_closure)
|
if(use_multi_closure) {
|
||||||
generate_multi_closure(clin->link->parent, done);
|
set<ShaderNode*> closure_done;
|
||||||
|
generate_multi_closure(clin->link->parent, done, closure_done);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
generate_closure(clin->link->parent, done);
|
generate_closure(clin->link->parent, done);
|
||||||
}
|
}
|
||||||
|
@@ -130,7 +130,7 @@ protected:
|
|||||||
void generate_closure(ShaderNode *node, set<ShaderNode*>& done);
|
void generate_closure(ShaderNode *node, set<ShaderNode*>& done);
|
||||||
|
|
||||||
/* multi closure */
|
/* multi closure */
|
||||||
void generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done);
|
void generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, set<ShaderNode*>& closure_done);
|
||||||
|
|
||||||
/* compile */
|
/* compile */
|
||||||
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
|
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
|
||||||
|
Reference in New Issue
Block a user