diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-04-04 00:04:39 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-04-04 00:13:05 +0400 |
commit | bd03e4cfe8f1d8e4d706e126f59e6b8ddf3688c5 (patch) | |
tree | 20c6ec373567a0c98497e486f1a8f87b2b06cf75 /intern/cycles/render/svm.cpp | |
parent | ab32a1807dd153723d26a7d53895ed071233dafc (diff) |
Cycles volume: detect homogeneous volume automatically in common cases.
In practice this means that if you don't connect a texture to your volume nodes
it will figure that out and render the node faster, rather than you having to
specify it manually.
Main weakness is custom OSL nodes where we have to assume it is heterogeneous
because we don't know what kind of data the node accesses.
Diffstat (limited to 'intern/cycles/render/svm.cpp')
-rw-r--r-- | intern/cycles/render/svm.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index 377da67b5a4..c004187a091 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -379,6 +379,18 @@ void SVMCompiler::find_dependencies(set<ShaderNode*>& dependencies, const set<Sh } } +void SVMCompiler::generate_node(ShaderNode *node, set<ShaderNode*>& done) +{ + node->compile(*this); + stack_clear_users(node, done); + stack_clear_temporary(node); + + if(current_type == SHADER_TYPE_VOLUME) { + if(node->has_spatial_varying()) + current_shader->has_heterogeneous_volume = true; + } +} + void SVMCompiler::generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNode*>& done) { bool nodes_done; @@ -400,9 +412,7 @@ void SVMCompiler::generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNo if(node->has_converter_blackbody()) current_shader->has_converter_blackbody = true; - node->compile(*this); - stack_clear_users(node, done); - stack_clear_temporary(node); + generate_node(node, done); done.insert(node); } else @@ -485,9 +495,7 @@ void SVMCompiler::generate_closure(ShaderNode *node, set<ShaderNode*>& done) } /* compile closure itself */ - node->compile(*this); - stack_clear_users(node, done); - stack_clear_temporary(node); + generate_node(node, done); if(current_type == SHADER_TYPE_SURFACE) { if(node->has_surface_emission()) @@ -550,9 +558,7 @@ void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& don mix_weight_offset = SVM_STACK_INVALID; /* compile closure itself */ - node->compile(*this); - stack_clear_users(node, done); - stack_clear_temporary(node); + generate_node(node, done); mix_weight_offset = SVM_STACK_INVALID; @@ -694,6 +700,7 @@ void SVMCompiler::compile(Shader *shader, vector<int4>& global_svm_nodes, int in shader->has_converter_blackbody = false; shader->has_volume = false; shader->has_displacement = false; + shader->has_heterogeneous_volume = false; /* generate surface shader */ compile_type(shader, shader->graph, SHADER_TYPE_SURFACE); |