diff options
author | Lukas Stockner <lukasstockner97> | 2019-12-04 21:57:28 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-12-10 22:44:46 +0300 |
commit | e760972221e68d3c81f2ee3687cc71836dde8ae9 (patch) | |
tree | b1a2efbb17c05a429e4509d336a1eb14c73cfb8c /intern/cycles/render/nodes.cpp | |
parent | 35b5888b157d05d378df3acc899d28856a9eb9a4 (diff) |
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
Diffstat (limited to 'intern/cycles/render/nodes.cpp')
-rw-r--r-- | intern/cycles/render/nodes.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 26f16d5ee80..5e12d79bc6b 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -5709,6 +5709,58 @@ void ClampNode::compile(OSLCompiler &compiler) compiler.add(this, "node_clamp"); } +/* AOV Output */ + +NODE_DEFINE(OutputAOVNode) +{ + NodeType *type = NodeType::add("aov_output", create, NodeType::SHADER); + + SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f)); + SOCKET_IN_FLOAT(value, "Value", 0.0f); + + SOCKET_STRING(name, "AOV Name", ustring("")); + + return type; +} + +OutputAOVNode::OutputAOVNode() : ShaderNode(node_type) +{ + special_type = SHADER_SPECIAL_TYPE_OUTPUT_AOV; + slot = -1; +} + +void OutputAOVNode::simplify_settings(Scene *scene) +{ + slot = scene->film->get_aov_offset(name.string(), is_color); + if (slot == -1) { + slot = scene->film->get_aov_offset(name.string(), is_color); + } + + if (slot == -1 || is_color) { + input("Value")->disconnect(); + } + if (slot == -1 || !is_color) { + input("Color")->disconnect(); + } +} + +void OutputAOVNode::compile(SVMCompiler &compiler) +{ + assert(slot >= 0); + + if (is_color) { + compiler.add_node(NODE_AOV_COLOR, compiler.stack_assign(input("Color")), slot); + } + else { + compiler.add_node(NODE_AOV_VALUE, compiler.stack_assign(input("Value")), slot); + } +} + +void OutputAOVNode::compile(OSLCompiler & /*compiler*/) +{ + /* TODO */ +} + /* Math */ NODE_DEFINE(MathNode) |