Blender  V2.93
node_type.h
Go to the documentation of this file.
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 
27 
28 struct Node;
29 struct NodeType;
30 
32 
33 /* Socket Type */
34 
35 struct SocketType {
36  enum Type {
38 
41  INT,
53 
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 
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;
88  const void *default_value;
91  int flags;
92  ustring ui_name;
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);
111 
112  void register_input(ustring name,
113  ustring ui_name,
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;
130  const NodeType *base;
134 
135  static NodeType *add(const char *name,
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  * Node we use accessor to get node types to ensure correct static
146  * initialization order. */
147 
148 #define NODE_DECLARE \
149  static const NodeType *get_node_type(); \
150  template<typename T> static const NodeType *register_type(); \
151  static Node *create(const NodeType *type); \
152  static const NodeType *node_type;
153 
154 #define NODE_DEFINE(structname) \
155  const NodeType *structname::node_type = structname::register_type<structname>(); \
156  Node *structname::create(const NodeType *) \
157  { \
158  return new structname(); \
159  } \
160  const NodeType *structname::get_node_type() \
161  { \
162  return node_type; \
163  } \
164  template<typename T> const NodeType *structname::register_type()
165 
166 #define NODE_ABSTRACT_DECLARE \
167  template<typename T> static const NodeType *register_base_type(); \
168  static const NodeType *get_node_base_type();
169 
170 #define NODE_ABSTRACT_DEFINE(structname) \
171  const NodeType *structname::get_node_base_type() \
172  { \
173  /* Base types constructed in this getter to ensure correct initialization \
174  * order. Regular types are not so they are auto-registered for XML parsing. */ \
175  static const NodeType *node_base_type = register_base_type<structname>(); \
176  return node_base_type; \
177  } \
178  template<typename T> const NodeType *structname::register_base_type()
179 
180 /* Sock Definition Macros */
181 
182 #define SOCKET_OFFSETOF(T, name) offsetof(T, name)
183 #define SOCKET_SIZEOF(T, name) (sizeof(T::name))
184 #define SOCKET_DEFINE(name, ui_name, default_value, datatype, TYPE, flags, ...) \
185  { \
186  static datatype defval = default_value; \
187  CHECK_TYPE(T::name, datatype); \
188  type->register_input(ustring(#name), \
189  ustring(ui_name), \
190  TYPE, \
191  SOCKET_OFFSETOF(T, name), \
192  &defval, \
193  NULL, \
194  NULL, \
195  flags, \
196  ##__VA_ARGS__); \
197  }
198 
199 #define SOCKET_BOOLEAN(name, ui_name, default_value, ...) \
200  SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, 0, ##__VA_ARGS__)
201 #define SOCKET_INT(name, ui_name, default_value, ...) \
202  SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, 0, ##__VA_ARGS__)
203 #define SOCKET_UINT(name, ui_name, default_value, ...) \
204  SOCKET_DEFINE(name, ui_name, default_value, uint, SocketType::UINT, 0, ##__VA_ARGS__)
205 #define SOCKET_FLOAT(name, ui_name, default_value, ...) \
206  SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, 0, ##__VA_ARGS__)
207 #define SOCKET_COLOR(name, ui_name, default_value, ...) \
208  SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, 0, ##__VA_ARGS__)
209 #define SOCKET_VECTOR(name, ui_name, default_value, ...) \
210  SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, 0, ##__VA_ARGS__)
211 #define SOCKET_POINT(name, ui_name, default_value, ...) \
212  SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, 0, ##__VA_ARGS__)
213 #define SOCKET_NORMAL(name, ui_name, default_value, ...) \
214  SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, 0, ##__VA_ARGS__)
215 #define SOCKET_POINT2(name, ui_name, default_value, ...) \
216  SOCKET_DEFINE(name, ui_name, default_value, float2, SocketType::POINT2, 0, ##__VA_ARGS__)
217 #define SOCKET_STRING(name, ui_name, default_value, ...) \
218  SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, 0, ##__VA_ARGS__)
219 #define SOCKET_TRANSFORM(name, ui_name, default_value, ...) \
220  SOCKET_DEFINE(name, ui_name, default_value, Transform, SocketType::TRANSFORM, 0, ##__VA_ARGS__)
221 #define SOCKET_ENUM(name, ui_name, values, default_value, ...) \
222  { \
223  static int defval = default_value; \
224  assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
225  type->register_input(ustring(#name), \
226  ustring(ui_name), \
227  SocketType::ENUM, \
228  SOCKET_OFFSETOF(T, name), \
229  &defval, \
230  &values, \
231  NULL, \
232  ##__VA_ARGS__); \
233  }
234 #define SOCKET_NODE(name, ui_name, node_type, ...) \
235  { \
236  static Node *defval = NULL; \
237  assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \
238  type->register_input(ustring(#name), \
239  ustring(ui_name), \
240  SocketType::NODE, \
241  SOCKET_OFFSETOF(T, name), \
242  &defval, \
243  NULL, \
244  node_type, \
245  ##__VA_ARGS__); \
246  }
247 
248 #define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
249  SOCKET_DEFINE( \
250  name, ui_name, default_value, array<bool>, SocketType::BOOLEAN_ARRAY, 0, ##__VA_ARGS__)
251 #define SOCKET_INT_ARRAY(name, ui_name, default_value, ...) \
252  SOCKET_DEFINE(name, ui_name, default_value, array<int>, SocketType::INT_ARRAY, 0, ##__VA_ARGS__)
253 #define SOCKET_FLOAT_ARRAY(name, ui_name, default_value, ...) \
254  SOCKET_DEFINE( \
255  name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
256 #define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
257  SOCKET_DEFINE( \
258  name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
259 #define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
260  SOCKET_DEFINE( \
261  name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
262 #define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
263  SOCKET_DEFINE( \
264  name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
265 #define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
266  SOCKET_DEFINE( \
267  name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
268 #define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
269  SOCKET_DEFINE( \
270  name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
271 #define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
272  SOCKET_DEFINE( \
273  name, ui_name, default_value, array<ustring>, SocketType::STRING_ARRAY, 0, ##__VA_ARGS__)
274 #define SOCKET_TRANSFORM_ARRAY(name, ui_name, default_value, ...) \
275  SOCKET_DEFINE(name, \
276  ui_name, \
277  default_value, \
278  array<Transform>, \
279  SocketType::TRANSFORM_ARRAY, \
280  0, \
281  ##__VA_ARGS__)
282 #define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
283  { \
284  static array<Node *> defval = {}; \
285  assert(SOCKET_SIZEOF(T, name) == sizeof(array<Node *>)); \
286  type->register_input(ustring(#name), \
287  ustring(ui_name), \
288  SocketType::NODE_ARRAY, \
289  SOCKET_OFFSETOF(T, name), \
290  &defval, \
291  NULL, \
292  node_type, \
293  ##__VA_ARGS__); \
294  }
295 
296 #define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
297  SOCKET_DEFINE(name, \
298  ui_name, \
299  default_value, \
300  bool, \
301  SocketType::BOOLEAN, \
302  SocketType::LINKABLE, \
303  ##__VA_ARGS__)
304 #define SOCKET_IN_INT(name, ui_name, default_value, ...) \
305  SOCKET_DEFINE( \
306  name, ui_name, default_value, int, SocketType::INT, SocketType::LINKABLE, ##__VA_ARGS__)
307 #define SOCKET_IN_FLOAT(name, ui_name, default_value, ...) \
308  SOCKET_DEFINE(name, \
309  ui_name, \
310  default_value, \
311  float, \
312  SocketType::FLOAT, \
313  SocketType::LINKABLE, \
314  ##__VA_ARGS__)
315 #define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
316  SOCKET_DEFINE(name, \
317  ui_name, \
318  default_value, \
319  float3, \
320  SocketType::COLOR, \
321  SocketType::LINKABLE, \
322  ##__VA_ARGS__)
323 #define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
324  SOCKET_DEFINE(name, \
325  ui_name, \
326  default_value, \
327  float3, \
328  SocketType::VECTOR, \
329  SocketType::LINKABLE, \
330  ##__VA_ARGS__)
331 #define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
332  SOCKET_DEFINE(name, \
333  ui_name, \
334  default_value, \
335  float3, \
336  SocketType::POINT, \
337  SocketType::LINKABLE, \
338  ##__VA_ARGS__)
339 #define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
340  SOCKET_DEFINE(name, \
341  ui_name, \
342  default_value, \
343  float3, \
344  SocketType::NORMAL, \
345  SocketType::LINKABLE, \
346  ##__VA_ARGS__)
347 #define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
348  SOCKET_DEFINE(name, \
349  ui_name, \
350  default_value, \
351  ustring, \
352  SocketType::STRING, \
353  SocketType::LINKABLE, \
354  ##__VA_ARGS__)
355 #define SOCKET_IN_CLOSURE(name, ui_name, ...) \
356  type->register_input(ustring(#name), \
357  ustring(ui_name), \
358  SocketType::CLOSURE, \
359  0, \
360  NULL, \
361  NULL, \
362  NULL, \
363  SocketType::LINKABLE, \
364  ##__VA_ARGS__)
365 
366 #define SOCKET_OUT_BOOLEAN(name, ui_name) \
367  { \
368  type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); \
369  }
370 #define SOCKET_OUT_INT(name, ui_name) \
371  { \
372  type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); \
373  }
374 #define SOCKET_OUT_FLOAT(name, ui_name) \
375  { \
376  type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); \
377  }
378 #define SOCKET_OUT_COLOR(name, ui_name) \
379  { \
380  type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); \
381  }
382 #define SOCKET_OUT_VECTOR(name, ui_name) \
383  { \
384  type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); \
385  }
386 #define SOCKET_OUT_POINT(name, ui_name) \
387  { \
388  type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); \
389  }
390 #define SOCKET_OUT_NORMAL(name, ui_name) \
391  { \
392  type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); \
393  }
394 #define SOCKET_OUT_CLOSURE(name, ui_name) \
395  { \
396  type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); \
397  }
398 #define SOCKET_OUT_STRING(name, ui_name) \
399  { \
400  type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); \
401  }
402 #define SOCKET_OUT_ENUM(name, ui_name) \
403  { \
404  type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); \
405  }
406 
#define CCL_NAMESPACE_END
uint64_t SocketModifiedFlags
Definition: node_type.h:29
unsigned __int64 uint64_t
Definition: stdint.h:93
Type type
Definition: node_type.h:129
const SocketType * find_output(ustring name) const
vector< SocketType, std::allocator< SocketType > > inputs
Definition: node_type.h:131
CreateFunc create
Definition: node_type.h:133
const NodeType * base
Definition: node_type.h:130
ustring name
Definition: node_type.h:128
NodeType(Type type=NONE, const NodeType *base=NULL)
void register_output(ustring name, ustring ui_name, SocketType::Type type)
static const NodeType * find(ustring name)
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
const SocketType * find_input(ustring name) const
static unordered_map< ustring, NodeType, ustringHash > & types()
vector< SocketType, std::allocator< SocketType > > outputs
Definition: node_type.h:132
void register_input(ustring name, ustring ui_name, SocketType::Type type, int struct_offset, const void *default_value, const NodeEnum *enum_values=NULL, const NodeType *node_type=NULL, int flags=0, int extra_flags=0)
Definition: node.h:98
size_t size() const
Definition: node_type.cpp:25
const void * default_value
Definition: node_type.h:88
ustring name
Definition: node_type.h:85
const NodeType * node_type
Definition: node_type.h:90
@ BOOLEAN_ARRAY
Definition: node_type.h:54
@ TRANSFORM_ARRAY
Definition: node_type.h:63
@ NODE_ARRAY
Definition: node_type.h:64
@ POINT2_ARRAY
Definition: node_type.h:61
@ FLOAT_ARRAY
Definition: node_type.h:55
@ NORMAL_ARRAY
Definition: node_type.h:60
@ VECTOR_ARRAY
Definition: node_type.h:58
@ POINT_ARRAY
Definition: node_type.h:59
@ STRING_ARRAY
Definition: node_type.h:62
@ COLOR_ARRAY
Definition: node_type.h:57
static size_t max_size()
Definition: node_type.cpp:98
ustring ui_name
Definition: node_type.h:92
Type type
Definition: node_type.h:86
static bool is_float3(Type type)
Definition: node_type.cpp:131
static ustring type_name(Type type)
Definition: node_type.cpp:109
static void * zero_default_value()
Definition: node_type.cpp:103
@ LINK_TEXTURE_UV
Definition: node_type.h:77
@ SVM_INTERNAL
Definition: node_type.h:71
@ LINK_NORMAL
Definition: node_type.h:79
@ ANIMATABLE
Definition: node_type.h:69
@ LINK_TEXTURE_GENERATED
Definition: node_type.h:75
@ OSL_INTERNAL
Definition: node_type.h:72
@ LINK_TANGENT
Definition: node_type.h:81
@ LINK_INCOMING
Definition: node_type.h:78
@ LINK_TEXTURE_NORMAL
Definition: node_type.h:76
@ DEFAULT_LINK_MASK
Definition: node_type.h:82
@ LINK_POSITION
Definition: node_type.h:80
const NodeEnum * enum_values
Definition: node_type.h:89
int flags
Definition: node_type.h:91
SocketModifiedFlags modified_flag_bit
Definition: node_type.h:93
bool is_array() const
Definition: node_type.cpp:30
int struct_offset
Definition: node_type.h:87