diff options
author | Charlie Jolly <charlie> | 2019-12-07 15:35:07 +0300 |
---|---|---|
committer | Charlie Jolly <mistajolly@gmail.com> | 2019-12-07 15:52:42 +0300 |
commit | 958d0d4236b1cfa600a7f36f6bdc51fdd0d98a97 (patch) | |
tree | 567a1e3209e6302dd784c054b858a8b5fb92bc9f /intern/cycles/kernel/svm/svm_clamp.h | |
parent | 0406eb110332a863811d7fb6228f9a7ca514e022 (diff) |
Shader Nodes: Add Interpolation modes to Map Range node
Modes: Linear interpolation (default), stepped linear, smoothstep and smootherstep.
This also includes an additional option for the **Clamp node** to switch between **Min Max** (default) and **Range** mode.
This was needed to allow clamping when **To Max** is less than **To Min**.
Reviewed By: JacquesLucke, brecht
Differential Revision: https://developer.blender.org/D5827
Diffstat (limited to 'intern/cycles/kernel/svm/svm_clamp.h')
-rw-r--r-- | intern/cycles/kernel/svm/svm_clamp.h | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/intern/cycles/kernel/svm/svm_clamp.h b/intern/cycles/kernel/svm/svm_clamp.h index a45e70a3f15..a85fd82754e 100644 --- a/intern/cycles/kernel/svm/svm_clamp.h +++ b/intern/cycles/kernel/svm/svm_clamp.h @@ -26,8 +26,8 @@ ccl_device void svm_node_clamp(KernelGlobals *kg, uint result_stack_offset, int *offset) { - uint min_stack_offset, max_stack_offset; - svm_unpack_node_uchar2(parameters_stack_offsets, &min_stack_offset, &max_stack_offset); + uint min_stack_offset, max_stack_offset, type; + svm_unpack_node_uchar3(parameters_stack_offsets, &min_stack_offset, &max_stack_offset, &type); uint4 defaults = read_node(kg, offset); @@ -35,7 +35,12 @@ ccl_device void svm_node_clamp(KernelGlobals *kg, float min = stack_load_float_default(stack, min_stack_offset, defaults.x); float max = stack_load_float_default(stack, max_stack_offset, defaults.y); - stack_store_float(stack, result_stack_offset, clamp(value, min, max)); + if (type == NODE_CLAMP_RANGE && (min > max)) { + stack_store_float(stack, result_stack_offset, clamp(value, max, min)); + } + else { + stack_store_float(stack, result_stack_offset, clamp(value, min, max)); + } } CCL_NAMESPACE_END |