Cycles: Cleanup, indentation
[blender.git] / intern / cycles / graph / node_type.h
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
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 /* Socket Type */
32
33 struct SocketType
34 {
35         enum Type
36         {
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
94         size_t size() const;
95         bool is_array() const;
96         static size_t size(Type type);
97         static size_t max_size();
98         static ustring type_name(Type type);
99         static void *zero_default_value();
100         static bool is_float3(Type type);
101 };
102
103 /* Node Type */
104
105 struct NodeType
106 {
107         enum Type {
108                 NONE,
109                 SHADER
110         };
111
112         explicit NodeType(Type type = NONE);
113         ~NodeType();
114
115         void register_input(ustring name, ustring ui_name, SocketType::Type type,
116                             int struct_offset, const void *default_value,
117                             const NodeEnum *enum_values = NULL,
118                             const NodeType **node_type = NULL,
119                             int flags = 0, int extra_flags = 0);
120         void register_output(ustring name, ustring ui_name, SocketType::Type type);
121
122         const SocketType *find_input(ustring name) const;
123         const SocketType *find_output(ustring name) const;
124
125         typedef Node *(*CreateFunc)(const NodeType *type);
126
127         ustring name;
128         Type type;
129         vector<SocketType, std::allocator<SocketType> > inputs;
130         vector<SocketType, std::allocator<SocketType> > outputs;
131         CreateFunc create;
132
133         static NodeType *add(const char *name, CreateFunc create, Type type = NONE);
134         static const NodeType *find(ustring name);
135         static unordered_map<ustring, NodeType, ustringHash>& types();
136 };
137
138 /* Node Definition Macros */
139
140 #define NODE_DECLARE                       \
141 template<typename T>                       \
142 static const NodeType *register_type();    \
143 static Node *create(const NodeType *type); \
144 static const NodeType *node_type;
145
146 #define NODE_DEFINE(structname)                                                  \
147 const NodeType *structname::node_type = structname::register_type<structname>(); \
148 Node *structname::create(const NodeType*) { return new structname(); }           \
149 template<typename T>                                                             \
150 const NodeType *structname::register_type()
151
152 /* Sock Definition Macros */
153
154 #define SOCKET_OFFSETOF(T, name) (((char *)&(((T *)1)->name)) - (char *)1)
155 #define SOCKET_SIZEOF(T, name) (sizeof(((T *)1)->name))
156 #define SOCKET_DEFINE(name, ui_name, default_value, datatype, TYPE, flags, ...) \
157         { \
158                 static datatype defval = default_value; \
159                 CHECK_TYPE(((T *)1)->name, datatype); \
160                 type->register_input(ustring(#name), ustring(ui_name), TYPE, SOCKET_OFFSETOF(T, name), &defval, NULL, NULL, flags, ##__VA_ARGS__); \
161         }
162
163 #define SOCKET_BOOLEAN(name, ui_name, default_value, ...) \
164         SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, 0, ##__VA_ARGS__)
165 #define SOCKET_INT(name, ui_name, default_value, ...) \
166         SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, 0, ##__VA_ARGS__)
167 #define SOCKET_UINT(name, ui_name, default_value, ...) \
168         SOCKET_DEFINE(name, ui_name, default_value, uint, SocketType::UINT, 0, ##__VA_ARGS__)
169 #define SOCKET_FLOAT(name, ui_name, default_value, ...) \
170         SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, 0, ##__VA_ARGS__)
171 #define SOCKET_COLOR(name, ui_name, default_value, ...) \
172         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, 0, ##__VA_ARGS__)
173 #define SOCKET_VECTOR(name, ui_name, default_value, ...) \
174         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, 0, ##__VA_ARGS__)
175 #define SOCKET_POINT(name, ui_name, default_value, ...) \
176         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, 0, ##__VA_ARGS__)
177 #define SOCKET_NORMAL(name, ui_name, default_value, ...) \
178         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, 0, ##__VA_ARGS__)
179 #define SOCKET_POINT2(name, ui_name, default_value, ...) \
180         SOCKET_DEFINE(name, ui_name, default_value, float2, SocketType::POINT2, 0, ##__VA_ARGS__)
181 #define SOCKET_STRING(name, ui_name, default_value, ...) \
182         SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, 0, ##__VA_ARGS__)
183 #define SOCKET_TRANSFORM(name, ui_name, default_value, ...) \
184         SOCKET_DEFINE(name, ui_name, default_value, Transform, SocketType::TRANSFORM, 0, ##__VA_ARGS__)
185 #define SOCKET_ENUM(name, ui_name, values, default_value, ...) \
186         { \
187                 static int defval = default_value; \
188                 assert(SOCKET_SIZEOF(T, name) == sizeof(int)); \
189                 type->register_input(ustring(#name), ustring(ui_name), SocketType::ENUM, SOCKET_OFFSETOF(T, name), &defval, &values, NULL, ##__VA_ARGS__); \
190         }
191 #define SOCKET_NODE(name, ui_name, node_type, ...) \
192         { \
193             static Node *defval = NULL; \
194                 assert(SOCKET_SIZEOF(T, name) == sizeof(Node*)); \
195                 type->register_input(ustring(#name), ustring(ui_name), SocketType::NODE, SOCKET_OFFSETOF(T, name), &defval, NULL, node_type, ##__VA_ARGS__); \
196         }
197
198 #define SOCKET_BOOLEAN_ARRAY(name, ui_name, default_value, ...) \
199         SOCKET_DEFINE(name, ui_name, default_value, array<bool>, SocketType::BOOLEAN_ARRAY, 0, ##__VA_ARGS__)
200 #define SOCKET_INT_ARRAY(name, ui_name, default_value, ...) \
201         SOCKET_DEFINE(name, ui_name, default_value, array<int>, SocketType::INT_ARRAY, 0, ##__VA_ARGS__)
202 #define SOCKET_FLOAT_ARRAY(name, ui_name, default_value, ...) \
203         SOCKET_DEFINE(name, ui_name, default_value, array<float>, SocketType::FLOAT_ARRAY, 0, ##__VA_ARGS__)
204 #define SOCKET_COLOR_ARRAY(name, ui_name, default_value, ...) \
205         SOCKET_DEFINE(name, ui_name, default_value, array<float3>, SocketType::COLOR_ARRAY, 0, ##__VA_ARGS__)
206 #define SOCKET_VECTOR_ARRAY(name, ui_name, default_value, ...) \
207         SOCKET_DEFINE(name, ui_name, default_value, array<float3>, SocketType::VECTOR_ARRAY, 0, ##__VA_ARGS__)
208 #define SOCKET_POINT_ARRAY(name, ui_name, default_value, ...) \
209         SOCKET_DEFINE(name, ui_name, default_value, array<float3>, SocketType::POINT_ARRAY, 0, ##__VA_ARGS__)
210 #define SOCKET_NORMAL_ARRAY(name, ui_name, default_value, ...) \
211         SOCKET_DEFINE(name, ui_name, default_value, array<float3>, SocketType::NORMAL_ARRAY, 0, ##__VA_ARGS__)
212 #define SOCKET_POINT2_ARRAY(name, ui_name, default_value, ...) \
213         SOCKET_DEFINE(name, ui_name, default_value, array<float2>, SocketType::POINT2_ARRAY, 0, ##__VA_ARGS__)
214 #define SOCKET_STRING_ARRAY(name, ui_name, default_value, ...) \
215         SOCKET_DEFINE(name, ui_name, default_value, array<ustring>, SocketType::STRING_ARRAY, 0, ##__VA_ARGS__)
216 #define SOCKET_TRANSFORM_ARRAY(name, ui_name, default_value, ...) \
217         SOCKET_DEFINE(name, ui_name, default_value, array<Transform>, SocketType::TRANSFORM_ARRAY, 0, ##__VA_ARGS__)
218 #define SOCKET_NODE_ARRAY(name, ui_name, node_type, ...) \
219         { \
220             static Node *defval = NULL; \
221                 assert(SOCKET_SIZEOF(T, name) == sizeof(Node*)); \
222                 type->register_input(ustring(#name), ustring(ui_name), SocketType::NODE_ARRAY, SOCKET_OFFSETOF(T, name), &defval, NULL, node_type, ##__VA_ARGS__); \
223         }
224
225 #define SOCKET_IN_BOOLEAN(name, ui_name, default_value, ...) \
226         SOCKET_DEFINE(name, ui_name, default_value, bool, SocketType::BOOLEAN, SocketType::LINKABLE, ##__VA_ARGS__)
227 #define SOCKET_IN_INT(name, ui_name, default_value, ...) \
228         SOCKET_DEFINE(name, ui_name, default_value, int, SocketType::INT, SocketType::LINKABLE, ##__VA_ARGS__)
229 #define SOCKET_IN_FLOAT(name, ui_name, default_value, ...) \
230         SOCKET_DEFINE(name, ui_name, default_value, float, SocketType::FLOAT, SocketType::LINKABLE, ##__VA_ARGS__)
231 #define SOCKET_IN_COLOR(name, ui_name, default_value, ...) \
232         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::COLOR, SocketType::LINKABLE, ##__VA_ARGS__)
233 #define SOCKET_IN_VECTOR(name, ui_name, default_value, ...) \
234         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::VECTOR, SocketType::LINKABLE, ##__VA_ARGS__)
235 #define SOCKET_IN_POINT(name, ui_name, default_value, ...) \
236         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::POINT, SocketType::LINKABLE, ##__VA_ARGS__)
237 #define SOCKET_IN_NORMAL(name, ui_name, default_value, ...) \
238         SOCKET_DEFINE(name, ui_name, default_value, float3, SocketType::NORMAL, SocketType::LINKABLE, ##__VA_ARGS__)
239 #define SOCKET_IN_STRING(name, ui_name, default_value, ...) \
240         SOCKET_DEFINE(name, ui_name, default_value, ustring, SocketType::STRING, SocketType::LINKABLE, ##__VA_ARGS__)
241 #define SOCKET_IN_CLOSURE(name, ui_name, ...) \
242         type->register_input(ustring(#name), ustring(ui_name), SocketType::CLOSURE, 0, NULL, NULL, NULL, SocketType::LINKABLE, ##__VA_ARGS__)
243
244 #define SOCKET_OUT_BOOLEAN(name, ui_name) \
245         { type->register_output(ustring(#name), ustring(ui_name), SocketType::BOOLEAN); }
246 #define SOCKET_OUT_INT(name, ui_name) \
247         { type->register_output(ustring(#name), ustring(ui_name), SocketType::INT); }
248 #define SOCKET_OUT_FLOAT(name, ui_name) \
249         { type->register_output(ustring(#name), ustring(ui_name), SocketType::FLOAT); }
250 #define SOCKET_OUT_COLOR(name, ui_name) \
251         { type->register_output(ustring(#name), ustring(ui_name), SocketType::COLOR); }
252 #define SOCKET_OUT_VECTOR(name, ui_name) \
253         { type->register_output(ustring(#name), ustring(ui_name), SocketType::VECTOR); }
254 #define SOCKET_OUT_POINT(name, ui_name) \
255         { type->register_output(ustring(#name), ustring(ui_name), SocketType::POINT); }
256 #define SOCKET_OUT_NORMAL(name, ui_name) \
257         { type->register_output(ustring(#name), ustring(ui_name), SocketType::NORMAL); }
258 #define SOCKET_OUT_CLOSURE(name, ui_name) \
259         { type->register_output(ustring(#name), ustring(ui_name), SocketType::CLOSURE); }
260 #define SOCKET_OUT_STRING(name, ui_name) \
261         { type->register_output(ustring(#name), ustring(ui_name), SocketType::STRING); }
262 #define SOCKET_OUT_ENUM(name, ui_name) \
263         { type->register_output(ustring(#name), ustring(ui_name), SocketType::ENUM); }
264
265 CCL_NAMESPACE_END