Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2014-04-04 00:04:39 +0400
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2014-04-04 00:13:05 +0400
commitbd03e4cfe8f1d8e4d706e126f59e6b8ddf3688c5 (patch)
tree20c6ec373567a0c98497e486f1a8f87b2b06cf75 /intern/cycles/render/svm.cpp
parentab32a1807dd153723d26a7d53895ed071233dafc (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.cpp25
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);