Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/shader/nodes/node_shader_separate_hsv.cc
- This file was copied from source/blender/nodes/shader/nodes/node_shader_normal.cc.
| /* | /* | ||||
| * This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
| * modify it under the terms of the GNU General Public License | * modify it under the terms of the GNU General Public License | ||||
| * as published by the Free Software Foundation; either version 2 | * as published by the Free Software Foundation; either version 2 | ||||
| * of the License, or (at your option) any later version. | * of the License, or (at your option) any later version. | ||||
| * | * | ||||
| * This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| * GNU General Public License for more details. | * GNU General Public License for more details. | ||||
| * | * | ||||
| * You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||
| * along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
| * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
| * | * | ||||
| * The Original Code is Copyright (C) 2005 Blender Foundation. | * The Original Code is Copyright (C) 2021 Blender Foundation. | ||||
| * All rights reserved. | * All rights reserved. | ||||
| */ | */ | ||||
| /** \file | /** \file | ||||
| * \ingroup shdnodes | * \ingroup shdnodes | ||||
| */ | */ | ||||
| #include "node_shader_util.hh" | #include "node_shader_util.hh" | ||||
| /* **************** NORMAL ******************** */ | namespace blender::nodes::node_shader_separate_hsv_cc { | ||||
| static bNodeSocketTemplate sh_node_normal_in[] = { | |||||
| {SOCK_VECTOR, N_("Normal"), 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, PROP_DIRECTION}, | static bNodeSocketTemplate sh_node_sephsv_in[] = { | ||||
| {SOCK_RGBA, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f}, | |||||
| {-1, ""}, | {-1, ""}, | ||||
| }; | }; | ||||
| static bNodeSocketTemplate sh_node_sephsv_out[] = { | |||||
| static bNodeSocketTemplate sh_node_normal_out[] = { | {SOCK_FLOAT, N_("H")}, | ||||
| {SOCK_VECTOR, N_("Normal"), 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, PROP_DIRECTION}, | {SOCK_FLOAT, N_("S")}, | ||||
| {SOCK_FLOAT, N_("Dot")}, | {SOCK_FLOAT, N_("V")}, | ||||
| {-1, ""}, | {-1, ""}, | ||||
| }; | }; | ||||
| /* generates normal, does dot product */ | static void node_shader_exec_sephsv(void *UNUSED(data), | ||||
| static void node_shader_exec_normal(void *UNUSED(data), | |||||
| int UNUSED(thread), | int UNUSED(thread), | ||||
| bNode *UNUSED(node), | bNode *UNUSED(node), | ||||
| bNodeExecData *UNUSED(execdata), | bNodeExecData *UNUSED(execdata), | ||||
| bNodeStack **in, | bNodeStack **in, | ||||
| bNodeStack **out) | bNodeStack **out) | ||||
| { | { | ||||
| float vec[3]; | float col[3]; | ||||
| nodestack_get_vec(col, SOCK_VECTOR, in[0]); | |||||
| /* stack order input: normal */ | |||||
| /* stack order output: normal, value */ | |||||
| nodestack_get_vec(vec, SOCK_VECTOR, in[0]); | |||||
| /* render normals point inside... the widget points outside */ | rgb_to_hsv(col[0], col[1], col[2], &out[0]->vec[0], &out[1]->vec[0], &out[2]->vec[0]); | ||||
| out[1]->vec[0] = -dot_v3v3(vec, out[0]->vec); | |||||
| } | } | ||||
| static int gpu_shader_normal(GPUMaterial *mat, | static int gpu_shader_sephsv(GPUMaterial *mat, | ||||
| bNode *node, | bNode *node, | ||||
| bNodeExecData *UNUSED(execdata), | bNodeExecData *UNUSED(execdata), | ||||
| GPUNodeStack *in, | GPUNodeStack *in, | ||||
| GPUNodeStack *out) | GPUNodeStack *out) | ||||
| { | { | ||||
| GPUNodeLink *vec = GPU_uniform(out[0].vec); | return GPU_stack_link(mat, node, "separate_hsv", in, out); | ||||
| return GPU_stack_link(mat, node, "normal_new_shading", in, out, vec); | |||||
| } | } | ||||
| void register_node_type_sh_normal() | } | ||||
| void register_node_type_sh_sephsv() | |||||
| { | { | ||||
| namespace file_ns = blender::nodes::node_shader_separate_hsv_cc; | |||||
| static bNodeType ntype; | static bNodeType ntype; | ||||
| sh_node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, 0); | sh_node_type_base(&ntype, SH_NODE_SEPHSV, "Separate HSV", NODE_CLASS_CONVERTER, 0); | ||||
| node_type_socket_templates(&ntype, sh_node_normal_in, sh_node_normal_out); | node_type_socket_templates(&ntype, file_ns::sh_node_sephsv_in, file_ns::sh_node_sephsv_out); | ||||
| node_type_exec(&ntype, nullptr, nullptr, node_shader_exec_normal); | node_type_exec(&ntype, nullptr, nullptr, file_ns::node_shader_exec_sephsv); | ||||
| node_type_gpu(&ntype, gpu_shader_normal); | node_type_gpu(&ntype, file_ns::gpu_shader_sephsv); | ||||
| nodeRegisterType(&ntype); | nodeRegisterType(&ntype); | ||||
| } | } | ||||