diff options
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/graph.cpp | 23 | ||||
-rw-r--r-- | intern/cycles/render/graph.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/nodes.h | 6 |
4 files changed, 24 insertions, 11 deletions
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 8c69c589ebb..be87e35326e 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -370,6 +370,9 @@ typedef enum ShaderType { /* Closure */ typedef enum ClosureType { + /* Special type, flags generic node as a non-BSDF. */ + CLOSURE_NONE_ID, + CLOSURE_BSDF_ID, /* Diffuse */ diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index 15c89cc4b51..24e4c9f33d5 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -984,17 +984,18 @@ 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; + ClosureType closure_type = node->get_closure_type(); + if(closure_type == CLOSURE_NONE_ID) { + continue; + } + else if(CLOSURE_IS_BSSRDF(closure_type)) { + num_closures += 3; + } + else if(CLOSURE_IS_GLASS(closure_type)) { + num_closures += 2; + } + else { + ++num_closures; } } return num_closures; diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h index b1ebdbfd51d..bd3f5ca689a 100644 --- a/intern/cycles/render/graph.h +++ b/intern/cycles/render/graph.h @@ -237,6 +237,9 @@ public: */ virtual int get_feature() { return bump == SHADER_BUMP_NONE ? 0 : NODE_FEATURE_BUMP; } + /* Get closure ID to which the node compiles into. */ + virtual ClosureType get_closure_type() { return CLOSURE_NONE_ID; } + /* Check whether settings of the node equals to another one. * * This is mainly used to check whether two nodes can be merged diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 54a5220dcef..5df34a84559 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -387,6 +387,7 @@ public: bool has_spatial_varying() { return true; } void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3 = NULL, ShaderInput *param4 = NULL); + virtual ClosureType get_closure_type() { return closure; } ClosureType closure; bool scattering; @@ -484,6 +485,7 @@ class EmissionNode : public ShaderNode { public: SHADER_NODE_CLASS(EmissionNode) bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, float3 *optimized_value); + virtual ClosureType get_closure_type() { return CLOSURE_EMISSION_ID; } bool has_surface_emission() { return true; } }; @@ -492,12 +494,14 @@ class BackgroundNode : public ShaderNode { public: SHADER_NODE_CLASS(BackgroundNode) bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, float3 *optimized_value); + virtual ClosureType get_closure_type() { return CLOSURE_BACKGROUND_ID; } }; class HoldoutNode : public ShaderNode { public: SHADER_NODE_CLASS(HoldoutNode) virtual int get_group() { return NODE_GROUP_LEVEL_1; } + virtual ClosureType get_closure_type() { return CLOSURE_HOLDOUT_ID; } }; class AmbientOcclusionNode : public ShaderNode { @@ -506,6 +510,7 @@ public: bool has_spatial_varying() { return true; } virtual int get_group() { return NODE_GROUP_LEVEL_1; } + virtual ClosureType get_closure_type() { return CLOSURE_AMBIENT_OCCLUSION_ID; } }; class VolumeNode : public ShaderNode { @@ -517,6 +522,7 @@ public: virtual int get_feature() { return ShaderNode::get_feature() | NODE_FEATURE_VOLUME; } + virtual ClosureType get_closure_type() { return closure; } ClosureType closure; |