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