Commit: d165b1b266b9d19775ee73733b63824b8551aea6
Author: Sergey Sharybin
Date:   Fri Sep 19 15:21:32 2014 +0600
Branches: master
https://developer.blender.org/rBd165b1b266b9d19775ee73733b63824b8551aea6

Cycles: Add method to dump current shader graph to the graphiz file

This is rather useful to see how good optimization went and so.

Currently uses quite simple notation: shader nodes are nodes on the
graph, connects between graph nodes are named by the sockets names,
so i.e. connection between BSDF and Mix would be named bsdf:closure1.

Could be improved in the feature to draw fancier graph, but it's good
enough already.

Use in the following way:
- To create graphix file call graph->dump_graph("graph.dot")
- To visualize the grapf call: dot -Tpng graph.dot -o graph.png

===================================================================

M       intern/cycles/render/graph.cpp
M       intern/cycles/render/graph.h

===================================================================

diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index d90e5c4..45b0883 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -835,5 +835,47 @@ void ShaderGraph::transform_multi_closure(ShaderNode 
*node, ShaderOutput *weight
        }
 }
 
+void ShaderGraph::dump_graph(const char *filename)
+{
+       FILE *fd = fopen(filename, "w");
+
+       if(fd == NULL) {
+               printf("Error opening file for dumping the graph: %s\n", 
filename);
+               return;
+       }
+
+       fprintf(fd, "digraph dependencygraph {\n");
+       fprintf(fd, "ranksep=1.5\n");
+       fprintf(fd, "splines=false\n");
+
+       foreach(ShaderNode *node, nodes) {
+               fprintf(fd, "// NODE: %p\n", node);
+               fprintf(fd,
+                       "\"%p\" [shape=record,label=\"%s\"]\n",
+                       node,
+                       node->name.c_str());
+       }
+
+       foreach(ShaderNode *node, nodes) {
+               foreach(ShaderOutput *output, node->outputs) {
+                       foreach(ShaderInput *input, output->links) {
+                               fprintf(fd,
+                                       "// CONNECTION: %p->%p (%s:%s)\n",
+                                       output,
+                                       input,
+                                       output->name, input->name);
+                               fprintf(fd,
+                                       "\"%p\":s -> \"%p\":n 
[label=\"%s:%s\"]\n",
+                                       output->parent,
+                                       input->parent,
+                                       output->name, input->name);
+                       }
+               }
+       }
+
+       fprintf(fd, "}\n");
+       fclose(fd);
+}
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h
index 7bfd51c..7b95703 100644
--- a/intern/cycles/render/graph.h
+++ b/intern/cycles/render/graph.h
@@ -250,6 +250,8 @@ public:
        void remove_unneeded_nodes();
        void finalize(bool do_bump = false, bool do_osl = false);
 
+       void dump_graph(const char *filename);
+
 protected:
        typedef pair<ShaderNode* const, ShaderNode*> NodePair;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to