From e760972221e68d3c81f2ee3687cc71836dde8ae9 Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Wed, 4 Dec 2019 19:57:28 +0100 Subject: Cycles: support for custom shader AOVs Custom render passes are added in the Shader AOVs panel in the view layer settings, with a name and data type. In shader nodes, an AOV Output node is then used to output either a value or color to the pass. Arbitrary names can be used for these passes, as long as they don't conflict with built-in passes that are enabled. The AOV Output node can be used in both material and world shader nodes. Implemented by Lukas, with tweaks by Brecht. Differential Revision: https://developer.blender.org/D4837 --- intern/cycles/render/graph.cpp | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'intern/cycles/render/graph.cpp') diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp index 501d1e33a9b..0e520c700a7 100644 --- a/intern/cycles/render/graph.cpp +++ b/intern/cycles/render/graph.cpp @@ -55,6 +55,25 @@ bool check_node_inputs_traversed(const ShaderNode *node, const ShaderNodeSet &do } /* namespace */ +/* Sockets */ + +void ShaderInput::disconnect() +{ + if (link) { + link->links.erase(remove(link->links.begin(), link->links.end(), this), link->links.end()); + } + link = NULL; +} + +void ShaderOutput::disconnect() +{ + foreach (ShaderInput *sock, links) { + sock->link = NULL; + } + + links.clear(); +} + /* Node */ ShaderNode::ShaderNode(const NodeType *type) : Node(type) @@ -285,11 +304,7 @@ void ShaderGraph::disconnect(ShaderOutput *from) assert(!finalized); simplified = false; - foreach (ShaderInput *sock, from->links) { - sock->link = NULL; - } - - from->links.clear(); + from->disconnect(); } void ShaderGraph::disconnect(ShaderInput *to) @@ -298,10 +313,7 @@ void ShaderGraph::disconnect(ShaderInput *to) assert(to->link); simplified = false; - ShaderOutput *from = to->link; - - to->link = NULL; - from->links.erase(remove(from->links.begin(), from->links.end(), to), from->links.end()); + to->disconnect(); } void ShaderGraph::relink(ShaderInput *from, ShaderInput *to) @@ -782,6 +794,11 @@ void ShaderGraph::clean(Scene *scene) /* break cycles */ break_cycles(output(), visited, on_stack); + foreach (ShaderNode *node, nodes) { + if (node->special_type == SHADER_SPECIAL_TYPE_OUTPUT_AOV) { + break_cycles(node, visited, on_stack); + } + } /* disconnect unused nodes */ foreach (ShaderNode *node, nodes) { -- cgit v1.2.3