Replaced dynamic_casts for node type checks by simple 'special type' identifiers...
authorLukas Toenne <lukas.toenne@googlemail.com>
Mon, 3 Sep 2012 11:38:15 +0000 (11:38 +0000)
committerLukas Toenne <lukas.toenne@googlemail.com>
Mon, 3 Sep 2012 11:38:15 +0000 (11:38 +0000)
intern/cycles/render/graph.cpp
intern/cycles/render/graph.h
intern/cycles/render/nodes.cpp

index 18e802b610de4be2701e2efe3db915cfeb332b45..6ed0812a23973a563e0cd9e105d1301b419ffa59 100644 (file)
@@ -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;
index 91ec83aba210728b0a553656d572c95553516092..c3b674d0f23b5c0d2a741ad80c7e2bc0468b3dd5 100644 (file)
@@ -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 */
 };
 
 
index b16b4298be3962a893c4688908d28ce6bb66e6d3..d5ca20e6af1d981dbfd9c237eae323019e7c541a 100644 (file)
@@ -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);