diff options
author | Lukas Toenne <lukas.toenne@googlemail.com> | 2012-09-03 15:38:15 +0400 |
---|---|---|
committer | Lukas Toenne <lukas.toenne@googlemail.com> | 2012-09-03 15:38:15 +0400 |
commit | 0238d032b2d079dbdf8ae96a1128fc3c2e12f548 (patch) | |
tree | dfbaf3591be5e03cd47a0704cb363d3f28ec6bc6 /intern/cycles | |
parent | acebddeb235b13915e3034bce1fa9bab1d51e94b (diff) |
Replaced dynamic_casts for node type checks by simple 'special type' identifiers. RTTI has to be disabled in cycles for OSL.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/render/graph.cpp | 10 | ||||
-rw-r--r-- | intern/cycles/render/graph.h | 13 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 3 |
3 files changed, 21 insertions, 5 deletions
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index 18e802b610d..6ed0812a239 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -55,6 +55,7 @@ ShaderNode::ShaderNode(const char *name_) name = name_; id = -1; bump = SHADER_BUMP_NONE; + special_type = SHADER_SPECIAL_TYPE_NONE; } ShaderNode::~ShaderNode() @@ -298,8 +299,8 @@ void ShaderGraph::copy_nodes(set<ShaderNode*>& nodes, map<ShaderNode*, ShaderNod void ShaderGraph::remove_proxy_nodes(vector<bool>& removed) { foreach(ShaderNode *node, nodes) { - ProxyNode *proxy = dynamic_cast<ProxyNode*>(node); - if (proxy) { + if (node->special_type == SHADER_SPECIAL_TYPE_PROXY) { + ProxyNode *proxy = static_cast<ProxyNode*>(node); ShaderInput *input = proxy->inputs[0]; ShaderOutput *output = proxy->outputs[0]; @@ -330,9 +331,8 @@ void ShaderGraph::remove_proxy_nodes(vector<bool>& removed) } /* remove useless mix closures nodes */ - MixClosureNode *mix = dynamic_cast<MixClosureNode*>(node); - - if(mix) { + if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) { + MixClosureNode *mix = static_cast<MixClosureNode*>(node); if(mix->outputs[0]->links.size() && mix->inputs[1]->link == mix->inputs[2]->link) { ShaderOutput *output = mix->inputs[1]->link; vector<ShaderInput*> inputs = mix->outputs[0]->links; diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h index 91ec83aba21..c3b674d0f23 100644 --- a/intern/cycles/render/graph.h +++ b/intern/cycles/render/graph.h @@ -63,6 +63,17 @@ enum ShaderBump { SHADER_BUMP_DY }; +/* Identifiers for some special node types. + * + * The graph needs to identify these in the clean function. + * Cannot use dynamic_cast, as this is disabled for OSL. */ + +enum ShaderNodeSpecialType { + SHADER_SPECIAL_TYPE_NONE, + SHADER_SPECIAL_TYPE_PROXY, + SHADER_SPECIAL_TYPE_MIX_CLOSURE +}; + /* Enum * * Utility class for enum values. */ @@ -167,6 +178,8 @@ public: ustring name; /* name, not required to be unique */ int id; /* index in graph node array */ ShaderBump bump; /* for bump mapping utility */ + + ShaderNodeSpecialType special_type; /* special node type */ }; diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index b16b4298be3..d5ca20e6af1 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1036,6 +1036,7 @@ ProxyNode::ProxyNode(ShaderSocketType from_, ShaderSocketType to_) { from = from_; to = to_; + special_type = SHADER_SPECIAL_TYPE_PROXY; add_input("Input", from); add_output("Output", to); @@ -1971,6 +1972,8 @@ void AddClosureNode::compile(OSLCompiler& compiler) MixClosureNode::MixClosureNode() : ShaderNode("mix_closure") { + special_type = SHADER_SPECIAL_TYPE_MIX_CLOSURE; + add_input("Fac", SHADER_SOCKET_FLOAT, 0.5f); add_input("Closure1", SHADER_SOCKET_CLOSURE); add_input("Closure2", SHADER_SOCKET_CLOSURE); |