Fix #33335: cycles SVM closure issue in recent bugfix, incorrectly tagging

node as done.
This commit is contained in:
Brecht Van Lommel 2012-11-28 19:13:34 +00:00
parent 0aad9f674a
commit 33f81187fb
2 changed files with 12 additions and 8 deletions

@ -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
* 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 */
/* only generate once */
if(done.find(node) != done.end())
if(closure_done.find(node) != closure_done.end())
return;
done.insert(node);
closure_done.insert(node);
if(node->name == ustring("mix_closure") || node->name == ustring("add_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");
if(cl1in->link)
generate_multi_closure(cl1in->link->parent, done);
generate_multi_closure(cl1in->link->parent, done, closure_done);
if(cl2in->link)
generate_multi_closure(cl2in->link->parent, done);
generate_multi_closure(cl2in->link->parent, done, closure_done);
}
else {
/* execute dependencies for closure */
@ -543,6 +543,8 @@ void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& don
if(node->name == ustring("transparent"))
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) {
set<ShaderNode*> done;
if(use_multi_closure)
generate_multi_closure(clin->link->parent, done);
if(use_multi_closure) {
set<ShaderNode*> closure_done;
generate_multi_closure(clin->link->parent, done, closure_done);
}
else
generate_closure(clin->link->parent, done);
}

@ -130,7 +130,7 @@ protected:
void generate_closure(ShaderNode *node, set<ShaderNode*>& done);
/* 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 */
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);