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