Blender V5.0
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 "kernel/svm/types.h"
9#include "scene/image.h"
10#include "scene/shader_graph.h"
11
12#include "util/array.h"
13#include "util/string.h"
14#include "util/unique_ptr.h"
15
17
18class ImageManager;
19class LightManager;
20class Scene;
21class Shader;
22
23/* Texture Mapping */
24
26 public:
29 bool skip();
30 void compile(SVMCompiler &compiler, const int offset_in, const int offset_out);
31 int compile(SVMCompiler &compiler, ShaderInput *vector_in);
32 void compile(OSLCompiler &compiler);
33
34 int compile_begin(SVMCompiler &compiler, ShaderInput *vector_in);
35 void compile_end(SVMCompiler &compiler, ShaderInput *vector_in, const int vector_offset);
36
40
43
44 enum Type { POINT = 0, TEXTURE = 1, VECTOR = 2, NORMAL = 3 };
46
47 enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 };
49
52};
53
54/* Nodes */
55
72
73/* Any node which uses image manager's slot should be a subclass of this one. */
75 public:
76 explicit ImageSlotTextureNode(const NodeType *node_type) : TextureNode(node_type)
77 {
79 }
80
81 bool equals(const ShaderNode &other) override
82 {
83 const ImageSlotTextureNode &other_node = (const ImageSlotTextureNode &)other;
84 return TextureNode::equals(other) && handle == other_node.handle;
85 }
86
88};
89
91 public:
93 ShaderNode *clone(ShaderGraph *graph) const override;
94 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
96 {
97 return true;
98 }
99
100 bool equals(const ShaderNode &other) override
101 {
102 const ImageTextureNode &other_node = (const ImageTextureNode &)other;
103 return ImageSlotTextureNode::equals(other) && animated == other_node.animated;
104 }
105
107
108 /* Parameters. */
109 NODE_SOCKET_API(ustring, filename)
110 NODE_SOCKET_API(ustring, colorspace)
113 NODE_SOCKET_API(InterpolationType, interpolation)
115 NODE_SOCKET_API(float, projection_blend)
116 NODE_SOCKET_API(bool, animated)
119
120 protected:
121 void cull_tiles(Scene *scene, ShaderGraph *graph);
122};
123
125 public:
127 ShaderNode *clone(ShaderGraph *graph) const override;
128 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
130 {
131 return true;
132 }
133
134 bool equals(const ShaderNode &other) override
135 {
136 const EnvironmentTextureNode &other_node = (const EnvironmentTextureNode &)other;
137 return ImageSlotTextureNode::equals(other) && animated == other_node.animated;
138 }
139
141
142 /* Parameters. */
143 NODE_SOCKET_API(ustring, filename)
144 NODE_SOCKET_API(ustring, colorspace)
147 NODE_SOCKET_API(InterpolationType, interpolation)
148 NODE_SOCKET_API(bool, animated)
150};
151
153 public:
155
158 NODE_SOCKET_API(float, turbidity)
159 NODE_SOCKET_API(float, ground_albedo)
160 NODE_SOCKET_API(bool, sun_disc)
161 NODE_SOCKET_API(float, sun_size)
162 NODE_SOCKET_API(float, sun_intensity)
163 NODE_SOCKET_API(float, sun_elevation)
164 NODE_SOCKET_API(float, sun_rotation)
165 NODE_SOCKET_API(float, altitude)
166 NODE_SOCKET_API(float, air_density)
167 NODE_SOCKET_API(float, aerosol_density)
168 NODE_SOCKET_API(float, ozone_density)
171
172 void simplify_settings(Scene *scene) override;
173
175 {
176 /* Clamping for numerical precision. */
177 return fmaxf(sun_size, 0.0005f);
178 }
179
181};
182
183class OutputNode : public ShaderNode {
184 public:
186
187 NODE_SOCKET_API(Node *, surface)
188 NODE_SOCKET_API(Node *, volume)
189 NODE_SOCKET_API(float3, displacement)
190 NODE_SOCKET_API(float3, normal)
191
192 /* Don't allow output node de-duplication. */
193 bool equals(const ShaderNode & /*other*/) override
194 {
195 return false;
196 }
197
198 bool is_linear_operation() override
199 {
200 return true;
201 }
202};
203
204class OutputAOVNode : public ShaderNode {
205 public:
207 void simplify_settings(Scene *scene) override;
208
209 NODE_SOCKET_API(float, value)
210 NODE_SOCKET_API(float3, color)
211
212 NODE_SOCKET_API(ustring, name)
213
214 /* Don't allow output node de-duplication. */
215 bool equals(const ShaderNode & /*other*/) override
216 {
217 return false;
218 }
219
220 bool is_linear_operation() override
221 {
222 return true;
223 }
224
227};
228
236
238 public:
240
241 NODE_SOCKET_API(int, dimensions)
243 NODE_SOCKET_API(bool, use_normalize)
244 NODE_SOCKET_API(float, w)
245 NODE_SOCKET_API(float, scale)
246 NODE_SOCKET_API(float, detail)
247 NODE_SOCKET_API(float, roughness)
248 NODE_SOCKET_API(float, lacunarity)
249 NODE_SOCKET_API(float, offset)
250 NODE_SOCKET_API(float, gain)
251 NODE_SOCKET_API(float, distortion)
253};
254
256 public:
258
261 NODE_SOCKET_API(float, scale)
262 NODE_SOCKET_API(float, frequency)
263 NODE_SOCKET_API(float, anisotropy)
264 NODE_SOCKET_API(float, orientation_2d)
265 NODE_SOCKET_API(float3, orientation_3d)
266};
267
269 public:
271
272 uint get_feature() override
273 {
275 if (dimensions == 4) {
277 }
278 else if (dimensions >= 2 && feature == NODE_VORONOI_SMOOTH_F1) {
280 }
281 return result;
282 }
283
284 NODE_SOCKET_API(int, dimensions)
287 NODE_SOCKET_API(bool, use_normalize)
288 NODE_SOCKET_API(float, w)
289 NODE_SOCKET_API(float, scale)
290 NODE_SOCKET_API(float, detail)
291 NODE_SOCKET_API(float, roughness)
292 NODE_SOCKET_API(float, lacunarity)
293 NODE_SOCKET_API(float, exponent)
294 NODE_SOCKET_API(float, smoothness)
295 NODE_SOCKET_API(float, randomness)
297};
298
300 public:
302
303 NODE_SOCKET_API(NodeWaveType, wave_type)
307
308 NODE_SOCKET_API(float, scale)
309 NODE_SOCKET_API(float, distortion)
310 NODE_SOCKET_API(float, detail)
311 NODE_SOCKET_API(float, detail_scale)
312 NODE_SOCKET_API(float, detail_roughness)
313 NODE_SOCKET_API(float, phase)
315};
316
318 public:
320
321 NODE_SOCKET_API(int, depth)
323 NODE_SOCKET_API(float, scale)
324 NODE_SOCKET_API(float, distortion)
325};
326
328 public:
330
332 NODE_SOCKET_API(float3, color1)
333 NODE_SOCKET_API(float3, color2)
334 NODE_SOCKET_API(float, scale)
335};
336
338 public:
340
341 NODE_SOCKET_API(float, offset)
342 NODE_SOCKET_API(float, squash)
343 NODE_SOCKET_API(int, offset_frequency)
344 NODE_SOCKET_API(int, squash_frequency)
345
346 NODE_SOCKET_API(float3, color1)
347 NODE_SOCKET_API(float3, color2)
348 NODE_SOCKET_API(float3, mortar)
349 NODE_SOCKET_API(float, scale)
350 NODE_SOCKET_API(float, mortar_size)
351 NODE_SOCKET_API(float, mortar_smooth)
352 NODE_SOCKET_API(float, bias)
353 NODE_SOCKET_API(float, brick_width)
354 NODE_SOCKET_API(float, row_height)
356};
357
358class IESLightNode : public TextureNode {
359 public:
361
362 ~IESLightNode() override;
363 ShaderNode *clone(ShaderGraph *graph) const override;
364
365 NODE_SOCKET_API(ustring, filename)
366 NODE_SOCKET_API(ustring, ies)
367
368 NODE_SOCKET_API(float, strength)
370
371 private:
372 LightManager *light_manager;
373 int slot;
374
375 void get_slot();
376};
377
379 public:
381
382 NODE_SOCKET_API(int, dimensions)
384 NODE_SOCKET_API(float, w)
385};
386
387class MappingNode : public ShaderNode {
388 public:
390 void constant_fold(const ConstantFolder &folder) override;
391
393 NODE_SOCKET_API(float3, location)
394 NODE_SOCKET_API(float3, rotation)
395 NODE_SOCKET_API(float3, scale)
396 NODE_SOCKET_API(NodeMappingType, mapping_type)
397};
398
399class RGBToBWNode : public ShaderNode {
400 public:
402 void constant_fold(const ConstantFolder &folder) override;
403 bool is_linear_operation() override
404 {
405 return true;
406 }
407
408 NODE_SOCKET_API(float3, color)
409};
410
411class ConvertNode : public ShaderNode {
412 public:
413 ConvertNode(SocketType::Type from, SocketType::Type to, bool autoconvert = false);
414 ConvertNode(const ConvertNode &other);
416
417 void constant_fold(const ConstantFolder &folder) override;
418
419 bool is_linear_operation() override
420 {
421 return true;
422 }
423
424 private:
425 SocketType::Type from, to;
426
427 union {
434 };
435 ustring value_string;
436
437 static const int MAX_TYPE = 13;
438 static bool register_types();
439 static unique_ptr<Node> create(const NodeType *type);
440 static const NodeType *node_types[MAX_TYPE][MAX_TYPE];
441 static bool initialized;
442};
443
444class BsdfBaseNode : public ShaderNode {
445 public:
446 BsdfBaseNode(const NodeType *node_type);
447
448 bool is_linear_operation() override
449 {
450 return true;
451 }
452 bool has_spatial_varying() override
453 {
454 return true;
455 }
457 {
458 return closure;
459 }
460 bool has_bump() override;
461
462 bool equals(const ShaderNode & /*other*/) override
463 {
464 /* TODO(sergey): With some care BSDF nodes can be de-duplicated. */
465 return false;
466 }
467
468 uint get_feature() override
469 {
471 }
472
473 protected:
475};
476
477class BsdfNode : public BsdfBaseNode {
478 public:
479 explicit BsdfNode(const NodeType *node_type);
481
482 void compile(SVMCompiler &compiler,
483 ShaderInput *bsdf_y,
484 ShaderInput *bsdf_z,
485 ShaderInput *data_y = nullptr,
486 ShaderInput *data_z = nullptr,
487 ShaderInput *data_w = nullptr);
488
489 NODE_SOCKET_API(float3, color)
490 NODE_SOCKET_API(float3, normal)
491 NODE_SOCKET_API(float, surface_mix_weight)
492};
493
494class DiffuseBsdfNode : public BsdfNode {
495 public:
497 bool is_linear_operation() override
498 {
499 return true;
500 }
501
502 NODE_SOCKET_API(float, roughness)
503};
504
505/* Disney principled BRDF */
507 public:
509
510 bool has_surface_bssrdf() override;
511 bool has_bssrdf_bump() override;
512 void simplify_settings(Scene *scene) override;
513
514 NODE_SOCKET_API(float3, base_color)
515 NODE_SOCKET_API(float, metallic)
516 NODE_SOCKET_API(float, roughness)
517 NODE_SOCKET_API(float, ior)
518 NODE_SOCKET_API(float3, normal)
519 NODE_SOCKET_API(float, alpha)
520 NODE_SOCKET_API(float, diffuse_roughness)
521 NODE_SOCKET_API(ClosureType, subsurface_method)
522 NODE_SOCKET_API(float, subsurface_weight)
523 NODE_SOCKET_API(float3, subsurface_radius)
524 NODE_SOCKET_API(float, subsurface_scale)
525 NODE_SOCKET_API(float, subsurface_ior)
526 NODE_SOCKET_API(float, subsurface_anisotropy)
527 NODE_SOCKET_API(ClosureType, distribution)
528 NODE_SOCKET_API(float, specular_ior_level)
529 NODE_SOCKET_API(float3, specular_tint)
530 NODE_SOCKET_API(float, anisotropic)
531 NODE_SOCKET_API(float, anisotropic_rotation)
532 NODE_SOCKET_API(float3, tangent)
533 NODE_SOCKET_API(float, transmission_weight)
534 NODE_SOCKET_API(float, sheen_weight)
535 NODE_SOCKET_API(float, sheen_roughness)
536 NODE_SOCKET_API(float3, sheen_tint)
537 NODE_SOCKET_API(float, coat_weight)
538 NODE_SOCKET_API(float, coat_roughness)
539 NODE_SOCKET_API(float, coat_ior)
540 NODE_SOCKET_API(float3, coat_tint)
541 NODE_SOCKET_API(float3, coat_normal)
542 NODE_SOCKET_API(float3, emission_color)
543 NODE_SOCKET_API(float, emission_strength)
544 NODE_SOCKET_API(float, surface_mix_weight)
545 NODE_SOCKET_API(float, thin_film_thickness)
546 NODE_SOCKET_API(float, thin_film_ior)
547
548 public:
549 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
551 {
552 return true;
553 }
554 bool has_surface_transparent() override;
555 bool has_surface_emission() override;
556
557 protected:
558 /* Checks whether the given weight input is potentially non-zero. */
559 bool has_nonzero_weight(const char *name);
560};
561
566
568 public:
570
572 {
573 return true;
574 }
575};
576
578 public:
580
581 NODE_SOCKET_API(float3, position)
582 NODE_SOCKET_API(float3, direction)
583
585 {
586 return true;
587 }
588
589 uint get_feature() override
590 {
592 }
593};
594
595class SheenBsdfNode : public BsdfNode {
596 public:
598
599 NODE_SOCKET_API(float, roughness)
600 NODE_SOCKET_API(ClosureType, distribution)
601
603 {
604 return distribution;
605 }
606};
607
609 public:
611
612 void simplify_settings(Scene *scene) override;
614 {
615 return closure;
616 }
617
618 NODE_SOCKET_API(float3, edge_tint)
621 NODE_SOCKET_API(float3, tangent)
622 NODE_SOCKET_API(float, roughness)
623 NODE_SOCKET_API(float, anisotropy)
624 NODE_SOCKET_API(float, rotation)
625 NODE_SOCKET_API(float, thin_film_thickness)
626 NODE_SOCKET_API(float, thin_film_ior)
627 NODE_SOCKET_API(ClosureType, distribution)
628 NODE_SOCKET_API(ClosureType, fresnel_type)
629
630 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
632 {
633 return true;
634 }
635
636 bool is_isotropic();
637};
638
639class GlossyBsdfNode : public BsdfNode {
640 public:
642
643 void simplify_settings(Scene *scene) override;
645 {
646 return distribution;
647 }
648
649 NODE_SOCKET_API(float3, tangent)
650 NODE_SOCKET_API(float, roughness)
651 NODE_SOCKET_API(float, anisotropy)
652 NODE_SOCKET_API(float, rotation)
653 NODE_SOCKET_API(ClosureType, distribution)
654
655 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
657 {
658 return true;
659 }
660
661 bool is_isotropic();
662};
663
664class GlassBsdfNode : public BsdfNode {
665 public:
667
669 {
670 return distribution;
671 }
672
673 NODE_SOCKET_API(float, roughness)
674 NODE_SOCKET_API(float, IOR)
675 NODE_SOCKET_API(float, thin_film_thickness)
676 NODE_SOCKET_API(float, thin_film_ior)
677 NODE_SOCKET_API(ClosureType, distribution)
678};
679
681 public:
683
685 {
686 return distribution;
687 }
688
689 NODE_SOCKET_API(float, roughness)
690 NODE_SOCKET_API(float, IOR)
691 NODE_SOCKET_API(ClosureType, distribution)
692};
693
694class ToonBsdfNode : public BsdfNode {
695 public:
697
698 NODE_SOCKET_API(float, smooth)
699 NODE_SOCKET_API(float, size)
700 NODE_SOCKET_API(ClosureType, component)
701};
702
704 public:
706 bool has_surface_bssrdf() override
707 {
708 return true;
709 }
710 bool has_bssrdf_bump() override;
712 {
713 return method;
714 }
715
716 NODE_SOCKET_API(float, scale)
717 NODE_SOCKET_API(float3, radius)
718 NODE_SOCKET_API(float, subsurface_ior)
719 NODE_SOCKET_API(float, subsurface_roughness)
720 NODE_SOCKET_API(float, subsurface_anisotropy)
722};
723
724class EmissionNode : public ShaderNode {
725 public:
727 void constant_fold(const ConstantFolder &folder) override;
728
729 bool has_surface_emission() override
730 {
731 return true;
732 }
733 bool has_volume_support() override
734 {
735 return true;
736 }
737 bool is_linear_operation() override
738 {
739 return true;
740 }
741
746
747 NODE_SOCKET_API(float3, color)
748 NODE_SOCKET_API(float, strength)
749 NODE_SOCKET_API(float, surface_mix_weight)
750 NODE_SOCKET_API(float, volume_mix_weight)
751
753};
754
756 public:
758 void constant_fold(const ConstantFolder &folder) override;
759 bool is_linear_operation() override
760 {
761 return true;
762 }
763
768
769 NODE_SOCKET_API(float3, color)
770 NODE_SOCKET_API(float, strength)
771 NODE_SOCKET_API(float, surface_mix_weight)
772};
773
774class HoldoutNode : public ShaderNode {
775 public:
778 {
779 return CLOSURE_HOLDOUT_ID;
780 }
781 bool is_linear_operation() override
782 {
783 return true;
784 }
785
786 NODE_SOCKET_API(float, surface_mix_weight)
787 NODE_SOCKET_API(float, volume_mix_weight)
788};
789
791 public:
793
794 bool has_spatial_varying() override
795 {
796 return true;
797 }
798 uint get_feature() override
799 {
801 }
802
803 NODE_SOCKET_API(float3, color)
805 NODE_SOCKET_API(float3, normal)
806 NODE_SOCKET_API(int, samples)
807
808 NODE_SOCKET_API(bool, only_local)
809 NODE_SOCKET_API(bool, inside)
810};
811
812class VolumeNode : public ShaderNode {
813 public:
814 VolumeNode(const NodeType *node_type);
816 bool is_linear_operation() override
817 {
818 return true;
819 }
820
821 void compile(SVMCompiler &compiler,
822 ShaderInput *density,
823 ShaderInput *param1 = nullptr,
824 ShaderInput *param2 = nullptr);
830 {
831 return closure;
832 }
833 bool has_volume_support() override
834 {
835 return true;
836 }
837
838 NODE_SOCKET_API(float3, color)
839 NODE_SOCKET_API(float, density)
840 NODE_SOCKET_API(float, volume_mix_weight)
841
842 protected:
844
845 public:
846 bool equals(const ShaderNode & /*other*/) override
847 {
848 /* TODO(sergey): With some care Volume nodes can be de-duplicated. */
849 return false;
850 }
851};
852
857
859 public:
860 ScatterVolumeNode(const NodeType *node_type);
862
863 NODE_SOCKET_API(float, anisotropy)
864 NODE_SOCKET_API(float, IOR)
865 NODE_SOCKET_API(float, backscatter)
866 NODE_SOCKET_API(float, alpha)
867 NODE_SOCKET_API(float, diameter)
869};
870
872 public:
874
875 NODE_SOCKET_API(float3, scatter_coeffs)
876 NODE_SOCKET_API(float3, absorption_coeffs)
877 NODE_SOCKET_API(float3, emission_coeffs)
878};
879
881 public:
883 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
885 {
886 return true;
887 }
888
889 NODE_SOCKET_API(ustring, density_attribute)
890 NODE_SOCKET_API(ustring, color_attribute)
891 NODE_SOCKET_API(ustring, temperature_attribute)
892
893 NODE_SOCKET_API(float, anisotropy)
894 NODE_SOCKET_API(float3, absorption_color)
895 NODE_SOCKET_API(float, emission_strength)
896 NODE_SOCKET_API(float3, emission_color)
897 NODE_SOCKET_API(float, blackbody_intensity)
898 NODE_SOCKET_API(float3, blackbody_tint)
899 NODE_SOCKET_API(float, temperature)
900};
901
902/* Interface between the I/O sockets and the SVM/OSL backend. */
904 public:
906 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
907
908 /* Longitudinal roughness. */
909 NODE_SOCKET_API(float, roughness)
910 /* Azimuthal roughness. */
911 NODE_SOCKET_API(float, radial_roughness)
912 /* Randomization factor for roughnesses. */
913 NODE_SOCKET_API(float, random_roughness)
914 /* Longitudinal roughness factor for only the diffuse bounce (shiny undercoat). */
915 NODE_SOCKET_API(float, coat)
916 /* Index of reflection. */
917 NODE_SOCKET_API(float, ior)
918 /* Cuticle tilt angle. */
919 NODE_SOCKET_API(float, offset)
920 /* Direct coloring's color. */
921 NODE_SOCKET_API(float3, color)
922 /* Melanin concentration. */
923 NODE_SOCKET_API(float, melanin)
924 /* Melanin redness ratio. */
925 NODE_SOCKET_API(float, melanin_redness)
926 /* Dye color. */
928 /* Randomization factor for melanin quantities. */
929 NODE_SOCKET_API(float, random_color)
930 /* Absorption coefficient (unfiltered). */
931 NODE_SOCKET_API(float3, absorption_coefficient)
932
933 /* Aspect Ratio. */
934 NODE_SOCKET_API(float, aspect_ratio)
935
936 /* Optional modulation factors for the lobes. */
937 NODE_SOCKET_API(float, R)
938 NODE_SOCKET_API(float, TT)
939 NODE_SOCKET_API(float, TRT)
940
941 /* Weight for mix shader. */
942 NODE_SOCKET_API(float, surface_mix_weight)
943 /* If linked, here will be the given random number. */
944 NODE_SOCKET_API(float, random)
945 /* Selected coloring parametrization. */
947 /* Selected scattering model (chiang/huang). */
949
950 uint get_feature() override
951 {
952 return ccl::BsdfBaseNode::get_feature() | KERNEL_FEATURE_NODE_PRINCIPLED_HAIR;
953 }
954
955 bool has_surface_transparent() override;
956};
957
958class HairBsdfNode : public BsdfNode {
959 public:
962 {
963 return component;
964 }
965
966 NODE_SOCKET_API(ClosureType, component)
967 NODE_SOCKET_API(float, offset)
968 NODE_SOCKET_API(float, roughness_u)
969 NODE_SOCKET_API(float, roughness_v)
970 NODE_SOCKET_API(float3, tangent)
971};
972
973class GeometryNode : public ShaderNode {
974 public:
976 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
978 {
979 return true;
980 }
981 bool has_spatial_varying() override
982 {
983 return true;
984 }
986};
987
989 public:
991 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
993 {
994 return true;
995 }
996 bool has_spatial_varying() override
997 {
998 return true;
999 }
1000
1001 NODE_SOCKET_API(bool, from_dupli)
1002 NODE_SOCKET_API(bool, use_transform)
1003 NODE_SOCKET_API(Transform, ob_tfm)
1004};
1005
1006class UVMapNode : public ShaderNode {
1007 public:
1009 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1011 {
1012 return true;
1013 }
1014 bool has_spatial_varying() override
1015 {
1016 return true;
1017 }
1018
1019 NODE_SOCKET_API(ustring, attribute)
1020 NODE_SOCKET_API(bool, from_dupli)
1021};
1022
1024 public:
1026};
1027
1029 public:
1031 bool has_spatial_varying() override
1032 {
1033 return true;
1034 }
1035
1036 NODE_SOCKET_API(float, strength)
1037 NODE_SOCKET_API(float, smooth)
1038};
1039
1041 public:
1043};
1044
1046 public:
1048 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1050 {
1051 return true;
1052 }
1053};
1054
1055class HairInfoNode : public ShaderNode {
1056 public:
1058
1059 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1061 {
1062 return true;
1063 }
1064 bool has_spatial_varying() override
1065 {
1066 return true;
1067 }
1068};
1069
1071 public:
1073
1074 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1076 {
1077 return true;
1078 }
1079 bool has_spatial_varying() override
1080 {
1081 return true;
1082 }
1083};
1084
1086 public:
1088 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1090 {
1091 return true;
1092 }
1093 bool has_spatial_varying() override
1094 {
1095 return true;
1096 }
1097 void expand(ShaderGraph *graph) override;
1098};
1099
1101 public:
1103 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1105 {
1106 return true;
1107 }
1108 bool has_spatial_varying() override
1109 {
1110 return true;
1111 }
1112
1113 NODE_SOCKET_API(ustring, layer_name)
1114};
1115
1116class ValueNode : public ShaderNode {
1117 public:
1119
1120 void constant_fold(const ConstantFolder &folder) override;
1121 bool is_linear_operation() override
1122 {
1123 return true;
1124 }
1125
1126 NODE_SOCKET_API(float, value)
1127};
1128
1129class ColorNode : public ShaderNode {
1130 public:
1132
1133 void constant_fold(const ConstantFolder &folder) override;
1134 bool is_linear_operation() override
1135 {
1136 return true;
1137 }
1138
1139 NODE_SOCKET_API(float3, value)
1140};
1141
1143 public:
1145 void constant_fold(const ConstantFolder &folder) override;
1146 bool is_linear_operation() override
1147 {
1148 return true;
1149 }
1150};
1151
1153 public:
1155 void constant_fold(const ConstantFolder &folder) override;
1156 bool is_linear_operation() override
1157 {
1158 return true;
1159 }
1160
1161 NODE_SOCKET_API(float, fac)
1162};
1163
1165 public:
1167 bool is_linear_operation() override
1168 {
1169 return true;
1170 }
1171
1172 NODE_SOCKET_API(float, weight)
1173 NODE_SOCKET_API(float, fac)
1174};
1175
1176class InvertNode : public ShaderNode {
1177 public:
1179 void constant_fold(const ConstantFolder &folder) override;
1180
1181 NODE_SOCKET_API(float, fac)
1182 NODE_SOCKET_API(float3, color)
1183
1184 bool is_linear_operation() override
1185 {
1186 return true;
1187 }
1188};
1189
1190class MixNode : public ShaderNode {
1191 public:
1193 void constant_fold(const ConstantFolder &folder) override;
1194 bool is_linear_operation() override;
1195
1196 NODE_SOCKET_API(NodeMix, mix_type)
1197 NODE_SOCKET_API(bool, use_clamp)
1198 NODE_SOCKET_API(float3, color1)
1199 NODE_SOCKET_API(float3, color2)
1200 NODE_SOCKET_API(float, fac)
1201};
1202
1203class MixColorNode : public ShaderNode {
1204 public:
1206 void constant_fold(const ConstantFolder &folder) override;
1207 bool is_linear_operation() override;
1208
1211 NODE_SOCKET_API(float, fac)
1212 NODE_SOCKET_API(bool, use_clamp)
1213 NODE_SOCKET_API(bool, use_clamp_result)
1214 NODE_SOCKET_API(NodeMix, blend_type)
1215};
1216
1217class MixFloatNode : public ShaderNode {
1218 public:
1220 void constant_fold(const ConstantFolder &folder) override;
1221 bool is_linear_operation() override;
1222
1223 NODE_SOCKET_API(float, a)
1224 NODE_SOCKET_API(float, b)
1225 NODE_SOCKET_API(float, fac)
1226 NODE_SOCKET_API(bool, use_clamp)
1227};
1228
1230 public:
1232 void constant_fold(const ConstantFolder &folder) override;
1233 bool is_linear_operation() override;
1234
1237 NODE_SOCKET_API(float, fac)
1238 NODE_SOCKET_API(bool, use_clamp)
1239};
1240
1242 public:
1244 void constant_fold(const ConstantFolder &folder) override;
1245 bool is_linear_operation() override;
1246
1250 NODE_SOCKET_API(bool, use_clamp)
1251};
1252
1254 public:
1256 void constant_fold(const ConstantFolder &folder) override;
1257 bool is_linear_operation() override
1258 {
1259 return true;
1260 }
1261
1263 NODE_SOCKET_API(float, r)
1264 NODE_SOCKET_API(float, g)
1265 NODE_SOCKET_API(float, b)
1266};
1267
1269 public:
1271 void constant_fold(const ConstantFolder &folder) override;
1272 bool is_linear_operation() override
1273 {
1274 return true;
1275 }
1276
1277 NODE_SOCKET_API(float, x)
1278 NODE_SOCKET_API(float, y)
1279 NODE_SOCKET_API(float, z)
1280};
1281
1282class GammaNode : public ShaderNode {
1283 public:
1285 void constant_fold(const ConstantFolder &folder) override;
1286
1287 NODE_SOCKET_API(float3, color)
1288 NODE_SOCKET_API(float, gamma)
1289};
1290
1292 public:
1294 void constant_fold(const ConstantFolder &folder) override;
1295
1296 NODE_SOCKET_API(float3, color)
1297 NODE_SOCKET_API(float, bright)
1298 NODE_SOCKET_API(float, contrast)
1299};
1300
1302 public:
1304 void constant_fold(const ConstantFolder &folder) override;
1305 bool is_linear_operation() override
1306 {
1307 return true;
1308 }
1309
1311 NODE_SOCKET_API(float3, color)
1312};
1313
1315 public:
1317 void constant_fold(const ConstantFolder &folder) override;
1318 bool is_linear_operation() override
1319 {
1320 return true;
1321 }
1322
1324};
1325
1326class HSVNode : public ShaderNode {
1327 public:
1329
1330 NODE_SOCKET_API(float, hue)
1331 NODE_SOCKET_API(float, saturation)
1332 NODE_SOCKET_API(float, value)
1333 NODE_SOCKET_API(float, fac)
1334 NODE_SOCKET_API(float3, color)
1335};
1336
1338 public:
1340 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1342 {
1343 return true;
1344 }
1345 bool has_spatial_varying() override
1346 {
1347 return true;
1348 }
1349
1350 NODE_SOCKET_API(ustring, attribute)
1351
1353};
1354
1355class CameraNode : public ShaderNode {
1356 public:
1358 bool has_spatial_varying() override
1359 {
1360 return true;
1361 }
1362};
1363
1364class FresnelNode : public ShaderNode {
1365 public:
1367 bool has_spatial_varying() override
1368 {
1369 return true;
1370 }
1371
1372 NODE_SOCKET_API(float3, normal)
1373 NODE_SOCKET_API(float, IOR)
1374};
1375
1377 public:
1379 bool has_spatial_varying() override
1380 {
1381 return true;
1382 }
1383
1384 NODE_SOCKET_API(float3, normal)
1385 NODE_SOCKET_API(float, blend)
1386};
1387
1389 public:
1391 bool has_spatial_varying() override
1392 {
1393 return true;
1394 }
1395
1396 NODE_SOCKET_API(float, size)
1397 NODE_SOCKET_API(bool, use_pixel_size)
1398};
1399
1401 public:
1403
1404 NODE_SOCKET_API(float, wavelength)
1405};
1406
1408 public:
1410 void constant_fold(const ConstantFolder &folder) override;
1411
1412 NODE_SOCKET_API(float, temperature)
1413};
1414
1416 public:
1418 void expand(ShaderGraph *graph) override;
1419 bool is_linear_operation() override;
1420
1422 NODE_SOCKET_API(float3, from_min)
1423 NODE_SOCKET_API(float3, from_max)
1424 NODE_SOCKET_API(float3, to_min)
1425 NODE_SOCKET_API(float3, to_max)
1426 NODE_SOCKET_API(float3, steps)
1428 NODE_SOCKET_API(bool, use_clamp)
1429};
1430
1431class MapRangeNode : public ShaderNode {
1432 public:
1434 void expand(ShaderGraph *graph) override;
1435 bool is_linear_operation() override;
1436
1437 NODE_SOCKET_API(float, value)
1438 NODE_SOCKET_API(float, from_min)
1439 NODE_SOCKET_API(float, from_max)
1440 NODE_SOCKET_API(float, to_min)
1441 NODE_SOCKET_API(float, to_max)
1442 NODE_SOCKET_API(float, steps)
1444 NODE_SOCKET_API(bool, clamp)
1445};
1446
1447class ClampNode : public ShaderNode {
1448 public:
1450 void constant_fold(const ConstantFolder &folder) override;
1451 NODE_SOCKET_API(float, value)
1452 NODE_SOCKET_API(float, min)
1453 NODE_SOCKET_API(float, max)
1454 NODE_SOCKET_API(NodeClampType, clamp_type)
1455};
1456
1457class MathNode : public ShaderNode {
1458 public:
1460 void expand(ShaderGraph *graph) override;
1461 void constant_fold(const ConstantFolder &folder) override;
1462 bool is_linear_operation() override;
1463
1464 NODE_SOCKET_API(float, value1)
1465 NODE_SOCKET_API(float, value2)
1466 NODE_SOCKET_API(float, value3)
1467 NODE_SOCKET_API(NodeMathType, math_type)
1468 NODE_SOCKET_API(bool, use_clamp)
1469};
1470
1471class NormalNode : public ShaderNode {
1472 public:
1474 bool is_linear_operation() override
1475 {
1476 return true;
1477 }
1478
1479 NODE_SOCKET_API(float3, direction)
1480 NODE_SOCKET_API(float3, normal)
1481};
1482
1484 public:
1486 void constant_fold(const ConstantFolder &folder) override;
1487 bool is_linear_operation() override;
1488
1489 NODE_SOCKET_API(float3, vector1)
1490 NODE_SOCKET_API(float3, vector2)
1492 NODE_SOCKET_API(float, scale)
1494};
1495
1497 public:
1499
1501 NODE_SOCKET_API(bool, invert)
1503 NODE_SOCKET_API(float3, center)
1504 NODE_SOCKET_API(float3, axis)
1505 NODE_SOCKET_API(float, angle)
1506 NODE_SOCKET_API(float3, rotation)
1507};
1508
1518
1519class BumpNode : public ShaderNode {
1520 public:
1522 void constant_fold(const ConstantFolder &folder) override;
1523 bool has_spatial_varying() override
1524 {
1525 return true;
1526 }
1528 {
1530 }
1531
1532 NODE_SOCKET_API(bool, invert)
1533 NODE_SOCKET_API(bool, use_object_space)
1534 NODE_SOCKET_API(float, height)
1535 NODE_SOCKET_API(float, filter_width)
1536 NODE_SOCKET_API(float, sample_center)
1537 NODE_SOCKET_API(float, sample_x)
1538 NODE_SOCKET_API(float, sample_y)
1539 NODE_SOCKET_API(float3, normal)
1540 NODE_SOCKET_API(float, strength)
1542};
1543
1544class CurvesNode : public ShaderNode {
1545 public:
1546 explicit CurvesNode(const NodeType *node_type);
1548
1550 NODE_SOCKET_API(float, min_x)
1551 NODE_SOCKET_API(float, max_x)
1552 NODE_SOCKET_API(float, fac)
1553 NODE_SOCKET_API(float3, value)
1554 NODE_SOCKET_API(bool, extrapolate)
1555
1556 protected:
1558 void constant_fold(const ConstantFolder &folder, ShaderInput *value_in);
1559 void compile(SVMCompiler &compiler,
1560 const int type,
1561 ShaderInput *value_in,
1562 ShaderOutput *value_out);
1563 void compile(OSLCompiler &compiler, const char *name);
1564};
1565
1567 public:
1569 void constant_fold(const ConstantFolder &folder) override;
1570};
1571
1573 public:
1575 void constant_fold(const ConstantFolder &folder) override;
1576};
1577
1579 public:
1581 void constant_fold(const ConstantFolder &folder) override;
1582
1584 NODE_SOCKET_API(float, min_x)
1585 NODE_SOCKET_API(float, max_x)
1586 NODE_SOCKET_API(float, fac)
1587 NODE_SOCKET_API(float, value)
1588 NODE_SOCKET_API(bool, extrapolate)
1589};
1590
1591class RGBRampNode : public ShaderNode {
1592 public:
1594 void constant_fold(const ConstantFolder &folder) override;
1595
1598 NODE_SOCKET_API(float, fac)
1599 NODE_SOCKET_API(bool, interpolate)
1600};
1601
1603 public:
1605 NODE_SOCKET_API(float3, direction)
1606};
1607
1608class OSLNode final : public ShaderNode {
1609 public:
1610 static OSLNode *create(ShaderGraph *graph,
1611 const size_t num_inputs,
1612 const OSLNode *from = nullptr);
1613 ~OSLNode() override;
1614
1615 static void operator delete(void *ptr)
1616 {
1617 /* Override delete operator to silence new-delete-type-mismatch ASAN warnings
1618 * regarding size mismatch in the destructor. This is intentional as we allocate
1619 * extra space at the end of the node. */
1620 ::operator delete(ptr);
1621 }
1622 static void operator delete(void * /*unused*/, void * /*unused*/)
1623 {
1624 /* Deliberately empty placement delete operator, to avoid MSVC warning C4291. */
1625 }
1626
1627 ShaderNode *clone(ShaderGraph *graph) const override;
1628
1629 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1630
1631 char *input_default_value();
1632 void add_input(ustring name, SocketType::Type type, const int flags = 0);
1633 void add_output(ustring name, SocketType::Type type);
1634
1636
1637 bool has_surface_emission() override
1638 {
1639 return has_emission;
1640 }
1641
1642 /* Ideally we could better detect this, but we can't query this now. */
1643 bool has_spatial_varying() override
1644 {
1645 return true;
1646 }
1647 bool has_volume_support() override
1648 {
1649 return true;
1650 }
1655
1656 bool equals(const ShaderNode & /*other*/) override
1657 {
1658 return false;
1659 }
1660
1661 string filepath;
1664};
1665
1667 public:
1669 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1671 {
1672 return true;
1673 }
1674 bool has_spatial_varying() override
1675 {
1676 return true;
1677 }
1678
1680 NODE_SOCKET_API(ustring, attribute)
1681 NODE_SOCKET_API(float, strength)
1682 NODE_SOCKET_API(float3, color)
1683};
1684
1686 public:
1688
1689 NODE_SOCKET_API(bool, use_normalize)
1691 NODE_SOCKET_API(float, r_gon_sides)
1692 NODE_SOCKET_API(float, r_gon_roundness)
1693};
1694
1695class TangentNode : public ShaderNode {
1696 public:
1698 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1700 {
1701 return true;
1702 }
1703 bool has_spatial_varying() override
1704 {
1705 return true;
1706 }
1707
1710 NODE_SOCKET_API(ustring, attribute)
1711};
1712
1713class BevelNode : public ShaderNode {
1714 public:
1716 bool has_spatial_varying() override
1717 {
1718 return true;
1719 }
1721 {
1723 }
1724
1725 NODE_SOCKET_API(float, radius)
1726 NODE_SOCKET_API(float3, normal)
1727 NODE_SOCKET_API(int, samples)
1728};
1729
1731 public:
1733 void constant_fold(const ConstantFolder &folder) override;
1735 {
1737 }
1738
1740 NODE_SOCKET_API(float, height)
1741 NODE_SOCKET_API(float, midlevel)
1742 NODE_SOCKET_API(float, scale)
1743 NODE_SOCKET_API(float3, normal)
1744};
1745
1747 public:
1749 void attributes(Shader *shader, AttributeRequestSet *attributes) override;
1751 {
1752 return true;
1753 }
1754 void constant_fold(const ConstantFolder &folder) override;
1756 {
1758 }
1759
1761 NODE_SOCKET_API(ustring, attribute)
1763 NODE_SOCKET_API(float, midlevel)
1764 NODE_SOCKET_API(float, scale)
1765};
1766
#define final(a, b, c)
Definition BLI_hash.h:19
unsigned int uint
NodeGaborType
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:117
return true
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
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
bool has_spatial_varying() override
uint get_feature() override
bool has_spatial_varying() override
bool has_attribute_dependency() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
uint get_feature() override
bool is_linear_operation() override
uint 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
uint get_feature() override
bool has_spatial_varying() override
ClosureType get_closure_type() override
bool is_linear_operation() 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)
uint get_feature() override
void constant_fold(const ConstantFolder &folder) override
bool has_spatial_varying() override
bool has_spatial_varying() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() override
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() override
bool is_linear_operation() 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)
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
uint get_feature() override
bool is_linear_operation() override
bool has_volume_support() override
void constant_fold(const ConstantFolder &folder) override
uint get_feature() 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
bool is_linear_operation() 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
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
bool has_spatial_varying() override
bool has_spatial_varying() override
bool is_linear_operation() 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
bool is_linear_operation() override
ClosureType get_closure_type() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
void simplify_settings(Scene *scene) override
bool has_attribute_dependency() override
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() override
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() override
bool is_linear_operation() 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
bool is_linear_operation() 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)
bool has_surface_emission() override
bool has_emission
bool has_spatial_varying() override
uint get_feature() override
string filepath
bool is_linear_operation() override
bool equals(const ShaderNode &) override
void simplify_settings(Scene *scene) override
bool is_linear_operation() override
bool equals(const ShaderNode &) override
bool has_attribute_dependency() 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
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_nonzero_weight(const char *name)
bool has_surface_transparent() override
bool has_bssrdf_bump() override
bool has_surface_emission() override
uint 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 is_linear_operation() override
bool has_surface_transparent() override
uint get_feature() override
ClosureType get_closure_type() override
ScatterVolumeNode(const NodeType *node_type)
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() override
virtual uint get_feature()
ShaderNodeSpecialType special_type
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
bool is_linear_operation() override
void constant_fold(const ConstantFolder &folder) override
void constant_fold(const ConstantFolder &folder) override
uint get_feature() override
void attributes(Shader *shader, AttributeRequestSet *attributes) override
bool has_attribute_dependency() override
bool is_linear_operation() override
void expand(ShaderGraph *graph) override
void constant_fold(const ConstantFolder &folder) override
bool is_linear_operation() 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
bool has_volume_support() override
bool equals(const ShaderNode &) override
VolumeNode(const NodeType *node_type)
bool is_linear_operation() override
uint get_feature() override
uint get_feature() override
bool has_spatial_varying() override
#define KERNEL_FEATURE_NODE_PORTAL
#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
IMETHOD void random(Vector &a)
addDelta operator for displacement rotational velocity.
Definition frames.inl:1282
static bool initialized
constexpr T clamp(T, U, U) RET
float distance(VecOp< float, D >, VecOp< float, D >) RET
#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
ClosureType
@ CLOSURE_HOLDOUT_ID
NodeVectorRotateType
NodeVectorTransformType
NodeImageProjection
NodeCombSepColorType
NodeGradientType
NodeTangentDirectionType
NodeVectorMathType
NodeWaveRingsDirection
NodeNormalMapSpace
#define R
#define vector3
const char * name
#define fmaxf
#define SHADER_NODE_NO_CLONE_CLASS(type)
@ SHADER_SPECIAL_TYPE_IMAGE_SLOT
#define SHADER_NODE_CLASS(type)
#define SHADER_NODE_BASE_CLASS(type)
float3 sun_direction(float sun_cos_theta)
Definition sky_math.h:457
#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
ImageAlphaType
Definition texture.h:58
InterpolationType
Definition texture.h:22
ExtensionType
Definition texture.h:71
static int blend(const Tex *tex, const float texvec[3], TexResult *texres)
PointerRNA * ptr
Definition wm_files.cc:4238
bool override
Definition wm_files.cc:1192