From f45f2ac68732aae68cb13103795ba9303fa5da77 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 1 Jun 2015 15:52:00 +0500 Subject: Cycles: Fix missing features gathering from the bump graph --- intern/cycles/render/shader.cpp | 37 ++++++++++++++++++++++++++----------- intern/cycles/render/shader.h | 8 +++++++- 2 files changed, 33 insertions(+), 12 deletions(-) (limited to 'intern') 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(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(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 beckmann_table; size_t beckmann_table_offset; + + void get_requested_graph_features(ShaderGraph *graph, + int& max_group, + int& features); }; CCL_NAMESPACE_END -- cgit v1.2.3