75 DEFAULT_LINK_MASK = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) |
76 (1 << 10) | (1 << 11) | (1 << 12)
110 const void *default_value,
114 int extra_flags = 0);
134 static unordered_map<ustring, NodeType, ustringHash> &
types();
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;
148#define NODE_DEFINE(structname) \
149 const NodeType *structname::node_type = structname::register_type<structname>(); \
150 Node *structname::create(const NodeType *) \
152 return new structname(); \
154 const NodeType *structname::get_node_type() \
158 template<typename T> const NodeType *structname::register_type()
160#define NODE_ABSTRACT_DECLARE \
161 template<typename T> static const NodeType *register_base_type(); \
162 static const NodeType *get_node_base_type();
164#define NODE_ABSTRACT_DEFINE(structname) \
165 const NodeType *structname::get_node_base_type() \
169 static const NodeType *node_base_type = register_base_type<structname>(); \
170 return node_base_type; \
172 template<typename T> const NodeType *structname::register_base_type()
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, ...) \
180 static datatype defval = default_value; \
181 static_assert(std::is_same_v<decltype(T::name), datatype>); \
182 type->register_input(ustring(#name), \
185 SOCKET_OFFSETOF(T, name), \
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, ...) \
219 static int defval = default_value; \
220 assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
221 type->register_input(ustring(#name), \
224 SOCKET_OFFSETOF(T, name), \
230#define SOCKET_NODE(name, ui_name, node_type, ...) \
232 static Node *defval = NULL; \
233 assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \
234 type->register_input(ustring(#name), \
237 SOCKET_OFFSETOF(T, name), \
244#define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
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, ...) \
251 name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
252#define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
254 name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
255#define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
257 name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
258#define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
260 name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
261#define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
263 name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
264#define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
266 name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
267#define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
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, \
275 SocketType::TRANSFORM_ARRAY, \
278#define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
280 static array<Node *> defval = {}; \
281 assert(SOCKET_SIZEOF(T, name) == sizeof(array<Node *>)); \
282 type->register_input(ustring(#name), \
284 SocketType::NODE_ARRAY, \
285 SOCKET_OFFSETOF(T, name), \
292#define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
293 SOCKET_DEFINE(name, \
297 SocketType::BOOLEAN, \
298 SocketType::LINKABLE, \
300#define SOCKET_IN_INT(name, ui_name, default_value, ...) \
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, \
309 SocketType::LINKABLE, \
311#define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
312 SOCKET_DEFINE(name, \
317 SocketType::LINKABLE, \
319#define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
320 SOCKET_DEFINE(name, \
324 SocketType::VECTOR, \
325 SocketType::LINKABLE, \
327#define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
328 SOCKET_DEFINE(name, \
333 SocketType::LINKABLE, \
335#define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
336 SOCKET_DEFINE(name, \
340 SocketType::NORMAL, \
341 SocketType::LINKABLE, \
343#define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
344 SOCKET_DEFINE(name, \
348 SocketType::STRING, \
349 SocketType::LINKABLE, \
351#define SOCKET_IN_CLOSURE(name, ui_name, ...) \
352 type->register_input(ustring(#name), \
354 SocketType::CLOSURE, \
359 SocketType::LINKABLE, \
362#define SOCKET_OUT_BOOLEAN(name, ui_name) \
364 type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); \
366#define SOCKET_OUT_INT(name, ui_name) \
368 type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); \
370#define SOCKET_OUT_FLOAT(name, ui_name) \
372 type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); \
374#define SOCKET_OUT_COLOR(name, ui_name) \
376 type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); \
378#define SOCKET_OUT_VECTOR(name, ui_name) \
380 type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); \
382#define SOCKET_OUT_POINT(name, ui_name) \
384 type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); \
386#define SOCKET_OUT_NORMAL(name, ui_name) \
388 type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); \
390#define SOCKET_OUT_CLOSURE(name, ui_name) \
392 type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); \
394#define SOCKET_OUT_STRING(name, ui_name) \
396 type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); \
398#define SOCKET_OUT_ENUM(name, ui_name) \
400 type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); \
#define CCL_NAMESPACE_END
uint64_t SocketModifiedFlags
unsigned __int64 uint64_t
vector< SocketType, std::allocator< SocketType > > inputs
const SocketType * find_output(ustring name) const
static const NodeType * find(ustring name)
static unordered_map< ustring, NodeType, ustringHash > & types()
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
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)
const void * default_value
const NodeType * node_type
static bool is_float3(Type type)
static ustring type_name(Type type)
static void * zero_default_value()
const NodeEnum * enum_values
SocketModifiedFlags modified_flag_bit