diff options
author | OmarSquircleArt <omar.squircleart@gmail.com> | 2019-08-14 11:53:19 +0300 |
---|---|---|
committer | OmarSquircleArt <omar.squircleart@gmail.com> | 2019-08-14 11:53:19 +0300 |
commit | 7a7eadaf7f6be4008f49a83d76c5a6d5a6294f14 (patch) | |
tree | 8a064999db636d7c8c49f41156fd526193cee658 /intern | |
parent | c9acc5faad08422e07be59fc160a028a45b7440c (diff) |
Shading: Add a clamp option to the Map Range node.
If the option is enabled, the output is clamped to the target range.
The target range is [To Min, To Max]. The option is enabled by default.
The clamp option is implemented in EEVEE by linking to the `clamp_value`
GLSL function. And it is implemented in Cycles using a graph expand
function.
Reviewers: brecht, JacquesLucke
Differential Revision: https://developer.blender.org/D5477
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/blender/blender_shader.cpp | 5 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 15 | ||||
-rw-r--r-- | intern/cycles/render/nodes.h | 3 |
3 files changed, 22 insertions, 1 deletions
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index b1c61c2fa8c..b95e88573fa 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -316,7 +316,10 @@ static ShaderNode *add_node(Scene *scene, node = new RGBToBWNode(); } else if (b_node.is_a(&RNA_ShaderNodeMapRange)) { - node = new MapRangeNode(); + BL::ShaderNodeMapRange b_map_range_node(b_node); + MapRangeNode *map_range_node = new MapRangeNode(); + map_range_node->clamp = b_map_range_node.clamp(); + node = map_range_node; } else if (b_node.is_a(&RNA_ShaderNodeClamp)) { node = new ClampNode(); diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 18a7180c446..1a0225e19a8 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -5280,6 +5280,21 @@ MapRangeNode::MapRangeNode() : ShaderNode(node_type) { } +void MapRangeNode::expand(ShaderGraph *graph) +{ + if (clamp) { + ShaderOutput *result_out = output("Result"); + if (!result_out->links.empty()) { + ClampNode *clamp_node = new ClampNode(); + clamp_node->min = to_min; + clamp_node->max = to_max; + graph->add(clamp_node); + graph->relink(result_out, clamp_node->output("Result")); + graph->connect(result_out, clamp_node->input("Value")); + } + } +} + void MapRangeNode::constant_fold(const ConstantFolder &folder) { if (folder.all_inputs_constant()) { diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 9ac42ffc76c..d4708adf9af 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -1236,7 +1236,10 @@ class MapRangeNode : public ShaderNode { { return NODE_GROUP_LEVEL_3; } + void expand(ShaderGraph *graph); + float value, from_min, from_max, to_min, to_max; + bool clamp; }; class ClampNode : public ShaderNode { |