From 98bf859efc1835c9df28d7727854438de81825a7 Mon Sep 17 00:00:00 2001 From: IRIE Shinsuke Date: Thu, 21 Nov 2013 04:02:00 +0900 Subject: Blender Internal: Add shader nodes "Separate HSV" and "Combine HSV", same as Cycles' ones. --- .../blender/gpu/shaders/gpu_shader_material.glsl | 15 +++++++++++ .../nodes/shader/nodes/node_shader_sepcombHSV.c | 30 ++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 5e5fac3049c..b2c7c2e3cef 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -735,6 +735,21 @@ void combine_rgb(float r, float g, float b, out vec4 col) col = vec4(r, g, b, 1.0); } +void separate_hsv(vec4 col, out float h, out float s, out float v) +{ + vec4 hsv; + + rgb_to_hsv(col, hsv); + h = hsv[0]; + s = hsv[1]; + v = hsv[2]; +} + +void combine_hsv(float h, float s, float v, out vec4 col) +{ + hsv_to_rgb(vec4(h, s, v, 1.0), col); +} + void output_node(vec4 rgb, float alpha, out vec4 outrgb) { outrgb = vec4(rgb.rgb, alpha); diff --git a/source/blender/nodes/shader/nodes/node_shader_sepcombHSV.c b/source/blender/nodes/shader/nodes/node_shader_sepcombHSV.c index 707e295241a..2c515d587c0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_sepcombHSV.c +++ b/source/blender/nodes/shader/nodes/node_shader_sepcombHSV.c @@ -44,13 +44,26 @@ static bNodeSocketTemplate sh_node_sephsv_out[] = { { -1, 0, "" } }; +static void node_shader_exec_sephsv(void *UNUSED(data), int UNUSED(thread), bNode *UNUSED(node), bNodeExecData *UNUSED(execdata), bNodeStack **in, bNodeStack **out) +{ + rgb_to_hsv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], + &out[0]->vec[0], &out[1]->vec[0], &out[2]->vec[0]); +} + +static int gpu_shader_sephsv(GPUMaterial *mat, bNode *UNUSED(node), bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out) +{ + return GPU_stack_link(mat, "separate_hsv", in, out); +} + void register_node_type_sh_sephsv(void) { static bNodeType ntype; sh_node_type_base(&ntype, SH_NODE_SEPHSV, "Separate HSV", NODE_CLASS_CONVERTOR, 0); - node_type_compatibility(&ntype, NODE_NEW_SHADING); + node_type_compatibility(&ntype, NODE_OLD_SHADING | NODE_NEW_SHADING); node_type_socket_templates(&ntype, sh_node_sephsv_in, sh_node_sephsv_out); + node_type_exec(&ntype, NULL, NULL, node_shader_exec_sephsv); + node_type_gpu(&ntype, gpu_shader_sephsv); nodeRegisterType(&ntype); } @@ -68,13 +81,26 @@ static bNodeSocketTemplate sh_node_combhsv_out[] = { { -1, 0, "" } }; +static void node_shader_exec_combhsv(void *UNUSED(data), int UNUSED(thread), bNode *UNUSED(node), bNodeExecData *UNUSED(execdata), bNodeStack **in, bNodeStack **out) +{ + hsv_to_rgb(in[0]->vec[0], in[1]->vec[0], in[2]->vec[0], + &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2]); +} + +static int gpu_shader_combhsv(GPUMaterial *mat, bNode *UNUSED(node), bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out) +{ + return GPU_stack_link(mat, "combine_hsv", in, out); +} + void register_node_type_sh_combhsv(void) { static bNodeType ntype; sh_node_type_base(&ntype, SH_NODE_COMBHSV, "Combine HSV", NODE_CLASS_CONVERTOR, 0); - node_type_compatibility(&ntype, NODE_NEW_SHADING); + node_type_compatibility(&ntype, NODE_OLD_SHADING | NODE_NEW_SHADING); node_type_socket_templates(&ntype, sh_node_combhsv_in, sh_node_combhsv_out); + node_type_exec(&ntype, NULL, NULL, node_shader_exec_combhsv); + node_type_gpu(&ntype, gpu_shader_combhsv); nodeRegisterType(&ntype); } -- cgit v1.2.3