78 (1 << 10) | (1 << 11) | (1 << 12)
112 const int struct_offset,
113 const void *default_value,
114 const NodeEnum *enum_values =
nullptr,
115 const NodeType *node_type =
nullptr,
117 int extra_flags = 0);
137 static unordered_map<ustring, NodeType> &
types();
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_;
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 *) \
157 return make_unique<structname>(); \
159 const NodeType *structname::get_node_type() \
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>(); \
169 template<typename T> const NodeType *structname::register_type()
171#define NODE_ABSTRACT_DECLARE \
172 template<typename T> static const NodeType *register_base_type(); \
173 static const NodeType *get_node_base_type();
175#define NODE_ABSTRACT_DEFINE(structname) \
176 const NodeType *structname::get_node_base_type() \
180 static const NodeType *node_base_type = register_base_type<structname>(); \
181 return node_base_type; \
183 template<typename T> const NodeType *structname::register_base_type()
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, ...) \
191 static datatype defval = default_value; \
192 static_assert(std::is_same_v<decltype(T::name), datatype>); \
193 type->register_input(ustring(#name), \
196 SOCKET_OFFSETOF(T, name), \
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, ...) \
230 static int defval = default_value; \
231 assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
232 type->register_input(ustring(#name), \
235 SOCKET_OFFSETOF(T, name), \
241#define SOCKET_NODE(name, ui_name, node_type, ...) \
243 static Node *defval = nullptr; \
244 assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \
245 type->register_input(ustring(#name), \
248 SOCKET_OFFSETOF(T, name), \
249 (const void *)&defval, \
255#define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
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, ...) \
262 name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
263#define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
265 name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
266#define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
268 name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
269#define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
271 name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
272#define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
274 name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
275#define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
277 name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
278#define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
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, \
286 SocketType::TRANSFORM_ARRAY, \
289#define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
291 static array<Node *> defval = {}; \
292 assert(SOCKET_SIZEOF(T, name) == sizeof(array<Node *>)); \
293 type->register_input(ustring(#name), \
295 SocketType::NODE_ARRAY, \
296 SOCKET_OFFSETOF(T, name), \
303#define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
304 SOCKET_DEFINE(name, \
308 SocketType::BOOLEAN, \
309 SocketType::LINKABLE, \
311#define SOCKET_IN_INT(name, ui_name, default_value, ...) \
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, \
320 SocketType::LINKABLE, \
322#define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
323 SOCKET_DEFINE(name, \
328 SocketType::LINKABLE, \
330#define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
331 SOCKET_DEFINE(name, \
335 SocketType::VECTOR, \
336 SocketType::LINKABLE, \
338#define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
339 SOCKET_DEFINE(name, \
344 SocketType::LINKABLE, \
346#define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
347 SOCKET_DEFINE(name, \
351 SocketType::NORMAL, \
352 SocketType::LINKABLE, \
354#define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
355 SOCKET_DEFINE(name, \
359 SocketType::STRING, \
360 SocketType::LINKABLE, \
362#define SOCKET_IN_CLOSURE(name, ui_name, ...) \
363 type->register_input(ustring(#name), \
365 SocketType::CLOSURE, \
370 SocketType::LINKABLE, \
373#define SOCKET_OUT_BOOLEAN(name, ui_name) \
375 type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); \
377#define SOCKET_OUT_INT(name, ui_name) \
379 type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); \
381#define SOCKET_OUT_FLOAT(name, ui_name) \
383 type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); \
385#define SOCKET_OUT_COLOR(name, ui_name) \
387 type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); \
389#define SOCKET_OUT_VECTOR(name, ui_name) \
391 type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); \
393#define SOCKET_OUT_POINT(name, ui_name) \
395 type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); \
397#define SOCKET_OUT_NORMAL(name, ui_name) \
399 type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); \
401#define SOCKET_OUT_CLOSURE(name, ui_name) \
403 type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); \
405#define SOCKET_OUT_STRING(name, ui_name) \
407 type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); \
409#define SOCKET_OUT_ENUM(name, ui_name) \
411 type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); \
unsigned long long int uint64_t
#define CCL_NAMESPACE_END
uint64_t SocketModifiedFlags
vector< SocketType, std::allocator< SocketType > > inputs
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
const SocketType * find_output(ustring name) const
static const NodeType * find(ustring name)
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)
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
static size_t size(Type type, bool packed)
const void * default_value
const NodeType * node_type
size_t storage_size() const
static bool is_float3(Type type)
static ustring type_name(Type type)
static void * zero_default_value()
const NodeEnum * enum_values
size_t packed_size() const
SocketModifiedFlags modified_flag_bit