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 /source/blender/nodes/shader | |
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 'source/blender/nodes/shader')
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_clamp.c | 9 | ||||
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_map_range.c | 33 |
2 files changed, 36 insertions, 6 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_clamp.c b/source/blender/nodes/shader/nodes/node_shader_clamp.c index 8e5b90436ea..329d7492db6 100644 --- a/source/blender/nodes/shader/nodes/node_shader_clamp.c +++ b/source/blender/nodes/shader/nodes/node_shader_clamp.c @@ -35,13 +35,19 @@ static bNodeSocketTemplate sh_node_clamp_out[] = { {-1, 0, ""}, }; +static void node_shader_init_clamp(bNodeTree *UNUSED(ntree), bNode *node) +{ + node->custom1 = NODE_CLAMP_MINMAX; /* clamp type */ +} + static int gpu_shader_clamp(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out) { - return GPU_stack_link(mat, node, "clamp_value", in, out); + return (node->custom1 == NODE_CLAMP_MINMAX) ? GPU_stack_link(mat, node, "clamp_value", in, out) : + GPU_stack_link(mat, node, "clamp_range", in, out); } void register_node_type_sh_clamp(void) @@ -50,6 +56,7 @@ void register_node_type_sh_clamp(void) sh_node_type_base(&ntype, SH_NODE_CLAMP, "Clamp", NODE_CLASS_CONVERTOR, 0); node_type_socket_templates(&ntype, sh_node_clamp_in, sh_node_clamp_out); + node_type_init(&ntype, node_shader_init_clamp); node_type_gpu(&ntype, gpu_shader_clamp); nodeRegisterType(&ntype); diff --git a/source/blender/nodes/shader/nodes/node_shader_map_range.c b/source/blender/nodes/shader/nodes/node_shader_map_range.c index 7ebf3faf1f3..c410dc7a981 100644 --- a/source/blender/nodes/shader/nodes/node_shader_map_range.c +++ b/source/blender/nodes/shader/nodes/node_shader_map_range.c @@ -30,6 +30,7 @@ static bNodeSocketTemplate sh_node_map_range_in[] = { {SOCK_FLOAT, 1, N_("From Max"), 1.0f, 1.0f, 1.0f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, {SOCK_FLOAT, 1, N_("To Min"), 0.0f, 1.0f, 1.0f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, {SOCK_FLOAT, 1, N_("To Max"), 1.0f, 1.0f, 1.0f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, + {SOCK_FLOAT, 1, N_("Steps"), 4.0f, 1.0f, 1.0f, 1.0f, 0.0f, 10000.0f, PROP_NONE}, {-1, 0, ""}, }; static bNodeSocketTemplate sh_node_map_range_out[] = { @@ -37,9 +38,16 @@ static bNodeSocketTemplate sh_node_map_range_out[] = { {-1, 0, ""}, }; +static void node_shader_update_map_range(bNodeTree *UNUSED(ntree), bNode *node) +{ + bNodeSocket *sockSteps = nodeFindSocket(node, SOCK_IN, "Steps"); + nodeSetSocketAvailability(sockSteps, node->custom2 == NODE_MAP_RANGE_STEPPED); +} + static void node_shader_init_map_range(bNodeTree *UNUSED(ntree), bNode *node) { - node->custom1 = true; + node->custom1 = true; /* use_clamp */ + node->custom2 = NODE_MAP_RANGE_LINEAR; /* interpolation */ } static int gpu_shader_map_range(GPUMaterial *mat, @@ -48,11 +56,25 @@ static int gpu_shader_map_range(GPUMaterial *mat, GPUNodeStack *in, GPUNodeStack *out) { - GPU_stack_link(mat, node, "map_range", in, out); - if (node->custom1) { - GPU_link(mat, "clamp_value", out[0].link, in[3].link, in[4].link, &out[0].link); + static const char *names[] = { + [NODE_MAP_RANGE_LINEAR] = "map_range_linear", + [NODE_MAP_RANGE_STEPPED] = "map_range_stepped", + [NODE_MAP_RANGE_SMOOTHSTEP] = "map_range_smoothstep", + [NODE_MAP_RANGE_SMOOTHERSTEP] = "map_range_smootherstep", + }; + + int ret = 0; + if (node->custom2 < ARRAY_SIZE(names) && names[node->custom2]) { + ret = GPU_stack_link(mat, node, names[node->custom2], in, out); + } + else { + ret = GPU_stack_link(mat, node, "map_range_linear", in, out); + } + if (ret && node->custom1 && + !ELEM(node->custom2, NODE_MAP_RANGE_SMOOTHSTEP, NODE_MAP_RANGE_SMOOTHERSTEP)) { + GPU_link(mat, "clamp_range", out[0].link, in[3].link, in[4].link, &out[0].link); } - return 1; + return ret; } void register_node_type_sh_map_range(void) @@ -62,6 +84,7 @@ void register_node_type_sh_map_range(void) sh_node_type_base(&ntype, SH_NODE_MAP_RANGE, "Map Range", NODE_CLASS_CONVERTOR, 0); node_type_socket_templates(&ntype, sh_node_map_range_in, sh_node_map_range_out); node_type_init(&ntype, node_shader_init_map_range); + node_type_update(&ntype, node_shader_update_map_range); node_type_gpu(&ntype, gpu_shader_map_range); nodeRegisterType(&ntype); |