Blender V4.5
shader_nodes.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#include "graph/node.h"
8#include "scene/image.h"
10
11#include "util/array.h"
12#include "util/string.h"
13#include "util/unique_ptr.h"
14
16
17class ImageManager;
18class LightManager;
19class Scene;
20class Shader;
21
22/* Texture Mapping */
23
25 public:
28 bool skip();
29 void compile(SVMCompiler &compiler, const int offset_in, const int offset_out);
30 int compile(SVMCompiler &compiler, ShaderInput *vector_in);
31 void compile(OSLCompiler &compiler);
32
33 int compile_begin(SVMCompiler &compiler, ShaderInput *vector_in);
34 void compile_end(SVMCompiler &compiler, ShaderInput *vector_in, const int vector_offset);
35
39
42
43 enum Type { POINT = 0, TEXTURE = 1, VECTOR = 2, NORMAL = 3 };
45
46 enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 };
48
51};
52
53/* Nodes */
54
71
72/* Any node which uses image manager's slot should be a subclass of this one. */
74 public:
75 explicit ImageSlotTextureNode(const NodeType *node_type) : TextureNode(node_type)
76 {
78 }
79
80 bool equals(const ShaderNode &other) override
81 {
82 const ImageSlotTextureNode &other_node = (const ImageSlotTextureNode &)other;
83 return TextureNode::equals(other) && handle == other_node.handle;
84 }
85
87};
88
90 public:
92 ShaderNode *clone(ShaderGraph *graph) const override;
93 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
95 {
96 return true;
97 }
98
99 bool equals(const ShaderNode &other) override
100 {
101 const ImageTextureNode &other_node = (const ImageTextureNode &)other;
102 return ImageSlotTextureNode::equals(other) && animated == other_node.animated;
103 }
104
106
107 /* Parameters. */
108 NODE_SOCKET_API(ustring, filename)
109 NODE_SOCKET_API(ustring, colorspace)
112 NODE_SOCKET_API(InterpolationType, interpolation)
114 NODE_SOCKET_API(float, projection_blend)
115 NODE_SOCKET_API(bool, animated)
118
119 protected:
120 void cull_tiles(Scene *scene, ShaderGraph *graph);
121};
122
124 public:
126 ShaderNode *clone(ShaderGraph *graph) const override;
127 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
129 {
130 return true;
131 }
132
133 bool equals(const ShaderNode &other) override
134 {
135 const EnvironmentTextureNode &other_node = (const EnvironmentTextureNode &)other;
136 return ImageSlotTextureNode::equals(other) && animated == other_node.animated;
137 }
138
140
141 /* Parameters. */
142 NODE_SOCKET_API(ustring, filename)
143 NODE_SOCKET_API(ustring, colorspace)
146 NODE_SOCKET_API(InterpolationType, interpolation)
147 NODE_SOCKET_API(bool, animated)
149};
150
152 public:
154
156 NODE_SOCKET_API(float3, sun_direction)
157 NODE_SOCKET_API(float, turbidity)
158 NODE_SOCKET_API(float, ground_albedo)
159 NODE_SOCKET_API(bool, sun_disc)
160 NODE_SOCKET_API(float, sun_size)
161 NODE_SOCKET_API(float, sun_intensity)
162 NODE_SOCKET_API(float, sun_elevation)
163 NODE_SOCKET_API(float, sun_rotation)
164 NODE_SOCKET_API(float, altitude)
165 NODE_SOCKET_API(float, air_density)
166 NODE_SOCKET_API(float, dust_density)
167 NODE_SOCKET_API(float, ozone_density)
170
171 void simplify_settings(Scene *scene) override;
172
174 {
175 /* Clamping for numerical precision. */
176 return fmaxf(sun_size, 0.0005f);
177 }
178
180};
181
182class OutputNode : public ShaderNode {
183 public:
185
186 NODE_SOCKET_API(Node *, surface)
187 NODE_SOCKET_API(Node *, volume)
188 NODE_SOCKET_API(float3, displacement)
189 NODE_SOCKET_API(float3, normal)
190
191 /* Don't allow output node de-duplication. */
192 bool equals(const ShaderNode & /*other*/) override
193 {
194 return false;
195 }
196};
197
198class OutputAOVNode : public ShaderNode {
199 public:
201 void simplify_settings(Scene *scene) override;
202
203 NODE_SOCKET_API(float, value)
204 NODE_SOCKET_API(float3, color)
205
206 NODE_SOCKET_API(ustring, name)
207
208 /* Don't allow output node de-duplication. */
209 bool equals(const ShaderNode & /*other*/) override
210 {
211 return false;
212 }
213
216};
217
225
227 public:
229
230 NODE_SOCKET_API(int, dimensions)
232 NODE_SOCKET_API(bool, use_normalize)
233 NODE_SOCKET_API(float, w)
234 NODE_SOCKET_API(float, scale)
235 NODE_SOCKET_API(float, detail)
236 NODE_SOCKET_API(float, roughness)
237 NODE_SOCKET_API(float, lacunarity)
238 NODE_SOCKET_API(float, offset)
239 NODE_SOCKET_API(float, gain)
240 NODE_SOCKET_API(float, distortion)
242};
243
245 public:
247
250 NODE_SOCKET_API(float, scale)
251 NODE_SOCKET_API(float, frequency)
252 NODE_SOCKET_API(float, anisotropy)
253 NODE_SOCKET_API(float, orientation_2d)
254 NODE_SOCKET_API(float3, orientation_3d)
255};
256
258 public:
260
261 int get_feature() override
262 {
264 if (dimensions == 4) {
266 }
267 else if (dimensions >= 2 && feature == NODE_VORONOI_SMOOTH_F1) {
269 }
270 return result;
271 }
272
273 NODE_SOCKET_API(int, dimensions)
276 NODE_SOCKET_API(bool, use_normalize)
277 NODE_SOCKET_API(float, w)
278 NODE_SOCKET_API(float, scale)
279 NODE_SOCKET_API(float, detail)
280 NODE_SOCKET_API(float, roughness)
281 NODE_SOCKET_API(float, lacunarity)
282 NODE_SOCKET_API(float, exponent)
283 NODE_SOCKET_API(float, smoothness)
284 NODE_SOCKET_API(float, randomness)
286};
287
289 public:
291
292 NODE_SOCKET_API(NodeWaveType, wave_type)
296
297 NODE_SOCKET_API(float, scale)
298 NODE_SOCKET_API(float, distortion)
299 NODE_SOCKET_API(float, detail)
300 NODE_SOCKET_API(float, detail_scale)
301 NODE_SOCKET_API(float, detail_roughness)
302 NODE_SOCKET_API(float, phase)
304};
305
307 public:
309
310 NODE_SOCKET_API(int, depth)
312 NODE_SOCKET_API(float, scale)
313 NODE_SOCKET_API(float, distortion)
314};
315
317 public:
319
321 NODE_SOCKET_API(float3, color1)
322 NODE_SOCKET_API(float3, color2)
323 NODE_SOCKET_API(float, scale)
324};
325
327 public:
329
330 NODE_SOCKET_API(float, offset)
331 NODE_SOCKET_API(float, squash)
332 NODE_SOCKET_API(int, offset_frequency)
333 NODE_SOCKET_API(int, squash_frequency)
334
335 NODE_SOCKET_API(float3, color1)
336 NODE_SOCKET_API(float3, color2)
337 NODE_SOCKET_API(float3, mortar)
338 NODE_SOCKET_API(float, scale)
339 NODE_SOCKET_API(float, mortar_size)
340 NODE_SOCKET_API(float, mortar_smooth)
341 NODE_SOCKET_API(float, bias)
342 NODE_SOCKET_API(float, brick_width)
343 NODE_SOCKET_API(float, row_height)
345};
346
348 public:
350
352 ShaderNode *clone(ShaderGraph *graph) const override;
353 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
355 {
356 return true;
357 }
358
359 bool has_spatial_varying() override
360 {
361 return true;
362 }
363
364 /* Parameters. */
365 NODE_SOCKET_API(ustring, filename)
367 NODE_SOCKET_API(InterpolationType, interpolation)
370
371 /* Runtime. */
373
375
376 bool equals(const ShaderNode &other) override
377 {
378 const PointDensityTextureNode &other_node = (const PointDensityTextureNode &)other;
379 return ShaderNode::equals(other) && handle == other_node.handle;
380 }
381};
382
383class IESLightNode : public TextureNode {
384 public:
386
387 ~IESLightNode() override;
388 ShaderNode *clone(ShaderGraph *graph) const override;
389
390 NODE_SOCKET_API(ustring, filename)
391 NODE_SOCKET_API(ustring, ies)
392
393 NODE_SOCKET_API(float, strength)
395
396 private:
397 LightManager *light_manager;
398 int slot;
399
400 void get_slot();
401};
402
404 public:
406
407 NODE_SOCKET_API(int, dimensions)
409 NODE_SOCKET_API(float, w)
410};
411
412class MappingNode : public ShaderNode {
413 public:
415 void constant_fold(const ConstantFolder &folder) override;
416
418 NODE_SOCKET_API(float3, location)
419 NODE_SOCKET_API(float3, rotation)
420 NODE_SOCKET_API(float3, scale)
421 NODE_SOCKET_API(NodeMappingType, mapping_type)
422};
423
424class RGBToBWNode : public ShaderNode {
425 public:
427 void constant_fold(const ConstantFolder &folder) override;
428
429 NODE_SOCKET_API(float3, color)
430};
431
432class ConvertNode : public ShaderNode {
433 public:
434 ConvertNode(SocketType::Type from, SocketType::Type to, bool autoconvert = false);
435 ConvertNode(const ConvertNode &other);
437
438 void constant_fold(const ConstantFolder &folder) override;
439
440 private:
441 SocketType::Type from, to;
442
443 union {
450 };
451 ustring value_string;
452
453 static const int MAX_TYPE = 13;
454 static bool register_types();
455 static unique_ptr<Node> create(const NodeType *type);
456 static const NodeType *node_types[MAX_TYPE][MAX_TYPE];
457 static bool initialized;
458};
459
460class BsdfBaseNode : public ShaderNode {
461 public:
462 BsdfBaseNode(const NodeType *node_type);
463
464 bool has_spatial_varying() override
465 {
466 return true;
467 }
469 {
470 return closure;
471 }
472 bool has_bump() override;
473
474 bool equals(const ShaderNode & /*other*/) override
475 {
476 /* TODO(sergey): With some care BSDF nodes can be de-duplicated. */
477 return false;
478 }
479
480 int get_feature() override
481 {
483 }
484
485 protected:
487};
488
489class BsdfNode : public BsdfBaseNode {
490 public:
491 explicit BsdfNode(const NodeType *node_type);
493
494 void compile(SVMCompiler &compiler,
495 ShaderInput *bsdf_y,
496 ShaderInput *bsdf_z,
497 ShaderInput *data_y = nullptr,
498 ShaderInput *data_z = nullptr,
499 ShaderInput *data_w = nullptr);
500
501 NODE_SOCKET_API(float3, color)
502 NODE_SOCKET_API(float3, normal)
503 NODE_SOCKET_API(float, surface_mix_weight)
504};
505
506class DiffuseBsdfNode : public BsdfNode {
507 public:
509
510 NODE_SOCKET_API(float, roughness)
511};
512
513/* Disney principled BRDF */
515 public:
517
518 bool has_surface_bssrdf() override;
519 bool has_bssrdf_bump() override;
520 void simplify_settings(Scene *scene) override;
521
522 NODE_SOCKET_API(float3, base_color)
523 NODE_SOCKET_API(float, metallic)
524 NODE_SOCKET_API(float, roughness)
525 NODE_SOCKET_API(float, ior)
526 NODE_SOCKET_API(float3, normal)
527 NODE_SOCKET_API(float, alpha)
528 NODE_SOCKET_API(float, diffuse_roughness)
529 NODE_SOCKET_API(ClosureType, subsurface_method)
530 NODE_SOCKET_API(float, subsurface_weight)
531 NODE_SOCKET_API(float3, subsurface_radius)
532 NODE_SOCKET_API(float, subsurface_scale)
533 NODE_SOCKET_API(float, subsurface_ior)
534 NODE_SOCKET_API(float, subsurface_anisotropy)
535 NODE_SOCKET_API(ClosureType, distribution)
536 NODE_SOCKET_API(float, specular_ior_level)
537 NODE_SOCKET_API(float3, specular_tint)
538 NODE_SOCKET_API(float, anisotropic)
539 NODE_SOCKET_API(float, anisotropic_rotation)
540 NODE_SOCKET_API(float3, tangent)
541 NODE_SOCKET_API(float, transmission_weight)
542 NODE_SOCKET_API(float, sheen_weight)
543 NODE_SOCKET_API(float, sheen_roughness)
544 NODE_SOCKET_API(float3, sheen_tint)
545 NODE_SOCKET_API(float, coat_weight)
546 NODE_SOCKET_API(float, coat_roughness)
547 NODE_SOCKET_API(float, coat_ior)
548 NODE_SOCKET_API(float3, coat_tint)
549 NODE_SOCKET_API(float3, coat_normal)
550 NODE_SOCKET_API(float3, emission_color)
551 NODE_SOCKET_API(float, emission_strength)
552 NODE_SOCKET_API(float, surface_mix_weight)
553 NODE_SOCKET_API(float, thin_film_thickness)
554 NODE_SOCKET_API(float, thin_film_ior)
555
556 public:
557 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
559 {
560 return true;
561 }
562 bool has_surface_transparent() override;
563 bool has_surface_emission() override;
564};
565
570
572 public:
574
576 {
577 return true;
578 }
579};
580
582 public:
584
585 NODE_SOCKET_API(float3, position)
586 NODE_SOCKET_API(float3, direction)
587
589 {
590 return true;
591 }
592};
593
594class SheenBsdfNode : public BsdfNode {
595 public:
597
598 NODE_SOCKET_API(float, roughness)
599 NODE_SOCKET_API(ClosureType, distribution)
600
602 {
603 return distribution;
604 }
605};
606
608 public:
610
611 void simplify_settings(Scene *scene) override;
613 {
614 return closure;
615 }
616
617 NODE_SOCKET_API(float3, edge_tint)
620 NODE_SOCKET_API(float3, tangent)
621 NODE_SOCKET_API(float, roughness)
622 NODE_SOCKET_API(float, anisotropy)
623 NODE_SOCKET_API(float, rotation)
624 NODE_SOCKET_API(ClosureType, distribution)
625 NODE_SOCKET_API(ClosureType, fresnel_type)
626
627 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
629 {
630 return true;
631 }
632
633 bool is_isotropic();
634};
635
636class GlossyBsdfNode : public BsdfNode {
637 public:
639
640 void simplify_settings(Scene *scene) override;
642 {
643 return distribution;
644 }
645
646 NODE_SOCKET_API(float3, tangent)
647 NODE_SOCKET_API(float, roughness)
648 NODE_SOCKET_API(float, anisotropy)
649 NODE_SOCKET_API(float, rotation)
650 NODE_SOCKET_API(ClosureType, distribution)
651
652 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
654 {
655 return true;
656 }
657
658 bool is_isotropic();
659};
660
661class GlassBsdfNode : public BsdfNode {
662 public:
664
666 {
667 return distribution;
668 }
669
670 NODE_SOCKET_API(float, roughness)
671 NODE_SOCKET_API(float, IOR)
672 NODE_SOCKET_API(ClosureType, distribution)
673};
674
676 public:
678
680 {
681 return distribution;
682 }
683
684 NODE_SOCKET_API(float, roughness)
685 NODE_SOCKET_API(float, IOR)
686 NODE_SOCKET_API(ClosureType, distribution)
687};
688
689class ToonBsdfNode : public BsdfNode {
690 public:
692
693 NODE_SOCKET_API(float, smooth)
694 NODE_SOCKET_API(float, size)
695 NODE_SOCKET_API(ClosureType, component)
696};
697
699 public:
701 bool has_surface_bssrdf() override
702 {
703 return true;
704 }
705 bool has_bssrdf_bump() override;
707 {
708 return method;
709 }
710
711 NODE_SOCKET_API(float, scale)
712 NODE_SOCKET_API(float3, radius)
713 NODE_SOCKET_API(float, subsurface_ior)
714 NODE_SOCKET_API(float, subsurface_roughness)
715 NODE_SOCKET_API(float, subsurface_anisotropy)
717};
718
719class EmissionNode : public ShaderNode {
720 public:
722 void constant_fold(const ConstantFolder &folder) override;
723
724 bool has_surface_emission() override
725 {
726 return true;
727 }
728 bool has_volume_support() override
729 {
730 return true;
731 }
732
733 int get_feature() override
734 {
736 }
737
738 NODE_SOCKET_API(float3, color)
739 NODE_SOCKET_API(float, strength)
740 NODE_SOCKET_API(float, surface_mix_weight)
741 NODE_SOCKET_API(float, volume_mix_weight)
742
744};
745
747 public:
749 void constant_fold(const ConstantFolder &folder) override;
750
751 int get_feature() override
752 {
754 }
755
756 NODE_SOCKET_API(float3, color)
757 NODE_SOCKET_API(float, strength)
758 NODE_SOCKET_API(float, surface_mix_weight)
759};
760
761class HoldoutNode : public ShaderNode {
762 public:
765 {
766 return CLOSURE_HOLDOUT_ID;
767 }
768
769 NODE_SOCKET_API(float, surface_mix_weight)
770 NODE_SOCKET_API(float, volume_mix_weight)
771};
772
774 public:
776
777 bool has_spatial_varying() override
778 {
779 return true;
780 }
781 int get_feature() override
782 {
784 }
785
786 NODE_SOCKET_API(float3, color)
788 NODE_SOCKET_API(float3, normal)
789 NODE_SOCKET_API(int, samples)
790
791 NODE_SOCKET_API(bool, only_local)
792 NODE_SOCKET_API(bool, inside)
793};
794
795class VolumeNode : public ShaderNode {
796 public:
797 VolumeNode(const NodeType *node_type);
799
800 void compile(SVMCompiler &compiler,
801 ShaderInput *density,
802 ShaderInput *param1 = nullptr,
803 ShaderInput *param2 = nullptr);
804 int get_feature() override
805 {
807 }
809 {
810 return closure;
811 }
812 bool has_volume_support() override
813 {
814 return true;
815 }
816
817 NODE_SOCKET_API(float3, color)
818 NODE_SOCKET_API(float, density)
819 NODE_SOCKET_API(float, volume_mix_weight)
820
821 protected:
823
824 public:
825 bool equals(const ShaderNode & /*other*/) override
826 {
827 /* TODO(sergey): With some care Volume nodes can be de-duplicated. */
828 return false;
829 }
830};
831
836
838 public:
839 ScatterVolumeNode(const NodeType *node_type);
841
842 NODE_SOCKET_API(float, anisotropy)
843 NODE_SOCKET_API(float, IOR)
844 NODE_SOCKET_API(float, backscatter)
845 NODE_SOCKET_API(float, alpha)
846 NODE_SOCKET_API(float, diameter)
848};
849
851 public:
853
854 NODE_SOCKET_API(float3, scatter_coeffs)
855 NODE_SOCKET_API(float3, absorption_coeffs)
856 NODE_SOCKET_API(float3, emission_coeffs)
857};
858
860 public:
862 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
864 {
865 return true;
866 }
867
868 NODE_SOCKET_API(ustring, density_attribute)
869 NODE_SOCKET_API(ustring, color_attribute)
870 NODE_SOCKET_API(ustring, temperature_attribute)
871
872 NODE_SOCKET_API(float, anisotropy)
873 NODE_SOCKET_API(float3, absorption_color)
874 NODE_SOCKET_API(float, emission_strength)
875 NODE_SOCKET_API(float3, emission_color)
876 NODE_SOCKET_API(float, blackbody_intensity)
877 NODE_SOCKET_API(float3, blackbody_tint)
878 NODE_SOCKET_API(float, temperature)
879};
880
881/* Interface between the I/O sockets and the SVM/OSL backend. */
883 public:
885 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
886
887 /* Longitudinal roughness. */
888 NODE_SOCKET_API(float, roughness)
889 /* Azimuthal roughness. */
890 NODE_SOCKET_API(float, radial_roughness)
891 /* Randomization factor for roughnesses. */
892 NODE_SOCKET_API(float, random_roughness)
893 /* Longitudinal roughness factor for only the diffuse bounce (shiny undercoat). */
894 NODE_SOCKET_API(float, coat)
895 /* Index of reflection. */
896 NODE_SOCKET_API(float, ior)
897 /* Cuticle tilt angle. */
898 NODE_SOCKET_API(float, offset)
899 /* Direct coloring's color. */
900 NODE_SOCKET_API(float3, color)
901 /* Melanin concentration. */
902 NODE_SOCKET_API(float, melanin)
903 /* Melanin redness ratio. */
904 NODE_SOCKET_API(float, melanin_redness)
905 /* Dye color. */
907 /* Randomization factor for melanin quantities. */
908 NODE_SOCKET_API(float, random_color)
909 /* Absorption coefficient (unfiltered). */
910 NODE_SOCKET_API(float3, absorption_coefficient)
911
912 /* Aspect Ratio. */
913 NODE_SOCKET_API(float, aspect_ratio)
914
915 /* Optional modulation factors for the lobes. */
916 NODE_SOCKET_API(float, R)
917 NODE_SOCKET_API(float, TT)
918 NODE_SOCKET_API(float, TRT)
919
920 /* Weight for mix shader. */
921 NODE_SOCKET_API(float, surface_mix_weight)
922 /* If linked, here will be the given random number. */
923 NODE_SOCKET_API(float, random)
924 /* Selected coloring parametrization. */
926 /* Selected scattering model (chiang/huang). */
928
929 int get_feature() override
930 {
931 return ccl::BsdfBaseNode::get_feature() | KERNEL_FEATURE_NODE_PRINCIPLED_HAIR;
932 }
933
934 bool has_surface_transparent() override;
935};
936
937class HairBsdfNode : public BsdfNode {
938 public:
941 {
942 return component;
943 }
944
945 NODE_SOCKET_API(ClosureType, component)
946 NODE_SOCKET_API(float, offset)
947 NODE_SOCKET_API(float, roughness_u)
948 NODE_SOCKET_API(float, roughness_v)
949 NODE_SOCKET_API(float3, tangent)
950};
951
952class GeometryNode : public ShaderNode {
953 public:
955 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
957 {
958 return true;
959 }
960 bool has_spatial_varying() override
961 {
962 return true;
963 }
965};
966
968 public:
970 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
972 {
973 return true;
974 }
975 bool has_spatial_varying() override
976 {
977 return true;
978 }
979
980 NODE_SOCKET_API(bool, from_dupli)
981 NODE_SOCKET_API(bool, use_transform)
983};
984
985class UVMapNode : public ShaderNode {
986 public:
988 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
990 {
991 return true;
992 }
993 bool has_spatial_varying() override
994 {
995 return true;
996 }
997
998 NODE_SOCKET_API(ustring, attribute)
999 NODE_SOCKET_API(bool, from_dupli)
1000};
1001
1003 public:
1005};
1006
1008 public:
1010 bool has_spatial_varying() override
1011 {
1012 return true;
1013 }
1014
1015 NODE_SOCKET_API(float, strength)
1016 NODE_SOCKET_API(float, smooth)
1017};
1018
1020 public:
1022};
1023
1025 public:
1027 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1029 {
1030 return true;
1031 }
1032};
1033
1034class HairInfoNode : public ShaderNode {
1035 public:
1037
1038 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1040 {
1041 return true;
1042 }
1043 bool has_spatial_varying() override
1044 {
1045 return true;
1046 }
1047};
1048
1050 public:
1052
1053 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1055 {
1056 return true;
1057 }
1058 bool has_spatial_varying() override
1059 {
1060 return true;
1061 }
1062};
1063
1065 public:
1067 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1069 {
1070 return true;
1071 }
1072 bool has_spatial_varying() override
1073 {
1074 return true;
1075 }
1076 void expand(ShaderGraph *graph) override;
1077};
1078
1080 public:
1082 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1084 {
1085 return true;
1086 }
1087 bool has_spatial_varying() override
1088 {
1089 return true;
1090 }
1091
1092 NODE_SOCKET_API(ustring, layer_name)
1093};
1094
1095class ValueNode : public ShaderNode {
1096 public:
1098
1099 void constant_fold(const ConstantFolder &folder) override;
1100
1101 NODE_SOCKET_API(float, value)
1102};
1103
1104class ColorNode : public ShaderNode {
1105 public:
1107
1108 void constant_fold(const ConstantFolder &folder) override;
1109
1110 NODE_SOCKET_API(float3, value)
1111};
1112
1114 public:
1116 void constant_fold(const ConstantFolder &folder) override;
1117};
1118
1120 public:
1122 void constant_fold(const ConstantFolder &folder) override;
1123
1124 NODE_SOCKET_API(float, fac)
1125};
1126
1128 public:
1130
1131 NODE_SOCKET_API(float, weight)
1132 NODE_SOCKET_API(float, fac)
1133};
1134
1135class InvertNode : public ShaderNode {
1136 public:
1138 void constant_fold(const ConstantFolder &folder) override;
1139
1140 NODE_SOCKET_API(float, fac)
1141 NODE_SOCKET_API(float3, color)
1142};
1143
1144class MixNode : public ShaderNode {
1145 public:
1147 void constant_fold(const ConstantFolder &folder) override;
1148
1149 NODE_SOCKET_API(NodeMix, mix_type)
1150 NODE_SOCKET_API(bool, use_clamp)
1151 NODE_SOCKET_API(float3, color1)
1152 NODE_SOCKET_API(float3, color2)
1153 NODE_SOCKET_API(float, fac)
1154};
1155
1156class MixColorNode : public ShaderNode {
1157 public:
1159 void constant_fold(const ConstantFolder &folder) override;
1160
1163 NODE_SOCKET_API(float, fac)
1164 NODE_SOCKET_API(bool, use_clamp)
1165 NODE_SOCKET_API(bool, use_clamp_result)
1166 NODE_SOCKET_API(NodeMix, blend_type)
1167};
1168
1169class MixFloatNode : public ShaderNode {
1170 public:
1172 void constant_fold(const ConstantFolder &folder) override;
1173
1174 NODE_SOCKET_API(float, a)
1175 NODE_SOCKET_API(float, b)
1176 NODE_SOCKET_API(float, fac)
1177 NODE_SOCKET_API(bool, use_clamp)
1178};
1179
1181 public:
1183 void constant_fold(const ConstantFolder &folder) override;
1184
1187 NODE_SOCKET_API(float, fac)
1188 NODE_SOCKET_API(bool, use_clamp)
1189};
1190
1192 public:
1194 void constant_fold(const ConstantFolder &folder) override;
1195
1199 NODE_SOCKET_API(bool, use_clamp)
1200};
1201
1203 public:
1205 void constant_fold(const ConstantFolder &folder) override;
1206
1208 NODE_SOCKET_API(float, r)
1209 NODE_SOCKET_API(float, g)
1210 NODE_SOCKET_API(float, b)
1211};
1212
1214 public:
1216 void constant_fold(const ConstantFolder &folder) override;
1217
1218 NODE_SOCKET_API(float, r)
1219 NODE_SOCKET_API(float, g)
1220 NODE_SOCKET_API(float, b)
1221};
1222
1224 public:
1226 void constant_fold(const ConstantFolder &folder) override;
1227
1228 NODE_SOCKET_API(float, h)
1229 NODE_SOCKET_API(float, s)
1230 NODE_SOCKET_API(float, v)
1231};
1232
1234 public:
1236 void constant_fold(const ConstantFolder &folder) override;
1237
1238 NODE_SOCKET_API(float, x)
1239 NODE_SOCKET_API(float, y)
1240 NODE_SOCKET_API(float, z)
1241};
1242
1243class GammaNode : public ShaderNode {
1244 public:
1246 void constant_fold(const ConstantFolder &folder) override;
1247
1248 NODE_SOCKET_API(float3, color)
1249 NODE_SOCKET_API(float, gamma)
1250};
1251
1253 public:
1255 void constant_fold(const ConstantFolder &folder) override;
1256
1257 NODE_SOCKET_API(float3, color)
1258 NODE_SOCKET_API(float, bright)
1259 NODE_SOCKET_API(float, contrast)
1260};
1261
1263 public:
1265 void constant_fold(const ConstantFolder &folder) override;
1266
1268 NODE_SOCKET_API(float3, color)
1269};
1270
1272 public:
1274 void constant_fold(const ConstantFolder &folder) override;
1275
1276 NODE_SOCKET_API(float3, color)
1277};
1278
1280 public:
1282 void constant_fold(const ConstantFolder &folder) override;
1283
1284 NODE_SOCKET_API(float3, color)
1285};
1286
1288 public:
1290 void constant_fold(const ConstantFolder &folder) override;
1291
1293};
1294
1295class HSVNode : public ShaderNode {
1296 public:
1298
1299 NODE_SOCKET_API(float, hue)
1300 NODE_SOCKET_API(float, saturation)
1301 NODE_SOCKET_API(float, value)
1302 NODE_SOCKET_API(float, fac)
1303 NODE_SOCKET_API(float3, color)
1304};
1305
1307 public:
1309 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1311 {
1312 return true;
1313 }
1314 bool has_spatial_varying() override
1315 {
1316 return true;
1317 }
1318
1319 NODE_SOCKET_API(ustring, attribute)
1320};
1321
1322class CameraNode : public ShaderNode {
1323 public:
1325 bool has_spatial_varying() override
1326 {
1327 return true;
1328 }
1329};
1330
1331class FresnelNode : public ShaderNode {
1332 public:
1334 bool has_spatial_varying() override
1335 {
1336 return true;
1337 }
1338
1339 NODE_SOCKET_API(float3, normal)
1340 NODE_SOCKET_API(float, IOR)
1341};
1342
1344 public:
1346 bool has_spatial_varying() override
1347 {
1348 return true;
1349 }
1350
1351 NODE_SOCKET_API(float3, normal)
1352 NODE_SOCKET_API(float, blend)
1353};
1354
1356 public:
1358 bool has_spatial_varying() override
1359 {
1360 return true;
1361 }
1362
1363 NODE_SOCKET_API(float, size)
1364 NODE_SOCKET_API(bool, use_pixel_size)
1365};
1366
1368 public:
1370
1371 NODE_SOCKET_API(float, wavelength)
1372};
1373
1375 public:
1377 void constant_fold(const ConstantFolder &folder) override;
1378
1379 NODE_SOCKET_API(float, temperature)
1380};
1381
1383 public:
1385 void expand(ShaderGraph *graph) override;
1386
1388 NODE_SOCKET_API(float3, from_min)
1389 NODE_SOCKET_API(float3, from_max)
1390 NODE_SOCKET_API(float3, to_min)
1391 NODE_SOCKET_API(float3, to_max)
1394 NODE_SOCKET_API(bool, use_clamp)
1395};
1396
1397class MapRangeNode : public ShaderNode {
1398 public:
1400 void expand(ShaderGraph *graph) override;
1401
1402 NODE_SOCKET_API(float, value)
1403 NODE_SOCKET_API(float, from_min)
1404 NODE_SOCKET_API(float, from_max)
1405 NODE_SOCKET_API(float, to_min)
1406 NODE_SOCKET_API(float, to_max)
1407 NODE_SOCKET_API(float, steps)
1409 NODE_SOCKET_API(bool, clamp)
1410};
1411
1412class ClampNode : public ShaderNode {
1413 public:
1415 void constant_fold(const ConstantFolder &folder) override;
1416 NODE_SOCKET_API(float, value)
1417 NODE_SOCKET_API(float, min)
1418 NODE_SOCKET_API(float, max)
1419 NODE_SOCKET_API(NodeClampType, clamp_type)
1420};
1421
1422class MathNode : public ShaderNode {
1423 public:
1425 void expand(ShaderGraph *graph) override;
1426 void constant_fold(const ConstantFolder &folder) override;
1427
1428 NODE_SOCKET_API(float, value1)
1429 NODE_SOCKET_API(float, value2)
1430 NODE_SOCKET_API(float, value3)
1431 NODE_SOCKET_API(NodeMathType, math_type)
1432 NODE_SOCKET_API(bool, use_clamp)
1433};
1434
1435class NormalNode : public ShaderNode {
1436 public:
1438
1439 NODE_SOCKET_API(float3, direction)
1440 NODE_SOCKET_API(float3, normal)
1441};
1442
1444 public:
1446 void constant_fold(const ConstantFolder &folder) override;
1447
1448 NODE_SOCKET_API(float3, vector1)
1449 NODE_SOCKET_API(float3, vector2)
1451 NODE_SOCKET_API(float, scale)
1453};
1454
1456 public:
1458
1460 NODE_SOCKET_API(bool, invert)
1462 NODE_SOCKET_API(float3, center)
1463 NODE_SOCKET_API(float3, axis)
1464 NODE_SOCKET_API(float, angle)
1465 NODE_SOCKET_API(float3, rotation)
1466};
1467
1477
1478class BumpNode : public ShaderNode {
1479 public:
1481 void constant_fold(const ConstantFolder &folder) override;
1482 bool has_spatial_varying() override
1483 {
1484 return true;
1485 }
1486 int get_feature() override
1487 {
1489 }
1490
1491 NODE_SOCKET_API(bool, invert)
1492 NODE_SOCKET_API(bool, use_object_space)
1493 NODE_SOCKET_API(float, height)
1494 NODE_SOCKET_API(float, filter_width)
1495 NODE_SOCKET_API(float, sample_center)
1496 NODE_SOCKET_API(float, sample_x)
1497 NODE_SOCKET_API(float, sample_y)
1498 NODE_SOCKET_API(float3, normal)
1499 NODE_SOCKET_API(float, strength)
1501};
1502
1503class CurvesNode : public ShaderNode {
1504 public:
1505 explicit CurvesNode(const NodeType *node_type);
1507
1509 NODE_SOCKET_API(float, min_x)
1510 NODE_SOCKET_API(float, max_x)
1511 NODE_SOCKET_API(float, fac)
1512 NODE_SOCKET_API(float3, value)
1513 NODE_SOCKET_API(bool, extrapolate)
1514
1515 protected:
1517 void constant_fold(const ConstantFolder &folder, ShaderInput *value_in);
1518 void compile(SVMCompiler &compiler,
1519 const int type,
1520 ShaderInput *value_in,
1521 ShaderOutput *value_out);
1522 void compile(OSLCompiler &compiler, const char *name);
1523};
1524
1526 public:
1528 void constant_fold(const ConstantFolder &folder) override;
1529};
1530
1532 public:
1534 void constant_fold(const ConstantFolder &folder) override;
1535};
1536
1538 public:
1540 void constant_fold(const ConstantFolder &folder) override;
1541
1543 NODE_SOCKET_API(float, min_x)
1544 NODE_SOCKET_API(float, max_x)
1545 NODE_SOCKET_API(float, fac)
1546 NODE_SOCKET_API(float, value)
1547 NODE_SOCKET_API(bool, extrapolate)
1548};
1549
1550class RGBRampNode : public ShaderNode {
1551 public:
1553 void constant_fold(const ConstantFolder &folder) override;
1554
1557 NODE_SOCKET_API(float, fac)
1558 NODE_SOCKET_API(bool, interpolate)
1559};
1560
1562 public:
1564 NODE_SOCKET_API(float3, direction)
1565};
1566
1567class OSLNode final : public ShaderNode {
1568 public:
1569 static OSLNode *create(ShaderGraph *graph,
1570 const size_t num_inputs,
1571 const OSLNode *from = nullptr);
1572 ~OSLNode() override;
1573
1574 static void operator delete(void *ptr)
1575 {
1576 /* Override delete operator to silence new-delete-type-mismatch ASAN warnings
1577 * regarding size mismatch in the destructor. This is intentional as we allocate
1578 * extra space at the end of the node. */
1579 ::operator delete(ptr);
1580 }
1581 static void operator delete(void * /*unused*/, void * /*unused*/)
1582 {
1583 /* Deliberately empty placement delete operator, to avoid MSVC warning C4291. */
1584 }
1585
1586 ShaderNode *clone(ShaderGraph *graph) const override;
1587
1588 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1589
1590 char *input_default_value();
1591 void add_input(ustring name, SocketType::Type type, const int flags = 0);
1592 void add_output(ustring name, SocketType::Type type);
1593
1595
1596 bool has_surface_emission() override
1597 {
1598 return has_emission;
1599 }
1600
1601 /* Ideally we could better detect this, but we can't query this now. */
1602 bool has_spatial_varying() override
1603 {
1604 return true;
1605 }
1606 bool has_volume_support() override
1607 {
1608 return true;
1609 }
1610 int get_feature() override
1611 {
1613 }
1614
1615 bool equals(const ShaderNode & /*other*/) override
1616 {
1617 return false;
1618 }
1619
1620 string filepath;
1623};
1624
1626 public:
1628 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1630 {
1631 return true;
1632 }
1633 bool has_spatial_varying() override
1634 {
1635 return true;
1636 }
1637
1639 NODE_SOCKET_API(ustring, attribute)
1640 NODE_SOCKET_API(float, strength)
1641 NODE_SOCKET_API(float3, color)
1642};
1643
1644class TangentNode : public ShaderNode {
1645 public:
1647 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1649 {
1650 return true;
1651 }
1652 bool has_spatial_varying() override
1653 {
1654 return true;
1655 }
1656
1659 NODE_SOCKET_API(ustring, attribute)
1660};
1661
1662class BevelNode : public ShaderNode {
1663 public:
1665 bool has_spatial_varying() override
1666 {
1667 return true;
1668 }
1669 int get_feature() override
1670 {
1672 }
1673
1674 NODE_SOCKET_API(float, radius)
1675 NODE_SOCKET_API(float3, normal)
1676 NODE_SOCKET_API(int, samples)
1677};
1678
1680 public:
1682 void constant_fold(const ConstantFolder &folder) override;
1683 int get_feature() override
1684 {
1686 }
1687
1689 NODE_SOCKET_API(float, height)
1690 NODE_SOCKET_API(float, midlevel)
1691 NODE_SOCKET_API(float, scale)
1692 NODE_SOCKET_API(float3, normal)
1693};
1694
1696 public:
1698 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1700 {
1701 return true;
1702 }
1703 void constant_fold(const ConstantFolder &folder) override;
1704 int get_feature() override
1705 {
1707 }
1708
1710 NODE_SOCKET_API(ustring, attribute)
1712 NODE_SOCKET_API(float, midlevel)
1713 NODE_SOCKET_API(float, scale)
1714};
1715
#define final(a, b, c)
Definition BLI_hash.h:19
NodeGaborType
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:117
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
void constant_fold(const ConstantFolder &folder) override
int get_feature() override
bool has_spatial_varying() override
bool has_spatial_varying() override
bool has_attribute_dependency() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
int get_feature() override
int get_feature() override
bool has_spatial_varying() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
bool equals(const ShaderNode &) override
int get_feature() override
bool has_spatial_varying() override
ClosureType get_closure_type() override
ClosureType closure
bool has_bump() override
BsdfBaseNode(const NodeType *node_type)
BsdfNode(const NodeType *node_type)
void compile(SVMCompiler &compiler, ShaderInput *bsdf_y, ShaderInput *bsdf_z, ShaderInput *data_y=nullptr, ShaderInput *data_z=nullptr, ShaderInput *data_w=nullptr)
void constant_fold(const ConstantFolder &folder) override
bool has_spatial_varying() override
int get_feature() override
bool has_spatial_varying() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
float value_float
float3 value_point
float3 value_normal
void constant_fold(const ConstantFolder &folder) override
float3 value_vector
ConvertNode(SocketType::Type from, SocketType::Type to, bool autoconvert=false)
float3 value_color
void compile(SVMCompiler &compiler, const int type, ShaderInput *value_in, ShaderOutput *value_out)
CurvesNode(const NodeType *node_type)
void constant_fold(const ConstantFolder &folder, ShaderInput *value_in)
int get_feature() override
void constant_fold(const ConstantFolder &folder) override
int get_feature() override
bool has_volume_support() override
void constant_fold(const ConstantFolder &folder) override
bool from_auto_conversion
bool has_surface_emission() override
ShaderNode * clone(ShaderGraph *graph) const override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
ImageParams image_params() const
bool equals(const ShaderNode &other) override
void constant_fold(const ConstantFolder &folder) override
bool has_spatial_varying() override
void constant_fold(const ConstantFolder &folder) override
bool has_spatial_varying() override
bool has_attribute_dependency() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
ClosureType get_closure_type() override
bool has_attribute_dependency() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
void simplify_settings(Scene *scene) override
ClosureType get_closure_type() override
ClosureType get_closure_type() override
bool has_attribute_dependency() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_spatial_varying() override
ClosureType get_closure_type() override
ShaderNode * clone(ShaderGraph *graph) const override
~IESLightNode() override
bool equals(const ShaderNode &other) override
ImageSlotTextureNode(const NodeType *node_type)
ImageParams image_params() const
void cull_tiles(Scene *scene, ShaderGraph *graph)
ShaderNode * clone(ShaderGraph *graph) const override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
bool equals(const ShaderNode &other) override
void constant_fold(const ConstantFolder &folder) override
bool has_spatial_varying() override
bool has_spatial_varying() override
void expand(ShaderGraph *graph) override
void constant_fold(const ConstantFolder &folder) override
void expand(ShaderGraph *graph) override
void constant_fold(const ConstantFolder &folder) override
ClosureType get_closure_type() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
void simplify_settings(Scene *scene) override
bool has_attribute_dependency() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
bool has_spatial_varying() override
bool has_attribute_dependency() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
string bytecode_hash
bool equals(const ShaderNode &) override
bool has_volume_support() override
static OSLNode * create(ShaderGraph *graph, const size_t num_inputs, const OSLNode *from=nullptr)
int get_feature() override
bool has_surface_emission() override
bool has_emission
bool has_spatial_varying() override
string filepath
bool equals(const ShaderNode &) override
void simplify_settings(Scene *scene) override
bool equals(const ShaderNode &) override
bool has_attribute_dependency() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool equals(const ShaderNode &other) override
ImageParams image_params() const
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_spatial_varying() override
ShaderNode * clone(ShaderGraph *graph) const override
bool has_attribute_dependency() override
~PointDensityTextureNode() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
bool has_spatial_varying() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
bool has_surface_bssrdf() override
void simplify_settings(Scene *scene) override
bool has_surface_transparent() override
bool has_bssrdf_bump() override
bool has_surface_emission() override
int get_feature() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
bool has_surface_transparent() override
ClosureType get_closure_type() override
ScatterVolumeNode(const NodeType *node_type)
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
ShaderNodeSpecialType special_type
virtual bool equals(const ShaderNode &other)
virtual int get_feature()
virtual void constant_fold(const ConstantFolder &)
ShaderNode(const NodeType *type)
ClosureType get_closure_type() override
float get_sun_size()
void simplify_settings(Scene *scene) override
ImageHandle handle
float get_sun_average_radiance()
bool has_bssrdf_bump() override
ClosureType get_closure_type() override
bool has_surface_bssrdf() override
bool has_spatial_varying() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
bool has_spatial_varying() override
bool has_attribute_dependency() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
int compile(SVMCompiler &compiler, ShaderInput *vector_in)
Transform compute_transform()
void compile(SVMCompiler &compiler, const int offset_in, const int offset_out)
void compile_end(SVMCompiler &compiler, ShaderInput *vector_in, const int vector_offset)
Projection projection
Mapping x_mapping
Mapping z_mapping
Mapping y_mapping
int compile_begin(SVMCompiler &compiler, ShaderInput *vector_in)
TextureMapping tex_mapping
TextureNode(const NodeType *node_type)
bool has_surface_transparent() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_spatial_varying() override
bool has_attribute_dependency() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
int get_feature() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
void expand(ShaderGraph *graph) override
void constant_fold(const ConstantFolder &folder) override
bool has_attribute_dependency() override
bool has_spatial_varying() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
bool has_spatial_varying() override
ClosureType get_closure_type() override
ClosureType closure
int get_feature() override
void compile(SVMCompiler &compiler, ShaderInput *density, ShaderInput *param1=nullptr, ShaderInput *param2=nullptr)
bool has_volume_support() override
bool equals(const ShaderNode &) override
VolumeNode(const NodeType *node_type)
int get_feature() override
bool has_spatial_varying() override
#define KERNEL_FEATURE_NODE_BSDF
#define KERNEL_FEATURE_NODE_PRINCIPLED_HAIR
#define KERNEL_FEATURE_NODE_VORONOI_EXTRA
#define KERNEL_FEATURE_NODE_VOLUME
#define KERNEL_FEATURE_NODE_RAYTRACE
#define KERNEL_FEATURE_NODE_EMISSION
#define KERNEL_FEATURE_NODE_BUMP
#define CCL_NAMESPACE_END
#define fmaxf(x, y)
IMETHOD void random(Vector &a)
addDelta operator for displacement rotational velocity.
Definition frames.inl:1282
#define class
#define public
constexpr T clamp(T, U, U) RET
float distance(VecOp< float, D >, VecOp< float, D >) RET
static bool initialized
#define NODE_SOCKET_API_STRUCT_MEMBER(type_, name, member)
Definition graph/node.h:76
#define NODE_SOCKET_API_ARRAY(type_, name)
Definition graph/node.h:63
#define NODE_SOCKET_API(type_, name)
Definition graph/node.h:55
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
Definition invert.h:11
ccl_gpu_kernel_postfix ccl_global KernelWorkTile * tiles
NodeClampType
NodeEnvironmentProjection
NodeMathType
NodeMapRangeType
NodeWaveBandsDirection
NodeMappingType
NodePrincipledHairModel
NodeNoiseType
NodeVectorTransformConvertSpace
NodeTangentAxis
NodePrincipledHairParametrization
NodeVoronoiFeature
@ NODE_VORONOI_SMOOTH_F1
NodeWaveType
NodeVoronoiDistanceMetric
NodeSkyType
NodeWaveProfile
NodeTexVoxelSpace
ClosureType
@ CLOSURE_HOLDOUT_ID
NodeVectorRotateType
NodeVectorTransformType
NodeImageProjection
NodeCombSepColorType
NodeGradientType
NodeTangentDirectionType
NodeVectorMathType
NodeWaveRingsDirection
NodeNormalMapSpace
#define R
#define vector3
#define SHADER_NODE_NO_CLONE_CLASS(type)
@ SHADER_SPECIAL_TYPE_IMAGE_SLOT
#define SHADER_NODE_CLASS(type)
#define SHADER_NODE_BASE_CLASS(type)
static const int steps
#define min(a, b)
Definition sort.cc:36
bool equals(const Node &other) const
const NodeType * type
Definition graph/node.h:178
ustring name
Definition graph/node.h:177
Node(const NodeType *type, ustring name=ustring())
max
Definition text_draw.cc:251
static int blend(const Tex *tex, const float texvec[3], TexResult *texres)
ImageAlphaType
InterpolationType
ExtensionType
PointerRNA * ptr
Definition wm_files.cc:4226
bool override
Definition wm_files.cc:1184