diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-05-09 17:11:37 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-05-09 17:13:32 +0300 |
commit | 5068f7dc015eb66a292d0027b3268f535201b3af (patch) | |
tree | 566626a56175182e68ebea7c4ea536e440ea1c16 | |
parent | b3299bace003d9d061b188760a263ca7b42c36d7 (diff) |
Cycles: Add utility function to graph to query number of closures used in it
Currently unused but will be needed soon for the split kernel work.
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 1 | ||||
-rw-r--r-- | intern/cycles/render/graph.cpp | 20 | ||||
-rw-r--r-- | intern/cycles/render/graph.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 2 |
4 files changed, 26 insertions, 0 deletions
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 7130b14a426..848c16be327 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -426,6 +426,7 @@ typedef enum ClosureType { #define CLOSURE_IS_BACKGROUND(type) (type == CLOSURE_BACKGROUND_ID) #define CLOSURE_IS_AMBIENT_OCCLUSION(type) (type == CLOSURE_AMBIENT_OCCLUSION_ID) #define CLOSURE_IS_PHASE(type) (type == CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID) +#define CLOSURE_IS_GLASS(type) (type >= CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID && type <= CLOSURE_BSDF_SHARP_GLASS_ID) #define CLOSURE_WEIGHT_CUTOFF 1e-5f diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index b36cbb5ea6f..ab89ee3ae37 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -833,6 +833,26 @@ void ShaderGraph::transform_multi_closure(ShaderNode *node, ShaderOutput *weight } } +int ShaderGraph::get_num_closures() +{ + int num_closures = 0; + foreach(ShaderNode *node, nodes) { + if(node->special_type == SHADER_SPECIAL_TYPE_CLOSURE) { + BsdfNode *bsdf_node = static_cast<BsdfNode*>(node); + /* TODO(sergey): Make it more generic approach, maybe some utility + * macros like CLOSURE_IS_FOO()? + */ + if(CLOSURE_IS_BSSRDF(bsdf_node->closure)) + num_closures = num_closures + 3; + else if(CLOSURE_IS_GLASS(bsdf_node->closure)) + num_closures = num_closures + 2; + else + num_closures = num_closures + 1; + } + } + return num_closures; +} + void ShaderGraph::dump_graph(const char *filename) { FILE *fd = fopen(filename, "w"); diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h index 7817a4cdc6d..6744804ef19 100644 --- a/intern/cycles/render/graph.h +++ b/intern/cycles/render/graph.h @@ -82,6 +82,7 @@ enum ShaderNodeSpecialType { SHADER_SPECIAL_TYPE_SCRIPT, SHADER_SPECIAL_TYPE_BACKGROUND, SHADER_SPECIAL_TYPE_IMAGE_SLOT, + SHADER_SPECIAL_TYPE_CLOSURE, }; /* Enum @@ -253,6 +254,8 @@ public: void remove_unneeded_nodes(); void finalize(bool do_bump = false, bool do_osl = false); + int get_num_closures(); + void dump_graph(const char *filename); protected: diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index d3f26a08292..7eaecc2751c 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1520,6 +1520,8 @@ void ProxyNode::compile(OSLCompiler& /*compiler*/) BsdfNode::BsdfNode(bool scattering_) : ShaderNode("bsdf"), scattering(scattering_) { + special_type = SHADER_SPECIAL_TYPE_CLOSURE; + add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f)); add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL); add_input("SurfaceMixWeight", SHADER_SOCKET_FLOAT, 0.0f, ShaderInput::USE_SVM); |