ec1bb988c1c2c2e54fe26845f36ada78c5a538c0
[blender.git] / source / blender / nodes / shader / nodes / node_shader_attribute.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2005 Blender Foundation.
17  * All rights reserved.
18  */
19
20 #include "../node_shader_util.h"
21
22 /* **************** OUTPUT ******************** */
23
24 static bNodeSocketTemplate sh_node_attribute_out[] = {
25     {SOCK_RGBA, 0, N_("Color")},
26     {SOCK_VECTOR, 0, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
27     {SOCK_FLOAT, 0, N_("Fac"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX, PROP_FACTOR},
28     {-1, 0, ""},
29 };
30
31 static void node_shader_init_attribute(bNodeTree *UNUSED(ntree), bNode *node)
32 {
33   NodeShaderAttribute *attr = MEM_callocN(sizeof(NodeShaderAttribute), "NodeShaderAttribute");
34   node->storage = attr;
35 }
36
37 static int node_shader_gpu_attribute(GPUMaterial *mat,
38                                      bNode *node,
39                                      bNodeExecData *UNUSED(execdata),
40                                      GPUNodeStack *in,
41                                      GPUNodeStack *out)
42 {
43   NodeShaderAttribute *attr = node->storage;
44
45   /* FIXME : if an attribute layer (like vertex color) has one of theses name,
46    * it will not work as expected. */
47   if (strcmp(attr->name, "density") == 0) {
48     return GPU_stack_link(
49         mat, node, "node_attribute_volume_density", in, out, GPU_builtin(GPU_VOLUME_DENSITY));
50   }
51   else if (strcmp(attr->name, "color") == 0) {
52     return GPU_stack_link(
53         mat, node, "node_attribute_volume_color", in, out, GPU_builtin(GPU_VOLUME_DENSITY));
54   }
55   else if (strcmp(attr->name, "flame") == 0) {
56     return GPU_stack_link(
57         mat, node, "node_attribute_volume_flame", in, out, GPU_builtin(GPU_VOLUME_FLAME));
58   }
59   else if (strcmp(attr->name, "temperature") == 0) {
60     return GPU_stack_link(mat,
61                           node,
62                           "node_attribute_volume_temperature",
63                           in,
64                           out,
65                           GPU_builtin(GPU_VOLUME_FLAME),
66                           GPU_builtin(GPU_VOLUME_TEMPERATURE));
67   }
68   else {
69     GPUNodeLink *cd_attr = GPU_attribute(CD_AUTO_FROM_NAME, attr->name);
70     return GPU_stack_link(mat, node, "node_attribute", in, out, cd_attr);
71   }
72 }
73
74 /* node type definition */
75 void register_node_type_sh_attribute(void)
76 {
77   static bNodeType ntype;
78
79   sh_node_type_base(&ntype, SH_NODE_ATTRIBUTE, "Attribute", NODE_CLASS_INPUT, 0);
80   node_type_socket_templates(&ntype, NULL, sh_node_attribute_out);
81   node_type_init(&ntype, node_shader_init_attribute);
82   node_type_storage(
83       &ntype, "NodeShaderAttribute", node_free_standard_storage, node_copy_standard_storage);
84   node_type_gpu(&ntype, node_shader_gpu_attribute);
85
86   nodeRegisterType(&ntype);
87 }