Merge remote-tracking branch 'origin/master' into blender2.8
[blender.git] / intern / cycles / graph / node_type.h
1 /*
2  * Copyright 2011-2016 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #pragma once
18
19 #include "node_enum.h"
20
21 #include "util_map.h"
22 #include "util_param.h"
23 #include "util_string.h"
24 #include "util_vector.h"
25
26 CCL_NAMESPACE_BEGIN
27
28 struct Node;
29 struct NodeType;
30
31 /* Socket Type */
32
33 struct SocketType
34 {
35         enum Type
36         {
37                 UNDEFINED,
38
39                 BOOLEAN,
40                 FLOAT,
41                 INT,
42                 UINT,
43                 COLOR,
44                 VECTOR,
45                 POINT,
46                 NORMAL,
47                 POINT2,
48                 CLOSURE,
49                 STRING,
50                 ENUM,
51                 TRANSFORM,
52                 NODE,
53
54                 BOOLEAN_ARRAY,
55                 FLOAT_ARRAY,
56                 INT_ARRAY,
57                 COLOR_ARRAY,
58                 VECTOR_ARRAY,
59                 POINT_ARRAY,
60                 NORMAL_ARRAY,
61                 POINT2_ARRAY,
62                 STRING_ARRAY,
63                 TRANSFORM_ARRAY,
64                 NODE_ARRAY,
65         };
66
67         enum Flags {
68                 LINKABLE               = (1 << 0),
69                 ANIMATABLE             = (1 << 1),
70
71                 SVM_INTERNAL           = (1 << 2),
72                 OSL_INTERNAL           = (1 << 3),
73                 INTERNAL               = (1 << 2) | (1 << 3),
74
75                 LINK_TEXTURE_GENERATED = (1 << 4),
76                 LINK_TEXTURE_UV        = (1 << 5),
77                 LINK_INCOMING          = (1 << 6),
78                 LINK_NORMAL            = (1 << 7),
79                 LINK_POSITION          = (1 << 8),
80                 LINK_TANGENT           = (1 << 9),
81                 DEFAULT_LINK_MASK      = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9)
82         };
83
84         ustring name;
85         Type type;
86         int struct_offset;
87         const void *default_value;
88         const NodeEnum *enum_values;
89         const NodeType **node_type;
90         int flags;
91         ustring ui_name;
92
93         size_t size() const;
94         bool is_array() const;
95         static size_t size(Type type);
96         static size_t max_size();
97         static ustring type_name(Type type);
98         static void *zero_default_value();
99         static bool is_float3(Type type);
100 };
101
102 /* Node Type */
103
104 struct NodeType
105 {
106         enum Type {
107                 NONE,
108                 SHADER
109         };
110
111         explicit NodeType(Type type = NONE);
112         ~NodeType();
113
114         void register_input(ustring name, ustring ui_name, SocketType::Type type,
115                             int struct_offset, const void *default_value,
116                                                 const NodeEnum *enum_values = NULL,
117                                                 const NodeType **node_type = NULL,
118                                                 int flags = 0, int extra_flags = 0);
119         void register_output(ustring name, ustring ui_name, SocketType::Type type);
120
121         const SocketType *find_input(ustring name) const;
122         const SocketType *find_output(ustring name) const;
123
124         typedef Node *(*CreateFunc)(const NodeType *type);
125
126         ustring name;
127         Type type;
128         vector<SocketType, std::allocator<SocketType> > inputs;
129         vector<SocketType, std::allocator<SocketType> > outputs;
130         CreateFunc create;
131
132         static NodeType *add(const char *name, CreateFunc create, Type type = NONE);
133         static const NodeType *find(ustring name);
134         static unordered_map<ustring, NodeType, ustringHash>& types();
135 };
136
137 /* Node Definition Macros */
138
139 #define NODE_DECLARE                       \
140 template<typename T>                       \
141 static const NodeType *register_type();    \
142 static Node *create(const NodeType *type); \
143 static const NodeType *node_type;
144
145 #define NODE_DEFINE(structname)                                                  \
146 const NodeType *structname::node_type = structname::register_type<structname>(); \
147 Node *structname::create(const NodeType*) { return new structname(); }           \
148 template<typename T>                                                             \
149 const NodeType *structname::register_type()
150
151 /* Sock Definition Macros */
152
153 #define SOCKET_OFFSETOF(T, name) (((char *)&(((T *)1)->name)) - (char *)1)
154 #define SOCKET_SIZEOF(T, name) (sizeof(((T *)1)->name))
155 #define SOCKET_DEFINE(name, ui_name, default_value, datatype, TYPE, flags, ...) \
156         { \
157                 static datatype defval = default_value; \
158                 CHECK_TYPE(((T *)1)->name, datatype); \
159                 type->register_input(ustring(#name), ustring(ui_name), TYPE, SOCKET_OFFSETOF(T, name), &defval, NULL, NULL, flags, ##__VA_ARGS__); \
160         }
161
162 #define SOCKET_BOOLEAN(name, ui_name, default_value, ...) \
163         SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, 0, ##__VA_ARGS__)
164 #define SOCKET_INT(name, ui_name, default_value, ...) \
165         SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, 0, ##__VA_ARGS__)
166 #define SOCKET_UINT(name, ui_name, default_value, ...) \
167         SOCKET_DEFINE(name, ui_name, default_value, uint, SocketType::UINT, 0, ##__VA_ARGS__)
168 #define SOCKET_FLOAT(name, ui_name, default_value, ...) \
169         SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, 0, ##__VA_ARGS__)
170 #define SOCKET_COLOR(name, ui_name, default_value, ...) \
171         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, 0, ##__VA_ARGS__)
172 #define SOCKET_VECTOR(name, ui_name, default_value, ...) \
173         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, 0, ##__VA_ARGS__)
174 #define SOCKET_POINT(name, ui_name, default_value, ...) \
175         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, 0, ##__VA_ARGS__)
176 #define SOCKET_NORMAL(name, ui_name, default_value, ...) \
177         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, 0, ##__VA_ARGS__)
178 #define SOCKET_POINT2(name, ui_name, default_value, ...) \
179         SOCKET_DEFINE(name, ui_name, default_value, float2, SocketType::POINT2, 0, ##__VA_ARGS__)
180 #define SOCKET_STRING(name, ui_name, default_value, ...) \
181         SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, 0, ##__VA_ARGS__)
182 #define SOCKET_TRANSFORM(name, ui_name, default_value, ...) \
183         SOCKET_DEFINE(name, ui_name, default_value, Transform, SocketType::TRANSFORM, 0, ##__VA_ARGS__)
184 #define SOCKET_ENUM(name, ui_name, values, default_value, ...) \
185         { \
186                 static int defval = default_value; \
187                 assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
188                 type->register_input(ustring(#name), ustring(ui_name), SocketType::ENUM, SOCKET_OFFSETOF(T, name), &defval, &values, NULL, ##__VA_ARGS__); \
189         }
190 #define SOCKET_NODE(name, ui_name, node_type, ...) \
191         { \
192             static Node *defval = NULL; \
193                 assert(SOCKET_SIZEOF(T, name) == sizeof(Node*)); \
194                 type->register_input(ustring(#name), ustring(ui_name), SocketType::NODE, SOCKET_OFFSETOF(T, name), &defval, NULL, node_type, ##__VA_ARGS__); \
195         }
196
197 #define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
198         SOCKET_DEFINE(name, ui_name, default_value, array<bool>, SocketType::BOOLEAN_ARRAY, 0, ##__VA_ARGS__)
199 #define SOCKET_INT_ARRAY(name, ui_name, default_value, ...) \
200         SOCKET_DEFINE(name, ui_name, default_value, array<int>, SocketType::INT_ARRAY, 0, ##__VA_ARGS__)
201 #define SOCKET_FLOAT_ARRAY(name, ui_name, default_value, ...) \
202         SOCKET_DEFINE(name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
203 #define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
204         SOCKET_DEFINE(name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
205 #define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
206         SOCKET_DEFINE(name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
207 #define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
208         SOCKET_DEFINE(name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
209 #define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
210         SOCKET_DEFINE(name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
211 #define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
212         SOCKET_DEFINE(name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
213 #define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
214         SOCKET_DEFINE(name, ui_name, default_value, array<ustring>, SocketType::STRING_ARRAY, 0, ##__VA_ARGS__)
215 #define SOCKET_TRANSFORM_ARRAY(name, ui_name, default_value, ...) \
216         SOCKET_DEFINE(name, ui_name, default_value, array<Transform>, SocketType::TRANSFORM_ARRAY, 0, ##__VA_ARGS__)
217 #define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
218         { \
219             static Node *defval = NULL; \
220                 assert(SOCKET_SIZEOF(T, name) == sizeof(Node*)); \
221                 type->register_input(ustring(#name), ustring(ui_name), SocketType::NODE_ARRAY, SOCKET_OFFSETOF(T, name), &defval, NULL, node_type, ##__VA_ARGS__); \
222         }
223
224 #define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
225         SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, SocketType::LINKABLE, ##__VA_ARGS__)
226 #define SOCKET_IN_INT(name, ui_name, default_value, ...) \
227         SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, SocketType::LINKABLE, ##__VA_ARGS__)
228 #define SOCKET_IN_FLOAT(name, ui_name, default_value, ...) \
229         SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, SocketType::LINKABLE, ##__VA_ARGS__)
230 #define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
231         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, SocketType::LINKABLE, ##__VA_ARGS__)
232 #define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
233         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, SocketType::LINKABLE, ##__VA_ARGS__)
234 #define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
235         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, SocketType::LINKABLE, ##__VA_ARGS__)
236 #define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
237         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, SocketType::LINKABLE, ##__VA_ARGS__)
238 #define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
239         SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, SocketType::LINKABLE, ##__VA_ARGS__)
240 #define SOCKET_IN_CLOSURE(name, ui_name, ...) \
241         type->register_input(ustring(#name), ustring(ui_name), SocketType::CLOSURE, 0, NULL, NULL, NULL, SocketType::LINKABLE, ##__VA_ARGS__)
242
243 #define SOCKET_OUT_BOOLEAN(name, ui_name) \
244         { type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); }
245 #define SOCKET_OUT_INT(name, ui_name) \
246         { type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); }
247 #define SOCKET_OUT_FLOAT(name, ui_name) \
248         { type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); }
249 #define SOCKET_OUT_COLOR(name, ui_name) \
250         { type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); }
251 #define SOCKET_OUT_VECTOR(name, ui_name) \
252         { type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); }
253 #define SOCKET_OUT_POINT(name, ui_name) \
254         { type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); }
255 #define SOCKET_OUT_NORMAL(name, ui_name) \
256         { type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); }
257 #define SOCKET_OUT_CLOSURE(name, ui_name) \
258         { type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); }
259 #define SOCKET_OUT_STRING(name, ui_name) \
260         { type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); }
261 #define SOCKET_OUT_ENUM(name, ui_name) \
262         { type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); }
263
264 CCL_NAMESPACE_END
265