69 DEFAULT_LINK_MASK = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10)
103 const void *default_value,
107 int extra_flags = 0);
127 static unordered_map<ustring, NodeType, ustringHash> &
types();
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;
141 #define NODE_DEFINE(structname) \
142 const NodeType *structname::node_type = structname::register_type<structname>(); \
143 Node *structname::create(const NodeType *) \
145 return new structname(); \
147 const NodeType *structname::get_node_type() \
151 template<typename T> const NodeType *structname::register_type()
153 #define NODE_ABSTRACT_DECLARE \
154 template<typename T> static const NodeType *register_base_type(); \
155 static const NodeType *get_node_base_type();
157 #define NODE_ABSTRACT_DEFINE(structname) \
158 const NodeType *structname::get_node_base_type() \
162 static const NodeType *node_base_type = register_base_type<structname>(); \
163 return node_base_type; \
165 template<typename T> const NodeType *structname::register_base_type()
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, ...) \
173 static datatype defval = default_value; \
174 static_assert(std::is_same_v<decltype(T::name), datatype>); \
175 type->register_input(ustring(#name), \
178 SOCKET_OFFSETOF(T, name), \
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, ...) \
210 static int defval = default_value; \
211 assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
212 type->register_input(ustring(#name), \
215 SOCKET_OFFSETOF(T, name), \
221 #define SOCKET_NODE(name, ui_name, node_type, ...) \
223 static Node *defval = NULL; \
224 assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \
225 type->register_input(ustring(#name), \
228 SOCKET_OFFSETOF(T, name), \
235 #define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
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, ...) \
242 name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
243 #define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
245 name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
246 #define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
248 name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
249 #define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
251 name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
252 #define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
254 name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
255 #define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
257 name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
258 #define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
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, \
266 SocketType::TRANSFORM_ARRAY, \
269 #define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
271 static array<Node *> defval = {}; \
272 assert(SOCKET_SIZEOF(T, name) == sizeof(array<Node *>)); \
273 type->register_input(ustring(#name), \
275 SocketType::NODE_ARRAY, \
276 SOCKET_OFFSETOF(T, name), \
283 #define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
284 SOCKET_DEFINE(name, \
288 SocketType::BOOLEAN, \
289 SocketType::LINKABLE, \
291 #define SOCKET_IN_INT(name, ui_name, default_value, ...) \
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, \
300 SocketType::LINKABLE, \
302 #define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
303 SOCKET_DEFINE(name, \
308 SocketType::LINKABLE, \
310 #define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
311 SOCKET_DEFINE(name, \
315 SocketType::VECTOR, \
316 SocketType::LINKABLE, \
318 #define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
319 SOCKET_DEFINE(name, \
324 SocketType::LINKABLE, \
326 #define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
327 SOCKET_DEFINE(name, \
331 SocketType::NORMAL, \
332 SocketType::LINKABLE, \
334 #define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
335 SOCKET_DEFINE(name, \
339 SocketType::STRING, \
340 SocketType::LINKABLE, \
342 #define SOCKET_IN_CLOSURE(name, ui_name, ...) \
343 type->register_input(ustring(#name), \
345 SocketType::CLOSURE, \
350 SocketType::LINKABLE, \
353 #define SOCKET_OUT_BOOLEAN(name, ui_name) \
355 type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); \
357 #define SOCKET_OUT_INT(name, ui_name) \
359 type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); \
361 #define SOCKET_OUT_FLOAT(name, ui_name) \
363 type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); \
365 #define SOCKET_OUT_COLOR(name, ui_name) \
367 type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); \
369 #define SOCKET_OUT_VECTOR(name, ui_name) \
371 type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); \
373 #define SOCKET_OUT_POINT(name, ui_name) \
375 type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); \
377 #define SOCKET_OUT_NORMAL(name, ui_name) \
379 type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); \
381 #define SOCKET_OUT_CLOSURE(name, ui_name) \
383 type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); \
385 #define SOCKET_OUT_STRING(name, ui_name) \
387 type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); \
389 #define SOCKET_OUT_ENUM(name, ui_name) \
391 type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); \
#define CCL_NAMESPACE_END
uint64_t SocketModifiedFlags
unsigned __int64 uint64_t
const SocketType * find_output(ustring name) const
vector< SocketType, std::allocator< SocketType > > inputs
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
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