Blender V5.0
rna_nodetree.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <climits>
10#include <cstdlib>
11#include <cstring>
12#include <type_traits>
13
15#include "BLI_math_rotation.h"
16#include "BLI_string.h"
17
18#include "BLT_translation.hh"
19
20#include "DNA_node_types.h"
21#include "DNA_object_types.h"
22#include "DNA_texture_types.h"
23
24#include "BKE_animsys.h"
25#include "BKE_attribute.hh"
26#include "BKE_context.hh"
27#include "BKE_geometry_set.hh"
28#include "BKE_node.hh"
30
31#include "RNA_define.hh"
32#include "RNA_enum_types.hh"
33
34#include "rna_internal.hh"
35#include "rna_internal_types.hh"
36
38
39#include "WM_types.hh"
40
42 {SOCK_OUT, "OUT", 0, "Output", ""},
43 {0, nullptr, 0, nullptr, nullptr}};
44
46 {SOCK_FLOAT, "FLOAT", ICON_NODE_SOCKET_FLOAT, "Float", ""},
47 {SOCK_INT, "INT", ICON_NODE_SOCKET_INT, "Integer", ""},
48 {SOCK_BOOLEAN, "BOOLEAN", ICON_NODE_SOCKET_BOOLEAN, "Boolean", ""},
49 {SOCK_VECTOR, "VECTOR", ICON_NODE_SOCKET_VECTOR, "Vector", ""},
50 {SOCK_RGBA, "RGBA", ICON_NODE_SOCKET_RGBA, "Color", ""},
51 {SOCK_ROTATION, "ROTATION", ICON_NODE_SOCKET_ROTATION, "Rotation", ""},
52 {SOCK_MATRIX, "MATRIX", ICON_NODE_SOCKET_MATRIX, "Matrix", ""},
53 {SOCK_STRING, "STRING", ICON_NODE_SOCKET_STRING, "String", ""},
54 {SOCK_MENU, "MENU", ICON_NODE_SOCKET_MENU, "Menu", ""},
55 {SOCK_SHADER, "SHADER", ICON_NODE_SOCKET_SHADER, "Shader", ""},
56 {SOCK_OBJECT, "OBJECT", ICON_NODE_SOCKET_OBJECT, "Object", ""},
57 {SOCK_IMAGE, "IMAGE", ICON_NODE_SOCKET_IMAGE, "Image", ""},
58 {SOCK_GEOMETRY, "GEOMETRY", ICON_NODE_SOCKET_GEOMETRY, "Geometry", ""},
59 {SOCK_COLLECTION, "COLLECTION", ICON_NODE_SOCKET_COLLECTION, "Collection", ""},
60 {SOCK_TEXTURE, "TEXTURE", ICON_NODE_SOCKET_TEXTURE, "Texture", ""},
61 {SOCK_MATERIAL, "MATERIAL", ICON_NODE_SOCKET_MATERIAL, "Material", ""},
62 {SOCK_BUNDLE, "BUNDLE", ICON_NODE_SOCKET_BUNDLE, "Bundle", ""},
63 {SOCK_CLOSURE, "CLOSURE", ICON_NODE_SOCKET_CLOSURE, "Closure", ""},
64 {0, nullptr, 0, nullptr, nullptr},
65};
66
69 "NONE",
70 0,
71 "None",
72 "Default color tag for new nodes and node groups"},
73 {int(blender::bke::NodeColorTag::Attribute), "ATTRIBUTE", 0, "Attribute", ""},
74 {int(blender::bke::NodeColorTag::Color), "COLOR", 0, "Color", ""},
75 {int(blender::bke::NodeColorTag::Converter), "CONVERTER", 0, "Converter", ""},
76 {int(blender::bke::NodeColorTag::Distort), "DISTORT", 0, "Distort", ""},
77 {int(blender::bke::NodeColorTag::Filter), "FILTER", 0, "Filter", ""},
78 {int(blender::bke::NodeColorTag::Geometry), "GEOMETRY", 0, "Geometry", ""},
79 {int(blender::bke::NodeColorTag::Input), "INPUT", 0, "Input", ""},
80 {int(blender::bke::NodeColorTag::Matte), "MATTE", 0, "Matte", ""},
81 {int(blender::bke::NodeColorTag::Output), "OUTPUT", 0, "Output", ""},
82 {int(blender::bke::NodeColorTag::Script), "SCRIPT", 0, "Script", ""},
83 {int(blender::bke::NodeColorTag::Shader), "SHADER", 0, "Shader", ""},
84 {int(blender::bke::NodeColorTag::Texture), "TEXTURE", 0, "Texture", ""},
85 {int(blender::bke::NodeColorTag::Vector), "VECTOR", 0, "Vector", ""},
86 {int(blender::bke::NodeColorTag::Pattern), "PATTERN", 0, "Pattern", ""},
87 {int(blender::bke::NodeColorTag::Interface), "INTERFACE", 0, "Interface", ""},
88 {int(blender::bke::NodeColorTag::Group), "GROUP", 0, "Group", ""},
89 {0, nullptr, 0, nullptr, nullptr},
90};
91
93 {NODE_MAPPING_TYPE_POINT, "POINT", 0, "Point", "Transform a point"},
95 "TEXTURE",
96 0,
97 "Texture",
98 "Transform a texture by inverse mapping the texture coordinate"},
100 "VECTOR",
101 0,
102 "Vector",
103 "Transform a direction vector (Location is ignored)"},
105 "NORMAL",
106 0,
107 "Normal",
108 "Transform a unit normal vector (Location is ignored)"},
109 {0, nullptr, 0, nullptr, nullptr},
110};
111
114 "AXIS_ANGLE",
115 0,
116 "Axis Angle",
117 "Rotate a point using axis angle"},
118 {NODE_VECTOR_ROTATE_TYPE_AXIS_X, "X_AXIS", 0, "X Axis", "Rotate a point using X axis"},
119 {NODE_VECTOR_ROTATE_TYPE_AXIS_Y, "Y_AXIS", 0, "Y Axis", "Rotate a point using Y axis"},
120 {NODE_VECTOR_ROTATE_TYPE_AXIS_Z, "Z_AXIS", 0, "Z Axis", "Rotate a point using Z axis"},
121 {NODE_VECTOR_ROTATE_TYPE_EULER_XYZ, "EULER_XYZ", 0, "Euler", "Rotate a point using XYZ order"},
122 {0, nullptr, 0, nullptr, nullptr},
123};
124
127 {NODE_MATH_ADD, "ADD", 0, "Add", "A + B"},
128 {NODE_MATH_SUBTRACT, "SUBTRACT", 0, "Subtract", "A - B"},
129 {NODE_MATH_MULTIPLY, "MULTIPLY", 0, "Multiply", "A * B"},
130 {NODE_MATH_DIVIDE, "DIVIDE", 0, "Divide", "A / B"},
131 {NODE_MATH_MULTIPLY_ADD, "MULTIPLY_ADD", 0, "Multiply Add", "A * B + C"},
133 {NODE_MATH_POWER, "POWER", 0, "Power", "A power B"},
134 {NODE_MATH_LOGARITHM, "LOGARITHM", 0, "Logarithm", "Logarithm A base B"},
135 {NODE_MATH_SQRT, "SQRT", 0, "Square Root", "Square root of A"},
136 {NODE_MATH_INV_SQRT, "INVERSE_SQRT", 0, "Inverse Square Root", "1 / Square root of A"},
137 {NODE_MATH_ABSOLUTE, "ABSOLUTE", 0, "Absolute", "Magnitude of A"},
138 {NODE_MATH_EXPONENT, "EXPONENT", 0, "Exponent", "exp(A)"},
140 {NODE_MATH_MINIMUM, "MINIMUM", 0, "Minimum", "The minimum from A and B"},
141 {NODE_MATH_MAXIMUM, "MAXIMUM", 0, "Maximum", "The maximum from A and B"},
142 {NODE_MATH_LESS_THAN, "LESS_THAN", 0, "Less Than", "1 if A < B else 0"},
143 {NODE_MATH_GREATER_THAN, "GREATER_THAN", 0, "Greater Than", "1 if A > B else 0"},
144 {NODE_MATH_SIGN, "SIGN", 0, "Sign", "Returns the sign of A"},
145 {NODE_MATH_COMPARE, "COMPARE", 0, "Compare", "1 if (A == B) within tolerance C else 0"},
147 "SMOOTH_MIN",
148 0,
149 "Smooth Minimum",
150 "The minimum from A and B with smoothing C"},
152 "SMOOTH_MAX",
153 0,
154 "Smooth Maximum",
155 "The maximum from A and B with smoothing C"},
158 "ROUND",
159 0,
160 "Round",
161 "Round A to the nearest integer. Round upward if the fraction part is 0.5"},
162 {NODE_MATH_FLOOR, "FLOOR", 0, "Floor", "The largest integer smaller than or equal A"},
163 {NODE_MATH_CEIL, "CEIL", 0, "Ceil", "The smallest integer greater than or equal A"},
164 {NODE_MATH_TRUNC, "TRUNC", 0, "Truncate", "The integer part of A, removing fractional digits"},
166 {NODE_MATH_FRACTION, "FRACT", 0, "Fraction", "The fraction part of A"},
168 "MODULO",
169 0,
170 "Truncated Modulo",
171 "The remainder of truncated division using fmod(A,B)"},
173 "FLOORED_MODULO",
174 0,
175 "Floored Modulo",
176 "The remainder of floored division"},
177 {NODE_MATH_WRAP, "WRAP", 0, "Wrap", "Wrap value to range, wrap(A,B)"},
178 {NODE_MATH_SNAP, "SNAP", 0, "Snap", "Snap to increment, snap(A,B)"},
180 "PINGPONG",
181 0,
182 "Ping-Pong",
183 "Wraps a value and reverses every other cycle (A,B)"},
184 RNA_ENUM_ITEM_HEADING(CTX_N_(BLT_I18NCONTEXT_ID_NODETREE, "Trigonometric"), nullptr),
185 {NODE_MATH_SINE, "SINE", 0, "Sine", "sin(A)"},
186 {NODE_MATH_COSINE, "COSINE", 0, "Cosine", "cos(A)"},
187 {NODE_MATH_TANGENT, "TANGENT", 0, "Tangent", "tan(A)"},
189 {NODE_MATH_ARCSINE, "ARCSINE", 0, "Arcsine", "arcsin(A)"},
190 {NODE_MATH_ARCCOSINE, "ARCCOSINE", 0, "Arccosine", "arccos(A)"},
191 {NODE_MATH_ARCTANGENT, "ARCTANGENT", 0, "Arctangent", "arctan(A)"},
192 {NODE_MATH_ARCTAN2, "ARCTAN2", 0, "Arctan2", "The signed angle arctan(A / B)"},
194 {NODE_MATH_SINH, "SINH", 0, "Hyperbolic Sine", "sinh(A)"},
195 {NODE_MATH_COSH, "COSH", 0, "Hyperbolic Cosine", "cosh(A)"},
196 {NODE_MATH_TANH, "TANH", 0, "Hyperbolic Tangent", "tanh(A)"},
198 {NODE_MATH_RADIANS, "RADIANS", 0, "To Radians", "Convert from degrees to radians"},
199 {NODE_MATH_DEGREES, "DEGREES", 0, "To Degrees", "Convert from radians to degrees"},
200 {0, nullptr, 0, nullptr, nullptr},
201};
202
204 {NODE_VECTOR_MATH_ADD, "ADD", 0, "Add", "A + B"},
205 {NODE_VECTOR_MATH_SUBTRACT, "SUBTRACT", 0, "Subtract", "A - B"},
206 {NODE_VECTOR_MATH_MULTIPLY, "MULTIPLY", 0, "Multiply", "Entry-wise multiply"},
207 {NODE_VECTOR_MATH_DIVIDE, "DIVIDE", 0, "Divide", "Entry-wise divide"},
208 {NODE_VECTOR_MATH_MULTIPLY_ADD, "MULTIPLY_ADD", 0, "Multiply Add", "A * B + C"},
210 {NODE_VECTOR_MATH_CROSS_PRODUCT, "CROSS_PRODUCT", 0, "Cross Product", "A cross B"},
211 {NODE_VECTOR_MATH_PROJECT, "PROJECT", 0, "Project", "Project A onto B"},
213 "REFLECT",
214 0,
215 "Reflect",
216 "Reflect A around the normal B. B does not need to be normalized."},
218 "REFRACT",
219 0,
220 "Refract",
221 "For a given incident vector A, surface normal B and ratio of indices of refraction, Ior, "
222 "refract returns the refraction vector, R"},
224 "FACEFORWARD",
225 0,
226 "Faceforward",
227 "Orients a vector A to point away from a surface B as defined by its normal C. "
228 "Returns (dot(B, C) < 0) ? A : -A"},
229 {NODE_VECTOR_MATH_DOT_PRODUCT, "DOT_PRODUCT", 0, "Dot Product", "A dot B"},
231 {NODE_VECTOR_MATH_DISTANCE, "DISTANCE", 0, "Distance", "Distance between A and B"},
232 {NODE_VECTOR_MATH_LENGTH, "LENGTH", 0, "Length", "Length of A"},
233 {NODE_VECTOR_MATH_SCALE, "SCALE", 0, "Scale", "A multiplied by Scale"},
234 {NODE_VECTOR_MATH_NORMALIZE, "NORMALIZE", 0, "Normalize", "Normalize A"},
236 {NODE_VECTOR_MATH_ABSOLUTE, "ABSOLUTE", 0, "Absolute", "Entry-wise absolute"},
237 {NODE_VECTOR_MATH_POWER, "POWER", 0, "Power", "Entry-wise power"},
238 {NODE_VECTOR_MATH_SIGN, "SIGN", 0, "Sign", "Entry-wise sign"},
239 {NODE_VECTOR_MATH_MINIMUM, "MINIMUM", 0, "Minimum", "Entry-wise minimum"},
240 {NODE_VECTOR_MATH_MAXIMUM, "MAXIMUM", 0, "Maximum", "Entry-wise maximum"},
241 {NODE_VECTOR_MATH_FLOOR, "FLOOR", 0, "Floor", "Entry-wise floor"},
242 {NODE_VECTOR_MATH_CEIL, "CEIL", 0, "Ceil", "Entry-wise ceil"},
243 {NODE_VECTOR_MATH_FRACTION, "FRACTION", 0, "Fraction", "The fraction part of A entry-wise"},
244 {NODE_VECTOR_MATH_MODULO, "MODULO", 0, "Modulo", "Entry-wise modulo using fmod(A,B)"},
245 {NODE_VECTOR_MATH_WRAP, "WRAP", 0, "Wrap", "Entry-wise wrap(A,B)"},
247 "SNAP",
248 0,
249 "Snap",
250 "Round A to the largest integer multiple of B less than or equal A"},
252 {NODE_VECTOR_MATH_SINE, "SINE", 0, "Sine", "Entry-wise sin(A)"},
253 {NODE_VECTOR_MATH_COSINE, "COSINE", 0, "Cosine", "Entry-wise cos(A)"},
254 {NODE_VECTOR_MATH_TANGENT, "TANGENT", 0, "Tangent", "Entry-wise tan(A)"},
255 {0, nullptr, 0, nullptr, nullptr},
256};
257
259 {NODE_BOOLEAN_MATH_AND, "AND", 0, "And", "True when both inputs are true"},
260 {NODE_BOOLEAN_MATH_OR, "OR", 0, "Or", "True when at least one input is true"},
261 {NODE_BOOLEAN_MATH_NOT, "NOT", 0, "Not", "Opposite of the input"},
263 {NODE_BOOLEAN_MATH_NAND, "NAND", 0, "Not And", "True when at least one input is false"},
264 {NODE_BOOLEAN_MATH_NOR, "NOR", 0, "Nor", "True when both inputs are false"},
266 "XNOR",
267 0,
268 "Equal",
269 "True when both inputs are equal (exclusive nor)"},
271 "XOR",
272 0,
273 "Not Equal",
274 "True when both inputs are different (exclusive or)"},
277 "IMPLY",
278 0,
279 "Imply",
280 "True unless the first input is true and the second is false"},
282 "NIMPLY",
283 0,
284 "Subtract",
285 "True when the first input is true and the second is false (not imply)"},
286 {0, nullptr, 0, nullptr, nullptr},
287};
288
291 {NODE_INTEGER_MATH_ADD, "ADD", 0, "Add", "A + B"},
292 {NODE_INTEGER_MATH_SUBTRACT, "SUBTRACT", 0, "Subtract", "A - B"},
293 {NODE_INTEGER_MATH_MULTIPLY, "MULTIPLY", 0, "Multiply", "A * B"},
294 {NODE_INTEGER_MATH_DIVIDE, "DIVIDE", 0, "Divide", "A / B"},
295 {NODE_INTEGER_MATH_MULTIPLY_ADD, "MULTIPLY_ADD", 0, "Multiply Add", "A * B + C"},
297 {NODE_INTEGER_MATH_ABSOLUTE, "ABSOLUTE", 0, "Absolute", "Non-negative value of A, abs(A)"},
298 {NODE_INTEGER_MATH_NEGATE, "NEGATE", 0, "Negate", "-A"},
299 {NODE_INTEGER_MATH_POWER, "POWER", 0, "Power", "A power B, pow(A,B)"},
302 "MINIMUM",
303 0,
304 "Minimum",
305 "The minimum value from A and B, min(A,B)"},
307 "MAXIMUM",
308 0,
309 "Maximum",
310 "The maximum value from A and B, max(A,B)"},
311 {NODE_INTEGER_MATH_SIGN, "SIGN", 0, "Sign", "Return the sign of A, sign(A)"},
314 "DIVIDE_ROUND",
315 0,
316 "Divide Round",
317 "Divide and round result toward zero"},
319 "DIVIDE_FLOOR",
320 0,
321 "Divide Floor",
322 "Divide and floor result, the largest integer smaller than or equal A"},
324 "DIVIDE_CEIL",
325 0,
326 "Divide Ceiling",
327 "Divide and ceil result, the smallest integer greater than or equal A"},
330 "FLOORED_MODULO",
331 0,
332 "Floored Modulo",
333 "Modulo that is periodic for both negative and positive operands"},
334 {NODE_INTEGER_MATH_MODULO, "MODULO", 0, "Modulo", "Modulo which is the remainder of A / B"},
337 "GCD",
338 0,
339 "Greatest Common Divisor",
340 "The largest positive integer that divides into each of the values A and B, "
341 "e.g. GCD(8,12) = 4"},
343 "LCM",
344 0,
345 "Least Common Multiple",
346 "The smallest positive integer that is divisible by both A and B, e.g. LCM(6,10) = 30"},
347 {0, nullptr, 0, nullptr, nullptr},
348};
349
352 "LESS_THAN",
353 0,
354 "Less Than",
355 "True when the first input is smaller than second input"},
357 "LESS_EQUAL",
358 0,
359 "Less Than or Equal",
360 "True when the first input is smaller than the second input or equal"},
362 "GREATER_THAN",
363 0,
364 "Greater Than",
365 "True when the first input is greater than the second input"},
367 "GREATER_EQUAL",
368 0,
369 "Greater Than or Equal",
370 "True when the first input is greater than the second input or equal"},
371 {NODE_COMPARE_EQUAL, "EQUAL", 0, "Equal", "True when both inputs are approximately equal"},
373 "NOT_EQUAL",
374 0,
375 "Not Equal",
376 "True when both inputs are not approximately equal"},
378 "BRIGHTER",
379 0,
380 "Brighter",
381 "True when the first input is brighter"},
382 {NODE_COMPARE_COLOR_DARKER, "DARKER", 0, "Darker", "True when the first input is darker"},
383 {0, nullptr, 0, nullptr, nullptr},
384};
385
388 "ROUND",
389 0,
390 "Round",
391 "Round the float up or down to the nearest integer"},
393 "FLOOR",
394 0,
395 "Floor",
396 "Round the float down to the next smallest integer"},
398 "CEILING",
399 0,
400 "Ceiling",
401 "Round the float up to the next largest integer"},
403 "TRUNCATE",
404 0,
405 "Truncate",
406 "Round the float to the closest integer in the direction of zero (floor if positive; ceiling "
407 "if negative)"},
408 {0, nullptr, 0, nullptr, nullptr},
409};
410
413 "LINEAR",
414 0,
415 "Linear",
416 "Linear interpolation between From Min and From Max values"},
418 "STEPPED",
419 0,
420 "Stepped Linear",
421 "Stepped linear interpolation between From Min and From Max values"},
423 "SMOOTHSTEP",
424 0,
425 "Smooth Step",
426 "Smooth Hermite edge interpolation between From Min and From Max values"},
428 "SMOOTHERSTEP",
429 0,
430 "Smoother Step",
431 "Smoother Hermite edge interpolation between From Min and From Max values"},
432 {0, nullptr, 0, nullptr, nullptr},
433};
434
436 {NODE_CLAMP_MINMAX, "MINMAX", 0, "Min Max", "Constrain value between min and max"},
438 "RANGE",
439 0,
440 "Range",
441 "Constrain value between min and max, swapping arguments when min > max"},
442 {0, nullptr, 0, nullptr, nullptr},
443};
444
446 {1, "1D", 0, "1D", "Use the scalar value W as input"},
447 {2, "2D", 0, "2D", "Use the 2D vector (X, Y) as input. The Z component is ignored."},
448 {3, "3D", 0, "3D", "Use the 3D vector (X, Y, Z) as input"},
449 {4, "4D", 0, "4D", "Use the 4D vector (X, Y, Z, W) as input"},
450 {0, nullptr, 0, nullptr, nullptr},
451};
452
455 "FREE",
456 ICON_HANDLE_FREE,
457 "Free",
458 "The handle can be moved anywhere, and does not influence the point's other handle"},
460 "AUTO",
461 ICON_HANDLE_AUTO,
462 "Auto",
463 "The location is automatically calculated to be smooth"},
465 "VECTOR",
466 ICON_HANDLE_VECTOR,
467 "Vector",
468 "The location is calculated to point to the next/previous control point"},
470 "ALIGN",
471 ICON_HANDLE_ALIGNED,
472 "Align",
473 "The location is constrained to point in the opposite direction as the other handle"},
474 {0, nullptr, 0, nullptr, nullptr}};
475
477 {GEO_NODE_CURVE_HANDLE_LEFT, "LEFT", ICON_NONE, "Left", "Use the left handles"},
478 {GEO_NODE_CURVE_HANDLE_RIGHT, "RIGHT", ICON_NONE, "Right", "Use the right handles"},
479 {0, nullptr, 0, nullptr, nullptr}};
480
483 "RGB",
484 ICON_NONE,
485 "RGB",
486 "Use RGB (Red, Green, Blue) color processing"},
488 "HSV",
489 ICON_NONE,
490 "HSV",
491 "Use HSV (Hue, Saturation, Value) color processing"},
493 "HSL",
494 ICON_NONE,
495 "HSL",
496 "Use HSL (Hue, Saturation, Lightness) color processing"},
497 {0, nullptr, 0, nullptr, nullptr},
498};
499
501 {SOCK_FLOAT, "FLOAT", ICON_NODE_SOCKET_FLOAT, "Float", ""},
502 {SOCK_VECTOR, "VECTOR", ICON_NODE_SOCKET_VECTOR, "Vector", ""},
503 {SOCK_RGBA, "RGBA", ICON_NODE_SOCKET_RGBA, "Color", ""},
504 {SOCK_ROTATION, "ROTATION", ICON_NODE_SOCKET_ROTATION, "Rotation", ""},
505 {0, nullptr, 0, nullptr, nullptr},
506};
507
509 {GEO_NODE_MESH_CIRCLE_FILL_NONE, "NONE", 0, "None", ""},
510 {GEO_NODE_MESH_CIRCLE_FILL_NGON, "NGON", 0, "N-Gon", ""},
511 {GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN, "TRIANGLE_FAN", 0, "Triangles", ""},
512 {0, nullptr, 0, nullptr, nullptr},
513};
514
516 {GEO_NODE_GIZMO_COLOR_PRIMARY, "PRIMARY", 0, "Primary", ""},
517 {GEO_NODE_GIZMO_COLOR_SECONDARY, "SECONDARY", 0, "Secondary", ""},
518 {GEO_NODE_GIZMO_COLOR_X, "X", 0, "X", ""},
519 {GEO_NODE_GIZMO_COLOR_Y, "Y", 0, "Y", ""},
520 {GEO_NODE_GIZMO_COLOR_Z, "Z", 0, "Z", ""},
521 {0, nullptr, 0, nullptr, nullptr},
522};
523
525 {GEO_NODE_LINEAR_GIZMO_DRAW_STYLE_ARROW, "ARROW", 0, "Arrow", ""},
526 {GEO_NODE_LINEAR_GIZMO_DRAW_STYLE_CROSS, "CROSS", 0, "Cross", ""},
527 {GEO_NODE_LINEAR_GIZMO_DRAW_STYLE_BOX, "BOX", 0, "Box", ""},
528 {0, nullptr, 0, nullptr, nullptr},
529};
530
533 "CLIP",
534 0,
535 N_("Clip"),
536 N_("Areas outside of the image are filled with zero")},
538 "EXTEND",
539 0,
540 N_("Extend"),
541 N_("Areas outside of the image are filled with the closest boundary pixel in the image")},
543 "REPEAT",
544 0,
545 N_("Repeat"),
546 N_("Areas outside of the image are filled with repetitions of the image")},
547 {0, nullptr, 0, nullptr, nullptr},
548};
549
551 {CMP_NODE_INTERPOLATION_NEAREST, "NEAREST", 0, N_("Nearest"), N_("Use Nearest interpolation")},
553 "BILINEAR",
554 0,
555 N_("Bilinear"),
556 N_("Use Bilinear interpolation")},
558 "BICUBIC",
559 0,
560 N_("Bicubic"),
561 N_("Use Cubic B-Spline interpolation")},
563 "ANISOTROPIC",
564 0,
565 N_("Anisotropic"),
566 N_("Use Anisotropic interpolation")},
567 {0, nullptr, 0, nullptr, nullptr},
568};
569
570#ifndef RNA_RUNTIME
571
574 "ALL",
575 0,
576 "All",
577 "Use shaders for all renderers and viewports, unless there exists a more specific output"},
578 {SHD_OUTPUT_EEVEE, "EEVEE", 0, "EEVEE", "Use shaders for EEVEE renderer"},
579 {SHD_OUTPUT_CYCLES, "CYCLES", 0, "Cycles", "Use shaders for Cycles renderer"},
580 {0, nullptr, 0, nullptr, nullptr},
581};
582
584 {0, "CryptoObject", 0, "Object", "Use Object layer"},
585 {1, "CryptoMaterial", 0, "Material", "Use Material layer"},
586 {2, "CryptoAsset", 0, "Asset", "Use Asset layer"},
587 {0, nullptr, 0, nullptr, nullptr},
588};
589
590#endif /* !RNA_RUNTIME */
591
592#undef ITEM_ATTRIBUTE
593#undef ITEM_FLOAT
594#undef ITEM_VECTOR
595#undef ITEM_COLOR
596#undef ITEM_BOOLEAN
597
598#ifdef RNA_RUNTIME
599
600# include <fmt/format.h>
601
602# include "BLI_string.h"
603# include "BLI_string_utf8.h"
604
605# include "BKE_context.hh"
606# include "BKE_cryptomatte.hh"
607# include "BKE_global.hh"
608# include "BKE_image.hh"
609# include "BKE_main_invariants.hh"
610# include "BKE_node_legacy_types.hh"
611# include "BKE_node_runtime.hh"
612# include "BKE_node_tree_update.hh"
613# include "BKE_report.hh"
614# include "BKE_scene.hh"
615# include "BKE_texture.h"
616
617# include "BLF_api.hh"
618
619# include "ED_node.hh"
620# include "ED_render.hh"
621
622# include "GPU_material.hh"
623
624# include "NOD_common.hh"
625# include "NOD_composite.hh"
627# include "NOD_fn_format_string.hh"
628# include "NOD_geo_bake.hh"
629# include "NOD_geo_bundle.hh"
631# include "NOD_geo_closure.hh"
632# include "NOD_geo_field_to_grid.hh"
634# include "NOD_geo_index_switch.hh"
635# include "NOD_geo_menu_switch.hh"
636# include "NOD_geo_repeat.hh"
637# include "NOD_geo_simulation.hh"
638# include "NOD_geo_viewer.hh"
639# include "NOD_geometry.hh"
641# include "NOD_rna_define.hh"
642# include "NOD_shader.h"
643# include "NOD_socket.hh"
644# include "NOD_socket_items.hh"
645# include "NOD_texture.h"
646
647# include "RE_engine.h"
648# include "RE_pipeline.h"
649# include "RE_texture.h"
650
651# include "DNA_scene_types.h"
652# include "DNA_text_types.h"
653
654# include "WM_api.hh"
655
656# include "DEG_depsgraph_query.hh"
657
658using blender::float2;
678
679extern FunctionRNA rna_NodeTree_poll_func;
680extern FunctionRNA rna_NodeTree_update_func;
681extern FunctionRNA rna_NodeTree_get_from_context_func;
682extern FunctionRNA rna_NodeTree_valid_socket_type_func;
683extern FunctionRNA rna_Node_poll_func;
684extern FunctionRNA rna_Node_poll_instance_func;
685extern FunctionRNA rna_Node_update_func;
686extern FunctionRNA rna_Node_insert_link_func;
687extern FunctionRNA rna_Node_init_func;
688extern FunctionRNA rna_Node_copy_func;
689extern FunctionRNA rna_Node_free_func;
690extern FunctionRNA rna_Node_draw_buttons_func;
691extern FunctionRNA rna_Node_draw_buttons_ext_func;
692extern FunctionRNA rna_Node_draw_label_func;
693
694void rna_Node_socket_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr);
695
696int rna_node_tree_idname_to_enum(const char *idname)
697{
698 using namespace blender;
700 for (const int i : types.index_range()) {
701 const bke::bNodeTreeType *nt = types[i];
702 if (nt->idname == idname) {
703 return i;
704 }
705 }
706 return -1;
707}
708
710{
712 return types.index_range().contains(value) ? types[value] : nullptr;
713}
714
716 void *data, bool (*poll)(void *data, blender::bke::bNodeTreeType *), bool *r_free)
717{
718 using namespace blender;
719 EnumPropertyItem tmp = {0};
720 EnumPropertyItem *item = nullptr;
721 int totitem = 0;
722
724 for (const int i : types.index_range()) {
726 if (poll && !poll(data, nt)) {
727 continue;
728 }
729
730 tmp.value = i;
731 tmp.identifier = nt->idname.c_str();
732 tmp.icon = nt->ui_icon;
733 tmp.name = nt->ui_name.c_str();
734 tmp.description = nt->ui_description.c_str();
735
736 RNA_enum_item_add(&item, &totitem, &tmp);
737 }
738
739 if (totitem == 0) {
740 *r_free = false;
742 }
743
744 RNA_enum_item_end(&item, &totitem);
745 *r_free = true;
746
747 return item;
748}
749
750int rna_node_socket_idname_to_enum(const char *idname)
751{
752 using namespace blender;
753
755
756 /* Regular socket types use the base type as their enum value.
757 * Custom sockets don't have a base type and are used directly as the enum entry. */
758 if (socket_type->type == SOCK_CUSTOM) {
759 return bke::node_socket_types_get().first_index(socket_type);
760 }
761
762 bke::bNodeSocketType *base_socket_type = bke::node_socket_type_find_static(socket_type->type,
763 PROP_NONE);
764 BLI_assert(base_socket_type != nullptr);
765 return bke::node_socket_types_get().first_index(base_socket_type);
766}
767
769{
771 return types.index_range().contains(value) ? types[value] : nullptr;
772}
773
775 void *data, bool (*poll)(void *data, blender::bke::bNodeSocketType *), bool *r_free)
776{
777 using namespace blender;
778 EnumPropertyItem *item = nullptr;
779 EnumPropertyItem tmp = {0};
780 int totitem = 0;
781 StructRNA *srna;
782
784 for (const int i : types.index_range()) {
785 bke::bNodeSocketType *stype = types[i];
786 if (poll && !poll(data, stype)) {
787 continue;
788 }
789
790 srna = stype->ext_socket.srna;
791 tmp.value = i;
792 tmp.identifier = stype->idname.c_str();
793 tmp.icon = RNA_struct_ui_icon(srna);
796
797 RNA_enum_item_add(&item, &totitem, &tmp);
798 }
799
800 if (totitem == 0) {
801 *r_free = false;
803 }
804
805 RNA_enum_item_end(&item, &totitem);
806 *r_free = true;
807
808 return item;
809}
810
811static const char *get_legacy_node_type(const PointerRNA *ptr)
812{
813 const bNode *node = ptr->data_as<bNode>();
814 const blender::bke::bNodeType *ntype = node->typeinfo;
815 if (ntype->type_legacy == NODE_CUSTOM) {
816 return "CUSTOM";
817 }
818 if (ntype->type_legacy == NODE_CUSTOM_GROUP) {
819 return "CUSTOM GROUP";
820 }
821 if (ntype->type_legacy == NODE_UNDEFINED) {
822 return "UNDEFINED";
823 }
824 if (ntype->enum_name_legacy) {
825 return ntype->enum_name_legacy;
826 }
827 return ntype->idname.c_str();
828}
829
830static int rna_node_type_length(PointerRNA *ptr)
831{
832 const char *legacy_type = get_legacy_node_type(ptr);
833 BLI_assert(legacy_type);
834 return strlen(legacy_type);
835}
836
837static void rna_node_type_get(PointerRNA *ptr, char *value)
838{
839 const char *legacy_type = get_legacy_node_type(ptr);
840 BLI_assert(legacy_type);
841 strcpy(value, legacy_type);
842}
843
844static void rna_Node_bl_idname_get(PointerRNA *ptr, char *value)
845{
846 const bNode *node = ptr->data_as<bNode>();
847 const blender::bke::bNodeType *ntype = node->typeinfo;
848 blender::StringRef(ntype->idname).copy_unsafe(value);
849}
850
851static int rna_Node_bl_idname_length(PointerRNA *ptr)
852{
853 const bNode *node = ptr->data_as<bNode>();
854 const blender::bke::bNodeType *ntype = node->typeinfo;
855 return ntype->idname.size();
856}
857
858static void rna_Node_bl_idname_set(PointerRNA *ptr, const char *value)
859{
860 bNode *node = ptr->data_as<bNode>();
861 blender::bke::bNodeType *ntype = node->typeinfo;
862 ntype->idname = value;
863}
864
865static void rna_Node_bl_label_get(PointerRNA *ptr, char *value)
866{
867 const bNode *node = ptr->data_as<bNode>();
868 const blender::bke::bNodeType *ntype = node->typeinfo;
869 blender::StringRef(ntype->ui_name).copy_unsafe(value);
870}
871
872static int rna_Node_bl_label_length(PointerRNA *ptr)
873{
874 const bNode *node = ptr->data_as<bNode>();
875 const blender::bke::bNodeType *ntype = node->typeinfo;
876 return ntype->ui_name.size();
877}
878
879static void rna_Node_bl_label_set(PointerRNA *ptr, const char *value)
880{
881 bNode *node = ptr->data_as<bNode>();
882 blender::bke::bNodeType *ntype = node->typeinfo;
883 ntype->ui_name = value;
884}
885
886static void rna_Node_bl_description_get(PointerRNA *ptr, char *value)
887{
888 const bNode *node = ptr->data_as<bNode>();
889 const blender::bke::bNodeType *ntype = node->typeinfo;
890 blender::StringRef(ntype->ui_description).copy_unsafe(value);
891}
892
893static int rna_Node_bl_description_length(PointerRNA *ptr)
894{
895 const bNode *node = ptr->data_as<bNode>();
896 const blender::bke::bNodeType *ntype = node->typeinfo;
897 return ntype->ui_description.size();
898}
899
900static void rna_Node_bl_description_set(PointerRNA *ptr, const char *value)
901{
902 bNode *node = ptr->data_as<bNode>();
903 blender::bke::bNodeType *ntype = node->typeinfo;
904 ntype->ui_description = value;
905}
906
907static float2 node_parent_offset(const bNode &node)
908{
909 return node.parent ? float2(node.parent->location[0], node.parent->location[1]) : float2(0);
910}
911
912static void rna_Node_location_get(PointerRNA *ptr, float *value)
913{
914 const bNode *node = ptr->data_as<bNode>();
915 copy_v2_v2(value, float2(node->location[0], node->location[1]) - node_parent_offset(*node));
916}
917
918static void move_child_nodes(bNode &node, const float2 &delta)
919{
920 for (bNode *child : node.direct_children_in_frame()) {
921 child->location[0] += delta.x;
922 child->location[1] += delta.y;
923 if (child->is_frame()) {
924 move_child_nodes(*child, delta);
925 }
926 }
927}
928
929static void rna_Node_location_set(PointerRNA *ptr, const float *value)
930{
931 bNode *node = ptr->data_as<bNode>();
932 const float2 new_location = float2(value) + node_parent_offset(*node);
933 if (node->is_frame()) {
934 move_child_nodes(*node, new_location - float2(node->location[0], node->location[1]));
935 }
936 node->location[0] = new_location.x;
937 node->location[1] = new_location.y;
938}
939
940/* ******** Node Tree ******** */
941
942static StructRNA *rna_NodeTree_refine(PointerRNA *ptr)
943{
944 bNodeTree *ntree = ptr->data_as<bNodeTree>();
945
946 if (ntree->typeinfo->rna_ext.srna) {
947 return ntree->typeinfo->rna_ext.srna;
948 }
949 else {
950 return &RNA_NodeTree;
951 }
952}
953
954static bool rna_NodeTree_poll(const bContext *C, blender::bke::bNodeTreeType *ntreetype)
955{
956 ParameterList list;
957 FunctionRNA *func;
958 void *ret;
959 bool visible;
960
962 nullptr, ntreetype->rna_ext.srna, nullptr); /* dummy */
963 func = &rna_NodeTree_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
964
965 RNA_parameter_list_create(&list, &ptr, func);
966 RNA_parameter_set_lookup(&list, "context", &C);
967 ntreetype->rna_ext.call(const_cast<bContext *>(C), &ptr, func, &list);
968
969 RNA_parameter_get_lookup(&list, "visible", &ret);
970 visible = *static_cast<bool *>(ret);
971
973
974 return visible;
975}
976
977static void rna_NodeTree_update_reg(bNodeTree *ntree)
978{
979 ParameterList list;
980 FunctionRNA *func;
981
983 func = &rna_NodeTree_update_func; /* RNA_struct_find_function(&ptr, "update"); */
984
985 RNA_parameter_list_create(&list, &ptr, func);
986 ntree->typeinfo->rna_ext.call(nullptr, &ptr, func, &list);
987
989}
990
991static void rna_NodeTree_get_from_context(const bContext *C,
993 bNodeTree **r_ntree,
994 ID **r_id,
995 ID **r_from)
996{
997 ParameterList list;
998 FunctionRNA *func;
999 void *ret1, *ret2, *ret3;
1000
1002 nullptr, ntreetype->rna_ext.srna, nullptr); /* dummy */
1003 // RNA_struct_find_function(&ptr, "get_from_context");
1004 func = &rna_NodeTree_get_from_context_func;
1005
1006 RNA_parameter_list_create(&list, &ptr, func);
1007 RNA_parameter_set_lookup(&list, "context", &C);
1008 ntreetype->rna_ext.call(const_cast<bContext *>(C), &ptr, func, &list);
1009
1010 RNA_parameter_get_lookup(&list, "result_1", &ret1);
1011 RNA_parameter_get_lookup(&list, "result_2", &ret2);
1012 RNA_parameter_get_lookup(&list, "result_3", &ret3);
1013 *r_ntree = *(bNodeTree **)ret1;
1014 *r_id = *(ID **)ret2;
1015 *r_from = *(ID **)ret3;
1016
1018}
1019
1020static bool rna_NodeTree_valid_socket_type(blender::bke::bNodeTreeType *ntreetype,
1021 blender::bke::bNodeSocketType *socket_type)
1022{
1023 ParameterList list;
1024 FunctionRNA *func;
1025 void *ret;
1026 bool valid;
1027
1029 nullptr, ntreetype->rna_ext.srna, nullptr); /* dummy */
1030 func = &rna_NodeTree_valid_socket_type_func;
1031
1032 RNA_parameter_list_create(&list, &ptr, func);
1033 RNA_parameter_set_lookup(&list, "idname", socket_type->idname.c_str());
1034 ntreetype->rna_ext.call(nullptr, &ptr, func, &list);
1035
1036 RNA_parameter_get_lookup(&list, "valid", &ret);
1037 valid = *static_cast<bool *>(ret);
1038
1040
1041 return valid;
1042}
1043
1044static bool rna_NodeTree_unregister(Main *bmain, StructRNA *type)
1045{
1048
1049 if (!nt) {
1050 return false;
1051 }
1052
1055
1057
1058 /* update while blender is running */
1061 return true;
1062}
1063
1064static StructRNA *rna_NodeTree_register(Main *bmain,
1065 ReportList *reports,
1066 void *data,
1067 const char *identifier,
1068 StructValidateFunc validate,
1069 StructCallbackFunc call,
1071{
1073 bNodeTree dummy_ntree = {};
1074 bool have_function[4];
1075
1076 /* setup dummy tree & tree type to store static properties in */
1077 blender::bke::bNodeTreeType dummy_nt = {};
1078 dummy_ntree.typeinfo = &dummy_nt;
1079 PointerRNA dummy_ntree_ptr = RNA_pointer_create_discrete(nullptr, &RNA_NodeTree, &dummy_ntree);
1080
1081 /* validate the python class */
1082 if (validate(&dummy_ntree_ptr, data, have_function) != 0) {
1083 return nullptr;
1084 }
1085
1086 if (strlen(identifier) >= sizeof(dummy_ntree.idname)) {
1087 BKE_reportf(reports,
1088 RPT_ERROR,
1089 "Registering node tree class: '%s' is too long, maximum length is %d",
1090 identifier,
1091 int(sizeof(dummy_ntree.idname)));
1092 return nullptr;
1093 }
1094
1095 /* check if we have registered this tree type before, and remove it */
1097 if (nt) {
1098 BKE_reportf(reports,
1099 RPT_INFO,
1100 "Registering node tree class: '%s', bl_idname '%s' has been registered before, "
1101 "unregistering previous",
1102 identifier,
1103 dummy_nt.idname.c_str());
1104
1105 /* NOTE: unlike most types `nt->rna_ext.srna` doesn't need to be checked for nullptr. */
1106 if (!rna_NodeTree_unregister(bmain, nt->rna_ext.srna)) {
1107 BKE_reportf(reports,
1108 RPT_ERROR,
1109 "Registering node tree class: '%s', bl_idname '%s' could not be unregistered",
1110 identifier,
1111 dummy_nt.idname.c_str());
1112 return nullptr;
1113 }
1114 }
1115
1116 /* create a new node tree type */
1117 nt = MEM_new<blender::bke::bNodeTreeType>(__func__, dummy_nt);
1118
1119 nt->type = NTREE_CUSTOM;
1120
1121 nt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, nt->idname.c_str(), &RNA_NodeTree);
1122 nt->rna_ext.data = data;
1123 nt->rna_ext.call = call;
1124 nt->rna_ext.free = free;
1126
1127 RNA_def_struct_ui_text(nt->rna_ext.srna, nt->ui_name.c_str(), nt->ui_description.c_str());
1129
1130 nt->poll = (have_function[0]) ? rna_NodeTree_poll : nullptr;
1131 nt->update = (have_function[1]) ? rna_NodeTree_update_reg : nullptr;
1132 nt->get_from_context = (have_function[2]) ? rna_NodeTree_get_from_context : nullptr;
1133 nt->valid_socket_type = (have_function[3]) ? rna_NodeTree_valid_socket_type : nullptr;
1134
1136
1137 /* update while blender is running */
1140 return nt->rna_ext.srna;
1141}
1142
1143static bool rna_NodeTree_check(bNodeTree *ntree, ReportList *reports)
1144{
1146 if (reports) {
1147 BKE_reportf(reports,
1148 RPT_ERROR,
1149 "Node tree '%s' has undefined type %s",
1150 ntree->id.name + 2,
1151 ntree->idname);
1152 }
1153 return false;
1154 }
1155 else {
1156 return true;
1157 }
1158}
1159
1160static void rna_NodeTree_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
1161{
1162 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
1163
1166
1167 BKE_main_ensure_invariants(*bmain, ntree->id);
1168}
1169
1170static void rna_NodeTree_update_asset(Main *bmain, Scene *scene, PointerRNA *ptr)
1171{
1172 rna_NodeTree_update(bmain, scene, ptr);
1174 blender::bke::node_update_asset_metadata(*reinterpret_cast<bNodeTree *>(ptr->owner_id));
1175}
1176
1177static const EnumPropertyItem *rna_NodeTree_color_tag_itemf(bContext * /*C*/,
1178 PointerRNA *ptr,
1179 PropertyRNA * /*prop*/,
1180 bool *r_free)
1181{
1182 const bNodeTree &ntree = *reinterpret_cast<const bNodeTree *>(ptr->owner_id);
1183
1184 EnumPropertyItem *items = nullptr;
1185 int items_num = 0;
1186
1187 for (const EnumPropertyItem *item = rna_enum_node_color_tag_items; item->identifier; item++) {
1188 switch (blender::bke::NodeColorTag(item->value)) {
1191 if (ntree.type == NTREE_GEOMETRY) {
1192 RNA_enum_item_add(&items, &items_num, item);
1193 }
1194 break;
1195 }
1198 if (ntree.type == NTREE_SHADER) {
1199 RNA_enum_item_add(&items, &items_num, item);
1200 }
1201 break;
1202 }
1206 if (ntree.type == NTREE_COMPOSIT) {
1207 RNA_enum_item_add(&items, &items_num, item);
1208 }
1209 break;
1210 }
1214 break;
1215 }
1216 default: {
1217 RNA_enum_item_add(&items, &items_num, item);
1218 break;
1219 }
1220 }
1221 }
1222
1223 RNA_enum_item_end(&items, &items_num);
1224
1225 *r_free = true;
1226 return items;
1227}
1228
1229static bNode *rna_NodeTree_node_new(bNodeTree *ntree,
1230 bContext *C,
1231 ReportList *reports,
1233{
1235 bNode *node;
1236
1237 if (!rna_NodeTree_check(ntree, reports)) {
1238 return nullptr;
1239 }
1240
1241 /* If the given idname is an alias, translate it to the proper idname. */
1243
1244 ntype = blender::bke::node_type_find(type);
1245 if (!ntype) {
1246 BKE_reportf(reports, RPT_ERROR, "Node type %s undefined", type.c_str());
1247 return nullptr;
1248 }
1249
1250 const char *disabled_hint = nullptr;
1251 if (ntype->poll && !ntype->poll(ntype, ntree, &disabled_hint)) {
1252 if (disabled_hint) {
1253 BKE_reportf(reports,
1254 RPT_ERROR,
1255 "Cannot add node of type %s to node tree '%s'\n %s",
1256 type.c_str(),
1257 ntree->id.name + 2,
1258 disabled_hint);
1259 return nullptr;
1260 }
1261 else {
1262 BKE_reportf(reports,
1263 RPT_ERROR,
1264 "Cannot add node of type %s to node tree '%s'",
1265 type.c_str(),
1266 ntree->id.name + 2);
1267 return nullptr;
1268 }
1269 }
1270
1271 node = blender::bke::node_add_node(C, *ntree, type);
1272 BLI_assert(node && node->typeinfo);
1273
1274 if (ntree->type == NTREE_TEXTURE) {
1275 ntreeTexCheckCyclics(ntree);
1276 }
1277
1278 Main *bmain = CTX_data_main(C);
1279 BKE_main_ensure_invariants(*bmain, ntree->id);
1281
1282 return node;
1283}
1284
1285static void rna_NodeTree_node_remove(bNodeTree *ntree,
1286 Main *bmain,
1287 ReportList *reports,
1288 PointerRNA *node_ptr)
1289{
1290 bNode *node = node_ptr->data_as<bNode>();
1291
1292 if (!rna_NodeTree_check(ntree, reports)) {
1293 return;
1294 }
1295
1296 if (BLI_findindex(&ntree->nodes, node) == -1) {
1297 BKE_reportf(reports, RPT_ERROR, "Unable to locate node '%s' in node tree", node->name);
1298 return;
1299 }
1300
1301 blender::bke::node_remove_node(bmain, *ntree, *node, true);
1302
1303 node_ptr->invalidate();
1304
1305 BKE_main_ensure_invariants(*bmain, ntree->id);
1307}
1308
1309static void rna_NodeTree_node_clear(bNodeTree *ntree, Main *bmain, ReportList *reports)
1310{
1311 bNode *node = static_cast<bNode *>(ntree->nodes.first);
1312
1313 if (!rna_NodeTree_check(ntree, reports)) {
1314 return;
1315 }
1316
1317 while (node) {
1318 bNode *next_node = node->next;
1319
1320 blender::bke::node_remove_node(bmain, *ntree, *node, true);
1321
1322 node = next_node;
1323 }
1324
1325 BKE_main_ensure_invariants(*bmain, ntree->id);
1327}
1328
1329static PointerRNA rna_NodeTree_active_node_get(PointerRNA *ptr)
1330{
1331 bNodeTree *ntree = ptr->data_as<bNodeTree>();
1332 bNode *node = blender::bke::node_get_active(*ntree);
1333 return RNA_pointer_create_with_parent(*ptr, &RNA_Node, node);
1334}
1335
1336static void rna_NodeTree_active_node_set(PointerRNA *ptr,
1337 const PointerRNA value,
1338 ReportList * /*reports*/)
1339{
1340 bNodeTree *ntree = ptr->data_as<bNodeTree>();
1341 bNode *node = static_cast<bNode *>(value.data);
1342
1343 if (node && BLI_findindex(&ntree->nodes, node) != -1) {
1344 blender::bke::node_set_active(*ntree, *node);
1345
1346 /* Handle NODE_DO_OUTPUT as well. */
1347 if (node->typeinfo->nclass == NODE_CLASS_OUTPUT && node->type_legacy != CMP_NODE_OUTPUT_FILE) {
1348 /* If this node becomes the active output, the others of the same type can't be the active
1349 * output anymore. */
1350 for (bNode *other_node : ntree->all_nodes()) {
1351 if (other_node->type_legacy == node->type_legacy) {
1352 other_node->flag &= ~NODE_DO_OUTPUT;
1353 }
1354 }
1355 node->flag |= NODE_DO_OUTPUT;
1358 }
1359 }
1360 else {
1362 }
1363}
1364
1365static void node_viewer_set_shortcut_fn(bNode *node, bNodeTree &ntree, int value)
1366{
1367 /* Avoid having two nodes with the same shortcut. */
1368 for (bNode *other_node : ntree.all_nodes()) {
1369 if ((other_node->is_type("CompositorNodeViewer") ||
1370 other_node->is_type("GeometryNodeViewer")) &&
1371 other_node->custom1 == value)
1372 {
1373 other_node->custom1 = NODE_VIEWER_SHORTCUT_NONE;
1374 }
1375 }
1376 node->custom1 = value;
1377}
1378
1379void rna_Node_Viewer_shortcut_node_set(PointerRNA *ptr, PropertyRNA * /*prop*/, int value)
1380{
1381 bNode *curr_node = ptr->data_as<bNode>();
1382 bNodeTree &ntree = curr_node->owner_tree();
1383
1384 node_viewer_set_shortcut_fn(curr_node, ntree, value);
1385}
1386
1388{
1389 bNode *curr_node = ptr->data_as<bNode>();
1390 bNodeTree &ntree = curr_node->owner_tree();
1391
1392 node_viewer_set_shortcut_fn(curr_node, ntree, value);
1393}
1394
1395static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree,
1396 Main *bmain,
1397 ReportList *reports,
1398 bNodeSocket *fromsock,
1399 bNodeSocket *tosock,
1400 bool verify_limits,
1401 bool handle_dynamic_sockets)
1402{
1403 if (!rna_NodeTree_check(ntree, reports)) {
1404 return nullptr;
1405 }
1406
1407 bNode *fromnode = blender::bke::node_find_node_try(*ntree, *fromsock);
1408 bNode *tonode = blender::bke::node_find_node_try(*ntree, *tosock);
1409 /* check validity of the sockets:
1410 * if sockets from different trees are passed in this will fail!
1411 */
1412 if (!fromnode || !tonode) {
1413 return nullptr;
1414 }
1415
1416 if (fromsock->in_out == tosock->in_out) {
1417 BKE_report(reports, RPT_ERROR, "Same input/output direction of sockets");
1418 return nullptr;
1419 }
1420
1421 if (fromsock->in_out == SOCK_IN) {
1422 std::swap(fromsock, tosock);
1423 std::swap(fromnode, tonode);
1424 }
1425
1426 if (handle_dynamic_sockets) {
1427 bNodeLink new_link{};
1428 new_link.fromnode = fromnode;
1429 new_link.fromsock = fromsock;
1430 new_link.tonode = tonode;
1431 new_link.tosock = tosock;
1432
1433 if (fromnode->typeinfo->insert_link) {
1434 blender::bke::NodeInsertLinkParams params{*ntree, *fromnode, new_link};
1435 if (!fromnode->typeinfo->insert_link(params)) {
1436 return nullptr;
1437 }
1438 }
1439 if (tonode->typeinfo->insert_link) {
1440 blender::bke::NodeInsertLinkParams params{*ntree, *tonode, new_link};
1441 if (!tonode->typeinfo->insert_link(params)) {
1442 return nullptr;
1443 }
1444 }
1445
1446 fromsock = new_link.fromsock;
1447 tosock = new_link.tosock;
1448 }
1449
1450 if (verify_limits) {
1451 /* remove other socket links if limit is exceeded */
1452 if (blender::bke::node_count_socket_links(*ntree, *fromsock) + 1 >
1454 {
1455 blender::bke::node_remove_socket_links(*ntree, *fromsock);
1456 }
1457 if (blender::bke::node_count_socket_links(*ntree, *tosock) + 1 >
1459 {
1461 }
1462 if (tosock->flag & SOCK_MULTI_INPUT) {
1463 LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) {
1464 if (link->fromsock == fromsock && link->tosock == tosock) {
1465 blender::bke::node_remove_link(ntree, *link);
1466 }
1467 }
1468 }
1469 }
1470
1471 bNodeLink &ret = blender::bke::node_add_link(*ntree, *fromnode, *fromsock, *tonode, *tosock);
1472
1473 /* not an issue from the UI, clear hidden from API to keep valid state. */
1474 fromsock->flag &= ~SOCK_HIDDEN;
1475 tosock->flag &= ~SOCK_HIDDEN;
1476
1477 BKE_main_ensure_invariants(*bmain, ntree->id);
1479
1480 return &ret;
1481}
1482
1483static void rna_NodeTree_link_remove(bNodeTree *ntree,
1484 Main *bmain,
1485 ReportList *reports,
1486 PointerRNA *link_ptr)
1487{
1488 bNodeLink *link = link_ptr->data_as<bNodeLink>();
1489
1490 if (!rna_NodeTree_check(ntree, reports)) {
1491 return;
1492 }
1493
1494 if (BLI_findindex(&ntree->links, link) == -1) {
1495 BKE_report(reports, RPT_ERROR, "Unable to locate link in node tree");
1496 return;
1497 }
1498
1499 blender::bke::node_remove_link(ntree, *link);
1500 link_ptr->invalidate();
1501
1502 BKE_main_ensure_invariants(*bmain, ntree->id);
1504}
1505
1506static void rna_NodeTree_link_clear(bNodeTree *ntree, Main *bmain, ReportList *reports)
1507{
1508 bNodeLink *link = static_cast<bNodeLink *>(ntree->links.first);
1509
1510 if (!rna_NodeTree_check(ntree, reports)) {
1511 return;
1512 }
1513
1514 while (link) {
1515 bNodeLink *next_link = link->next;
1516
1517 blender::bke::node_remove_link(ntree, *link);
1518
1519 link = next_link;
1520 }
1521 BKE_main_ensure_invariants(*bmain, ntree->id);
1523}
1524
1525static bool rna_NodeTree_contains_tree(bNodeTree *tree, bNodeTree *sub_tree)
1526{
1527 return blender::bke::node_tree_contains_tree(*tree, *sub_tree);
1528}
1529
1530static void rna_NodeTree_bl_idname_get(PointerRNA *ptr, char *value)
1531{
1532 const bNodeTree *node = ptr->data_as<bNodeTree>();
1533 const blender::bke::bNodeTreeType *ntype = node->typeinfo;
1534 blender::StringRef(ntype->idname).copy_unsafe(value);
1535}
1536
1537static int rna_NodeTree_bl_idname_length(PointerRNA *ptr)
1538{
1539 const bNodeTree *node = ptr->data_as<bNodeTree>();
1540 const blender::bke::bNodeTreeType *ntype = node->typeinfo;
1541 return ntype->idname.size();
1542}
1543
1544static void rna_NodeTree_bl_idname_set(PointerRNA *ptr, const char *value)
1545{
1546 bNodeTree *node = ptr->data_as<bNodeTree>();
1548 ntype->idname = value;
1549}
1550
1551static void rna_NodeTree_bl_label_get(PointerRNA *ptr, char *value)
1552{
1553 const bNodeTree *node = ptr->data_as<bNodeTree>();
1554 const blender::bke::bNodeTreeType *ntype = node->typeinfo;
1555 blender::StringRef(ntype->ui_name).copy_unsafe(value);
1556}
1557
1558static int rna_NodeTree_bl_label_length(PointerRNA *ptr)
1559{
1560 const bNodeTree *node = ptr->data_as<bNodeTree>();
1561 const blender::bke::bNodeTreeType *ntype = node->typeinfo;
1562 return ntype->ui_name.size();
1563}
1564
1565static void rna_NodeTree_bl_label_set(PointerRNA *ptr, const char *value)
1566{
1567 bNodeTree *node = ptr->data_as<bNodeTree>();
1569 ntype->ui_name = value;
1570}
1571
1572static void rna_NodeTree_bl_description_get(PointerRNA *ptr, char *value)
1573{
1574 const bNodeTree *node = ptr->data_as<bNodeTree>();
1575 const blender::bke::bNodeTreeType *ntype = node->typeinfo;
1576 blender::StringRef(ntype->ui_description).copy_unsafe(value);
1577}
1578
1579static int rna_NodeTree_bl_description_length(PointerRNA *ptr)
1580{
1581 const bNodeTree *node = ptr->data_as<bNodeTree>();
1582 const blender::bke::bNodeTreeType *ntype = node->typeinfo;
1583 return ntype->ui_description.size();
1584}
1585
1586static void rna_NodeTree_bl_description_set(PointerRNA *ptr, const char *value)
1587{
1588 bNodeTree *node = ptr->data_as<bNodeTree>();
1590 ntype->ui_description = value;
1591}
1592
1593static void rna_NodeTree_debug_lazy_function_graph(bNodeTree *tree,
1594 bContext *C,
1595 const char **r_str,
1596 int *r_len)
1597{
1598 *r_len = 0;
1599 *r_str = nullptr;
1600 if (DEG_is_original(tree)) {
1601 /* The graph is only stored on the evaluated data. */
1604 };
1605 if (tree->runtime->geometry_nodes_lazy_function_graph_info_mutex.is_dirty()) {
1606 return;
1607 }
1608 std::string dot_str = tree->runtime->geometry_nodes_lazy_function_graph_info->graph.to_dot();
1609 *r_str = BLI_strdup(dot_str.c_str());
1610 *r_len = dot_str.size();
1611}
1612
1613static void rna_NodeTree_debug_zone_body_lazy_function_graph(
1614 ID *tree_id, bNode *node, bContext *C, const char **r_str, int *r_len)
1615{
1616 *r_len = 0;
1617 *r_str = nullptr;
1618 bNodeTree *tree = reinterpret_cast<bNodeTree *>(tree_id);
1619 if (DEG_is_original(tree)) {
1620 /* The graph is only stored on the evaluated data. */
1623 }
1624 if (tree->runtime->geometry_nodes_lazy_function_graph_info_mutex.is_dirty()) {
1625 return;
1626 }
1627 const auto *graph = tree->runtime->geometry_nodes_lazy_function_graph_info
1628 ->debug_zone_body_graphs.lookup_default(node->identifier, nullptr);
1629 if (!graph) {
1630 return;
1631 }
1632 std::string dot_str = graph->to_dot();
1633 *r_str = BLI_strdup(dot_str.c_str());
1634 *r_len = dot_str.size();
1635}
1636
1637static void rna_NodeTree_debug_zone_lazy_function_graph(
1638 ID *tree_id, bNode *node, bContext *C, const char **r_str, int *r_len)
1639{
1640 *r_len = 0;
1641 *r_str = nullptr;
1642 Main *bmain = CTX_data_main(C);
1644 bNodeTree *tree = reinterpret_cast<bNodeTree *>(tree_id);
1645
1646 if (tree->type != NTREE_GEOMETRY) {
1647 return;
1648 }
1649 /* By creating this data we tell the evaluation that we want to log it. */
1650 tree->runtime->logged_zone_graphs = std::make_unique<blender::bke::LoggedZoneGraphs>();
1651 BLI_SCOPED_DEFER([&]() { tree->runtime->logged_zone_graphs.reset(); })
1652
1653 /* Make sure that dependencies of this tree will be evaluated. */
1655 /* Actually do evaluation. */
1657
1658 /* Get logged graph if it was evaluated. */
1659 std::optional<std::string> dot_str = tree->runtime->logged_zone_graphs->graph_by_zone_id.pop_try(
1660 node->identifier);
1661 if (!dot_str) {
1662 return;
1663 }
1664 *r_str = BLI_strdup(dot_str->c_str());
1665 *r_len = dot_str->size();
1666}
1667
1668static void rna_NodeTree_interface_update(bNodeTree *ntree, bContext *C)
1669{
1670 Main *bmain = CTX_data_main(C);
1671 ntree->tree_interface.tag_items_changed_generic();
1672 BKE_main_ensure_invariants(*bmain, ntree->id);
1673}
1674
1675/* ******** NodeLink ******** */
1676
1677static bool rna_NodeLink_is_hidden_get(PointerRNA *ptr)
1678{
1679 bNodeLink *link = static_cast<bNodeLink *>(ptr->data);
1681}
1682
1683static void rna_NodeLink_swap_multi_input_sort_id(
1684 ID *id, bNodeLink *self, Main *bmain, ReportList *reports, bNodeLink *other)
1685{
1686 if (self->tosock != other->tosock) {
1687 BKE_report(reports, RPT_ERROR_INVALID_INPUT, "The links must be siblings");
1688 return;
1689 }
1690
1691 std::swap(self->multi_input_sort_id, other->multi_input_sort_id);
1692
1693 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
1695 BKE_main_ensure_invariants(*bmain, ntree->id);
1697}
1698
1699/* ******** Node ******** */
1700
1701static StructRNA *rna_Node_refine(PointerRNA *ptr)
1702{
1703 bNode *node = ptr->data_as<bNode>();
1704
1705 if (node->typeinfo->rna_ext.srna) {
1706 return node->typeinfo->rna_ext.srna;
1707 }
1708 else {
1709 return ptr->type;
1710 }
1711}
1712
1713static std::optional<std::string> rna_Node_path(const PointerRNA *ptr)
1714{
1715 const bNode *node = ptr->data_as<bNode>();
1716 char name_esc[sizeof(node->name) * 2];
1717
1718 BLI_str_escape(name_esc, node->name, sizeof(name_esc));
1719 return fmt::format("nodes[\"{}\"]", name_esc);
1720}
1721
1722std::optional<std::string> rna_Node_ImageUser_path(const PointerRNA *ptr)
1723{
1724 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
1725 if (!ELEM(ntree->type, NTREE_SHADER, NTREE_CUSTOM)) {
1726 return std::nullopt;
1727 }
1728
1729 for (bNode *node = static_cast<bNode *>(ntree->nodes.first); node; node = node->next) {
1730 switch (node->type_legacy) {
1732 NodeTexEnvironment *data = static_cast<NodeTexEnvironment *>(node->storage);
1733 if (&data->iuser != ptr->data) {
1734 continue;
1735 }
1736 break;
1737 }
1738 case SH_NODE_TEX_IMAGE: {
1739 NodeTexImage *data = static_cast<NodeTexImage *>(node->storage);
1740 if (&data->iuser != ptr->data) {
1741 continue;
1742 }
1743 break;
1744 }
1745 default:
1746 continue;
1747 }
1748
1749 char name_esc[sizeof(node->name) * 2];
1750 BLI_str_escape(name_esc, node->name, sizeof(name_esc));
1751 return fmt::format("nodes[\"{}\"].image_user", name_esc);
1752 }
1753
1754 return std::nullopt;
1755}
1756
1757static bool rna_Node_poll(const blender::bke::bNodeType *ntype,
1758 const bNodeTree *ntree,
1759 const char ** /*r_disabled_hint*/)
1760{
1761 ParameterList list;
1762 FunctionRNA *func;
1763 void *ret;
1764 bool visible;
1765
1766 PointerRNA ptr = RNA_pointer_create_discrete(nullptr, ntype->rna_ext.srna, nullptr); /* dummy */
1767 func = &rna_Node_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
1768
1769 RNA_parameter_list_create(&list, &ptr, func);
1770 RNA_parameter_set_lookup(&list, "node_tree", &ntree);
1771 ntype->rna_ext.call(nullptr, &ptr, func, &list);
1772
1773 RNA_parameter_get_lookup(&list, "visible", &ret);
1774 visible = *static_cast<bool *>(ret);
1775
1777
1778 return visible;
1779}
1780
1781static bool rna_Node_poll_instance(const bNode *node,
1782 const bNodeTree *ntree,
1783 const char ** /*disabled_info*/)
1784{
1785 ParameterList list;
1786 FunctionRNA *func;
1787 void *ret;
1788 bool visible;
1789
1791 nullptr, node->typeinfo->rna_ext.srna, const_cast<bNode *>(node)); /* dummy */
1792 func = &rna_Node_poll_instance_func; /* RNA_struct_find_function(&ptr, "poll_instance"); */
1793
1794 RNA_parameter_list_create(&list, &ptr, func);
1795 RNA_parameter_set_lookup(&list, "node_tree", &ntree);
1796 node->typeinfo->rna_ext.call(nullptr, &ptr, func, &list);
1797
1798 RNA_parameter_get_lookup(&list, "visible", &ret);
1799 visible = *static_cast<bool *>(ret);
1800
1802
1803 return visible;
1804}
1805
1806static bool rna_Node_poll_instance_default(const bNode *node,
1807 const bNodeTree *ntree,
1808 const char **disabled_info)
1809{
1810 /* use the basic poll function */
1811 return rna_Node_poll(node->typeinfo, ntree, disabled_info);
1812}
1813
1814static void rna_Node_update_reg(bNodeTree *ntree, bNode *node)
1815{
1816 ParameterList list;
1817 FunctionRNA *func;
1818
1820 reinterpret_cast<ID *>(ntree), node->typeinfo->rna_ext.srna, node);
1821 func = &rna_Node_update_func; /* RNA_struct_find_function(&ptr, "update"); */
1822
1823 RNA_parameter_list_create(&list, &ptr, func);
1824 node->typeinfo->rna_ext.call(nullptr, &ptr, func, &list);
1825
1827}
1828
1829static bool rna_Node_insert_link(blender::bke::NodeInsertLinkParams &params)
1830{
1831 ParameterList list;
1832 FunctionRNA *func;
1833
1835 reinterpret_cast<ID *>(&params.ntree), params.node.typeinfo->rna_ext.srna, &params.node);
1836 func = &rna_Node_insert_link_func;
1837
1838 RNA_parameter_list_create(&list, &ptr, func);
1839 bNodeLink *link = &params.link;
1840 RNA_parameter_set_lookup(&list, "link", &link);
1841 params.node.typeinfo->rna_ext.call(nullptr, &ptr, func, &list);
1842
1844 return true;
1845}
1846
1847static void rna_Node_init(const bContext *C, PointerRNA *ptr)
1848{
1849 bNode *node = ptr->data_as<bNode>();
1850 ParameterList list;
1851 FunctionRNA *func;
1852
1853 func = &rna_Node_init_func; /* RNA_struct_find_function(&ptr, "init"); */
1854
1855 RNA_parameter_list_create(&list, ptr, func);
1856 node->typeinfo->rna_ext.call(const_cast<bContext *>(C), ptr, func, &list);
1857
1859}
1860
1861static void rna_Node_copy(PointerRNA *ptr, const bNode *copynode)
1862{
1863 bNode *node = ptr->data_as<bNode>();
1864 ParameterList list;
1865 FunctionRNA *func;
1866
1867 func = &rna_Node_copy_func; /* RNA_struct_find_function(&ptr, "copy"); */
1868
1869 RNA_parameter_list_create(&list, ptr, func);
1870 RNA_parameter_set_lookup(&list, "node", &copynode);
1871 node->typeinfo->rna_ext.call(nullptr, ptr, func, &list);
1872
1874}
1875
1876static void rna_Node_free(PointerRNA *ptr)
1877{
1878 bNode *node = ptr->data_as<bNode>();
1879 ParameterList list;
1880 FunctionRNA *func;
1881
1882 func = &rna_Node_free_func; /* RNA_struct_find_function(&ptr, "free"); */
1883
1884 RNA_parameter_list_create(&list, ptr, func);
1885 node->typeinfo->rna_ext.call(nullptr, ptr, func, &list);
1886
1888}
1889
1890static void rna_Node_draw_buttons(uiLayout *layout, bContext *C, PointerRNA *ptr)
1891{
1892 bNode *node = ptr->data_as<bNode>();
1893 ParameterList list;
1894 FunctionRNA *func;
1895
1896 func = &rna_Node_draw_buttons_func; /* RNA_struct_find_function(&ptr, "draw_buttons"); */
1897
1898 RNA_parameter_list_create(&list, ptr, func);
1899 RNA_parameter_set_lookup(&list, "context", &C);
1900 RNA_parameter_set_lookup(&list, "layout", &layout);
1901 node->typeinfo->rna_ext.call(C, ptr, func, &list);
1902
1904}
1905
1906static void rna_Node_draw_buttons_ext(uiLayout *layout, bContext *C, PointerRNA *ptr)
1907{
1908 bNode *node = ptr->data_as<bNode>();
1909 ParameterList list;
1910 FunctionRNA *func;
1911
1912 func = &rna_Node_draw_buttons_ext_func; /* RNA_struct_find_function(&ptr, "draw_buttons_ext"); */
1913
1914 RNA_parameter_list_create(&list, ptr, func);
1915 RNA_parameter_set_lookup(&list, "context", &C);
1916 RNA_parameter_set_lookup(&list, "layout", &layout);
1917 node->typeinfo->rna_ext.call(C, ptr, func, &list);
1918
1920}
1921
1922static void rna_Node_draw_label(const bNodeTree *ntree,
1923 const bNode *node,
1924 char *label,
1925 int label_maxncpy)
1926{
1927 ParameterList list;
1928 FunctionRNA *func;
1929 void *ret;
1930 char *rlabel;
1931
1932 func = &rna_Node_draw_label_func; /* RNA_struct_find_function(&ptr, "draw_label"); */
1933
1935 const_cast<ID *>(&ntree->id), &RNA_Node, const_cast<bNode *>(node));
1936 RNA_parameter_list_create(&list, &ptr, func);
1937 node->typeinfo->rna_ext.call(nullptr, &ptr, func, &list);
1938
1939 RNA_parameter_get_lookup(&list, "label", &ret);
1940 rlabel = static_cast<char *>(ret);
1941 BLI_strncpy(label, rlabel != nullptr ? rlabel : "", label_maxncpy);
1942
1944}
1945
1946static bool rna_Node_is_registered_node_type(StructRNA *type)
1947{
1948 return (RNA_struct_blender_type_get(type) != nullptr);
1949}
1950
1951static bool rna_Node_is_builtin(blender::bke::bNodeType *nt)
1952{
1953 BLI_assert(nt);
1954
1955 /* `nt->rna_ext.data` is the python object. If it's nullptr then it's a
1956 * builtin node. */
1957 return nt->rna_ext.data == nullptr;
1958}
1959
1960static void rna_Node_is_registered_node_type_runtime(bContext * /*C*/,
1961 ReportList * /*reports*/,
1962 PointerRNA *ptr,
1963 ParameterList *parms)
1964{
1965 int result = (RNA_struct_blender_type_get(ptr->type) != nullptr);
1966 RNA_parameter_set_lookup(parms, "result", &result);
1967}
1968
1969static bool rna_Node_unregister(Main *bmain, StructRNA *type)
1970{
1973
1974 if (!nt || rna_Node_is_builtin(nt)) {
1975 return false;
1976 }
1977
1980
1981 /* this also frees the allocated nt pointer, no MEM_free call needed! */
1983
1984 /* update while blender is running */
1987 return true;
1988}
1989
1990/* Generic internal registration function.
1991 * Can be used to implement callbacks for registerable RNA node sub-types.
1992 */
1993static blender::bke::bNodeType *rna_Node_register_base(Main *bmain,
1994 ReportList *reports,
1995 StructRNA *basetype,
1996 void *data,
1997 const char *identifier,
1998 StructValidateFunc validate,
1999 StructCallbackFunc call,
2001{
2003 bNode dummy_node = {};
2004 FunctionRNA *func;
2005 PropertyRNA *parm;
2006 bool have_function[10];
2007
2008 /* setup dummy node & node type to store static properties in */
2009 blender::bke::bNodeType dummy_nt = {};
2010 /* this does some additional initialization of default values */
2011 blender::bke::node_type_base_custom(dummy_nt, identifier, "", "CUSTOM", 0);
2012
2013 dummy_node.typeinfo = &dummy_nt;
2014 PointerRNA dummy_node_ptr = RNA_pointer_create_discrete(nullptr, basetype, &dummy_node);
2015
2016 /* validate the python class */
2017 if (validate(&dummy_node_ptr, data, have_function) != 0) {
2018 return nullptr;
2019 }
2020
2021 if (strlen(identifier) >= sizeof(dummy_node.idname)) {
2022 BKE_reportf(reports,
2023 RPT_ERROR,
2024 "Registering node class: '%s' is too long, maximum length is %d",
2025 identifier,
2026 int(sizeof(dummy_node.idname)));
2027 return nullptr;
2028 }
2029
2030 /* check if we have registered this node type before, and remove it */
2031 nt = blender::bke::node_type_find(dummy_nt.idname);
2032 if (nt) {
2033 /* If it's an internal node, we cannot proceed. */
2034 if (rna_Node_is_builtin(nt)) {
2035 BKE_reportf(reports,
2036 RPT_ERROR,
2037 "Registering node class: '%s', bl_idname '%s' is a builtin node",
2038 identifier,
2039 dummy_nt.idname.c_str());
2040 return nullptr;
2041 }
2042
2043 BKE_reportf(reports,
2044 RPT_INFO,
2045 "Registering node class: '%s', bl_idname '%s' has been registered before, "
2046 "unregistering previous",
2047 identifier,
2048 dummy_nt.idname.c_str());
2049
2050 /* NOTE: unlike most types `nt->rna_ext.srna` doesn't need to be checked for nullptr. */
2051 if (!rna_Node_unregister(bmain, nt->rna_ext.srna)) {
2052 BKE_reportf(reports,
2053 RPT_ERROR,
2054 "Registering node class: '%s', bl_idname '%s' could not be unregistered",
2055 identifier,
2056 dummy_nt.idname.c_str());
2057 return nullptr;
2058 }
2059 }
2060
2061 /* create a new node type */
2062 nt = MEM_new<blender::bke::bNodeType>(__func__, dummy_nt);
2063 nt->free_self = [](blender::bke::bNodeType *type) { MEM_delete(type); };
2064
2065 nt->rna_ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, nt->idname.c_str(), basetype);
2066 nt->rna_ext.data = data;
2067 nt->rna_ext.call = call;
2068 nt->rna_ext.free = free;
2070
2071 RNA_def_struct_ui_text(nt->rna_ext.srna, nt->ui_name.c_str(), nt->ui_description.c_str());
2073
2075 nt->rna_ext.srna, "is_registered_node_type", rna_Node_is_registered_node_type_runtime);
2076 RNA_def_function_ui_description(func, "True if a registered node type");
2078 parm = RNA_def_boolean(func, "result", false, "Result", "");
2079 RNA_def_function_return(func, parm);
2080
2081 /* XXX bad level call! needed to initialize the basic draw functions ... */
2083
2084 nt->poll = (have_function[0]) ? rna_Node_poll : nullptr;
2085 nt->poll_instance = (have_function[1]) ? rna_Node_poll_instance : rna_Node_poll_instance_default;
2086 nt->updatefunc = (have_function[2]) ? rna_Node_update_reg : nullptr;
2087 nt->insert_link = (have_function[3]) ? rna_Node_insert_link : nullptr;
2088 nt->initfunc_api = (have_function[4]) ? rna_Node_init : nullptr;
2089 nt->copyfunc_api = (have_function[5]) ? rna_Node_copy : nullptr;
2090 nt->freefunc_api = (have_function[6]) ? rna_Node_free : nullptr;
2091 nt->draw_buttons = (have_function[7]) ? rna_Node_draw_buttons : nullptr;
2092 nt->draw_buttons_ex = (have_function[8]) ? rna_Node_draw_buttons_ext : nullptr;
2093 nt->labelfunc = (have_function[9]) ? rna_Node_draw_label : nullptr;
2094
2095 /* sanitize size values in case not all have been registered */
2096 if (nt->maxwidth < nt->minwidth) {
2097 nt->maxwidth = nt->minwidth;
2098 }
2099 if (nt->maxheight < nt->minheight) {
2100 nt->maxheight = nt->minheight;
2101 }
2102 CLAMP(nt->width, nt->minwidth, nt->maxwidth);
2103 CLAMP(nt->height, nt->minheight, nt->maxheight);
2104
2105 return nt;
2106}
2107
2108static StructRNA *rna_Node_register(Main *bmain,
2109 ReportList *reports,
2110 void *data,
2111 const char *identifier,
2112 StructValidateFunc validate,
2113 StructCallbackFunc call,
2115{
2116 blender::bke::bNodeType *nt = rna_Node_register_base(
2117 bmain, reports, &RNA_Node, data, identifier, validate, call, free);
2118 if (!nt) {
2119 return nullptr;
2120 }
2121
2123
2124 /* update while blender is running */
2127 return nt->rna_ext.srna;
2128}
2129
2130static const EnumPropertyItem *itemf_function_check(
2131 const EnumPropertyItem *original_item_array,
2132 blender::FunctionRef<bool(const EnumPropertyItem *item)> value_supported)
2133{
2134 EnumPropertyItem *item_array = nullptr;
2135 int items_len = 0;
2136
2137 for (const EnumPropertyItem *item = original_item_array; item->identifier != nullptr; item++) {
2138 if (value_supported(item)) {
2139 RNA_enum_item_add(&item_array, &items_len, item);
2140 }
2141 }
2142
2143 RNA_enum_item_end(&item_array, &items_len);
2144 return item_array;
2145}
2146
2147static bool geometry_node_asset_trait_flag_get(PointerRNA *ptr,
2149{
2150 const bNodeTree *ntree = ptr->data_as<bNodeTree>();
2151 if (!ntree->geometry_node_asset_traits) {
2152 return false;
2153 }
2154 return ntree->geometry_node_asset_traits->flag & flag;
2155}
2156
2157static void geometry_node_asset_trait_flag_set(PointerRNA *ptr,
2159 const bool value)
2160{
2161 bNodeTree *ntree = ptr->data_as<bNodeTree>();
2162 if (!ntree->geometry_node_asset_traits) {
2164 }
2166}
2167
2168static bool rna_GeometryNodeTree_is_tool_get(PointerRNA *ptr)
2169{
2170 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_TOOL);
2171}
2172static void rna_GeometryNodeTree_is_tool_set(PointerRNA *ptr, bool value)
2173{
2174 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_TOOL, value);
2175}
2176
2177static bool rna_GeometryNodeTree_is_modifier_get(PointerRNA *ptr)
2178{
2179 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_MODIFIER);
2180}
2181static void rna_GeometryNodeTree_is_modifier_set(PointerRNA *ptr, bool value)
2182{
2183 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_MODIFIER, value);
2184}
2185
2186static bool rna_GeometryNodeTree_is_mode_object_get(PointerRNA *ptr)
2187{
2188 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_OBJECT);
2189}
2190static void rna_GeometryNodeTree_is_mode_object_set(PointerRNA *ptr, bool value)
2191{
2192 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_OBJECT, value);
2193}
2194
2195static bool rna_GeometryNodeTree_is_mode_edit_get(PointerRNA *ptr)
2196{
2197 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_EDIT);
2198}
2199static void rna_GeometryNodeTree_is_mode_edit_set(PointerRNA *ptr, bool value)
2200{
2201 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_EDIT, value);
2202}
2203
2204static bool rna_GeometryNodeTree_is_mode_sculpt_get(PointerRNA *ptr)
2205{
2206 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_SCULPT);
2207}
2208static void rna_GeometryNodeTree_is_mode_sculpt_set(PointerRNA *ptr, bool value)
2209{
2210 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_SCULPT, value);
2211}
2212
2213static bool rna_GeometryNodeTree_is_mode_paint_get(PointerRNA *ptr)
2214{
2215 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_PAINT);
2216}
2217static void rna_GeometryNodeTree_is_mode_paint_set(PointerRNA *ptr, bool value)
2218{
2219 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_PAINT, value);
2220}
2221
2222static bool rna_GeometryNodeTree_is_type_mesh_get(PointerRNA *ptr)
2223{
2224 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_MESH);
2225}
2226static void rna_GeometryNodeTree_is_type_mesh_set(PointerRNA *ptr, bool value)
2227{
2228 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_MESH, value);
2229}
2230
2231static bool rna_GeometryNodeTree_is_type_curve_get(PointerRNA *ptr)
2232{
2233 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_CURVE);
2234}
2235static void rna_GeometryNodeTree_is_type_curve_set(PointerRNA *ptr, bool value)
2236{
2237 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_CURVE, value);
2238}
2239
2240static bool rna_GeometryNodeTree_is_type_pointcloud_get(PointerRNA *ptr)
2241{
2242 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_POINTCLOUD);
2243}
2244static void rna_GeometryNodeTree_is_type_pointcloud_set(PointerRNA *ptr, bool value)
2245{
2246 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_POINTCLOUD, value);
2247}
2248
2249static bool rna_GeometryNodeTree_use_wait_for_click_get(PointerRNA *ptr)
2250{
2251 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_WAIT_FOR_CURSOR);
2252}
2253static void rna_GeometryNodeTree_use_wait_for_click_set(PointerRNA *ptr, bool value)
2254{
2255 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_WAIT_FOR_CURSOR, value);
2256}
2257
2258static bool rna_GeometryNodeTree_is_type_grease_pencil_get(PointerRNA *ptr)
2259{
2260 return geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_GREASE_PENCIL);
2261}
2262static void rna_GeometryNodeTree_is_type_grease_pencil_set(PointerRNA *ptr, bool value)
2263{
2264 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_GREASE_PENCIL, value);
2265}
2266
2267static bool rna_GeometryNodeTree_modifier_manage_panel_get(PointerRNA *ptr)
2268{
2269 return !geometry_node_asset_trait_flag_get(ptr, GEO_NODE_ASSET_HIDE_MODIFIER_MANAGE_PANEL);
2270}
2271static void rna_GeometryNodeTree_modifier_manage_panel_set(PointerRNA *ptr, bool value)
2272{
2273 geometry_node_asset_trait_flag_set(ptr, GEO_NODE_ASSET_HIDE_MODIFIER_MANAGE_PANEL, !value);
2274}
2275
2276static bool random_value_type_supported(const EnumPropertyItem *item)
2277{
2279}
2280static const EnumPropertyItem *rna_FunctionNodeRandomValue_type_itemf(bContext * /*C*/,
2281 PointerRNA * /*ptr*/,
2282 PropertyRNA * /*prop*/,
2283 bool *r_free)
2284{
2285 *r_free = true;
2286 return itemf_function_check(rna_enum_attribute_type_items, random_value_type_supported);
2287}
2288
2290{
2291 return ELEM(item->value,
2301}
2302
2303static bool generic_attribute_type_supported_with_socket(const EnumPropertyItem *item)
2304{
2305 return generic_attribute_type_supported(item) &&
2307}
2308
2309static const EnumPropertyItem *rna_GeometryNodeAttributeType_type_with_socket_itemf(
2310 bContext * /*C*/, PointerRNA * /*ptr*/, PropertyRNA * /*prop*/, bool *r_free)
2311{
2312 *r_free = true;
2313 return itemf_function_check(rna_enum_attribute_type_items,
2314 generic_attribute_type_supported_with_socket);
2315}
2316
2317static const EnumPropertyItem *rna_GeometryNodeAttributeDomain_attribute_domain_itemf(
2318 bContext * /*C*/, PointerRNA * /*ptr*/, PropertyRNA * /*prop*/, bool *r_free)
2319{
2320 using namespace blender;
2321 EnumPropertyItem *item_array = nullptr;
2322 int items_len = 0;
2323
2324 for (const EnumPropertyItem *item = rna_enum_attribute_domain_items; item->identifier != nullptr;
2325 item++)
2326 {
2327 RNA_enum_item_add(&item_array, &items_len, item);
2328 }
2329 RNA_enum_item_end(&item_array, &items_len);
2330
2331 *r_free = true;
2332 return item_array;
2333}
2334
2335static StructRNA *rna_ShaderNode_register(Main *bmain,
2336 ReportList *reports,
2337 void *data,
2338 const char *identifier,
2339 StructValidateFunc validate,
2340 StructCallbackFunc call,
2342{
2343 blender::bke::bNodeType *nt = rna_Node_register_base(
2344 bmain, reports, &RNA_ShaderNode, data, identifier, validate, call, free);
2345 if (!nt) {
2346 return nullptr;
2347 }
2348
2350
2351 /* update while blender is running */
2353
2354 return nt->rna_ext.srna;
2355}
2356
2357static StructRNA *rna_CompositorNode_register(Main *bmain,
2358 ReportList *reports,
2359 void *data,
2360 const char *identifier,
2361 StructValidateFunc validate,
2362 StructCallbackFunc call,
2364{
2365 blender::bke::bNodeType *nt = rna_Node_register_base(
2366 bmain, reports, &RNA_CompositorNode, data, identifier, validate, call, free);
2367 if (!nt) {
2368 return nullptr;
2369 }
2370
2372
2373 /* update while blender is running */
2375
2376 return nt->rna_ext.srna;
2377}
2378
2379static StructRNA *rna_TextureNode_register(Main *bmain,
2380 ReportList *reports,
2381 void *data,
2382 const char *identifier,
2383 StructValidateFunc validate,
2384 StructCallbackFunc call,
2386{
2387 blender::bke::bNodeType *nt = rna_Node_register_base(
2388 bmain, reports, &RNA_TextureNode, data, identifier, validate, call, free);
2389 if (!nt) {
2390 return nullptr;
2391 }
2392
2394
2395 /* update while blender is running */
2397
2398 return nt->rna_ext.srna;
2399}
2400
2401static StructRNA *rna_GeometryNode_register(Main *bmain,
2402 ReportList *reports,
2403 void *data,
2404 const char *identifier,
2405 StructValidateFunc validate,
2406 StructCallbackFunc call,
2408{
2409 blender::bke::bNodeType *nt = rna_Node_register_base(
2410 bmain, reports, &RNA_GeometryNode, data, identifier, validate, call, free);
2411 if (!nt) {
2412 return nullptr;
2413 }
2414
2416
2417 /* update while blender is running */
2419
2420 return nt->rna_ext.srna;
2421}
2422
2423static StructRNA *rna_FunctionNode_register(Main *bmain,
2424 ReportList *reports,
2425 void *data,
2426 const char *identifier,
2427 StructValidateFunc validate,
2428 StructCallbackFunc call,
2430{
2431 blender::bke::bNodeType *nt = rna_Node_register_base(
2432 bmain, reports, &RNA_FunctionNode, data, identifier, validate, call, free);
2433 if (!nt) {
2434 return nullptr;
2435 }
2436
2438
2439 /* update while blender is running */
2441
2442 return nt->rna_ext.srna;
2443}
2444
2445static IDProperty **rna_Node_idprops(PointerRNA *ptr)
2446{
2447 bNode *node = ptr->data_as<bNode>();
2448 return &node->prop;
2449}
2450
2451static IDProperty **rna_Node_system_idprops(PointerRNA *ptr)
2452{
2453 bNode *node = ptr->data_as<bNode>();
2454 return &node->system_properties;
2455}
2456
2457static void rna_Node_parent_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
2458{
2459 bNode *node = ptr->data_as<bNode>();
2460 bNode *parent = static_cast<bNode *>(value.data);
2461 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
2462
2463 if (!parent) {
2464 blender::bke::node_detach_node(*ntree, *node);
2465 return;
2466 }
2467
2468 /* XXX only Frame node allowed for now,
2469 * in the future should have a poll function or so to test possible attachment.
2470 */
2471 if (!parent->is_frame()) {
2472 return;
2473 }
2474
2475 if (blender::bke::node_is_parent_and_child(*node, *parent)) {
2476 return;
2477 }
2478
2479 blender::bke::node_detach_node(*ntree, *node);
2480 blender::bke::node_attach_node(*ntree, *node, *parent);
2481}
2482
2483static void rna_Node_internal_links_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
2484{
2485 bNode *node = ptr->data_as<bNode>();
2487 int len;
2489 rna_iterator_array_begin(iter, ptr, begin, sizeof(bNodeLink), len, false, nullptr);
2490}
2491
2496static bool allow_identifier_lookup(const bNode &node)
2497{
2498 switch (node.type_legacy) {
2500 case SH_NODE_MIX:
2501 case FN_NODE_COMPARE:
2502 case SH_NODE_MAP_RANGE:
2503 return false;
2504 default:
2505 return true;
2506 }
2507}
2508
2509static bNodeSocket *find_socket_by_key(bNode &node,
2510 const eNodeSocketInOut in_out,
2511 const blender::StringRef key)
2512{
2513 ListBase *sockets = in_out == SOCK_IN ? &node.inputs : &node.outputs;
2514 if (allow_identifier_lookup(node)) {
2515 LISTBASE_FOREACH (bNodeSocket *, socket, sockets) {
2516 if (socket->is_available()) {
2517 if (socket->identifier == key) {
2518 return socket;
2519 }
2520 }
2521 }
2522 }
2523 LISTBASE_FOREACH (bNodeSocket *, socket, sockets) {
2524 if (socket->is_available()) {
2525 if (socket->name == key) {
2526 return socket;
2527 }
2528 }
2529 }
2530 return nullptr;
2531}
2532
2533static bool rna_NodeInputs_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
2534{
2535 bNode *node = ptr->data_as<bNode>();
2536 if (bNodeSocket *socket = find_socket_by_key(*node, SOCK_IN, key)) {
2537 rna_pointer_create_with_ancestors(*ptr, &RNA_NodeSocket, socket, *r_ptr);
2538 return true;
2539 }
2540 return false;
2541}
2542
2543static bool rna_NodeOutputs_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
2544{
2545 bNode *node = ptr->data_as<bNode>();
2546 if (bNodeSocket *socket = find_socket_by_key(*node, SOCK_OUT, key)) {
2547 rna_pointer_create_with_ancestors(*ptr, &RNA_NodeSocket, socket, *r_ptr);
2548 return true;
2549 }
2550 return false;
2551}
2552
2553static bool rna_Node_parent_poll(PointerRNA *ptr, PointerRNA value)
2554{
2555 bNode *node = ptr->data_as<bNode>();
2556 bNode *parent = static_cast<bNode *>(value.data);
2557
2558 /* XXX only Frame node allowed for now,
2559 * in the future should have a poll function or so to test possible attachment.
2560 */
2561 if (!parent->is_frame()) {
2562 return false;
2563 }
2564
2565 if (node->is_frame() && blender::bke::node_is_parent_and_child(*node, *parent)) {
2566 return false;
2567 }
2568
2569 return true;
2570}
2571
2572void rna_Node_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
2573{
2574 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
2575 bNode *node = ptr->data_as<bNode>();
2577 BKE_main_ensure_invariants(*bmain, ntree->id);
2578}
2579
2580void rna_Node_update_relations(Main *bmain, Scene *scene, PointerRNA *ptr)
2581{
2582 rna_Node_update(bmain, scene, ptr);
2584}
2585
2586static void rna_Node_socket_value_update(ID *id, bNode * /*node*/, bContext *C)
2587{
2588 BKE_ntree_update_tag_all(reinterpret_cast<bNodeTree *>(id));
2590}
2591
2592static void rna_Node_select_set(PointerRNA *ptr, bool value)
2593{
2594 bNode *node = ptr->data_as<bNode>();
2595 blender::bke::node_set_selected(*node, value);
2596}
2597
2598static void rna_Node_mute_set(PointerRNA *ptr, bool value)
2599{
2600 bNode *node = ptr->data_as<bNode>();
2601 if (!node->typeinfo->no_muting) {
2602 SET_FLAG_FROM_TEST(node->flag, value, NODE_MUTED);
2603 }
2604}
2605
2606static void rna_Node_name_set(PointerRNA *ptr, const char *value)
2607{
2608 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
2609 bNode *node = ptr->data_as<bNode>();
2610 char oldname[sizeof(node->name)];
2611
2612 /* make a copy of the old name first */
2613 STRNCPY(oldname, node->name);
2614 /* set new name */
2615 STRNCPY_UTF8(node->name, value);
2616
2617 blender::bke::node_unique_name(*ntree, *node);
2618
2619 /* fix all the animation data which may link to this */
2620 BKE_animdata_fix_paths_rename_all(nullptr, "nodes", oldname, node->name);
2621}
2622
2623static int rna_Node_color_tag_get(PointerRNA *ptr)
2624{
2625 bNode *node = ptr->data_as<bNode>();
2626 return int(blender::bke::node_color_tag(*node));
2627}
2628
2629static bool allow_adding_sockets(const bNode &node)
2630{
2632}
2633
2634static bool allow_changing_sockets(bNode *node)
2635{
2637}
2638
2639static bNodeSocket *rna_Node_inputs_new(ID *id,
2640 bNode *node,
2641 Main *bmain,
2642 ReportList *reports,
2643 const char *type,
2644 const char *name,
2645 const char *identifier,
2646 const bool use_multi_input)
2647{
2648 if (!allow_adding_sockets(*node)) {
2649 BKE_report(reports, RPT_ERROR, "Cannot add socket to built-in node");
2650 return nullptr;
2651 }
2652 if (identifier == nullptr) {
2653 /* Use the name as default identifier if no separate identifier is provided. */
2654 identifier = name;
2655 }
2656
2657 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
2659 *ntree, *node, SOCK_IN, type, identifier, name);
2660
2661 if (sock == nullptr) {
2662 BKE_report(reports, RPT_ERROR, "Unable to create socket");
2663 }
2664 else {
2665 if (use_multi_input) {
2666 sock->flag |= SOCK_MULTI_INPUT;
2667 }
2668 BKE_main_ensure_invariants(*bmain, ntree->id);
2670 }
2671
2672 return sock;
2673}
2674
2675static bNodeSocket *rna_Node_outputs_new(ID *id,
2676 bNode *node,
2677 Main *bmain,
2678 ReportList *reports,
2679 const char *type,
2680 const char *name,
2681 const char *identifier,
2682 const bool use_multi_input)
2683{
2684 if (!allow_adding_sockets(*node)) {
2685 BKE_report(reports, RPT_ERROR, "Cannot add socket to built-in node");
2686 return nullptr;
2687 }
2688
2689 if (use_multi_input) {
2690 BKE_report(reports, RPT_ERROR, "Output sockets cannot be multi-input");
2691 return nullptr;
2692 }
2693
2694 if (identifier == nullptr) {
2695 /* Use the name as default identifier if no separate identifier is provided. */
2696 identifier = name;
2697 }
2698
2699 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
2701 *ntree, *node, SOCK_OUT, type, identifier, name);
2702
2703 if (sock == nullptr) {
2704 BKE_report(reports, RPT_ERROR, "Unable to create socket");
2705 }
2706 else {
2707 BKE_main_ensure_invariants(*bmain, ntree->id);
2709 }
2710
2711 return sock;
2712}
2713
2714static void rna_Node_socket_remove(
2715 ID *id, bNode *node, Main *bmain, ReportList *reports, bNodeSocket *sock)
2716{
2717 if (!allow_changing_sockets(node)) {
2718 BKE_report(reports, RPT_ERROR, "Unable to remove socket from built-in node");
2719 return;
2720 }
2721
2722 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
2723
2724 if (BLI_findindex(&node->inputs, sock) == -1 && BLI_findindex(&node->outputs, sock) == -1) {
2725 BKE_reportf(reports, RPT_ERROR, "Unable to locate socket '%s' in node", sock->identifier);
2726 }
2727 else {
2728 blender::bke::node_remove_socket(*ntree, *node, *sock);
2729
2730 BKE_main_ensure_invariants(*bmain, ntree->id);
2732 }
2733}
2734
2735static void rna_Node_inputs_clear(ID *id, bNode *node, Main *bmain, ReportList *reports)
2736{
2737 if (!allow_changing_sockets(node)) {
2738 BKE_report(reports, RPT_ERROR, "Unable to remove sockets from built-in node");
2739 return;
2740 }
2741
2742 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
2743 bNodeSocket *sock, *nextsock;
2744
2745 for (sock = static_cast<bNodeSocket *>(node->inputs.first); sock; sock = nextsock) {
2746 nextsock = sock->next;
2747 blender::bke::node_remove_socket(*ntree, *node, *sock);
2748 }
2749
2750 BKE_main_ensure_invariants(*bmain, ntree->id);
2752}
2753
2754static void rna_Node_outputs_clear(ID *id, bNode *node, Main *bmain, ReportList *reports)
2755{
2756 if (!allow_changing_sockets(node)) {
2757 BKE_report(reports, RPT_ERROR, "Unable to remove socket from built-in node");
2758 return;
2759 }
2760
2761 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
2762 bNodeSocket *sock, *nextsock;
2763
2764 for (sock = static_cast<bNodeSocket *>(node->outputs.first); sock; sock = nextsock) {
2765 nextsock = sock->next;
2766 blender::bke::node_remove_socket(*ntree, *node, *sock);
2767 }
2768
2769 BKE_main_ensure_invariants(*bmain, ntree->id);
2771}
2772
2773static void rna_Node_inputs_move(
2774 ID *id, bNode *node, Main *bmain, ReportList *reports, int from_index, int to_index)
2775{
2776 if (!allow_changing_sockets(node)) {
2777 BKE_report(reports, RPT_ERROR, "Unable to move sockets in built-in node");
2778 return;
2779 }
2780
2781 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
2782 bNodeSocket *sock;
2783
2784 if (from_index == to_index) {
2785 return;
2786 }
2787 if (from_index < 0 || to_index < 0) {
2788 return;
2789 }
2790
2791 sock = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, from_index));
2792 if (to_index < from_index) {
2793 bNodeSocket *nextsock = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, to_index));
2794 if (nextsock) {
2795 BLI_remlink(&node->inputs, sock);
2796 BLI_insertlinkbefore(&node->inputs, nextsock, sock);
2797 }
2798 }
2799 else {
2800 bNodeSocket *prevsock = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, to_index));
2801 if (prevsock) {
2802 BLI_remlink(&node->inputs, sock);
2803 BLI_insertlinkafter(&node->inputs, prevsock, sock);
2804 }
2805 }
2806
2808 BKE_main_ensure_invariants(*bmain, ntree->id);
2810}
2811
2812static void rna_Node_outputs_move(
2813 ID *id, bNode *node, Main *bmain, ReportList *reports, int from_index, int to_index)
2814{
2815 if (!allow_changing_sockets(node)) {
2816 BKE_report(reports, RPT_ERROR, "Unable to move sockets in built-in node");
2817 return;
2818 }
2819
2820 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
2821 bNodeSocket *sock;
2822
2823 if (from_index == to_index) {
2824 return;
2825 }
2826 if (from_index < 0 || to_index < 0) {
2827 return;
2828 }
2829
2830 sock = static_cast<bNodeSocket *>(BLI_findlink(&node->outputs, from_index));
2831 if (to_index < from_index) {
2832 bNodeSocket *nextsock = static_cast<bNodeSocket *>(BLI_findlink(&node->outputs, to_index));
2833 if (nextsock) {
2834 BLI_remlink(&node->outputs, sock);
2835 BLI_insertlinkbefore(&node->outputs, nextsock, sock);
2836 }
2837 }
2838 else {
2839 bNodeSocket *prevsock = static_cast<bNodeSocket *>(BLI_findlink(&node->outputs, to_index));
2840 if (prevsock) {
2841 BLI_remlink(&node->outputs, sock);
2842 BLI_insertlinkafter(&node->outputs, prevsock, sock);
2843 }
2844 }
2845
2847 BKE_main_ensure_invariants(*bmain, ntree->id);
2849}
2850
2851static void rna_Node_width_range(
2852 PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax)
2853{
2854 bNode *node = ptr->data_as<bNode>();
2855 *min = *softmin = node->typeinfo->minwidth;
2856 *max = *softmax = node->typeinfo->maxwidth;
2857}
2858
2859static void rna_Node_height_range(
2860 PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax)
2861{
2862 bNode *node = ptr->data_as<bNode>();
2863 *min = *softmin = node->typeinfo->minheight;
2864 *max = *softmax = node->typeinfo->maxheight;
2865}
2866
2867static void rna_Node_dimensions_get(PointerRNA *ptr, float *value)
2868{
2869 bNode *node = ptr->data_as<bNode>();
2870 const float2 dimensions = blender::bke::node_dimensions_get(*node);
2871 value[0] = dimensions[0];
2872 value[1] = dimensions[1];
2873}
2874
2875/* ******** Node Types ******** */
2876
2877static void rna_NodeInternalSocketTemplate_name_get(PointerRNA *ptr, char *value)
2878{
2880 ptr->data);
2881 strcpy(value, stemp->name);
2882}
2883
2884static int rna_NodeInternalSocketTemplate_name_length(PointerRNA *ptr)
2885{
2887 ptr->data);
2888 return strlen(stemp->name);
2889}
2890
2891static void rna_NodeInternalSocketTemplate_identifier_get(PointerRNA *ptr, char *value)
2892{
2894 ptr->data);
2895 strcpy(value, stemp->identifier);
2896}
2897
2898static int rna_NodeInternalSocketTemplate_identifier_length(PointerRNA *ptr)
2899{
2901 ptr->data);
2902 return strlen(stemp->identifier);
2903}
2904
2905static int rna_NodeInternalSocketTemplate_type_get(PointerRNA *ptr)
2906{
2908 ptr->data);
2909 return stemp->type;
2910}
2911
2912static PointerRNA rna_NodeInternal_input_template(StructRNA *srna, int index)
2913{
2914 blender::bke::bNodeType *ntype = static_cast<blender::bke::bNodeType *>(
2916 if (ntype && ntype->inputs) {
2918 int i = 0;
2919 while (i < index && stemp->type >= 0) {
2920 i++;
2921 stemp++;
2922 }
2923 if (i == index && stemp->type >= 0) {
2925 nullptr, &RNA_NodeInternalSocketTemplate, stemp);
2926 return ptr;
2927 }
2928 }
2929 return PointerRNA_NULL;
2930}
2931
2932static PointerRNA rna_NodeInternal_output_template(StructRNA *srna, int index)
2933{
2934 blender::bke::bNodeType *ntype = static_cast<blender::bke::bNodeType *>(
2936 if (ntype && ntype->outputs) {
2938 int i = 0;
2939 while (i < index && stemp->type >= 0) {
2940 i++;
2941 stemp++;
2942 }
2943 if (i == index && stemp->type >= 0) {
2945 nullptr, &RNA_NodeInternalSocketTemplate, stemp);
2946 return ptr;
2947 }
2948 }
2949 return PointerRNA_NULL;
2950}
2951
2952static bool rna_NodeInternal_poll(StructRNA *srna, bNodeTree *ntree)
2953{
2954 blender::bke::bNodeType *ntype = static_cast<blender::bke::bNodeType *>(
2956 const char *disabled_hint;
2957 return ntype && (!ntype->poll || ntype->poll(ntype, ntree, &disabled_hint));
2958}
2959
2960static bool rna_NodeInternal_poll_instance(bNode *node, bNodeTree *ntree)
2961{
2962 blender::bke::bNodeType *ntype = node->typeinfo;
2963 const char *disabled_hint;
2964 if (ntype->poll_instance) {
2965 return ntype->poll_instance(node, ntree, &disabled_hint);
2966 }
2967 else {
2968 /* fall back to basic poll function */
2969 return !ntype->poll || ntype->poll(ntype, ntree, &disabled_hint);
2970 }
2971}
2972
2973static void rna_NodeInternal_update(ID *id, bNode *node, Main *bmain)
2974{
2975 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
2977 BKE_main_ensure_invariants(*bmain, ntree->id);
2978}
2979
2980static void rna_NodeInternal_draw_buttons(ID *id, bNode *node, bContext *C, uiLayout *layout)
2981{
2982 if (node->typeinfo->draw_buttons) {
2983 PointerRNA ptr = RNA_pointer_create_discrete(id, &RNA_Node, node);
2984 node->typeinfo->draw_buttons(layout, C, &ptr);
2985 }
2986}
2987
2988static void rna_NodeInternal_draw_buttons_ext(ID *id, bNode *node, bContext *C, uiLayout *layout)
2989{
2990 if (node->typeinfo->draw_buttons_ex) {
2991 PointerRNA ptr = RNA_pointer_create_discrete(id, &RNA_Node, node);
2992 node->typeinfo->draw_buttons_ex(layout, C, &ptr);
2993 }
2994 else if (node->typeinfo->draw_buttons) {
2995 PointerRNA ptr = RNA_pointer_create_discrete(id, &RNA_Node, node);
2996 node->typeinfo->draw_buttons(layout, C, &ptr);
2997 }
2998}
2999
3000static StructRNA *rna_NodeCustomGroup_register(Main *bmain,
3001 ReportList *reports,
3002 void *data,
3003 const char *identifier,
3004 StructValidateFunc validate,
3005 StructCallbackFunc call,
3007{
3008 blender::bke::bNodeType *nt = rna_Node_register_base(
3009 bmain, reports, &RNA_NodeCustomGroup, data, identifier, validate, call, free);
3010 if (!nt) {
3011 return nullptr;
3012 }
3013
3015
3016 /* update while blender is running */
3018
3019 return nt->rna_ext.srna;
3020}
3021
3022static StructRNA *rna_GeometryNodeCustomGroup_register(Main *bmain,
3023 ReportList *reports,
3024 void *data,
3025 const char *identifier,
3026 StructValidateFunc validate,
3027 StructCallbackFunc call,
3029{
3030 blender::bke::bNodeType *nt = rna_Node_register_base(
3031 bmain, reports, &RNA_GeometryNodeCustomGroup, data, identifier, validate, call, free);
3032
3033 if (!nt) {
3034 return nullptr;
3035 }
3036
3038
3040
3042
3044
3045 return nt->rna_ext.srna;
3046}
3047
3049
3050static StructRNA *rna_ShaderNodeCustomGroup_register(Main *bmain,
3051 ReportList *reports,
3052 void *data,
3053 const char *identifier,
3054 StructValidateFunc validate,
3055 StructCallbackFunc call,
3057{
3058 blender::bke::bNodeType *nt = rna_Node_register_base(
3059 bmain, reports, &RNA_ShaderNodeCustomGroup, data, identifier, validate, call, free);
3060
3061 if (!nt) {
3062 return nullptr;
3063 }
3064
3066
3068
3070
3072
3073 return nt->rna_ext.srna;
3074}
3075
3076static StructRNA *rna_CompositorNodeCustomGroup_register(Main *bmain,
3077 ReportList *reports,
3078 void *data,
3079 const char *identifier,
3080 StructValidateFunc validate,
3081 StructCallbackFunc call,
3083{
3084 blender::bke::bNodeType *nt = rna_Node_register_base(
3085 bmain, reports, &RNA_CompositorNodeCustomGroup, data, identifier, validate, call, free);
3086 if (!nt) {
3087 return nullptr;
3088 }
3089
3091
3093
3095
3097
3098 return nt->rna_ext.srna;
3099}
3100
3101static void rna_CompositorNode_tag_need_exec(bNode *node)
3102{
3104}
3105
3106static void rna_Node_tex_image_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
3107{
3108 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
3109 bNode *node = ptr->data_as<bNode>();
3110
3112 BKE_main_ensure_invariants(*bmain, ntree->id);
3115}
3116
3117static void rna_NodeGroup_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
3118{
3119 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
3120 bNode *node = ptr->data_as<bNode>();
3121
3123 BKE_main_ensure_invariants(*bmain, ntree->id);
3125}
3126
3127static void rna_NodeGroup_node_tree_set(PointerRNA *ptr,
3128 const PointerRNA value,
3129 ReportList * /*reports*/)
3130{
3131 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
3132 bNode *node = ptr->data_as<bNode>();
3133 bNodeTree *ngroup = static_cast<bNodeTree *>(value.data);
3134
3135 const char *disabled_hint = nullptr;
3136 if (blender::bke::node_group_poll(ntree, ngroup, &disabled_hint)) {
3137 if (node->id) {
3138 id_us_min(node->id);
3139 }
3140 if (ngroup) {
3141 id_us_plus(&ngroup->id);
3142 }
3143
3144 node->id = &ngroup->id;
3145 }
3146}
3147
3148static bool rna_NodeGroup_node_tree_poll(PointerRNA *ptr, const PointerRNA value)
3149{
3150 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
3151 bNodeTree *ngroup = static_cast<bNodeTree *>(value.data);
3152
3153 /* only allow node trees of the same type as the group node's tree */
3154 if (ngroup->type != ntree->type) {
3155 return false;
3156 }
3157
3158 const char *disabled_hint = nullptr;
3159 return blender::bke::node_group_poll(ntree, ngroup, &disabled_hint);
3160}
3161
3162static void rna_Node_scene_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
3163{
3164 bNode *node = ptr->data_as<bNode>();
3165
3166 if (node->id) {
3167 id_us_min(node->id);
3168 node->id = nullptr;
3169 }
3170
3171 node->id = static_cast<ID *>(value.data);
3172
3173 id_us_plus(node->id);
3174}
3175
3176static void rna_Node_image_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
3177{
3178 bNode *node = ptr->data_as<bNode>();
3179 Image *ima = reinterpret_cast<Image *>(node->id);
3180 ImageUser *iuser = static_cast<ImageUser *>(node->storage);
3181
3182 if (node->type_legacy == CMP_NODE_CRYPTOMATTE &&
3184 {
3185 return;
3186 }
3187
3188 BKE_image_multilayer_index(ima->rr, iuser);
3189 BKE_image_signal(bmain, ima, iuser, IMA_SIGNAL_SRC_CHANGE);
3190
3191 rna_Node_update(bmain, scene, ptr);
3192
3193 if (scene != nullptr && scene->compositing_node_group != nullptr) {
3195 }
3196}
3197
3198static const EnumPropertyItem *renderresult_layers_add_enum(RenderLayer *rl)
3199{
3200 EnumPropertyItem *item = nullptr;
3201 EnumPropertyItem tmp = {0};
3202 int i = 0, totitem = 0;
3203
3204 while (rl) {
3205 tmp.identifier = rl->name;
3206 /* Little trick: using space char instead empty string
3207 * makes the item selectable in the drop-down. */
3208 if (rl->name[0] == '\0') {
3209 tmp.name = " ";
3210 }
3211 else {
3212 tmp.name = rl->name;
3213 }
3214 tmp.value = i++;
3215 RNA_enum_item_add(&item, &totitem, &tmp);
3216 rl = rl->next;
3217 }
3218
3219 RNA_enum_item_end(&item, &totitem);
3220
3221 return item;
3222}
3223
3224static const EnumPropertyItem *rna_ShaderNodeMix_data_type_itemf(bContext * /*C*/,
3225 PointerRNA *ptr,
3226 PropertyRNA * /*prop*/,
3227 bool *r_free)
3228{
3229 *r_free = true;
3230
3231 const auto rotation_supported_mix = [&](const EnumPropertyItem *item) -> bool {
3232 const eNodeSocketDatatype data_type = eNodeSocketDatatype(item->value);
3233 if (data_type == SOCK_ROTATION) {
3234 const bNodeTree *tree = reinterpret_cast<const bNodeTree *>(ptr->owner_id);
3235 if (tree->type == NTREE_GEOMETRY) {
3236 return true;
3237 }
3238 }
3239 return ELEM(data_type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA);
3240 };
3241
3242 return itemf_function_check(rna_enum_mix_data_type_items, rotation_supported_mix);
3243}
3244
3245static const EnumPropertyItem *rna_Node_image_layer_itemf(bContext * /*C*/,
3246 PointerRNA *ptr,
3247 PropertyRNA * /*prop*/,
3248 bool *r_free)
3249{
3250 bNode *node = ptr->data_as<bNode>();
3251 Image *ima = reinterpret_cast<Image *>(node->id);
3252 const EnumPropertyItem *item = nullptr;
3253 RenderLayer *rl;
3254
3255 if (node->type_legacy == CMP_NODE_CRYPTOMATTE &&
3257 {
3259 }
3260
3261 if (ima == nullptr || ima->rr == nullptr) {
3262 *r_free = false;
3264 }
3265
3266 rl = static_cast<RenderLayer *>(ima->rr->layers.first);
3267 item = renderresult_layers_add_enum(rl);
3268
3269 *r_free = true;
3270
3271 return item;
3272}
3273
3274static bool rna_Node_image_has_layers_get(PointerRNA *ptr)
3275{
3276 bNode *node = ptr->data_as<bNode>();
3277 Image *ima = reinterpret_cast<Image *>(node->id);
3278
3279 if (node->type_legacy == CMP_NODE_CRYPTOMATTE &&
3281 {
3282 return false;
3283 }
3284
3285 if (!ima || !(ima->rr)) {
3286 return false;
3287 }
3288
3289 return RE_layers_have_name(ima->rr);
3290}
3291
3292static bool rna_Node_image_has_views_get(PointerRNA *ptr)
3293{
3294 bNode *node = ptr->data_as<bNode>();
3295 Image *ima = reinterpret_cast<Image *>(node->id);
3296
3297 if (node->type_legacy == CMP_NODE_CRYPTOMATTE &&
3299 {
3300 return false;
3301 }
3302
3303 if (!ima || !(ima->rr)) {
3304 return false;
3305 }
3306
3307 return BLI_listbase_count_at_most(&ima->rr->views, 2) > 1;
3308}
3309
3310static const EnumPropertyItem *renderresult_views_add_enum(RenderView *rv)
3311{
3312 EnumPropertyItem *item = nullptr;
3313 EnumPropertyItem tmp = {0, "ALL", 0, "All", ""};
3314 int i = 1, totitem = 0;
3315
3316 /* option to use all views */
3317 RNA_enum_item_add(&item, &totitem, &tmp);
3318
3319 while (rv) {
3320 tmp.identifier = rv->name;
3321 /* Little trick: using space char instead empty string
3322 * makes the item selectable in the drop-down. */
3323 if (rv->name[0] == '\0') {
3324 tmp.name = " ";
3325 }
3326 else {
3327 tmp.name = rv->name;
3328 }
3329 tmp.value = i++;
3330 RNA_enum_item_add(&item, &totitem, &tmp);
3331 rv = rv->next;
3332 }
3333
3334 RNA_enum_item_end(&item, &totitem);
3335
3336 return item;
3337}
3338
3339static const EnumPropertyItem *rna_Node_image_view_itemf(bContext * /*C*/,
3340 PointerRNA *ptr,
3341 PropertyRNA * /*prop*/,
3342 bool *r_free)
3343{
3344 bNode *node = ptr->data_as<bNode>();
3345 Image *ima = reinterpret_cast<Image *>(node->id);
3346 const EnumPropertyItem *item = nullptr;
3347 RenderView *rv;
3348
3349 if (node->type_legacy == CMP_NODE_CRYPTOMATTE &&
3351 {
3353 }
3354
3355 if (ima == nullptr || ima->rr == nullptr) {
3356 *r_free = false;
3358 }
3359
3360 rv = static_cast<RenderView *>(ima->rr->views.first);
3361 item = renderresult_views_add_enum(rv);
3362
3363 *r_free = true;
3364
3365 return item;
3366}
3367
3368static const EnumPropertyItem *rna_Node_view_layer_itemf(bContext * /*C*/,
3369 PointerRNA *ptr,
3370 PropertyRNA * /*prop*/,
3371 bool *r_free)
3372{
3373 bNode *node = ptr->data_as<bNode>();
3374 Scene *sce = reinterpret_cast<Scene *>(node->id);
3375 const EnumPropertyItem *item = nullptr;
3376 RenderLayer *rl;
3377
3378 if (sce == nullptr) {
3379 *r_free = false;
3381 }
3382
3383 rl = static_cast<RenderLayer *>(sce->view_layers.first);
3384 item = renderresult_layers_add_enum(rl);
3385
3386 *r_free = true;
3387
3388 return item;
3389}
3390
3391static void rna_Node_view_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
3392{
3393 rna_Node_update_relations(bmain, scene, ptr);
3394 if (scene != nullptr && scene->compositing_node_group != nullptr) {
3396 }
3397}
3398
3399static void rna_Image_Node_update_id(Main *bmain, Scene *scene, PointerRNA *ptr)
3400{
3401 bNode *node = ptr->data_as<bNode>();
3402
3404 rna_Node_update_relations(bmain, scene, ptr);
3405}
3406
3407/* --------------------------------------------------------------------
3408 * White Balance Node.
3409 */
3410
3411static void rna_NodeColorBalance_input_whitepoint_get(PointerRNA *ptr, float value[3])
3412{
3413 bNode *node = ptr->data_as<bNode>();
3414 bNodeSocket *temperature_input = blender::bke::node_find_socket(
3415 *node, SOCK_IN, "Input Temperature");
3416 bNodeSocket *tint_input = blender::bke::node_find_socket(*node, SOCK_IN, "Input Tint");
3418 temperature_input->default_value_typed<bNodeSocketValueFloat>()->value,
3419 tint_input->default_value_typed<bNodeSocketValueFloat>()->value,
3420 value);
3421}
3422
3423static void rna_NodeColorBalance_input_whitepoint_set(PointerRNA *ptr, const float value[3])
3424{
3425 bNode *node = ptr->data_as<bNode>();
3426 bNodeSocket *temperature_input = blender::bke::node_find_socket(
3427 *node, SOCK_IN, "Input Temperature");
3428 bNodeSocket *tint_input = blender::bke::node_find_socket(*node, SOCK_IN, "Input Tint");
3430 value,
3431 temperature_input->default_value_typed<bNodeSocketValueFloat>()->value,
3432 tint_input->default_value_typed<bNodeSocketValueFloat>()->value);
3433}
3434
3435static void rna_NodeColorBalance_output_whitepoint_get(PointerRNA *ptr, float value[3])
3436{
3437 bNode *node = ptr->data_as<bNode>();
3438 bNodeSocket *temperature_input = blender::bke::node_find_socket(
3439 *node, SOCK_IN, "Output Temperature");
3440 bNodeSocket *tint_input = blender::bke::node_find_socket(*node, SOCK_IN, "Output Tint");
3442 temperature_input->default_value_typed<bNodeSocketValueFloat>()->value,
3443 tint_input->default_value_typed<bNodeSocketValueFloat>()->value,
3444 value);
3445}
3446
3447static void rna_NodeColorBalance_output_whitepoint_set(PointerRNA *ptr, const float value[3])
3448{
3449 bNode *node = ptr->data_as<bNode>();
3450 bNodeSocket *temperature_input = blender::bke::node_find_socket(
3451 *node, SOCK_IN, "Output Temperature");
3452 bNodeSocket *tint_input = blender::bke::node_find_socket(*node, SOCK_IN, "Output Tint");
3454 value,
3455 temperature_input->default_value_typed<bNodeSocketValueFloat>()->value,
3456 tint_input->default_value_typed<bNodeSocketValueFloat>()->value);
3457}
3458
3459static void rna_NodeCryptomatte_source_set(PointerRNA *ptr, int value)
3460{
3461 bNode *node = ptr->data_as<bNode>();
3462 if (node->id && node->custom1 != value) {
3463 id_us_min(node->id);
3464 node->id = nullptr;
3465 }
3466 node->custom1 = value;
3467}
3468
3469static int rna_NodeCryptomatte_layer_name_get(PointerRNA *ptr)
3470{
3471 int index = 0;
3472 bNode *node = ptr->data_as<bNode>();
3473 NodeCryptomatte *storage = static_cast<NodeCryptomatte *>(node->storage);
3474 LISTBASE_FOREACH_INDEX (CryptomatteLayer *, layer, &storage->runtime.layers, index) {
3475 if (STREQLEN(storage->layer_name, layer->name, sizeof(storage->layer_name))) {
3476 return index;
3477 }
3478 }
3479 return 0;
3480}
3481
3482static void rna_NodeCryptomatte_layer_name_set(PointerRNA *ptr, int new_value)
3483{
3484 bNode *node = ptr->data_as<bNode>();
3485 NodeCryptomatte *storage = static_cast<NodeCryptomatte *>(node->storage);
3486
3487 CryptomatteLayer *layer = static_cast<CryptomatteLayer *>(
3488 BLI_findlink(&storage->runtime.layers, new_value));
3489 if (layer) {
3490 STRNCPY(storage->layer_name, layer->name);
3491 }
3492}
3493
3494static const EnumPropertyItem *rna_NodeCryptomatte_layer_name_itemf(bContext * /*C*/,
3495 PointerRNA *ptr,
3496 PropertyRNA * /*prop*/,
3497 bool *r_free)
3498{
3499 bNode *node = ptr->data_as<bNode>();
3500 NodeCryptomatte *storage = static_cast<NodeCryptomatte *>(node->storage);
3501 EnumPropertyItem *item = nullptr;
3502 EnumPropertyItem temp = {0, "", 0, "", ""};
3503 int totitem = 0;
3504
3505 int layer_index;
3506 LISTBASE_FOREACH_INDEX (CryptomatteLayer *, layer, &storage->runtime.layers, layer_index) {
3507 temp.value = layer_index;
3508 temp.identifier = layer->name;
3509 temp.name = layer->name;
3510 RNA_enum_item_add(&item, &totitem, &temp);
3511 }
3512
3513 RNA_enum_item_end(&item, &totitem);
3514 *r_free = true;
3515
3516 return item;
3517}
3518
3519static PointerRNA rna_NodeCryptomatte_scene_get(PointerRNA *ptr)
3520{
3521 bNode *node = ptr->data_as<bNode>();
3522
3523 ID *scene = (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER) ? node->id : nullptr;
3524 return RNA_id_pointer_create(scene);
3525}
3526
3527static void rna_NodeCryptomatte_scene_set(PointerRNA *ptr, PointerRNA value, ReportList *reports)
3528{
3529 bNode *node = ptr->data_as<bNode>();
3530
3532 rna_Node_scene_set(ptr, value, reports);
3533 }
3534}
3535
3536static PointerRNA rna_NodeCryptomatte_image_get(PointerRNA *ptr)
3537{
3538 bNode *node = ptr->data_as<bNode>();
3539
3540 ID *image = (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) ? node->id : nullptr;
3541 return RNA_id_pointer_create(image);
3542}
3543
3544static void rna_NodeCryptomatte_image_set(PointerRNA *ptr,
3545 PointerRNA value,
3546 ReportList * /*reports*/)
3547{
3548 bNode *node = ptr->data_as<bNode>();
3549
3551 if (node->id) {
3552 id_us_min(node->id);
3553 }
3554 if (value.data) {
3555 id_us_plus(static_cast<ID *>(value.data));
3556 }
3557 node->id = static_cast<ID *>(value.data);
3558 }
3559}
3560
3561static bool rna_NodeCryptomatte_image_poll(PointerRNA * /*ptr*/, PointerRNA value)
3562{
3563 Image *image = reinterpret_cast<Image *>(value.owner_id);
3564 return image->type == IMA_TYPE_MULTILAYER;
3565}
3566
3567static void rna_NodeCryptomatte_matte_get(PointerRNA *ptr, char *value)
3568{
3569 bNode *node = ptr->data_as<bNode>();
3570 NodeCryptomatte *nc = static_cast<NodeCryptomatte *>(node->storage);
3571 char *matte_id = BKE_cryptomatte_entries_to_matte_id(nc);
3572 strcpy(value, matte_id);
3573 MEM_freeN(matte_id);
3574}
3575
3576static int rna_NodeCryptomatte_matte_length(PointerRNA *ptr)
3577{
3578 bNode *node = ptr->data_as<bNode>();
3579 NodeCryptomatte *nc = static_cast<NodeCryptomatte *>(node->storage);
3580 char *matte_id = BKE_cryptomatte_entries_to_matte_id(nc);
3581 int result = strlen(matte_id);
3582 MEM_freeN(matte_id);
3583 return result;
3584}
3585
3586static void rna_NodeCryptomatte_matte_set(PointerRNA *ptr, const char *value)
3587{
3588 bNode *node = ptr->data_as<bNode>();
3589 NodeCryptomatte *nc = static_cast<NodeCryptomatte *>(node->storage);
3591}
3592
3593static void rna_NodeCryptomatte_update_add(Main *bmain, Scene *scene, PointerRNA *ptr)
3594{
3596 rna_Node_update(bmain, scene, ptr);
3597}
3598
3599static void rna_NodeCryptomatte_update_remove(Main *bmain, Scene *scene, PointerRNA *ptr)
3600{
3602 rna_Node_update(bmain, scene, ptr);
3603}
3604
3605static PointerRNA rna_Node_paired_output_get(PointerRNA *ptr)
3606{
3607 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
3608 bNode *node = ptr->data_as<bNode>();
3610 node->type_legacy);
3611 bNode *output_node = zone_type.get_corresponding_output(*ntree, *node);
3612 PointerRNA ptr_result = RNA_pointer_create_discrete(&ntree->id, &RNA_Node, output_node);
3613 return ptr_result;
3614}
3615
3616static bool rna_Node_pair_with_output(
3617 ID *id, bNode *node, bContext *C, ReportList *reports, bNode *output_node)
3618{
3619 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
3621 node->type_legacy);
3622 if (output_node->type_legacy != zone_type.output_type) {
3624 reports,
3625 RPT_ERROR,
3626 "Cannot pair zone input node %s with %s because it does not have the same zone type",
3627 node->name,
3628 output_node->name);
3629 return false;
3630 }
3631 for (const bNode *other_input_node : ntree->nodes_by_type(zone_type.input_idname)) {
3632 if (other_input_node != node) {
3633 if (zone_type.get_corresponding_output(*ntree, *other_input_node) == output_node) {
3634 BKE_reportf(reports,
3635 RPT_ERROR,
3636 "The output node %s is already paired with %s",
3637 output_node->name,
3638 other_input_node->name);
3639 return false;
3640 }
3641 }
3642 }
3643 int &output_node_id = zone_type.get_corresponding_output_id(*node);
3644 output_node_id = output_node->identifier;
3645
3649 return true;
3650}
3651
3652template<typename Accessor>
3653static void rna_Node_ItemArray_remove(ID *id,
3654 bNode *node,
3655 Main *bmain,
3656 ReportList *reports,
3657 typename Accessor::ItemT *item_to_remove)
3658{
3659 blender::nodes::socket_items::SocketItemsRef ref = Accessor::get_items_from_node(*node);
3660 if (item_to_remove < *ref.items || item_to_remove >= *ref.items + *ref.items_num) {
3661 if constexpr (Accessor::has_name) {
3662 char **name_ptr = Accessor::get_name(*item_to_remove);
3663 if (name_ptr && *name_ptr) {
3664 BKE_reportf(reports, RPT_ERROR, "Unable to locate item '%s' in node", *name_ptr);
3665 return;
3666 }
3667 }
3668 else {
3669 BKE_report(reports, RPT_ERROR, "Unable to locate item in node");
3670 }
3671 return;
3672 }
3673 const int remove_index = item_to_remove - *ref.items;
3675 ref.items, ref.items_num, ref.active_index, remove_index, Accessor::destruct_item);
3676
3677 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
3679 BKE_main_ensure_invariants(*bmain, ntree->id);
3681}
3682
3683template<typename Accessor> static void rna_Node_ItemArray_clear(ID *id, bNode *node, Main *bmain)
3684{
3685 blender::nodes::socket_items::SocketItemsRef ref = Accessor::get_items_from_node(*node);
3686 blender::dna::array::clear(ref.items, ref.items_num, ref.active_index, Accessor::destruct_item);
3687
3688 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
3690 BKE_main_ensure_invariants(*bmain, ntree->id);
3692}
3693
3694template<typename Accessor>
3695static void rna_Node_ItemArray_move(
3696 ID *id, bNode *node, Main *bmain, const int from_index, const int to_index)
3697{
3698 blender::nodes::socket_items::SocketItemsRef ref = Accessor::get_items_from_node(*node);
3699 const int items_num = *ref.items_num;
3700 if (from_index < 0 || to_index < 0 || from_index >= items_num || to_index >= items_num) {
3701 return;
3702 }
3703 blender::dna::array::move_index(*ref.items, items_num, from_index, to_index);
3704
3705 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
3707 BKE_main_ensure_invariants(*bmain, ntree->id);
3709}
3710
3711template<typename Accessor> static PointerRNA rna_Node_ItemArray_active_get(PointerRNA *ptr)
3712{
3713 bNode *node = ptr->data_as<bNode>();
3714 blender::nodes::socket_items::SocketItemsRef ref = Accessor::get_items_from_node(*node);
3715 typename Accessor::ItemT *active_item = nullptr;
3716 const int active_index = *ref.active_index;
3717 const int items_num = *ref.items_num;
3718 if (active_index >= 0 && active_index < items_num) {
3719 active_item = &(*ref.items)[active_index];
3720 }
3721 return RNA_pointer_create_discrete(ptr->owner_id, Accessor::item_srna, active_item);
3722}
3723template<typename Accessor>
3724static void rna_Node_ItemArray_active_set(PointerRNA *ptr,
3725 PointerRNA value,
3726 ReportList * /*reports*/)
3727{
3728 using ItemT = typename Accessor::ItemT;
3729 bNode *node = ptr->data_as<bNode>();
3730 ItemT *item = static_cast<ItemT *>(value.data);
3731
3732 blender::nodes::socket_items::SocketItemsRef ref = Accessor::get_items_from_node(*node);
3733 if (item >= *ref.items && item < *ref.items + *ref.items_num) {
3734 *ref.active_index = item - *ref.items;
3735 }
3736}
3737
3738template<typename Accessor>
3739static void rna_Node_ItemArray_item_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
3740{
3741 using ItemT = typename Accessor::ItemT;
3742 bNodeTree &ntree = *reinterpret_cast<bNodeTree *>(ptr->owner_id);
3743 ItemT &item = *static_cast<ItemT *>(ptr->data);
3745 BLI_assert(node != nullptr);
3746
3748 BKE_main_ensure_invariants(*bmain, ntree.id);
3749}
3750
3751template<typename Accessor>
3752static const EnumPropertyItem *rna_Node_ItemArray_socket_type_itemf(bContext * /*C*/,
3753 PointerRNA *ptr,
3754 PropertyRNA * /*prop*/,
3755 bool *r_free)
3756{
3757 *r_free = true;
3758 bNodeTree &ntree = *reinterpret_cast<bNodeTree *>(ptr->owner_id);
3759 return itemf_function_check(
3761 return Accessor::supports_socket_type(eNodeSocketDatatype(item->value), ntree.type);
3762 });
3763}
3764
3765template<typename Accessor>
3766static void rna_Node_ItemArray_item_name_set(PointerRNA *ptr, const char *value)
3767{
3768 using ItemT = typename Accessor::ItemT;
3769 bNodeTree &ntree = *reinterpret_cast<bNodeTree *>(ptr->owner_id);
3770 ItemT &item = *static_cast<ItemT *>(ptr->data);
3772 BLI_assert(node != nullptr);
3774}
3775
3776template<typename Accessors>
3777static void rna_Node_ItemArray_item_color_get(PointerRNA *ptr, float *values)
3778{
3779 using ItemT = typename Accessors::ItemT;
3780 ItemT &item = *static_cast<ItemT *>(ptr->data);
3782 Accessors::get_socket_type(item), 0);
3783 ED_node_type_draw_color(socket_type_idname.c_str(), values);
3784}
3785
3786template<typename Accessor>
3787typename Accessor::ItemT *rna_Node_ItemArray_new_with_socket_and_name(
3788 ID *id, bNode *node, Main *bmain, ReportList *reports, int socket_type, const char *name)
3789{
3790 using ItemT = typename Accessor::ItemT;
3791
3792 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
3793 if (!Accessor::supports_socket_type(eNodeSocketDatatype(socket_type), ntree->type)) {
3794 BKE_report(reports, RPT_ERROR, "Unable to create item with this socket type");
3795 return nullptr;
3796 }
3798 *ntree, *node, eNodeSocketDatatype(socket_type), name);
3799
3801 BKE_main_ensure_invariants(*bmain, ntree->id);
3803
3804 return new_item;
3805}
3806
3807template<typename Accessor>
3808static const EnumPropertyItem *rna_Node_ItemArray_structure_type_itemf(bContext * /*C*/,
3809 PointerRNA *ptr,
3810 PropertyRNA * /*prop*/,
3811 bool *r_free)
3812{
3813 using ItemT = typename Accessor::ItemT;
3814
3815 const bNodeTree *ntree = reinterpret_cast<const bNodeTree *>(ptr->owner_id);
3816 const ItemT &item = *static_cast<const ItemT *>(ptr->data);
3817 const eNodeSocketDatatype socket_type = Accessor::get_socket_type(item);
3818 return rna_NodeSocket_structure_type_item_filter(ntree, socket_type, r_free);
3819}
3820
3821static IndexSwitchItem *rna_NodeIndexSwitchItems_new(ID *id, bNode *node, Main *bmain)
3822{
3824 *node);
3825
3826 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
3828 BKE_main_ensure_invariants(*bmain, ntree->id);
3830
3831 return new_item;
3832}
3833
3834/* The same as #grid_socket_type_items_filter_fn. */
3835static const EnumPropertyItem *rna_NodeFieldToGridItem_data_type_itemf(bContext * /*C*/,
3836 PointerRNA * /*ptr*/,
3837 PropertyRNA * /*prop*/,
3838 bool *r_free)
3839{
3840 *r_free = true;
3841 return itemf_function_check(
3844 });
3845}
3846
3847static const EnumPropertyItem *rna_NodeGeometryCaptureAttributeItem_data_type_itemf(
3848 bContext * /*C*/, PointerRNA * /*ptr*/, PropertyRNA * /*prop*/, bool *r_free)
3849{
3850 *r_free = true;
3851 /* See #attribute_type_type_with_socket_fn. */
3852 return itemf_function_check(rna_enum_attribute_type_items, [](const EnumPropertyItem *item) {
3853 return ELEM(item->value,
3861 });
3862}
3863
3864/* ******** Node Socket Types ******** */
3865
3866static void rna_FrameNode_label_size_update(Main *bmain, Scene *scene, PointerRNA *ptr)
3867{
3869 rna_Node_update(bmain, scene, ptr);
3870}
3871
3872static void rna_ShaderNodeTexIES_mode_set(PointerRNA *ptr, int value)
3873{
3874 bNode *node = ptr->data_as<bNode>();
3875 NodeShaderTexIES *nss = static_cast<NodeShaderTexIES *>(node->storage);
3876
3877 if (nss->mode != value) {
3878 nss->mode = value;
3879 nss->filepath[0] = '\0';
3880
3881 /* replace text datablock by filepath */
3882 if (node->id) {
3883 Text *text = reinterpret_cast<Text *>(node->id);
3884
3885 if (value == NODE_IES_EXTERNAL && text->filepath) {
3886 STRNCPY(nss->filepath, text->filepath);
3887 BLI_path_abs(nss->filepath, ID_BLEND_PATH_FROM_GLOBAL(&text->id));
3888 BLI_path_rel(nss->filepath, ID_BLEND_PATH_FROM_GLOBAL(ptr->owner_id));
3889 }
3890
3891 id_us_min(node->id);
3892 node->id = nullptr;
3893 }
3894 }
3895}
3896
3897static void rna_ShaderNodeScript_mode_set(PointerRNA *ptr, int value)
3898{
3899 bNode *node = ptr->data_as<bNode>();
3900 NodeShaderScript *nss = static_cast<NodeShaderScript *>(node->storage);
3901
3902 if (nss->mode != value) {
3903 nss->mode = value;
3904 nss->filepath[0] = '\0';
3905 nss->flag &= ~NODE_SCRIPT_AUTO_UPDATE;
3906
3907 /* replace text data-block by filepath */
3908 if (node->id) {
3909 Text *text = reinterpret_cast<Text *>(node->id);
3910
3911 if (value == NODE_SCRIPT_EXTERNAL && text->filepath) {
3912 STRNCPY(nss->filepath, text->filepath);
3913 BLI_path_abs(nss->filepath, ID_BLEND_PATH_FROM_GLOBAL(&text->id));
3914 BLI_path_rel(nss->filepath, ID_BLEND_PATH_FROM_GLOBAL(ptr->owner_id));
3915 }
3916
3917 id_us_min(node->id);
3918 node->id = nullptr;
3919 }
3920
3921 /* remove any bytecode */
3922 if (nss->bytecode) {
3923 MEM_freeN(nss->bytecode);
3924 nss->bytecode = nullptr;
3925 }
3926
3927 nss->bytecode_hash[0] = '\0';
3928 }
3929}
3930
3931static void rna_ShaderNodeScript_bytecode_get(PointerRNA *ptr, char *value)
3932{
3933 bNode *node = ptr->data_as<bNode>();
3934 NodeShaderScript *nss = static_cast<NodeShaderScript *>(node->storage);
3935
3936 strcpy(value, (nss->bytecode) ? nss->bytecode : "");
3937}
3938
3939static int rna_ShaderNodeScript_bytecode_length(PointerRNA *ptr)
3940{
3941 bNode *node = ptr->data_as<bNode>();
3942 NodeShaderScript *nss = static_cast<NodeShaderScript *>(node->storage);
3943
3944 return (nss->bytecode) ? strlen(nss->bytecode) : 0;
3945}
3946
3947static void rna_ShaderNodeScript_bytecode_set(PointerRNA *ptr, const char *value)
3948{
3949 bNode *node = ptr->data_as<bNode>();
3950 NodeShaderScript *nss = static_cast<NodeShaderScript *>(node->storage);
3951
3952 if (nss->bytecode) {
3953 MEM_freeN(nss->bytecode);
3954 }
3955
3956 if (value && value[0]) {
3957 nss->bytecode = BLI_strdup(value);
3958 }
3959 else {
3960 nss->bytecode = nullptr;
3961 }
3962}
3963
3964static void rna_ShaderNodeScript_update(Main *bmain, Scene *scene, PointerRNA *ptr)
3965{
3966 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
3967 bNode *node = ptr->data_as<bNode>();
3968 RenderEngineType *engine_type = (scene != nullptr) ? RE_engines_find(scene->r.engine) : nullptr;
3969
3970 if (engine_type && engine_type->update_script_node) {
3971 /* auto update node */
3972 RenderEngine *engine = RE_engine_create(engine_type);
3973 engine_type->update_script_node(engine, ntree, node);
3974 RE_engine_free(engine);
3975 }
3976
3978 BKE_main_ensure_invariants(*bmain, ntree->id);
3979}
3980
3981static void rna_ShaderNode_socket_update(Main *bmain, Scene *scene, PointerRNA *ptr)
3982{
3983 rna_Node_update(bmain, scene, ptr);
3984}
3985
3986void rna_Node_socket_update(Main *bmain, Scene *scene, PointerRNA *ptr)
3987{
3988 rna_Node_update(bmain, scene, ptr);
3989}
3990
3991static void rna_ShaderNode_is_active_output_set(PointerRNA *ptr, bool value)
3992{
3993 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
3994 bNode *node = ptr->data_as<bNode>();
3995 if (value) {
3996 /* If this node becomes the active output, the others of the same type can't be the active
3997 * output anymore. */
3998 for (bNode *other_node : ntree->all_nodes()) {
3999 if (other_node->type_legacy == node->type_legacy) {
4000 other_node->flag &= ~NODE_DO_OUTPUT;
4001 }
4002 }
4003 node->flag |= NODE_DO_OUTPUT;
4004 }
4005 else {
4006 node->flag &= ~NODE_DO_OUTPUT;
4007 }
4008}
4009
4010static void rna_GroupOutput_is_active_output_set(PointerRNA *ptr, bool value)
4011{
4012 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(ptr->owner_id);
4013 bNode *node = ptr->data_as<bNode>();
4014 if (value) {
4015 /* Make sure that no other group output is active at the same time. */
4016 for (bNode *other_node : ntree->all_nodes()) {
4017 if (other_node->is_group_output()) {
4018 other_node->flag &= ~NODE_DO_OUTPUT;
4019 }
4020 }
4021 node->flag |= NODE_DO_OUTPUT;
4022 }
4023 else {
4024 node->flag &= ~NODE_DO_OUTPUT;
4025 }
4026}
4027
4028static int rna_NodeConvertColorSpace_from_color_space_get(PointerRNA *ptr)
4029{
4030 bNode *node = ptr->data_as<bNode>();
4031 NodeConvertColorSpace *node_storage = static_cast<NodeConvertColorSpace *>(node->storage);
4032 return IMB_colormanagement_colorspace_get_named_index(node_storage->from_color_space);
4033}
4034
4035static void rna_NodeConvertColorSpace_from_color_space_set(PointerRNA *ptr, int value)
4036{
4037 bNode *node = ptr->data_as<bNode>();
4038 NodeConvertColorSpace *node_storage = static_cast<NodeConvertColorSpace *>(node->storage);
4040
4041 if (name && name[0]) {
4042 STRNCPY_UTF8(node_storage->from_color_space, name);
4043 }
4044}
4045static int rna_NodeConvertColorSpace_to_color_space_get(PointerRNA *ptr)
4046{
4047 bNode *node = ptr->data_as<bNode>();
4048 NodeConvertColorSpace *node_storage = static_cast<NodeConvertColorSpace *>(node->storage);
4049 return IMB_colormanagement_colorspace_get_named_index(node_storage->to_color_space);
4050}
4051
4052static void rna_NodeConvertColorSpace_to_color_space_set(PointerRNA *ptr, int value)
4053{
4054 bNode *node = ptr->data_as<bNode>();
4055 NodeConvertColorSpace *node_storage = static_cast<NodeConvertColorSpace *>(node->storage);
4057
4058 if (name && name[0]) {
4059 STRNCPY_UTF8(node_storage->to_color_space, name);
4060 }
4061}
4062
4063static void rna_reroute_node_socket_type_set(PointerRNA *ptr, const char *value)
4064{
4065 const bNodeTree &ntree = *reinterpret_cast<bNodeTree *>(ptr->owner_id);
4066 blender::bke::bNodeTreeType *ntree_type = ntree.typeinfo;
4067
4068 bNode &node = *ptr->data_as<bNode>();
4069
4070 if (value == nullptr) {
4071 return;
4072 }
4074 if (socket_type == nullptr) {
4075 return;
4076 }
4077 if (socket_type->subtype != PROP_NONE) {
4078 return;
4079 }
4080 if (ntree_type->valid_socket_type && !ntree_type->valid_socket_type(ntree_type, socket_type)) {
4081 return;
4082 }
4083 NodeReroute *storage = static_cast<NodeReroute *>(node.storage);
4084 STRNCPY(storage->type_idname, value);
4085}
4086
4087static const EnumPropertyItem *rna_NodeConvertColorSpace_color_space_itemf(bContext * /*C*/,
4088 PointerRNA * /*ptr*/,
4089 PropertyRNA * /*prop*/,
4090 bool *r_free)
4091{
4092 EnumPropertyItem *items = nullptr;
4093 int totitem = 0;
4094
4096 RNA_enum_item_end(&items, &totitem);
4097
4098 *r_free = true;
4099
4100 return items;
4101}
4102
4103static NodeEnumItem *rna_NodeMenuSwitchItems_new(ID *id,
4104 bNode *node,
4105 Main *bmain,
4106 const char *name)
4107{
4108 NodeEnumItem *new_item =
4110
4111 bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id);
4113 BKE_main_ensure_invariants(*bmain, ntree->id);
4115
4116 return new_item;
4117}
4118
4119static PointerRNA rna_NodeMenuSwitch_enum_definition_get(PointerRNA *ptr)
4120{
4121 /* Return node itself. The data is now directly available on the node and does not have to be
4122 * accessed through "enum_definition". */
4123 return *ptr;
4124}
4125
4126#else
4127
4129 {0, "PLACEHOLDER", 0, "Placeholder", ""},
4130 {0, nullptr, 0, nullptr, nullptr},
4131};
4132
4134 {0, "ALL", 0, "All", ""},
4135 {0, nullptr, 0, nullptr, nullptr},
4136};
4137
4139 {0, "PLACEHOLDER", 0, "Placeholder", ""},
4140 {0, nullptr, 0, nullptr, nullptr},
4141};
4142
4144 {0, "ITUBT601", 0, "ITU 601", ""},
4145 {1, "ITUBT709", 0, "ITU 709", ""},
4146 {2, "JFIF", 0, "JPEG", ""},
4147 {0, nullptr, 0, nullptr, nullptr},
4148};
4149
4151 {SHD_GLOSSY_BECKMANN, "BECKMANN", 0, "Beckmann", ""},
4152 {SHD_GLOSSY_GGX, "GGX", 0, "GGX", ""},
4154 "MULTI_GGX",
4155 0,
4156 "Multiscatter GGX",
4157 "GGX with additional correction to account for multiple scattering, preserve energy and "
4158 "prevent unexpected darkening at high roughness"},
4159 {0, nullptr, 0, nullptr, nullptr},
4160};
4161
4164 "PHYSICAL_CONDUCTOR",
4165 0,
4166 "Physical Conductor",
4167 "Fresnel conductor based on the complex refractive index per color channel"},
4169 "F82",
4170 0,
4171 "F82 Tint",
4172 "An approximation of the Fresnel conductor curve based on the colors at perpendicular and "
4173 "near-grazing (roughly 82°) angles"},
4174 {0, nullptr, 0, nullptr, nullptr},
4175};
4176
4178 {SHD_GLOSSY_BECKMANN, "BECKMANN", 0, "Beckmann", ""},
4179 {SHD_GLOSSY_GGX, "GGX", 0, "GGX", ""},
4180 {SHD_GLOSSY_ASHIKHMIN_SHIRLEY, "ASHIKHMIN_SHIRLEY", 0, "Ashikhmin-Shirley", ""},
4182 "MULTI_GGX",
4183 0,
4184 "Multiscatter GGX",
4185 "GGX with additional correction to account for multiple scattering, preserve energy and "
4186 "prevent unexpected darkening at high roughness"},
4187 {0, nullptr, 0, nullptr, nullptr},
4188};
4189
4191 {SHD_GLOSSY_BECKMANN, "BECKMANN", 0, "Beckmann", ""},
4192 {SHD_GLOSSY_GGX, "GGX", 0, "GGX", ""},
4194 "MULTI_GGX",
4195 0,
4196 "Multiscatter GGX",
4197 "GGX with additional correction to account for multiple scattering, preserve energy and "
4198 "prevent unexpected darkening at high roughness"},
4199 {0, nullptr, 0, nullptr, nullptr},
4200};
4201
4203 {SHD_GLOSSY_BECKMANN, "BECKMANN", 0, "Beckmann", ""},
4204 {SHD_GLOSSY_GGX, "GGX", 0, "GGX", ""},
4205 {0, nullptr, 0, nullptr, nullptr},
4206};
4207
4209 {SHD_SHEEN_ASHIKHMIN, "ASHIKHMIN", 0, "Ashikhmin", "Classic Ashikhmin velvet (legacy model)"},
4211 "MICROFIBER",
4212 0,
4213 "Microfiber",
4214 "Microflake-based model of multiple scattering between normal-oriented fibers"},
4215 {0, nullptr, 0, nullptr, nullptr},
4216};
4217
4219 {SHD_TOON_DIFFUSE, "DIFFUSE", 0, "Diffuse", "Use diffuse BSDF"},
4220 {SHD_TOON_GLOSSY, "GLOSSY", 0, "Glossy", "Use glossy BSDF"},
4221 {0, nullptr, 0, nullptr, nullptr},
4222};
4223
4226 "Reflection",
4227 0,
4228 "Reflection",
4229 "The light that bounces off the surface of the hair"},
4231 "Transmission",
4232 0,
4233 "Transmission",
4234 "The light that passes through the hair and exits on the other side"},
4235 {0, nullptr, 0, nullptr, nullptr},
4236};
4237
4240 "CHIANG",
4241 0,
4242 "Chiang",
4243 "Near-field hair scattering model by Chiang et al. 2016, suitable for close-up looks, but is "
4244 "more noisy when viewing from a distance."},
4246 "HUANG",
4247 0,
4248 "Huang",
4249 "Multi-scale hair scattering model by Huang et al. 2022, suitable for viewing both up close "
4250 "and from a distance, supports elliptical cross-sections and has more precise highlight in "
4251 "forward scattering directions."},
4252 {0, nullptr, 0, nullptr, nullptr},
4253};
4254
4257 "ABSORPTION",
4258 0,
4259 "Absorption Coefficient",
4260 "Directly set the absorption coefficient \"sigma_a\" (this is not the most intuitive way to "
4261 "color hair)"},
4263 "MELANIN",
4264 0,
4265 "Melanin Concentration",
4266 "Define the melanin concentrations below to get the most realistic-looking hair (you can get "
4267 "the concentrations for different types of hair online)"},
4269 "COLOR",
4270 0,
4271 "Direct Coloring",
4272 "Choose the color of your preference, and the shader will approximate the absorption "
4273 "coefficient to render lookalike hair"},
4274 {0, nullptr, 0, nullptr, nullptr},
4275};
4276
4278 {NODE_SCRIPT_INTERNAL, "INTERNAL", 0, "Internal", "Use internal text data-block"},
4279 {NODE_SCRIPT_EXTERNAL, "EXTERNAL", 0, "External", "Use external .osl or .oso file"},
4280 {0, nullptr, 0, nullptr, nullptr},
4281};
4282
4284 {NODE_IES_INTERNAL, "INTERNAL", 0, "Internal", "Use internal text data-block"},
4285 {NODE_IES_EXTERNAL, "EXTERNAL", 0, "External", "Use external .ies file"},
4286 {0, nullptr, 0, nullptr, nullptr},
4287};
4288
4290 {SHD_GLOSSY_GGX, "GGX", 0, "GGX", ""},
4292 "MULTI_GGX",
4293 0,
4294 "Multiscatter GGX",
4295 "GGX with additional correction to account for multiple scattering, preserve energy and "
4296 "prevent unexpected darkening at high roughness"},
4297 {0, nullptr, 0, nullptr, nullptr},
4298};
4299
4302 "BURLEY",
4303 0,
4304 "Christensen-Burley",
4305 "Approximation to physically based volume scattering"},
4307 "RANDOM_WALK",
4308 0,
4309 "Random Walk",
4310 "Volumetric approximation to physically based volume scattering, using the scattering radius "
4311 "as specified"},
4313 "RANDOM_WALK_SKIN",
4314 0,
4315 "Random Walk (Skin)",
4316 "Volumetric approximation to physically based volume scattering, with scattering radius "
4317 "automatically adjusted to match color textures. Designed for skin shading."},
4318 {0, nullptr, 0, nullptr, nullptr}};
4319
4322 "REPEAT",
4323 0,
4324 "Repeat",
4325 "Cause the image to repeat horizontally and vertically"},
4327 "EXTEND",
4328 0,
4329 "Extend",
4330 "Extend by repeating edge pixels of the image"},
4332 "CLIP",
4333 0,
4334 "Clip",
4335 "Clip to image size and set exterior pixels as transparent"},
4337 "MIRROR",
4338 0,
4339 "Mirror",
4340 "Repeatedly flip the image horizontally and vertically"},
4341 {0, nullptr, 0, nullptr, nullptr},
4342};
4343
4346 "HENYEY_GREENSTEIN",
4347 0,
4348 "Henyey-Greenstein",
4349 "Henyey-Greenstein, default phase function for the scattering of light"},
4351 "FOURNIER_FORAND",
4352 0,
4353 "Fournier-Forand",
4354 "Fournier-Forand phase function, used for the scattering of light in underwater "
4355 "environments"},
4357 "DRAINE",
4358 0,
4359 "Draine",
4360 "Draine phase functions, mostly used for the scattering of light in interstellar dust"},
4362 "RAYLEIGH",
4363 0,
4364 "Rayleigh",
4365 "Rayleigh phase function, mostly used for particles smaller than the wavelength of light, "
4366 "such as scattering of sunlight in earth's atmosphere"},
4368 "MIE",
4369 0,
4370 "Mie",
4371 "Approximation of Mie scattering in water droplets, used for scattering in clouds and fog"},
4372 {0, nullptr, 0, nullptr, nullptr},
4373};
4374
4376 StructRNA *srna,
4377 const char *accessor,
4378 const bool add_socket_type,
4379 const bool add_vector_socket_dimensions = false)
4380{
4381 static blender::LinearAllocator<> allocator;
4382 PropertyRNA *prop;
4383
4384 char name_set_func[128];
4385 SNPRINTF(name_set_func, "rna_Node_ItemArray_item_name_set<%s>", accessor);
4386
4387 char item_update_func[128];
4388 SNPRINTF(item_update_func, "rna_Node_ItemArray_item_update<%s>", accessor);
4389 const char *item_update_func_ptr = allocator.copy_string(item_update_func).c_str();
4390
4391 char socket_type_itemf[128];
4392 SNPRINTF(socket_type_itemf, "rna_Node_ItemArray_socket_type_itemf<%s>", accessor);
4393
4394 char color_get_func[128];
4395 SNPRINTF(color_get_func, "rna_Node_ItemArray_item_color_get<%s>", accessor);
4396
4397 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
4399 prop, nullptr, nullptr, allocator.copy_string(name_set_func).c_str());
4400 RNA_def_property_ui_text(prop, "Name", "");
4401 RNA_def_struct_name_property(srna, prop);
4402 RNA_def_property_update(prop, NC_NODE | NA_EDITED, item_update_func_ptr);
4403
4404 if (add_socket_type) {
4405 prop = RNA_def_property(srna, "socket_type", PROP_ENUM, PROP_NONE);
4408 prop, nullptr, nullptr, allocator.copy_string(socket_type_itemf).c_str());
4409 RNA_def_property_ui_text(prop, "Socket Type", "");
4411 RNA_def_property_update(prop, NC_NODE | NA_EDITED, item_update_func_ptr);
4412
4413 if (add_vector_socket_dimensions) {
4414 prop = RNA_def_property(srna, "vector_socket_dimensions", PROP_INT, PROP_NONE);
4415 RNA_def_property_int_sdna(prop, nullptr, "vector_socket_dimensions");
4416 RNA_def_property_range(prop, 2, 4);
4418 RNA_def_property_ui_text(prop, "Dimensions", "Dimensions of the vector socket");
4419 RNA_def_property_update(prop, NC_NODE | NA_EDITED, item_update_func_ptr);
4420 }
4421 }
4422
4423 prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
4424 RNA_def_property_array(prop, 4);
4426 prop, allocator.copy_string(color_get_func).c_str(), nullptr, nullptr);
4429 prop, "Color", "Color of the corresponding socket type in the node editor");
4430}
4431
4433 const char *item_name,
4434 const char *accessor_name)
4435{
4436 static blender::LinearAllocator<> allocator;
4437 PropertyRNA *parm;
4438 FunctionRNA *func;
4439
4440 char remove_call[128];
4441 SNPRINTF(remove_call, "rna_Node_ItemArray_remove<%s>", accessor_name);
4442 char clear_call[128];
4443 SNPRINTF(clear_call, "rna_Node_ItemArray_clear<%s>", accessor_name);
4444 char move_call[128];
4445 SNPRINTF(move_call, "rna_Node_ItemArray_move<%s>", accessor_name);
4446
4447 func = RNA_def_function(srna, "remove", allocator.copy_string(remove_call).c_str());
4448 RNA_def_function_ui_description(func, "Remove an item");
4450 parm = RNA_def_pointer(func, "item", item_name, "Item", "The item to remove");
4452
4453 func = RNA_def_function(srna, "clear", allocator.copy_string(clear_call).c_str());
4454 RNA_def_function_ui_description(func, "Remove all items");
4456
4457 func = RNA_def_function(srna, "move", allocator.copy_string(move_call).c_str());
4458 RNA_def_function_ui_description(func, "Move an item to another position");
4460 parm = RNA_def_int(
4461 func, "from_index", -1, 0, INT_MAX, "From Index", "Index of the item to move", 0, 10000);
4463 parm = RNA_def_int(
4464 func, "to_index", -1, 0, INT_MAX, "To Index", "Target index for the item", 0, 10000);
4466}
4467
4469 const char *item_name,
4470 const char *accessor_name)
4471{
4472 static blender::LinearAllocator<> allocator;
4473 PropertyRNA *parm;
4474 FunctionRNA *func;
4475
4476 char name[128];
4477 SNPRINTF(name, "rna_Node_ItemArray_new_with_socket_and_name<%s>", accessor_name);
4478
4479 func = RNA_def_function(srna, "new", allocator.copy_string(name).c_str());
4480 RNA_def_function_ui_description(func, "Add an item at the end");
4482 parm = RNA_def_enum(func,
4483 "socket_type",
4486 "Socket Type",
4487 "Socket type of the item");
4489 parm = RNA_def_string(func, "name", nullptr, MAX_NAME, "Name", "");
4491 /* return value */
4492 parm = RNA_def_pointer(func, "item", item_name, "Item", "New item");
4493 RNA_def_function_return(func, parm);
4494}
4495
4496/* -- Common nodes ---------------------------------------------------------- */
4497
4498static void def_group_input(BlenderRNA * /*brna*/, StructRNA * /*srna*/) {}
4499
4500static void def_group_output(BlenderRNA * /*brna*/, StructRNA *srna)
4501{
4502 PropertyRNA *prop;
4503
4504 prop = RNA_def_property(srna, "is_active_output", PROP_BOOLEAN, PROP_NONE);
4505 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_DO_OUTPUT);
4507 prop, "Active Output", "True if this node is used as the active group output");
4508 RNA_def_property_boolean_funcs(prop, nullptr, "rna_GroupOutput_is_active_output_set");
4509 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4510}
4511
4512static void def_group(BlenderRNA * /*brna*/, StructRNA *srna)
4513{
4514 PropertyRNA *prop;
4515
4516 prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
4517 RNA_def_property_pointer_sdna(prop, nullptr, "id");
4518 RNA_def_property_struct_type(prop, "NodeTree");
4520 prop, nullptr, "rna_NodeGroup_node_tree_set", nullptr, "rna_NodeGroup_node_tree_poll");
4523 RNA_def_property_ui_text(prop, "Node Tree", "");
4524 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeGroup_update");
4525}
4526
4528 const char *struct_name,
4529 const char *base_name,
4530 const char *ui_name,
4531 const char *ui_desc,
4532 const char *reg_func)
4533{
4534 StructRNA *srna;
4535
4536 srna = RNA_def_struct(brna, struct_name, base_name);
4537 RNA_def_struct_ui_text(srna, ui_name, ui_desc);
4538 RNA_def_struct_sdna(srna, "bNode");
4539
4540 RNA_def_struct_register_funcs(srna, reg_func, "rna_Node_unregister", nullptr);
4541
4542 def_group(brna, srna);
4543}
4544
4545static void def_frame(BlenderRNA * /*brna*/, StructRNA *srna)
4546{
4547 PropertyRNA *prop;
4548
4549 prop = RNA_def_property(srna, "text", PROP_POINTER, PROP_NONE);
4550 RNA_def_property_pointer_sdna(prop, nullptr, "id");
4551 RNA_def_property_struct_type(prop, "Text");
4554 RNA_def_property_ui_text(prop, "Text", "");
4555 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4556
4557 RNA_def_struct_sdna_from(srna, "NodeFrame", "storage");
4559
4560 prop = RNA_def_property(srna, "shrink", PROP_BOOLEAN, PROP_NONE);
4561 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_FRAME_SHRINK);
4562 RNA_def_property_ui_text(prop, "Shrink", "Shrink the frame to minimal bounding box");
4563 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
4564
4565 prop = RNA_def_property(srna, "label_size", PROP_INT, PROP_NONE);
4566 RNA_def_property_int_sdna(prop, nullptr, "label_size");
4567 RNA_def_property_range(prop, 8, 64);
4568 RNA_def_property_ui_text(prop, "Label Font Size", "Font size to use for displaying the label");
4569 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_FrameNode_label_size_update");
4570}
4571
4572static void def_clamp(BlenderRNA * /*brna*/, StructRNA *srna)
4573{
4574 PropertyRNA *prop;
4575
4576 prop = RNA_def_property(srna, "clamp_type", PROP_ENUM, PROP_NONE);
4577 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
4579 RNA_def_property_ui_text(prop, "Clamp Type", "");
4580 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
4581}
4582
4583static void def_map_range(BlenderRNA * /*brna*/, StructRNA *srna)
4584{
4585 static const EnumPropertyItem rna_enum_data_type_items[] = {
4586 {CD_PROP_FLOAT, "FLOAT", ICON_NODE_SOCKET_FLOAT, "Float", "Floating-point value"},
4588 "FLOAT_VECTOR",
4589 ICON_NODE_SOCKET_VECTOR,
4590 "Vector",
4591 "3D vector with floating-point values"},
4592 {0, nullptr, 0, nullptr, nullptr},
4593 };
4594
4595 RNA_def_struct_sdna_from(srna, "NodeMapRange", "storage");
4596
4597 PropertyRNA *prop;
4598
4599 prop = RNA_def_property(srna, "clamp", PROP_BOOLEAN, PROP_NONE);
4600 RNA_def_property_boolean_sdna(prop, nullptr, "clamp", 1);
4601 RNA_def_property_ui_text(prop, "Clamp", "Clamp the result to the target range [To Min, To Max]");
4602 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4603
4604 prop = RNA_def_property(srna, "interpolation_type", PROP_ENUM, PROP_NONE);
4605 RNA_def_property_enum_sdna(prop, nullptr, "interpolation_type");
4607 RNA_def_property_ui_text(prop, "Interpolation Type", "");
4608 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
4609
4610 prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
4611 RNA_def_property_enum_bitflag_sdna(prop, nullptr, "data_type");
4612 RNA_def_property_enum_items(prop, rna_enum_data_type_items);
4613 RNA_def_property_ui_text(prop, "Data Type", "");
4614 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
4615}
4616
4617static void def_math(BlenderRNA * /*brna*/, StructRNA *srna)
4618{
4619 PropertyRNA *prop;
4620
4621 prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
4622 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
4624 RNA_def_property_ui_text(prop, "Operation", "");
4626 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
4628
4629 prop = RNA_def_property(srna, "use_clamp", PROP_BOOLEAN, PROP_NONE);
4630 RNA_def_property_boolean_sdna(prop, nullptr, "custom2", SHD_MATH_CLAMP);
4631 RNA_def_property_ui_text(prop, "Clamp", "Clamp result of the node to 0.0 to 1.0 range");
4632 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4633}
4634
4635static void def_sh_mix(BlenderRNA * /*brna*/, StructRNA *srna)
4636{
4637 static const EnumPropertyItem rna_enum_mix_mode_items[] = {
4638 {NODE_MIX_MODE_UNIFORM, "UNIFORM", 0, "Uniform", "Use a single factor for all components"},
4639 {NODE_MIX_MODE_NON_UNIFORM, "NON_UNIFORM", 0, "Non-Uniform", "Per component factor"},
4640 {0, nullptr, 0, nullptr, nullptr},
4641 };
4642
4643 PropertyRNA *prop;
4644
4645 RNA_def_struct_sdna_from(srna, "NodeShaderMix", "storage");
4646
4647 prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
4648 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_ShaderNodeMix_data_type_itemf");
4651 RNA_def_property_ui_text(prop, "Data Type", "");
4652 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
4653
4654 prop = RNA_def_property(srna, "factor_mode", PROP_ENUM, PROP_NONE);
4655 RNA_def_property_enum_items(prop, rna_enum_mix_mode_items);
4657 RNA_def_property_ui_text(prop, "Factor Mode", "");
4658 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
4659
4660 prop = RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
4661 RNA_def_property_enum_sdna(prop, nullptr, "blend_type");
4663 RNA_def_property_ui_text(prop, "Blending Mode", "");
4664 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4665
4666 prop = RNA_def_property(srna, "clamp_factor", PROP_BOOLEAN, PROP_NONE);
4667 RNA_def_property_boolean_sdna(prop, nullptr, "clamp_factor", 1);
4668 RNA_def_property_ui_text(prop, "Clamp Factor", "Clamp the factor to [0,1] range");
4669 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4670
4671 prop = RNA_def_property(srna, "clamp_result", PROP_BOOLEAN, PROP_NONE);
4672 RNA_def_property_boolean_sdna(prop, nullptr, "clamp_result", 1);
4673 RNA_def_property_ui_text(prop, "Clamp Result", "Clamp the result to [0,1] range");
4674 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4675}
4676
4677static void def_float_to_int(BlenderRNA * /*brna*/, StructRNA *srna)
4678{
4679 PropertyRNA *prop;
4680
4681 prop = RNA_def_property(srna, "rounding_mode", PROP_ENUM, PROP_NONE);
4682 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
4685 prop, "Rounding Mode", "Method used to convert the float to an integer");
4687 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4688}
4689
4690static void def_vector_math(BlenderRNA * /*brna*/, StructRNA *srna)
4691{
4692 PropertyRNA *prop;
4693
4694 prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
4695 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
4697 RNA_def_property_ui_text(prop, "Operation", "");
4699 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
4701}
4702
4703static void def_rgb_curve(BlenderRNA * /*brna*/, StructRNA *srna)
4704{
4705 PropertyRNA *prop;
4706
4707 prop = RNA_def_property(srna, "mapping", PROP_POINTER, PROP_NONE);
4708 RNA_def_property_pointer_sdna(prop, nullptr, "storage");
4709 RNA_def_property_struct_type(prop, "CurveMapping");
4710 RNA_def_property_ui_text(prop, "Mapping", "");
4711 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4712}
4713
4714static void def_vector_curve(BlenderRNA * /*brna*/, StructRNA *srna)
4715{
4716 PropertyRNA *prop;
4717
4718 prop = RNA_def_property(srna, "mapping", PROP_POINTER, PROP_NONE);
4719 RNA_def_property_pointer_sdna(prop, nullptr, "storage");
4720 RNA_def_property_struct_type(prop, "CurveMapping");
4721 RNA_def_property_ui_text(prop, "Mapping", "");
4722 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4723}
4724
4725static void def_float_curve(BlenderRNA * /*brna*/, StructRNA *srna)
4726{
4727 PropertyRNA *prop;
4728
4729 prop = RNA_def_property(srna, "mapping", PROP_POINTER, PROP_NONE);
4730 RNA_def_property_pointer_sdna(prop, nullptr, "storage");
4731 RNA_def_property_struct_type(prop, "CurveMapping");
4732 RNA_def_property_ui_text(prop, "Mapping", "");
4733 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4734}
4735
4736static void def_time(BlenderRNA * /*brna*/, StructRNA *srna)
4737{
4738 PropertyRNA *prop;
4739
4740 prop = RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
4741 RNA_def_property_pointer_sdna(prop, nullptr, "storage");
4742 RNA_def_property_struct_type(prop, "CurveMapping");
4743 RNA_def_property_ui_text(prop, "Curve", "");
4744 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4745}
4746
4747static void def_colorramp(BlenderRNA * /*brna*/, StructRNA *srna)
4748{
4749 PropertyRNA *prop;
4750
4751 prop = RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NONE);
4752 RNA_def_property_pointer_sdna(prop, nullptr, "storage");
4753 RNA_def_property_struct_type(prop, "ColorRamp");
4754 RNA_def_property_ui_text(prop, "Color Ramp", "");
4755 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4756}
4757
4758static void def_mix_rgb(BlenderRNA * /*brna*/, StructRNA *srna)
4759{
4760 PropertyRNA *prop;
4761
4762 prop = RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
4763 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
4765 RNA_def_property_ui_text(prop, "Blending Mode", "");
4766 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4767
4768 prop = RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
4769 RNA_def_property_boolean_sdna(prop, nullptr, "custom2", SHD_MIXRGB_USE_ALPHA);
4770 RNA_def_property_ui_text(prop, "Alpha", "Include alpha of second input in this operation");
4771 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4772
4773 prop = RNA_def_property(srna, "use_clamp", PROP_BOOLEAN, PROP_NONE);
4774 RNA_def_property_boolean_sdna(prop, nullptr, "custom2", SHD_MIXRGB_CLAMP);
4775 RNA_def_property_ui_text(prop, "Clamp", "Clamp result of the node to 0.0 to 1.0 range");
4776 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4777}
4778
4779static void def_texture(BlenderRNA * /*brna*/, StructRNA *srna)
4780{
4781 PropertyRNA *prop;
4782
4783 prop = RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
4784 RNA_def_property_pointer_sdna(prop, nullptr, "id");
4785 RNA_def_property_struct_type(prop, "Texture");
4788 RNA_def_property_ui_text(prop, "Texture", "");
4789 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
4790
4791 prop = RNA_def_property(srna, "node_output", PROP_INT, PROP_NONE);
4792 RNA_def_property_int_sdna(prop, nullptr, "custom1");
4794 prop, "Node Output", "For node-based textures, which output node to use");
4795 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4796}
4797
4798static void def_fn_input_color(BlenderRNA * /*brna*/, StructRNA *srna)
4799{
4800 PropertyRNA *prop;
4801
4802 RNA_def_struct_sdna_from(srna, "NodeInputColor", "storage");
4803
4804 prop = RNA_def_property(srna, "value", PROP_FLOAT, PROP_COLOR);
4805 RNA_def_property_array(prop, 4);
4806 RNA_def_property_float_sdna(prop, nullptr, "color");
4807 RNA_def_property_ui_text(prop, "Color", "");
4808 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4809}
4810
4811static void def_fn_input_bool(BlenderRNA * /*brna*/, StructRNA *srna)
4812{
4813 PropertyRNA *prop;
4814
4815 RNA_def_struct_sdna_from(srna, "NodeInputBool", "storage");
4816
4817 prop = RNA_def_property(srna, "boolean", PROP_BOOLEAN, PROP_NONE);
4818 RNA_def_property_boolean_sdna(prop, nullptr, "boolean", 1);
4819 RNA_def_property_ui_text(prop, "Boolean", "Input value used for unconnected socket");
4820 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4821}
4822
4823static void def_fn_input_int(BlenderRNA * /*brna*/, StructRNA *srna)
4824{
4825 PropertyRNA *prop;
4826
4827 RNA_def_struct_sdna_from(srna, "NodeInputInt", "storage");
4828
4829 prop = RNA_def_property(srna, "integer", PROP_INT, PROP_NONE);
4830 RNA_def_property_int_sdna(prop, nullptr, "integer");
4832 RNA_def_property_ui_text(prop, "Integer", "Input value used for unconnected socket");
4833 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4834}
4835
4836static void def_fn_input_rotation(BlenderRNA * /*brna*/, StructRNA *srna)
4837{
4838 PropertyRNA *prop;
4839
4840 RNA_def_struct_sdna_from(srna, "NodeInputRotation", "storage");
4841
4842 prop = RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER);
4843 RNA_def_property_float_sdna(prop, nullptr, "rotation_euler");
4844 RNA_def_property_ui_text(prop, "Rotation", "Input value used for unconnected socket");
4845 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4846}
4847
4848static void def_fn_input_vector(BlenderRNA * /*brna*/, StructRNA *srna)
4849{
4850 PropertyRNA *prop;
4851
4852 RNA_def_struct_sdna_from(srna, "NodeInputVector", "storage");
4853
4854 prop = RNA_def_property(srna, "vector", PROP_FLOAT, PROP_XYZ);
4855 RNA_def_property_array(prop, 3);
4856 RNA_def_property_float_sdna(prop, nullptr, "vector");
4857 RNA_def_property_ui_text(prop, "Vector", "");
4858 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4859}
4860
4861static void def_fn_input_string(BlenderRNA * /*brna*/, StructRNA *srna)
4862{
4863 PropertyRNA *prop;
4864
4865 RNA_def_struct_sdna_from(srna, "NodeInputString", "storage");
4866
4867 prop = RNA_def_property(srna, "string", PROP_STRING, PROP_NONE);
4868 RNA_def_property_ui_text(prop, "String", "");
4869 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4870}
4871
4872/* -- Shader Nodes ---------------------------------------------------------- */
4873
4874static void def_sh_output(BlenderRNA * /*brna*/, StructRNA *srna)
4875{
4876 PropertyRNA *prop;
4877
4878 prop = RNA_def_property(srna, "is_active_output", PROP_BOOLEAN, PROP_NONE);
4879 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_DO_OUTPUT);
4881 prop, "Active Output", "True if this node is used as the active output");
4882 RNA_def_property_boolean_funcs(prop, nullptr, "rna_ShaderNode_is_active_output_set");
4883 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4884
4885 prop = RNA_def_property(srna, "target", PROP_ENUM, PROP_NONE);
4886 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
4889 prop, "Target", "Which renderer and viewport shading types to use the shaders for");
4890 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4891}
4892
4894{
4895 def_sh_output(brna, srna);
4896 def_mix_rgb(brna, srna);
4897}
4898
4899static void def_sh_mapping(BlenderRNA * /*brna*/, StructRNA *srna)
4900{
4901 PropertyRNA *prop;
4902
4903 prop = RNA_def_property(srna, "vector_type", PROP_ENUM, PROP_NONE);
4904 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
4906 RNA_def_property_ui_text(prop, "Type", "Type of vector that the mapping transforms");
4907 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
4908}
4909
4910static void def_sh_vector_rotate(BlenderRNA * /*brna*/, StructRNA *srna)
4911{
4912 PropertyRNA *prop;
4913
4914 prop = RNA_def_property(srna, "rotation_type", PROP_ENUM, PROP_NONE);
4915 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
4917 RNA_def_property_ui_text(prop, "Type", "Type of angle input");
4918 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
4919
4920 prop = RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
4921 RNA_def_property_boolean_sdna(prop, nullptr, "custom2", 0);
4922 RNA_def_property_ui_text(prop, "Invert", "Invert the rotation angle");
4923 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
4924}
4925
4926static void def_sh_attribute(BlenderRNA * /*brna*/, StructRNA *srna)
4927{
4928 static const EnumPropertyItem prop_attribute_type[] = {
4930 "GEOMETRY",
4931 0,
4932 "Geometry",
4933 "The attribute is associated with the object geometry, and its value "
4934 "varies from vertex to vertex, or within the object volume"},
4936 "OBJECT",
4937 0,
4938 "Object",
4939 "The attribute is associated with the object or mesh data-block itself, "
4940 "and its value is uniform"},
4942 "INSTANCER",
4943 0,
4944 "Instancer",
4945 "The attribute is associated with the instancer particle system or object, "
4946 "falling back to the Object mode if the attribute isn't found, or the object "
4947 "is not instanced"},
4949 "VIEW_LAYER",
4950 0,
4951 "View Layer",
4952 "The attribute is associated with the View Layer, Scene or World that is being rendered"},
4953 {0, nullptr, 0, nullptr, nullptr},
4954 };
4955 PropertyRNA *prop;
4956
4957 RNA_def_struct_sdna_from(srna, "NodeShaderAttribute", "storage");
4958
4959 prop = RNA_def_property(srna, "attribute_type", PROP_ENUM, PROP_NONE);
4960 RNA_def_property_enum_sdna(prop, nullptr, "type");
4961 RNA_def_property_enum_items(prop, prop_attribute_type);
4962 RNA_def_property_ui_text(prop, "Attribute Type", "General type of the attribute");
4963 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
4964
4965 prop = RNA_def_property(srna, "attribute_name", PROP_STRING, PROP_NONE);
4966 RNA_def_property_string_sdna(prop, nullptr, "name");
4967 RNA_def_property_ui_text(prop, "Attribute Name", "");
4968 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
4969}
4970
4971static void def_sh_tex(BlenderRNA * /*brna*/, StructRNA *srna)
4972{
4973 PropertyRNA *prop;
4974
4975 prop = RNA_def_property(srna, "texture_mapping", PROP_POINTER, PROP_NONE);
4976 RNA_def_property_pointer_sdna(prop, nullptr, "base.tex_mapping");
4978 RNA_def_property_ui_text(prop, "Texture Mapping", "Texture coordinate mapping settings");
4979
4980 prop = RNA_def_property(srna, "color_mapping", PROP_POINTER, PROP_NONE);
4981 RNA_def_property_pointer_sdna(prop, nullptr, "base.color_mapping");
4983 RNA_def_property_ui_text(prop, "Color Mapping", "Color mapping settings");
4984}
4985
4986static void def_sh_tex_sky(BlenderRNA *brna, StructRNA *srna)
4987{
4988 static const EnumPropertyItem prop_sky_type[] = {
4990 "SINGLE_SCATTERING",
4991 0,
4992 "Single Scattering",
4993 "Single scattering sky model"},
4995 "MULTIPLE_SCATTERING",
4996 0,
4997 "Multiple Scattering",
4998 "Multiple scattering sky model (more accurate)"},
4999 {SHD_SKY_PREETHAM, "PREETHAM", 0, "Preetham", "Preetham 1999 (Legacy)"},
5000 {SHD_SKY_HOSEK, "HOSEK_WILKIE", 0, "Hosek / Wilkie", "Hosek / Wilkie 2012 (Legacy)"},
5001 {0, nullptr, 0, nullptr, nullptr},
5002 };
5003 static float default_dir[3] = {0.0f, 0.0f, 1.0f};
5004
5005 PropertyRNA *prop;
5006
5007 RNA_def_struct_sdna_from(srna, "NodeTexSky", "storage");
5008 def_sh_tex(brna, srna);
5009
5010 prop = RNA_def_property(srna, "sky_type", PROP_ENUM, PROP_NONE);
5011 RNA_def_property_enum_sdna(prop, nullptr, "sky_model");
5012 RNA_def_property_enum_items(prop, prop_sky_type);
5013 RNA_def_property_ui_text(prop, "Sky Type", "Which sky model should be used");
5014 RNA_def_property_update(prop, 0, "rna_ShaderNode_socket_update");
5015
5016 /* Nishita parameters. */
5017 prop = RNA_def_property(srna, "sun_disc", PROP_BOOLEAN, PROP_NONE);
5018 RNA_def_property_ui_text(prop, "Sun Disc", "Include the sun itself in the output");
5019 RNA_def_property_boolean_sdna(prop, nullptr, "sun_disc", 1);
5021 RNA_def_property_update(prop, 0, "rna_ShaderNode_socket_update");
5022
5023 prop = RNA_def_property(srna, "sun_size", PROP_FLOAT, PROP_ANGLE);
5024 RNA_def_property_ui_text(prop, "Sun Size", "Size of sun disc");
5025 RNA_def_property_range(prop, 0.0f, M_PI_2);
5027 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5028
5029 prop = RNA_def_property(srna, "sun_intensity", PROP_FLOAT, PROP_NONE);
5030 RNA_def_property_ui_text(prop, "Sun Intensity", "Strength of Sun");
5031 RNA_def_property_range(prop, 0.0f, 1000.0f);
5033 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5034
5035 prop = RNA_def_property(srna, "sun_elevation", PROP_FLOAT, PROP_ANGLE);
5036 RNA_def_property_ui_text(prop, "Sun Elevation", "Sun angle from horizon");
5038 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5039
5040 prop = RNA_def_property(srna, "sun_rotation", PROP_FLOAT, PROP_ANGLE);
5041 RNA_def_property_ui_text(prop, "Sun Rotation", "Rotation of sun around zenith");
5043 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5044
5045 prop = RNA_def_property(srna, "altitude", PROP_FLOAT, PROP_DISTANCE);
5046 RNA_def_property_ui_text(prop, "Altitude", "Height from sea level");
5047 RNA_def_property_range(prop, 0.0f, 100000.0f);
5048 RNA_def_property_ui_range(prop, 0.0f, 100000.0f, 10, 1);
5049 RNA_def_property_float_default(prop, 100.0f);
5050 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5051
5052 prop = RNA_def_property(srna, "air_density", PROP_FLOAT, PROP_NONE);
5054 "Air",
5055 "Density of air molecules.\n"
5056 "0 means no air, 1 means urban city air");
5057 RNA_def_property_range(prop, 0.0f, 1000.0f);
5059 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5060
5061 prop = RNA_def_property(srna, "aerosol_density", PROP_FLOAT, PROP_NONE);
5063 "Aerosols",
5064 "Density of dust, pollution and water droplets.\n"
5065 "0 means no aerosols, 1 means urban city aerosols");
5066 RNA_def_property_range(prop, 0.0f, 1000.0f);
5068 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5069
5070 prop = RNA_def_property(srna, "ozone_density", PROP_FLOAT, PROP_NONE);
5072 "Ozone",
5073 "Density of ozone layer.\n"
5074 "0 means no ozone, 1 means urban city ozone");
5075 RNA_def_property_range(prop, 0.0f, 1000.0f);
5077 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5078
5079 /* Legacy parameters. */
5080 prop = RNA_def_property(srna, "sun_direction", PROP_FLOAT, PROP_DIRECTION);
5081 RNA_def_property_ui_text(prop, "Sun Direction", "Direction from where the sun is shining");
5082 RNA_def_property_array(prop, 3);
5083 RNA_def_property_float_array_default(prop, default_dir);
5084 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5085
5086 prop = RNA_def_property(srna, "turbidity", PROP_FLOAT, PROP_NONE);
5087 RNA_def_property_range(prop, 1.0f, 10.0f);
5088 RNA_def_property_ui_range(prop, 1.0f, 10.0f, 10, 3);
5089 RNA_def_property_ui_text(prop, "Turbidity", "Atmospheric turbidity");
5090 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5091
5092 prop = RNA_def_property(srna, "ground_albedo", PROP_FLOAT, PROP_FACTOR);
5093 RNA_def_property_range(prop, 0.0f, 1.0f);
5095 prop, "Ground Albedo", "Ground color that is subtly reflected in the sky");
5096 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5097}
5098
5100 {SHD_INTERP_LINEAR, "Linear", 0, "Linear", "Linear interpolation"},
5101 {SHD_INTERP_CLOSEST, "Closest", 0, "Closest", "No interpolation (sample closest texel)"},
5102 {SHD_INTERP_CUBIC, "Cubic", 0, "Cubic", "Cubic interpolation"},
5103 {SHD_INTERP_SMART, "Smart", 0, "Smart", "Bicubic when magnifying, else bilinear (OSL only)"},
5104 {0, nullptr, 0, nullptr, nullptr},
5105};
5106
5108{
5109 static const EnumPropertyItem prop_projection_items[] = {
5111 "EQUIRECTANGULAR",
5112 0,
5113 "Equirectangular",
5114 "Equirectangular or latitude-longitude projection"},
5116 "MIRROR_BALL",
5117 0,
5118 "Mirror Ball",
5119 "Projection from an orthographic photo of a mirror ball"},
5120 {0, nullptr, 0, nullptr, nullptr},
5121 };
5122
5123 PropertyRNA *prop;
5124
5125 prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
5126 RNA_def_property_pointer_sdna(prop, nullptr, "id");
5127 RNA_def_property_struct_type(prop, "Image");
5130 RNA_def_property_ui_text(prop, "Image", "");
5131 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_tex_image_update");
5132
5133 RNA_def_struct_sdna_from(srna, "NodeTexEnvironment", "storage");
5134 def_sh_tex(brna, srna);
5135
5136 prop = RNA_def_property(srna, "projection", PROP_ENUM, PROP_NONE);
5137 RNA_def_property_enum_items(prop, prop_projection_items);
5138 RNA_def_property_ui_text(prop, "Projection", "Projection of the input image");
5139 RNA_def_property_update(prop, 0, "rna_Node_update");
5140
5141 prop = RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
5143 RNA_def_property_ui_text(prop, "Interpolation", "Texture interpolation");
5144 RNA_def_property_update(prop, 0, "rna_Node_update");
5145
5146 prop = RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
5148 RNA_def_property_pointer_sdna(prop, nullptr, "iuser");
5150 prop,
5151 "Image User",
5152 "Parameters defining which layer, pass and frame of the image is displayed");
5153 RNA_def_property_update(prop, 0, "rna_Node_update");
5154}
5155
5156static void def_sh_tex_gabor(BlenderRNA *brna, StructRNA *srna)
5157{
5158 static const EnumPropertyItem prop_gabor_types[] = {
5160 "2D",
5161 0,
5162 "2D",
5163 "Use the 2D vector (X, Y) as input. The Z component is ignored."},
5164 {SHD_GABOR_TYPE_3D, "3D", 0, "3D", "Use the 3D vector (X, Y, Z) as input"},
5165 {0, nullptr, 0, nullptr, nullptr},
5166 };
5167
5168 RNA_def_struct_sdna_from(srna, "NodeTexGabor", "storage");
5169 def_sh_tex(brna, srna);
5170
5171 PropertyRNA *prop;
5172 prop = RNA_def_property(srna, "gabor_type", PROP_ENUM, PROP_NONE);
5173 RNA_def_property_enum_sdna(prop, nullptr, "type");
5174 RNA_def_property_enum_items(prop, prop_gabor_types);
5175 RNA_def_property_ui_text(prop, "Type", "The type of Gabor noise to evaluate");
5176 RNA_def_property_update(prop, 0, "rna_ShaderNode_socket_update");
5177}
5178
5179static void def_sh_tex_image(BlenderRNA *brna, StructRNA *srna)
5180{
5181 static const EnumPropertyItem prop_projection_items[] = {
5183 "FLAT",
5184 0,
5185 "Flat",
5186 "Image is projected flat using the X and Y coordinates of the texture vector"},
5187 {SHD_PROJ_BOX,
5188 "BOX",
5189 0,
5190 "Box",
5191 "Image is projected using different components for each side of the object space bounding "
5192 "box"},
5194 "SPHERE",
5195 0,
5196 "Sphere",
5197 "Image is projected spherically using the Z axis as central"},
5199 "TUBE",
5200 0,
5201 "Tube",
5202 "Image is projected from the tube using the Z axis as central"},
5203 {0, nullptr, 0, nullptr, nullptr},
5204 };
5205
5206 PropertyRNA *prop;
5207
5208 prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
5209 RNA_def_property_pointer_sdna(prop, nullptr, "id");
5210 RNA_def_property_struct_type(prop, "Image");
5213 RNA_def_property_ui_text(prop, "Image", "");
5214 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_tex_image_update");
5215
5216 RNA_def_struct_sdna_from(srna, "NodeTexImage", "storage");
5217 def_sh_tex(brna, srna);
5218
5219 prop = RNA_def_property(srna, "projection", PROP_ENUM, PROP_NONE);
5220 RNA_def_property_enum_items(prop, prop_projection_items);
5222 prop, "Projection", "Method to project 2D image on object with a 3D texture vector");
5224 RNA_def_property_update(prop, 0, "rna_Node_update");
5225
5226 prop = RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
5228 RNA_def_property_ui_text(prop, "Interpolation", "Texture interpolation");
5229 RNA_def_property_update(prop, 0, "rna_Node_update");
5230
5231 prop = RNA_def_property(srna, "projection_blend", PROP_FLOAT, PROP_FACTOR);
5233 prop, "Projection Blend", "For box projection, amount of blend to use between sides");
5234 RNA_def_property_update(prop, 0, "rna_Node_update");
5235
5236 prop = RNA_def_property(srna, "extension", PROP_ENUM, PROP_NONE);
5239 prop, "Extension", "How the image is extrapolated past its original bounds");
5241 RNA_def_property_update(prop, 0, "rna_Node_update");
5242
5243 prop = RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
5245 RNA_def_property_pointer_sdna(prop, nullptr, "iuser");
5247 prop,
5248 "Image User",
5249 "Parameters defining which layer, pass and frame of the image is displayed");
5250 RNA_def_property_update(prop, 0, "rna_Node_update");
5251}
5252
5253static void def_tex_combsep_color(BlenderRNA * /*brna*/, StructRNA *srna)
5254{
5255 PropertyRNA *prop;
5256
5257 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
5258 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5260 RNA_def_property_ui_text(prop, "Mode", "Mode of color processing");
5261 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
5262}
5263
5264static void def_geo_image_texture(BlenderRNA * /*brna*/, StructRNA *srna)
5265{
5266 static const EnumPropertyItem fn_tex_prop_interpolation_items[] = {
5267 {SHD_INTERP_LINEAR, "Linear", 0, "Linear", "Linear interpolation"},
5268 {SHD_INTERP_CLOSEST, "Closest", 0, "Closest", "No interpolation (sample closest texel)"},
5269 {SHD_INTERP_CUBIC, "Cubic", 0, "Cubic", "Cubic interpolation"},
5270 {0, nullptr, 0, nullptr, nullptr},
5271 };
5272
5273 PropertyRNA *prop;
5274
5275 RNA_def_struct_sdna_from(srna, "NodeGeometryImageTexture", "storage");
5276
5277 prop = RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
5278 RNA_def_property_enum_items(prop, fn_tex_prop_interpolation_items);
5279 RNA_def_property_ui_text(prop, "Interpolation", "Method for smoothing values between pixels");
5280 RNA_def_property_update(prop, 0, "rna_Node_update");
5281
5282 prop = RNA_def_property(srna, "extension", PROP_ENUM, PROP_NONE);
5285 prop, "Extension", "How the image is extrapolated past its original bounds");
5287 RNA_def_property_update(prop, 0, "rna_Node_update");
5288}
5289
5291{
5292 PropertyRNA *prop;
5293
5294 RNA_def_struct_sdna_from(srna, "NodeGeometryTransformGizmo", "storage");
5295
5296 prop = RNA_def_property(srna, "use_translation_x", PROP_BOOLEAN, PROP_NONE);
5298 RNA_def_property_ui_text(prop, "Use Translation X", nullptr);
5299 RNA_def_property_update(prop, 0, "rna_Node_update");
5300
5301 prop = RNA_def_property(srna, "use_translation_y", PROP_BOOLEAN, PROP_NONE);
5303 RNA_def_property_ui_text(prop, "Use Translation Y", nullptr);
5304 RNA_def_property_update(prop, 0, "rna_Node_update");
5305
5306 prop = RNA_def_property(srna, "use_translation_z", PROP_BOOLEAN, PROP_NONE);
5308 RNA_def_property_ui_text(prop, "Use Translation Z", nullptr);
5309 RNA_def_property_update(prop, 0, "rna_Node_update");
5310
5311 prop = RNA_def_property(srna, "use_rotation_x", PROP_BOOLEAN, PROP_NONE);
5313 RNA_def_property_ui_text(prop, "Use Rotation X", nullptr);
5314 RNA_def_property_update(prop, 0, "rna_Node_update");
5315
5316 prop = RNA_def_property(srna, "use_rotation_y", PROP_BOOLEAN, PROP_NONE);
5318 RNA_def_property_ui_text(prop, "Use Rotation Y", nullptr);
5319 RNA_def_property_update(prop, 0, "rna_Node_update");
5320
5321 prop = RNA_def_property(srna, "use_rotation_z", PROP_BOOLEAN, PROP_NONE);
5323 RNA_def_property_ui_text(prop, "Use Rotation Z", nullptr);
5324 RNA_def_property_update(prop, 0, "rna_Node_update");
5325
5326 prop = RNA_def_property(srna, "use_scale_x", PROP_BOOLEAN, PROP_NONE);
5328 RNA_def_property_ui_text(prop, "Use Scale X", nullptr);
5329 RNA_def_property_update(prop, 0, "rna_Node_update");
5330
5331 prop = RNA_def_property(srna, "use_scale_y", PROP_BOOLEAN, PROP_NONE);
5333 RNA_def_property_ui_text(prop, "Use Scale Y", nullptr);
5334 RNA_def_property_update(prop, 0, "rna_Node_update");
5335
5336 prop = RNA_def_property(srna, "use_scale_z", PROP_BOOLEAN, PROP_NONE);
5338 RNA_def_property_ui_text(prop, "Use Scale Z", nullptr);
5339 RNA_def_property_update(prop, 0, "rna_Node_update");
5340}
5341
5343{
5344 static const EnumPropertyItem prop_gradient_type[] = {
5345 {SHD_BLEND_LINEAR, "LINEAR", 0, "Linear", "Create a linear progression"},
5346 {SHD_BLEND_QUADRATIC, "QUADRATIC", 0, "Quadratic", "Create a quadratic progression"},
5348 "EASING",
5349 0,
5350 "Easing",
5351 "Create a progression easing from one step to the next"},
5352 {SHD_BLEND_DIAGONAL, "DIAGONAL", 0, "Diagonal", "Create a diagonal progression"},
5353 {SHD_BLEND_SPHERICAL, "SPHERICAL", 0, "Spherical", "Create a spherical progression"},
5355 "QUADRATIC_SPHERE",
5356 0,
5357 "Quadratic Sphere",
5358 "Create a quadratic progression in the shape of a sphere"},
5359 {SHD_BLEND_RADIAL, "RADIAL", 0, "Radial", "Create a radial progression"},
5360 {0, nullptr, 0, nullptr, nullptr},
5361 };
5362
5363 PropertyRNA *prop;
5364
5365 RNA_def_struct_sdna_from(srna, "NodeTexGradient", "storage");
5366 def_sh_tex(brna, srna);
5367
5368 prop = RNA_def_property(srna, "gradient_type", PROP_ENUM, PROP_NONE);
5369 RNA_def_property_enum_items(prop, prop_gradient_type);
5370 RNA_def_property_ui_text(prop, "Gradient Type", "Style of the color blending");
5371 RNA_def_property_update(prop, 0, "rna_Node_update");
5372}
5373
5374static void def_sh_tex_noise(BlenderRNA *brna, StructRNA *srna)
5375{
5376 static const EnumPropertyItem prop_noise_type[] = {
5378 "MULTIFRACTAL",
5379 0,
5380 "Multifractal",
5381 "More uneven result (varies with location), more similar to a real terrain"},
5383 "RIDGED_MULTIFRACTAL",
5384 0,
5385 "Ridged Multifractal",
5386 "Create sharp peaks"},
5388 "HYBRID_MULTIFRACTAL",
5389 0,
5390 "Hybrid Multifractal",
5391 "Create peaks and valleys with different roughness values"},
5392 {SHD_NOISE_FBM, "FBM", 0, "fBM", "The standard fractal Perlin noise"},
5394 "HETERO_TERRAIN",
5395 0,
5396 "Hetero Terrain",
5397 "Similar to Hybrid Multifractal creates a heterogeneous terrain, but with the likeness of "
5398 "river channels"},
5399 {0, nullptr, 0, nullptr, nullptr},
5400 };
5401
5402 PropertyRNA *prop;
5403
5404 RNA_def_struct_sdna_from(srna, "NodeTexNoise", "storage");
5405 def_sh_tex(brna, srna);
5406
5407 prop = RNA_def_property(srna, "noise_dimensions", PROP_ENUM, PROP_NONE);
5408 RNA_def_property_enum_sdna(prop, nullptr, "dimensions");
5410 RNA_def_property_ui_text(prop, "Dimensions", "Number of dimensions to output noise for");
5412 RNA_def_property_update(prop, 0, "rna_ShaderNode_socket_update");
5413
5414 prop = RNA_def_property(srna, "noise_type", PROP_ENUM, PROP_NONE);
5415 RNA_def_property_enum_sdna(prop, nullptr, "type");
5417 RNA_def_property_ui_text(prop, "Type", "Type of the Noise texture");
5418 RNA_def_property_update(prop, 0, "rna_ShaderNode_socket_update");
5419
5420 prop = RNA_def_property(srna, "normalize", PROP_BOOLEAN, PROP_NONE);
5421 RNA_def_property_boolean_sdna(prop, nullptr, "normalize", 0);
5422 RNA_def_property_ui_text(prop, "Normalize", "Normalize outputs to 0.0 to 1.0 range");
5423 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5424}
5425
5426static void def_sh_tex_checker(BlenderRNA *brna, StructRNA *srna)
5427{
5428 RNA_def_struct_sdna_from(srna, "NodeTexChecker", "storage");
5429 def_sh_tex(brna, srna);
5430}
5431
5432static void def_sh_tex_brick(BlenderRNA *brna, StructRNA *srna)
5433{
5434 PropertyRNA *prop;
5435
5436 RNA_def_struct_sdna_from(srna, "NodeTexBrick", "storage");
5437 def_sh_tex(brna, srna);
5438
5439 prop = RNA_def_property(srna, "offset_frequency", PROP_INT, PROP_NONE);
5440 RNA_def_property_int_sdna(prop, nullptr, "offset_freq");
5442 RNA_def_property_range(prop, 1, 99);
5444 prop,
5445 "Offset Frequency",
5446 "How often rows are offset. A value of 2 gives an even/uneven pattern of rows.");
5447 RNA_def_property_update(prop, 0, "rna_Node_update");
5448
5449 prop = RNA_def_property(srna, "squash_frequency", PROP_INT, PROP_NONE);
5450 RNA_def_property_int_sdna(prop, nullptr, "squash_freq");
5452 RNA_def_property_range(prop, 1, 99);
5454 prop, "Squash Frequency", "How often rows consist of \"squished\" bricks");
5455 RNA_def_property_update(prop, 0, "rna_Node_update");
5456
5457 prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
5458 RNA_def_property_float_sdna(prop, nullptr, "offset");
5460 RNA_def_property_range(prop, 0.0f, 1.0f);
5462 prop, "Offset Amount", "Determines the brick offset of the various rows");
5463 RNA_def_property_update(prop, 0, "rna_Node_update");
5464
5465 prop = RNA_def_property(srna, "squash", PROP_FLOAT, PROP_NONE);
5466 RNA_def_property_float_sdna(prop, nullptr, "squash");
5468 RNA_def_property_range(prop, 0.0f, 99.0f);
5470 prop,
5471 "Squash Amount",
5472 "Factor to adjust the brick's width for particular rows determined by the Offset Frequency");
5473 RNA_def_property_update(prop, 0, "rna_Node_update");
5474}
5475
5476static void def_sh_tex_magic(BlenderRNA *brna, StructRNA *srna)
5477{
5478 PropertyRNA *prop;
5479
5480 RNA_def_struct_sdna_from(srna, "NodeTexMagic", "storage");
5481 def_sh_tex(brna, srna);
5482
5483 prop = RNA_def_property(srna, "turbulence_depth", PROP_INT, PROP_NONE);
5484 RNA_def_property_int_sdna(prop, nullptr, "depth");
5485 RNA_def_property_range(prop, 0, 10);
5486 RNA_def_property_ui_text(prop, "Depth", "Level of detail in the added turbulent noise");
5487 RNA_def_property_update(prop, 0, "rna_Node_update");
5488}
5489
5490static void def_sh_tex_voronoi(BlenderRNA *brna, StructRNA *srna)
5491{
5492 static EnumPropertyItem prop_distance_items[] = {
5493 {SHD_VORONOI_EUCLIDEAN, "EUCLIDEAN", 0, "Euclidean", "Euclidean distance"},
5494 {SHD_VORONOI_MANHATTAN, "MANHATTAN", 0, "Manhattan", "Manhattan distance"},
5495 {SHD_VORONOI_CHEBYCHEV, "CHEBYCHEV", 0, "Chebychev", "Chebychev distance"},
5496 {SHD_VORONOI_MINKOWSKI, "MINKOWSKI", 0, "Minkowski", "Minkowski distance"},
5497 {0, nullptr, 0, nullptr, nullptr}};
5498
5499 static EnumPropertyItem prop_feature_items[] = {
5501 "F1",
5502 0,
5503 "F1",
5504 "Computes the distance to the closest point as well as its position and color"},
5506 "F2",
5507 0,
5508 "F2",
5509 "Computes the distance to the second closest point as well as its position and color"},
5511 "SMOOTH_F1",
5512 0,
5513 "Smooth F1",
5514 "Smoothed version of F1. Weighted sum of neighbor voronoi cells."},
5516 "DISTANCE_TO_EDGE",
5517 0,
5518 "Distance to Edge",
5519 "Computes the distance to the edge of the voronoi cell"},
5521 "N_SPHERE_RADIUS",
5522 0,
5523 "N-Sphere Radius",
5524 "Computes the radius of the n-sphere inscribed in the voronoi cell"},
5525 {0, nullptr, 0, nullptr, nullptr}};
5526
5527 PropertyRNA *prop;
5528
5529 RNA_def_struct_sdna_from(srna, "NodeTexVoronoi", "storage");
5530 def_sh_tex(brna, srna);
5531
5532 prop = RNA_def_property(srna, "voronoi_dimensions", PROP_ENUM, PROP_NONE);
5533 RNA_def_property_enum_sdna(prop, nullptr, "dimensions");
5535 RNA_def_property_ui_text(prop, "Dimensions", "Number of dimensions to output noise for");
5537 RNA_def_property_update(prop, 0, "rna_ShaderNode_socket_update");
5538
5539 prop = RNA_def_property(srna, "distance", PROP_ENUM, PROP_NONE);
5540 RNA_def_property_enum_sdna(prop, nullptr, "distance");
5541 RNA_def_property_enum_items(prop, prop_distance_items);
5543 prop, "Distance Metric", "The distance metric used to compute the texture");
5544 RNA_def_property_update(prop, 0, "rna_ShaderNode_socket_update");
5545
5546 prop = RNA_def_property(srna, "feature", PROP_ENUM, PROP_NONE);
5547 RNA_def_property_enum_sdna(prop, nullptr, "feature");
5548 RNA_def_property_enum_items(prop, prop_feature_items);
5550 prop, "Feature Output", "The Voronoi feature that the node will compute");
5551 RNA_def_property_update(prop, 0, "rna_ShaderNode_socket_update");
5552
5553 prop = RNA_def_property(srna, "normalize", PROP_BOOLEAN, PROP_NONE);
5554 RNA_def_property_boolean_sdna(prop, nullptr, "normalize", 0);
5555 RNA_def_property_ui_text(prop, "Normalize", "Normalize output Distance to 0.0 to 1.0 range");
5556 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5557}
5558
5559static void def_sh_tex_wave(BlenderRNA *brna, StructRNA *srna)
5560{
5561 static const EnumPropertyItem prop_wave_type_items[] = {
5562 {SHD_WAVE_BANDS, "BANDS", 0, "Bands", "Use standard wave texture in bands"},
5563 {SHD_WAVE_RINGS, "RINGS", 0, "Rings", "Use wave texture in rings"},
5564 {0, nullptr, 0, nullptr, nullptr},
5565 };
5566
5567 static EnumPropertyItem prop_wave_bands_direction_items[] = {
5568 {SHD_WAVE_BANDS_DIRECTION_X, "X", 0, "X", "Bands across X axis"},
5569 {SHD_WAVE_BANDS_DIRECTION_Y, "Y", 0, "Y", "Bands across Y axis"},
5570 {SHD_WAVE_BANDS_DIRECTION_Z, "Z", 0, "Z", "Bands across Z axis"},
5571 {SHD_WAVE_BANDS_DIRECTION_DIAGONAL, "DIAGONAL", 0, "Diagonal", "Bands across diagonal axis"},
5572 {0, nullptr, 0, nullptr, nullptr},
5573 };
5574
5575 static EnumPropertyItem prop_wave_rings_direction_items[] = {
5576 {SHD_WAVE_RINGS_DIRECTION_X, "X", 0, "X", "Rings along X axis"},
5577 {SHD_WAVE_RINGS_DIRECTION_Y, "Y", 0, "Y", "Rings along Y axis"},
5578 {SHD_WAVE_RINGS_DIRECTION_Z, "Z", 0, "Z", "Rings along Z axis"},
5580 "SPHERICAL",
5581 0,
5582 "Spherical",
5583 "Rings along spherical distance"},
5584 {0, nullptr, 0, nullptr, nullptr},
5585 };
5586
5587 static const EnumPropertyItem prop_wave_profile_items[] = {
5588 {SHD_WAVE_PROFILE_SIN, "SIN", 0, "Sine", "Use a standard sine profile"},
5589 {SHD_WAVE_PROFILE_SAW, "SAW", 0, "Saw", "Use a sawtooth profile"},
5590 {SHD_WAVE_PROFILE_TRI, "TRI", 0, "Triangle", "Use a triangle profile"},
5591 {0, nullptr, 0, nullptr, nullptr},
5592 };
5593
5594 PropertyRNA *prop;
5595
5596 RNA_def_struct_sdna_from(srna, "NodeTexWave", "storage");
5597 def_sh_tex(brna, srna);
5598
5599 prop = RNA_def_property(srna, "wave_type", PROP_ENUM, PROP_NONE);
5600 RNA_def_property_enum_sdna(prop, nullptr, "wave_type");
5601 RNA_def_property_enum_items(prop, prop_wave_type_items);
5602 RNA_def_property_ui_text(prop, "Wave Type", "");
5603 RNA_def_property_update(prop, 0, "rna_Node_update");
5604
5605 prop = RNA_def_property(srna, "bands_direction", PROP_ENUM, PROP_NONE);
5606 RNA_def_property_enum_sdna(prop, nullptr, "bands_direction");
5607 RNA_def_property_enum_items(prop, prop_wave_bands_direction_items);
5608 RNA_def_property_ui_text(prop, "Bands Direction", "");
5609 RNA_def_property_update(prop, 0, "rna_Node_update");
5610
5611 prop = RNA_def_property(srna, "rings_direction", PROP_ENUM, PROP_NONE);
5612 RNA_def_property_enum_sdna(prop, nullptr, "rings_direction");
5613 RNA_def_property_enum_items(prop, prop_wave_rings_direction_items);
5614 RNA_def_property_ui_text(prop, "Rings Direction", "");
5615 RNA_def_property_update(prop, 0, "rna_Node_update");
5616
5617 prop = RNA_def_property(srna, "wave_profile", PROP_ENUM, PROP_NONE);
5618 RNA_def_property_enum_sdna(prop, nullptr, "wave_profile");
5619 RNA_def_property_enum_items(prop, prop_wave_profile_items);
5620 RNA_def_property_ui_text(prop, "Wave Profile", "");
5621 RNA_def_property_update(prop, 0, "rna_Node_update");
5622}
5623
5624static void def_sh_tex_white_noise(BlenderRNA * /*brna*/, StructRNA *srna)
5625{
5626 PropertyRNA *prop;
5627
5628 prop = RNA_def_property(srna, "noise_dimensions", PROP_ENUM, PROP_NONE);
5629 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5631 RNA_def_property_ui_text(prop, "Dimensions", "Number of dimensions to output noise for");
5633 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
5634}
5635
5636static void def_sh_tex_coord(BlenderRNA * /*brna*/, StructRNA *srna)
5637{
5638 PropertyRNA *prop;
5639
5640 prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
5641 RNA_def_property_pointer_sdna(prop, nullptr, "id");
5642 RNA_def_property_struct_type(prop, "Object");
5646 prop, "Object", "Use coordinates from this object (for object texture coordinates output)");
5647 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
5648
5649 prop = RNA_def_property(srna, "from_instancer", PROP_BOOLEAN, PROP_NONE);
5650 RNA_def_property_boolean_sdna(prop, nullptr, "custom1", 1);
5652 prop, "From Instancer", "Use the parent of the instance object if possible");
5653 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5654}
5655
5656static void def_sh_vect_transform(BlenderRNA * /*brna*/, StructRNA *srna)
5657{
5658 static const EnumPropertyItem prop_vect_type_items[] = {
5659 {SHD_VECT_TRANSFORM_TYPE_POINT, "POINT", 0, "Point", "Transform a point"},
5660 {SHD_VECT_TRANSFORM_TYPE_VECTOR, "VECTOR", 0, "Vector", "Transform a direction vector"},
5662 "NORMAL",
5663 0,
5664 "Normal",
5665 "Transform a normal vector with unit length"},
5666 {0, nullptr, 0, nullptr, nullptr},
5667 };
5668
5669 static const EnumPropertyItem prop_vect_space_items[] = {
5670 {SHD_VECT_TRANSFORM_SPACE_WORLD, "WORLD", 0, "World", ""},
5671 {SHD_VECT_TRANSFORM_SPACE_OBJECT, "OBJECT", 0, "Object", ""},
5672 {SHD_VECT_TRANSFORM_SPACE_CAMERA, "CAMERA", 0, "Camera", ""},
5673 {0, nullptr, 0, nullptr, nullptr},
5674 };
5675
5676 PropertyRNA *prop;
5677
5678 RNA_def_struct_sdna_from(srna, "NodeShaderVectTransform", "storage");
5679
5680 prop = RNA_def_property(srna, "vector_type", PROP_ENUM, PROP_NONE);
5681 RNA_def_property_enum_sdna(prop, nullptr, "type");
5682 RNA_def_property_enum_items(prop, prop_vect_type_items);
5683 RNA_def_property_ui_text(prop, "Type", "");
5684 RNA_def_property_update(prop, 0, "rna_Node_update");
5685
5686 prop = RNA_def_property(srna, "convert_from", PROP_ENUM, PROP_NONE);
5687 RNA_def_property_enum_items(prop, prop_vect_space_items);
5688 RNA_def_property_ui_text(prop, "Convert From", "Space to convert from");
5689 RNA_def_property_update(prop, 0, "rna_Node_update");
5690
5691 prop = RNA_def_property(srna, "convert_to", PROP_ENUM, PROP_NONE);
5692 RNA_def_property_enum_items(prop, prop_vect_space_items);
5693 RNA_def_property_ui_text(prop, "Convert To", "Space to convert to");
5694 RNA_def_property_update(prop, 0, "rna_Node_update");
5695}
5696
5697static void def_sh_tex_wireframe(BlenderRNA * /*brna*/, StructRNA *srna)
5698{
5699 PropertyRNA *prop;
5700
5701 prop = RNA_def_property(srna, "use_pixel_size", PROP_BOOLEAN, PROP_NONE);
5702 RNA_def_property_boolean_sdna(prop, nullptr, "custom1", 1);
5703 RNA_def_property_ui_text(prop, "Pixel Size", "Use screen pixel size instead of world units");
5705 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5706}
5707
5708static void def_metallic(BlenderRNA * /*brna*/, StructRNA *srna)
5709{
5710 PropertyRNA *prop;
5711
5712 prop = RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
5713 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5715 RNA_def_property_ui_text(prop, "Distribution", "Light scattering distribution on rough surface");
5716 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5717
5718 prop = RNA_def_property(srna, "fresnel_type", PROP_ENUM, PROP_NONE);
5719 RNA_def_property_enum_sdna(prop, nullptr, "custom2");
5721 RNA_def_property_ui_text(prop, "Fresnel Type", "Fresnel method used to tint the metal");
5722 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5723}
5724
5725static void def_glossy(BlenderRNA * /*brna*/, StructRNA *srna)
5726{
5727 PropertyRNA *prop;
5728
5729 prop = RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
5730 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5732 RNA_def_property_ui_text(prop, "Distribution", "Light scattering distribution on rough surface");
5733 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5734}
5735
5736static void def_glass(BlenderRNA * /*brna*/, StructRNA *srna)
5737{
5738 PropertyRNA *prop;
5739
5740 prop = RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
5741 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5743 RNA_def_property_ui_text(prop, "Distribution", "Light scattering distribution on rough surface");
5744 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5745}
5746
5747static void def_sheen(BlenderRNA * /*brna*/, StructRNA *srna)
5748{
5749 PropertyRNA *prop;
5750
5751 prop = RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
5752 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5754 RNA_def_property_ui_text(prop, "Distribution", "Sheen shading model");
5755 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5756}
5757
5758static void def_principled(BlenderRNA * /*brna*/, StructRNA *srna)
5759{
5760 PropertyRNA *prop;
5761
5762 prop = RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
5763 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5765 RNA_def_property_ui_text(prop, "Distribution", "Light scattering distribution on rough surface");
5766 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
5767
5768 prop = RNA_def_property(srna, "subsurface_method", PROP_ENUM, PROP_NONE);
5769 RNA_def_property_enum_sdna(prop, nullptr, "custom2");
5772 prop, "Subsurface Method", "Method for rendering subsurface scattering");
5773 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
5774}
5775
5776static void def_refraction(BlenderRNA * /*brna*/, StructRNA *srna)
5777{
5778 PropertyRNA *prop;
5779
5780 prop = RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
5781 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5783 RNA_def_property_ui_text(prop, "Distribution", "Light scattering distribution on rough surface");
5784 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5785}
5786
5787static void def_scatter(BlenderRNA * /*brna*/, StructRNA *srna)
5788{
5789 PropertyRNA *prop;
5790
5791 prop = RNA_def_property(srna, "phase", PROP_ENUM, PROP_NONE);
5792 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5794 RNA_def_property_ui_text(prop, "Phase", "Phase function for the scattered light");
5795 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5796}
5797
5798static void def_volume_coefficients(BlenderRNA * /*brna*/, StructRNA *srna)
5799{
5800 PropertyRNA *prop;
5801
5802 prop = RNA_def_property(srna, "phase", PROP_ENUM, PROP_NONE);
5803 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5805 RNA_def_property_ui_text(prop, "Phase", "Phase function for the scattered light");
5806 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5807}
5808
5809static void def_toon(BlenderRNA * /*brna*/, StructRNA *srna)
5810{
5811 PropertyRNA *prop;
5812
5813 prop = RNA_def_property(srna, "component", PROP_ENUM, PROP_NONE);
5814 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5816 RNA_def_property_ui_text(prop, "Component", "Toon BSDF component to use");
5817 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5818}
5819
5820static void def_sh_bump(BlenderRNA * /*brna*/, StructRNA *srna)
5821{
5822 PropertyRNA *prop;
5823
5824 prop = RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
5825 RNA_def_property_boolean_sdna(prop, nullptr, "custom1", 1);
5827 prop, "Invert", "Invert the bump mapping direction to push into the surface instead of out");
5828 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5829}
5830
5831static void def_hair(BlenderRNA * /*brna*/, StructRNA *srna)
5832{
5833 PropertyRNA *prop;
5834
5835 prop = RNA_def_property(srna, "component", PROP_ENUM, PROP_NONE);
5836 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5838 RNA_def_property_ui_text(prop, "Component", "Hair BSDF component to use");
5839 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5840}
5841
5842/* RNA initialization for the custom properties. */
5843static void def_hair_principled(BlenderRNA * /*brna*/, StructRNA *srna)
5844{
5845 PropertyRNA *prop;
5846
5847 RNA_def_struct_sdna_from(srna, "NodeShaderHairPrincipled", "storage");
5848
5849 prop = RNA_def_property(srna, "model", PROP_ENUM, PROP_NONE);
5850 RNA_def_property_enum_sdna(prop, nullptr, "model");
5851 RNA_def_property_ui_text(prop, "Scattering model", "Select from Chiang or Huang model");
5854 /* Upon editing, update both the node data AND the UI representation */
5855 /* (This effectively shows/hides the relevant sockets) */
5856 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
5857
5858 prop = RNA_def_property(srna, "parametrization", PROP_ENUM, PROP_NONE);
5859 RNA_def_property_enum_sdna(prop, nullptr, "parametrization");
5861 prop, "Color Parametrization", "Select the shader's color parametrization");
5864 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
5865}
5866
5867static void def_sh_uvmap(BlenderRNA * /*brna*/, StructRNA *srna)
5868{
5869 PropertyRNA *prop;
5870
5871 prop = RNA_def_property(srna, "from_instancer", PROP_BOOLEAN, PROP_NONE);
5872 RNA_def_property_boolean_sdna(prop, nullptr, "custom1", 1);
5874 prop, "From Instancer", "Use the parent of the instance object if possible");
5875 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5876
5877 RNA_def_struct_sdna_from(srna, "NodeShaderUVMap", "storage");
5878
5879 prop = RNA_def_property(srna, "uv_map", PROP_STRING, PROP_NONE);
5880 RNA_def_property_ui_text(prop, "UV Map", "UV coordinates to be used for mapping");
5881 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5882
5883 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
5884}
5885
5886static void def_sh_vertex_color(BlenderRNA * /*brna*/, StructRNA *srna)
5887{
5888 PropertyRNA *prop;
5889
5890 RNA_def_struct_sdna_from(srna, "NodeShaderVertexColor", "storage");
5891
5892 prop = RNA_def_property(srna, "layer_name", PROP_STRING, PROP_NONE);
5893 RNA_def_property_ui_text(prop, "Color Attribute", "Color Attribute");
5894 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5895
5896 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
5897}
5898
5899static void def_sh_uvalongstroke(BlenderRNA * /*brna*/, StructRNA *srna)
5900{
5901 PropertyRNA *prop;
5902
5903 prop = RNA_def_property(srna, "use_tips", PROP_BOOLEAN, PROP_NONE);
5904 RNA_def_property_boolean_sdna(prop, nullptr, "custom1", 1);
5906 prop, "Use Tips", "Lower half of the texture is for tips of the stroke");
5907 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5908}
5909
5910static void def_sh_normal_map(BlenderRNA * /*brna*/, StructRNA *srna)
5911{
5912 static const EnumPropertyItem prop_space_items[] = {
5913 {SHD_SPACE_TANGENT, "TANGENT", 0, "Tangent Space", "Tangent space normal mapping"},
5914 {SHD_SPACE_OBJECT, "OBJECT", 0, "Object Space", "Object space normal mapping"},
5915 {SHD_SPACE_WORLD, "WORLD", 0, "World Space", "World space normal mapping"},
5917 "BLENDER_OBJECT",
5918 0,
5919 "Blender Object Space",
5920 "Object space normal mapping, compatible with Blender render baking"},
5922 "BLENDER_WORLD",
5923 0,
5924 "Blender World Space",
5925 "World space normal mapping, compatible with Blender render baking"},
5926 {0, nullptr, 0, nullptr, nullptr},
5927 };
5928
5929 PropertyRNA *prop;
5930
5931 RNA_def_struct_sdna_from(srna, "NodeShaderNormalMap", "storage");
5932
5933 prop = RNA_def_property(srna, "space", PROP_ENUM, PROP_NONE);
5934 RNA_def_property_enum_items(prop, prop_space_items);
5935 RNA_def_property_ui_text(prop, "Space", "Space of the input normal");
5936 RNA_def_property_update(prop, 0, "rna_Node_update");
5937
5938 prop = RNA_def_property(srna, "uv_map", PROP_STRING, PROP_NONE);
5939 RNA_def_property_ui_text(prop, "UV Map", "UV Map for tangent space maps");
5940 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5941
5942 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
5943}
5944
5945static void def_sh_radial_tiling(BlenderRNA * /*brna*/, StructRNA *srna)
5946{
5947 PropertyRNA *prop;
5948
5949 RNA_def_struct_sdna_from(srna, "NodeRadialTiling", "storage");
5950
5951 prop = RNA_def_property(srna, "normalize", PROP_BOOLEAN, PROP_NONE);
5952 RNA_def_property_boolean_sdna(prop, nullptr, "normalize", 0);
5954 prop,
5955 "Normalize",
5956 "Normalize the X coordinate of the Segment Coordinates output to a [0, 1] interval and "
5957 "offset the Y coordinate into a [0, infinity) interval. When checked, the textures are "
5958 "stretched to fit into each angular segment. When not checked, the parts of the textures "
5959 "that don't fit into each angular segment are cropped");
5960 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
5961}
5962
5963static void def_sh_displacement(BlenderRNA * /*brna*/, StructRNA *srna)
5964{
5965 static const EnumPropertyItem prop_space_items[] = {
5967 "OBJECT",
5968 0,
5969 "Object Space",
5970 "Displacement is in object space, affected by object scale"},
5972 "WORLD",
5973 0,
5974 "World Space",
5975 "Displacement is in world space, not affected by object scale"},
5976 {0, nullptr, 0, nullptr, nullptr},
5977 };
5978
5979 PropertyRNA *prop;
5980
5981 prop = RNA_def_property(srna, "space", PROP_ENUM, PROP_NONE);
5982 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
5983 RNA_def_property_enum_items(prop, prop_space_items);
5984 RNA_def_property_ui_text(prop, "Space", "Space of the input height");
5985 RNA_def_property_update(prop, 0, "rna_Node_update");
5986
5987 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
5988}
5989
5991{
5992 static const EnumPropertyItem prop_space_items[] = {
5994 "TANGENT",
5995 0,
5996 "Tangent Space",
5997 "Tangent space vector displacement mapping"},
5998 {SHD_SPACE_OBJECT, "OBJECT", 0, "Object Space", "Object space vector displacement mapping"},
5999 {SHD_SPACE_WORLD, "WORLD", 0, "World Space", "World space vector displacement mapping"},
6000 {0, nullptr, 0, nullptr, nullptr},
6001 };
6002
6003 PropertyRNA *prop;
6004
6005 prop = RNA_def_property(srna, "space", PROP_ENUM, PROP_NONE);
6006 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
6007 RNA_def_property_enum_items(prop, prop_space_items);
6008 RNA_def_property_ui_text(prop, "Space", "Space of the input height");
6009 RNA_def_property_update(prop, 0, "rna_Node_update");
6010
6011 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
6012}
6013
6014static void def_sh_tangent(BlenderRNA * /*brna*/, StructRNA *srna)
6015{
6016 static const EnumPropertyItem prop_direction_type_items[] = {
6017 {SHD_TANGENT_RADIAL, "RADIAL", 0, "Radial", "Radial tangent around the X, Y or Z axis"},
6018 {SHD_TANGENT_UVMAP, "UV_MAP", 0, "UV Map", "Tangent from UV map"},
6019 {0, nullptr, 0, nullptr, nullptr},
6020 };
6021
6022 static const EnumPropertyItem prop_axis_items[] = {
6023 {SHD_TANGENT_AXIS_X, "X", 0, "X", "X axis"},
6024 {SHD_TANGENT_AXIS_Y, "Y", 0, "Y", "Y axis"},
6025 {SHD_TANGENT_AXIS_Z, "Z", 0, "Z", "Z axis"},
6026 {0, nullptr, 0, nullptr, nullptr},
6027 };
6028
6029 PropertyRNA *prop;
6030
6031 RNA_def_struct_sdna_from(srna, "NodeShaderTangent", "storage");
6032
6033 prop = RNA_def_property(srna, "direction_type", PROP_ENUM, PROP_NONE);
6034 RNA_def_property_enum_items(prop, prop_direction_type_items);
6035 RNA_def_property_ui_text(prop, "Direction", "Method to use for the tangent");
6036 RNA_def_property_update(prop, 0, "rna_Node_update");
6037
6038 prop = RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
6039 RNA_def_property_enum_items(prop, prop_axis_items);
6040 RNA_def_property_ui_text(prop, "Axis", "Axis for radial tangents");
6041 RNA_def_property_update(prop, 0, "rna_Node_update");
6042
6043 prop = RNA_def_property(srna, "uv_map", PROP_STRING, PROP_NONE);
6044 RNA_def_property_ui_text(prop, "UV Map", "UV Map for tangent generated from UV");
6045 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6046
6047 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
6048}
6049
6050static void def_sh_bevel(BlenderRNA * /*brna*/, StructRNA *srna)
6051{
6052 PropertyRNA *prop;
6053
6054 prop = RNA_def_property(srna, "samples", PROP_INT, PROP_UNSIGNED);
6055 RNA_def_property_int_sdna(prop, nullptr, "custom1");
6056 RNA_def_property_range(prop, 2, 128);
6057 RNA_def_property_ui_range(prop, 2, 16, 1, 1);
6058 RNA_def_property_ui_text(prop, "Samples", "Number of rays to trace per shader evaluation");
6059 RNA_def_property_update(prop, 0, "rna_Node_update");
6060}
6061
6062static void def_sh_ambient_occlusion(BlenderRNA * /*brna*/, StructRNA *srna)
6063{
6064 PropertyRNA *prop;
6065
6066 prop = RNA_def_property(srna, "samples", PROP_INT, PROP_UNSIGNED);
6067 RNA_def_property_int_sdna(prop, nullptr, "custom1");
6068 RNA_def_property_range(prop, 1, 128);
6069 RNA_def_property_ui_text(prop, "Samples", "Number of rays to trace per shader evaluation");
6070 RNA_def_property_update(prop, 0, "rna_Node_update");
6071
6072 prop = RNA_def_property(srna, "inside", PROP_BOOLEAN, PROP_NONE);
6073 RNA_def_property_boolean_sdna(prop, nullptr, "custom2", SHD_AO_INSIDE);
6074 RNA_def_property_ui_text(prop, "Inside", "Trace rays towards the inside of the object");
6075 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6076
6077 prop = RNA_def_property(srna, "only_local", PROP_BOOLEAN, PROP_NONE);
6078 RNA_def_property_boolean_sdna(prop, nullptr, "custom2", SHD_AO_LOCAL);
6080 prop, "Only Local", "Only consider the object itself when computing AO");
6081 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6082}
6083
6084static void def_sh_subsurface(BlenderRNA * /*brna*/, StructRNA *srna)
6085{
6086 PropertyRNA *prop;
6087
6088 prop = RNA_def_property(srna, "falloff", PROP_ENUM, PROP_NONE);
6089 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
6091 RNA_def_property_ui_text(prop, "Method", "Method for rendering subsurface scattering");
6092 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
6093}
6094
6095static void def_sh_tex_ies(BlenderRNA * /*brna*/, StructRNA *srna)
6096{
6097 PropertyRNA *prop;
6098
6099 prop = RNA_def_property(srna, "ies", PROP_POINTER, PROP_NONE);
6100 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6101 RNA_def_property_struct_type(prop, "Text");
6104 RNA_def_property_ui_text(prop, "IES Text", "Internal IES file");
6105 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6106
6107 RNA_def_struct_sdna_from(srna, "NodeShaderTexIES", "storage");
6108
6109 prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
6110 RNA_def_property_ui_text(prop, "File Path", "IES light path");
6112 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6113
6114 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
6115 RNA_def_property_enum_funcs(prop, nullptr, "rna_ShaderNodeTexIES_mode_set", nullptr);
6118 prop, "Source", "Whether the IES file is loaded from disk or from a text data-block");
6119 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6120
6121 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
6122}
6123
6124static void def_sh_output_aov(BlenderRNA * /*brna*/, StructRNA *srna)
6125{
6126 PropertyRNA *prop;
6127
6128 RNA_def_struct_sdna_from(srna, "NodeShaderOutputAOV", "storage");
6129
6130 prop = RNA_def_property(srna, "aov_name", PROP_STRING, PROP_NONE);
6131 RNA_def_property_string_sdna(prop, nullptr, "name");
6132 RNA_def_property_ui_text(prop, "Name", "Name of the AOV that this output writes to");
6133 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6134
6135 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
6136}
6137
6138static void def_sh_combsep_color(BlenderRNA * /*brna*/, StructRNA *srna)
6139{
6140 PropertyRNA *prop;
6141
6142 RNA_def_struct_sdna_from(srna, "NodeCombSepColor", "storage");
6143
6144 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
6146 RNA_def_property_ui_text(prop, "Mode", "Mode of color processing");
6147 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
6148}
6149
6150static void def_sh_script(BlenderRNA * /*brna*/, StructRNA *srna)
6151{
6152 PropertyRNA *prop;
6153
6154 prop = RNA_def_property(srna, "script", PROP_POINTER, PROP_NONE);
6155 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6156 RNA_def_property_struct_type(prop, "Text");
6159 RNA_def_property_ui_text(prop, "Script", "Internal shader script to define the shader");
6160 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNodeScript_update");
6161
6162 RNA_def_struct_sdna_from(srna, "NodeShaderScript", "storage");
6163
6164 prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
6165 RNA_def_property_ui_text(prop, "File Path", "Shader script path");
6167 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNodeScript_update");
6168
6169 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
6170 RNA_def_property_enum_funcs(prop, nullptr, "rna_ShaderNodeScript_mode_set", nullptr);
6172 RNA_def_property_ui_text(prop, "Script Source", "");
6173 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6174
6175 prop = RNA_def_property(srna, "use_auto_update", PROP_BOOLEAN, PROP_NONE);
6178 prop,
6179 "Auto Update",
6180 "Automatically update the shader when the .osl file changes (external scripts only)");
6181
6182 prop = RNA_def_property(srna, "bytecode", PROP_STRING, PROP_NONE);
6184 "rna_ShaderNodeScript_bytecode_get",
6185 "rna_ShaderNodeScript_bytecode_length",
6186 "rna_ShaderNodeScript_bytecode_set");
6187 RNA_def_property_ui_text(prop, "Bytecode", "Compile bytecode for shader script node");
6188 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6189
6190 prop = RNA_def_property(srna, "bytecode_hash", PROP_STRING, PROP_NONE);
6192 prop, "Bytecode Hash", "Hash of compile bytecode, for quick equality checking");
6193 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6194
6195 /* needs to be reset to avoid bad pointer type in API functions below */
6196 RNA_def_struct_sdna_from(srna, "bNode", nullptr);
6197
6198 /* API functions */
6199
6200# if 0 /* XXX TODO: use general node API for this. */
6201 func = RNA_def_function(srna, "find_socket", "rna_ShaderNodeScript_find_socket");
6202 RNA_def_function_ui_description(func, "Find a socket by name");
6203 parm = RNA_def_string(func, "name", nullptr, 0, "Socket name", "");
6205 /*parm =*/RNA_def_boolean(func, "is_output", false, "Output", "Whether the socket is an output");
6206 parm = RNA_def_pointer(func, "result", "NodeSocket", "", "");
6207 RNA_def_function_return(func, parm);
6208
6209 func = RNA_def_function(srna, "add_socket", "rna_ShaderNodeScript_add_socket");
6210 RNA_def_function_ui_description(func, "Add a socket");
6212 parm = RNA_def_string(func, "name", nullptr, 0, "Name", "");
6214 parm = RNA_def_enum(func, "type", rna_enum_node_socket_type_items, SOCK_FLOAT, "Type", "");
6216 /*parm =*/RNA_def_boolean(func, "is_output", false, "Output", "Whether the socket is an output");
6217 parm = RNA_def_pointer(func, "result", "NodeSocket", "", "");
6218 RNA_def_function_return(func, parm);
6219
6220 func = RNA_def_function(srna, "remove_socket", "rna_ShaderNodeScript_remove_socket");
6221 RNA_def_function_ui_description(func, "Remove a socket");
6223 parm = RNA_def_pointer(func, "sock", "NodeSocket", "Socket", "");
6225# endif
6226}
6227
6228/* -- Compositor Nodes ------------------------------------------------------ */
6229
6230static void def_node_image_user(BlenderRNA * /*brna*/, StructRNA *srna)
6231{
6232 PropertyRNA *prop;
6233
6234 prop = RNA_def_property(srna, "frame_duration", PROP_INT, PROP_NONE);
6235 RNA_def_property_int_sdna(prop, nullptr, "frames");
6238 prop, "Frames", "Number of images of a movie to use"); /* copied from the rna_image.cc */
6239 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6240
6241 prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
6242 RNA_def_property_int_sdna(prop, nullptr, "sfra");
6244 /* copied from the rna_image.cc */
6246 prop,
6247 "Start Frame",
6248 "Global starting frame of the movie/sequence, assuming first picture has a #1");
6249 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6250
6251 prop = RNA_def_property(srna, "frame_offset", PROP_INT, PROP_NONE);
6252 RNA_def_property_int_sdna(prop, nullptr, "offset");
6254 /* copied from the rna_image.cc */
6256 prop, "Offset", "Offset the number of the frame to use in the animation");
6257 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6258
6259 prop = RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE);
6260 RNA_def_property_boolean_sdna(prop, nullptr, "cycl", 1);
6262 prop, "Cyclic", "Cycle the images in the movie"); /* copied from the rna_image.cc */
6263 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6264
6265 prop = RNA_def_property(srna, "use_auto_refresh", PROP_BOOLEAN, PROP_NONE);
6266 RNA_def_property_boolean_sdna(prop, nullptr, "flag", IMA_ANIM_ALWAYS);
6267 /* copied from the rna_image.cc */
6268 RNA_def_property_ui_text(prop, "Auto-Refresh", "Always refresh image on frame changes");
6269 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6270
6271 prop = RNA_def_property(srna, "layer", PROP_ENUM, PROP_NONE);
6272 RNA_def_property_enum_sdna(prop, nullptr, "layer");
6274 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_Node_image_layer_itemf");
6276 RNA_def_property_ui_text(prop, "Layer", "");
6277 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_image_layer_update");
6278
6279 prop = RNA_def_property(srna, "has_layers", PROP_BOOLEAN, PROP_NONE);
6280 RNA_def_property_boolean_funcs(prop, "rna_Node_image_has_layers_get", nullptr);
6282 RNA_def_property_ui_text(prop, "Has Layers", "True if this image has any named layer");
6283
6284 prop = RNA_def_property(srna, "view", PROP_ENUM, PROP_NONE);
6285 RNA_def_property_enum_sdna(prop, nullptr, "view");
6287 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_Node_image_view_itemf");
6289 RNA_def_property_ui_text(prop, "View", "");
6290 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6291
6292 prop = RNA_def_property(srna, "has_views", PROP_BOOLEAN, PROP_NONE);
6293 RNA_def_property_boolean_funcs(prop, "rna_Node_image_has_views_get", nullptr);
6295 RNA_def_property_ui_text(prop, "Has View", "True if this image has multiple views");
6296}
6297
6298static void def_cmp_image(BlenderRNA *brna, StructRNA *srna)
6299{
6300 PropertyRNA *prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
6301 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6302 RNA_def_property_struct_type(prop, "Image");
6305 RNA_def_property_ui_text(prop, "Image", "");
6306 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Image_Node_update_id");
6307
6308 /* NOTE: Image user properties used in the UI are redefined in def_node_image_user,
6309 * to trigger correct updates of the node editor. RNA design problem that prevents
6310 * updates from nested structs. */
6311 RNA_def_struct_sdna_from(srna, "ImageUser", "storage");
6312 def_node_image_user(brna, srna);
6313}
6314
6315static void def_cmp_render_layers(BlenderRNA * /*brna*/, StructRNA *srna)
6316{
6317 PropertyRNA *prop;
6318
6319 prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
6320 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6321 RNA_def_property_pointer_funcs(prop, nullptr, "rna_Node_scene_set", nullptr, nullptr);
6322 RNA_def_property_struct_type(prop, "Scene");
6325 RNA_def_property_ui_text(prop, "Scene", "");
6326 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_view_layer_update");
6327
6328 prop = RNA_def_property(srna, "layer", PROP_ENUM, PROP_NONE);
6329 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
6331 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_Node_view_layer_itemf");
6333 RNA_def_property_ui_text(prop, "Layer", "");
6334 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_view_layer_update");
6335}
6336
6338{
6339 StructRNA *srna = RNA_def_struct(brna, "NodeCompositorFileOutputItem", nullptr);
6340 RNA_def_struct_ui_text(srna, "File Output Item", "");
6341
6342 rna_def_node_item_array_socket_item_common(srna, "FileOutputItemsAccessor", true, true);
6343
6344 PropertyRNA *prop = RNA_def_property(srna, "override_node_format", PROP_BOOLEAN, PROP_NONE);
6345 RNA_def_property_boolean_sdna(prop, nullptr, "override_node_format", 1);
6347 "Override Node Format",
6348 "Use a different format instead of the node format for this file");
6349 RNA_def_property_update(prop, NC_NODE | NA_EDITED, nullptr);
6350
6351 prop = RNA_def_property(srna, "save_as_render", PROP_BOOLEAN, PROP_NONE);
6352 RNA_def_property_boolean_sdna(prop, nullptr, "save_as_render", 1);
6354 prop, "Save as Render", "Apply render part of display transform when saving byte image");
6355 RNA_def_property_update(prop, NC_NODE | NA_EDITED, nullptr);
6356
6357 prop = RNA_def_property(srna, "format", PROP_POINTER, PROP_NONE);
6358 RNA_def_property_struct_type(prop, "ImageFormatSettings");
6359}
6360
6362{
6363 StructRNA *srna = RNA_def_struct(brna, "NodeCompositorFileOutputItems", nullptr);
6364 RNA_def_struct_sdna(srna, "bNode");
6365 RNA_def_struct_ui_text(srna, "Items", "Collection of file output items");
6366
6368 srna, "NodeCompositorFileOutputItem", "FileOutputItemsAccessor");
6370 srna, "NodeCompositorFileOutputItem", "FileOutputItemsAccessor");
6371}
6372
6374{
6375 PropertyRNA *prop;
6376
6379
6380 RNA_def_struct_sdna_from(srna, "NodeCompositorFileOutput", "storage");
6381
6382 prop = RNA_def_property(srna, "file_output_items", PROP_COLLECTION, PROP_NONE);
6383 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_count");
6384 RNA_def_property_struct_type(prop, "NodeCompositorFileOutputItem");
6385 RNA_def_property_ui_text(prop, "Items", "");
6386 RNA_def_property_srna(prop, "NodeCompositorFileOutputItems");
6387
6388 prop = RNA_def_property(srna, "active_item_index", PROP_INT, PROP_UNSIGNED);
6389 RNA_def_property_int_sdna(prop, nullptr, "active_item_index");
6390 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
6393 RNA_def_property_update(prop, NC_NODE | NA_EDITED, nullptr);
6394
6395 prop = RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH);
6396 RNA_def_property_string_sdna(prop, nullptr, "directory");
6397 RNA_def_property_ui_text(prop, "Directory", "The directory where the image will be written");
6401 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6402
6403 prop = RNA_def_property(srna, "file_name", PROP_STRING, PROP_FILENAME);
6404 RNA_def_property_string_sdna(prop, nullptr, "file_name");
6406 "File Name",
6407 "The base name of the file. Other information might be included in the "
6408 "final file name depending on the node options");
6411 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6412
6413 prop = RNA_def_property(srna, "format", PROP_POINTER, PROP_NONE);
6414 RNA_def_property_struct_type(prop, "ImageFormatSettings");
6415
6416 prop = RNA_def_property(srna, "save_as_render", PROP_BOOLEAN, PROP_NONE);
6417 RNA_def_property_boolean_sdna(prop, nullptr, "save_as_render", 1);
6419 prop, "Save as Render", "Apply render part of display transform when saving byte image");
6420 RNA_def_property_update(prop, NC_NODE | NA_EDITED, nullptr);
6421}
6422
6424{
6425 PropertyRNA *prop;
6426 RNA_def_struct_sdna_from(srna, "NodeConvertColorSpace", "storage");
6427
6428 prop = RNA_def_property(srna, "from_color_space", PROP_ENUM, PROP_NONE);
6432 "rna_NodeConvertColorSpace_from_color_space_get",
6433 "rna_NodeConvertColorSpace_from_color_space_set",
6434 "rna_NodeConvertColorSpace_color_space_itemf");
6435 RNA_def_property_ui_text(prop, "From", "Color space of the input image");
6436 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6437
6438 prop = RNA_def_property(srna, "to_color_space", PROP_ENUM, PROP_NONE);
6442 "rna_NodeConvertColorSpace_to_color_space_get",
6443 "rna_NodeConvertColorSpace_to_color_space_set",
6444 "rna_NodeConvertColorSpace_color_space_itemf");
6445 RNA_def_property_ui_text(prop, "To", "Color space of the output image");
6446 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6447}
6448
6450{
6451 PropertyRNA *prop;
6452 RNA_def_struct_sdna_from(srna, "NodeConvertToDisplay", "storage");
6453
6454 prop = RNA_def_property(srna, "view_settings", PROP_POINTER, PROP_NONE);
6455 RNA_def_property_pointer_sdna(prop, nullptr, "view_settings");
6456 RNA_def_property_struct_type(prop, "ColorManagedViewSettings");
6457 RNA_def_property_ui_text(prop, "View Settings", "Color management view transform settings");
6458
6459 prop = RNA_def_property(srna, "display_settings", PROP_POINTER, PROP_NONE);
6460 RNA_def_property_pointer_sdna(prop, nullptr, "display_settings");
6461 RNA_def_property_struct_type(prop, "ColorManagedDisplaySettings");
6462 RNA_def_property_ui_text(prop, "Display Settings", "Color management display device settings");
6463}
6464
6465static void def_cmp_defocus(BlenderRNA * /*brna*/, StructRNA *srna)
6466{
6467 PropertyRNA *prop;
6468
6469 static const EnumPropertyItem bokeh_items[] = {
6470 {8, "OCTAGON", 0, "Octagonal", "8 sides"},
6471 {7, "HEPTAGON", 0, "Heptagonal", "7 sides"},
6472 {6, "HEXAGON", 0, "Hexagonal", "6 sides"},
6473 {5, "PENTAGON", 0, "Pentagonal", "5 sides"},
6474 {4, "SQUARE", 0, "Square", "4 sides"},
6475 {3, "TRIANGLE", 0, "Triangular", "3 sides"},
6476 {0, "CIRCLE", 0, "Circular", ""},
6477 {0, nullptr, 0, nullptr, nullptr},
6478 };
6479
6480 prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
6481 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6482 RNA_def_property_pointer_funcs(prop, nullptr, "rna_Node_scene_set", nullptr, nullptr);
6483 RNA_def_property_struct_type(prop, "Scene");
6487 prop, "Scene", "Scene from which to select the active camera (render scene if undefined)");
6488 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6489
6490 RNA_def_struct_sdna_from(srna, "NodeDefocus", "storage");
6491
6492 prop = RNA_def_property(srna, "bokeh", PROP_ENUM, PROP_NONE);
6493 RNA_def_property_enum_sdna(prop, nullptr, "bktype");
6494 RNA_def_property_enum_items(prop, bokeh_items);
6495 RNA_def_property_ui_text(prop, "Bokeh Type", "");
6496 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6497
6498 prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
6499 RNA_def_property_float_sdna(prop, nullptr, "rotation");
6500 RNA_def_property_range(prop, 0.0f, DEG2RADF(90.0f));
6501 RNA_def_property_ui_text(prop, "Angle", "Bokeh shape rotation offset");
6502 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6503
6504 prop = RNA_def_property(srna, "f_stop", PROP_FLOAT, PROP_NONE);
6505 RNA_def_property_float_sdna(prop, nullptr, "fstop");
6506 RNA_def_property_range(prop, 0.0f, 128.0f);
6508 prop,
6509 "F-Stop",
6510 "Amount of focal blur, 128 (infinity) is perfect focus, half the value doubles "
6511 "the blur radius");
6512 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6513
6514 prop = RNA_def_property(srna, "blur_max", PROP_FLOAT, PROP_NONE);
6515 RNA_def_property_float_sdna(prop, nullptr, "maxblur");
6516 RNA_def_property_range(prop, 0.0f, 10000.0f);
6517 RNA_def_property_ui_text(prop, "Max Blur", "Blur limit, maximum CoC radius");
6518 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6519
6520 prop = RNA_def_property(srna, "use_zbuffer", PROP_BOOLEAN, PROP_NONE);
6521 RNA_def_property_boolean_negative_sdna(prop, nullptr, "no_zbuf", 1);
6523 "Use Z-Buffer",
6524 "Disable when using an image as input instead of actual z-buffer "
6525 "(auto enabled if node not image based, eg. time node)");
6526 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6527
6528 prop = RNA_def_property(srna, "z_scale", PROP_FLOAT, PROP_NONE);
6529 RNA_def_property_float_sdna(prop, nullptr, "scale");
6530 RNA_def_property_range(prop, 0.0f, 1000.0f);
6532 prop,
6533 "Z-Scale",
6534 "Scale the Z input when not using a z-buffer, controls maximum blur designated "
6535 "by the color white or input value 1");
6536 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6537}
6538
6539static void def_cmp_colorbalance(BlenderRNA * /*brna*/, StructRNA *srna)
6540{
6541 PropertyRNA *prop;
6542
6543 prop = RNA_def_property(srna, "input_whitepoint", PROP_FLOAT, PROP_COLOR);
6544 RNA_def_property_array(prop, 3);
6546 "rna_NodeColorBalance_input_whitepoint_get",
6547 "rna_NodeColorBalance_input_whitepoint_set",
6548 nullptr);
6550 "Input White Point",
6551 "The color which gets mapped to white "
6552 "(automatically converted to/from temperature and tint)");
6553 RNA_def_property_update(prop, NC_WINDOW, "rna_Node_update");
6554
6555 prop = RNA_def_property(srna, "output_whitepoint", PROP_FLOAT, PROP_COLOR);
6556 RNA_def_property_array(prop, 3);
6558 "rna_NodeColorBalance_output_whitepoint_get",
6559 "rna_NodeColorBalance_output_whitepoint_set",
6560 nullptr);
6562 "Output White Point",
6563 "The color which gets white gets mapped to "
6564 "(automatically converted to/from temperature and tint)");
6565 RNA_def_property_update(prop, NC_WINDOW, "rna_Node_update");
6566}
6567
6568static void def_cmp_huecorrect(BlenderRNA * /*brna*/, StructRNA *srna)
6569{
6570 PropertyRNA *prop;
6571
6572 prop = RNA_def_property(srna, "mapping", PROP_POINTER, PROP_NONE);
6573 RNA_def_property_pointer_sdna(prop, nullptr, "storage");
6574 RNA_def_property_struct_type(prop, "CurveMapping");
6575 RNA_def_property_ui_text(prop, "Mapping", "");
6576 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6577}
6578
6579static void def_cmp_combsep_color(BlenderRNA * /*brna*/, StructRNA *srna)
6580{
6581 static const EnumPropertyItem mode_items[] = {
6583 "RGB",
6584 ICON_NONE,
6585 "RGB",
6586 "Use RGB (Red, Green, Blue) color processing"},
6588 "HSV",
6589 ICON_NONE,
6590 "HSV",
6591 "Use HSV (Hue, Saturation, Value) color processing"},
6593 "HSL",
6594 ICON_NONE,
6595 "HSL",
6596 "Use HSL (Hue, Saturation, Lightness) color processing"},
6598 "YCC",
6599 ICON_NONE,
6600 "YCbCr",
6601 "Use YCbCr (Y - luma, Cb - blue-difference chroma, Cr - red-difference chroma) color "
6602 "processing"},
6604 "YUV",
6605 ICON_NONE,
6606 "YUV",
6607 "Use YUV (Y - luma, U V - chroma) color processing"},
6608 {0, nullptr, 0, nullptr, nullptr},
6609 };
6610
6611 PropertyRNA *prop;
6612
6613 RNA_def_struct_sdna_from(srna, "NodeCMPCombSepColor", "storage");
6614
6615 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
6616 RNA_def_property_enum_items(prop, mode_items);
6617 RNA_def_property_ui_text(prop, "Mode", "Mode of color processing");
6618 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
6619
6620 prop = RNA_def_property(srna, "ycc_mode", PROP_ENUM, PROP_NONE);
6622 RNA_def_property_ui_text(prop, "Color Space", "Color space used for YCbCrA processing");
6623 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6624}
6625
6626static void def_cmp_movieclip(BlenderRNA * /*brna*/, StructRNA *srna)
6627{
6628 PropertyRNA *prop;
6629
6630 prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
6631 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6632 RNA_def_property_struct_type(prop, "MovieClip");
6635 RNA_def_property_ui_text(prop, "Movie Clip", "");
6636 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6637
6638 RNA_def_struct_sdna_from(srna, "MovieClipUser", "storage");
6639}
6640
6641static void def_cmp_stabilize2d(BlenderRNA * /*brna*/, StructRNA *srna)
6642{
6643 PropertyRNA *prop;
6644
6645 prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
6646 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6647 RNA_def_property_struct_type(prop, "MovieClip");
6650 RNA_def_property_ui_text(prop, "Movie Clip", "");
6651 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6652}
6653
6654static void def_cmp_moviedistortion(BlenderRNA * /*brna*/, StructRNA *srna)
6655{
6656 PropertyRNA *prop;
6657
6658 prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
6659 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6660 RNA_def_property_struct_type(prop, "MovieClip");
6663 RNA_def_property_ui_text(prop, "Movie Clip", "");
6664 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6665}
6666
6667static void def_cmp_mask(BlenderRNA * /*brna*/, StructRNA *srna)
6668{
6669 PropertyRNA *prop;
6670
6671 prop = RNA_def_property(srna, "mask", PROP_POINTER, PROP_NONE);
6672 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6673 RNA_def_property_struct_type(prop, "Mask");
6676 RNA_def_property_ui_text(prop, "Mask", "");
6677 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6678}
6679
6680static void def_cmp_viewer(BlenderRNA * /*brna*/, StructRNA *srna)
6681{
6682 PropertyRNA *prop = RNA_def_property(srna, "ui_shortcut", PROP_INT, PROP_NONE);
6683 RNA_def_property_int_sdna(prop, nullptr, "custom1");
6684 RNA_def_property_int_funcs(prop, nullptr, "rna_Node_Viewer_shortcut_node_set", nullptr);
6688 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
6689}
6690
6691static void def_cmp_keyingscreen(BlenderRNA * /*brna*/, StructRNA *srna)
6692{
6693 PropertyRNA *prop;
6694
6695 prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
6696 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6697 RNA_def_property_struct_type(prop, "MovieClip");
6700 RNA_def_property_ui_text(prop, "Movie Clip", "");
6701 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6702
6703 RNA_def_struct_sdna_from(srna, "NodeKeyingScreenData", "storage");
6704
6705 prop = RNA_def_property(srna, "tracking_object", PROP_STRING, PROP_NONE);
6706 RNA_def_property_string_sdna(prop, nullptr, "tracking_object");
6707 RNA_def_property_ui_text(prop, "Tracking Object", "");
6708 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6709}
6710
6711static void def_cmp_trackpos(BlenderRNA * /*brna*/, StructRNA *srna)
6712{
6713 PropertyRNA *prop;
6714
6715 prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
6716 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6717 RNA_def_property_struct_type(prop, "MovieClip");
6720 RNA_def_property_ui_text(prop, "Movie Clip", "");
6721 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6722
6723 RNA_def_struct_sdna_from(srna, "NodeTrackPosData", "storage");
6724
6725 prop = RNA_def_property(srna, "tracking_object", PROP_STRING, PROP_NONE);
6726 RNA_def_property_string_sdna(prop, nullptr, "tracking_object");
6727 RNA_def_property_ui_text(prop, "Tracking Object", "");
6728 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6729
6730 prop = RNA_def_property(srna, "track_name", PROP_STRING, PROP_NONE);
6731 RNA_def_property_string_sdna(prop, nullptr, "track_name");
6732 RNA_def_property_ui_text(prop, "Track", "");
6734 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6735}
6736
6737static void def_cmp_planetrackdeform(BlenderRNA * /*brna*/, StructRNA *srna)
6738{
6739 PropertyRNA *prop;
6740
6741 prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
6742 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6743 RNA_def_property_struct_type(prop, "MovieClip");
6746 RNA_def_property_ui_text(prop, "Movie Clip", "");
6747 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6748
6749 RNA_def_struct_sdna_from(srna, "NodePlaneTrackDeformData", "storage");
6750
6751 prop = RNA_def_property(srna, "tracking_object", PROP_STRING, PROP_NONE);
6752 RNA_def_property_string_sdna(prop, nullptr, "tracking_object");
6753 RNA_def_property_ui_text(prop, "Tracking Object", "");
6754 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6755
6756 prop = RNA_def_property(srna, "plane_track_name", PROP_STRING, PROP_NONE);
6757 RNA_def_property_string_sdna(prop, nullptr, "plane_track_name");
6758 RNA_def_property_ui_text(prop, "Plane Track", "");
6759 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6760}
6761
6763{
6764 StructRNA *srna;
6765 PropertyRNA *prop;
6766
6767 srna = RNA_def_struct(brna, "CryptomatteEntry", nullptr);
6768 RNA_def_struct_sdna(srna, "CryptomatteEntry");
6769
6770 prop = RNA_def_property(srna, "encoded_hash", PROP_FLOAT, PROP_NONE);
6772 RNA_def_property_float_sdna(prop, nullptr, "encoded_hash");
6773
6774 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
6776 RNA_def_property_ui_text(prop, "Name", "");
6777 RNA_def_struct_name_property(srna, prop);
6778}
6779
6781{
6782 PropertyRNA *prop;
6783 static float default_1[3] = {1.0f, 1.0f, 1.0f};
6784
6785 prop = RNA_def_property(srna, "matte_id", PROP_STRING, PROP_NONE);
6787 "rna_NodeCryptomatte_matte_get",
6788 "rna_NodeCryptomatte_matte_length",
6789 "rna_NodeCryptomatte_matte_set");
6791 prop, "Matte Objects", "List of object and material crypto IDs to include in matte");
6792 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6793
6794 prop = RNA_def_property(srna, "add", PROP_FLOAT, PROP_COLOR);
6795 RNA_def_property_float_sdna(prop, nullptr, "runtime.add");
6796 RNA_def_property_float_array_default(prop, default_1);
6799 prop, "Add", "Add object or material to matte, by picking a color from the Pick output");
6801 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeCryptomatte_update_add");
6802
6803 prop = RNA_def_property(srna, "remove", PROP_FLOAT, PROP_COLOR);
6804 RNA_def_property_float_sdna(prop, nullptr, "runtime.remove");
6805 RNA_def_property_float_array_default(prop, default_1);
6808 prop,
6809 "Remove",
6810 "Remove object or material from matte, by picking a color from the Pick output");
6812 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeCryptomatte_update_remove");
6813}
6814
6816{
6817 RNA_def_struct_sdna_from(srna, "NodeCryptomatte", "storage");
6818 def_cmp_cryptomatte_common(brna, srna);
6819}
6820
6822{
6823 PropertyRNA *prop;
6824
6825 static const EnumPropertyItem cryptomatte_source_items[] = {
6827 "RENDER",
6828 0,
6829 "Render",
6830 "Use Cryptomatte passes from a render"},
6832 "IMAGE",
6833 0,
6834 "Image",
6835 "Use Cryptomatte passes from an image"},
6836 {0, nullptr, 0, nullptr, nullptr}};
6837
6838 prop = RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
6839 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
6840 RNA_def_property_enum_items(prop, cryptomatte_source_items);
6841 RNA_def_property_enum_funcs(prop, nullptr, "rna_NodeCryptomatte_source_set", nullptr);
6842 RNA_def_property_ui_text(prop, "Source", "Where the Cryptomatte passes are loaded from");
6843 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6844
6845 prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
6847 prop, "rna_NodeCryptomatte_scene_get", "rna_NodeCryptomatte_scene_set", nullptr, nullptr);
6848 RNA_def_property_struct_type(prop, "Scene");
6851 RNA_def_property_ui_text(prop, "Scene", "");
6852 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6853
6854 prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
6856 "rna_NodeCryptomatte_image_get",
6857 "rna_NodeCryptomatte_image_set",
6858 nullptr,
6859 "rna_NodeCryptomatte_image_poll");
6860 RNA_def_property_struct_type(prop, "Image");
6863 RNA_def_property_ui_text(prop, "Image", "");
6864 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
6865
6866 RNA_def_struct_sdna_from(srna, "NodeCryptomatte", "storage");
6867 def_cmp_cryptomatte_common(brna, srna);
6868
6869 prop = RNA_def_property(srna, "layer_name", PROP_ENUM, PROP_NONE);
6872 "rna_NodeCryptomatte_layer_name_get",
6873 "rna_NodeCryptomatte_layer_name_set",
6874 "rna_NodeCryptomatte_layer_name_itemf");
6875 RNA_def_property_ui_text(prop, "Cryptomatte Layer", "What Cryptomatte layer is used");
6876 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6877
6878 prop = RNA_def_property(srna, "entries", PROP_COLLECTION, PROP_NONE);
6879 RNA_def_property_collection_sdna(prop, nullptr, "entries", nullptr);
6880 RNA_def_property_struct_type(prop, "CryptomatteEntry");
6881 RNA_def_property_ui_text(prop, "Mattes", "");
6883
6884 /* Included here instead of defining image_user as a property of the node,
6885 * see def_cmp_image for details.
6886 * As mentioned in DNA_node_types.h, iuser is the first member of the Cryptomatte
6887 * storage type, so we can cast node->storage to ImageUser.
6888 * That is required since we can't define the properties from storage->iuser directly... */
6889 RNA_def_struct_sdna_from(srna, "ImageUser", "storage");
6890 def_node_image_user(brna, srna);
6891}
6892
6893/* -- Texture Nodes --------------------------------------------------------- */
6894
6895static void def_tex_output(BlenderRNA * /*brna*/, StructRNA *srna)
6896{
6897 PropertyRNA *prop;
6898
6899 RNA_def_struct_sdna_from(srna, "TexNodeOutput", "storage");
6900
6901 prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_NONE);
6902 RNA_def_property_string_sdna(prop, nullptr, "name");
6903 RNA_def_property_ui_text(prop, "Output Name", "");
6904 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6905}
6906
6907static void def_tex_image(BlenderRNA * /*brna*/, StructRNA *srna)
6908{
6909 PropertyRNA *prop;
6910
6911 prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
6912 RNA_def_property_pointer_sdna(prop, nullptr, "id");
6913 RNA_def_property_struct_type(prop, "Image");
6916 RNA_def_property_ui_text(prop, "Image", "");
6917 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6918
6919 prop = RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
6920 RNA_def_property_pointer_sdna(prop, nullptr, "storage");
6921 RNA_def_property_struct_type(prop, "ImageUser");
6923 prop, "Image User", "Parameters defining the image duration, offset and related settings");
6924 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6925}
6926
6927static void def_tex_bricks(BlenderRNA * /*brna*/, StructRNA *srna)
6928{
6929 PropertyRNA *prop;
6930
6931 prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
6932 RNA_def_property_float_sdna(prop, nullptr, "custom3");
6933 RNA_def_property_range(prop, 0.0f, 1.0f);
6935 prop, "Offset Amount", "Determines the brick offset of the various rows");
6936 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6937
6938 prop = RNA_def_property(srna, "offset_frequency", PROP_INT, PROP_NONE);
6939 RNA_def_property_int_sdna(prop, nullptr, "custom1");
6940 RNA_def_property_range(prop, 2, 99);
6941 RNA_def_property_ui_text(prop, "Offset Frequency", "Offset every N rows");
6942 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6943
6944 prop = RNA_def_property(srna, "squash", PROP_FLOAT, PROP_NONE);
6945 RNA_def_property_float_sdna(prop, nullptr, "custom4");
6946 RNA_def_property_range(prop, 0.0f, 99.0f);
6948 prop,
6949 "Squash Amount",
6950 "Factor to adjust the brick's width for particular rows determined by the Offset Frequency");
6951
6952 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6953
6954 prop = RNA_def_property(srna, "squash_frequency", PROP_INT, PROP_NONE);
6955 RNA_def_property_int_sdna(prop, nullptr, "custom2");
6956 RNA_def_property_range(prop, 2, 99);
6957 RNA_def_property_ui_text(prop, "Squash Frequency", "Squash every N rows");
6958 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
6959}
6960
6961/* -- Geometry Nodes --------------------------------------------------------- */
6962
6963static void def_geo_curve_sample(BlenderRNA * /*brna*/, StructRNA *srna)
6964{
6965 static EnumPropertyItem mode_items[] = {
6967 "FACTOR",
6968 0,
6969 "Factor",
6970 "Find sample positions on the curve using a factor of its total length"},
6972 "LENGTH",
6973 0,
6974 "Length",
6975 "Find sample positions on the curve using a distance from its beginning"},
6976 {0, nullptr, 0, nullptr, nullptr},
6977 };
6978
6979 RNA_def_struct_sdna_from(srna, "NodeGeometryCurveSample", "storage");
6980
6981 PropertyRNA *prop;
6982 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
6983 RNA_def_property_enum_items(prop, mode_items);
6984 RNA_def_property_ui_text(prop, "Mode", "Method for sampling input");
6986 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
6987
6988 prop = RNA_def_property(srna, "use_all_curves", PROP_BOOLEAN, PROP_NONE);
6990 "All Curves",
6991 "Sample lengths based on the total length of all curves, rather than "
6992 "using a length inside each selected curve");
6994 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
6995
6996 prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
6999 prop, nullptr, nullptr, "rna_GeometryNodeAttributeType_type_with_socket_itemf");
7001 RNA_def_property_ui_text(prop, "Data Type", "");
7003 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
7004}
7005
7006static void def_fn_random_value(BlenderRNA * /*brna*/, StructRNA *srna)
7007{
7008 PropertyRNA *prop;
7009
7010 RNA_def_struct_sdna_from(srna, "NodeRandomValue", "storage");
7011
7012 prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
7013 RNA_def_property_enum_sdna(prop, nullptr, "data_type");
7015 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_FunctionNodeRandomValue_type_itemf");
7017 RNA_def_property_ui_text(prop, "Data Type", "Type of data stored in attribute");
7018 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
7019}
7020
7022{
7023 PropertyRNA *prop;
7024
7025 static const EnumPropertyItem rna_node_geometry_distribute_points_on_faces_mode_items[] = {
7027 "RANDOM",
7028 0,
7029 "Random",
7030 "Distribute points randomly on the surface"},
7032 "POISSON",
7033 0,
7034 "Poisson Disk",
7035 "Distribute the points randomly on the surface while taking a minimum distance between "
7036 "points into account"},
7037 {0, nullptr, 0, nullptr, nullptr},
7038 };
7039
7040 prop = RNA_def_property(srna, "distribute_method", PROP_ENUM, PROP_NONE);
7041 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
7042 RNA_def_property_enum_items(prop, rna_node_geometry_distribute_points_on_faces_mode_items);
7044 RNA_def_property_ui_text(prop, "Distribution Method", "Method to use for scattering points");
7046 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
7047
7048 prop = RNA_def_property(srna, "use_legacy_normal", PROP_BOOLEAN, PROP_NONE);
7049 RNA_def_property_boolean_sdna(prop, nullptr, "custom2", 1);
7051 "Legacy Normal",
7052 "Output the normal and rotation values that have been output "
7053 "before the node started taking smooth normals into account");
7055 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
7056}
7057
7059{
7060 PropertyRNA *prop;
7061
7062 RNA_def_struct_sdna_from(srna, "NodeGeometryCurveSetHandles", "storage");
7063
7064 prop = RNA_def_property(srna, "handle_type", PROP_ENUM, PROP_NONE);
7065 RNA_def_property_enum_sdna(prop, nullptr, "handle_type");
7066 RNA_def_property_ui_text(prop, "Handle Type", "");
7069 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
7070
7071 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
7075 RNA_def_property_ui_text(prop, "Mode", "Whether to update left and right handles");
7076 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
7077}
7078
7079static void def_common_zone_input(BlenderRNA * /*brna*/, StructRNA *srna)
7080{
7081 PropertyRNA *prop;
7082 FunctionRNA *func;
7083 PropertyRNA *parm;
7084
7085 prop = RNA_def_property(srna, "paired_output", PROP_POINTER, PROP_NONE);
7086 RNA_def_property_struct_type(prop, "Node");
7088 RNA_def_property_pointer_funcs(prop, "rna_Node_paired_output_get", nullptr, nullptr, nullptr);
7090 prop, "Paired Output", "Zone output node that this input node is paired with");
7091
7092 func = RNA_def_function(srna, "pair_with_output", "rna_Node_pair_with_output");
7093 RNA_def_function_ui_description(func, "Pair a zone input node with an output node.");
7095 parm = RNA_def_pointer(
7096 func, "output_node", "NodeInternal", "Output Node", "Zone output node to pair with");
7098 /* return value */
7099 parm = RNA_def_boolean(
7100 func, "result", false, "Result", "True if pairing the node was successful");
7101 RNA_def_function_return(func, parm);
7102}
7103
7105{
7106 RNA_def_struct_sdna_from(srna, "NodeGeometrySimulationInput", "storage");
7107
7108 def_common_zone_input(brna, srna);
7109}
7110
7112{
7113 RNA_def_struct_sdna_from(srna, "NodeGeometryRepeatInput", "storage");
7114
7115 def_common_zone_input(brna, srna);
7116}
7117
7119{
7120 RNA_def_struct_sdna_from(srna, "NodeGeometryForeachGeometryElementInput", "storage");
7121
7122 def_common_zone_input(brna, srna);
7123}
7124
7125static void def_closure_input(BlenderRNA *brna, StructRNA *srna)
7126{
7127 RNA_def_struct_sdna_from(srna, "NodeClosureInput", "storage");
7128
7129 def_common_zone_input(brna, srna);
7130}
7131
7133{
7134 PropertyRNA *prop;
7135
7136 StructRNA *srna = RNA_def_struct(brna, "SimulationStateItem", nullptr);
7137 RNA_def_struct_ui_text(srna, "Simulation Item", "");
7138 RNA_def_struct_sdna(srna, "NodeSimulationItem");
7139
7140 rna_def_node_item_array_socket_item_common(srna, "SimulationItemsAccessor", true);
7141
7142 prop = RNA_def_property(srna, "attribute_domain", PROP_ENUM, PROP_NONE);
7145 prop, nullptr, nullptr, "rna_GeometryNodeAttributeDomain_attribute_domain_itemf");
7147 prop,
7148 "Attribute Domain",
7149 "Attribute domain where the attribute is stored in the simulation state");
7152 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<SimulationItemsAccessor>");
7153}
7154
7156{
7157 StructRNA *srna;
7158
7159 srna = RNA_def_struct(brna, "NodeGeometrySimulationOutputItems", nullptr);
7160 RNA_def_struct_sdna(srna, "bNode");
7161 RNA_def_struct_ui_text(srna, "Items", "Collection of simulation items");
7162
7164 srna, "SimulationStateItem", "SimulationItemsAccessor");
7165 rna_def_node_item_array_common_functions(srna, "SimulationStateItem", "SimulationItemsAccessor");
7166}
7167
7169{
7170 PropertyRNA *prop;
7171
7174
7175 RNA_def_struct_sdna_from(srna, "NodeGeometrySimulationOutput", "storage");
7176
7177 prop = RNA_def_property(srna, "state_items", PROP_COLLECTION, PROP_NONE);
7178 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
7179 RNA_def_property_struct_type(prop, "SimulationStateItem");
7180 RNA_def_property_ui_text(prop, "Items", "");
7181 RNA_def_property_srna(prop, "NodeGeometrySimulationOutputItems");
7182
7183 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
7184 RNA_def_property_int_sdna(prop, nullptr, "active_index");
7185 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7188 RNA_def_property_update(prop, NC_NODE, nullptr);
7189
7190 prop = RNA_def_property(srna, "active_item", PROP_POINTER, PROP_NONE);
7191 RNA_def_property_struct_type(prop, "SimulationStateItem");
7193 "rna_Node_ItemArray_active_get<SimulationItemsAccessor>",
7194 "rna_Node_ItemArray_active_set<SimulationItemsAccessor>",
7195 nullptr,
7196 nullptr);
7198 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7199 RNA_def_property_update(prop, NC_NODE, nullptr);
7200}
7201
7203{
7204 StructRNA *srna = RNA_def_struct(brna, "RepeatItem", nullptr);
7205 RNA_def_struct_ui_text(srna, "Repeat Item", "");
7206 RNA_def_struct_sdna(srna, "NodeRepeatItem");
7207
7208 rna_def_node_item_array_socket_item_common(srna, "RepeatItemsAccessor", true);
7209}
7210
7212{
7213 StructRNA *srna;
7214
7215 srna = RNA_def_struct(brna, "NodeGeometryRepeatOutputItems", nullptr);
7216 RNA_def_struct_sdna(srna, "bNode");
7217 RNA_def_struct_ui_text(srna, "Items", "Collection of repeat items");
7218
7219 rna_def_node_item_array_new_with_socket_and_name(srna, "RepeatItem", "RepeatItemsAccessor");
7220 rna_def_node_item_array_common_functions(srna, "RepeatItem", "RepeatItemsAccessor");
7221}
7222
7224{
7225 PropertyRNA *prop;
7226
7229
7230 RNA_def_struct_sdna_from(srna, "NodeGeometryRepeatOutput", "storage");
7231
7232 prop = RNA_def_property(srna, "repeat_items", PROP_COLLECTION, PROP_NONE);
7233 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
7234 RNA_def_property_struct_type(prop, "RepeatItem");
7235 RNA_def_property_ui_text(prop, "Items", "");
7236 RNA_def_property_srna(prop, "NodeGeometryRepeatOutputItems");
7237
7238 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
7239 RNA_def_property_int_sdna(prop, nullptr, "active_index");
7240 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7243 RNA_def_property_update(prop, NC_NODE, nullptr);
7244
7245 prop = RNA_def_property(srna, "active_item", PROP_POINTER, PROP_NONE);
7246 RNA_def_property_struct_type(prop, "RepeatItem");
7248 "rna_Node_ItemArray_active_get<RepeatItemsAccessor>",
7249 "rna_Node_ItemArray_active_set<RepeatItemsAccessor>",
7250 nullptr,
7251 nullptr);
7253 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7254 RNA_def_property_update(prop, NC_NODE, nullptr);
7255
7256 prop = RNA_def_property(srna, "inspection_index", PROP_INT, PROP_NONE);
7257 RNA_def_property_ui_range(prop, 0, INT32_MAX, 1, -1);
7259 "Inspection Index",
7260 "Iteration index that is used by inspection features like the viewer "
7261 "node or socket inspection");
7262 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
7263}
7264
7266{
7267 PropertyRNA *prop;
7268
7269 StructRNA *srna = RNA_def_struct(brna, "NodeGeometryViewerItem", nullptr);
7270 RNA_def_struct_ui_text(srna, "Viewer Item", "");
7271 RNA_def_struct_sdna(srna, "NodeGeometryViewerItem");
7272
7273 rna_def_node_item_array_socket_item_common(srna, "GeoViewerItemsAccessor", true);
7274
7275 prop = RNA_def_property(srna, "auto_remove", PROP_BOOLEAN, PROP_NONE);
7280 prop, "Auto Remove", "Remove the item automatically when it is unlinked");
7282 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<GeoViewerItemsAccessor>");
7283}
7284
7286{
7287 StructRNA *srna = RNA_def_struct(brna, "NodeGeometryViewerItems", nullptr);
7288 RNA_def_struct_sdna(srna, "bNode");
7289 RNA_def_struct_ui_text(srna, "Items", "Collection of viewer items");
7290
7292 srna, "NodeGeometryViewerItem", "GeoViewerItemsAccessor");
7294 srna, "NodeGeometryViewerItem", "GeoViewerItemsAccessor");
7295}
7296
7297static void rna_def_geo_viewer(BlenderRNA *brna, StructRNA *srna)
7298{
7299 PropertyRNA *prop;
7300
7303
7304 prop = RNA_def_property(srna, "ui_shortcut", PROP_INT, PROP_NONE);
7305 RNA_def_property_int_sdna(prop, nullptr, "custom1");
7306 RNA_def_property_int_funcs(prop, nullptr, "rna_Node_Viewer_shortcut_node_set", nullptr);
7310 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
7311
7312 RNA_def_struct_sdna_from(srna, "NodeGeometryViewer", "storage");
7313
7314 prop = RNA_def_property(srna, "viewer_items", PROP_COLLECTION, PROP_NONE);
7315 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
7316 RNA_def_property_struct_type(prop, "NodeGeometryViewerItem");
7317 RNA_def_property_ui_text(prop, "Viewer Items", "");
7318 RNA_def_property_srna(prop, "NodeGeometryViewerItems");
7319
7320 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
7321 RNA_def_property_int_sdna(prop, nullptr, "active_index");
7322 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7325 RNA_def_property_update(prop, NC_NODE, nullptr);
7326
7327 prop = RNA_def_property(srna, "active_item", PROP_POINTER, PROP_NONE);
7328 RNA_def_property_struct_type(prop, "NodeGeometryViewerItem");
7329 RNA_def_property_ui_text(prop, "Active Item", "");
7332 "rna_Node_ItemArray_active_get<GeoViewerItemsAccessor>",
7333 "rna_Node_ItemArray_active_set<GeoViewerItemsAccessor>",
7334 nullptr,
7335 nullptr);
7336
7337 prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE);
7340 RNA_def_property_ui_text(prop, "Domain", "Domain to evaluate fields on");
7341 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
7342}
7343
7345{
7346 StructRNA *srna = RNA_def_struct(brna, "ForeachGeometryElementInputItem", nullptr);
7347 RNA_def_struct_ui_text(srna, "For Each Geometry Element Item", "");
7348 RNA_def_struct_sdna(srna, "NodeForeachGeometryElementInputItem");
7349
7351 srna, "ForeachGeometryElementInputItemsAccessor", true);
7352}
7353
7355{
7356 StructRNA *srna;
7357
7358 srna = RNA_def_struct(brna, "NodeGeometryForeachGeometryElementInputItems", nullptr);
7359 RNA_def_struct_sdna(srna, "bNode");
7360 RNA_def_struct_ui_text(srna, "Input Items", "Collection of input items");
7361
7363 srna, "ForeachGeometryElementInputItem", "ForeachGeometryElementInputItemsAccessor");
7365 srna, "ForeachGeometryElementInputItem", "ForeachGeometryElementInputItemsAccessor");
7366}
7367
7369{
7370 StructRNA *srna;
7371
7372 srna = RNA_def_struct(brna, "ForeachGeometryElementMainItem", nullptr);
7373 RNA_def_struct_ui_text(srna, "For Each Geometry Element Item", "");
7374 RNA_def_struct_sdna(srna, "NodeForeachGeometryElementMainItem");
7375
7377 srna, "ForeachGeometryElementMainItemsAccessor", true);
7378}
7379
7381{
7382 StructRNA *srna;
7383
7384 srna = RNA_def_struct(brna, "NodeGeometryForeachGeometryElementMainItems", nullptr);
7385 RNA_def_struct_sdna(srna, "bNode");
7386 RNA_def_struct_ui_text(srna, "Main Items", "Collection of main items");
7387
7389 srna, "ForeachGeometryElementMainItem", "ForeachGeometryElementMainItemsAccessor");
7391 srna, "ForeachGeometryElementMainItem", "ForeachGeometryElementMainItemsAccessor");
7392}
7393
7395{
7396 StructRNA *srna;
7397 PropertyRNA *prop;
7398
7399 srna = RNA_def_struct(brna, "ForeachGeometryElementGenerationItem", nullptr);
7400 RNA_def_struct_ui_text(srna, "For Each Geometry Element Item", "");
7401 RNA_def_struct_sdna(srna, "NodeForeachGeometryElementGenerationItem");
7402
7404 srna, "ForeachGeometryElementGenerationItemsAccessor", true);
7405
7406 prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE);
7407 RNA_def_property_ui_text(prop, "Domain", "Domain that the field is evaluated on");
7410 prop,
7412 "rna_Node_ItemArray_item_update<ForeachGeometryElementGenerationItemsAccessor>");
7413}
7414
7416{
7417 StructRNA *srna;
7418
7419 srna = RNA_def_struct(brna, "NodeGeometryForeachGeometryElementGenerationItems", nullptr);
7420 RNA_def_struct_sdna(srna, "bNode");
7421 RNA_def_struct_ui_text(srna, "Generation Items", "Collection of generation items");
7422
7424 srna,
7425 "ForeachGeometryElementGenerationItem",
7426 "ForeachGeometryElementGenerationItemsAccessor");
7428 "ForeachGeometryElementGenerationItem",
7429 "ForeachGeometryElementGenerationItemsAccessor");
7430}
7431
7433{
7434 PropertyRNA *prop;
7435
7438
7441
7444
7445 RNA_def_struct_sdna_from(srna, "NodeGeometryForeachGeometryElementOutput", "storage");
7446
7447 prop = RNA_def_property(srna, "input_items", PROP_COLLECTION, PROP_NONE);
7448 RNA_def_property_collection_sdna(prop, nullptr, "input_items.items", "input_items.items_num");
7449 RNA_def_property_struct_type(prop, "ForeachGeometryElementInputItem");
7450 RNA_def_property_srna(prop, "NodeGeometryForeachGeometryElementInputItems");
7451
7452 prop = RNA_def_property(srna, "main_items", PROP_COLLECTION, PROP_NONE);
7453 RNA_def_property_collection_sdna(prop, nullptr, "main_items.items", "main_items.items_num");
7454 RNA_def_property_struct_type(prop, "ForeachGeometryElementMainItem");
7455 RNA_def_property_srna(prop, "NodeGeometryForeachGeometryElementMainItems");
7456
7457 prop = RNA_def_property(srna, "generation_items", PROP_COLLECTION, PROP_NONE);
7459 prop, nullptr, "generation_items.items", "generation_items.items_num");
7460 RNA_def_property_struct_type(prop, "ForeachGeometryElementGenerationItem");
7461 RNA_def_property_srna(prop, "NodeGeometryForeachGeometryElementGenerationItems");
7462
7463 prop = RNA_def_property(srna, "active_input_index", PROP_INT, PROP_UNSIGNED);
7464 RNA_def_property_int_sdna(prop, nullptr, "input_items.active_index");
7465 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7468 RNA_def_property_update(prop, NC_NODE, nullptr);
7469
7470 prop = RNA_def_property(srna, "active_generation_index", PROP_INT, PROP_UNSIGNED);
7471 RNA_def_property_int_sdna(prop, nullptr, "generation_items.active_index");
7472 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7475 RNA_def_property_update(prop, NC_NODE, nullptr);
7476
7477 prop = RNA_def_property(srna, "active_main_index", PROP_INT, PROP_UNSIGNED);
7478 RNA_def_property_int_sdna(prop, nullptr, "main_items.active_index");
7479 RNA_def_property_ui_text(prop, "Active Main Item Index", "Index of the active item");
7482 RNA_def_property_update(prop, NC_NODE, nullptr);
7483
7484 prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE);
7485 RNA_def_property_ui_text(prop, "Domain", "Geometry domain that is iterated over");
7487 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
7488
7489 prop = RNA_def_property(srna, "inspection_index", PROP_INT, PROP_NONE);
7490 RNA_def_property_ui_range(prop, 0, INT32_MAX, 1, -1);
7492 "Inspection Index",
7493 "Iteration index that is used by inspection features like the viewer "
7494 "node or socket inspection");
7495 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
7496}
7497
7499{
7500 StructRNA *srna;
7501 PropertyRNA *prop;
7502
7503 srna = RNA_def_struct(brna, "NodeClosureInputItem", nullptr);
7504 RNA_def_struct_ui_text(srna, "Closure Input Item", "");
7505 RNA_def_struct_sdna(srna, "NodeClosureInputItem");
7506
7507 rna_def_node_item_array_socket_item_common(srna, "ClosureInputItemsAccessor", true);
7508
7509 prop = RNA_def_property(srna, "structure_type", PROP_ENUM, PROP_NONE);
7512 prop,
7513 nullptr,
7514 nullptr,
7515 "rna_Node_ItemArray_structure_type_itemf<ClosureInputItemsAccessor>");
7517 prop,
7518 "Structure Type",
7519 "What kind of higher order types are expected to flow through this socket");
7521 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<ClosureInputItemsAccessor>");
7522}
7523
7525{
7526 StructRNA *srna = RNA_def_struct(brna, "NodeClosureInputItems", nullptr);
7527 RNA_def_struct_ui_text(srna, "Closure Input Items", "");
7528 RNA_def_struct_sdna(srna, "bNode");
7529
7531 srna, "NodeClosureInputItem", "ClosureInputItemsAccessor");
7533 srna, "NodeClosureInputItem", "ClosureInputItemsAccessor");
7534}
7535
7537{
7538 PropertyRNA *prop;
7539
7540 StructRNA *srna = RNA_def_struct(brna, "NodeClosureOutputItem", nullptr);
7541 RNA_def_struct_ui_text(srna, "Closure Output Item", "");
7542 RNA_def_struct_sdna(srna, "NodeClosureOutputItem");
7543
7544 rna_def_node_item_array_socket_item_common(srna, "ClosureOutputItemsAccessor", true);
7545
7546 prop = RNA_def_property(srna, "structure_type", PROP_ENUM, PROP_NONE);
7549 prop,
7550 nullptr,
7551 nullptr,
7552 "rna_Node_ItemArray_structure_type_itemf<ClosureOutputItemsAccessor>");
7554 prop,
7555 "Structure Type",
7556 "What kind of higher order types are expected to flow through this socket");
7558 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<ClosureOutputItemsAccessor>");
7559}
7560
7562{
7563 StructRNA *srna = RNA_def_struct(brna, "NodeClosureOutputItems", nullptr);
7564 RNA_def_struct_ui_text(srna, "Closure Output Items", "");
7565 RNA_def_struct_sdna(srna, "bNode");
7566
7568 srna, "NodeClosureOutputItem", "ClosureOutputItemsAccessor");
7570 srna, "NodeClosureOutputItem", "ClosureOutputItemsAccessor");
7571}
7572
7573static void def_closure_output(BlenderRNA *brna, StructRNA *srna)
7574{
7575 PropertyRNA *prop;
7576
7579
7582
7583 RNA_def_struct_sdna_from(srna, "NodeClosureOutput", "storage");
7584
7585 prop = RNA_def_property(srna, "input_items", PROP_COLLECTION, PROP_NONE);
7586 RNA_def_property_collection_sdna(prop, nullptr, "input_items.items", "input_items.items_num");
7587 RNA_def_property_struct_type(prop, "NodeClosureInputItem");
7588 RNA_def_property_srna(prop, "NodeClosureInputItems");
7589
7590 prop = RNA_def_property(srna, "output_items", PROP_COLLECTION, PROP_NONE);
7591 RNA_def_property_collection_sdna(prop, nullptr, "output_items.items", "output_items.items_num");
7592 RNA_def_property_struct_type(prop, "NodeClosureOutputItem");
7593 RNA_def_property_srna(prop, "NodeClosureOutputItems");
7594
7595 prop = RNA_def_property(srna, "active_input_index", PROP_INT, PROP_UNSIGNED);
7596 RNA_def_property_int_sdna(prop, nullptr, "input_items.active_index");
7597 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7600 RNA_def_property_update(prop, NC_NODE, nullptr);
7601
7602 prop = RNA_def_property(srna, "active_output_index", PROP_INT, PROP_UNSIGNED);
7603 RNA_def_property_int_sdna(prop, nullptr, "output_items.active_index");
7604 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7607 RNA_def_property_update(prop, NC_NODE, nullptr);
7608
7609 prop = RNA_def_property(srna, "define_signature", PROP_BOOLEAN, PROP_NONE);
7612 prop,
7613 "Define Signature",
7614 "This zone defines a closure signature that should be used by other nodes");
7617 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
7618}
7619
7621{
7622 StructRNA *srna = RNA_def_struct(brna, "NodeGeometryCaptureAttributeItem", nullptr);
7623 RNA_def_struct_ui_text(srna, "Capture Attribute Item", "");
7624 RNA_def_struct_sdna(srna, "NodeGeometryAttributeCaptureItem");
7625
7626 rna_def_node_item_array_socket_item_common(srna, "CaptureAttributeItemsAccessor", false);
7627 PropertyRNA *prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
7630 prop, nullptr, nullptr, "rna_NodeGeometryCaptureAttributeItem_data_type_itemf");
7631 RNA_def_property_ui_text(prop, "Data Type", "");
7634 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<CaptureAttributeItemsAccessor>");
7635}
7636
7638{
7639 StructRNA *srna = RNA_def_struct(brna, "NodeGeometryCaptureAttributeItems", nullptr);
7640 RNA_def_struct_ui_text(srna, "Items", "Collection of capture attribute items");
7641 RNA_def_struct_sdna(srna, "bNode");
7642
7644 srna, "NodeGeometryCaptureAttributeItem", "CaptureAttributeItemsAccessor");
7646 srna, "NodeGeometryCaptureAttributeItem", "CaptureAttributeItemsAccessor");
7647}
7648
7650{
7651 PropertyRNA *prop;
7652
7655
7656 RNA_def_struct_sdna_from(srna, "NodeGeometryAttributeCapture", "storage");
7657
7658 prop = RNA_def_property(srna, "capture_items", PROP_COLLECTION, PROP_NONE);
7659 RNA_def_property_collection_sdna(prop, nullptr, "capture_items", "capture_items_num");
7660 RNA_def_property_struct_type(prop, "NodeGeometryCaptureAttributeItem");
7661 RNA_def_property_ui_text(prop, "Items", "");
7662 RNA_def_property_srna(prop, "NodeGeometryCaptureAttributeItems");
7663
7664 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
7665 RNA_def_property_int_sdna(prop, nullptr, "active_index");
7666 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7669 RNA_def_property_update(prop, NC_NODE, nullptr);
7670
7671 prop = RNA_def_property(srna, "active_item", PROP_POINTER, PROP_NONE);
7672 RNA_def_property_struct_type(prop, "RepeatItem");
7674 "rna_Node_ItemArray_active_get<CaptureAttributeItemsAccessor>",
7675 "rna_Node_ItemArray_active_set<CaptureAttributeItemsAccessor>",
7676 nullptr,
7677 nullptr);
7679 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7680 RNA_def_property_update(prop, NC_NODE, nullptr);
7681
7682 prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE);
7683 RNA_def_property_ui_text(prop, "Domain", "Which domain to store the data in");
7686 prop, nullptr, nullptr, "rna_GeometryNodeAttributeDomain_attribute_domain_itemf");
7687 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
7688}
7689
7691{
7692 StructRNA *srna;
7693 PropertyRNA *prop;
7694
7695 srna = RNA_def_struct(brna, "NodeEvaluateClosureInputItem", nullptr);
7696 RNA_def_struct_ui_text(srna, "Input Item", "");
7697
7698 rna_def_node_item_array_socket_item_common(srna, "EvaluateClosureInputItemsAccessor", true);
7699
7700 prop = RNA_def_property(srna, "structure_type", PROP_ENUM, PROP_NONE);
7703 prop,
7704 nullptr,
7705 nullptr,
7706 "rna_Node_ItemArray_structure_type_itemf<EvaluateClosureInputItemsAccessor>");
7708 prop,
7709 "Structure Type",
7710 "What kind of higher order types are expected to flow through this socket");
7713 "rna_Node_ItemArray_item_update<EvaluateClosureInputItemsAccessor>");
7714}
7715
7717{
7718 StructRNA *srna;
7719
7720 srna = RNA_def_struct(brna, "NodeEvaluateClosureInputItems", nullptr);
7721 RNA_def_struct_ui_text(srna, "Input Items", "");
7722 RNA_def_struct_sdna(srna, "bNode");
7723
7725 srna, "NodeEvaluateClosureInputItem", "EvaluateClosureInputItemsAccessor");
7727 srna, "NodeEvaluateClosureInputItem", "EvaluateClosureInputItemsAccessor");
7728}
7729
7731{
7732 StructRNA *srna;
7733 PropertyRNA *prop;
7734
7735 srna = RNA_def_struct(brna, "NodeEvaluateClosureOutputItem", nullptr);
7736 RNA_def_struct_ui_text(srna, "Output Item", "");
7737
7738 rna_def_node_item_array_socket_item_common(srna, "EvaluateClosureOutputItemsAccessor", true);
7739
7740 prop = RNA_def_property(srna, "structure_type", PROP_ENUM, PROP_NONE);
7743 prop,
7744 nullptr,
7745 nullptr,
7746 "rna_Node_ItemArray_structure_type_itemf<EvaluateClosureOutputItemsAccessor>");
7748 prop,
7749 "Structure Type",
7750 "What kind of higher order types are expected to flow through this socket");
7753 "rna_Node_ItemArray_item_update<EvaluateClosureOutputItemsAccessor>");
7754}
7755
7757{
7758 StructRNA *srna;
7759
7760 srna = RNA_def_struct(brna, "NodeEvaluateClosureOutputItems", nullptr);
7761 RNA_def_struct_ui_text(srna, "Output Items", "");
7762 RNA_def_struct_sdna(srna, "bNode");
7763
7765 srna, "NodeEvaluateClosureOutputItem", "EvaluateClosureOutputItemsAccessor");
7767 srna, "NodeEvaluateClosureOutputItem", "EvaluateClosureOutputItemsAccessor");
7768}
7769
7771{
7772 PropertyRNA *prop;
7773
7776
7779
7780 RNA_def_struct_sdna_from(srna, "NodeEvaluateClosure", "storage");
7781
7782 prop = RNA_def_property(srna, "input_items", PROP_COLLECTION, PROP_NONE);
7783 RNA_def_property_collection_sdna(prop, nullptr, "input_items.items", "input_items.items_num");
7784 RNA_def_property_struct_type(prop, "NodeEvaluateClosureInputItem");
7785 RNA_def_property_ui_text(prop, "Input Items", "");
7786 RNA_def_property_srna(prop, "NodeEvaluateClosureInputItems");
7787
7788 prop = RNA_def_property(srna, "output_items", PROP_COLLECTION, PROP_NONE);
7789 RNA_def_property_collection_sdna(prop, nullptr, "output_items.items", "output_items.items_num");
7790 RNA_def_property_struct_type(prop, "NodeEvaluateClosureOutputItem");
7791 RNA_def_property_ui_text(prop, "Output Items", "");
7792 RNA_def_property_srna(prop, "NodeEvaluateClosureOutputItems");
7793
7794 prop = RNA_def_property(srna, "active_input_index", PROP_INT, PROP_UNSIGNED);
7795 RNA_def_property_int_sdna(prop, nullptr, "input_items.active_index");
7796 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7799 RNA_def_property_update(prop, NC_NODE, nullptr);
7800
7801 prop = RNA_def_property(srna, "active_output_index", PROP_INT, PROP_UNSIGNED);
7802 RNA_def_property_int_sdna(prop, nullptr, "output_items.active_index");
7803 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7806 RNA_def_property_update(prop, NC_NODE, nullptr);
7807
7808 prop = RNA_def_property(srna, "define_signature", PROP_BOOLEAN, PROP_NONE);
7810 prop, nullptr, "flag", NODE_EVALUATE_CLOSURE_FLAG_DEFINE_SIGNATURE);
7812 prop,
7813 "Define Signature",
7814 "This node defines a closure signature that should be used by other nodes");
7817 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
7818}
7819
7821{
7822 PropertyRNA *prop;
7823
7824 StructRNA *srna = RNA_def_struct(brna, "NodeGeometryBakeItem", nullptr);
7825 RNA_def_struct_ui_text(srna, "Bake Item", "");
7826
7827 rna_def_node_item_array_socket_item_common(srna, "BakeItemsAccessor", true);
7828
7829 prop = RNA_def_property(srna, "attribute_domain", PROP_ENUM, PROP_NONE);
7832 prop, nullptr, nullptr, "rna_GeometryNodeAttributeDomain_attribute_domain_itemf");
7834 "Attribute Domain",
7835 "Attribute domain where the attribute is stored in the baked data");
7838 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<BakeItemsAccessor>");
7839
7840 prop = RNA_def_property(srna, "is_attribute", PROP_BOOLEAN, PROP_NONE);
7842 RNA_def_property_ui_text(prop, "Is Attribute", "Bake item is an attribute stored on a geometry");
7844 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<BakeItemsAccessor>");
7845}
7846
7848{
7849 StructRNA *srna;
7850
7851 srna = RNA_def_struct(brna, "NodeGeometryBakeItems", nullptr);
7852 RNA_def_struct_sdna(srna, "bNode");
7853 RNA_def_struct_ui_text(srna, "Items", "Collection of bake items");
7854
7856 srna, "NodeGeometryBakeItem", "BakeItemsAccessor");
7857 rna_def_node_item_array_common_functions(srna, "NodeGeometryBakeItem", "BakeItemsAccessor");
7858}
7859
7860static void rna_def_geo_bake(BlenderRNA *brna, StructRNA *srna)
7861{
7862 PropertyRNA *prop;
7863
7866
7867 RNA_def_struct_sdna_from(srna, "NodeGeometryBake", "storage");
7868
7869 prop = RNA_def_property(srna, "bake_items", PROP_COLLECTION, PROP_NONE);
7870 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
7871 RNA_def_property_struct_type(prop, "NodeGeometryBakeItem");
7872 RNA_def_property_ui_text(prop, "Items", "");
7873 RNA_def_property_srna(prop, "NodeGeometryBakeItems");
7874
7875 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
7876 RNA_def_property_int_sdna(prop, nullptr, "active_index");
7877 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7880 RNA_def_property_update(prop, NC_NODE, nullptr);
7881
7882 prop = RNA_def_property(srna, "active_item", PROP_POINTER, PROP_NONE);
7883 RNA_def_property_struct_type(prop, "RepeatItem");
7885 "rna_Node_ItemArray_active_get<BakeItemsAccessor>",
7886 "rna_Node_ItemArray_active_set<BakeItemsAccessor>",
7887 nullptr,
7888 nullptr);
7891 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7892 RNA_def_property_update(prop, NC_NODE, nullptr);
7893}
7894
7896{
7897 PropertyRNA *prop;
7898
7899 StructRNA *srna = RNA_def_struct(brna, "NodeCombineBundleItem", nullptr);
7900 RNA_def_struct_ui_text(srna, "Combine Bundle Item", "");
7901
7902 rna_def_node_item_array_socket_item_common(srna, "CombineBundleItemsAccessor", true);
7903
7904 prop = RNA_def_property(srna, "structure_type", PROP_ENUM, PROP_NONE);
7907 prop,
7908 nullptr,
7909 nullptr,
7910 "rna_Node_ItemArray_structure_type_itemf<CombineBundleItemsAccessor>");
7912 prop,
7913 "Structure Type",
7914 "What kind of higher order types are expected to flow through this socket");
7916 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<CombineBundleItemsAccessor>");
7917}
7918
7920{
7921 StructRNA *srna = RNA_def_struct(brna, "NodeCombineBundleItems", nullptr);
7922 RNA_def_struct_sdna(srna, "bNode");
7923 RNA_def_struct_ui_text(srna, "Items", "Collection of combine bundle items");
7924
7926 srna, "NodeCombineBundleItem", "CombineBundleItemsAccessor");
7928 srna, "NodeCombineBundleItem", "CombineBundleItemsAccessor");
7929}
7930
7931static void def_combine_bundle(BlenderRNA *brna, StructRNA *srna)
7932{
7933 PropertyRNA *prop;
7934
7937
7938 RNA_def_struct_sdna_from(srna, "NodeCombineBundle", "storage");
7939
7940 prop = RNA_def_property(srna, "bundle_items", PROP_COLLECTION, PROP_NONE);
7941 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
7942 RNA_def_property_struct_type(prop, "NodeCombineBundleItem");
7943 RNA_def_property_ui_text(prop, "Items", "");
7944 RNA_def_property_srna(prop, "NodeCombineBundleItems");
7945
7946 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
7947 RNA_def_property_int_sdna(prop, nullptr, "active_index");
7948 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
7951 RNA_def_property_update(prop, NC_NODE, nullptr);
7952
7953 prop = RNA_def_property(srna, "define_signature", PROP_BOOLEAN, PROP_NONE);
7956 prop,
7957 "Define Signature",
7958 "This node defines a bundle signature that should be used by other nodes");
7961 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
7962}
7963
7965{
7966 PropertyRNA *prop;
7967
7968 StructRNA *srna = RNA_def_struct(brna, "NodeSeparateBundleItem", nullptr);
7969 RNA_def_struct_ui_text(srna, "Separate Bundle Item", "");
7970
7971 rna_def_node_item_array_socket_item_common(srna, "SeparateBundleItemsAccessor", true);
7972
7973 prop = RNA_def_property(srna, "structure_type", PROP_ENUM, PROP_NONE);
7976 prop,
7977 nullptr,
7978 nullptr,
7979 "rna_Node_ItemArray_structure_type_itemf<SeparateBundleItemsAccessor>");
7981 prop,
7982 "Structure Type",
7983 "What kind of higher order types are expected to flow through this socket");
7985 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<SeparateBundleItemsAccessor>");
7986}
7987
7989{
7990 StructRNA *srna = RNA_def_struct(brna, "NodeSeparateBundleItems", nullptr);
7991 RNA_def_struct_sdna(srna, "bNode");
7992 RNA_def_struct_ui_text(srna, "Items", "Collection of separate bundle items");
7993
7995 srna, "NodeSeparateBundleItem", "SeparateBundleItemsAccessor");
7997 srna, "NodeSeparateBundleItem", "SeparateBundleItemsAccessor");
7998}
7999
8001{
8002 PropertyRNA *prop;
8003
8006
8007 RNA_def_struct_sdna_from(srna, "NodeSeparateBundle", "storage");
8008
8009 prop = RNA_def_property(srna, "bundle_items", PROP_COLLECTION, PROP_NONE);
8010 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
8011 RNA_def_property_struct_type(prop, "NodeSeparateBundleItem");
8012 RNA_def_property_ui_text(prop, "Items", "");
8013 RNA_def_property_srna(prop, "NodeSeparateBundleItems");
8014
8015 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
8016 RNA_def_property_int_sdna(prop, nullptr, "active_index");
8017 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
8020 RNA_def_property_update(prop, NC_NODE, nullptr);
8021
8022 prop = RNA_def_property(srna, "define_signature", PROP_BOOLEAN, PROP_NONE);
8025 prop,
8026 "Define Signature",
8027 "This node defines a bundle signature that should be used by other nodes");
8030 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
8031}
8032
8034{
8035 PropertyRNA *prop;
8036
8037 StructRNA *srna = RNA_def_struct(brna, "IndexSwitchItem", nullptr);
8038 RNA_def_struct_ui_text(srna, "Index Switch Item", "");
8039 RNA_def_struct_sdna(srna, "IndexSwitchItem");
8040
8041 prop = RNA_def_property(srna, "identifier", PROP_INT, PROP_NONE);
8042 RNA_def_property_ui_range(prop, 0, INT32_MAX, 1, -1);
8043 RNA_def_property_ui_text(prop, "Identifier", "Consistent identifier used for the item");
8045 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
8046}
8047
8049{
8050 StructRNA *srna;
8051 FunctionRNA *func;
8052 PropertyRNA *parm;
8053
8054 srna = RNA_def_struct(brna, "NodeIndexSwitchItems", nullptr);
8055 RNA_def_struct_sdna(srna, "bNode");
8056 RNA_def_struct_ui_text(srna, "Items", "Collection of index_switch items");
8057
8058 func = RNA_def_function(srna, "new", "rna_NodeIndexSwitchItems_new");
8059 RNA_def_function_ui_description(func, "Add an item at the end");
8061 /* Return value. */
8062 parm = RNA_def_pointer(func, "item", "IndexSwitchItem", "Item", "New item");
8063 RNA_def_function_return(func, parm);
8064
8065 rna_def_node_item_array_common_functions(srna, "IndexSwitchItem", "IndexSwitchItemsAccessor");
8066}
8067
8069{
8070 PropertyRNA *prop;
8071
8074
8075 RNA_def_struct_sdna_from(srna, "NodeIndexSwitch", "storage");
8076
8077 prop = RNA_def_property(srna, "index_switch_items", PROP_COLLECTION, PROP_NONE);
8078 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
8079 RNA_def_property_struct_type(prop, "IndexSwitchItem");
8080 RNA_def_property_ui_text(prop, "Items", "");
8081 RNA_def_property_srna(prop, "NodeIndexSwitchItems");
8082}
8083
8085{
8086 PropertyRNA *prop;
8087
8088 StructRNA *srna = RNA_def_struct(brna, "GeometryNodeFieldToGridItem", nullptr);
8089 RNA_def_struct_ui_text(srna, "Field to Grid Item", "");
8090 RNA_def_struct_sdna(srna, "GeometryNodeFieldToGridItem");
8091
8092 rna_def_node_item_array_socket_item_common(srna, "FieldToGridItemsAccessor", false);
8093 prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
8095 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_NodeFieldToGridItem_data_type_itemf");
8096 RNA_def_property_ui_text(prop, "Data Type", "");
8099 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<FieldToGridItemsAccessor>");
8100
8101 prop = RNA_def_property(srna, "identifier", PROP_INT, PROP_NONE);
8103}
8104
8106{
8107 StructRNA *srna = RNA_def_struct(brna, "GeometryNodeFieldToGridItems", nullptr);
8108 RNA_def_struct_ui_text(srna, "Items", "Collection of field to grid items");
8109 RNA_def_struct_sdna(srna, "bNode");
8110
8112 srna, "GeometryNodeFieldToGridItem", "FieldToGridItemsAccessor");
8114 srna, "GeometryNodeFieldToGridItem", "FieldToGridItemsAccessor");
8115}
8116
8118{
8119 PropertyRNA *prop;
8120
8123
8124 RNA_def_struct_sdna_from(srna, "GeometryNodeFieldToGrid", "storage");
8125
8126 prop = RNA_def_property(srna, "grid_items", PROP_COLLECTION, PROP_NONE);
8127 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
8128 RNA_def_property_struct_type(prop, "GeometryNodeFieldToGridItem");
8129 RNA_def_property_ui_text(prop, "Items", "");
8130 RNA_def_property_srna(prop, "GeometryNodeFieldToGridItems");
8131
8132 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
8133 RNA_def_property_int_sdna(prop, nullptr, "active_index");
8134 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
8137 RNA_def_property_update(prop, NC_NODE, nullptr);
8138
8139 prop = RNA_def_property(srna, "active_item", PROP_POINTER, PROP_NONE);
8140 RNA_def_property_struct_type(prop, "RepeatItem");
8142 "rna_Node_ItemArray_active_get<FieldToGridItemsAccessor>",
8143 "rna_Node_ItemArray_active_set<FieldToGridItemsAccessor>",
8144 nullptr,
8145 nullptr);
8147 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
8148 RNA_def_property_update(prop, NC_NODE, nullptr);
8149
8150 prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
8152 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_NodeFieldToGridItem_data_type_itemf");
8153 RNA_def_property_ui_text(prop, "Data Type", "Data type for topology grid");
8155 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
8156}
8157
8159{
8160 StructRNA *srna;
8161
8162 srna = RNA_def_struct(brna, "NodeFunctionFormatStringItem", nullptr);
8163 RNA_def_struct_ui_text(srna, "Format String Item", "");
8164
8165 rna_def_node_item_array_socket_item_common(srna, "FormatStringItemsAccessor", true);
8166}
8167
8169{
8170 StructRNA *srna;
8171
8172 srna = RNA_def_struct(brna, "NodeFunctionFormatStringItems", nullptr);
8173 RNA_def_struct_sdna(srna, "bNode");
8174 RNA_def_struct_ui_text(srna, "Items", "Collection of format string items");
8175
8177 srna, "NodeFunctionFormatStringItem", "FormatStringItemsAccessor");
8179 srna, "NodeFunctionFormatStringItem", "FormatStringItemsAccessor");
8180}
8181
8183{
8184 PropertyRNA *prop;
8185
8188
8189 RNA_def_struct_sdna_from(srna, "NodeFunctionFormatString", "storage");
8190
8191 prop = RNA_def_property(srna, "format_items", PROP_COLLECTION, PROP_NONE);
8192 RNA_def_property_collection_sdna(prop, nullptr, "items", "items_num");
8193 RNA_def_property_struct_type(prop, "NodeFunctionFormatStringItem");
8194 RNA_def_property_ui_text(prop, "Items", "");
8195 RNA_def_property_srna(prop, "NodeFunctionFormatStringItems");
8196
8197 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
8198 RNA_def_property_int_sdna(prop, nullptr, "active_index");
8199 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
8202 RNA_def_property_update(prop, NC_NODE, nullptr);
8203}
8204
8206{
8207 PropertyRNA *prop;
8208
8209 RNA_def_struct_sdna_from(srna, "NodeGeometryCurveSelectHandles", "storage");
8210
8211 prop = RNA_def_property(srna, "handle_type", PROP_ENUM, PROP_NONE);
8212 RNA_def_property_enum_sdna(prop, nullptr, "handle_type");
8213 RNA_def_property_ui_text(prop, "Handle Type", "");
8215 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
8216
8217 prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
8220 RNA_def_property_ui_text(prop, "Mode", "Whether to check the type of left and right handles");
8221 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
8222}
8223
8224static void def_fn_rotate_euler(BlenderRNA * /*brna*/, StructRNA *srna)
8225{
8226 static const EnumPropertyItem type_items[] = {
8228 "AXIS_ANGLE",
8229 ICON_NONE,
8230 "Axis Angle",
8231 "Rotate around an axis by an angle"},
8233 "EULER",
8234 ICON_NONE,
8235 "Euler",
8236 "Rotate around the X, Y, and Z axes"},
8237 {0, nullptr, 0, nullptr, nullptr},
8238 };
8239
8240 static const EnumPropertyItem space_items[] = {
8242 "OBJECT",
8243 ICON_NONE,
8244 "Object",
8245 "Rotate the input rotation in the local space of the object"},
8247 "LOCAL",
8248 ICON_NONE,
8249 "Local",
8250 "Rotate the input rotation in its local space"},
8251 {0, nullptr, 0, nullptr, nullptr},
8252 };
8253
8254 PropertyRNA *prop;
8255
8256 prop = RNA_def_property(srna, "rotation_type", PROP_ENUM, PROP_NONE);
8257 RNA_def_property_enum_sdna(prop, nullptr, "custom1");
8258 RNA_def_property_enum_items(prop, type_items);
8259 RNA_def_property_ui_text(prop, "Type", "Method used to describe the rotation");
8260 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
8261
8262 prop = RNA_def_property(srna, "space", PROP_ENUM, PROP_NONE);
8263 RNA_def_property_enum_sdna(prop, nullptr, "custom2");
8265 RNA_def_property_ui_text(prop, "Space", "Base orientation for rotation");
8266 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8267}
8268
8269static void def_geo_sample_index(BlenderRNA * /*brna*/, StructRNA *srna)
8270{
8271 using namespace blender;
8272 PropertyRNA *prop;
8273
8274 RNA_def_struct_sdna_from(srna, "NodeGeometrySampleIndex", "storage");
8275
8276 prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
8279 prop, nullptr, nullptr, "rna_GeometryNodeAttributeType_type_with_socket_itemf");
8281 RNA_def_property_ui_text(prop, "Data Type", "");
8283 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
8284
8285 prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE);
8288 prop, nullptr, nullptr, "rna_GeometryNodeAttributeDomain_attribute_domain_itemf");
8290 RNA_def_property_ui_text(prop, "Domain", "");
8291 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8292
8293 prop = RNA_def_property(srna, "clamp", PROP_BOOLEAN, PROP_NONE);
8295 "Clamp",
8296 "Clamp the indices to the size of the attribute domain instead of "
8297 "outputting a default value for invalid indices");
8298 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8299}
8300
8301static void def_geo_input_material(BlenderRNA * /*brna*/, StructRNA *srna)
8302{
8303 PropertyRNA *prop;
8304
8305 prop = RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE);
8306 RNA_def_property_pointer_sdna(prop, nullptr, "id");
8307 RNA_def_property_struct_type(prop, "Material");
8310 RNA_def_property_ui_text(prop, "Material", "");
8311 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8312}
8313
8314static void def_geo_input_collection(BlenderRNA * /*brna*/, StructRNA *srna)
8315{
8316 PropertyRNA *prop;
8317
8318 prop = RNA_def_property(srna, "collection", PROP_POINTER, PROP_NONE);
8319 RNA_def_property_pointer_sdna(prop, nullptr, "id");
8320 RNA_def_property_struct_type(prop, "Collection");
8323 RNA_def_property_ui_text(prop, "Collection", "");
8324 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8325}
8326
8327static void def_geo_input_normal(BlenderRNA * /*brna*/, StructRNA *srna)
8328{
8329 PropertyRNA *prop = RNA_def_property(srna, "legacy_corner_normals", PROP_BOOLEAN, PROP_NONE);
8330 RNA_def_property_boolean_sdna(prop, nullptr, "custom1", 1);
8332 prop,
8333 "Flat Corner Normals",
8334 "Always use face normals for the face corner domain, matching old behavior of the node");
8335 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8336}
8337
8338static void def_geo_input_object(BlenderRNA * /*brna*/, StructRNA *srna)
8339{
8340 PropertyRNA *prop;
8341
8342 prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
8343 RNA_def_property_pointer_sdna(prop, nullptr, "id");
8344 RNA_def_property_struct_type(prop, "Object");
8347 RNA_def_property_ui_text(prop, "Object", "");
8348 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8349}
8350
8351static void def_geo_image(BlenderRNA * /*brna*/, StructRNA *srna)
8352{
8353 PropertyRNA *prop;
8354
8355 prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
8356 RNA_def_property_pointer_sdna(prop, nullptr, "id");
8357 RNA_def_property_struct_type(prop, "Image");
8359 RNA_def_property_ui_text(prop, "Image", "");
8360 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8361}
8362
8363static void def_geo_string_to_curves(BlenderRNA * /*brna*/, StructRNA *srna)
8364{
8365 static const EnumPropertyItem rna_node_geometry_string_to_curves_overflow_items[] = {
8367 "OVERFLOW",
8368 ICON_NONE,
8369 "Overflow",
8370 "Let the text use more space than the specified height"},
8372 "SCALE_TO_FIT",
8373 ICON_NONE,
8374 "Scale To Fit",
8375 "Scale the text size to fit inside the width and height"},
8377 "TRUNCATE",
8378 ICON_NONE,
8379 "Truncate",
8380 "Only output curves that fit within the width and height. Output the remainder to the "
8381 "\"Remainder\" output."},
8382 {0, nullptr, 0, nullptr, nullptr},
8383 };
8384
8385 static const EnumPropertyItem rna_node_geometry_string_to_curves_align_x_items[] = {
8387 "LEFT",
8388 ICON_ALIGN_LEFT,
8389 "Left",
8390 "Align text to the left"},
8392 "CENTER",
8393 ICON_ALIGN_CENTER,
8394 "Center",
8395 "Align text to the center"},
8397 "RIGHT",
8398 ICON_ALIGN_RIGHT,
8399 "Right",
8400 "Align text to the right"},
8402 "JUSTIFY",
8403 ICON_ALIGN_JUSTIFY,
8404 "Justify",
8405 "Align text to the left and the right"},
8407 "FLUSH",
8408 ICON_ALIGN_FLUSH,
8409 "Flush",
8410 "Align text to the left and the right, with equal character spacing"},
8411 {0, nullptr, 0, nullptr, nullptr},
8412 };
8413
8414 static const EnumPropertyItem rna_node_geometry_string_to_curves_align_y_items[] = {
8416 "TOP",
8417 ICON_ALIGN_TOP,
8418 "Top",
8419 "Align text to the top"},
8421 "TOP_BASELINE",
8422 ICON_ALIGN_TOP,
8423 "Top Baseline",
8424 "Align text to the top line's baseline"},
8426 "MIDDLE",
8427 ICON_ALIGN_MIDDLE,
8428 "Middle",
8429 "Align text to the middle"},
8431 "BOTTOM_BASELINE",
8432 ICON_ALIGN_BOTTOM,
8433 "Bottom Baseline",
8434 "Align text to the bottom line's baseline"},
8436 "BOTTOM",
8437 ICON_ALIGN_BOTTOM,
8438 "Bottom",
8439 "Align text to the bottom"},
8440 {0, nullptr, 0, nullptr, nullptr},
8441 };
8442
8443 static const EnumPropertyItem rna_node_geometry_string_to_curves_pivot_mode[] = {
8444 {GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_MIDPOINT, "MIDPOINT", 0, "Midpoint", "Midpoint"},
8445 {GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_TOP_LEFT, "TOP_LEFT", 0, "Top Left", "Top Left"},
8447 "TOP_CENTER",
8448 0,
8449 "Top Center",
8450 "Top Center"},
8451 {GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_TOP_RIGHT, "TOP_RIGHT", 0, "Top Right", "Top Right"},
8453 "BOTTOM_LEFT",
8454 0,
8455 "Bottom Left",
8456 "Bottom Left"},
8458 "BOTTOM_CENTER",
8459 0,
8460 "Bottom Center",
8461 "Bottom Center"},
8463 "BOTTOM_RIGHT",
8464 0,
8465 "Bottom Right",
8466 "Bottom Right"},
8467 {0, nullptr, 0, nullptr, nullptr},
8468 };
8469
8470 PropertyRNA *prop;
8471
8472 prop = RNA_def_property(srna, "font", PROP_POINTER, PROP_NONE);
8473 RNA_def_property_pointer_sdna(prop, nullptr, "id");
8474 RNA_def_property_struct_type(prop, "VectorFont");
8476 prop, "Font", "Font of the text. Falls back to the UI font by default.");
8479 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8480
8481 RNA_def_struct_sdna_from(srna, "NodeGeometryStringToCurves", "storage");
8482
8483 prop = RNA_def_property(srna, "overflow", PROP_ENUM, PROP_NONE);
8484 RNA_def_property_enum_sdna(prop, nullptr, "overflow");
8485 RNA_def_property_enum_items(prop, rna_node_geometry_string_to_curves_overflow_items);
8488 prop, "Textbox Overflow", "Handle the text behavior when it does not fit in the text boxes");
8489 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
8490
8491 prop = RNA_def_property(srna, "align_x", PROP_ENUM, PROP_NONE);
8492 RNA_def_property_enum_sdna(prop, nullptr, "align_x");
8493 RNA_def_property_enum_items(prop, rna_node_geometry_string_to_curves_align_x_items);
8496 "Horizontal Alignment",
8497 "Text horizontal alignment from the object or text box center");
8498 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8499
8500 prop = RNA_def_property(srna, "align_y", PROP_ENUM, PROP_NONE);
8501 RNA_def_property_enum_sdna(prop, nullptr, "align_y");
8502 RNA_def_property_enum_items(prop, rna_node_geometry_string_to_curves_align_y_items);
8505 prop, "Vertical Alignment", "Text vertical alignment from the object center");
8506 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8507
8508 prop = RNA_def_property(srna, "pivot_mode", PROP_ENUM, PROP_NONE);
8509 RNA_def_property_enum_sdna(prop, nullptr, "pivot_mode");
8510 RNA_def_property_enum_items(prop, rna_node_geometry_string_to_curves_pivot_mode);
8512 RNA_def_property_ui_text(prop, "Pivot Point", "Pivot point position relative to character");
8513 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8514}
8515
8517{
8518 PropertyRNA *prop;
8519
8520 StructRNA *srna = RNA_def_struct(brna, "NodeEnumItem", nullptr);
8521 RNA_def_struct_ui_text(srna, "Enum Item", "");
8522
8523 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
8525 prop, nullptr, nullptr, "rna_Node_ItemArray_item_name_set<MenuSwitchItemsAccessor>");
8526 RNA_def_property_ui_text(prop, "Name", "");
8527 RNA_def_struct_name_property(srna, prop);
8529 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<MenuSwitchItemsAccessor>");
8530
8531 prop = RNA_def_property(srna, "description", PROP_STRING, PROP_NONE);
8532 RNA_def_property_string_sdna(prop, nullptr, "description");
8533 RNA_def_property_ui_text(prop, "Description", "");
8535 prop, NC_NODE | NA_EDITED, "rna_Node_ItemArray_item_update<MenuSwitchItemsAccessor>");
8536}
8537
8539{
8540 StructRNA *srna;
8541 PropertyRNA *parm;
8542 FunctionRNA *func;
8543
8544 srna = RNA_def_struct(brna, "NodeMenuSwitchItems", nullptr);
8545 RNA_def_struct_sdna(srna, "bNode");
8547 srna, "Enum Definition Items", "Collection of items that make up an enum");
8548
8549 func = RNA_def_function(srna, "new", "rna_NodeMenuSwitchItems_new");
8550 RNA_def_function_ui_description(func, "Add an a new enum item");
8552 parm = RNA_def_string(func, "name", nullptr, MAX_NAME, "Name", "");
8554 /* return value */
8555 parm = RNA_def_pointer(func, "item", "NodeEnumItem", "Item", "New item");
8556 RNA_def_function_return(func, parm);
8557
8558 rna_def_node_item_array_common_functions(srna, "NodeEnumItem", "MenuSwitchItemsAccessor");
8559}
8560
8562{
8563 PropertyRNA *prop;
8564
8567
8568 RNA_def_struct_sdna_from(srna, "NodeMenuSwitch", "storage");
8569
8570 prop = RNA_def_property(srna, "enum_items", PROP_COLLECTION, PROP_NONE);
8572 prop, nullptr, "enum_definition.items_array", "enum_definition.items_num");
8573 RNA_def_property_struct_type(prop, "NodeEnumItem");
8574 RNA_def_property_ui_text(prop, "Items", "");
8575 RNA_def_property_srna(prop, "NodeMenuSwitchItems");
8576
8577 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
8578 RNA_def_property_int_sdna(prop, nullptr, "enum_definition.active_index");
8579 RNA_def_property_ui_text(prop, "Active Item Index", "Index of the active item");
8581 RNA_def_property_update(prop, NC_NODE, nullptr);
8582
8583 prop = RNA_def_property(srna, "active_item", PROP_POINTER, PROP_NONE);
8584 RNA_def_property_struct_type(prop, "NodeEnumItem");
8586 "rna_Node_ItemArray_active_get<MenuSwitchItemsAccessor>",
8587 "rna_Node_ItemArray_active_set<MenuSwitchItemsAccessor>",
8588 nullptr,
8589 nullptr);
8591 RNA_def_property_ui_text(prop, "Active Item", "Active item");
8592 RNA_def_property_update(prop, NC_NODE, nullptr);
8593
8594 /* This exists only for backward compatibility. */
8595 prop = RNA_def_property(srna, "enum_definition", PROP_POINTER, PROP_NONE);
8596 RNA_def_property_struct_type(prop, "Node");
8598 prop, "rna_NodeMenuSwitch_enum_definition_get", nullptr, nullptr, nullptr);
8601 "Enum Definition (deprecated)",
8602 "The enum definition can now be accessed directly on the node. This "
8603 "exists for backward compatibility.");
8604}
8605
8607{
8608 StructRNA *srna;
8609
8610 srna = RNA_def_struct(brna, "ShaderNode", "NodeInternal");
8611 RNA_def_struct_ui_text(srna, "Shader Node", "Material shader node");
8612 RNA_def_struct_sdna(srna, "bNode");
8613 RNA_def_struct_register_funcs(srna, "rna_ShaderNode_register", "rna_Node_unregister", nullptr);
8614}
8615
8617{
8618 StructRNA *srna;
8619 FunctionRNA *func;
8620
8621 srna = RNA_def_struct(brna, "CompositorNode", "NodeInternal");
8622 RNA_def_struct_ui_text(srna, "Compositor Node", "");
8623 RNA_def_struct_sdna(srna, "bNode");
8625 srna, "rna_CompositorNode_register", "rna_Node_unregister", nullptr);
8626
8627 /* compositor node need_exec flag */
8628 func = RNA_def_function(srna, "tag_need_exec", "rna_CompositorNode_tag_need_exec");
8629 RNA_def_function_ui_description(func, "Tag the node for compositor update");
8630
8632}
8633
8635{
8636 StructRNA *srna;
8637
8638 srna = RNA_def_struct(brna, "TextureNode", "NodeInternal");
8639 RNA_def_struct_ui_text(srna, "Texture Node", "");
8640 RNA_def_struct_sdna(srna, "bNode");
8641 RNA_def_struct_register_funcs(srna, "rna_TextureNode_register", "rna_Node_unregister", nullptr);
8642}
8643
8645{
8646 StructRNA *srna;
8647
8648 srna = RNA_def_struct(brna, "GeometryNode", "NodeInternal");
8649 RNA_def_struct_ui_text(srna, "Geometry Node", "");
8650 RNA_def_struct_sdna(srna, "bNode");
8651 RNA_def_struct_register_funcs(srna, "rna_GeometryNode_register", "rna_Node_unregister", nullptr);
8652}
8653
8655{
8656 StructRNA *srna;
8657
8658 srna = RNA_def_struct(brna, "FunctionNode", "NodeInternal");
8659 RNA_def_struct_ui_text(srna, "Function Node", "");
8660 RNA_def_struct_sdna(srna, "bNode");
8661 RNA_def_struct_register_funcs(srna, "rna_FunctionNode_register", "rna_Node_unregister", nullptr);
8662}
8663
8664/* -------------------------------------------------------------------------- */
8665
8666static void def_reroute(BlenderRNA * /*brna*/, StructRNA *srna)
8667{
8668 RNA_def_struct_sdna_from(srna, "NodeReroute", "storage");
8669
8670 PropertyRNA *prop = RNA_def_property(srna, "socket_idname", PROP_STRING, PROP_NONE);
8671 RNA_def_property_string_sdna(prop, nullptr, "type_idname");
8672 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_reroute_node_socket_type_set");
8673 RNA_def_property_ui_text(prop, "Type of socket", "");
8674 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
8675}
8676
8678{
8679 StructRNA *srna;
8680 PropertyRNA *prop, *parm;
8681 FunctionRNA *func;
8682
8683 srna = RNA_def_struct(brna, "NodeInternalSocketTemplate", nullptr);
8684 RNA_def_struct_ui_text(srna, "Socket Template", "Type and default value of a node socket");
8685
8686 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
8688 "rna_NodeInternalSocketTemplate_name_get",
8689 "rna_NodeInternalSocketTemplate_name_length",
8690 nullptr);
8691 RNA_def_property_ui_text(prop, "Name", "Name of the socket");
8693
8694 prop = RNA_def_property(srna, "identifier", PROP_STRING, PROP_NONE);
8696 "rna_NodeInternalSocketTemplate_identifier_get",
8697 "rna_NodeInternalSocketTemplate_identifier_length",
8698 nullptr);
8699 RNA_def_property_ui_text(prop, "Identifier", "Identifier of the socket");
8701
8702 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
8703 RNA_def_property_enum_funcs(prop, "rna_NodeInternalSocketTemplate_type_get", nullptr, nullptr);
8705 RNA_def_property_ui_text(prop, "Type", "Data type of the socket");
8707
8708 /* XXX Workaround: Registered functions are not exposed in python by bpy,
8709 * it expects them to be registered from python and use the native implementation.
8710 *
8711 * However, the standard node types are not registering these functions from python,
8712 * so in order to call them in py scripts we need to overload and
8713 * replace them with plain C callbacks.
8714 * This type provides a usable basis for node types defined in C.
8715 */
8716
8717 srna = RNA_def_struct(brna, "NodeInternal", "Node");
8718 RNA_def_struct_sdna(srna, "bNode");
8719
8720 /* poll */
8721 func = RNA_def_function(srna, "poll", "rna_NodeInternal_poll");
8723 func, "If non-null output is returned, the node type can be added to the tree");
8725 RNA_def_function_return(func, RNA_def_boolean(func, "visible", false, "", ""));
8726 parm = RNA_def_pointer(func, "node_tree", "NodeTree", "Node Tree", "");
8728
8729 func = RNA_def_function(srna, "poll_instance", "rna_NodeInternal_poll_instance");
8731 func, "If non-null output is returned, the node can be added to the tree");
8732 RNA_def_function_return(func, RNA_def_boolean(func, "visible", false, "", ""));
8733 parm = RNA_def_pointer(func, "node_tree", "NodeTree", "Node Tree", "");
8735
8736 /* update */
8737 func = RNA_def_function(srna, "update", "rna_NodeInternal_update");
8739 func, "Update on node graph topology changes (adding or removing nodes and links)");
8741
8742 /* draw buttons */
8743 func = RNA_def_function(srna, "draw_buttons", "rna_NodeInternal_draw_buttons");
8744 RNA_def_function_ui_description(func, "Draw node buttons");
8746 parm = RNA_def_pointer(func, "context", "Context", "", "");
8748 parm = RNA_def_property(func, "layout", PROP_POINTER, PROP_NONE);
8749 RNA_def_property_struct_type(parm, "UILayout");
8750 RNA_def_property_ui_text(parm, "Layout", "Layout in the UI");
8752
8753 /* draw buttons extended */
8754 func = RNA_def_function(srna, "draw_buttons_ext", "rna_NodeInternal_draw_buttons_ext");
8755 RNA_def_function_ui_description(func, "Draw node buttons in the sidebar");
8757 parm = RNA_def_pointer(func, "context", "Context", "", "");
8759 parm = RNA_def_property(func, "layout", PROP_POINTER, PROP_NONE);
8760 RNA_def_property_struct_type(parm, "UILayout");
8761 RNA_def_property_ui_text(parm, "Layout", "Layout in the UI");
8763}
8764
8765static void rna_def_node_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int in_out)
8766{
8767 StructRNA *srna;
8768 PropertyRNA *parm;
8769 FunctionRNA *func;
8770 const char *structtype = (in_out == SOCK_IN ? "NodeInputs" : "NodeOutputs");
8771 const char *uiname = (in_out == SOCK_IN ? "Node Inputs" : "Node Outputs");
8772 const char *newfunc = (in_out == SOCK_IN ? "rna_Node_inputs_new" : "rna_Node_outputs_new");
8773 const char *clearfunc = (in_out == SOCK_IN ? "rna_Node_inputs_clear" : "rna_Node_outputs_clear");
8774 const char *movefunc = (in_out == SOCK_IN ? "rna_Node_inputs_move" : "rna_Node_outputs_move");
8775
8776 RNA_def_property_srna(cprop, structtype);
8777 srna = RNA_def_struct(brna, structtype, nullptr);
8778 RNA_def_struct_sdna(srna, "bNode");
8779 RNA_def_struct_ui_text(srna, uiname, "Collection of Node Sockets");
8780
8781 func = RNA_def_function(srna, "new", newfunc);
8782 RNA_def_function_ui_description(func, "Add a socket to this node");
8784 parm = RNA_def_string(func, "type", nullptr, MAX_NAME, "Type", "Data type");
8786 parm = RNA_def_string(func, "name", nullptr, MAX_NAME, "Name", "");
8788 RNA_def_string(func, "identifier", nullptr, MAX_NAME, "Identifier", "Unique socket identifier");
8790 func, "use_multi_input", false, "", "Make the socket multi-input (valid for inputs only)");
8791 /* return value */
8792 parm = RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket");
8793 RNA_def_function_return(func, parm);
8794
8795 func = RNA_def_function(srna, "remove", "rna_Node_socket_remove");
8796 RNA_def_function_ui_description(func, "Remove a socket from this node");
8798 parm = RNA_def_pointer(func, "socket", "NodeSocket", "", "The socket to remove");
8800
8801 func = RNA_def_function(srna, "clear", clearfunc);
8802 RNA_def_function_ui_description(func, "Remove all sockets from this node");
8804
8805 func = RNA_def_function(srna, "move", movefunc);
8806 RNA_def_function_ui_description(func, "Move a socket to another position");
8808 parm = RNA_def_int(
8809 func, "from_index", -1, 0, INT_MAX, "From Index", "Index of the socket to move", 0, 10000);
8811 parm = RNA_def_int(
8812 func, "to_index", -1, 0, INT_MAX, "To Index", "Target index for the socket", 0, 10000);
8814}
8815
8816static void rna_def_node(BlenderRNA *brna)
8817{
8818 StructRNA *srna;
8819 PropertyRNA *prop;
8820 FunctionRNA *func;
8821 PropertyRNA *parm;
8822
8823 static const EnumPropertyItem warning_propagation_items[] = {
8824 {NODE_WARNING_PROPAGATION_ALL, "ALL", 0, "All", ""},
8825 {NODE_WARNING_PROPAGATION_NONE, "NONE", 0, "None", ""},
8826 {NODE_WARNING_PROPAGATION_ONLY_ERRORS, "ERRORS", 0, "Errors", ""},
8828 "ERRORS_AND_WARNINGS",
8829 0,
8830 "Errors and Warnings",
8831 ""},
8832 {0, nullptr, 0, nullptr, nullptr},
8833 };
8834
8835 srna = RNA_def_struct(brna, "Node", nullptr);
8836 RNA_def_struct_ui_text(srna, "Node", "Node in a node tree");
8837 RNA_def_struct_sdna(srna, "bNode");
8838 RNA_def_struct_ui_icon(srna, ICON_NODE);
8839 RNA_def_struct_refine_func(srna, "rna_Node_refine");
8840 RNA_def_struct_path_func(srna, "rna_Node_path");
8841 RNA_def_struct_register_funcs(srna, "rna_Node_register", "rna_Node_unregister", nullptr);
8842 RNA_def_struct_idprops_func(srna, "rna_Node_idprops");
8843 RNA_def_struct_system_idprops_func(srna, "rna_Node_system_idprops");
8844
8845 prop = RNA_def_property(srna, "type", PROP_STRING, PROP_NONE);
8846 RNA_def_property_string_funcs(prop, "rna_node_type_get", "rna_node_type_length", nullptr);
8849 prop, "Type", "Legacy unique node type identifier, redundant with bl_idname property");
8850
8851 prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ);
8852 RNA_def_property_array(prop, 2);
8853 RNA_def_property_float_funcs(prop, "rna_Node_location_get", "rna_Node_location_set", nullptr);
8854 RNA_def_property_range(prop, -1000000.0f, 1000000.0f);
8855 RNA_def_property_ui_text(prop, "Location", "Location of the node within its parent frame");
8856 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
8857
8858 prop = RNA_def_property(srna, "location_absolute", PROP_FLOAT, PROP_XYZ);
8859 RNA_def_property_float_sdna(prop, nullptr, "location");
8860 RNA_def_property_array(prop, 2);
8861 RNA_def_property_range(prop, -1000000.0f, 1000000.0f);
8862 RNA_def_property_ui_text(prop, "Absolute Location", "Location of the node in the entire canvas");
8863 RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
8864
8865 prop = RNA_def_property(srna, "width", PROP_FLOAT, PROP_XYZ);
8866 RNA_def_property_float_sdna(prop, nullptr, "width");
8867 RNA_def_property_float_funcs(prop, nullptr, nullptr, "rna_Node_width_range");
8868 RNA_def_property_ui_text(prop, "Width", "Width of the node");
8869 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
8870
8871 prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_XYZ);
8872 RNA_def_property_float_sdna(prop, nullptr, "height");
8873 RNA_def_property_float_funcs(prop, nullptr, nullptr, "rna_Node_height_range");
8874 RNA_def_property_ui_text(prop, "Height", "Height of the node");
8875 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
8876
8877 prop = RNA_def_property(srna, "dimensions", PROP_FLOAT, PROP_XYZ_LENGTH);
8878 RNA_def_property_array(prop, 2);
8879 RNA_def_property_float_funcs(prop, "rna_Node_dimensions_get", nullptr, nullptr);
8880 RNA_def_property_ui_text(prop, "Dimensions", "Absolute bounding box dimensions of the node");
8882
8883 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
8884 RNA_def_property_ui_text(prop, "Name", "Unique node identifier");
8885 RNA_def_struct_name_property(srna, prop);
8886 RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_Node_name_set");
8887 RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
8888
8889 prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
8890 RNA_def_property_string_sdna(prop, nullptr, "label");
8891 RNA_def_property_ui_text(prop, "Label", "Optional custom node label");
8892 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
8893
8894 prop = RNA_def_property(srna, "inputs", PROP_COLLECTION, PROP_NONE);
8895 RNA_def_property_collection_sdna(prop, nullptr, "inputs", nullptr);
8897 nullptr,
8898 nullptr,
8899 nullptr,
8900 nullptr,
8901 nullptr,
8902 nullptr,
8903 "rna_NodeInputs_lookup_string",
8904 nullptr);
8905 RNA_def_property_struct_type(prop, "NodeSocket");
8908 RNA_def_property_ui_text(prop, "Inputs", "");
8909 rna_def_node_sockets_api(brna, prop, SOCK_IN);
8910
8911 prop = RNA_def_property(srna, "outputs", PROP_COLLECTION, PROP_NONE);
8912 RNA_def_property_collection_sdna(prop, nullptr, "outputs", nullptr);
8914 nullptr,
8915 nullptr,
8916 nullptr,
8917 nullptr,
8918 nullptr,
8919 nullptr,
8920 "rna_NodeOutputs_lookup_string",
8921 nullptr);
8922 RNA_def_property_struct_type(prop, "NodeSocket");
8925 RNA_def_property_ui_text(prop, "Outputs", "");
8927
8928 prop = RNA_def_property(srna, "internal_links", PROP_COLLECTION, PROP_NONE);
8930 "rna_Node_internal_links_begin",
8931 "rna_iterator_array_next",
8932 "rna_iterator_array_end",
8933 "rna_iterator_array_get",
8934 nullptr,
8935 nullptr,
8936 nullptr,
8937 nullptr);
8938 RNA_def_property_struct_type(prop, "NodeLink");
8940 prop, "Internal Links", "Internal input-to-output connections for muting");
8941
8942 prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
8943 RNA_def_property_pointer_sdna(prop, nullptr, "parent");
8945 prop, nullptr, "rna_Node_parent_set", nullptr, "rna_Node_parent_poll");
8949 RNA_def_property_struct_type(prop, "Node");
8950 RNA_def_property_ui_text(prop, "Parent", "Parent this node is attached to");
8951
8952 prop = RNA_def_property(srna, "warning_propagation", PROP_ENUM, PROP_NONE);
8953 RNA_def_property_enum_items(prop, warning_propagation_items);
8955 prop,
8956 "Warning Propagation",
8957 "The kinds of messages that should be propagated from this node to the parent group node");
8958 RNA_def_property_update(prop, 0, "rna_Node_update");
8959
8960 prop = RNA_def_property(srna, "use_custom_color", PROP_BOOLEAN, PROP_NONE);
8961 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_CUSTOM_COLOR);
8963 RNA_def_property_ui_text(prop, "Custom Color", "Use custom color for the node");
8964 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
8965
8966 prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
8967 RNA_def_property_array(prop, 3);
8968 RNA_def_property_range(prop, 0.0f, 1.0f);
8969 RNA_def_property_ui_text(prop, "Color", "Custom color of the node body");
8970 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
8971
8972 prop = RNA_def_property(srna, "color_tag", PROP_ENUM, PROP_NONE);
8974 RNA_def_property_enum_funcs(prop, "rna_Node_color_tag_get", nullptr, nullptr);
8975 RNA_def_property_ui_text(prop, "Color Tag", "Node header color tag");
8977
8978 prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
8979 RNA_def_property_boolean_sdna(prop, nullptr, "flag", SELECT);
8980 RNA_def_property_boolean_funcs(prop, nullptr, "rna_Node_select_set");
8981 RNA_def_property_ui_text(prop, "Select", "Node selection state");
8983
8984 prop = RNA_def_property(srna, "show_options", PROP_BOOLEAN, PROP_NONE);
8985 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_OPTIONS);
8986 RNA_def_property_ui_text(prop, "Show Options", "");
8987 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
8988
8989 prop = RNA_def_property(srna, "show_preview", PROP_BOOLEAN, PROP_NONE);
8990 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_PREVIEW);
8991 RNA_def_property_ui_text(prop, "Show Preview", "");
8992 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
8993
8994 prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
8995 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_COLLAPSED);
8996 RNA_def_property_ui_text(prop, "Collapse", "");
8997 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, nullptr);
8998
8999 prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
9000 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_MUTED);
9001 RNA_def_property_boolean_funcs(prop, nullptr, "rna_Node_mute_set");
9003 RNA_def_property_ui_text(prop, "Mute", "");
9004 RNA_def_property_update(prop, 0, "rna_Node_update");
9005
9006 prop = RNA_def_property(srna, "show_texture", PROP_BOOLEAN, PROP_NONE);
9007 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_ACTIVE_TEXTURE);
9008 RNA_def_property_ui_text(prop, "Show Texture", "Display node in viewport textured shading mode");
9009 RNA_def_property_update(prop, 0, "rna_Node_update");
9010
9011 /* generic property update function */
9012 func = RNA_def_function(srna, "socket_value_update", "rna_Node_socket_value_update");
9013 RNA_def_function_ui_description(func, "Update after property changes");
9015 parm = RNA_def_pointer(func, "context", "Context", "", "");
9017
9018 func = RNA_def_function(srna, "is_registered_node_type", "rna_Node_is_registered_node_type");
9019 RNA_def_function_ui_description(func, "True if a registered node type");
9021 parm = RNA_def_boolean(func, "result", false, "Result", "");
9022 RNA_def_function_return(func, parm);
9023
9024 /* registration */
9025 prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
9027 prop, "rna_Node_bl_idname_get", "rna_Node_bl_idname_length", "rna_Node_bl_idname_set");
9029 RNA_def_property_ui_text(prop, "ID Name", "");
9030
9031 prop = RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
9033 prop, "rna_Node_bl_label_get", "rna_Node_bl_label_length", "rna_Node_bl_label_set");
9035 RNA_def_property_ui_text(prop, "Label", "The node label");
9036
9037 prop = RNA_def_property(srna, "bl_description", PROP_STRING, PROP_TRANSLATION);
9039 "rna_Node_bl_description_get",
9040 "rna_Node_bl_description_length",
9041 "rna_Node_bl_description_set");
9043
9044 prop = RNA_def_property(srna, "bl_icon", PROP_ENUM, PROP_NONE);
9045 RNA_def_property_enum_sdna(prop, nullptr, "typeinfo->ui_icon");
9047 RNA_def_property_enum_default(prop, ICON_NODE);
9049 RNA_def_property_ui_text(prop, "Icon", "The node icon");
9050
9051 prop = RNA_def_property(srna, "bl_static_type", PROP_STRING, PROP_NONE);
9052 RNA_def_property_string_funcs(prop, "rna_node_type_get", "rna_node_type_length", nullptr);
9055 prop,
9056 "Static Type",
9057 "Legacy unique node type identifier, redundant with bl_idname property");
9058
9059 /* type-based size properties */
9060 prop = RNA_def_property(srna, "bl_width_default", PROP_FLOAT, PROP_UNSIGNED);
9061 RNA_def_property_float_sdna(prop, nullptr, "typeinfo->width");
9063
9064 prop = RNA_def_property(srna, "bl_width_min", PROP_FLOAT, PROP_UNSIGNED);
9065 RNA_def_property_float_sdna(prop, nullptr, "typeinfo->minwidth");
9067
9068 prop = RNA_def_property(srna, "bl_width_max", PROP_FLOAT, PROP_UNSIGNED);
9069 RNA_def_property_float_sdna(prop, nullptr, "typeinfo->maxwidth");
9071
9072 prop = RNA_def_property(srna, "bl_height_default", PROP_FLOAT, PROP_UNSIGNED);
9073 RNA_def_property_float_sdna(prop, nullptr, "typeinfo->height");
9075
9076 prop = RNA_def_property(srna, "bl_height_min", PROP_FLOAT, PROP_UNSIGNED);
9077 RNA_def_property_float_sdna(prop, nullptr, "typeinfo->minheight");
9079
9080 prop = RNA_def_property(srna, "bl_height_max", PROP_FLOAT, PROP_UNSIGNED);
9081 RNA_def_property_float_sdna(prop, nullptr, "typeinfo->minheight");
9083
9084 /* poll */
9085 func = RNA_def_function(srna, "poll", nullptr);
9087 func, "If non-null output is returned, the node type can be added to the tree");
9089 RNA_def_function_return(func, RNA_def_boolean(func, "visible", false, "", ""));
9090 parm = RNA_def_pointer(func, "node_tree", "NodeTree", "Node Tree", "");
9092
9093 func = RNA_def_function(srna, "poll_instance", nullptr);
9095 func, "If non-null output is returned, the node can be added to the tree");
9097 RNA_def_function_return(func, RNA_def_boolean(func, "visible", false, "", ""));
9098 parm = RNA_def_pointer(func, "node_tree", "NodeTree", "Node Tree", "");
9100
9101 /* update */
9102 func = RNA_def_function(srna, "update", nullptr);
9104 func, "Update on node graph topology changes (adding or removing nodes and links)");
9106
9107 /* insert_link */
9108 func = RNA_def_function(srna, "insert_link", nullptr);
9109 RNA_def_function_ui_description(func, "Handle creation of a link to or from the node");
9111 parm = RNA_def_pointer(func, "link", "NodeLink", "Link", "Node link that will be inserted");
9113
9114 /* init */
9115 func = RNA_def_function(srna, "init", nullptr);
9116 RNA_def_function_ui_description(func, "Initialize a new instance of this node");
9118 parm = RNA_def_pointer(func, "context", "Context", "", "");
9120
9121 /* copy */
9122 func = RNA_def_function(srna, "copy", nullptr);
9124 "Initialize a new instance of this node from an existing node");
9126 parm = RNA_def_pointer(func, "node", "Node", "Node", "Existing node to copy");
9128
9129 /* free */
9130 func = RNA_def_function(srna, "free", nullptr);
9131 RNA_def_function_ui_description(func, "Clean up node on removal");
9133
9134 /* draw buttons */
9135 func = RNA_def_function(srna, "draw_buttons", nullptr);
9136 RNA_def_function_ui_description(func, "Draw node buttons");
9138 parm = RNA_def_pointer(func, "context", "Context", "", "");
9140 parm = RNA_def_property(func, "layout", PROP_POINTER, PROP_NONE);
9141 RNA_def_property_struct_type(parm, "UILayout");
9142 RNA_def_property_ui_text(parm, "Layout", "Layout in the UI");
9144
9145 /* draw buttons extended */
9146 func = RNA_def_function(srna, "draw_buttons_ext", nullptr);
9147 RNA_def_function_ui_description(func, "Draw node buttons in the sidebar");
9149 parm = RNA_def_pointer(func, "context", "Context", "", "");
9151 parm = RNA_def_property(func, "layout", PROP_POINTER, PROP_NONE);
9152 RNA_def_property_struct_type(parm, "UILayout");
9153 RNA_def_property_ui_text(parm, "Layout", "Layout in the UI");
9155
9156 /* dynamic label */
9157 func = RNA_def_function(srna, "draw_label", nullptr);
9158 RNA_def_function_ui_description(func, "Returns a dynamic label string");
9160 parm = RNA_def_string(func, "label", nullptr, MAX_NAME, "Label", "");
9162 parm, PROP_THICK_WRAP, ParameterFlag(0)); /* needed for string return value */
9163 RNA_def_function_output(func, parm);
9164
9165 func = RNA_def_function(srna,
9166 "debug_zone_body_lazy_function_graph",
9167 "rna_NodeTree_debug_zone_body_lazy_function_graph");
9169 func, "Get the internal lazy-function graph for the body of this zone");
9171 parm = RNA_def_string(func, "dot_graph", nullptr, INT32_MAX, "Dot Graph", "Graph in dot format");
9174 RNA_def_function_output(func, parm);
9175
9176 func = RNA_def_function(
9177 srna, "debug_zone_lazy_function_graph", "rna_NodeTree_debug_zone_lazy_function_graph");
9178 RNA_def_function_ui_description(func, "Get the internal lazy-function graph for this zone");
9180 parm = RNA_def_string(func, "dot_graph", nullptr, INT32_MAX, "Dot Graph", "Graph in dot format");
9183 RNA_def_function_output(func, parm);
9184}
9185
9187{
9188 StructRNA *srna;
9189 PropertyRNA *prop;
9190 FunctionRNA *func;
9191 PropertyRNA *parm;
9192
9193 srna = RNA_def_struct(brna, "NodeLink", nullptr);
9194 RNA_def_struct_ui_text(srna, "NodeLink", "Link between nodes in a node tree");
9195 RNA_def_struct_sdna(srna, "bNodeLink");
9196 RNA_def_struct_ui_icon(srna, ICON_NODE);
9197
9198 prop = RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
9199 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_LINK_VALID);
9200 RNA_def_property_ui_text(prop, "Valid", "Link is valid");
9201 RNA_def_property_update(prop, NC_NODE | NA_EDITED, nullptr);
9202
9203 prop = RNA_def_property(srna, "is_muted", PROP_BOOLEAN, PROP_NONE);
9204 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NODE_LINK_MUTED);
9205 RNA_def_property_ui_text(prop, "Muted", "Link is muted and can be ignored");
9206 RNA_def_property_update(prop, NC_NODE | NA_EDITED, nullptr);
9207
9208 prop = RNA_def_property(srna, "from_node", PROP_POINTER, PROP_NONE);
9209 RNA_def_property_pointer_sdna(prop, nullptr, "fromnode");
9210 RNA_def_property_struct_type(prop, "Node");
9214 RNA_def_property_ui_text(prop, "From node", "");
9215
9216 prop = RNA_def_property(srna, "to_node", PROP_POINTER, PROP_NONE);
9217 RNA_def_property_pointer_sdna(prop, nullptr, "tonode");
9218 RNA_def_property_struct_type(prop, "Node");
9222 RNA_def_property_ui_text(prop, "To node", "");
9223
9224 prop = RNA_def_property(srna, "from_socket", PROP_POINTER, PROP_NONE);
9225 RNA_def_property_pointer_sdna(prop, nullptr, "fromsock");
9226 RNA_def_property_struct_type(prop, "NodeSocket");
9230 RNA_def_property_ui_text(prop, "From socket", "");
9231
9232 prop = RNA_def_property(srna, "to_socket", PROP_POINTER, PROP_NONE);
9233 RNA_def_property_pointer_sdna(prop, nullptr, "tosock");
9234 RNA_def_property_struct_type(prop, "NodeSocket");
9238 RNA_def_property_ui_text(prop, "To socket", "");
9239
9240 prop = RNA_def_property(srna, "is_hidden", PROP_BOOLEAN, PROP_NONE);
9241 RNA_def_property_boolean_funcs(prop, "rna_NodeLink_is_hidden_get", nullptr);
9245 RNA_def_property_ui_text(prop, "Is Hidden", "Link is hidden due to invisible sockets");
9246
9247 prop = RNA_def_property(srna, "multi_input_sort_id", PROP_INT, PROP_UNSIGNED);
9250 prop,
9251 "Multi Input Sort ID",
9252 "Used to sort multiple links coming into the same input. The highest ID is at the top.");
9253
9254 func = RNA_def_function(
9255 srna, "swap_multi_input_sort_id", "rna_NodeLink_swap_multi_input_sort_id");
9257 func, "Swap the order of two links connected to the same multi-input socket");
9259 parm = RNA_def_pointer(func,
9260 "other",
9261 "NodeLink",
9262 "Other",
9263 "The other link. Must link to the same multi-input socket.");
9265}
9266
9268{
9269 StructRNA *srna;
9270 PropertyRNA *parm, *prop;
9271 FunctionRNA *func;
9272
9273 RNA_def_property_srna(cprop, "Nodes");
9274 srna = RNA_def_struct(brna, "Nodes", nullptr);
9275 RNA_def_struct_sdna(srna, "bNodeTree");
9276 RNA_def_struct_ui_text(srna, "Nodes", "Collection of Nodes");
9277
9278 func = RNA_def_function(srna, "new", "rna_NodeTree_node_new");
9279 RNA_def_function_ui_description(func, "Add a node to this node tree");
9281 /* XXX warning note should eventually be removed,
9282 * added this here to avoid frequent confusion with API changes from "type" to "bl_idname"
9283 */
9284 parm = RNA_def_string(
9285 func,
9286 "type",
9287 nullptr,
9288 MAX_NAME,
9289 "Type",
9290 "Type of node to add (Warning: should be same as node.bl_idname, not node.type!)");
9292 /* return value */
9293 parm = RNA_def_pointer(func, "node", "Node", "", "New node");
9294 RNA_def_function_return(func, parm);
9295
9296 func = RNA_def_function(srna, "remove", "rna_NodeTree_node_remove");
9297 RNA_def_function_ui_description(func, "Remove a node from this node tree");
9299 parm = RNA_def_pointer(func, "node", "Node", "", "The node to remove");
9302
9303 func = RNA_def_function(srna, "clear", "rna_NodeTree_node_clear");
9304 RNA_def_function_ui_description(func, "Remove all nodes from this node tree");
9306
9307 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
9308 RNA_def_property_struct_type(prop, "Node");
9310 prop, "rna_NodeTree_active_node_get", "rna_NodeTree_active_node_set", nullptr, nullptr);
9312 RNA_def_property_ui_text(prop, "Active Node", "Active node in this tree");
9313 RNA_def_property_update(prop, NC_SCENE | ND_OB_ACTIVE, "rna_NodeTree_update");
9314}
9315
9317{
9318 StructRNA *srna;
9319 PropertyRNA *parm;
9320 FunctionRNA *func;
9321
9322 RNA_def_property_srna(cprop, "NodeLinks");
9323 srna = RNA_def_struct(brna, "NodeLinks", nullptr);
9324 RNA_def_struct_sdna(srna, "bNodeTree");
9325 RNA_def_struct_ui_text(srna, "Node Links", "Collection of Node Links");
9326
9327 func = RNA_def_function(srna, "new", "rna_NodeTree_link_new");
9328 RNA_def_function_ui_description(func, "Add a node link to this node tree");
9330 parm = RNA_def_pointer(func, "input", "NodeSocket", "", "The input socket");
9332 parm = RNA_def_pointer(func, "output", "NodeSocket", "", "The output socket");
9334 RNA_def_boolean(func,
9335 "verify_limits",
9336 true,
9337 "Verify Limits",
9338 "Remove existing links if connection limit is exceeded");
9339 RNA_def_boolean(func,
9340 "handle_dynamic_sockets",
9341 false,
9342 "Handle Dynamic Sockets",
9343 "Handle node specific features like virtual sockets");
9344 /* return */
9345 parm = RNA_def_pointer(func, "link", "NodeLink", "", "New node link");
9346 RNA_def_function_return(func, parm);
9347
9348 func = RNA_def_function(srna, "remove", "rna_NodeTree_link_remove");
9349 RNA_def_function_ui_description(func, "remove a node link from the node tree");
9351 parm = RNA_def_pointer(func, "link", "NodeLink", "", "The node link to remove");
9354
9355 func = RNA_def_function(srna, "clear", "rna_NodeTree_link_clear");
9356 RNA_def_function_ui_description(func, "remove all node links from the node tree");
9358}
9359
9361{
9362 StructRNA *srna;
9363 PropertyRNA *prop;
9364 FunctionRNA *func;
9365 PropertyRNA *parm;
9366
9367 static const EnumPropertyItem static_type_items[] = {
9369 "UNDEFINED",
9370 ICON_QUESTION,
9371 "Undefined",
9372 "Undefined type of nodes (can happen e.g. when a linked node tree goes missing)"},
9373 {NTREE_CUSTOM, "CUSTOM", ICON_NONE, "Custom", "Custom nodes"},
9374 {NTREE_SHADER, "SHADER", ICON_MATERIAL, "Shader", "Shader nodes"},
9375 {NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture nodes"},
9376 {NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, "Compositing", "Compositing nodes"},
9377 {NTREE_GEOMETRY, "GEOMETRY", ICON_GEOMETRY_NODES, "Geometry", "Geometry nodes"},
9378 {0, nullptr, 0, nullptr, nullptr},
9379 };
9380
9381 srna = RNA_def_struct(brna, "NodeTree", "ID");
9383 srna,
9384 "Node Tree",
9385 "Node tree consisting of linked nodes used for shading, textures and compositing");
9386 RNA_def_struct_sdna(srna, "bNodeTree");
9387 RNA_def_struct_ui_icon(srna, ICON_NODETREE);
9388 RNA_def_struct_refine_func(srna, "rna_NodeTree_refine");
9389 RNA_def_struct_register_funcs(srna, "rna_NodeTree_register", "rna_NodeTree_unregister", nullptr);
9390
9391 prop = RNA_def_property(srna, "color_tag", PROP_ENUM, PROP_NONE);
9393 RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_NodeTree_color_tag_itemf");
9395 prop, "Color Tag", "Color tag of the node group which influences the header color");
9396 RNA_def_property_update(prop, NC_NODE, nullptr);
9397
9398 prop = RNA_def_property(srna, "default_group_node_width", PROP_INT, PROP_NONE);
9402 prop, "Default Group Node Width", "The width for newly created group nodes");
9403 RNA_def_property_update(prop, NC_NODE, nullptr);
9404
9405 prop = RNA_def_property(srna, "view_center", PROP_FLOAT, PROP_XYZ);
9406 RNA_def_property_array(prop, 2);
9407 RNA_def_property_float_sdna(prop, nullptr, "view_center");
9409 prop, "", "The current location (offset) of the view for this Node Tree");
9411
9412 prop = RNA_def_property(srna, "description", PROP_STRING, PROP_NONE);
9413 RNA_def_property_ui_text(prop, "Description", "Description of the node tree");
9414
9415 /* AnimData */
9417
9418 /* Nodes Collection */
9419 prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
9420 RNA_def_property_collection_sdna(prop, nullptr, "nodes", nullptr);
9421 RNA_def_property_struct_type(prop, "Node");
9423 RNA_def_property_ui_text(prop, "Nodes", "");
9424 rna_def_nodetree_nodes_api(brna, prop);
9425
9426 /* NodeLinks Collection */
9427 prop = RNA_def_property(srna, "links", PROP_COLLECTION, PROP_NONE);
9428 RNA_def_property_collection_sdna(prop, nullptr, "links", nullptr);
9429 RNA_def_property_struct_type(prop, "NodeLink");
9430 RNA_def_property_ui_text(prop, "Links", "");
9431 rna_def_nodetree_link_api(brna, prop);
9432
9433 /* Annotation */
9434 prop = RNA_def_property(srna, "annotation", PROP_POINTER, PROP_NONE);
9435 RNA_def_property_pointer_sdna(prop, nullptr, "gpd");
9436 RNA_def_property_struct_type(prop, "Annotation");
9438 prop, nullptr, nullptr, nullptr, "rna_GPencil_datablocks_annotations_poll");
9441 RNA_def_property_ui_text(prop, "Annotation", "Annotation data");
9442 RNA_def_property_update(prop, NC_NODE, nullptr);
9443
9444 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
9446 RNA_def_property_enum_items(prop, static_type_items);
9448 prop,
9449 "Type",
9450 "Node Tree type (deprecated, bl_idname is the actual node tree type identifier)");
9451
9452 prop = RNA_def_property(srna, "interface", PROP_POINTER, PROP_NONE);
9453 RNA_def_property_pointer_sdna(prop, nullptr, "tree_interface");
9454 RNA_def_property_struct_type(prop, "NodeTreeInterface");
9456 RNA_def_property_ui_text(prop, "Interface", "Interface declaration for this node tree");
9457 /* exposed as a function for runtime interface type properties */
9458 func = RNA_def_function(srna, "interface_update", "rna_NodeTree_interface_update");
9459 RNA_def_function_ui_description(func, "Updated node group interface");
9460 parm = RNA_def_pointer(func, "context", "Context", "", "");
9462
9463 func = RNA_def_function(srna, "contains_tree", "rna_NodeTree_contains_tree");
9465 func,
9466 "Check if the node tree contains another. Used to avoid creating recursive node groups.");
9467 parm = RNA_def_pointer(
9468 func, "sub_tree", "NodeTree", "Node Tree", "Node tree for recursive check");
9470 parm = RNA_def_property(func, "contained", PROP_BOOLEAN, PROP_NONE);
9471 RNA_def_function_return(func, parm);
9472
9473 /* registration */
9474 prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
9476 "rna_NodeTree_bl_idname_get",
9477 "rna_NodeTree_bl_idname_length",
9478 "rna_NodeTree_bl_idname_set");
9480 RNA_def_property_ui_text(prop, "ID Name", "");
9481
9482 prop = RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
9484 "rna_NodeTree_bl_label_get",
9485 "rna_NodeTree_bl_label_length",
9486 "rna_NodeTree_bl_label_set");
9488 RNA_def_property_ui_text(prop, "Label", "The node tree label");
9489
9490 prop = RNA_def_property(srna, "bl_description", PROP_STRING, PROP_TRANSLATION);
9492 "rna_NodeTree_bl_description_get",
9493 "rna_NodeTree_bl_description_length",
9494 "rna_NodeTree_bl_description_set");
9496
9497 prop = RNA_def_property(srna, "bl_icon", PROP_ENUM, PROP_NONE);
9498 RNA_def_property_enum_sdna(prop, nullptr, "typeinfo->ui_icon");
9500 RNA_def_property_enum_default(prop, ICON_NODETREE);
9502 RNA_def_property_ui_text(prop, "Icon", "The node tree icon");
9503
9504 prop = RNA_def_property(srna, "bl_use_group_interface", PROP_BOOLEAN, PROP_NONE);
9505 RNA_def_property_boolean_negative_sdna(prop, nullptr, "typeinfo->no_group_interface", 1);
9509 "Use Group Interface",
9510 "Determines the visibility of some UI elements related to node groups");
9511
9512 /* poll */
9513 func = RNA_def_function(srna, "poll", nullptr);
9514 RNA_def_function_ui_description(func, "Check visibility in the editor");
9516 parm = RNA_def_pointer(func, "context", "Context", "", "");
9518 RNA_def_function_return(func, RNA_def_boolean(func, "visible", false, "", ""));
9519
9520 /* update */
9521 func = RNA_def_function(srna, "update", nullptr);
9522 RNA_def_function_ui_description(func, "Update on editor changes");
9524
9525 /* get a node tree from context */
9526 func = RNA_def_function(srna, "get_from_context", nullptr);
9527 RNA_def_function_ui_description(func, "Get a node tree from the context");
9529 parm = RNA_def_pointer(func, "context", "Context", "", "");
9531 parm = RNA_def_pointer(
9532 func, "result_1", "NodeTree", "Node Tree", "Active node tree from context");
9533 RNA_def_function_output(func, parm);
9534 parm = RNA_def_pointer(
9535 func, "result_2", "ID", "Owner ID", "ID data-block that owns the node tree");
9536 RNA_def_function_output(func, parm);
9537 parm = RNA_def_pointer(
9538 func, "result_3", "ID", "From ID", "Original ID data-block selected from the context");
9539 RNA_def_function_output(func, parm);
9540
9541 /* Check for support of a socket type with a type identifier. */
9542 func = RNA_def_function(srna, "valid_socket_type", nullptr);
9543 RNA_def_function_ui_description(func, "Check if the socket type is valid for the node tree");
9545 parm = RNA_def_string(
9546 func, "idname", "NodeSocket", MAX_NAME, "Socket Type", "Identifier of the socket type");
9548 RNA_def_function_return(func, RNA_def_boolean(func, "valid", false, "", ""));
9549
9550 func = RNA_def_function(
9551 srna, "debug_lazy_function_graph", "rna_NodeTree_debug_lazy_function_graph");
9552 RNA_def_function_ui_description(func, "Get the internal lazy-function graph for this node tree");
9554 parm = RNA_def_string(func, "dot_graph", nullptr, INT32_MAX, "Dot Graph", "Graph in dot format");
9557 RNA_def_function_output(func, parm);
9558}
9559
9561{
9562 StructRNA *srna;
9563 PropertyRNA *prop;
9564
9565 srna = RNA_def_struct(brna, "CompositorNodeTree", "NodeTree");
9567 srna, "Compositor Node Tree", "Node tree consisting of linked nodes used for compositing");
9568 RNA_def_struct_sdna(srna, "bNodeTree");
9569 RNA_def_struct_ui_icon(srna, ICON_RENDERLAYERS);
9570
9571 prop = RNA_def_property(srna, "use_viewer_border", PROP_BOOLEAN, PROP_NONE);
9572 RNA_def_property_boolean_sdna(prop, nullptr, "flag", NTREE_VIEWER_BORDER);
9574 prop, "Viewer Region", "Use boundaries for viewer nodes and composite backdrop");
9575 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update");
9576}
9577
9579{
9580 StructRNA *srna;
9581 FunctionRNA *func;
9582 PropertyRNA *parm;
9583
9584 srna = RNA_def_struct(brna, "ShaderNodeTree", "NodeTree");
9586 srna,
9587 "Shader Node Tree",
9588 "Node tree consisting of linked nodes used for materials (and other shading data-blocks)");
9589 RNA_def_struct_sdna(srna, "bNodeTree");
9590 RNA_def_struct_ui_icon(srna, ICON_MATERIAL);
9591
9592 func = RNA_def_function(srna, "get_output_node", "ntreeShaderOutputNode");
9594 "Return active shader output node for the specified target");
9595 parm = RNA_def_enum(
9596 func, "target", prop_shader_output_target_items, SHD_OUTPUT_ALL, "Target", "");
9598 parm = RNA_def_pointer(func, "node", "ShaderNode", "Node", "");
9599 RNA_def_function_return(func, parm);
9600}
9601
9603{
9604 StructRNA *srna;
9605
9606 srna = RNA_def_struct(brna, "TextureNodeTree", "NodeTree");
9608 srna, "Texture Node Tree", "Node tree consisting of linked nodes used for textures");
9609 RNA_def_struct_sdna(srna, "bNodeTree");
9610 RNA_def_struct_ui_icon(srna, ICON_TEXTURE);
9611}
9612
9614{
9615 StructRNA *srna;
9616 PropertyRNA *prop;
9617
9618 srna = RNA_def_struct(brna, "GeometryNodeTree", "NodeTree");
9620 srna, "Geometry Node Tree", "Node tree consisting of linked nodes used for geometries");
9621 RNA_def_struct_sdna(srna, "bNodeTree");
9622 RNA_def_struct_ui_icon(srna, ICON_NODETREE);
9623
9624 prop = RNA_def_property(srna, "is_tool", PROP_BOOLEAN, PROP_NONE);
9626 RNA_def_property_ui_text(prop, "Tool", "The node group is used as a tool");
9628 prop, "rna_GeometryNodeTree_is_tool_get", "rna_GeometryNodeTree_is_tool_set");
9629 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9630
9631 prop = RNA_def_property(srna, "is_modifier", PROP_BOOLEAN, PROP_NONE);
9633 RNA_def_property_ui_text(prop, "Modifier", "The node group is used as a geometry modifier");
9635 prop, "rna_GeometryNodeTree_is_modifier_get", "rna_GeometryNodeTree_is_modifier_set");
9636 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9637
9638 prop = RNA_def_property(srna, "is_mode_object", PROP_BOOLEAN, PROP_NONE);
9640 RNA_def_property_ui_text(prop, "Edit", "The node group is used in object mode");
9642 prop, "rna_GeometryNodeTree_is_mode_object_get", "rna_GeometryNodeTree_is_mode_object_set");
9643 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9644
9645 prop = RNA_def_property(srna, "is_mode_edit", PROP_BOOLEAN, PROP_NONE);
9647 RNA_def_property_ui_text(prop, "Edit", "The node group is used in edit mode");
9649 prop, "rna_GeometryNodeTree_is_mode_edit_get", "rna_GeometryNodeTree_is_mode_edit_set");
9650 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9651
9652 prop = RNA_def_property(srna, "is_mode_sculpt", PROP_BOOLEAN, PROP_NONE);
9654 RNA_def_property_ui_text(prop, "Sculpt", "The node group is used in sculpt mode");
9656 prop, "rna_GeometryNodeTree_is_mode_sculpt_get", "rna_GeometryNodeTree_is_mode_sculpt_set");
9657 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9658
9659 prop = RNA_def_property(srna, "is_mode_paint", PROP_BOOLEAN, PROP_NONE);
9661 RNA_def_property_ui_text(prop, "Paint", "The node group is used in paint mode");
9663 prop, "rna_GeometryNodeTree_is_mode_paint_get", "rna_GeometryNodeTree_is_mode_paint_set");
9664 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9665
9666 prop = RNA_def_property(srna, "is_type_mesh", PROP_BOOLEAN, PROP_NONE);
9668 RNA_def_property_ui_text(prop, "Mesh", "The node group is used for meshes");
9670 prop, "rna_GeometryNodeTree_is_type_mesh_get", "rna_GeometryNodeTree_is_type_mesh_set");
9671 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9672
9673 prop = RNA_def_property(srna, "is_type_curve", PROP_BOOLEAN, PROP_NONE);
9675 RNA_def_property_ui_text(prop, "Curves", "The node group is used for curves");
9677 prop, "rna_GeometryNodeTree_is_type_curve_get", "rna_GeometryNodeTree_is_type_curve_set");
9678 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9679
9680 prop = RNA_def_property(srna, "is_type_pointcloud", PROP_BOOLEAN, PROP_NONE);
9682 RNA_def_property_ui_text(prop, "Point Cloud", "The node group is used for point clouds");
9684 "rna_GeometryNodeTree_is_type_pointcloud_get",
9685 "rna_GeometryNodeTree_is_type_pointcloud_set");
9686 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9687
9688 prop = RNA_def_property(srna, "use_wait_for_click", PROP_BOOLEAN, PROP_NONE);
9691 "Wait for Click",
9692 "Wait for mouse click input before running the operator from a menu");
9694 "rna_GeometryNodeTree_use_wait_for_click_get",
9695 "rna_GeometryNodeTree_use_wait_for_click_set");
9696 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9697
9698 prop = RNA_def_property(srna, "is_type_grease_pencil", PROP_BOOLEAN, PROP_NONE);
9700 RNA_def_property_ui_text(prop, "Grease Pencil", "The node group is used for Grease Pencil");
9702 "rna_GeometryNodeTree_is_type_grease_pencil_get",
9703 "rna_GeometryNodeTree_is_type_grease_pencil_set");
9704 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update_asset");
9705
9706 prop = RNA_def_property(srna, "show_modifier_manage_panel", PROP_BOOLEAN, PROP_NONE);
9708 "rna_GeometryNodeTree_modifier_manage_panel_get",
9709 "rna_GeometryNodeTree_modifier_manage_panel_set");
9710 RNA_def_property_boolean_negative_sdna(prop, nullptr, "flag", 0);
9713 prop,
9714 "Show Manage Panel",
9715 "Turn on the option to display the manage panel when creating a modifier");
9716 RNA_def_property_update(prop, NC_NODE | ND_DISPLAY, "rna_NodeTree_update");
9717}
9718
9720 const char *struct_name,
9721 const char *base_name)
9722{
9723 StructRNA *srna;
9724 FunctionRNA *func;
9725 PropertyRNA *parm;
9726
9727 srna = RNA_def_struct(brna, struct_name, base_name);
9728 RNA_def_struct_sdna(srna, "bNode");
9729
9730 func = RNA_def_function(srna, "is_registered_node_type", "rna_Node_is_registered_node_type");
9731 RNA_def_function_ui_description(func, "True if a registered node type");
9733 parm = RNA_def_boolean(func, "result", false, "Result", "");
9734 RNA_def_function_return(func, parm);
9735
9736 /* Exposes the socket template type lists in RNA for use in scripts
9737 * Only used in the C nodes and not exposed in the base class to
9738 * keep the namespace clean for py-nodes. */
9739 func = RNA_def_function(srna, "input_template", "rna_NodeInternal_input_template");
9740 RNA_def_function_ui_description(func, "Input socket template");
9742 parm = RNA_def_property(func, "index", PROP_INT, PROP_UNSIGNED);
9743 RNA_def_property_ui_text(parm, "Index", "");
9745 parm = RNA_def_property(func, "result", PROP_POINTER, PROP_NONE);
9746 RNA_def_property_struct_type(parm, "NodeInternalSocketTemplate");
9748 RNA_def_function_return(func, parm);
9749
9750 func = RNA_def_function(srna, "output_template", "rna_NodeInternal_output_template");
9751 RNA_def_function_ui_description(func, "Output socket template");
9753 parm = RNA_def_property(func, "index", PROP_INT, PROP_UNSIGNED);
9754 RNA_def_property_ui_text(parm, "Index", "");
9756 parm = RNA_def_property(func, "result", PROP_POINTER, PROP_NONE);
9757 RNA_def_property_struct_type(parm, "NodeInternalSocketTemplate");
9759 RNA_def_function_return(func, parm);
9760
9761 return srna;
9762}
9763
9765{
9766 StructRNA *srna;
9767
9768 srna = RNA_def_struct(brna, "NodeInstanceHash", nullptr);
9769 RNA_def_struct_ui_text(srna, "Node Instance Hash", "Hash table containing node instance data");
9770
9771 /* XXX This type is a stub for now, only used to store instance hash in the context.
9772 * Eventually could use a StructRNA pointer to define a specific data type
9773 * and expose lookup functions.
9774 */
9775}
9776
9777static void rna_def_nodes(BlenderRNA *brna)
9778{
9779 const auto define = [&](const char *base_name,
9780 const char *struct_name,
9781 void (*func)(BlenderRNA *, StructRNA *) = nullptr) {
9782 StructRNA *srna = define_specific_node(brna, struct_name, base_name);
9783 if (func) {
9784 func(brna, srna);
9785 }
9786 };
9787
9788 /* Disabling clang-format because:
9789 * - It's more readable when the lines are aligned.
9790 * - It's easier to sort the lines alphabetically with automated tools. Keeping the lines sorted
9791 * avoids merge conflicts in many cases when multiple people add nodes at the same time.
9792 */
9793 /* clang-format off */
9794
9795 define("NodeInternal", "NodeFrame", def_frame);
9796 define("NodeInternal", "NodeGroup", def_group);
9797 define("NodeInternal", "NodeGroupInput", def_group_input);
9798 define("NodeInternal", "NodeGroupOutput", def_group_output);
9799 define("NodeInternal", "NodeReroute", def_reroute);
9800
9801 define("NodeInternal", "NodeClosureInput", def_closure_input);
9802 define("NodeInternal", "NodeClosureOutput", def_closure_output);
9803 define("NodeInternal", "NodeCombineBundle", def_combine_bundle);
9804 define("NodeInternal", "NodeEnableOutput");
9805 define("NodeInternal", "NodeEvaluateClosure", def_evaluate_closure);
9806 define("NodeInternal", "NodeJoinBundle");
9807 define("NodeInternal", "NodeSeparateBundle", def_separate_bundle);
9808
9809 define("ShaderNode", "ShaderNodeAddShader");
9810 define("ShaderNode", "ShaderNodeAmbientOcclusion", def_sh_ambient_occlusion);
9811 define("ShaderNode", "ShaderNodeAttribute", def_sh_attribute);
9812 define("ShaderNode", "ShaderNodeBackground");
9813 define("ShaderNode", "ShaderNodeBevel", def_sh_bevel);
9814 define("ShaderNode", "ShaderNodeBlackbody");
9815 define("ShaderNode", "ShaderNodeBrightContrast");
9816 define("ShaderNode", "ShaderNodeBsdfAnisotropic", def_glossy);
9817 define("ShaderNode", "ShaderNodeBsdfDiffuse");
9818 define("ShaderNode", "ShaderNodeBsdfGlass", def_glass);
9819 define("ShaderNode", "ShaderNodeBsdfHair", def_hair);
9820 define("ShaderNode", "ShaderNodeBsdfHairPrincipled", def_hair_principled);
9821 define("ShaderNode", "ShaderNodeBsdfMetallic", def_metallic);
9822 define("ShaderNode", "ShaderNodeBsdfPrincipled", def_principled);
9823 define("ShaderNode", "ShaderNodeBsdfRayPortal");
9824 define("ShaderNode", "ShaderNodeBsdfRefraction", def_refraction);
9825 define("ShaderNode", "ShaderNodeBsdfSheen", def_sheen);
9826 define("ShaderNode", "ShaderNodeBsdfToon", def_toon);
9827 define("ShaderNode", "ShaderNodeBsdfTranslucent");
9828 define("ShaderNode", "ShaderNodeBsdfTransparent");
9829 define("ShaderNode", "ShaderNodeBump", def_sh_bump);
9830 define("ShaderNode", "ShaderNodeCameraData");
9831 define("ShaderNode", "ShaderNodeClamp", def_clamp);
9832 define("ShaderNode", "ShaderNodeCombineColor", def_sh_combsep_color);
9833 define("ShaderNode", "ShaderNodeCombineXYZ");
9834 define("ShaderNode", "ShaderNodeDisplacement", def_sh_displacement);
9835 define("ShaderNode", "ShaderNodeEeveeSpecular");
9836 define("ShaderNode", "ShaderNodeEmission");
9837 define("ShaderNode", "ShaderNodeFloatCurve", def_float_curve);
9838 define("ShaderNode", "ShaderNodeFresnel");
9839 define("ShaderNode", "ShaderNodeGamma");
9840 define("ShaderNode", "ShaderNodeHairInfo");
9841 define("ShaderNode", "ShaderNodeHoldout");
9842 define("ShaderNode", "ShaderNodeHueSaturation");
9843 define("ShaderNode", "ShaderNodeInvert");
9844 define("ShaderNode", "ShaderNodeLayerWeight");
9845 define("ShaderNode", "ShaderNodeLightFalloff");
9846 define("ShaderNode", "ShaderNodeLightPath");
9847 define("ShaderNode", "ShaderNodeMapping", def_sh_mapping);
9848 define("ShaderNode", "ShaderNodeMapRange", def_map_range);
9849 define("ShaderNode", "ShaderNodeMath", def_math);
9850 define("ShaderNode", "ShaderNodeMix", def_sh_mix);
9851 define("ShaderNode", "ShaderNodeMixRGB", def_mix_rgb);
9852 define("ShaderNode", "ShaderNodeMixShader");
9853 define("ShaderNode", "ShaderNodeNewGeometry");
9854 define("ShaderNode", "ShaderNodeNormal");
9855 define("ShaderNode", "ShaderNodeNormalMap", def_sh_normal_map);
9856 define("ShaderNode", "ShaderNodeObjectInfo");
9857 define("ShaderNode", "ShaderNodeOutputAOV", def_sh_output_aov);
9858 define("ShaderNode", "ShaderNodeOutputLight", def_sh_output);
9859 define("ShaderNode", "ShaderNodeOutputLineStyle", def_sh_output_linestyle);
9860 define("ShaderNode", "ShaderNodeOutputMaterial", def_sh_output);
9861 define("ShaderNode", "ShaderNodeOutputWorld", def_sh_output);
9862 define("ShaderNode", "ShaderNodeParticleInfo");
9863 define("ShaderNode", "ShaderNodePointInfo");
9864 define("ShaderNode", "ShaderNodeRadialTiling", def_sh_radial_tiling);
9865 define("ShaderNode", "ShaderNodeRGB");
9866 define("ShaderNode", "ShaderNodeRGBCurve", def_rgb_curve);
9867 define("ShaderNode", "ShaderNodeRGBToBW");
9868 define("ShaderNode", "ShaderNodeScript", def_sh_script);
9869 define("ShaderNode", "ShaderNodeSeparateColor", def_sh_combsep_color);
9870 define("ShaderNode", "ShaderNodeSeparateXYZ");
9871 define("ShaderNode", "ShaderNodeShaderToRGB");
9872 define("ShaderNode", "ShaderNodeSqueeze");
9873 define("ShaderNode", "ShaderNodeSubsurfaceScattering", def_sh_subsurface);
9874 define("ShaderNode", "ShaderNodeTangent", def_sh_tangent);
9875 define("ShaderNode", "ShaderNodeTexBrick", def_sh_tex_brick);
9876 define("ShaderNode", "ShaderNodeTexChecker", def_sh_tex_checker);
9877 define("ShaderNode", "ShaderNodeTexCoord", def_sh_tex_coord);
9878 define("ShaderNode", "ShaderNodeTexEnvironment", def_sh_tex_environment);
9879 define("ShaderNode", "ShaderNodeTexGabor", def_sh_tex_gabor);
9880 define("ShaderNode", "ShaderNodeTexGradient", def_sh_tex_gradient);
9881 define("ShaderNode", "ShaderNodeTexIES", def_sh_tex_ies);
9882 define("ShaderNode", "ShaderNodeTexImage", def_sh_tex_image);
9883 define("ShaderNode", "ShaderNodeTexMagic", def_sh_tex_magic);
9884 define("ShaderNode", "ShaderNodeTexNoise", def_sh_tex_noise);
9885 define("ShaderNode", "ShaderNodeTexSky", def_sh_tex_sky);
9886 define("ShaderNode", "ShaderNodeTexVoronoi", def_sh_tex_voronoi);
9887 define("ShaderNode", "ShaderNodeTexWave", def_sh_tex_wave);
9888 define("ShaderNode", "ShaderNodeTexWhiteNoise", def_sh_tex_white_noise);
9889 define("ShaderNode", "ShaderNodeUVAlongStroke", def_sh_uvalongstroke);
9890 define("ShaderNode", "ShaderNodeUVMap", def_sh_uvmap);
9891 define("ShaderNode", "ShaderNodeValToRGB", def_colorramp);
9892 define("ShaderNode", "ShaderNodeValue");
9893 define("ShaderNode", "ShaderNodeVectorCurve", def_vector_curve);
9894 define("ShaderNode", "ShaderNodeVectorDisplacement", def_sh_vector_displacement);
9895 define("ShaderNode", "ShaderNodeVectorMath", def_vector_math);
9896 define("ShaderNode", "ShaderNodeVectorRotate", def_sh_vector_rotate);
9897 define("ShaderNode", "ShaderNodeVectorTransform", def_sh_vect_transform);
9898 define("ShaderNode", "ShaderNodeVertexColor", def_sh_vertex_color);
9899 define("ShaderNode", "ShaderNodeVolumeAbsorption");
9900 define("ShaderNode", "ShaderNodeVolumeInfo");
9901 define("ShaderNode", "ShaderNodeVolumePrincipled");
9902 define("ShaderNode", "ShaderNodeVolumeScatter", def_scatter);
9903 define("ShaderNode", "ShaderNodeVolumeCoefficients", def_volume_coefficients);
9904 define("ShaderNode", "ShaderNodeWavelength");
9905 define("ShaderNode", "ShaderNodeWireframe", def_sh_tex_wireframe);
9906
9907 define("CompositorNode", "CompositorNodeAlphaOver");
9908 define("CompositorNode", "CompositorNodeAntiAliasing");
9909 define("CompositorNode", "CompositorNodeBilateralblur");
9910 define("CompositorNode", "CompositorNodeBlur");
9911 define("CompositorNode", "CompositorNodeBokehBlur");
9912 define("CompositorNode", "CompositorNodeBokehImage");
9913 define("CompositorNode", "CompositorNodeBoxMask");
9914 define("CompositorNode", "CompositorNodeBrightContrast");
9915 define("CompositorNode", "CompositorNodeChannelMatte");
9916 define("CompositorNode", "CompositorNodeChromaMatte");
9917 define("CompositorNode", "CompositorNodeColorBalance", def_cmp_colorbalance);
9918 define("CompositorNode", "CompositorNodeColorCorrection");
9919 define("CompositorNode", "CompositorNodeColorMatte");
9920 define("CompositorNode", "CompositorNodeColorSpill");
9921 define("CompositorNode", "CompositorNodeConvolve");
9922 define("CompositorNode", "CompositorNodeCombineColor", def_cmp_combsep_color);
9923 define("CompositorNode", "CompositorNodeConvertColorSpace", def_cmp_convert_color_space);
9924 define("CompositorNode", "CompositorNodeConvertToDisplay", def_cmp_convert_to_display);
9925 define("CompositorNode", "CompositorNodeCornerPin");
9926 define("CompositorNode", "CompositorNodeCrop");
9927 define("CompositorNode", "CompositorNodeCryptomatte", def_cmp_cryptomatte_legacy);
9928 define("CompositorNode", "CompositorNodeCryptomatteV2", def_cmp_cryptomatte);
9929 define("CompositorNode", "CompositorNodeCurveRGB", def_rgb_curve);
9930 define("CompositorNode", "CompositorNodeDBlur");
9931 define("CompositorNode", "CompositorNodeDefocus", def_cmp_defocus);
9932 define("CompositorNode", "CompositorNodeDenoise");
9933 define("CompositorNode", "CompositorNodeDespeckle");
9934 define("CompositorNode", "CompositorNodeDiffMatte");
9935 define("CompositorNode", "CompositorNodeDilateErode");
9936 define("CompositorNode", "CompositorNodeDisplace");
9937 define("CompositorNode", "CompositorNodeDistanceMatte");
9938 define("CompositorNode", "CompositorNodeDoubleEdgeMask");
9939 define("CompositorNode", "CompositorNodeEllipseMask");
9940 define("CompositorNode", "CompositorNodeExposure");
9941 define("CompositorNode", "CompositorNodeFilter");
9942 define("CompositorNode", "CompositorNodeFlip");
9943 define("CompositorNode", "CompositorNodeGamma");
9944 define("CompositorNode", "CompositorNodeGlare");
9945 define("CompositorNode", "CompositorNodeHueCorrect", def_cmp_huecorrect);
9946 define("CompositorNode", "CompositorNodeHueSat");
9947 define("CompositorNode", "CompositorNodeIDMask");
9948 define("CompositorNode", "CompositorNodeImage", def_cmp_image);
9949 define("CompositorNode", "CompositorNodeImageCoordinates");
9950 define("CompositorNode", "CompositorNodeImageInfo");
9951 define("CompositorNode", "CompositorNodeInpaint");
9952 define("CompositorNode", "CompositorNodeInvert");
9953 define("CompositorNode", "CompositorNodeKeying");
9954 define("CompositorNode", "CompositorNodeKeyingScreen", def_cmp_keyingscreen);
9955 define("CompositorNode", "CompositorNodeKuwahara");
9956 define("CompositorNode", "CompositorNodeLensdist");
9957 define("CompositorNode", "CompositorNodeLevels");
9958 define("CompositorNode", "CompositorNodeLumaMatte");
9959 define("CompositorNode", "CompositorNodeMapUV");
9960 define("CompositorNode", "CompositorNodeMask", def_cmp_mask);
9961 define("CompositorNode", "CompositorNodeMovieClip", def_cmp_movieclip);
9962 define("CompositorNode", "CompositorNodeMovieDistortion", def_cmp_moviedistortion);
9963 define("CompositorNode", "CompositorNodeNormal");
9964 define("CompositorNode", "CompositorNodeNormalize");
9965 define("CompositorNode", "CompositorNodeOutputFile", def_cmp_file_output);
9966 define("CompositorNode", "CompositorNodePixelate");
9967 define("CompositorNode", "CompositorNodePlaneTrackDeform", def_cmp_planetrackdeform);
9968 define("CompositorNode", "CompositorNodePosterize");
9969 define("CompositorNode", "CompositorNodePremulKey");
9970 define("CompositorNode", "CompositorNodeRelativeToPixel");
9971 define("CompositorNode", "CompositorNodeRGB");
9972 define("CompositorNode", "CompositorNodeRGBToBW");
9973 define("CompositorNode", "CompositorNodeRLayers", def_cmp_render_layers);
9974 define("CompositorNode", "CompositorNodeRotate");
9975 define("CompositorNode", "CompositorNodeScale");
9976 define("CompositorNode", "CompositorNodeSceneTime");
9977 define("CompositorNode", "CompositorNodeSeparateColor", def_cmp_combsep_color);
9978 define("CompositorNode", "CompositorNodeSetAlpha");
9979 define("CompositorNode", "CompositorNodeSplit");
9980 define("CompositorNode", "CompositorNodeStabilize", def_cmp_stabilize2d);
9981 define("CompositorNode", "CompositorNodeSwitch");
9982 define("CompositorNode", "CompositorNodeSwitchView");
9983 define("CompositorNode", "CompositorNodeTime", def_time);
9984 define("CompositorNode", "CompositorNodeTonemap");
9985 define("CompositorNode", "CompositorNodeTrackPos", def_cmp_trackpos);
9986 define("CompositorNode", "CompositorNodeTransform");
9987 define("CompositorNode", "CompositorNodeTranslate");
9988 define("CompositorNode", "CompositorNodeVecBlur");
9989 define("CompositorNode", "CompositorNodeViewer", def_cmp_viewer);
9990 define("CompositorNode", "CompositorNodeZcombine");
9991
9992 define("TextureNode", "TextureNodeAt");
9993 define("TextureNode", "TextureNodeBricks", def_tex_bricks);
9994 define("TextureNode", "TextureNodeChecker");
9995 define("TextureNode", "TextureNodeCombineColor", def_tex_combsep_color);
9996 define("TextureNode", "TextureNodeCompose");
9997 define("TextureNode", "TextureNodeCoordinates");
9998 define("TextureNode", "TextureNodeCurveRGB", def_rgb_curve);
9999 define("TextureNode", "TextureNodeCurveTime", def_time);
10000 define("TextureNode", "TextureNodeDecompose");
10001 define("TextureNode", "TextureNodeDistance");
10002 define("TextureNode", "TextureNodeHueSaturation");
10003 define("TextureNode", "TextureNodeImage", def_tex_image);
10004 define("TextureNode", "TextureNodeInvert");
10005 define("TextureNode", "TextureNodeMath", def_math);
10006 define("TextureNode", "TextureNodeMixRGB", def_mix_rgb);
10007 define("TextureNode", "TextureNodeOutput", def_tex_output);
10008 define("TextureNode", "TextureNodeRGBToBW");
10009 define("TextureNode", "TextureNodeRotate");
10010 define("TextureNode", "TextureNodeScale");
10011 define("TextureNode", "TextureNodeSeparateColor", def_tex_combsep_color);
10012 define("TextureNode", "TextureNodeTexBlend");
10013 define("TextureNode", "TextureNodeTexClouds");
10014 define("TextureNode", "TextureNodeTexDistNoise");
10015 define("TextureNode", "TextureNodeTexMagic");
10016 define("TextureNode", "TextureNodeTexMarble");
10017 define("TextureNode", "TextureNodeTexMusgrave");
10018 define("TextureNode", "TextureNodeTexNoise");
10019 define("TextureNode", "TextureNodeTexStucci");
10020 define("TextureNode", "TextureNodeTexture", def_texture);
10021 define("TextureNode", "TextureNodeTexVoronoi");
10022 define("TextureNode", "TextureNodeTexWood");
10023 define("TextureNode", "TextureNodeTranslate");
10024 define("TextureNode", "TextureNodeValToNor");
10025 define("TextureNode", "TextureNodeValToRGB", def_colorramp);
10026 define("TextureNode", "TextureNodeViewer");
10027
10028 define("FunctionNode", "FunctionNodeAlignEulerToVector");
10029 define("FunctionNode", "FunctionNodeAlignRotationToVector");
10030 define("FunctionNode", "FunctionNodeAxesToRotation");
10031 define("FunctionNode", "FunctionNodeAxisAngleToRotation");
10032 define("FunctionNode", "FunctionNodeBitMath");
10033 define("FunctionNode", "FunctionNodeBooleanMath");
10034 define("FunctionNode", "FunctionNodeCombineColor");
10035 define("FunctionNode", "FunctionNodeCombineMatrix");
10036 define("FunctionNode", "FunctionNodeCombineTransform");
10037 define("FunctionNode", "FunctionNodeCompare");
10038 define("FunctionNode", "FunctionNodeEulerToRotation");
10039 define("FunctionNode", "FunctionNodeFindInString");
10040 define("FunctionNode", "FunctionNodeFloatToInt", def_float_to_int);
10041 define("FunctionNode", "FunctionNodeFormatString", def_fn_format_string);
10042 define("FunctionNode", "FunctionNodeHashValue");
10043 define("FunctionNode", "FunctionNodeInputBool", def_fn_input_bool);
10044 define("FunctionNode", "FunctionNodeInputColor", def_fn_input_color);
10045 define("FunctionNode", "FunctionNodeInputInt", def_fn_input_int);
10046 define("FunctionNode", "FunctionNodeInputRotation", def_fn_input_rotation);
10047 define("FunctionNode", "FunctionNodeInputSpecialCharacters");
10048 define("FunctionNode", "FunctionNodeInputString", def_fn_input_string);
10049 define("FunctionNode", "FunctionNodeInputVector", def_fn_input_vector);
10050 define("FunctionNode", "FunctionNodeIntegerMath");
10051 define("FunctionNode", "FunctionNodeInvertMatrix");
10052 define("FunctionNode", "FunctionNodeInvertRotation");
10053 define("FunctionNode", "FunctionNodeMatchString");
10054 define("FunctionNode", "FunctionNodeMatrixDeterminant");
10055 define("FunctionNode", "FunctionNodeMatrixMultiply");
10056 define("FunctionNode", "FunctionNodeProjectPoint");
10057 define("FunctionNode", "FunctionNodeQuaternionToRotation");
10058 define("FunctionNode", "FunctionNodeRandomValue", def_fn_random_value);
10059 define("FunctionNode", "FunctionNodeReplaceString");
10060 define("FunctionNode", "FunctionNodeRotateEuler", def_fn_rotate_euler);
10061 define("FunctionNode", "FunctionNodeRotateRotation");
10062 define("FunctionNode", "FunctionNodeRotateVector");
10063 define("FunctionNode", "FunctionNodeRotationToAxisAngle");
10064 define("FunctionNode", "FunctionNodeRotationToEuler");
10065 define("FunctionNode", "FunctionNodeRotationToQuaternion");
10066 define("FunctionNode", "FunctionNodeSeparateColor");
10067 define("FunctionNode", "FunctionNodeSeparateMatrix");
10068 define("FunctionNode", "FunctionNodeSeparateTransform");
10069 define("FunctionNode", "FunctionNodeSliceString");
10070 define("FunctionNode", "FunctionNodeStringLength");
10071 define("FunctionNode", "FunctionNodeStringToValue");
10072 define("FunctionNode", "FunctionNodeTransformDirection");
10073 define("FunctionNode", "FunctionNodeTransformPoint");
10074 define("FunctionNode", "FunctionNodeTransposeMatrix");
10075 define("FunctionNode", "FunctionNodeValueToString");
10076
10077 define("GeometryNode", "GeometryNodeAccumulateField");
10078 define("GeometryNode", "GeometryNodeAttributeDomainSize");
10079 define("GeometryNode", "GeometryNodeAttributeStatistic");
10080 define("GeometryNode", "GeometryNodeBake", rna_def_geo_bake);
10081 define("GeometryNode", "GeometryNodeBlurAttribute");
10082 define("GeometryNode", "GeometryNodeBoundBox");
10083 define("GeometryNode", "GeometryNodeCameraInfo");
10084 define("GeometryNode", "GeometryNodeCaptureAttribute", rna_def_geo_capture_attribute);
10085
10086 define("GeometryNode", "GeometryNodeCollectionInfo");
10087 define("GeometryNode", "GeometryNodeConvexHull");
10088 define("GeometryNode", "GeometryNodeCornersOfEdge");
10089 define("GeometryNode", "GeometryNodeCornersOfFace");
10090 define("GeometryNode", "GeometryNodeCornersOfVertex");
10091 define("GeometryNode", "GeometryNodeCurveArc");
10092 define("GeometryNode", "GeometryNodeCurveEndpointSelection");
10093 define("GeometryNode", "GeometryNodeCurveHandleTypeSelection", def_geo_curve_handle_type_selection);
10094 define("GeometryNode", "GeometryNodeCurveLength");
10095 define("GeometryNode", "GeometryNodeCurveOfPoint");
10096 define("GeometryNode", "GeometryNodeCurvePrimitiveBezierSegment");
10097 define("GeometryNode", "GeometryNodeCurvePrimitiveCircle");
10098 define("GeometryNode", "GeometryNodeCurvePrimitiveLine");
10099 define("GeometryNode", "GeometryNodeCurvePrimitiveQuadrilateral");
10100 define("GeometryNode", "GeometryNodeCurveQuadraticBezier");
10101 define("GeometryNode", "GeometryNodeCurveSetHandles", def_geo_curve_set_handle_type);
10102 define("GeometryNode", "GeometryNodeCurveSpiral");
10103 define("GeometryNode", "GeometryNodeCurveSplineType");
10104 define("GeometryNode", "GeometryNodeCurveStar");
10105 define("GeometryNode", "GeometryNodeCurvesToGreasePencil");
10106 define("GeometryNode", "GeometryNodeCurveToMesh");
10107 define("GeometryNode", "GeometryNodeCurveToPoints");
10108 define("GeometryNode", "GeometryNodeDeformCurvesOnSurface");
10109 define("GeometryNode", "GeometryNodeDeleteGeometry");
10110 define("GeometryNode", "GeometryNodeDistributePointsInGrid");
10111 define("GeometryNode", "GeometryNodeDistributePointsInVolume");
10112 define("GeometryNode", "GeometryNodeDistributePointsOnFaces", def_geo_distribute_points_on_faces);
10113 define("GeometryNode", "GeometryNodeDualMesh");
10114 define("GeometryNode", "GeometryNodeDuplicateElements");
10115 define("GeometryNode", "GeometryNodeEdgePathsToCurves");
10116 define("GeometryNode", "GeometryNodeEdgePathsToSelection");
10117 define("GeometryNode", "GeometryNodeEdgesOfCorner");
10118 define("GeometryNode", "GeometryNodeEdgesOfVertex");
10119 define("GeometryNode", "GeometryNodeEdgesToFaceGroups");
10120 define("GeometryNode", "GeometryNodeExtrudeMesh");
10121 define("GeometryNode", "GeometryNodeFaceOfCorner");
10122 define("GeometryNode", "GeometryNodeFieldAtIndex");
10123 define("GeometryNode", "GeometryNodeFieldAverage");
10124 define("GeometryNode", "GeometryNodeFieldMinAndMax");
10125 define("GeometryNode", "GeometryNodeFieldOnDomain");
10126 define("GeometryNode", "GeometryNodeFieldToGrid", def_geo_field_to_grid);
10127 define("GeometryNode", "GeometryNodeFieldVariance");
10128 define("GeometryNode", "GeometryNodeFillCurve");
10129 define("GeometryNode", "GeometryNodeFilletCurve");
10130 define("GeometryNode", "GeometryNodeFlipFaces");
10131 define("GeometryNode", "GeometryNodeForeachGeometryElementInput", def_geo_foreach_geometry_element_input);
10132 define("GeometryNode", "GeometryNodeForeachGeometryElementOutput", def_geo_foreach_geometry_element_output);
10133 define("GeometryNode", "GeometryNodeGeometryToInstance");
10134 define("GeometryNode", "GeometryNodeGetNamedGrid");
10135 define("GeometryNode", "GeometryNodeGizmoDial");
10136 define("GeometryNode", "GeometryNodeGizmoLinear");
10137 define("GeometryNode", "GeometryNodeGizmoTransform", rna_def_geo_gizmo_transform);
10138 define("GeometryNode", "GeometryNodeGreasePencilToCurves");
10139 define("GeometryNode", "GeometryNodeGridAdvect");
10140 define("GeometryNode", "GeometryNodeGridCurl");
10141 define("GeometryNode", "GeometryNodeGridDivergence");
10142 define("GeometryNode", "GeometryNodeGridGradient");
10143 define("GeometryNode", "GeometryNodeGridInfo");
10144 define("GeometryNode", "GeometryNodeGridLaplacian");
10145 define("GeometryNode", "GeometryNodeGridPrune");
10146 define("GeometryNode", "GeometryNodeGridToMesh");
10147 define("GeometryNode", "GeometryNodeGridVoxelize");
10148 define("GeometryNode", "GeometryNodeImageInfo");
10149 define("GeometryNode", "GeometryNodeImageTexture", def_geo_image_texture);
10150 define("GeometryNode", "GeometryNodeImportCSV");
10151 define("GeometryNode", "GeometryNodeImportOBJ");
10152 define("GeometryNode", "GeometryNodeImportPLY");
10153 define("GeometryNode", "GeometryNodeImportSTL");
10154 define("GeometryNode", "GeometryNodeImportText");
10155 define("GeometryNode", "GeometryNodeImportVDB");
10156 define("GeometryNode", "GeometryNodeIndexOfNearest");
10157 define("GeometryNode", "GeometryNodeIndexSwitch", def_geo_index_switch);
10158 define("GeometryNode", "GeometryNodeInputActiveCamera");
10159 define("GeometryNode", "GeometryNodeInputCollection", def_geo_input_collection);
10160 define("GeometryNode", "GeometryNodeInputCurveHandlePositions");
10161 define("GeometryNode", "GeometryNodeInputCurveTilt");
10162 define("GeometryNode", "GeometryNodeInputEdgeSmooth");
10163 define("GeometryNode", "GeometryNodeInputID");
10164 define("GeometryNode", "GeometryNodeInputImage", def_geo_image);
10165 define("GeometryNode", "GeometryNodeInputIndex");
10166 define("GeometryNode", "GeometryNodeInputInstanceBounds");
10167 define("GeometryNode", "GeometryNodeInputInstanceRotation");
10168 define("GeometryNode", "GeometryNodeInputInstanceScale");
10169 define("GeometryNode", "GeometryNodeInputMaterial", def_geo_input_material);
10170 define("GeometryNode", "GeometryNodeInputMaterialIndex");
10171 define("GeometryNode", "GeometryNodeInputMeshEdgeAngle");
10172 define("GeometryNode", "GeometryNodeInputMeshEdgeNeighbors");
10173 define("GeometryNode", "GeometryNodeInputMeshEdgeVertices");
10174 define("GeometryNode", "GeometryNodeInputMeshFaceArea");
10175 define("GeometryNode", "GeometryNodeInputMeshFaceIsPlanar");
10176 define("GeometryNode", "GeometryNodeInputMeshFaceNeighbors");
10177 define("GeometryNode", "GeometryNodeInputMeshIsland");
10178 define("GeometryNode", "GeometryNodeInputMeshVertexNeighbors");
10179 define("GeometryNode", "GeometryNodeInputNamedAttribute");
10180 define("GeometryNode", "GeometryNodeInputNamedLayerSelection");
10181 define("GeometryNode", "GeometryNodeInputNormal", def_geo_input_normal);
10182 define("GeometryNode", "GeometryNodeInputObject", def_geo_input_object);
10183 define("GeometryNode", "GeometryNodeInputPosition");
10184 define("GeometryNode", "GeometryNodeInputRadius");
10185 define("GeometryNode", "GeometryNodeInputSceneTime");
10186 define("GeometryNode", "GeometryNodeInputShadeSmooth");
10187 define("GeometryNode", "GeometryNodeInputShortestEdgePaths");
10188 define("GeometryNode", "GeometryNodeInputSplineCyclic");
10189 define("GeometryNode", "GeometryNodeInputSplineResolution");
10190 define("GeometryNode", "GeometryNodeInputTangent");
10191 define("GeometryNode", "GeometryNodeInputVoxelIndex");
10192 define("GeometryNode", "GeometryNodeInstanceOnPoints");
10193 define("GeometryNode", "GeometryNodeInstancesToPoints");
10194 define("GeometryNode", "GeometryNodeInstanceTransform");
10195 define("GeometryNode", "GeometryNodeInterpolateCurves");
10196 define("GeometryNode", "GeometryNodeIsViewport");
10197 define("GeometryNode", "GeometryNodeJoinGeometry");
10198 define("GeometryNode", "GeometryNodeList");
10199 define("GeometryNode", "GeometryNodeListGetItem");
10200 define("GeometryNode", "GeometryNodeListLength");
10201 define("GeometryNode", "GeometryNodeMaterialSelection");
10202 define("GeometryNode", "GeometryNodeMenuSwitch", def_geo_menu_switch);
10203 define("GeometryNode", "GeometryNodeMergeByDistance");
10204 define("GeometryNode", "GeometryNodeMergeLayers");
10205 define("GeometryNode", "GeometryNodeMeshBoolean");
10206 define("GeometryNode", "GeometryNodeMeshCircle");
10207 define("GeometryNode", "GeometryNodeMeshCone");
10208 define("GeometryNode", "GeometryNodeMeshCube");
10209 define("GeometryNode", "GeometryNodeMeshCylinder");
10210 define("GeometryNode", "GeometryNodeMeshFaceSetBoundaries");
10211 define("GeometryNode", "GeometryNodeMeshGrid");
10212 define("GeometryNode", "GeometryNodeMeshIcoSphere");
10213 define("GeometryNode", "GeometryNodeMeshLine");
10214 define("GeometryNode", "GeometryNodeMeshToCurve");
10215 define("GeometryNode", "GeometryNodeMeshToDensityGrid");
10216 define("GeometryNode", "GeometryNodeMeshToPoints");
10217 define("GeometryNode", "GeometryNodeMeshToSDFGrid");
10218 define("GeometryNode", "GeometryNodeMeshToVolume");
10219 define("GeometryNode", "GeometryNodeMeshUVSphere");
10220 define("GeometryNode", "GeometryNodeObjectInfo");
10221 define("GeometryNode", "GeometryNodeOffsetCornerInFace");
10222 define("GeometryNode", "GeometryNodeOffsetPointInCurve");
10223 define("GeometryNode", "GeometryNodePoints");
10224 define("GeometryNode", "GeometryNodePointsOfCurve");
10225 define("GeometryNode", "GeometryNodePointsToCurves");
10226 define("GeometryNode", "GeometryNodePointsToSDFGrid");
10227 define("GeometryNode", "GeometryNodePointsToVertices");
10228 define("GeometryNode", "GeometryNodePointsToVolume");
10229 define("GeometryNode", "GeometryNodeProximity");
10230 define("GeometryNode", "GeometryNodeRaycast");
10231 define("GeometryNode", "GeometryNodeRealizeInstances");
10232 define("GeometryNode", "GeometryNodeRemoveAttribute");
10233 define("GeometryNode", "GeometryNodeRepeatInput", def_geo_repeat_input);
10234 define("GeometryNode", "GeometryNodeRepeatOutput", def_geo_repeat_output);
10235 define("GeometryNode", "GeometryNodeReplaceMaterial");
10236 define("GeometryNode", "GeometryNodeResampleCurve");
10237 define("GeometryNode", "GeometryNodeReverseCurve");
10238 define("GeometryNode", "GeometryNodeRotateInstances");
10239 define("GeometryNode", "GeometryNodeSampleCurve", def_geo_curve_sample);
10240 define("GeometryNode", "GeometryNodeSampleGrid");
10241 define("GeometryNode", "GeometryNodeSampleGridIndex");
10242 define("GeometryNode", "GeometryNodeSampleIndex", def_geo_sample_index);
10243 define("GeometryNode", "GeometryNodeSampleNearest");
10244 define("GeometryNode", "GeometryNodeSampleNearestSurface");
10245 define("GeometryNode", "GeometryNodeSampleUVSurface");
10246 define("GeometryNode", "GeometryNodeScaleElements");
10247 define("GeometryNode", "GeometryNodeScaleInstances");
10248 define("GeometryNode", "GeometryNodeSDFGridBoolean");
10249 define("GeometryNode", "GeometryNodeSDFGridFillet");
10250 define("GeometryNode", "GeometryNodeSDFGridLaplacian");
10251 define("GeometryNode", "GeometryNodeSDFGridMean");
10252 define("GeometryNode", "GeometryNodeSDFGridMeanCurvature");
10253 define("GeometryNode", "GeometryNodeSDFGridMedian");
10254 define("GeometryNode", "GeometryNodeSDFGridOffset");
10255 define("GeometryNode", "GeometryNodeSelfObject");
10256 define("GeometryNode", "GeometryNodeSeparateComponents");
10257 define("GeometryNode", "GeometryNodeSeparateGeometry");
10258 define("GeometryNode", "GeometryNodeSetCurveHandlePositions");
10259 define("GeometryNode", "GeometryNodeSetCurveNormal");
10260 define("GeometryNode", "GeometryNodeSetCurveRadius");
10261 define("GeometryNode", "GeometryNodeSetCurveTilt");
10262 define("GeometryNode", "GeometryNodeSetGeometryName");
10263 define("GeometryNode", "GeometryNodeSetGreasePencilColor");
10264 define("GeometryNode", "GeometryNodeSetGreasePencilDepth");
10265 define("GeometryNode", "GeometryNodeSetGreasePencilSoftness");
10266 define("GeometryNode", "GeometryNodeSetGridBackground");
10267 define("GeometryNode", "GeometryNodeSetGridTransform");
10268 define("GeometryNode", "GeometryNodeSetID");
10269 define("GeometryNode", "GeometryNodeSetInstanceTransform");
10270 define("GeometryNode", "GeometryNodeSetMaterial");
10271 define("GeometryNode", "GeometryNodeSetMaterialIndex");
10272 define("GeometryNode", "GeometryNodeSetMeshNormal");
10273 define("GeometryNode", "GeometryNodeSetPointRadius");
10274 define("GeometryNode", "GeometryNodeSetPosition");
10275 define("GeometryNode", "GeometryNodeSetShadeSmooth");
10276 define("GeometryNode", "GeometryNodeSetSplineCyclic");
10277 define("GeometryNode", "GeometryNodeSetSplineResolution");
10278 define("GeometryNode", "GeometryNodeSimulationInput", def_geo_simulation_input);
10279 define("GeometryNode", "GeometryNodeSimulationOutput", def_geo_simulation_output);
10280 define("GeometryNode", "GeometryNodeSortElements");
10281 define("GeometryNode", "GeometryNodeSplineLength");
10282 define("GeometryNode", "GeometryNodeSplineParameter");
10283 define("GeometryNode", "GeometryNodeSplitEdges");
10284 define("GeometryNode", "GeometryNodeSplitToInstances");
10285 define("GeometryNode", "GeometryNodeStoreNamedAttribute");
10286 define("GeometryNode", "GeometryNodeStoreNamedGrid");
10287 define("GeometryNode", "GeometryNodeStringJoin");
10288 define("GeometryNode", "GeometryNodeStringToCurves", def_geo_string_to_curves);
10289 define("GeometryNode", "GeometryNodeSubdivideCurve");
10290 define("GeometryNode", "GeometryNodeSubdivideMesh");
10291 define("GeometryNode", "GeometryNodeSubdivisionSurface");
10292 define("GeometryNode", "GeometryNodeSwitch");
10293 define("GeometryNode", "GeometryNodeTool3DCursor");
10294 define("GeometryNode", "GeometryNodeToolActiveElement");
10295 define("GeometryNode", "GeometryNodeToolFaceSet");
10296 define("GeometryNode", "GeometryNodeToolMousePosition");
10297 define("GeometryNode", "GeometryNodeToolSelection");
10298 define("GeometryNode", "GeometryNodeToolSetFaceSet");
10299 define("GeometryNode", "GeometryNodeToolSetSelection");
10300 define("GeometryNode", "GeometryNodeTransform");
10301 define("GeometryNode", "GeometryNodeTranslateInstances");
10302 define("GeometryNode", "GeometryNodeTriangulate");
10303 define("GeometryNode", "GeometryNodeTrimCurve");
10304 define("GeometryNode", "GeometryNodeUVPackIslands");
10305 define("GeometryNode", "GeometryNodeUVTangent");
10306 define("GeometryNode", "GeometryNodeUVUnwrap");
10307 define("GeometryNode", "GeometryNodeVertexOfCorner");
10308 define("GeometryNode", "GeometryNodeViewer", rna_def_geo_viewer);
10309 define("GeometryNode", "GeometryNodeViewportTransform");
10310 define("GeometryNode", "GeometryNodeVolumeCube");
10311 define("GeometryNode", "GeometryNodeVolumeToMesh");
10312 define("GeometryNode", "GeometryNodeWarning");
10313
10314
10315 /* Node group types are currently defined for each tree type individually. */
10316 define("ShaderNode", "ShaderNodeGroup", def_group);
10317 define("CompositorNode", "CompositorNodeGroup", def_group);
10318 define("TextureNode", "TextureNodeGroup", def_group);
10319 define("GeometryNode", "GeometryNodeGroup", def_group);
10320
10321 /* clang-format on */
10322}
10323
10325{
10326 rna_def_node(brna);
10327 rna_def_node_link(brna);
10328
10330 rna_def_shader_node(brna);
10335
10336 rna_def_nodetree(brna);
10337
10342
10343 rna_def_nodes(brna);
10344
10345 def_custom_group(brna,
10346 "ShaderNodeCustomGroup",
10347 "ShaderNode",
10348 "Shader Custom Group",
10349 "Custom Shader Group Node for Python nodes",
10350 "rna_ShaderNodeCustomGroup_register");
10351 def_custom_group(brna,
10352 "CompositorNodeCustomGroup",
10353 "CompositorNode",
10354 "Compositor Custom Group",
10355 "Custom Compositor Group Node for Python nodes",
10356 "rna_CompositorNodeCustomGroup_register");
10357 def_custom_group(brna,
10358 "NodeCustomGroup",
10359 "Node",
10360 "Custom Group",
10361 "Base node type for custom registered node group types",
10362 "rna_NodeCustomGroup_register");
10363 def_custom_group(brna,
10364 "GeometryNodeCustomGroup",
10365 "GeometryNode",
10366 "Geometry Custom Group",
10367 "Custom Geometry Group Node for Python nodes",
10368 "rna_GeometryNodeCustomGroup_register");
10369
10371}
10372
10373/* clean up macro definition */
10374# undef NODE_DEFINE_SUBTYPES
10375
10376#endif
void BKE_animdata_fix_paths_rename_all(struct ID *ref_id, const char *prefix, const char *oldName, const char *newName)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Main * CTX_data_main(const bContext *C)
void BKE_cryptomatte_matte_id_to_entries(struct NodeCryptomatte *node_storage, const char *matte_id)
char * BKE_cryptomatte_entries_to_matte_id(struct NodeCryptomatte *node_storage)
RenderPass * BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
#define IMA_SIGNAL_SRC_CHANGE
Definition BKE_image.hh:171
void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
void id_us_plus(ID *id)
Definition lib_id.cc:358
void id_us_min(ID *id)
Definition lib_id.cc:366
void BKE_main_ensure_invariants(Main &bmain, std::optional< blender::Span< ID * > > modified_ids=std::nullopt)
#define NODE_CLASS_OUTPUT
Definition BKE_node.hh:448
#define NODE_UNDEFINED
Definition BKE_node.hh:809
constexpr int GROUP_NODE_MIN_WIDTH
Definition BKE_node.hh:1253
constexpr int GROUP_NODE_DEFAULT_WIDTH
Definition BKE_node.hh:1251
#define NODE_CUSTOM_GROUP
Definition BKE_node.hh:816
constexpr int GROUP_NODE_MAX_WIDTH
Definition BKE_node.hh:1252
#define NODE_CUSTOM
Definition BKE_node.hh:810
#define SH_NODE_TEX_IMAGE
#define CMP_NODE_CRYPTOMATTE
#define FN_NODE_RANDOM_VALUE
#define SH_NODE_MAP_RANGE
#define SH_NODE_TEX_ENVIRONMENT
#define FN_NODE_COMPARE
#define CMP_NODE_OUTPUT_FILE
#define SH_NODE_MIX
#define SH_NODE_SCRIPT
void BKE_ntree_update_tag_active_output_changed(bNodeTree *ntree)
void BKE_ntree_update_tag_all(bNodeTree *ntree)
void BKE_ntree_update_tag_link_changed(bNodeTree *ntree)
void BKE_ntree_update_tag_node_property(bNodeTree *ntree, bNode *node)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
@ RPT_INFO
Definition BKE_report.hh:35
@ RPT_ERROR_INVALID_INPUT
Definition BKE_report.hh:40
@ RPT_ERROR
Definition BKE_report.hh:39
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:153
void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain)
Definition scene.cc:2626
void BLF_cache_clear()
Definition blf.cc:98
#define BLI_assert(a)
Definition BLI_assert.h:46
void BLI_kdtree_nd_ free(KDTree *tree)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:586
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:534
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:332
int BLI_listbase_count_at_most(const ListBase *listbase, int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:511
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:131
void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:371
#define DEG2RADF(_deg)
#define M_PI_2
MINLINE void copy_v2_v2(float r[2], const float a[2])
#define BLI_SCOPED_DEFER(function_to_defer)
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
bool void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
Definition string.cc:41
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:604
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:693
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
#define CLAMP(a, b, c)
#define STREQLEN(a, b, n)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define ELEM(...)
#define CTX_N_(context, msgid)
#define BLT_I18NCONTEXT_ID_NODETREE
#define BLT_I18NCONTEXT_ID_IMAGE
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
#define BLT_I18NCONTEXT_UNIT
#define BLT_I18NCONTEXT_ID_MOVIECLIP
#define BLT_I18NCONTEXT_ID_TEXTURE
void DEG_id_tag_update_for_side_effect_request(Depsgraph *depsgraph, ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
bool DEG_is_original(const T *id)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ ID_RECALC_NTREE_OUTPUT
Definition DNA_ID.h:1155
#define ID_BLEND_PATH_FROM_GLOBAL(_id)
Definition DNA_ID.h:688
@ CD_PROP_BYTE_COLOR
@ CD_PROP_FLOAT
@ CD_PROP_FLOAT3
@ CD_PROP_COLOR
@ CD_PROP_QUATERNION
@ CD_PROP_INT32
@ CD_PROP_FLOAT2
@ CD_PROP_FLOAT4X4
#define MAX_NAME
Definition DNA_defs.h:50
@ IMA_TYPE_MULTILAYER
@ IMA_ANIM_ALWAYS
@ NODE_VECTOR_MATH_NORMALIZE
@ NODE_VECTOR_MATH_LENGTH
@ NODE_VECTOR_MATH_SIGN
@ NODE_VECTOR_MATH_CROSS_PRODUCT
@ NODE_VECTOR_MATH_CEIL
@ NODE_VECTOR_MATH_MODULO
@ NODE_VECTOR_MATH_ADD
@ NODE_VECTOR_MATH_COSINE
@ NODE_VECTOR_MATH_REFLECT
@ NODE_VECTOR_MATH_WRAP
@ NODE_VECTOR_MATH_REFRACT
@ NODE_VECTOR_MATH_POWER
@ NODE_VECTOR_MATH_DOT_PRODUCT
@ NODE_VECTOR_MATH_ABSOLUTE
@ NODE_VECTOR_MATH_DIVIDE
@ NODE_VECTOR_MATH_TANGENT
@ NODE_VECTOR_MATH_DISTANCE
@ NODE_VECTOR_MATH_FLOOR
@ NODE_VECTOR_MATH_SNAP
@ NODE_VECTOR_MATH_SINE
@ NODE_VECTOR_MATH_FRACTION
@ NODE_VECTOR_MATH_PROJECT
@ NODE_VECTOR_MATH_MULTIPLY
@ NODE_VECTOR_MATH_SCALE
@ NODE_VECTOR_MATH_MAXIMUM
@ NODE_VECTOR_MATH_FACEFORWARD
@ NODE_VECTOR_MATH_SUBTRACT
@ NODE_VECTOR_MATH_MULTIPLY_ADD
@ NODE_VECTOR_MATH_MINIMUM
@ CMP_NODE_INTERPOLATION_NEAREST
@ CMP_NODE_INTERPOLATION_BILINEAR
@ CMP_NODE_INTERPOLATION_BICUBIC
@ CMP_NODE_INTERPOLATION_ANISOTROPIC
@ GEO_NODE_MESH_CIRCLE_FILL_NGON
@ GEO_NODE_MESH_CIRCLE_FILL_TRIANGLE_FAN
@ GEO_NODE_MESH_CIRCLE_FILL_NONE
@ CMP_NODE_COMBSEP_COLOR_YCC
@ CMP_NODE_COMBSEP_COLOR_YUV
@ CMP_NODE_COMBSEP_COLOR_RGB
@ CMP_NODE_COMBSEP_COLOR_HSV
@ CMP_NODE_COMBSEP_COLOR_HSL
#define SHD_SHEEN_ASHIKHMIN
@ SHD_VORONOI_EUCLIDEAN
@ SHD_VORONOI_CHEBYCHEV
@ SHD_VORONOI_MANHATTAN
@ SHD_VORONOI_MINKOWSKI
@ SHD_MATH_CLAMP
@ SHD_WAVE_PROFILE_SIN
@ SHD_WAVE_PROFILE_TRI
@ SHD_WAVE_PROFILE_SAW
@ GEO_NODE_STRING_TO_CURVES_ALIGN_X_CENTER
@ GEO_NODE_STRING_TO_CURVES_ALIGN_X_JUSTIFY
@ GEO_NODE_STRING_TO_CURVES_ALIGN_X_FLUSH
@ GEO_NODE_STRING_TO_CURVES_ALIGN_X_LEFT
@ GEO_NODE_STRING_TO_CURVES_ALIGN_X_RIGHT
@ SHD_SPACE_BLENDER_OBJECT
@ SHD_SPACE_OBJECT
@ SHD_SPACE_TANGENT
@ SHD_SPACE_WORLD
@ SHD_SPACE_BLENDER_WORLD
@ NODE_MATH_SINH
@ NODE_MATH_SMOOTH_MIN
@ NODE_MATH_TRUNC
@ NODE_MATH_COSH
@ NODE_MATH_SIGN
@ NODE_MATH_DEGREES
@ NODE_MATH_MODULO
@ NODE_MATH_ABSOLUTE
@ NODE_MATH_DIVIDE
@ NODE_MATH_SINE
@ NODE_MATH_FLOORED_MODULO
@ NODE_MATH_ARCTAN2
@ NODE_MATH_ARCCOSINE
@ NODE_MATH_MULTIPLY_ADD
@ NODE_MATH_POWER
@ NODE_MATH_WRAP
@ NODE_MATH_ARCTANGENT
@ NODE_MATH_MINIMUM
@ NODE_MATH_SQRT
@ NODE_MATH_CEIL
@ NODE_MATH_TANH
@ NODE_MATH_GREATER_THAN
@ NODE_MATH_ADD
@ NODE_MATH_FRACTION
@ NODE_MATH_EXPONENT
@ NODE_MATH_LESS_THAN
@ NODE_MATH_ARCSINE
@ NODE_MATH_MAXIMUM
@ NODE_MATH_LOGARITHM
@ NODE_MATH_COMPARE
@ NODE_MATH_INV_SQRT
@ NODE_MATH_MULTIPLY
@ NODE_MATH_PINGPONG
@ NODE_MATH_ROUND
@ NODE_MATH_FLOOR
@ NODE_MATH_SUBTRACT
@ NODE_MATH_COSINE
@ NODE_MATH_SNAP
@ NODE_MATH_TANGENT
@ NODE_MATH_SMOOTH_MAX
@ NODE_MATH_RADIANS
@ NODE_CLOSURE_FLAG_DEFINE_SIGNATURE
@ CMP_NODE_EXTENSION_MODE_EXTEND
@ CMP_NODE_EXTENSION_MODE_CLIP
@ CMP_NODE_EXTENSION_MODE_REPEAT
GeometryNodeAssetTraitFlag
@ GEO_NODE_ASSET_MESH
@ GEO_NODE_ASSET_SCULPT
@ GEO_NODE_ASSET_WAIT_FOR_CURSOR
@ GEO_NODE_ASSET_PAINT
@ GEO_NODE_ASSET_GREASE_PENCIL
@ GEO_NODE_ASSET_CURVE
@ GEO_NODE_ASSET_POINTCLOUD
@ GEO_NODE_ASSET_EDIT
@ GEO_NODE_ASSET_MODIFIER
@ GEO_NODE_ASSET_TOOL
@ GEO_NODE_ASSET_OBJECT
@ GEO_NODE_ASSET_HIDE_MODIFIER_MANAGE_PANEL
@ SHD_BLEND_DIAGONAL
@ SHD_BLEND_EASING
@ SHD_BLEND_LINEAR
@ SHD_BLEND_RADIAL
@ SHD_BLEND_QUADRATIC_SPHERE
@ SHD_BLEND_SPHERICAL
@ SHD_BLEND_QUADRATIC
@ SHD_HAIR_REFLECTION
@ SHD_HAIR_TRANSMISSION
@ SHD_VORONOI_F2
@ SHD_VORONOI_SMOOTH_F1
@ SHD_VORONOI_DISTANCE_TO_EDGE
@ SHD_VORONOI_F1
@ SHD_VORONOI_N_SPHERE_RADIUS
@ SHD_NOISE_HYBRID_MULTIFRACTAL
@ SHD_NOISE_FBM
@ SHD_NOISE_MULTIFRACTAL
@ SHD_NOISE_RIDGED_MULTIFRACTAL
@ SHD_NOISE_HETERO_TERRAIN
@ SHD_PHASE_DRAINE
@ SHD_PHASE_RAYLEIGH
@ SHD_PHASE_HENYEY_GREENSTEIN
@ SHD_PHASE_MIE
@ SHD_PHASE_FOURNIER_FORAND
@ SHD_OUTPUT_CYCLES
@ SHD_OUTPUT_ALL
@ SHD_OUTPUT_EEVEE
@ SHD_GABOR_TYPE_3D
@ SHD_GABOR_TYPE_2D
@ GEO_NODE_CURVE_HANDLE_RIGHT
@ GEO_NODE_CURVE_HANDLE_LEFT
@ SHD_PROJ_MIRROR_BALL
@ SHD_PROJ_EQUIRECTANGULAR
@ CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE
@ CMP_NODE_CRYPTOMATTE_SOURCE_RENDER
@ SHD_SUBSURFACE_BURLEY
@ SHD_SUBSURFACE_RANDOM_WALK_SKIN
@ SHD_SUBSURFACE_RANDOM_WALK
@ NTREE_VIEWER_BORDER
@ SHD_PRINCIPLED_HAIR_REFLECTANCE
@ SHD_PRINCIPLED_HAIR_DIRECT_ABSORPTION
@ SHD_PRINCIPLED_HAIR_PIGMENT_CONCENTRATION
@ SHD_WAVE_BANDS_DIRECTION_Y
@ SHD_WAVE_BANDS_DIRECTION_X
@ SHD_WAVE_BANDS_DIRECTION_Z
@ SHD_WAVE_BANDS_DIRECTION_DIAGONAL
@ GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_MIDPOINT
@ GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_BOTTOM_RIGHT
@ GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_BOTTOM_CENTER
@ GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_TOP_LEFT
@ GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_TOP_CENTER
@ GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_TOP_RIGHT
@ GEO_NODE_STRING_TO_CURVES_PIVOT_MODE_BOTTOM_LEFT
@ SHD_SKY_PREETHAM
@ SHD_SKY_HOSEK
@ SHD_SKY_MULTIPLE_SCATTERING
@ SHD_SKY_SINGLE_SCATTERING
@ SHD_GLOSSY_BECKMANN
@ SHD_GLOSSY_GGX
@ SHD_GLOSSY_ASHIKHMIN_SHIRLEY
@ SHD_GLOSSY_MULTI_GGX
@ NODE_CLAMP_RANGE
@ NODE_CLAMP_MINMAX
@ FN_NODE_ROTATE_EULER_TYPE_EULER
@ FN_NODE_ROTATE_EULER_TYPE_AXIS_ANGLE
@ SHD_AO_INSIDE
@ SHD_AO_LOCAL
@ SHD_WAVE_RINGS
@ SHD_WAVE_BANDS
@ SHD_INTERP_LINEAR
@ SHD_INTERP_SMART
@ SHD_INTERP_CUBIC
@ SHD_INTERP_CLOSEST
@ SHD_IMAGE_EXTENSION_MIRROR
@ SHD_IMAGE_EXTENSION_CLIP
@ SHD_IMAGE_EXTENSION_REPEAT
@ SHD_IMAGE_EXTENSION_EXTEND
@ GEO_NODE_CURVE_SAMPLE_FACTOR
@ GEO_NODE_CURVE_SAMPLE_LENGTH
@ SHD_PROJ_TUBE
@ SHD_PROJ_SPHERE
@ SHD_PROJ_BOX
@ SHD_PROJ_FLAT
@ NODE_OPTIONS
@ NODE_DO_OUTPUT
@ NODE_ACTIVE_TEXTURE
@ NODE_CUSTOM_COLOR
@ NODE_COLLAPSED
@ NODE_MUTED
@ NODE_PREVIEW
@ NTREE_TEXTURE
@ NTREE_CUSTOM
@ NTREE_SHADER
@ NTREE_GEOMETRY
@ NTREE_COMPOSIT
@ NTREE_UNDEFINED
@ GEO_NODE_BAKE_ITEM_IS_ATTRIBUTE
@ SHD_TANGENT_UVMAP
@ SHD_TANGENT_RADIAL
@ NODE_VECTOR_ROTATE_TYPE_AXIS
@ NODE_VECTOR_ROTATE_TYPE_AXIS_Z
@ NODE_VECTOR_ROTATE_TYPE_AXIS_X
@ NODE_VECTOR_ROTATE_TYPE_EULER_XYZ
@ NODE_VECTOR_ROTATE_TYPE_AXIS_Y
@ GEO_NODE_POINT_DISTRIBUTE_POINTS_ON_FACES_RANDOM
@ GEO_NODE_POINT_DISTRIBUTE_POINTS_ON_FACES_POISSON
#define SHD_SHEEN_MICROFIBER
@ SHD_VECT_TRANSFORM_TYPE_VECTOR
@ SHD_VECT_TRANSFORM_TYPE_NORMAL
@ SHD_VECT_TRANSFORM_TYPE_POINT
eNodeSocketInOut
@ SOCK_OUT
@ SOCK_IN
@ NODE_VIEWER_SHORTCUT_NONE
@ NODE_LINK_MUTED
@ NODE_LINK_VALID
@ NODE_MIX_MODE_UNIFORM
@ NODE_MIX_MODE_NON_UNIFORM
@ SHD_WAVE_RINGS_DIRECTION_Z
@ SHD_WAVE_RINGS_DIRECTION_Y
@ SHD_WAVE_RINGS_DIRECTION_X
@ SHD_WAVE_RINGS_DIRECTION_SPHERICAL
@ GEO_NODE_GIZMO_COLOR_Z
@ GEO_NODE_GIZMO_COLOR_Y
@ GEO_NODE_GIZMO_COLOR_X
@ GEO_NODE_GIZMO_COLOR_PRIMARY
@ GEO_NODE_GIZMO_COLOR_SECONDARY
@ SOCK_MULTI_INPUT
@ SOCK_HIDDEN
@ NODE_SEPARATE_BUNDLE_FLAG_DEFINE_SIGNATURE
@ GEO_NODE_STRING_TO_CURVES_ALIGN_Y_BOTTOM_BASELINE
@ GEO_NODE_STRING_TO_CURVES_ALIGN_Y_TOP_BASELINE
@ GEO_NODE_STRING_TO_CURVES_ALIGN_Y_TOP
@ GEO_NODE_STRING_TO_CURVES_ALIGN_Y_BOTTOM
@ GEO_NODE_STRING_TO_CURVES_ALIGN_Y_MIDDLE
@ SHD_VECT_TRANSFORM_SPACE_WORLD
@ SHD_VECT_TRANSFORM_SPACE_OBJECT
@ SHD_VECT_TRANSFORM_SPACE_CAMERA
@ SHD_CONDUCTOR_F82
@ SHD_PHYSICAL_CONDUCTOR
eNodeSocketDatatype
@ SOCK_INT
@ SOCK_TEXTURE
@ SOCK_VECTOR
@ SOCK_CLOSURE
@ SOCK_BOOLEAN
@ SOCK_MATERIAL
@ SOCK_SHADER
@ SOCK_MATRIX
@ SOCK_FLOAT
@ SOCK_IMAGE
@ SOCK_COLLECTION
@ SOCK_CUSTOM
@ SOCK_BUNDLE
@ SOCK_GEOMETRY
@ SOCK_ROTATION
@ SOCK_OBJECT
@ SOCK_STRING
@ SOCK_RGBA
@ SOCK_MENU
@ SHD_TOON_GLOSSY
@ SHD_TOON_DIFFUSE
@ NODE_COMBSEP_COLOR_RGB
@ NODE_COMBSEP_COLOR_HSV
@ NODE_COMBSEP_COLOR_HSL
@ NODE_WARNING_PROPAGATION_NONE
@ NODE_WARNING_PROPAGATION_ONLY_ERRORS_AND_WARNINGS
@ NODE_WARNING_PROPAGATION_ONLY_ERRORS
@ NODE_WARNING_PROPAGATION_ALL
@ SHD_TANGENT_AXIS_Y
@ SHD_TANGENT_AXIS_X
@ SHD_TANGENT_AXIS_Z
@ SHD_ATTRIBUTE_VIEW_LAYER
@ SHD_ATTRIBUTE_OBJECT
@ SHD_ATTRIBUTE_GEOMETRY
@ SHD_ATTRIBUTE_INSTANCER
@ GEO_NODE_LINEAR_GIZMO_DRAW_STYLE_CROSS
@ GEO_NODE_LINEAR_GIZMO_DRAW_STYLE_BOX
@ GEO_NODE_LINEAR_GIZMO_DRAW_STYLE_ARROW
@ NODE_MAP_RANGE_STEPPED
@ NODE_MAP_RANGE_SMOOTHERSTEP
@ NODE_MAP_RANGE_SMOOTHSTEP
@ NODE_MAP_RANGE_LINEAR
@ NODE_SCRIPT_INTERNAL
@ NODE_SCRIPT_EXTERNAL
@ FN_NODE_ROTATE_EULER_SPACE_OBJECT
@ FN_NODE_ROTATE_EULER_SPACE_LOCAL
@ SHD_MIXRGB_USE_ALPHA
@ SHD_MIXRGB_CLAMP
@ GEO_NODE_STRING_TO_CURVES_MODE_TRUNCATE
@ GEO_NODE_STRING_TO_CURVES_MODE_SCALE_TO_FIT
@ GEO_NODE_STRING_TO_CURVES_MODE_OVERFLOW
@ GEO_NODE_TRANSFORM_GIZMO_USE_ROTATION_Z
@ GEO_NODE_TRANSFORM_GIZMO_USE_SCALE_Z
@ GEO_NODE_TRANSFORM_GIZMO_USE_ROTATION_X
@ GEO_NODE_TRANSFORM_GIZMO_USE_ROTATION_Y
@ GEO_NODE_TRANSFORM_GIZMO_USE_TRANSLATION_Z
@ GEO_NODE_TRANSFORM_GIZMO_USE_TRANSLATION_Y
@ GEO_NODE_TRANSFORM_GIZMO_USE_SCALE_X
@ GEO_NODE_TRANSFORM_GIZMO_USE_SCALE_Y
@ GEO_NODE_TRANSFORM_GIZMO_USE_TRANSLATION_X
@ GEO_NODE_CURVE_HANDLE_ALIGN
@ GEO_NODE_CURVE_HANDLE_AUTO
@ GEO_NODE_CURVE_HANDLE_FREE
@ GEO_NODE_CURVE_HANDLE_VECTOR
@ NODE_BOOLEAN_MATH_IMPLY
@ NODE_BOOLEAN_MATH_AND
@ NODE_BOOLEAN_MATH_NAND
@ NODE_BOOLEAN_MATH_XOR
@ NODE_BOOLEAN_MATH_NOT
@ NODE_BOOLEAN_MATH_OR
@ NODE_BOOLEAN_MATH_NIMPLY
@ NODE_BOOLEAN_MATH_XNOR
@ NODE_BOOLEAN_MATH_NOR
@ NODE_COMBINE_BUNDLE_FLAG_DEFINE_SIGNATURE
@ FN_NODE_FLOAT_TO_INT_TRUNCATE
@ FN_NODE_FLOAT_TO_INT_CEIL
@ FN_NODE_FLOAT_TO_INT_ROUND
@ FN_NODE_FLOAT_TO_INT_FLOOR
@ NODE_IES_EXTERNAL
@ NODE_IES_INTERNAL
@ NODE_GEO_VIEWER_ITEM_FLAG_AUTO_REMOVE
@ SHD_PRINCIPLED_HAIR_HUANG
@ SHD_PRINCIPLED_HAIR_CHIANG
@ NODE_INTEGER_MATH_SIGN
@ NODE_INTEGER_MATH_ABSOLUTE
@ NODE_INTEGER_MATH_MODULO
@ NODE_INTEGER_MATH_POWER
@ NODE_INTEGER_MATH_MINIMUM
@ NODE_INTEGER_MATH_ADD
@ NODE_INTEGER_MATH_MULTIPLY_ADD
@ NODE_INTEGER_MATH_SUBTRACT
@ NODE_INTEGER_MATH_MULTIPLY
@ NODE_INTEGER_MATH_DIVIDE_FLOOR
@ NODE_INTEGER_MATH_DIVIDE_CEIL
@ NODE_INTEGER_MATH_NEGATE
@ NODE_INTEGER_MATH_MAXIMUM
@ NODE_INTEGER_MATH_GCD
@ NODE_INTEGER_MATH_LCM
@ NODE_INTEGER_MATH_FLOORED_MODULO
@ NODE_INTEGER_MATH_DIVIDE_ROUND
@ NODE_INTEGER_MATH_DIVIDE
@ NODE_SCRIPT_AUTO_UPDATE
@ NODE_MAPPING_TYPE_POINT
@ NODE_MAPPING_TYPE_VECTOR
@ NODE_MAPPING_TYPE_TEXTURE
@ NODE_MAPPING_TYPE_NORMAL
@ NODE_FRAME_SHRINK
@ NODE_COMPARE_NOT_EQUAL
@ NODE_COMPARE_LESS_EQUAL
@ NODE_COMPARE_COLOR_BRIGHTER
@ NODE_COMPARE_EQUAL
@ NODE_COMPARE_GREATER_EQUAL
@ NODE_COMPARE_GREATER_THAN
@ NODE_COMPARE_COLOR_DARKER
@ NODE_COMPARE_LESS_THAN
@ NODE_EVALUATE_CLOSURE_FLAG_DEFINE_SIGNATURE
Object is a sort of wrapper for general info.
#define MAXFRAMEF
#define MINAFRAMEF
void ED_node_type_draw_color(const char *idname, float *r_color)
Definition drawnode.cc:1510
void ED_init_custom_node_type(blender::bke::bNodeType *ntype)
Definition drawnode.cc:940
void IMB_colormanagement_colorspace_items_add(EnumPropertyItem **items, int *totitem)
bool IMB_colormanagement_set_whitepoint(const float whitepoint[3], float &temperature, float &tint)
const char * IMB_colormanagement_colorspace_get_indexed_name(int index)
void IMB_colormanagement_get_whitepoint(const float temperature, const float tint, float whitepoint[3])
int IMB_colormanagement_colorspace_get_named_index(const char *name)
void rna_Node_socket_update(Main *bmain, Scene *scene, PointerRNA *ptr)
const EnumPropertyItem * rna_NodeSocket_structure_type_item_filter(const bNodeTree *ntree, const eNodeSocketDatatype socket_type, bool *r_free)
void rna_Node_Viewer_shortcut_node_set(PointerRNA *ptr, PropertyRNA *prop, int value)
void rna_Node_update_relations(Main *bmain, Scene *scne, PointerRNA *ptr)
void rna_Node_update(Main *bmain, Scene *scene, PointerRNA *ptr)
void register_node_type_sh_custom_group(blender::bke::bNodeType *ntype)
void ntreeTexCheckCyclics(struct bNodeTree *ntree)
int rna_node_socket_idname_to_enum(const char *idname)
blender::bke::bNodeTreeType * rna_node_tree_type_from_enum(int value)
int rna_node_tree_idname_to_enum(const char *idname)
const EnumPropertyItem * rna_node_tree_type_itemf(void *data, bool(*poll)(void *data, blender::bke::bNodeTreeType *), bool *r_free)
blender::bke::bNodeSocketType * rna_node_socket_type_from_enum(int value)
const EnumPropertyItem * rna_node_socket_type_itemf(void *data, bool(*poll)(void *data, blender::bke::bNodeSocketType *), bool *r_free)
ParameterFlag
Definition RNA_types.hh:544
@ PARM_RNAPTR
Definition RNA_types.hh:547
@ PARM_REQUIRED
Definition RNA_types.hh:545
@ FUNC_USE_REPORTS
Definition RNA_types.hh:914
@ FUNC_USE_SELF_TYPE
Definition RNA_types.hh:909
@ FUNC_NO_SELF
Definition RNA_types.hh:907
@ FUNC_REGISTER
Definition RNA_types.hh:921
@ FUNC_USE_MAIN
Definition RNA_types.hh:912
@ FUNC_USE_CONTEXT
Definition RNA_types.hh:913
@ FUNC_USE_SELF_ID
Definition RNA_types.hh:889
@ FUNC_REGISTER_OPTIONAL
Definition RNA_types.hh:923
@ FUNC_ALLOW_WRITE
Definition RNA_types.hh:929
int(*)(PointerRNA *ptr, void *data, bool *have_function) StructValidateFunc
Definition RNA_types.hh:985
@ PROP_FLOAT
Definition RNA_types.hh:164
@ PROP_BOOLEAN
Definition RNA_types.hh:162
@ PROP_ENUM
Definition RNA_types.hh:166
@ PROP_INT
Definition RNA_types.hh:163
@ PROP_STRING
Definition RNA_types.hh:165
@ PROP_POINTER
Definition RNA_types.hh:167
@ PROP_COLLECTION
Definition RNA_types.hh:168
#define RNA_ENUM_ITEM_SEPR
Definition RNA_types.hh:676
int(*)(bContext *C, PointerRNA *ptr, FunctionRNA *func, ParameterList *list) StructCallbackFunc
Definition RNA_types.hh:986
void(*)(void *data) StructFreeFunc
Definition RNA_types.hh:990
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
Definition RNA_types.hh:503
@ PROPOVERRIDE_NO_COMPARISON
Definition RNA_types.hh:511
@ PROPOVERRIDE_IGNORE
Definition RNA_types.hh:523
@ PROP_VARIABLES_RENDER_OUTPUT
Definition RNA_types.hh:492
PropertyFlag
Definition RNA_types.hh:300
@ PROP_THICK_WRAP
Definition RNA_types.hh:423
@ PROP_PATH_OUTPUT
Definition RNA_types.hh:451
@ PROP_DYNAMIC
Definition RNA_types.hh:428
@ PROP_ANIMATABLE
Definition RNA_types.hh:319
@ PROP_PATH_SUPPORTS_BLEND_RELATIVE
Definition RNA_types.hh:456
@ PROP_NEVER_UNLINK
Definition RNA_types.hh:384
@ PROP_EDITABLE
Definition RNA_types.hh:306
@ PROP_ENUM_FLAG
Definition RNA_types.hh:404
@ PROP_REGISTER_OPTIONAL
Definition RNA_types.hh:412
@ PROP_ENUM_NO_CONTEXT
Definition RNA_types.hh:430
@ PROP_NEVER_NULL
Definition RNA_types.hh:377
@ PROP_NO_DEG_UPDATE
Definition RNA_types.hh:439
@ PROP_ENUM_NO_TRANSLATE
Definition RNA_types.hh:432
@ PROP_PATH_SUPPORTS_TEMPLATES
Definition RNA_types.hh:470
@ PROP_REGISTER
Definition RNA_types.hh:411
@ PROP_PTR_NO_OWNERSHIP
Definition RNA_types.hh:395
@ PROP_ID_REFCOUNT
Definition RNA_types.hh:364
#define RNA_ENUM_ITEM_HEADING(name, description)
Definition RNA_types.hh:673
@ PROP_DIRECTION
Definition RNA_types.hh:262
@ PROP_XYZ
Definition RNA_types.hh:269
@ PROP_DISTANCE
Definition RNA_types.hh:256
@ PROP_FILENAME
Definition RNA_types.hh:238
@ PROP_COLOR
Definition RNA_types.hh:260
@ PROP_ANGLE
Definition RNA_types.hh:252
@ PROP_EULER
Definition RNA_types.hh:266
@ PROP_NONE
Definition RNA_types.hh:233
@ PROP_DIRPATH
Definition RNA_types.hh:237
@ PROP_FACTOR
Definition RNA_types.hh:251
@ PROP_COLOR_GAMMA
Definition RNA_types.hh:272
@ PROP_TRANSLATION
Definition RNA_types.hh:261
@ PROP_XYZ_LENGTH
Definition RNA_types.hh:270
@ PROP_UNSIGNED
Definition RNA_types.hh:249
@ PROP_FILEPATH
Definition RNA_types.hh:236
#define C
Definition RandGen.cpp:29
#define NC_WINDOW
Definition WM_types.hh:375
#define NC_NODE
Definition WM_types.hh:394
#define ND_OB_ACTIVE
Definition WM_types.hh:440
#define ND_DISPLAY
Definition WM_types.hh:491
#define NC_SCENE
Definition WM_types.hh:378
#define ND_NODES
Definition WM_types.hh:436
#define NA_EDITED
Definition WM_types.hh:584
#define NC_IMAGE
Definition WM_types.hh:384
#define ND_NODE_ASSET_DATA
Definition WM_types.hh:515
#define NA_SELECTED
Definition WM_types.hh:589
iter begin(iter)
BMesh const char void * data
PyObject * self
BPy_StructRNA * depsgraph
StringRefNull copy_string(StringRef str)
void copy_unsafe(char *dst) const
constexpr const char * c_str() const
virtual const int & get_corresponding_output_id(const bNode &input_bnode) const =0
const bNode * get_corresponding_output(const bNodeTree &tree, const bNode &input_bnode) const
#define SELECT
KDTree_3d * tree
#define INT32_MAX
VecBase< float, 2 > float2
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
RenderEngineType * RE_engines_find(const char *idname)
RenderEngine * RE_engine_create(RenderEngineType *type)
void RE_engine_free(RenderEngine *engine)
static char ** types
Definition makesdna.cc:71
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
NodeColorTag node_color_tag(const bNode &node)
Definition node.cc:5019
void node_tree_set_output(bNodeTree &ntree)
Definition node.cc:4469
const bNodeZoneType * zone_type_by_node_type(const int node_type)
StringRefNull node_type_find_alias(StringRefNull alias)
Definition node.cc:2388
bool node_is_parent_and_child(const bNode &parent, const bNode &child)
Definition node.cc:3330
void node_attach_node(bNodeTree &ntree, bNode &node, bNode &parent)
Definition node.cc:3978
bool node_tree_is_registered(const bNodeTree &ntree)
Definition node.cc:2369
bNodeTreeType * node_tree_type_find(StringRef idname)
Definition node.cc:2303
Span< bNodeSocketType * > node_socket_types_get()
Definition node.cc:2457
void node_tag_update_id(bNode &node)
Definition node.cc:4833
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
Definition node.cc:2532
void node_remove_node(Main *bmain, bNodeTree &ntree, bNode &node, bool do_id_user, bool remove_animation=true)
Definition node.cc:4386
void node_internal_links(bNode &node, bNodeLink **r_links, int *r_len)
Definition node.cc:4838
bNode * node_add_node(const bContext *C, bNodeTree &ntree, StringRef idname, std::optional< int > unique_identifier=std::nullopt)
Definition node.cc:3477
bNode * node_get_active(bNodeTree &ntree)
Definition node.cc:4685
void node_remove_socket(bNodeTree &ntree, bNode &node, bNodeSocket &sock)
Definition node.cc:3243
void node_update_asset_metadata(bNodeTree &node_tree)
Definition node.cc:1956
bool node_group_poll(const bNodeTree *nodetree, const bNodeTree *grouptree, const char **r_disabled_hint)
void node_register_type(bNodeType &ntype)
Definition node.cc:2416
void node_remove_link(bNodeTree *ntree, bNodeLink &link)
Definition node.cc:3847
void node_tree_type_add(bNodeTreeType &nt)
Definition node.cc:2340
int node_count_socket_links(const bNodeTree &ntree, const bNodeSocket &sock)
Definition node.cc:4674
bNode * node_find_node_try(bNodeTree &ntree, bNodeSocket &socket)
Definition node.cc:3293
void node_tree_type_free_link(const bNodeTreeType &nt)
Definition node.cc:2363
bool node_set_selected(bNode &node, bool select)
Definition node.cc:4695
bNodeSocket * node_add_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out, StringRefNull idname, StringRefNull identifier, StringRefNull name)
Definition node.cc:2804
bool node_tree_contains_tree(const bNodeTree &tree_to_search_in, const bNodeTree &tree_to_search_for)
Definition node.cc:4663
void node_detach_node(bNodeTree &ntree, bNode &node)
Definition node.cc:3986
bNodeSocketType * node_socket_type_find(StringRef idname)
Definition node.cc:2462
bNodeLink & node_add_link(bNodeTree &ntree, bNode &fromnode, bNodeSocket &fromsock, bNode &tonode, bNodeSocket &tosock)
Definition node.cc:3810
bNodeSocketType * node_socket_type_find_static(int type, int subtype=0)
Definition node.cc:2471
StringRefNull node_socket_type_label(const bNodeSocketType &stype)
Definition node.cc:2514
Span< bNodeTreeType * > node_tree_types_get()
Definition node.cc:2374
void node_unregister_type(bNodeType &ntype)
Definition node.cc:2441
std::optional< StringRefNull > node_static_socket_type(int type, int subtype, std::optional< int > dimensions=std::nullopt)
Definition node.cc:2835
void node_remove_socket_links(bNodeTree &ntree, bNodeSocket &sock)
Definition node.cc:3873
void node_set_active(bNodeTree &ntree, bNode &node)
Definition node.cc:4724
float2 node_dimensions_get(const bNode &node)
Definition node.cc:4827
bNodeType * node_type_find(StringRef idname)
Definition node.cc:2379
int node_socket_link_limit(const bNodeSocket &sock)
Definition node.cc:4753
void node_clear_active(bNodeTree &ntree)
Definition node.cc:4717
void node_unique_name(bNodeTree &ntree, bNode &node)
Definition node.cc:3453
bool node_link_is_hidden(const bNodeLink &link)
Definition node.cc:3882
void node_type_base_custom(bNodeType &ntype, StringRefNull idname, StringRefNull name, StringRefNull enum_name, short nclass)
Definition node.cc:5129
void remove_index(T **items, int *items_num, int *active_index, const int index, void(*destruct_item)(T *))
void clear(T **items, int *items_num, int *active_index, void(*destruct_item)(T *))
void move_index(T *items, const int items_num, const int from_index, const int to_index)
bool generic_attribute_type_supported(const EnumPropertyItem &item)
void set_item_name_and_make_unique(bNode &node, typename Accessor::ItemT &item, const char *value)
Accessor::ItemT * add_item_with_name(bNode &node, const char *name)
Accessor::ItemT * add_item(bNode &node)
bNode * find_node_by_item(bNodeTree &ntree, const typename Accessor::ItemT &item)
Accessor::ItemT * add_item_with_socket_type_and_name(bNodeTree &ntree, bNode &node, const eNodeSocketDatatype socket_type, const char *name, std::optional< int > dimensions=std::nullopt)
bool socket_type_supports_grids(const eNodeSocketDatatype socket_type)
VecBase< float, 2 > float2
void register_node_type_cmp_custom_group(blender::bke::bNodeType *ntype)
void ntreeCompositCryptomatteSyncFromRemove(bNode *node)
void ntreeCompositCryptomatteSyncFromAdd(bNode *node)
void ntreeCompositTagNeedExec(bNode *node)
void ntreeCompositUpdateRLayers(bNodeTree *ntree)
void register_node_type_geo_custom_group(blender::bke::bNodeType *ntype)
const char * name
return ret
void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
const PointerRNA PointerRNA_NULL
void * RNA_struct_blender_type_get(StructRNA *srna)
void RNA_parameter_list_free(ParameterList *parms)
int RNA_struct_ui_icon(const StructRNA *type)
const char * RNA_struct_ui_description(const StructRNA *type)
void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value)
void rna_iterator_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr, void *data, size_t itemsize, int64_t length, bool free_ptr, IteratorSkipFunc skip)
void rna_pointer_create_with_ancestors(const PointerRNA &parent, StructRNA *type, void *data, PointerRNA &r_ptr)
ParameterList * RNA_parameter_list_create(ParameterList *parms, PointerRNA *, FunctionRNA *func)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **r_value)
PointerRNA RNA_pointer_create_with_parent(const PointerRNA &parent, StructRNA *type, void *data)
PointerRNA RNA_id_pointer_create(ID *id)
void rna_def_animdata_common(StructRNA *srna)
const EnumPropertyItem rna_enum_attribute_domain_with_auto_items[]
const EnumPropertyItem rna_enum_attribute_domain_items[]
const EnumPropertyItem rna_enum_attribute_type_items[]
const EnumPropertyItem rna_enum_color_space_convert_default_items[]
Definition rna_color.cc:23
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
void RNA_def_struct_refine_func(StructRNA *srna, const char *refine)
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_path_func(StructRNA *srna, const char *path)
void RNA_def_struct_system_idprops_func(StructRNA *srna, const char *system_idproperties)
FunctionRNA * RNA_def_function_runtime(StructRNA *srna, const char *identifier, CallFunc call)
void RNA_def_parameter_clear_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const char *length, const char *set)
void RNA_def_property_float_default(PropertyRNA *prop, float value)
void RNA_def_function_return(FunctionRNA *func, PropertyRNA *ret)
void RNA_def_property_enum_default(PropertyRNA *prop, int value)
void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_srna(PropertyRNA *prop, const char *type)
void RNA_def_property_collection_funcs(PropertyRNA *prop, const char *begin, const char *next, const char *end, const char *get, const char *length, const char *lookupint, const char *lookupstring, const char *assignint)
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description)
void RNA_def_property_boolean_default(PropertyRNA *prop, bool value)
void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set)
void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg, const char *instance)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_int_default(PropertyRNA *prop, int value)
void RNA_def_property_path_template_type(PropertyRNA *prop, PropertyPathTemplateType path_template_type)
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item)
void RNA_def_struct_sdna(StructRNA *srna, const char *structname)
FunctionRNA * RNA_def_function(StructRNA *srna, const char *identifier, const char *call)
void RNA_def_property_array(PropertyRNA *prop, int length)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
PropertyRNA * RNA_def_pointer(StructOrFunctionRNA *cont_, const char *identifier, const char *type, const char *ui_name, const char *ui_description)
void RNA_def_struct_sdna_from(StructRNA *srna, const char *structname, const char *propname)
void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname, const char *propname, const char *lengthpropname)
void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
void RNA_def_property_enum_funcs(PropertyRNA *prop, const char *get, const char *set, const char *item)
StructRNA * RNA_def_struct_ptr(BlenderRNA *brna, const char *identifier, StructRNA *srnafrom)
void RNA_def_property_enum_bitflag_sdna(PropertyRNA *prop, const char *structname, const char *propname)
StructRNA * RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *from)
void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
void RNA_def_function_flag(FunctionRNA *func, int flag)
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_struct_free_extension(StructRNA *srna, ExtensionRNA *rna_ext)
void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *type_fn, const char *poll)
void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_struct_ui_icon(StructRNA *srna, int icon)
void RNA_def_property_flag_hide_from_ui_workaround(PropertyRNA *prop)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_struct_free(BlenderRNA *brna, StructRNA *srna)
void RNA_def_struct_idprops_func(StructRNA *srna, const char *idproperties)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_function_output(FunctionRNA *, PropertyRNA *ret)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_struct_translation_context(StructRNA *srna, const char *context)
void RNA_def_property_float_array_default(PropertyRNA *prop, const float *array)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
void RNA_def_property_boolean_negative_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_def_property_override_flag(PropertyRNA *prop, PropertyOverrideFlag flag)
void RNA_def_parameter_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
BlenderRNA BLENDER_RNA
std::optional< std::string > rna_Node_ImageUser_path(const PointerRNA *ptr)
const EnumPropertyItem rna_enum_ramp_blend_items[]
const EnumPropertyItem rna_enum_node_socket_type_items[]
const EnumPropertyItem rna_enum_node_socket_structure_type_items[]
static const EnumPropertyItem sh_tex_prop_interpolation_items[]
static void def_closure_output(BlenderRNA *brna, StructRNA *srna)
static void def_sh_tex_sky(BlenderRNA *brna, StructRNA *srna)
static void def_custom_group(BlenderRNA *brna, const char *struct_name, const char *base_name, const char *ui_name, const char *ui_desc, const char *reg_func)
static const EnumPropertyItem node_glossy_items[]
static void def_geo_menu_switch(BlenderRNA *brna, StructRNA *srna)
static void def_geo_foreach_geometry_element_output(BlenderRNA *brna, StructRNA *srna)
static void def_vector_math(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_magic(BlenderRNA *brna, StructRNA *srna)
static void def_cmp_moviedistortion(BlenderRNA *, StructRNA *srna)
static void rna_def_geo_viewer_item(BlenderRNA *brna)
static void def_frame(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem node_subsurface_method_items[]
static const EnumPropertyItem node_script_mode_items[]
static const EnumPropertyItem prop_image_layer_items[]
static void def_sheen(BlenderRNA *, StructRNA *srna)
static void def_sh_tex(BlenderRNA *, StructRNA *srna)
static void def_cmp_mask(BlenderRNA *, StructRNA *srna)
static void def_scatter(BlenderRNA *, StructRNA *srna)
static EnumPropertyItem node_ies_mode_items[]
static void def_cmp_viewer(BlenderRNA *, StructRNA *srna)
static void def_sh_subsurface(BlenderRNA *, StructRNA *srna)
static void rna_def_texture_node(BlenderRNA *brna)
static void rna_def_geo_repeat_item(BlenderRNA *brna)
static void rna_def_closure_output_item(BlenderRNA *brna)
const EnumPropertyItem rna_enum_node_color_tag_items[]
static void def_glossy(BlenderRNA *, StructRNA *srna)
static void def_group_output(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem prop_view_layer_items[]
const EnumPropertyItem rna_enum_node_integer_math_items[]
static void rna_def_node_link(BlenderRNA *brna)
static const EnumPropertyItem rna_node_geometry_curve_handle_type_items[]
static const EnumPropertyItem prop_image_view_items[]
static void rna_def_nodetree(BlenderRNA *brna)
static void def_fn_format_string(BlenderRNA *brna, StructRNA *srna)
static void def_geo_repeat_output(BlenderRNA *brna, StructRNA *srna)
static void rna_def_shader_node(BlenderRNA *brna)
static void rna_def_geo_repeat_items(BlenderRNA *brna)
static const EnumPropertyItem prop_shader_output_target_items[]
static const EnumPropertyItem node_metallic_distribution_items[]
static const EnumPropertyItem node_hair_items[]
static void rna_def_evaluate_closure_output_items(BlenderRNA *brna)
static void rna_def_compositor_node(BlenderRNA *brna)
static void rna_def_evaluate_closure_output_item(BlenderRNA *brna)
static void def_geo_distribute_points_on_faces(BlenderRNA *, StructRNA *srna)
static void rna_def_geo_simulation_state_item(BlenderRNA *brna)
static void def_sh_vect_transform(BlenderRNA *, StructRNA *srna)
static void def_fn_input_string(BlenderRNA *, StructRNA *srna)
static void rna_def_evaluate_closure_input_items(BlenderRNA *brna)
static void def_texture(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_wave(BlenderRNA *brna, StructRNA *srna)
const EnumPropertyItem rna_enum_node_float_to_int_items[]
static void rna_def_geo_foreach_geometry_element_input_item(BlenderRNA *brna)
static void def_cmp_defocus(BlenderRNA *, StructRNA *srna)
static void rna_def_cmp_file_output_item(BlenderRNA *brna)
static void def_sh_normal_map(BlenderRNA *, StructRNA *srna)
static void def_geo_index_switch(BlenderRNA *brna, StructRNA *srna)
static void rna_def_nodetree_link_api(BlenderRNA *brna, PropertyRNA *cprop)
static void def_sh_attribute(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_voronoi(BlenderRNA *brna, StructRNA *srna)
static void rna_def_node(BlenderRNA *brna)
static void def_combine_bundle(BlenderRNA *brna, StructRNA *srna)
static const EnumPropertyItem rna_enum_node_tex_dimensions_items[]
static void def_sh_bevel(BlenderRNA *, StructRNA *srna)
static void def_group(BlenderRNA *, StructRNA *srna)
static void rna_def_geo_viewer(BlenderRNA *brna, StructRNA *srna)
static void def_cmp_colorbalance(BlenderRNA *, StructRNA *srna)
static void def_sh_uvalongstroke(BlenderRNA *, StructRNA *srna)
static void rna_def_geo_foreach_geometry_element_generation_item(BlenderRNA *brna)
static void def_float_to_int(BlenderRNA *, StructRNA *srna)
static void def_common_zone_input(BlenderRNA *, StructRNA *srna)
static void def_fn_input_int(BlenderRNA *, StructRNA *srna)
static void def_fn_input_rotation(BlenderRNA *, StructRNA *srna)
static void rna_def_combine_bundle_items(BlenderRNA *brna)
static void def_refraction(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem node_metallic_fresnel_type_items[]
static void rna_def_geo_gizmo_transform(BlenderRNA *, StructRNA *srna)
static void def_tex_image(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_checker(BlenderRNA *brna, StructRNA *srna)
static void def_float_curve(BlenderRNA *, StructRNA *srna)
static void rna_def_internal_node(BlenderRNA *brna)
static void def_cmp_render_layers(BlenderRNA *, StructRNA *srna)
static void def_cmp_movieclip(BlenderRNA *, StructRNA *srna)
static void def_tex_output(BlenderRNA *, StructRNA *srna)
static void def_sh_output_linestyle(BlenderRNA *brna, StructRNA *srna)
const EnumPropertyItem rna_enum_mapping_type_items[]
static void rna_def_geo_field_to_grid_item(BlenderRNA *brna)
const EnumPropertyItem rna_enum_node_compositor_extension_items[]
static const EnumPropertyItem node_scatter_phase_items[]
static void def_cmp_convert_to_display(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem rna_enum_vector_rotate_type_items[]
static void def_geo_field_to_grid(BlenderRNA *brna, StructRNA *srna)
const EnumPropertyItem rna_enum_node_combsep_color_items[]
static void def_geo_simulation_input(BlenderRNA *brna, StructRNA *srna)
static void rna_def_geo_bake_item(BlenderRNA *brna)
static const EnumPropertyItem node_cryptomatte_layer_name_items[]
static const EnumPropertyItem node_ycc_items[]
static void def_reroute(BlenderRNA *, StructRNA *srna)
static void def_mix_rgb(BlenderRNA *, StructRNA *srna)
static void def_metallic(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem node_refraction_items[]
const EnumPropertyItem rna_enum_node_compositor_interpolation_items[]
static void def_geo_input_collection(BlenderRNA *, StructRNA *srna)
static void rna_def_separate_bundle_item(BlenderRNA *brna)
static void rna_def_function_node(BlenderRNA *brna)
static void def_sh_output_aov(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_white_noise(BlenderRNA *, StructRNA *srna)
static void rna_def_node_instance_hash(BlenderRNA *brna)
static void def_vector_curve(BlenderRNA *, StructRNA *srna)
static void def_sh_output(BlenderRNA *, StructRNA *srna)
static void def_geo_input_normal(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_brick(BlenderRNA *brna, StructRNA *srna)
static const EnumPropertyItem prop_image_extension[]
static void def_geo_sample_index(BlenderRNA *, StructRNA *srna)
static void def_cmp_convert_color_space(BlenderRNA *, StructRNA *srna)
static void def_hair_principled(BlenderRNA *, StructRNA *srna)
static void def_cmp_planetrackdeform(BlenderRNA *, StructRNA *srna)
static void def_fn_random_value(BlenderRNA *, StructRNA *srna)
static void def_cmp_cryptomatte(BlenderRNA *brna, StructRNA *srna)
static void rna_def_geo_foreach_geometry_element_generation_items(BlenderRNA *brna)
static void rna_def_closure_output_items(BlenderRNA *brna)
static void def_separate_bundle(BlenderRNA *brna, StructRNA *srna)
static void def_tex_bricks(BlenderRNA *, StructRNA *srna)
static void rna_def_fn_format_string_item(BlenderRNA *brna)
static void rna_def_geo_simulation_state_items(BlenderRNA *brna)
static void rna_def_combine_bundle_item(BlenderRNA *brna)
static void rna_def_closure_input_item(BlenderRNA *brna)
static void def_sh_vector_displacement(BlenderRNA *, StructRNA *srna)
static void rna_def_geo_capture_attribute(BlenderRNA *brna, StructRNA *srna)
static void rna_def_texture_nodetree(BlenderRNA *brna)
static void def_sh_uvmap(BlenderRNA *, StructRNA *srna)
static void def_time(BlenderRNA *, StructRNA *srna)
static void rna_def_closure_input_items(BlenderRNA *brna)
static void def_cmp_trackpos(BlenderRNA *, StructRNA *srna)
const EnumPropertyItem rna_enum_node_socket_in_out_items[]
void RNA_def_nodetree(BlenderRNA *brna)
static void def_sh_tex_coord(BlenderRNA *, StructRNA *srna)
static void def_fn_input_color(BlenderRNA *, StructRNA *srna)
const EnumPropertyItem rna_enum_node_math_items[]
static void rna_def_shader_nodetree(BlenderRNA *brna)
static void rna_def_geo_foreach_geometry_element_input_items(BlenderRNA *brna)
static void def_cmp_file_output(BlenderRNA *brna, StructRNA *srna)
static void rna_def_cmp_file_output_items(BlenderRNA *brna)
static void rna_def_index_switch_item(BlenderRNA *brna)
static void rna_def_evaluate_closure_input_item(BlenderRNA *brna)
static void rna_def_geo_capture_attribute_item(BlenderRNA *brna)
static void rna_def_geo_menu_switch_item(BlenderRNA *brna)
static void def_sh_radial_tiling(BlenderRNA *, StructRNA *srna)
const EnumPropertyItem rna_enum_node_geometry_curve_handle_side_items[]
const EnumPropertyItem rna_enum_node_socket_data_type_items[]
const EnumPropertyItem rna_enum_node_vec_math_items[]
const EnumPropertyItem rna_enum_geometry_nodes_linear_gizmo_draw_style_items[]
static void def_cmp_keyingscreen(BlenderRNA *, StructRNA *srna)
static void def_node_image_user(BlenderRNA *, StructRNA *srna)
static void def_sh_vector_rotate(BlenderRNA *, StructRNA *srna)
static void def_group_input(BlenderRNA *, StructRNA *)
static void rna_def_geo_capture_attribute_items(BlenderRNA *brna)
static void rna_def_geometry_nodetree(BlenderRNA *brna)
static void def_cmp_combsep_color(BlenderRNA *, StructRNA *srna)
static void def_volume_coefficients(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_ies(BlenderRNA *, StructRNA *srna)
static void def_sh_mapping(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem node_principled_hair_model_items[]
static void def_evaluate_closure(BlenderRNA *brna, StructRNA *srna)
static void rna_def_geo_field_to_grid_items(BlenderRNA *brna)
static void def_sh_script(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem node_principled_hair_parametrization_items[]
const EnumPropertyItem rna_enum_node_geometry_mesh_circle_fill_type_items[]
static void def_cmp_cryptomatte_legacy(BlenderRNA *brna, StructRNA *srna)
static const EnumPropertyItem node_glass_items[]
static void def_clamp(BlenderRNA *, StructRNA *srna)
const EnumPropertyItem rna_enum_node_boolean_math_items[]
static void def_geo_curve_sample(BlenderRNA *, StructRNA *srna)
static void rna_def_geo_bake_items(BlenderRNA *brna)
static void rna_def_geo_index_switch_items(BlenderRNA *brna)
const EnumPropertyItem rna_enum_geometry_nodes_gizmo_color_items[]
static void rna_def_node_item_array_common_functions(StructRNA *srna, const char *item_name, const char *accessor_name)
static void def_cmp_huecorrect(BlenderRNA *, StructRNA *srna)
const EnumPropertyItem rna_enum_node_map_range_items[]
static void def_cmp_stabilize2d(BlenderRNA *, StructRNA *srna)
static void def_geo_simulation_output(BlenderRNA *brna, StructRNA *srna)
static void def_geo_input_material(BlenderRNA *, StructRNA *srna)
static void def_sh_mix(BlenderRNA *, StructRNA *srna)
const EnumPropertyItem rna_enum_node_compare_operation_items[]
static void def_sh_combsep_color(BlenderRNA *, StructRNA *srna)
static void def_hair(BlenderRNA *, StructRNA *srna)
static void def_toon(BlenderRNA *, StructRNA *srna)
static void def_map_range(BlenderRNA *, StructRNA *srna)
static void rna_def_node_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int in_out)
static void def_cmp_cryptomatte_common(BlenderRNA *, StructRNA *srna)
static void rna_def_nodes(BlenderRNA *brna)
static void def_principled(BlenderRNA *, StructRNA *srna)
static void def_geo_foreach_geometry_element_input(BlenderRNA *brna, StructRNA *srna)
static void def_geo_input_object(BlenderRNA *, StructRNA *srna)
static void rna_def_separate_bundle_items(BlenderRNA *brna)
static void def_sh_tex_noise(BlenderRNA *brna, StructRNA *srna)
static void def_geo_curve_handle_type_selection(BlenderRNA *, StructRNA *srna)
static void def_rgb_curve(BlenderRNA *, StructRNA *srna)
static void def_glass(BlenderRNA *, StructRNA *srna)
static void def_sh_displacement(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem rna_enum_mix_data_type_items[]
static void def_sh_ambient_occlusion(BlenderRNA *, StructRNA *srna)
static void rna_def_composite_nodetree(BlenderRNA *brna)
static void rna_def_geometry_node(BlenderRNA *brna)
static void def_fn_input_vector(BlenderRNA *, StructRNA *srna)
static void def_colorramp(BlenderRNA *, StructRNA *srna)
const EnumPropertyItem rna_enum_node_clamp_items[]
static void def_tex_combsep_color(BlenderRNA *, StructRNA *srna)
static void def_geo_image_texture(BlenderRNA *, StructRNA *srna)
static void def_math(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem node_sheen_items[]
static void rna_def_node_item_array_socket_item_common(StructRNA *srna, const char *accessor, const bool add_socket_type, const bool add_vector_socket_dimensions=false)
static void def_sh_bump(BlenderRNA *, StructRNA *srna)
static void def_sh_tangent(BlenderRNA *, StructRNA *srna)
static void def_geo_string_to_curves(BlenderRNA *, StructRNA *srna)
static void def_fn_rotate_euler(BlenderRNA *, StructRNA *srna)
static void rna_def_geo_bake(BlenderRNA *brna, StructRNA *srna)
static void def_fn_input_bool(BlenderRNA *, StructRNA *srna)
static void rna_def_node_item_array_new_with_socket_and_name(StructRNA *srna, const char *item_name, const char *accessor_name)
static void def_geo_repeat_input(BlenderRNA *brna, StructRNA *srna)
static void rna_def_geo_viewer_items(BlenderRNA *brna)
static void def_cmp_cryptomatte_entry(BlenderRNA *brna)
static void def_sh_vertex_color(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_gabor(BlenderRNA *brna, StructRNA *srna)
static void rna_def_geo_foreach_geometry_element_main_items(BlenderRNA *brna)
static void def_sh_tex_gradient(BlenderRNA *brna, StructRNA *srna)
static void def_closure_input(BlenderRNA *brna, StructRNA *srna)
static void def_cmp_image(BlenderRNA *brna, StructRNA *srna)
static void rna_def_geo_foreach_geometry_element_main_item(BlenderRNA *brna)
static const EnumPropertyItem node_principled_distribution_items[]
static void def_geo_curve_set_handle_type(BlenderRNA *, StructRNA *srna)
static void rna_def_fn_format_string_items(BlenderRNA *brna)
static void rna_def_nodetree_nodes_api(BlenderRNA *brna, PropertyRNA *cprop)
static void def_sh_tex_wireframe(BlenderRNA *, StructRNA *srna)
static const EnumPropertyItem node_toon_items[]
static void def_geo_image(BlenderRNA *, StructRNA *srna)
static void def_sh_tex_image(BlenderRNA *brna, StructRNA *srna)
static StructRNA * define_specific_node(BlenderRNA *brna, const char *struct_name, const char *base_name)
static void rna_def_geo_menu_switch_items(BlenderRNA *brna)
static void def_sh_tex_environment(BlenderRNA *brna, StructRNA *srna)
static const EnumPropertyItem space_items[]
const EnumPropertyItem rna_enum_dummy_NULL_items[]
Definition rna_rna.cc:26
static const EnumPropertyItem prop_noise_type[]
const EnumPropertyItem rna_enum_icon_items[]
Definition rna_ui_api.cc:26
#define min(a, b)
Definition sort.cc:36
bool RE_layers_have_name(RenderResult *result)
#define FLT_MAX
Definition stdcycles.h:14
const char * identifier
Definition RNA_types.hh:657
const char * name
Definition RNA_types.hh:661
const char * description
Definition RNA_types.hh:663
StructRNA * srna
StructCallbackFunc call
StructFreeFunc free
Definition DNA_ID.h:414
char name[258]
Definition DNA_ID.h:432
void * first
char type_idname[64]
T * data_as() const
Definition RNA_types.hh:124
ID * owner_id
Definition RNA_types.hh:51
void invalidate()
Definition RNA_types.hh:110
void * data
Definition RNA_types.hh:53
char engine[32]
char name[RE_MAXNAME]
Definition RE_pipeline.h:89
struct RenderLayer * next
Definition RE_pipeline.h:86
struct RenderView * next
Definition RE_pipeline.h:41
char name[64]
Definition RE_pipeline.h:42
struct bNodeTree * compositing_node_group
struct RenderData r
char * filepath
struct bNodeSocket * next
char identifier[64]
char idname[64]
struct GeometryNodeAssetTraits * geometry_node_asset_traits
bNodeTreeTypeHandle * typeinfo
bNodeTreeInterface tree_interface
ListBase nodes
ListBase links
float location[2]
bNodeTypeHandle * typeinfo
int16_t custom1
IDProperty * prop
ListBase inputs
struct ID * id
struct bNode * parent
char name[64]
IDProperty * system_properties
int16_t type_legacy
struct bNode * next
void * storage
char idname[64]
ListBase outputs
int32_t identifier
Compact definition of a node socket.
Definition BKE_node.hh:99
Defines a socket type.
Definition BKE_node.hh:158
eNodeSocketDatatype type
Definition BKE_node.hh:193
void(* update)(bNodeTree *ntree)
Definition BKE_node.hh:522
bool(* poll)(const bContext *C, bNodeTreeType *ntreetype)
Definition BKE_node.hh:509
void(* get_from_context)(const bContext *C, bNodeTreeType *ntreetype, bNodeTree **r_ntree, ID **r_id, ID **r_from)
Definition BKE_node.hh:511
bool(* valid_socket_type)(bNodeTreeType *ntreetype, bNodeSocketType *socket_type)
Definition BKE_node.hh:529
Defines a node type.
Definition BKE_node.hh:238
void(* freefunc_api)(PointerRNA *ptr)
Definition BKE_node.hh:303
std::string ui_description
Definition BKE_node.hh:244
bool(* poll_instance)(const bNode *node, const bNodeTree *nodetree, const char **r_disabled_hint)
Definition BKE_node.hh:328
bNodeSocketTemplate * inputs
Definition BKE_node.hh:254
void(* labelfunc)(const bNodeTree *ntree, const bNode *node, char *label, int label_maxncpy)
Definition BKE_node.hh:270
void(* draw_buttons_ex)(uiLayout *, bContext *C, PointerRNA *ptr)
Definition BKE_node.hh:261
bNodeSocketTemplate * outputs
Definition BKE_node.hh:254
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
Definition BKE_node.hh:259
bool(* insert_link)(NodeInsertLinkParams &params)
Definition BKE_node.hh:333
bool(* poll)(const bNodeType *ntype, const bNodeTree *nodetree, const char **r_disabled_hint)
Definition BKE_node.hh:321
void(* copyfunc_api)(PointerRNA *ptr, const bNode *src_node)
Definition BKE_node.hh:304
void(* free_self)(bNodeType *ntype)
Definition BKE_node.hh:335
void(* updatefunc)(bNodeTree *ntree, bNode *node)
Definition BKE_node.hh:281
void(* initfunc_api)(const bContext *C, PointerRNA *ptr)
Definition BKE_node.hh:302
float x
float y
i
Definition text_draw.cc:230
max
Definition text_draw.cc:251
uint len
#define N_(msgid)
void WM_main_add_notifier(uint type, void *reference)
PointerRNA * ptr
Definition wm_files.cc:4238
uint8_t flag
Definition wm_window.cc:145