2 * Copyright 2011-2013 Blender Foundation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include "render/graph.h"
21 #include "graph/node.h"
23 #include "util/util_string.h"
33 class TextureMapping {
36 Transform compute_transform();
38 void compile(SVMCompiler& compiler, int offset_in, int offset_out);
39 int compile(SVMCompiler& compiler, ShaderInput *vector_in);
40 void compile(OSLCompiler &compiler);
42 int compile_begin(SVMCompiler& compiler, ShaderInput *vector_in);
43 void compile_end(SVMCompiler& compiler, ShaderInput *vector_in, int vector_offset);
52 enum Type { POINT = 0, TEXTURE = 1, VECTOR = 2, NORMAL = 3 };
55 enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 };
56 Mapping x_mapping, y_mapping, z_mapping;
58 enum Projection { FLAT, CUBE, TUBE, SPHERE };
59 Projection projection;
64 class TextureNode : public ShaderNode {
66 explicit TextureNode(const NodeType *node_type) : ShaderNode(node_type) {}
67 TextureMapping tex_mapping;
70 /* Any node which uses image manager's slot should be a subclass of this one. */
71 class ImageSlotTextureNode : public TextureNode {
73 explicit ImageSlotTextureNode(const NodeType *node_type) : TextureNode(node_type) {
74 special_type = SHADER_SPECIAL_TYPE_IMAGE_SLOT;
79 class ImageTextureNode : public ImageSlotTextureNode {
81 SHADER_NODE_NO_CLONE_CLASS(ImageTextureNode)
83 ShaderNode *clone() const;
84 void attributes(Shader *shader, AttributeRequestSet *attributes);
86 ImageManager *image_manager;
92 NodeImageColorSpace color_space;
93 NodeImageProjection projection;
94 InterpolationType interpolation;
95 ExtensionType extension;
96 float projection_blend;
100 virtual bool equals(const ShaderNode& other)
102 const ImageTextureNode& image_node = (const ImageTextureNode&)other;
103 return ImageSlotTextureNode::equals(other) &&
104 builtin_data == image_node.builtin_data &&
105 animated == image_node.animated;
109 class EnvironmentTextureNode : public ImageSlotTextureNode {
111 SHADER_NODE_NO_CLONE_CLASS(EnvironmentTextureNode)
112 ~EnvironmentTextureNode();
113 ShaderNode *clone() const;
114 void attributes(Shader *shader, AttributeRequestSet *attributes);
115 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
117 ImageManager *image_manager;
123 NodeImageColorSpace color_space;
124 NodeEnvironmentProjection projection;
125 InterpolationType interpolation;
129 virtual bool equals(const ShaderNode& other)
131 const EnvironmentTextureNode& env_node = (const EnvironmentTextureNode&)other;
132 return ImageSlotTextureNode::equals(other) &&
133 builtin_data == env_node.builtin_data &&
134 animated == env_node.animated;
138 class SkyTextureNode : public TextureNode {
140 SHADER_NODE_CLASS(SkyTextureNode)
142 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
145 float3 sun_direction;
151 class OutputNode : public ShaderNode {
153 SHADER_NODE_CLASS(OutputNode)
160 /* Don't allow output node de-duplication. */
161 virtual bool equals(const ShaderNode& /*other*/) { return false; }
164 class GradientTextureNode : public TextureNode {
166 SHADER_NODE_CLASS(GradientTextureNode)
168 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
170 NodeGradientType type;
174 class NoiseTextureNode : public TextureNode {
176 SHADER_NODE_CLASS(NoiseTextureNode)
178 float scale, detail, distortion;
182 class VoronoiTextureNode : public TextureNode {
184 SHADER_NODE_CLASS(VoronoiTextureNode)
186 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
188 NodeVoronoiColoring coloring;
193 class MusgraveTextureNode : public TextureNode {
195 SHADER_NODE_CLASS(MusgraveTextureNode)
197 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
199 NodeMusgraveType type;
200 float scale, detail, dimension, lacunarity, offset, gain;
204 class WaveTextureNode : public TextureNode {
206 SHADER_NODE_CLASS(WaveTextureNode)
208 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
211 NodeWaveProfile profile;
213 float scale, distortion, detail, detail_scale;
217 class MagicTextureNode : public TextureNode {
219 SHADER_NODE_CLASS(MagicTextureNode)
221 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
225 float scale, distortion;
228 class CheckerTextureNode : public TextureNode {
230 SHADER_NODE_CLASS(CheckerTextureNode)
232 float3 vector, color1, color2;
235 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
238 class BrickTextureNode : public TextureNode {
240 SHADER_NODE_CLASS(BrickTextureNode)
242 float offset, squash;
243 int offset_frequency, squash_frequency;
245 float3 color1, color2, mortar;
246 float scale, mortar_size, mortar_smooth, bias, brick_width, row_height;
249 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
252 class PointDensityTextureNode : public ShaderNode {
254 SHADER_NODE_NO_CLONE_CLASS(PointDensityTextureNode)
255 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
257 ~PointDensityTextureNode();
258 ShaderNode *clone() const;
259 void attributes(Shader *shader, AttributeRequestSet *attributes);
261 bool has_spatial_varying() { return true; }
262 bool has_object_dependency() { return true; }
265 NodeTexVoxelSpace space;
266 InterpolationType interpolation;
270 ImageManager *image_manager;
274 virtual bool equals(const ShaderNode& other) {
275 const PointDensityTextureNode& point_dendity_node = (const PointDensityTextureNode&)other;
276 return ShaderNode::equals(other) &&
277 builtin_data == point_dendity_node.builtin_data;
281 class MappingNode : public ShaderNode {
283 SHADER_NODE_CLASS(MappingNode)
284 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
287 TextureMapping tex_mapping;
290 class RGBToBWNode : public ShaderNode {
292 SHADER_NODE_CLASS(RGBToBWNode)
293 void constant_fold(const ConstantFolder& folder);
298 class ConvertNode : public ShaderNode {
300 ConvertNode(SocketType::Type from, SocketType::Type to, bool autoconvert = false);
301 SHADER_NODE_BASE_CLASS(ConvertNode)
303 void constant_fold(const ConstantFolder& folder);
305 SocketType::Type from, to;
315 ustring value_string;
318 static const int MAX_TYPE = 12;
319 static bool register_types();
320 static Node* create(const NodeType *type);
321 static const NodeType *node_types[MAX_TYPE][MAX_TYPE];
322 static bool initialized;
325 class BsdfBaseNode : public ShaderNode {
327 BsdfBaseNode(const NodeType *node_type);
329 bool has_spatial_varying() { return true; }
330 virtual ClosureType get_closure_type() { return closure; }
331 virtual bool has_bump();
333 virtual bool equals(const ShaderNode& /*other*/)
335 /* TODO(sergey): With some care BSDF nodes can be de-duplicated. */
342 class BsdfNode : public BsdfBaseNode {
344 explicit BsdfNode(const NodeType *node_type);
345 SHADER_NODE_BASE_CLASS(BsdfNode)
347 void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3 = NULL, ShaderInput *param4 = NULL);
351 float surface_mix_weight;
354 class AnisotropicBsdfNode : public BsdfNode {
356 SHADER_NODE_CLASS(AnisotropicBsdfNode)
359 float roughness, anisotropy, rotation;
360 ClosureType distribution;
362 ClosureType get_closure_type() { return distribution; }
363 void attributes(Shader *shader, AttributeRequestSet *attributes);
366 class DiffuseBsdfNode : public BsdfNode {
368 SHADER_NODE_CLASS(DiffuseBsdfNode)
373 /* Disney principled BRDF */
374 class PrincipledBsdfNode : public BsdfBaseNode {
376 SHADER_NODE_CLASS(PrincipledBsdfNode)
378 bool has_surface_bssrdf();
379 bool has_bssrdf_bump();
380 void compile(SVMCompiler& compiler, ShaderInput *metallic, ShaderInput *subsurface, ShaderInput *subsurface_radius,
381 ShaderInput *specular, ShaderInput *roughness, ShaderInput *specular_tint, ShaderInput *anisotropic,
382 ShaderInput *sheen, ShaderInput *sheen_tint, ShaderInput *clearcoat, ShaderInput *clearcoat_roughness,
383 ShaderInput *ior, ShaderInput *transmission, ShaderInput *anisotropic_rotation, ShaderInput *transmission_roughness);
386 float3 subsurface_color, subsurface_radius;
387 float metallic, subsurface, specular, roughness, specular_tint, anisotropic,
388 sheen, sheen_tint, clearcoat, clearcoat_roughness, ior, transmission,
389 anisotropic_rotation, transmission_roughness;
390 float3 normal, clearcoat_normal, tangent;
391 float surface_mix_weight;
392 ClosureType distribution, distribution_orig;
394 bool has_integrator_dependency();
395 void attributes(Shader *shader, AttributeRequestSet *attributes);
398 class TranslucentBsdfNode : public BsdfNode {
400 SHADER_NODE_CLASS(TranslucentBsdfNode)
403 class TransparentBsdfNode : public BsdfNode {
405 SHADER_NODE_CLASS(TransparentBsdfNode)
407 bool has_surface_transparent() { return true; }
410 class VelvetBsdfNode : public BsdfNode {
412 SHADER_NODE_CLASS(VelvetBsdfNode)
417 class GlossyBsdfNode : public BsdfNode {
419 SHADER_NODE_CLASS(GlossyBsdfNode)
421 void simplify_settings(Scene *scene);
422 bool has_integrator_dependency();
423 ClosureType get_closure_type() { return distribution; }
425 float roughness, roughness_orig;
426 ClosureType distribution, distribution_orig;
429 class GlassBsdfNode : public BsdfNode {
431 SHADER_NODE_CLASS(GlassBsdfNode)
433 void simplify_settings(Scene *scene);
434 bool has_integrator_dependency();
435 ClosureType get_closure_type() { return distribution; }
437 float roughness, roughness_orig, IOR;
438 ClosureType distribution, distribution_orig;
441 class RefractionBsdfNode : public BsdfNode {
443 SHADER_NODE_CLASS(RefractionBsdfNode)
445 void simplify_settings(Scene *scene);
446 bool has_integrator_dependency();
447 ClosureType get_closure_type() { return distribution; }
449 float roughness, roughness_orig, IOR;
450 ClosureType distribution, distribution_orig;
453 class ToonBsdfNode : public BsdfNode {
455 SHADER_NODE_CLASS(ToonBsdfNode)
458 ClosureType component;
461 class SubsurfaceScatteringNode : public BsdfNode {
463 SHADER_NODE_CLASS(SubsurfaceScatteringNode)
464 bool has_surface_bssrdf() { return true; }
465 bool has_bssrdf_bump();
466 ClosureType get_closure_type() { return falloff; }
475 class EmissionNode : public ShaderNode {
477 SHADER_NODE_CLASS(EmissionNode)
478 void constant_fold(const ConstantFolder& folder);
480 bool has_surface_emission() { return true; }
481 bool has_volume_support() { return true; }
485 float surface_mix_weight;
488 class BackgroundNode : public ShaderNode {
490 SHADER_NODE_CLASS(BackgroundNode)
491 void constant_fold(const ConstantFolder& folder);
495 float surface_mix_weight;
498 class HoldoutNode : public ShaderNode {
500 SHADER_NODE_CLASS(HoldoutNode)
501 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
502 virtual ClosureType get_closure_type() { return CLOSURE_HOLDOUT_ID; }
504 float surface_mix_weight;
505 float volume_mix_weight;
508 class AmbientOcclusionNode : public ShaderNode {
510 SHADER_NODE_CLASS(AmbientOcclusionNode)
512 bool has_spatial_varying() { return true; }
513 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
514 virtual ClosureType get_closure_type() { return CLOSURE_AMBIENT_OCCLUSION_ID; }
518 float surface_mix_weight;
521 class VolumeNode : public ShaderNode {
523 VolumeNode(const NodeType *node_type);
524 SHADER_NODE_BASE_CLASS(VolumeNode)
526 void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2);
527 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
528 virtual int get_feature() {
529 return ShaderNode::get_feature() | NODE_FEATURE_VOLUME;
531 virtual ClosureType get_closure_type() { return closure; }
532 virtual bool has_volume_support() { return true; }
536 float volume_mix_weight;
539 virtual bool equals(const ShaderNode& /*other*/)
541 /* TODO(sergey): With some care Volume nodes can be de-duplicated. */
546 class AbsorptionVolumeNode : public VolumeNode {
548 SHADER_NODE_CLASS(AbsorptionVolumeNode)
551 class ScatterVolumeNode : public VolumeNode {
553 SHADER_NODE_CLASS(ScatterVolumeNode)
558 class HairBsdfNode : public BsdfNode {
560 SHADER_NODE_CLASS(HairBsdfNode)
561 ClosureType get_closure_type() { return component; }
563 ClosureType component;
570 class GeometryNode : public ShaderNode {
572 SHADER_NODE_CLASS(GeometryNode)
573 void attributes(Shader *shader, AttributeRequestSet *attributes);
574 bool has_spatial_varying() { return true; }
579 class TextureCoordinateNode : public ShaderNode {
581 SHADER_NODE_CLASS(TextureCoordinateNode)
582 void attributes(Shader *shader, AttributeRequestSet *attributes);
583 bool has_spatial_varying() { return true; }
584 bool has_object_dependency() { return use_transform; }
592 class UVMapNode : public ShaderNode {
594 SHADER_NODE_CLASS(UVMapNode)
595 void attributes(Shader *shader, AttributeRequestSet *attributes);
596 bool has_spatial_varying() { return true; }
597 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
603 class LightPathNode : public ShaderNode {
605 SHADER_NODE_CLASS(LightPathNode)
606 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
609 class LightFalloffNode : public ShaderNode {
611 SHADER_NODE_CLASS(LightFalloffNode)
612 bool has_spatial_varying() { return true; }
613 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
619 class ObjectInfoNode : public ShaderNode {
621 SHADER_NODE_CLASS(ObjectInfoNode)
622 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
625 class ParticleInfoNode : public ShaderNode {
627 SHADER_NODE_CLASS(ParticleInfoNode)
628 void attributes(Shader *shader, AttributeRequestSet *attributes);
629 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
632 class HairInfoNode : public ShaderNode {
634 SHADER_NODE_CLASS(HairInfoNode)
636 void attributes(Shader *shader, AttributeRequestSet *attributes);
637 bool has_spatial_varying() { return true; }
638 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
639 virtual int get_feature() {
640 return ShaderNode::get_feature() | NODE_FEATURE_HAIR;
644 class ValueNode : public ShaderNode {
646 SHADER_NODE_CLASS(ValueNode)
648 void constant_fold(const ConstantFolder& folder);
653 class ColorNode : public ShaderNode {
655 SHADER_NODE_CLASS(ColorNode)
657 void constant_fold(const ConstantFolder& folder);
662 class AddClosureNode : public ShaderNode {
664 SHADER_NODE_CLASS(AddClosureNode)
665 void constant_fold(const ConstantFolder& folder);
668 class MixClosureNode : public ShaderNode {
670 SHADER_NODE_CLASS(MixClosureNode)
671 void constant_fold(const ConstantFolder& folder);
676 class MixClosureWeightNode : public ShaderNode {
678 SHADER_NODE_CLASS(MixClosureWeightNode)
684 class InvertNode : public ShaderNode {
686 SHADER_NODE_CLASS(InvertNode)
687 void constant_fold(const ConstantFolder& folder);
688 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
694 class MixNode : public ShaderNode {
696 SHADER_NODE_CLASS(MixNode)
697 void constant_fold(const ConstantFolder& folder);
699 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
708 class CombineRGBNode : public ShaderNode {
710 SHADER_NODE_CLASS(CombineRGBNode)
711 void constant_fold(const ConstantFolder& folder);
712 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
717 class CombineHSVNode : public ShaderNode {
719 SHADER_NODE_CLASS(CombineHSVNode)
720 void constant_fold(const ConstantFolder& folder);
721 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
726 class CombineXYZNode : public ShaderNode {
728 SHADER_NODE_CLASS(CombineXYZNode)
729 void constant_fold(const ConstantFolder& folder);
730 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
735 class GammaNode : public ShaderNode {
737 SHADER_NODE_CLASS(GammaNode)
738 void constant_fold(const ConstantFolder& folder);
739 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
745 class BrightContrastNode : public ShaderNode {
747 SHADER_NODE_CLASS(BrightContrastNode)
748 void constant_fold(const ConstantFolder& folder);
749 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
756 class SeparateRGBNode : public ShaderNode {
758 SHADER_NODE_CLASS(SeparateRGBNode)
759 void constant_fold(const ConstantFolder& folder);
760 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
765 class SeparateHSVNode : public ShaderNode {
767 SHADER_NODE_CLASS(SeparateHSVNode)
768 void constant_fold(const ConstantFolder& folder);
769 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
774 class SeparateXYZNode : public ShaderNode {
776 SHADER_NODE_CLASS(SeparateXYZNode)
777 void constant_fold(const ConstantFolder& folder);
778 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
783 class HSVNode : public ShaderNode {
785 SHADER_NODE_CLASS(HSVNode)
794 class AttributeNode : public ShaderNode {
796 SHADER_NODE_CLASS(AttributeNode)
797 void attributes(Shader *shader, AttributeRequestSet *attributes);
798 bool has_spatial_varying() { return true; }
803 class CameraNode : public ShaderNode {
805 SHADER_NODE_CLASS(CameraNode)
806 bool has_spatial_varying() { return true; }
807 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
810 class FresnelNode : public ShaderNode {
812 SHADER_NODE_CLASS(FresnelNode)
813 bool has_spatial_varying() { return true; }
814 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
820 class LayerWeightNode : public ShaderNode {
822 SHADER_NODE_CLASS(LayerWeightNode)
823 bool has_spatial_varying() { return true; }
824 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
830 class WireframeNode : public ShaderNode {
832 SHADER_NODE_CLASS(WireframeNode)
833 bool has_spatial_varying() { return true; }
834 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
840 class WavelengthNode : public ShaderNode {
842 SHADER_NODE_CLASS(WavelengthNode)
843 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
848 class BlackbodyNode : public ShaderNode {
850 SHADER_NODE_CLASS(BlackbodyNode)
851 void constant_fold(const ConstantFolder& folder);
852 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
857 class MathNode : public ShaderNode {
859 SHADER_NODE_CLASS(MathNode)
860 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
861 void constant_fold(const ConstantFolder& folder);
869 class NormalNode : public ShaderNode {
871 SHADER_NODE_CLASS(NormalNode)
872 virtual int get_group() { return NODE_GROUP_LEVEL_2; }
878 class VectorMathNode : public ShaderNode {
880 SHADER_NODE_CLASS(VectorMathNode)
881 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
882 void constant_fold(const ConstantFolder& folder);
889 class VectorTransformNode : public ShaderNode {
891 SHADER_NODE_CLASS(VectorTransformNode)
893 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
895 NodeVectorTransformType type;
896 NodeVectorTransformConvertSpace convert_from;
897 NodeVectorTransformConvertSpace convert_to;
901 class BumpNode : public ShaderNode {
903 SHADER_NODE_CLASS(BumpNode)
904 void constant_fold(const ConstantFolder& folder);
905 bool has_spatial_varying() { return true; }
906 virtual int get_feature() {
907 return NODE_FEATURE_BUMP;
911 bool use_object_space;
921 class CurvesNode : public ShaderNode {
923 explicit CurvesNode(const NodeType *node_type);
924 SHADER_NODE_BASE_CLASS(CurvesNode)
926 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
928 array<float3> curves;
929 float min_x, max_x, fac;
933 void constant_fold(const ConstantFolder& folder, ShaderInput *value_in);
934 void compile(SVMCompiler& compiler, int type, ShaderInput *value_in, ShaderOutput *value_out);
935 void compile(OSLCompiler& compiler, const char *name);
938 class RGBCurvesNode : public CurvesNode {
940 SHADER_NODE_CLASS(RGBCurvesNode)
941 void constant_fold(const ConstantFolder& folder);
944 class VectorCurvesNode : public CurvesNode {
946 SHADER_NODE_CLASS(VectorCurvesNode)
947 void constant_fold(const ConstantFolder& folder);
950 class RGBRampNode : public ShaderNode {
952 SHADER_NODE_CLASS(RGBRampNode)
953 void constant_fold(const ConstantFolder& folder);
954 virtual int get_group() { return NODE_GROUP_LEVEL_1; }
957 array<float> ramp_alpha;
962 class SetNormalNode : public ShaderNode {
964 SHADER_NODE_CLASS(SetNormalNode)
968 class OSLNode : public ShaderNode {
970 static OSLNode *create(size_t num_inputs, const OSLNode *from = NULL);
973 ShaderNode *clone() const;
975 char* input_default_value();
976 void add_input(ustring name, SocketType::Type type);
977 void add_output(ustring name, SocketType::Type type);
979 SHADER_NODE_NO_CLONE_CLASS(OSLNode)
981 /* ideally we could beter detect this, but we can't query this now */
982 bool has_spatial_varying() { return true; }
983 bool has_volume_support() { return true; }
985 virtual bool equals(const ShaderNode& /*other*/) { return false; }
988 string bytecode_hash;
991 class NormalMapNode : public ShaderNode {
993 SHADER_NODE_CLASS(NormalMapNode)
994 void attributes(Shader *shader, AttributeRequestSet *attributes);
995 bool has_spatial_varying() { return true; }
996 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
998 NodeNormalMapSpace space;
1005 class TangentNode : public ShaderNode {
1007 SHADER_NODE_CLASS(TangentNode)
1008 void attributes(Shader *shader, AttributeRequestSet *attributes);
1009 bool has_spatial_varying() { return true; }
1010 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
1012 NodeTangentDirectionType direction_type;
1013 NodeTangentAxis axis;
1018 class BevelNode : public ShaderNode {
1020 SHADER_NODE_CLASS(BevelNode)
1021 bool has_spatial_varying() { return true; }
1022 virtual int get_group() { return NODE_GROUP_LEVEL_3; }
1023 virtual bool has_raytrace() { return true; }
1030 class DisplacementNode : public ShaderNode {
1032 SHADER_NODE_CLASS(DisplacementNode)
1033 virtual int get_feature() {
1034 return NODE_FEATURE_BUMP;
1044 #endif /* __NODES_H__ */