diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-09-19 13:21:32 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-09-25 15:08:32 +0400 |
commit | d165b1b266b9d19775ee73733b63824b8551aea6 (patch) | |
tree | 09ff334c725e519c8c3cd946b876b28e5675263c | |
parent | b3d414cc216222e115924aa4d6b4ecf43f459d78 (diff) |
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
-rw-r--r-- | intern/cycles/render/graph.cpp | 42 | ||||
-rw-r--r-- | intern/cycles/render/graph.h | 2 |
2 files changed, 44 insertions, 0 deletions
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index d90e5c4b2c9..45b08832fea 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 7bfd51cdee3..7b95703d3aa 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; |