diff options
Diffstat (limited to 'source/blender/nodes/shader')
4 files changed, 115 insertions, 157 deletions
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c index 4891fb323ad..60a6cc91630 100644 --- a/source/blender/nodes/shader/node_shader_tree.c +++ b/source/blender/nodes/shader/node_shader_tree.c @@ -799,7 +799,7 @@ static void ntree_shader_relink_displacement(bNodeTree *ntree, bNode *output_nod nodeRemLink(ntree, displacement_link); /* Convert displacement vector to bump height. */ - bNode *dot_node = nodeAddStaticNode(NULL, ntree, SH_NODE_VECT_MATH); + bNode *dot_node = nodeAddStaticNode(NULL, ntree, SH_NODE_VECTOR_MATH); bNode *geo_node = nodeAddStaticNode(NULL, ntree, SH_NODE_NEW_GEOMETRY); bNodeSocket *normal_socket = ntree_shader_node_find_output(geo_node, "Normal"); dot_node->custom1 = 3; /* dot product */ diff --git a/source/blender/nodes/shader/nodes/node_shader_normal_map.c b/source/blender/nodes/shader/nodes/node_shader_normal_map.c index 3d034372300..712c64084cc 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal_map.c +++ b/source/blender/nodes/shader/nodes/node_shader_normal_map.c @@ -114,7 +114,7 @@ static int gpu_shader_normal_map(GPUMaterial *mat, break; } - GPU_link(mat, "vec_math_mix", strength, realnorm, negnorm, &out[0].link); + GPU_link(mat, "vector_math_mix", strength, realnorm, negnorm, &out[0].link); GPU_link(mat, "vect_normalize", out[0].link, &out[0].link); return true; diff --git a/source/blender/nodes/shader/nodes/node_shader_vectMath.c b/source/blender/nodes/shader/nodes/node_shader_vectMath.c deleted file mode 100644 index 41273a6dc1d..00000000000 --- a/source/blender/nodes/shader/nodes/node_shader_vectMath.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2005 Blender Foundation. - * All rights reserved. - */ - -/** \file - * \ingroup shdnodes - */ - -#include "node_shader_util.h" - -/* **************** VECTOR MATH ******************** */ -static bNodeSocketTemplate sh_node_vect_math_in[] = { - {SOCK_VECTOR, 1, N_("Vector"), 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, - {SOCK_VECTOR, 1, N_("Vector"), 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, - {-1, 0, ""}}; - -static bNodeSocketTemplate sh_node_vect_math_out[] = { - {SOCK_VECTOR, 0, N_("Vector")}, {SOCK_FLOAT, 0, N_("Value")}, {-1, 0, ""}}; - -static void node_shader_exec_vect_math(void *UNUSED(data), - int UNUSED(thread), - bNode *node, - bNodeExecData *UNUSED(execdata), - bNodeStack **in, - bNodeStack **out) -{ - float vec1[3], vec2[3]; - - nodestack_get_vec(vec1, SOCK_VECTOR, in[0]); - nodestack_get_vec(vec2, SOCK_VECTOR, in[1]); - - if (node->custom1 == 0) { /* Add */ - out[0]->vec[0] = vec1[0] + vec2[0]; - out[0]->vec[1] = vec1[1] + vec2[1]; - out[0]->vec[2] = vec1[2] + vec2[2]; - - out[1]->vec[0] = (fabsf(out[0]->vec[0]) + fabsf(out[0]->vec[1]) + fabsf(out[0]->vec[2])) / - 3.0f; - } - else if (node->custom1 == 1) { /* Subtract */ - out[0]->vec[0] = vec1[0] - vec2[0]; - out[0]->vec[1] = vec1[1] - vec2[1]; - out[0]->vec[2] = vec1[2] - vec2[2]; - - out[1]->vec[0] = (fabsf(out[0]->vec[0]) + fabsf(out[0]->vec[1]) + fabsf(out[0]->vec[2])) / - 3.0f; - } - else if (node->custom1 == 2) { /* Average */ - out[0]->vec[0] = vec1[0] + vec2[0]; - out[0]->vec[1] = vec1[1] + vec2[1]; - out[0]->vec[2] = vec1[2] + vec2[2]; - - out[1]->vec[0] = normalize_v3(out[0]->vec); - } - else if (node->custom1 == 3) { /* Dot product */ - out[1]->vec[0] = (vec1[0] * vec2[0]) + (vec1[1] * vec2[1]) + (vec1[2] * vec2[2]); - } - else if (node->custom1 == 4) { /* Cross product */ - out[0]->vec[0] = (vec1[1] * vec2[2]) - (vec1[2] * vec2[1]); - out[0]->vec[1] = (vec1[2] * vec2[0]) - (vec1[0] * vec2[2]); - out[0]->vec[2] = (vec1[0] * vec2[1]) - (vec1[1] * vec2[0]); - - out[1]->vec[0] = normalize_v3(out[0]->vec); - } - else if (node->custom1 == 5) { /* Normalize */ - /* This one only takes one input, so we've got to choose. */ - if (in[0]->hasinput || !in[1]->hasinput) { - out[0]->vec[0] = vec1[0]; - out[0]->vec[1] = vec1[1]; - out[0]->vec[2] = vec1[2]; - } - else { - out[0]->vec[0] = vec2[0]; - out[0]->vec[1] = vec2[1]; - out[0]->vec[2] = vec2[2]; - } - - out[1]->vec[0] = normalize_v3(out[0]->vec); - } -} - -static int gpu_shader_vect_math(GPUMaterial *mat, - bNode *node, - bNodeExecData *UNUSED(execdata), - GPUNodeStack *in, - GPUNodeStack *out) -{ - static const char *names[] = { - "vec_math_add", - "vec_math_sub", - "vec_math_average", - "vec_math_dot", - "vec_math_cross", - "vec_math_normalize", - }; - - switch (node->custom1) { - case 0: - case 1: - case 2: - case 3: - case 4: - GPU_stack_link(mat, node, names[node->custom1], in, out); - break; - case 5: - if (in[0].hasinput || !in[1].hasinput) { - /* use only first item and terminator */ - GPUNodeStack tmp_in[2]; - memcpy(&tmp_in[0], &in[0], sizeof(GPUNodeStack)); - memcpy(&tmp_in[1], &in[2], sizeof(GPUNodeStack)); - GPU_stack_link(mat, node, names[node->custom1], tmp_in, out); - } - else { - /* use only second item and terminator */ - GPUNodeStack tmp_in[2]; - memcpy(&tmp_in[0], &in[1], sizeof(GPUNodeStack)); - memcpy(&tmp_in[1], &in[2], sizeof(GPUNodeStack)); - GPU_stack_link(mat, node, names[node->custom1], tmp_in, out); - } - break; - default: - return false; - } - - return true; -} - -void register_node_type_sh_vect_math(void) -{ - static bNodeType ntype; - - sh_node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, 0); - node_type_socket_templates(&ntype, sh_node_vect_math_in, sh_node_vect_math_out); - node_type_label(&ntype, node_vect_math_label); - node_type_storage(&ntype, "", NULL, NULL); - node_type_exec(&ntype, NULL, NULL, node_shader_exec_vect_math); - node_type_gpu(&ntype, gpu_shader_vect_math); - - nodeRegisterType(&ntype); -} diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_math.c b/source/blender/nodes/shader/nodes/node_shader_vector_math.c new file mode 100644 index 00000000000..03de83655b5 --- /dev/null +++ b/source/blender/nodes/shader/nodes/node_shader_vector_math.c @@ -0,0 +1,113 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup shdnodes + */ + +#include "node_shader_util.h" + +/* **************** VECTOR MATH ******************** */ +static bNodeSocketTemplate sh_node_vector_math_in[] = { + {SOCK_VECTOR, 1, N_("Vector"), 0.0f, 0.0f, 0.0f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, + {SOCK_VECTOR, 1, N_("Vector"), 0.0f, 0.0f, 0.0f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, + {SOCK_FLOAT, 1, N_("Scale"), 1.0f, 1.0f, 1.0f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, + {-1, 0, ""}}; + +static bNodeSocketTemplate sh_node_vector_math_out[] = { + {SOCK_VECTOR, 0, N_("Vector")}, {SOCK_FLOAT, 0, N_("Value")}, {-1, 0, ""}}; + +static int gpu_shader_vector_math(GPUMaterial *mat, + bNode *node, + bNodeExecData *UNUSED(execdata), + GPUNodeStack *in, + GPUNodeStack *out) +{ + static const char *names[] = { + [NODE_VECTOR_MATH_ADD] = "vector_math_add", + [NODE_VECTOR_MATH_SUBTRACT] = "vector_math_subtract", + [NODE_VECTOR_MATH_MULTIPLY] = "vector_math_multiply", + [NODE_VECTOR_MATH_DIVIDE] = "vector_math_divide", + + [NODE_VECTOR_MATH_CROSS_PRODUCT] = "vector_math_cross", + [NODE_VECTOR_MATH_PROJECT] = "vector_math_project", + [NODE_VECTOR_MATH_REFLECT] = "vector_math_reflect", + [NODE_VECTOR_MATH_DOT_PRODUCT] = "vector_math_dot", + + [NODE_VECTOR_MATH_DISTANCE] = "vector_math_distance", + [NODE_VECTOR_MATH_LENGTH] = "vector_math_length", + [NODE_VECTOR_MATH_SCALE] = "vector_math_scale", + [NODE_VECTOR_MATH_NORMALIZE] = "vector_math_normalize", + + [NODE_VECTOR_MATH_SNAP] = "vector_math_snap", + [NODE_VECTOR_MATH_FLOOR] = "vector_math_floor", + [NODE_VECTOR_MATH_CEIL] = "vector_math_ceil", + [NODE_VECTOR_MATH_MODULO] = "vector_math_modulo", + [NODE_VECTOR_MATH_FRACTION] = "vector_math_fraction", + [NODE_VECTOR_MATH_ABSOLUTE] = "vector_math_absolute", + [NODE_VECTOR_MATH_MINIMUM] = "vector_math_minimum", + [NODE_VECTOR_MATH_MAXIMUM] = "vector_math_maximum", + }; + + GPU_stack_link(mat, node, names[node->custom1], in, out); + return true; +} + +static void node_shader_update_vector_math(bNodeTree *UNUSED(ntree), bNode *node) +{ + bNodeSocket *sockB = BLI_findlink(&node->inputs, 1); + bNodeSocket *sockScale = nodeFindSocket(node, SOCK_IN, "Scale"); + + bNodeSocket *sockVector = nodeFindSocket(node, SOCK_OUT, "Vector"); + bNodeSocket *sockValue = nodeFindSocket(node, SOCK_OUT, "Value"); + + nodeSetSocketAvailability(sockB, + !ELEM(node->custom1, + NODE_VECTOR_MATH_CEIL, + NODE_VECTOR_MATH_SCALE, + NODE_VECTOR_MATH_FLOOR, + NODE_VECTOR_MATH_LENGTH, + NODE_VECTOR_MATH_ABSOLUTE, + NODE_VECTOR_MATH_FRACTION, + NODE_VECTOR_MATH_NORMALIZE)); + nodeSetSocketAvailability(sockScale, node->custom1 == NODE_VECTOR_MATH_SCALE); + nodeSetSocketAvailability(sockVector, + !ELEM(node->custom1, + NODE_VECTOR_MATH_LENGTH, + NODE_VECTOR_MATH_DISTANCE, + NODE_VECTOR_MATH_DOT_PRODUCT)); + nodeSetSocketAvailability(sockValue, + ELEM(node->custom1, + NODE_VECTOR_MATH_LENGTH, + NODE_VECTOR_MATH_DISTANCE, + NODE_VECTOR_MATH_DOT_PRODUCT)); +} + +void register_node_type_sh_vect_math(void) +{ + static bNodeType ntype; + + sh_node_type_base(&ntype, SH_NODE_VECTOR_MATH, "Vector Math", NODE_CLASS_CONVERTOR, 0); + node_type_socket_templates(&ntype, sh_node_vector_math_in, sh_node_vector_math_out); + node_type_label(&ntype, node_vector_math_label); + node_type_gpu(&ntype, gpu_shader_vector_math); + node_type_update(&ntype, node_shader_update_vector_math); + + nodeRegisterType(&ntype); +} |