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