ClangFormat: apply to source, most of intern
[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 "graph/node_enum.h"
20 #include "util/util_array.h"
21 #include "util/util_map.h"
22 #include "util/util_param.h"
23 #include "util/util_string.h"
24 #include "util/util_vector.h"
25
26 CCL_NAMESPACE_BEGIN
27
28 struct Node;
29 struct NodeType;
30
31 /* Socket Type */
32
33 struct SocketType {
34   enum Type {
35     UNDEFINED,
36
37     BOOLEAN,
38     FLOAT,
39     INT,
40     UINT,
41     COLOR,
42     VECTOR,
43     POINT,
44     NORMAL,
45     POINT2,
46     CLOSURE,
47     STRING,
48     ENUM,
49     TRANSFORM,
50     NODE,
51
52     BOOLEAN_ARRAY,
53     FLOAT_ARRAY,
54     INT_ARRAY,
55     COLOR_ARRAY,
56     VECTOR_ARRAY,
57     POINT_ARRAY,
58     NORMAL_ARRAY,
59     POINT2_ARRAY,
60     STRING_ARRAY,
61     TRANSFORM_ARRAY,
62     NODE_ARRAY,
63   };
64
65   enum Flags {
66     LINKABLE = (1 << 0),
67     ANIMATABLE = (1 << 1),
68
69     SVM_INTERNAL = (1 << 2),
70     OSL_INTERNAL = (1 << 3),
71     INTERNAL = (1 << 2) | (1 << 3),
72
73     LINK_TEXTURE_GENERATED = (1 << 4),
74     LINK_TEXTURE_NORMAL = (1 << 5),
75     LINK_TEXTURE_UV = (1 << 6),
76     LINK_INCOMING = (1 << 7),
77     LINK_NORMAL = (1 << 8),
78     LINK_POSITION = (1 << 9),
79     LINK_TANGENT = (1 << 10),
80     DEFAULT_LINK_MASK = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10)
81   };
82
83   ustring name;
84   Type type;
85   int struct_offset;
86   const void *default_value;
87   const NodeEnum *enum_values;
88   const NodeType **node_type;
89   int flags;
90   ustring ui_name;
91
92   size_t size() const;
93   bool is_array() const;
94   static size_t size(Type type);
95   static size_t max_size();
96   static ustring type_name(Type type);
97   static void *zero_default_value();
98   static bool is_float3(Type type);
99 };
100
101 /* Node Type */
102
103 struct NodeType {
104   enum Type { NONE, SHADER };
105
106   explicit NodeType(Type type = NONE);
107   ~NodeType();
108
109   void register_input(ustring name,
110                       ustring ui_name,
111                       SocketType::Type type,
112                       int struct_offset,
113                       const void *default_value,
114                       const NodeEnum *enum_values = NULL,
115                       const NodeType **node_type = NULL,
116                       int flags = 0,
117                       int extra_flags = 0);
118   void register_output(ustring name, ustring ui_name, SocketType::Type type);
119
120   const SocketType *find_input(ustring name) const;
121   const SocketType *find_output(ustring name) const;
122
123   typedef Node *(*CreateFunc)(const NodeType *type);
124
125   ustring name;
126   Type type;
127   vector<SocketType, std::allocator<SocketType>> inputs;
128   vector<SocketType, std::allocator<SocketType>> outputs;
129   CreateFunc create;
130
131   static NodeType *add(const char *name, CreateFunc create, Type type = NONE);
132   static const NodeType *find(ustring name);
133   static unordered_map<ustring, NodeType, ustringHash> &types();
134 };
135
136 /* Node Definition Macros */
137
138 #define NODE_DECLARE \
139   template<typename T> static const NodeType *register_type(); \
140   static Node *create(const NodeType *type); \
141   static const NodeType *node_type;
142
143 #define NODE_DEFINE(structname) \
144   const NodeType *structname::node_type = structname::register_type<structname>(); \
145   Node *structname::create(const NodeType *) \
146   { \
147     return new structname(); \
148   } \
149   template<typename T> 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), \
160                          ustring(ui_name), \
161                          TYPE, \
162                          SOCKET_OFFSETOF(T, name), \
163                          &defval, \
164                          NULL, \
165                          NULL, \
166                          flags, \
167                          ##__VA_ARGS__); \
168   }
169
170 #define SOCKET_BOOLEAN(name, ui_name, default_value, ...) \
171   SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, 0, ##__VA_ARGS__)
172 #define SOCKET_INT(name, ui_name, default_value, ...) \
173   SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, 0, ##__VA_ARGS__)
174 #define SOCKET_UINT(name, ui_name, default_value, ...) \
175   SOCKET_DEFINE(name, ui_name, default_value, uint, SocketType::UINT, 0, ##__VA_ARGS__)
176 #define SOCKET_FLOAT(name, ui_name, default_value, ...) \
177   SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, 0, ##__VA_ARGS__)
178 #define SOCKET_COLOR(name, ui_name, default_value, ...) \
179   SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, 0, ##__VA_ARGS__)
180 #define SOCKET_VECTOR(name, ui_name, default_value, ...) \
181   SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, 0, ##__VA_ARGS__)
182 #define SOCKET_POINT(name, ui_name, default_value, ...) \
183   SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, 0, ##__VA_ARGS__)
184 #define SOCKET_NORMAL(name, ui_name, default_value, ...) \
185   SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, 0, ##__VA_ARGS__)
186 #define SOCKET_POINT2(name, ui_name, default_value, ...) \
187   SOCKET_DEFINE(name, ui_name, default_value, float2, SocketType::POINT2, 0, ##__VA_ARGS__)
188 #define SOCKET_STRING(name, ui_name, default_value, ...) \
189   SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, 0, ##__VA_ARGS__)
190 #define SOCKET_TRANSFORM(name, ui_name, default_value, ...) \
191   SOCKET_DEFINE(name, ui_name, default_value, Transform, SocketType::TRANSFORM, 0, ##__VA_ARGS__)
192 #define SOCKET_ENUM(name, ui_name, values, default_value, ...) \
193   { \
194     static int defval = default_value; \
195     assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
196     type->register_input(ustring(#name), \
197                          ustring(ui_name), \
198                          SocketType::ENUM, \
199                          SOCKET_OFFSETOF(T, name), \
200                          &defval, \
201                          &values, \
202                          NULL, \
203                          ##__VA_ARGS__); \
204   }
205 #define SOCKET_NODE(name, ui_name, node_type, ...) \
206   { \
207     static Node *defval = NULL; \
208     assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \
209     type->register_input(ustring(#name), \
210                          ustring(ui_name), \
211                          SocketType::NODE, \
212                          SOCKET_OFFSETOF(T, name), \
213                          &defval, \
214                          NULL, \
215                          node_type, \
216                          ##__VA_ARGS__); \
217   }
218
219 #define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
220   SOCKET_DEFINE( \
221       name, ui_name, default_value, array<bool>, SocketType::BOOLEAN_ARRAY, 0, ##__VA_ARGS__)
222 #define SOCKET_INT_ARRAY(name, ui_name, default_value, ...) \
223   SOCKET_DEFINE(name, ui_name, default_value, array<int>, SocketType::INT_ARRAY, 0, ##__VA_ARGS__)
224 #define SOCKET_FLOAT_ARRAY(name, ui_name, default_value, ...) \
225   SOCKET_DEFINE( \
226       name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
227 #define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
228   SOCKET_DEFINE( \
229       name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
230 #define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
231   SOCKET_DEFINE( \
232       name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
233 #define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
234   SOCKET_DEFINE( \
235       name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
236 #define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
237   SOCKET_DEFINE( \
238       name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
239 #define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
240   SOCKET_DEFINE( \
241       name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
242 #define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
243   SOCKET_DEFINE( \
244       name, ui_name, default_value, array<ustring>, SocketType::STRING_ARRAY, 0, ##__VA_ARGS__)
245 #define SOCKET_TRANSFORM_ARRAY(name, ui_name, default_value, ...) \
246   SOCKET_DEFINE(name, \
247                 ui_name, \
248                 default_value, \
249                 array<Transform>, \
250                 SocketType::TRANSFORM_ARRAY, \
251                 0, \
252                 ##__VA_ARGS__)
253 #define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
254   { \
255     static Node *defval = NULL; \
256     assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \
257     type->register_input(ustring(#name), \
258                          ustring(ui_name), \
259                          SocketType::NODE_ARRAY, \
260                          SOCKET_OFFSETOF(T, name), \
261                          &defval, \
262                          NULL, \
263                          node_type, \
264                          ##__VA_ARGS__); \
265   }
266
267 #define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
268   SOCKET_DEFINE(name, \
269                 ui_name, \
270                 default_value, \
271                 bool, \
272                 SocketType::BOOLEAN, \
273                 SocketType::LINKABLE, \
274                 ##__VA_ARGS__)
275 #define SOCKET_IN_INT(name, ui_name, default_value, ...) \
276   SOCKET_DEFINE( \
277       name, ui_name, default_value, int, SocketType::INT, SocketType::LINKABLE, ##__VA_ARGS__)
278 #define SOCKET_IN_FLOAT(name, ui_name, default_value, ...) \
279   SOCKET_DEFINE(name, \
280                 ui_name, \
281                 default_value, \
282                 float, \
283                 SocketType::FLOAT, \
284                 SocketType::LINKABLE, \
285                 ##__VA_ARGS__)
286 #define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
287   SOCKET_DEFINE(name, \
288                 ui_name, \
289                 default_value, \
290                 float3, \
291                 SocketType::COLOR, \
292                 SocketType::LINKABLE, \
293                 ##__VA_ARGS__)
294 #define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
295   SOCKET_DEFINE(name, \
296                 ui_name, \
297                 default_value, \
298                 float3, \
299                 SocketType::VECTOR, \
300                 SocketType::LINKABLE, \
301                 ##__VA_ARGS__)
302 #define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
303   SOCKET_DEFINE(name, \
304                 ui_name, \
305                 default_value, \
306                 float3, \
307                 SocketType::POINT, \
308                 SocketType::LINKABLE, \
309                 ##__VA_ARGS__)
310 #define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
311   SOCKET_DEFINE(name, \
312                 ui_name, \
313                 default_value, \
314                 float3, \
315                 SocketType::NORMAL, \
316                 SocketType::LINKABLE, \
317                 ##__VA_ARGS__)
318 #define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
319   SOCKET_DEFINE(name, \
320                 ui_name, \
321                 default_value, \
322                 ustring, \
323                 SocketType::STRING, \
324                 SocketType::LINKABLE, \
325                 ##__VA_ARGS__)
326 #define SOCKET_IN_CLOSURE(name, ui_name, ...) \
327   type->register_input(ustring(#name), \
328                        ustring(ui_name), \
329                        SocketType::CLOSURE, \
330                        0, \
331                        NULL, \
332                        NULL, \
333                        NULL, \
334                        SocketType::LINKABLE, \
335                        ##__VA_ARGS__)
336
337 #define SOCKET_OUT_BOOLEAN(name, ui_name) \
338   { \
339     type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); \
340   }
341 #define SOCKET_OUT_INT(name, ui_name) \
342   { \
343     type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); \
344   }
345 #define SOCKET_OUT_FLOAT(name, ui_name) \
346   { \
347     type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); \
348   }
349 #define SOCKET_OUT_COLOR(name, ui_name) \
350   { \
351     type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); \
352   }
353 #define SOCKET_OUT_VECTOR(name, ui_name) \
354   { \
355     type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); \
356   }
357 #define SOCKET_OUT_POINT(name, ui_name) \
358   { \
359     type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); \
360   }
361 #define SOCKET_OUT_NORMAL(name, ui_name) \
362   { \
363     type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); \
364   }
365 #define SOCKET_OUT_CLOSURE(name, ui_name) \
366   { \
367     type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); \
368   }
369 #define SOCKET_OUT_STRING(name, ui_name) \
370   { \
371     type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); \
372   }
373 #define SOCKET_OUT_ENUM(name, ui_name) \
374   { \
375     type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); \
376   }
377
378 CCL_NAMESPACE_END