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
path: root/intern
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-06-01 13:52:00 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-06-01 17:49:52 +0300
commitf45f2ac68732aae68cb13103795ba9303fa5da77 (patch)
treea47debd0bd953cff2fbd30767e09ca1467aada3f /intern
parent4d8cf1329df3cf545acbe369e3d7c39428cf91d2 (diff)
Cycles: Fix missing features gathering from the bump graph
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/render/shader.cpp37
-rw-r--r--intern/cycles/render/shader.h8
2 files changed, 33 insertions, 12 deletions
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 2f8eabbf0a9..d73d73a0ca8 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -481,24 +481,39 @@ void ShaderManager::add_default(Scene *scene)
}
}
-void ShaderManager::get_requested_features(Scene *scene, int& max_group, int& features)
+/* NOTE: Expects max_group and features to be initialized in the callee. */
+void ShaderManager::get_requested_graph_features(ShaderGraph *graph,
+ int& max_group,
+ int& features)
+{
+ foreach(ShaderNode *node, graph->nodes) {
+ max_group = min(max_group, node->get_group());
+ features |= node->get_feature();
+ if(node->special_type == SHADER_SPECIAL_TYPE_CLOSURE) {
+ BsdfNode *bsdf_node = static_cast<BsdfNode*>(node);
+ if(CLOSURE_IS_VOLUME(bsdf_node->closure)) {
+ features |= NODE_FEATURE_VOLUME;
+ }
+ }
+ }
+}
+
+void ShaderManager::get_requested_features(Scene *scene,
+ int& max_group,
+ int& features)
{
max_group = NODE_GROUP_LEVEL_0;
features = 0;
for(int i = 0; i < scene->shaders.size(); i++) {
Shader *shader = scene->shaders[i];
/* Gather requested features from all the nodes from the graph nodes. */
- foreach(ShaderNode *node, shader->graph->nodes) {
- max_group = min(max_group, node->get_group());
- features |= node->get_feature();
- if(node->special_type == SHADER_SPECIAL_TYPE_CLOSURE) {
- BsdfNode *bsdf_node = static_cast<BsdfNode*>(node);
- if(CLOSURE_IS_VOLUME(bsdf_node->closure)) {
- features |= NODE_FEATURE_VOLUME;
- }
- }
- }
+ get_requested_graph_features(shader->graph, max_group, features);
/* Gather requested features from the graph itself. */
+ if(shader->graph_bump) {
+ get_requested_graph_features(shader->graph_bump,
+ max_group,
+ features);
+ }
ShaderNode *output_node = shader->graph->output();
if(output_node->input("Displacement")->link != NULL) {
features |= NODE_FEATURE_BUMP;
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 27b239601d0..64d45635ef1 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -166,7 +166,9 @@ public:
static void add_default(Scene *scene);
/* Selective nodes compilation. */
- void get_requested_features(Scene *scene, int& max_group, int& features);
+ void get_requested_features(Scene *scene,
+ int& max_group,
+ int& features);
protected:
ShaderManager();
@@ -178,6 +180,10 @@ protected:
static vector<float> beckmann_table;
size_t beckmann_table_offset;
+
+ void get_requested_graph_features(ShaderGraph *graph,
+ int& max_group,
+ int& features);
};
CCL_NAMESPACE_END