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 typedef uint64_t SocketModifiedFlags;
32 
33 /* Socket Type */
34 
35 struct SocketType {
36   enum Type {
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_NORMAL = (1 << 5),
77     LINK_TEXTURE_UV = (1 << 6),
78     LINK_INCOMING = (1 << 7),
79     LINK_NORMAL = (1 << 8),
80     LINK_POSITION = (1 << 9),
81     LINK_TANGENT = (1 << 10),
82     DEFAULT_LINK_MASK = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10)
83   };
84 
85   ustring name;
86   Type type;
87   int struct_offset;
88   const void *default_value;
89   const NodeEnum *enum_values;
90   const NodeType **node_type;
91   int flags;
92   ustring ui_name;
93   SocketModifiedFlags modified_flag_bit;
94 
95   size_t size() const;
96   bool is_array() const;
97   static size_t size(Type type);
98   static size_t max_size();
99   static ustring type_name(Type type);
100   static void *zero_default_value();
101   static bool is_float3(Type type);
102 };
103 
104 /* Node Type */
105 
106 struct NodeType {
107   enum Type { NONE, SHADER };
108 
109   explicit NodeType(Type type = NONE, const NodeType *base = NULL);
110   ~NodeType();
111 
112   void register_input(ustring name,
113                       ustring ui_name,
114                       SocketType::Type type,
115                       int struct_offset,
116                       const void *default_value,
117                       const NodeEnum *enum_values = NULL,
118                       const NodeType **node_type = NULL,
119                       int flags = 0,
120                       int extra_flags = 0);
121   void register_output(ustring name, ustring ui_name, SocketType::Type type);
122 
123   const SocketType *find_input(ustring name) const;
124   const SocketType *find_output(ustring name) const;
125 
126   typedef Node *(*CreateFunc)(const NodeType *type);
127 
128   ustring name;
129   Type type;
130   const NodeType *base;
131   vector<SocketType, std::allocator<SocketType>> inputs;
132   vector<SocketType, std::allocator<SocketType>> outputs;
133   CreateFunc create;
134 
135   static NodeType *add(const char *name,
136                        CreateFunc create,
137                        Type type = NONE,
138                        const NodeType *base = NULL);
139   static const NodeType *find(ustring name);
140   static unordered_map<ustring, NodeType, ustringHash> &types();
141 };
142 
143 /* Node Definition Macros */
144 
145 #define NODE_DECLARE \
146   template<typename T> static const NodeType *register_type(); \
147   static Node *create(const NodeType *type); \
148   static const NodeType *node_type;
149 
150 #define NODE_DEFINE(structname) \
151   const NodeType *structname::node_type = structname::register_type<structname>(); \
152   Node *structname::create(const NodeType *) \
153   { \
154     return new structname(); \
155   } \
156   template<typename T> const NodeType *structname::register_type()
157 
158 #define NODE_ABSTRACT_DECLARE \
159   template<typename T> static const NodeType *register_base_type(); \
160   static const NodeType *node_base_type;
161 
162 #define NODE_ABSTRACT_DEFINE(structname) \
163   const NodeType *structname::node_base_type = structname::register_base_type<structname>(); \
164   template<typename T> const NodeType *structname::register_base_type()
165 
166 /* Sock Definition Macros */
167 
168 #define SOCKET_OFFSETOF(T, name) offsetof(T, name)
169 #define SOCKET_SIZEOF(T, name) (sizeof(T::name))
170 #define SOCKET_DEFINE(name, ui_name, default_value, datatype, TYPE, flags, ...) \
171   { \
172     static datatype defval = default_value; \
173     CHECK_TYPE(T::name, datatype); \
174     type->register_input(ustring(#name), \
175                          ustring(ui_name), \
176                          TYPE, \
177                          SOCKET_OFFSETOF(T, name), \
178                          &defval, \
179                          NULL, \
180                          NULL, \
181                          flags, \
182                          ##__VA_ARGS__); \
183   }
184 
185 #define SOCKET_BOOLEAN(name, ui_name, default_value, ...) \
186   SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, 0, ##__VA_ARGS__)
187 #define SOCKET_INT(name, ui_name, default_value, ...) \
188   SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, 0, ##__VA_ARGS__)
189 #define SOCKET_UINT(name, ui_name, default_value, ...) \
190   SOCKET_DEFINE(name, ui_name, default_value, uint, SocketType::UINT, 0, ##__VA_ARGS__)
191 #define SOCKET_FLOAT(name, ui_name, default_value, ...) \
192   SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, 0, ##__VA_ARGS__)
193 #define SOCKET_COLOR(name, ui_name, default_value, ...) \
194   SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, 0, ##__VA_ARGS__)
195 #define SOCKET_VECTOR(name, ui_name, default_value, ...) \
196   SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, 0, ##__VA_ARGS__)
197 #define SOCKET_POINT(name, ui_name, default_value, ...) \
198   SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, 0, ##__VA_ARGS__)
199 #define SOCKET_NORMAL(name, ui_name, default_value, ...) \
200   SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, 0, ##__VA_ARGS__)
201 #define SOCKET_POINT2(name, ui_name, default_value, ...) \
202   SOCKET_DEFINE(name, ui_name, default_value, float2, SocketType::POINT2, 0, ##__VA_ARGS__)
203 #define SOCKET_STRING(name, ui_name, default_value, ...) \
204   SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, 0, ##__VA_ARGS__)
205 #define SOCKET_TRANSFORM(name, ui_name, default_value, ...) \
206   SOCKET_DEFINE(name, ui_name, default_value, Transform, SocketType::TRANSFORM, 0, ##__VA_ARGS__)
207 #define SOCKET_ENUM(name, ui_name, values, default_value, ...) \
208   { \
209     static int defval = default_value; \
210     assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
211     type->register_input(ustring(#name), \
212                          ustring(ui_name), \
213                          SocketType::ENUM, \
214                          SOCKET_OFFSETOF(T, name), \
215                          &defval, \
216                          &values, \
217                          NULL, \
218                          ##__VA_ARGS__); \
219   }
220 #define SOCKET_NODE(name, ui_name, node_type, ...) \
221   { \
222     static Node *defval = NULL; \
223     assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \
224     type->register_input(ustring(#name), \
225                          ustring(ui_name), \
226                          SocketType::NODE, \
227                          SOCKET_OFFSETOF(T, name), \
228                          &defval, \
229                          NULL, \
230                          node_type, \
231                          ##__VA_ARGS__); \
232   }
233 
234 #define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
235   SOCKET_DEFINE( \
236       name, ui_name, default_value, array<bool>, SocketType::BOOLEAN_ARRAY, 0, ##__VA_ARGS__)
237 #define SOCKET_INT_ARRAY(name, ui_name, default_value, ...) \
238   SOCKET_DEFINE(name, ui_name, default_value, array<int>, SocketType::INT_ARRAY, 0, ##__VA_ARGS__)
239 #define SOCKET_FLOAT_ARRAY(name, ui_name, default_value, ...) \
240   SOCKET_DEFINE( \
241       name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
242 #define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
243   SOCKET_DEFINE( \
244       name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
245 #define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
246   SOCKET_DEFINE( \
247       name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
248 #define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
249   SOCKET_DEFINE( \
250       name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
251 #define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
252   SOCKET_DEFINE( \
253       name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
254 #define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
255   SOCKET_DEFINE( \
256       name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
257 #define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
258   SOCKET_DEFINE( \
259       name, ui_name, default_value, array<ustring>, SocketType::STRING_ARRAY, 0, ##__VA_ARGS__)
260 #define SOCKET_TRANSFORM_ARRAY(name, ui_name, default_value, ...) \
261   SOCKET_DEFINE(name, \
262                 ui_name, \
263                 default_value, \
264                 array<Transform>, \
265                 SocketType::TRANSFORM_ARRAY, \
266                 0, \
267                 ##__VA_ARGS__)
268 #define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
269   { \
270     static array<Node *> defval = {}; \
271     assert(SOCKET_SIZEOF(T, name) == sizeof(array<Node *>)); \
272     type->register_input(ustring(#name), \
273                          ustring(ui_name), \
274                          SocketType::NODE_ARRAY, \
275                          SOCKET_OFFSETOF(T, name), \
276                          &defval, \
277                          NULL, \
278                          node_type, \
279                          ##__VA_ARGS__); \
280   }
281 
282 #define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
283   SOCKET_DEFINE(name, \
284                 ui_name, \
285                 default_value, \
286                 bool, \
287                 SocketType::BOOLEAN, \
288                 SocketType::LINKABLE, \
289                 ##__VA_ARGS__)
290 #define SOCKET_IN_INT(name, ui_name, default_value, ...) \
291   SOCKET_DEFINE( \
292       name, ui_name, default_value, int, SocketType::INT, SocketType::LINKABLE, ##__VA_ARGS__)
293 #define SOCKET_IN_FLOAT(name, ui_name, default_value, ...) \
294   SOCKET_DEFINE(name, \
295                 ui_name, \
296                 default_value, \
297                 float, \
298                 SocketType::FLOAT, \
299                 SocketType::LINKABLE, \
300                 ##__VA_ARGS__)
301 #define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
302   SOCKET_DEFINE(name, \
303                 ui_name, \
304                 default_value, \
305                 float3, \
306                 SocketType::COLOR, \
307                 SocketType::LINKABLE, \
308                 ##__VA_ARGS__)
309 #define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
310   SOCKET_DEFINE(name, \
311                 ui_name, \
312                 default_value, \
313                 float3, \
314                 SocketType::VECTOR, \
315                 SocketType::LINKABLE, \
316                 ##__VA_ARGS__)
317 #define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
318   SOCKET_DEFINE(name, \
319                 ui_name, \
320                 default_value, \
321                 float3, \
322                 SocketType::POINT, \
323                 SocketType::LINKABLE, \
324                 ##__VA_ARGS__)
325 #define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
326   SOCKET_DEFINE(name, \
327                 ui_name, \
328                 default_value, \
329                 float3, \
330                 SocketType::NORMAL, \
331                 SocketType::LINKABLE, \
332                 ##__VA_ARGS__)
333 #define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
334   SOCKET_DEFINE(name, \
335                 ui_name, \
336                 default_value, \
337                 ustring, \
338                 SocketType::STRING, \
339                 SocketType::LINKABLE, \
340                 ##__VA_ARGS__)
341 #define SOCKET_IN_CLOSURE(name, ui_name, ...) \
342   type->register_input(ustring(#name), \
343                        ustring(ui_name), \
344                        SocketType::CLOSURE, \
345                        0, \
346                        NULL, \
347                        NULL, \
348                        NULL, \
349                        SocketType::LINKABLE, \
350                        ##__VA_ARGS__)
351 
352 #define SOCKET_OUT_BOOLEAN(name, ui_name) \
353   { \
354     type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); \
355   }
356 #define SOCKET_OUT_INT(name, ui_name) \
357   { \
358     type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); \
359   }
360 #define SOCKET_OUT_FLOAT(name, ui_name) \
361   { \
362     type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); \
363   }
364 #define SOCKET_OUT_COLOR(name, ui_name) \
365   { \
366     type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); \
367   }
368 #define SOCKET_OUT_VECTOR(name, ui_name) \
369   { \
370     type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); \
371   }
372 #define SOCKET_OUT_POINT(name, ui_name) \
373   { \
374     type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); \
375   }
376 #define SOCKET_OUT_NORMAL(name, ui_name) \
377   { \
378     type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); \
379   }
380 #define SOCKET_OUT_CLOSURE(name, ui_name) \
381   { \
382     type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); \
383   }
384 #define SOCKET_OUT_STRING(name, ui_name) \
385   { \
386     type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); \
387   }
388 #define SOCKET_OUT_ENUM(name, ui_name) \
389   { \
390     type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); \
391   }
392 
393 CCL_NAMESPACE_END
394