1 /* 2 * Copyright 2011-2016 Blender Foundation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include "graph/node_enum.h" 20 #include "util/util_array.h" 21 #include "util/util_map.h" 22 #include "util/util_param.h" 23 #include "util/util_string.h" 24 #include "util/util_vector.h" 25 26 CCL_NAMESPACE_BEGIN 27 28 struct Node; 29 struct NodeType; 30 31 typedef uint64_t SocketModifiedFlags; 32 33 /* Socket Type */ 34 35 struct SocketType { 36 enum Type { 37 UNDEFINED, 38 39 BOOLEAN, 40 FLOAT, 41 INT, 42 UINT, 43 COLOR, 44 VECTOR, 45 POINT, 46 NORMAL, 47 POINT2, 48 CLOSURE, 49 STRING, 50 ENUM, 51 TRANSFORM, 52 NODE, 53 54 BOOLEAN_ARRAY, 55 FLOAT_ARRAY, 56 INT_ARRAY, 57 COLOR_ARRAY, 58 VECTOR_ARRAY, 59 POINT_ARRAY, 60 NORMAL_ARRAY, 61 POINT2_ARRAY, 62 STRING_ARRAY, 63 TRANSFORM_ARRAY, 64 NODE_ARRAY, 65 }; 66 67 enum Flags { 68 LINKABLE = (1 << 0), 69 ANIMATABLE = (1 << 1), 70 71 SVM_INTERNAL = (1 << 2), 72 OSL_INTERNAL = (1 << 3), 73 INTERNAL = (1 << 2) | (1 << 3), 74 75 LINK_TEXTURE_GENERATED = (1 << 4), 76 LINK_TEXTURE_NORMAL = (1 << 5), 77 LINK_TEXTURE_UV = (1 << 6), 78 LINK_INCOMING = (1 << 7), 79 LINK_NORMAL = (1 << 8), 80 LINK_POSITION = (1 << 9), 81 LINK_TANGENT = (1 << 10), 82 DEFAULT_LINK_MASK = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) 83 }; 84 85 ustring name; 86 Type type; 87 int struct_offset; 88 const void *default_value; 89 const NodeEnum *enum_values; 90 const NodeType **node_type; 91 int flags; 92 ustring ui_name; 93 SocketModifiedFlags modified_flag_bit; 94 95 size_t size() const; 96 bool is_array() const; 97 static size_t size(Type type); 98 static size_t max_size(); 99 static ustring type_name(Type type); 100 static void *zero_default_value(); 101 static bool is_float3(Type type); 102 }; 103 104 /* Node Type */ 105 106 struct NodeType { 107 enum Type { NONE, SHADER }; 108 109 explicit NodeType(Type type = NONE, const NodeType *base = NULL); 110 ~NodeType(); 111 112 void register_input(ustring name, 113 ustring ui_name, 114 SocketType::Type type, 115 int struct_offset, 116 const void *default_value, 117 const NodeEnum *enum_values = NULL, 118 const NodeType **node_type = NULL, 119 int flags = 0, 120 int extra_flags = 0); 121 void register_output(ustring name, ustring ui_name, SocketType::Type type); 122 123 const SocketType *find_input(ustring name) const; 124 const SocketType *find_output(ustring name) const; 125 126 typedef Node *(*CreateFunc)(const NodeType *type); 127 128 ustring name; 129 Type type; 130 const NodeType *base; 131 vector<SocketType, std::allocator<SocketType>> inputs; 132 vector<SocketType, std::allocator<SocketType>> outputs; 133 CreateFunc create; 134 135 static NodeType *add(const char *name, 136 CreateFunc create, 137 Type type = NONE, 138 const NodeType *base = NULL); 139 static const NodeType *find(ustring name); 140 static unordered_map<ustring, NodeType, ustringHash> &types(); 141 }; 142 143 /* Node Definition Macros */ 144 145 #define NODE_DECLARE \ 146 template<typename T> static const NodeType *register_type(); \ 147 static Node *create(const NodeType *type); \ 148 static const NodeType *node_type; 149 150 #define NODE_DEFINE(structname) \ 151 const NodeType *structname::node_type = structname::register_type<structname>(); \ 152 Node *structname::create(const NodeType *) \ 153 { \ 154 return new structname(); \ 155 } \ 156 template<typename T> const NodeType *structname::register_type() 157 158 #define NODE_ABSTRACT_DECLARE \ 159 template<typename T> static const NodeType *register_base_type(); \ 160 static const NodeType *node_base_type; 161 162 #define NODE_ABSTRACT_DEFINE(structname) \ 163 const NodeType *structname::node_base_type = structname::register_base_type<structname>(); \ 164 template<typename T> const NodeType *structname::register_base_type() 165 166 /* Sock Definition Macros */ 167 168 #define SOCKET_OFFSETOF(T, name) offsetof(T, name) 169 #define SOCKET_SIZEOF(T, name) (sizeof(T::name)) 170 #define SOCKET_DEFINE(name, ui_name, default_value, datatype, TYPE, flags, ...) \ 171 { \ 172 static datatype defval = default_value; \ 173 CHECK_TYPE(T::name, datatype); \ 174 type->register_input(ustring(#name), \ 175 ustring(ui_name), \ 176 TYPE, \ 177 SOCKET_OFFSETOF(T, name), \ 178 &defval, \ 179 NULL, \ 180 NULL, \ 181 flags, \ 182 ##__VA_ARGS__); \ 183 } 184 185 #define SOCKET_BOOLEAN(name, ui_name, default_value, ...) \ 186 SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, 0, ##__VA_ARGS__) 187 #define SOCKET_INT(name, ui_name, default_value, ...) \ 188 SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, 0, ##__VA_ARGS__) 189 #define SOCKET_UINT(name, ui_name, default_value, ...) \ 190 SOCKET_DEFINE(name, ui_name, default_value, uint, SocketType::UINT, 0, ##__VA_ARGS__) 191 #define SOCKET_FLOAT(name, ui_name, default_value, ...) \ 192 SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, 0, ##__VA_ARGS__) 193 #define SOCKET_COLOR(name, ui_name, default_value, ...) \ 194 SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, 0, ##__VA_ARGS__) 195 #define SOCKET_VECTOR(name, ui_name, default_value, ...) \ 196 SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, 0, ##__VA_ARGS__) 197 #define SOCKET_POINT(name, ui_name, default_value, ...) \ 198 SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, 0, ##__VA_ARGS__) 199 #define SOCKET_NORMAL(name, ui_name, default_value, ...) \ 200 SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, 0, ##__VA_ARGS__) 201 #define SOCKET_POINT2(name, ui_name, default_value, ...) \ 202 SOCKET_DEFINE(name, ui_name, default_value, float2, SocketType::POINT2, 0, ##__VA_ARGS__) 203 #define SOCKET_STRING(name, ui_name, default_value, ...) \ 204 SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, 0, ##__VA_ARGS__) 205 #define SOCKET_TRANSFORM(name, ui_name, default_value, ...) \ 206 SOCKET_DEFINE(name, ui_name, default_value, Transform, SocketType::TRANSFORM, 0, ##__VA_ARGS__) 207 #define SOCKET_ENUM(name, ui_name, values, default_value, ...) \ 208 { \ 209 static int defval = default_value; \ 210 assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \ 211 type->register_input(ustring(#name), \ 212 ustring(ui_name), \ 213 SocketType::ENUM, \ 214 SOCKET_OFFSETOF(T, name), \ 215 &defval, \ 216 &values, \ 217 NULL, \ 218 ##__VA_ARGS__); \ 219 } 220 #define SOCKET_NODE(name, ui_name, node_type, ...) \ 221 { \ 222 static Node *defval = NULL; \ 223 assert(SOCKET_SIZEOF(T, name) == sizeof(Node *)); \ 224 type->register_input(ustring(#name), \ 225 ustring(ui_name), \ 226 SocketType::NODE, \ 227 SOCKET_OFFSETOF(T, name), \ 228 &defval, \ 229 NULL, \ 230 node_type, \ 231 ##__VA_ARGS__); \ 232 } 233 234 #define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \ 235 SOCKET_DEFINE( \ 236 name, ui_name, default_value, array<bool>, SocketType::BOOLEAN_ARRAY, 0, ##__VA_ARGS__) 237 #define SOCKET_INT_ARRAY(name, ui_name, default_value, ...) \ 238 SOCKET_DEFINE(name, ui_name, default_value, array<int>, SocketType::INT_ARRAY, 0, ##__VA_ARGS__) 239 #define SOCKET_FLOAT_ARRAY(name, ui_name, default_value, ...) \ 240 SOCKET_DEFINE( \ 241 name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__) 242 #define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \ 243 SOCKET_DEFINE( \ 244 name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__) 245 #define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \ 246 SOCKET_DEFINE( \ 247 name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__) 248 #define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \ 249 SOCKET_DEFINE( \ 250 name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__) 251 #define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \ 252 SOCKET_DEFINE( \ 253 name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__) 254 #define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \ 255 SOCKET_DEFINE( \ 256 name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__) 257 #define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \ 258 SOCKET_DEFINE( \ 259 name, ui_name, default_value, array<ustring>, SocketType::STRING_ARRAY, 0, ##__VA_ARGS__) 260 #define SOCKET_TRANSFORM_ARRAY(name, ui_name, default_value, ...) \ 261 SOCKET_DEFINE(name, \ 262 ui_name, \ 263 default_value, \ 264 array<Transform>, \ 265 SocketType::TRANSFORM_ARRAY, \ 266 0, \ 267 ##__VA_ARGS__) 268 #define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \ 269 { \ 270 static array<Node *> defval = {}; \ 271 assert(SOCKET_SIZEOF(T, name) == sizeof(array<Node *>)); \ 272 type->register_input(ustring(#name), \ 273 ustring(ui_name), \ 274 SocketType::NODE_ARRAY, \ 275 SOCKET_OFFSETOF(T, name), \ 276 &defval, \ 277 NULL, \ 278 node_type, \ 279 ##__VA_ARGS__); \ 280 } 281 282 #define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \ 283 SOCKET_DEFINE(name, \ 284 ui_name, \ 285 default_value, \ 286 bool, \ 287 SocketType::BOOLEAN, \ 288 SocketType::LINKABLE, \ 289 ##__VA_ARGS__) 290 #define SOCKET_IN_INT(name, ui_name, default_value, ...) \ 291 SOCKET_DEFINE( \ 292 name, ui_name, default_value, int, SocketType::INT, SocketType::LINKABLE, ##__VA_ARGS__) 293 #define SOCKET_IN_FLOAT(name, ui_name, default_value, ...) \ 294 SOCKET_DEFINE(name, \ 295 ui_name, \ 296 default_value, \ 297 float, \ 298 SocketType::FLOAT, \ 299 SocketType::LINKABLE, \ 300 ##__VA_ARGS__) 301 #define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \ 302 SOCKET_DEFINE(name, \ 303 ui_name, \ 304 default_value, \ 305 float3, \ 306 SocketType::COLOR, \ 307 SocketType::LINKABLE, \ 308 ##__VA_ARGS__) 309 #define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \ 310 SOCKET_DEFINE(name, \ 311 ui_name, \ 312 default_value, \ 313 float3, \ 314 SocketType::VECTOR, \ 315 SocketType::LINKABLE, \ 316 ##__VA_ARGS__) 317 #define SOCKET_IN_POINT(name, ui_name, default_value, ...) \ 318 SOCKET_DEFINE(name, \ 319 ui_name, \ 320 default_value, \ 321 float3, \ 322 SocketType::POINT, \ 323 SocketType::LINKABLE, \ 324 ##__VA_ARGS__) 325 #define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \ 326 SOCKET_DEFINE(name, \ 327 ui_name, \ 328 default_value, \ 329 float3, \ 330 SocketType::NORMAL, \ 331 SocketType::LINKABLE, \ 332 ##__VA_ARGS__) 333 #define SOCKET_IN_STRING(name, ui_name, default_value, ...) \ 334 SOCKET_DEFINE(name, \ 335 ui_name, \ 336 default_value, \ 337 ustring, \ 338 SocketType::STRING, \ 339 SocketType::LINKABLE, \ 340 ##__VA_ARGS__) 341 #define SOCKET_IN_CLOSURE(name, ui_name, ...) \ 342 type->register_input(ustring(#name), \ 343 ustring(ui_name), \ 344 SocketType::CLOSURE, \ 345 0, \ 346 NULL, \ 347 NULL, \ 348 NULL, \ 349 SocketType::LINKABLE, \ 350 ##__VA_ARGS__) 351 352 #define SOCKET_OUT_BOOLEAN(name, ui_name) \ 353 { \ 354 type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); \ 355 } 356 #define SOCKET_OUT_INT(name, ui_name) \ 357 { \ 358 type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); \ 359 } 360 #define SOCKET_OUT_FLOAT(name, ui_name) \ 361 { \ 362 type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); \ 363 } 364 #define SOCKET_OUT_COLOR(name, ui_name) \ 365 { \ 366 type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); \ 367 } 368 #define SOCKET_OUT_VECTOR(name, ui_name) \ 369 { \ 370 type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); \ 371 } 372 #define SOCKET_OUT_POINT(name, ui_name) \ 373 { \ 374 type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); \ 375 } 376 #define SOCKET_OUT_NORMAL(name, ui_name) \ 377 { \ 378 type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); \ 379 } 380 #define SOCKET_OUT_CLOSURE(name, ui_name) \ 381 { \ 382 type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); \ 383 } 384 #define SOCKET_OUT_STRING(name, ui_name) \ 385 { \ 386 type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); \ 387 } 388 #define SOCKET_OUT_ENUM(name, ui_name) \ 389 { \ 390 type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); \ 391 } 392 393 CCL_NAMESPACE_END 394