82 DEFAULT_LINK_MASK = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10)
116 const void *default_value,
120 int extra_flags = 0);
140 static unordered_map<ustring, NodeType, ustringHash> &
types();
148 #define NODE_DECLARE \
149 static const NodeType *get_node_type(); \
150 template<typename T> static const NodeType *register_type(); \
151 static Node *create(const NodeType *type); \
152 static const NodeType *node_type;
154 #define NODE_DEFINE(structname) \
155 const NodeType *structname::node_type = structname::register_type<structname>(); \
156 Node *structname::create(const NodeType *) \
158 return new structname(); \
160 const NodeType *structname::get_node_type() \
164 template<typename T> const NodeType *structname::register_type()
166 #define NODE_ABSTRACT_DECLARE \
167 template<typename T> static const NodeType *register_base_type(); \
168 static const NodeType *get_node_base_type();
170 #define NODE_ABSTRACT_DEFINE(structname) \
171 const NodeType *structname::get_node_base_type() \
175 static const NodeType *node_base_type = register_base_type<structname>(); \
176 return node_base_type; \
178 template<typename T> const NodeType *structname::register_base_type()
182 #define SOCKET_OFFSETOF(T, name) offsetof(T, name)
183 #define SOCKET_SIZEOF(T, name) (sizeof(T::name))
184 #define SOCKET_DEFINE(name, ui_name, default_value, datatype, TYPE, flags, ...) \
186 static datatype defval = default_value; \
187 CHECK_TYPE(T::name, datatype); \
188 type->register_input(ustring(#name), \
191 SOCKET_OFFSETOF(T, name), \
199 #define SOCKET_BOOLEAN(name, ui_name, default_value, ...) \
200 SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, 0, ##__VA_ARGS__)
201 #define SOCKET_INT(name, ui_name, default_value, ...) \
202 SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, 0, ##__VA_ARGS__)
203 #define SOCKET_UINT(name, ui_name, default_value, ...) \
204 SOCKET_DEFINE(name, ui_name, default_value, uint, SocketType::UINT, 0, ##__VA_ARGS__)
205 #define SOCKET_FLOAT(name, ui_name, default_value, ...) \
206 SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, 0, ##__VA_ARGS__)
207 #define SOCKET_COLOR(name, ui_name, default_value, ...) \
208 SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, 0, ##__VA_ARGS__)
209 #define SOCKET_VECTOR(name, ui_name, default_value, ...) \
210 SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, 0, ##__VA_ARGS__)
211 #define SOCKET_POINT(name, ui_name, default_value, ...) \
212 SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, 0, ##__VA_ARGS__)
213 #define SOCKET_NORMAL(name, ui_name, default_value, ...) \
214 SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, 0, ##__VA_ARGS__)
215 #define SOCKET_POINT2(name, ui_name, default_value, ...) \
216 SOCKET_DEFINE(name, ui_name, default_value, float2, SocketType::POINT2, 0, ##__VA_ARGS__)
217 #define SOCKET_STRING(name, ui_name, default_value, ...) \
218 SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, 0, ##__VA_ARGS__)
219 #define SOCKET_TRANSFORM(name, ui_name, default_value, ...) \
220 SOCKET_DEFINE(name, ui_name, default_value, Transform, SocketType::TRANSFORM, 0, ##__VA_ARGS__)
221 #define SOCKET_ENUM(name, ui_name, values, default_value, ...) \
223 static int defval = default_value; \
224 assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
225 type->register_input(ustring(#name), \
228 SOCKET_OFFSETOF(T, name), \
234 #define SOCKET_NODE(name, ui_name, node_type, ...) \
236 static Node *defval = NULL; \
237 assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \
238 type->register_input(ustring(#name), \
241 SOCKET_OFFSETOF(T, name), \
248 #define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
250 name, ui_name, default_value, array<bool>, SocketType::BOOLEAN_ARRAY, 0, ##__VA_ARGS__)
251 #define SOCKET_INT_ARRAY(name, ui_name, default_value, ...) \
252 SOCKET_DEFINE(name, ui_name, default_value, array<int>, SocketType::INT_ARRAY, 0, ##__VA_ARGS__)
253 #define SOCKET_FLOAT_ARRAY(name, ui_name, default_value, ...) \
255 name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
256 #define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
258 name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
259 #define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
261 name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
262 #define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
264 name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
265 #define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
267 name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
268 #define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
270 name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
271 #define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
273 name, ui_name, default_value, array<ustring>, SocketType::STRING_ARRAY, 0, ##__VA_ARGS__)
274 #define SOCKET_TRANSFORM_ARRAY(name, ui_name, default_value, ...) \
275 SOCKET_DEFINE(name, \
279 SocketType::TRANSFORM_ARRAY, \
282 #define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
284 static array<Node *> defval = {}; \
285 assert(SOCKET_SIZEOF(T, name) == sizeof(array<Node *>)); \
286 type->register_input(ustring(#name), \
288 SocketType::NODE_ARRAY, \
289 SOCKET_OFFSETOF(T, name), \
296 #define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
297 SOCKET_DEFINE(name, \
301 SocketType::BOOLEAN, \
302 SocketType::LINKABLE, \
304 #define SOCKET_IN_INT(name, ui_name, default_value, ...) \
306 name, ui_name, default_value, int, SocketType::INT, SocketType::LINKABLE, ##__VA_ARGS__)
307 #define SOCKET_IN_FLOAT(name, ui_name, default_value, ...) \
308 SOCKET_DEFINE(name, \
313 SocketType::LINKABLE, \
315 #define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
316 SOCKET_DEFINE(name, \
321 SocketType::LINKABLE, \
323 #define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
324 SOCKET_DEFINE(name, \
328 SocketType::VECTOR, \
329 SocketType::LINKABLE, \
331 #define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
332 SOCKET_DEFINE(name, \
337 SocketType::LINKABLE, \
339 #define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
340 SOCKET_DEFINE(name, \
344 SocketType::NORMAL, \
345 SocketType::LINKABLE, \
347 #define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
348 SOCKET_DEFINE(name, \
352 SocketType::STRING, \
353 SocketType::LINKABLE, \
355 #define SOCKET_IN_CLOSURE(name, ui_name, ...) \
356 type->register_input(ustring(#name), \
358 SocketType::CLOSURE, \
363 SocketType::LINKABLE, \
366 #define SOCKET_OUT_BOOLEAN(name, ui_name) \
368 type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); \
370 #define SOCKET_OUT_INT(name, ui_name) \
372 type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); \
374 #define SOCKET_OUT_FLOAT(name, ui_name) \
376 type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); \
378 #define SOCKET_OUT_COLOR(name, ui_name) \
380 type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); \
382 #define SOCKET_OUT_VECTOR(name, ui_name) \
384 type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); \
386 #define SOCKET_OUT_POINT(name, ui_name) \
388 type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); \
390 #define SOCKET_OUT_NORMAL(name, ui_name) \
392 type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); \
394 #define SOCKET_OUT_CLOSURE(name, ui_name) \
396 type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); \
398 #define SOCKET_OUT_STRING(name, ui_name) \
400 type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); \
402 #define SOCKET_OUT_ENUM(name, ui_name) \
404 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