Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/render/nodes.h')
-rw-r--r--intern/cycles/render/nodes.h1569
1 files changed, 0 insertions, 1569 deletions
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
deleted file mode 100644
index 5ac72835ac5..00000000000
--- a/intern/cycles/render/nodes.h
+++ /dev/null
@@ -1,1569 +0,0 @@
-/*
- * Copyright 2011-2013 Blender Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __NODES_H__
-#define __NODES_H__
-
-#include "graph/node.h"
-#include "render/graph.h"
-#include "render/image.h"
-
-#include "util/util_array.h"
-#include "util/util_string.h"
-
-CCL_NAMESPACE_BEGIN
-
-class ImageManager;
-class LightManager;
-class Scene;
-class Shader;
-
-/* Texture Mapping */
-
-class TextureMapping {
- public:
- TextureMapping();
- Transform compute_transform();
- bool skip();
- void compile(SVMCompiler &compiler, int offset_in, int offset_out);
- int compile(SVMCompiler &compiler, ShaderInput *vector_in);
- void compile(OSLCompiler &compiler);
-
- int compile_begin(SVMCompiler &compiler, ShaderInput *vector_in);
- void compile_end(SVMCompiler &compiler, ShaderInput *vector_in, int vector_offset);
-
- float3 translation;
- float3 rotation;
- float3 scale;
-
- float3 min, max;
- bool use_minmax;
-
- enum Type { POINT = 0, TEXTURE = 1, VECTOR = 2, NORMAL = 3 };
- Type type;
-
- enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 };
- Mapping x_mapping, y_mapping, z_mapping;
-
- enum Projection { FLAT, CUBE, TUBE, SPHERE };
- Projection projection;
-};
-
-/* Nodes */
-
-class TextureNode : public ShaderNode {
- public:
- explicit TextureNode(const NodeType *node_type) : ShaderNode(node_type)
- {
- }
- TextureMapping tex_mapping;
- NODE_SOCKET_API_STRUCT_MEMBER(float3, tex_mapping, translation)
- NODE_SOCKET_API_STRUCT_MEMBER(float3, tex_mapping, rotation)
- NODE_SOCKET_API_STRUCT_MEMBER(float3, tex_mapping, scale)
- NODE_SOCKET_API_STRUCT_MEMBER(float3, tex_mapping, min)
- NODE_SOCKET_API_STRUCT_MEMBER(float3, tex_mapping, max)
- NODE_SOCKET_API_STRUCT_MEMBER(bool, tex_mapping, use_minmax)
- NODE_SOCKET_API_STRUCT_MEMBER(TextureMapping::Type, tex_mapping, type)
- NODE_SOCKET_API_STRUCT_MEMBER(TextureMapping::Mapping, tex_mapping, x_mapping)
- NODE_SOCKET_API_STRUCT_MEMBER(TextureMapping::Mapping, tex_mapping, y_mapping)
- NODE_SOCKET_API_STRUCT_MEMBER(TextureMapping::Mapping, tex_mapping, z_mapping)
- NODE_SOCKET_API_STRUCT_MEMBER(TextureMapping::Projection, tex_mapping, projection)
-};
-
-/* Any node which uses image manager's slot should be a subclass of this one. */
-class ImageSlotTextureNode : public TextureNode {
- public:
- explicit ImageSlotTextureNode(const NodeType *node_type) : TextureNode(node_type)
- {
- special_type = SHADER_SPECIAL_TYPE_IMAGE_SLOT;
- }
-
- virtual bool equals(const ShaderNode &other)
- {
- const ImageSlotTextureNode &other_node = (const ImageSlotTextureNode &)other;
- return TextureNode::equals(other) && handle == other_node.handle;
- }
-
- ImageHandle handle;
-};
-
-class ImageTextureNode : public ImageSlotTextureNode {
- public:
- SHADER_NODE_NO_CLONE_CLASS(ImageTextureNode)
- ShaderNode *clone(ShaderGraph *graph) const;
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
-
- virtual bool equals(const ShaderNode &other)
- {
- const ImageTextureNode &other_node = (const ImageTextureNode &)other;
- return ImageSlotTextureNode::equals(other) && animated == other_node.animated;
- }
-
- ImageParams image_params() const;
-
- /* Parameters. */
- NODE_SOCKET_API(ustring, filename)
- NODE_SOCKET_API(ustring, colorspace)
- NODE_SOCKET_API(ImageAlphaType, alpha_type)
- NODE_SOCKET_API(NodeImageProjection, projection)
- NODE_SOCKET_API(InterpolationType, interpolation)
- NODE_SOCKET_API(ExtensionType, extension)
- NODE_SOCKET_API(float, projection_blend)
- NODE_SOCKET_API(bool, animated)
- NODE_SOCKET_API(float3, vector)
- NODE_SOCKET_API_ARRAY(array<int>, tiles)
-
- protected:
- void cull_tiles(Scene *scene, ShaderGraph *graph);
-};
-
-class EnvironmentTextureNode : public ImageSlotTextureNode {
- public:
- SHADER_NODE_NO_CLONE_CLASS(EnvironmentTextureNode)
- ShaderNode *clone(ShaderGraph *graph) const;
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
-
- virtual bool equals(const ShaderNode &other)
- {
- const EnvironmentTextureNode &other_node = (const EnvironmentTextureNode &)other;
- return ImageSlotTextureNode::equals(other) && animated == other_node.animated;
- }
-
- ImageParams image_params() const;
-
- /* Parameters. */
- NODE_SOCKET_API(ustring, filename)
- NODE_SOCKET_API(ustring, colorspace)
- NODE_SOCKET_API(ImageAlphaType, alpha_type)
- NODE_SOCKET_API(NodeEnvironmentProjection, projection)
- NODE_SOCKET_API(InterpolationType, interpolation)
- NODE_SOCKET_API(bool, animated)
- NODE_SOCKET_API(float3, vector)
-};
-
-class SkyTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(SkyTextureNode)
-
- NODE_SOCKET_API(NodeSkyType, sky_type)
- NODE_SOCKET_API(float3, sun_direction)
- NODE_SOCKET_API(float, turbidity)
- NODE_SOCKET_API(float, ground_albedo)
- NODE_SOCKET_API(bool, sun_disc)
- NODE_SOCKET_API(float, sun_size)
- NODE_SOCKET_API(float, sun_intensity)
- NODE_SOCKET_API(float, sun_elevation)
- NODE_SOCKET_API(float, sun_rotation)
- NODE_SOCKET_API(float, altitude)
- NODE_SOCKET_API(float, air_density)
- NODE_SOCKET_API(float, dust_density)
- NODE_SOCKET_API(float, ozone_density)
- NODE_SOCKET_API(float3, vector)
- ImageHandle handle;
-
- float get_sun_size()
- {
- /* Clamping for numerical precision. */
- return fmaxf(sun_size, 0.0005f);
- }
-};
-
-class OutputNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(OutputNode)
-
- NODE_SOCKET_API(Node *, surface)
- NODE_SOCKET_API(Node *, volume)
- NODE_SOCKET_API(float3, displacement)
- NODE_SOCKET_API(float3, normal)
-
- /* Don't allow output node de-duplication. */
- virtual bool equals(const ShaderNode & /*other*/)
- {
- return false;
- }
-};
-
-class OutputAOVNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(OutputAOVNode)
- virtual void simplify_settings(Scene *scene);
-
- NODE_SOCKET_API(float, value)
- NODE_SOCKET_API(float3, color)
-
- NODE_SOCKET_API(ustring, name)
-
- /* Don't allow output node de-duplication. */
- virtual bool equals(const ShaderNode & /*other*/)
- {
- return false;
- }
-
- int offset;
- bool is_color;
-};
-
-class GradientTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(GradientTextureNode)
-
- NODE_SOCKET_API(NodeGradientType, gradient_type)
- NODE_SOCKET_API(float3, vector)
-};
-
-class NoiseTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(NoiseTextureNode)
-
- NODE_SOCKET_API(int, dimensions)
- NODE_SOCKET_API(float, w)
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(float, detail)
- NODE_SOCKET_API(float, roughness)
- NODE_SOCKET_API(float, distortion)
- NODE_SOCKET_API(float3, vector)
-};
-
-class VoronoiTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(VoronoiTextureNode)
-
- virtual int get_feature()
- {
- int result = ShaderNode::get_feature();
- if (dimensions == 4) {
- result |= KERNEL_FEATURE_NODE_VORONOI_EXTRA;
- }
- else if (dimensions >= 2 && feature == NODE_VORONOI_SMOOTH_F1) {
- result |= KERNEL_FEATURE_NODE_VORONOI_EXTRA;
- }
- return result;
- }
-
- NODE_SOCKET_API(int, dimensions)
- NODE_SOCKET_API(NodeVoronoiDistanceMetric, metric)
- NODE_SOCKET_API(NodeVoronoiFeature, feature)
- NODE_SOCKET_API(float, w)
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(float, exponent)
- NODE_SOCKET_API(float, smoothness)
- NODE_SOCKET_API(float, randomness)
- NODE_SOCKET_API(float3, vector)
-};
-
-class MusgraveTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(MusgraveTextureNode)
-
- NODE_SOCKET_API(int, dimensions)
- NODE_SOCKET_API(NodeMusgraveType, musgrave_type)
- NODE_SOCKET_API(float, w)
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(float, detail)
- NODE_SOCKET_API(float, dimension)
- NODE_SOCKET_API(float, lacunarity)
- NODE_SOCKET_API(float, offset)
- NODE_SOCKET_API(float, gain)
- NODE_SOCKET_API(float3, vector)
-};
-
-class WaveTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(WaveTextureNode)
-
- NODE_SOCKET_API(NodeWaveType, wave_type)
- NODE_SOCKET_API(NodeWaveBandsDirection, bands_direction)
- NODE_SOCKET_API(NodeWaveRingsDirection, rings_direction)
- NODE_SOCKET_API(NodeWaveProfile, profile)
-
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(float, distortion)
- NODE_SOCKET_API(float, detail)
- NODE_SOCKET_API(float, detail_scale)
- NODE_SOCKET_API(float, detail_roughness)
- NODE_SOCKET_API(float, phase)
- NODE_SOCKET_API(float3, vector)
-};
-
-class MagicTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(MagicTextureNode)
-
- NODE_SOCKET_API(int, depth)
- NODE_SOCKET_API(float3, vector)
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(float, distortion)
-};
-
-class CheckerTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(CheckerTextureNode)
-
- NODE_SOCKET_API(float3, vector)
- NODE_SOCKET_API(float3, color1)
- NODE_SOCKET_API(float3, color2)
- NODE_SOCKET_API(float, scale)
-};
-
-class BrickTextureNode : public TextureNode {
- public:
- SHADER_NODE_CLASS(BrickTextureNode)
-
- NODE_SOCKET_API(float, offset)
- NODE_SOCKET_API(float, squash)
- NODE_SOCKET_API(int, offset_frequency)
- NODE_SOCKET_API(int, squash_frequency)
-
- NODE_SOCKET_API(float3, color1)
- NODE_SOCKET_API(float3, color2)
- NODE_SOCKET_API(float3, mortar)
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(float, mortar_size)
- NODE_SOCKET_API(float, mortar_smooth)
- NODE_SOCKET_API(float, bias)
- NODE_SOCKET_API(float, brick_width)
- NODE_SOCKET_API(float, row_height)
- NODE_SOCKET_API(float3, vector)
-};
-
-class PointDensityTextureNode : public ShaderNode {
- public:
- SHADER_NODE_NO_CLONE_CLASS(PointDensityTextureNode)
-
- ~PointDensityTextureNode();
- ShaderNode *clone(ShaderGraph *graph) const;
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
-
- bool has_spatial_varying()
- {
- return true;
- }
-
- /* Parameters. */
- NODE_SOCKET_API(ustring, filename)
- NODE_SOCKET_API(NodeTexVoxelSpace, space)
- NODE_SOCKET_API(InterpolationType, interpolation)
- NODE_SOCKET_API(Transform, tfm)
- NODE_SOCKET_API(float3, vector)
-
- /* Runtime. */
- ImageHandle handle;
-
- ImageParams image_params() const;
-
- virtual bool equals(const ShaderNode &other)
- {
- const PointDensityTextureNode &other_node = (const PointDensityTextureNode &)other;
- return ShaderNode::equals(other) && handle == other_node.handle;
- }
-};
-
-class IESLightNode : public TextureNode {
- public:
- SHADER_NODE_NO_CLONE_CLASS(IESLightNode)
-
- ~IESLightNode();
- ShaderNode *clone(ShaderGraph *graph) const;
-
- NODE_SOCKET_API(ustring, filename)
- NODE_SOCKET_API(ustring, ies)
-
- NODE_SOCKET_API(float, strength)
- NODE_SOCKET_API(float3, vector)
-
- private:
- LightManager *light_manager;
- int slot;
-
- void get_slot();
-};
-
-class WhiteNoiseTextureNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(WhiteNoiseTextureNode)
-
- NODE_SOCKET_API(int, dimensions)
- NODE_SOCKET_API(float3, vector)
- NODE_SOCKET_API(float, w)
-};
-
-class MappingNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(MappingNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, vector)
- NODE_SOCKET_API(float3, location)
- NODE_SOCKET_API(float3, rotation)
- NODE_SOCKET_API(float3, scale)
- NODE_SOCKET_API(NodeMappingType, mapping_type)
-};
-
-class RGBToBWNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(RGBToBWNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, color)
-};
-
-class ConvertNode : public ShaderNode {
- public:
- ConvertNode(SocketType::Type from, SocketType::Type to, bool autoconvert = false);
- ConvertNode(const ConvertNode &other);
- SHADER_NODE_BASE_CLASS(ConvertNode)
-
- void constant_fold(const ConstantFolder &folder);
-
- private:
- SocketType::Type from, to;
-
- union {
- float value_float;
- int value_int;
- float3 value_color;
- float3 value_vector;
- float3 value_point;
- float3 value_normal;
- };
- ustring value_string;
-
- static const int MAX_TYPE = 12;
- static bool register_types();
- static Node *create(const NodeType *type);
- static const NodeType *node_types[MAX_TYPE][MAX_TYPE];
- static bool initialized;
-};
-
-class BsdfBaseNode : public ShaderNode {
- public:
- BsdfBaseNode(const NodeType *node_type);
-
- bool has_spatial_varying()
- {
- return true;
- }
- virtual ClosureType get_closure_type()
- {
- return closure;
- }
- virtual bool has_bump();
-
- virtual bool equals(const ShaderNode & /*other*/)
- {
- /* TODO(sergey): With some care BSDF nodes can be de-duplicated. */
- return false;
- }
-
- virtual int get_feature()
- {
- return ShaderNode::get_feature() | KERNEL_FEATURE_NODE_BSDF;
- }
-
- protected:
- ClosureType closure;
-};
-
-class BsdfNode : public BsdfBaseNode {
- public:
- explicit BsdfNode(const NodeType *node_type);
- SHADER_NODE_BASE_CLASS(BsdfNode)
-
- void compile(SVMCompiler &compiler,
- ShaderInput *param1,
- ShaderInput *param2,
- ShaderInput *param3 = NULL,
- ShaderInput *param4 = NULL);
-
- NODE_SOCKET_API(float3, color)
- NODE_SOCKET_API(float3, normal)
- NODE_SOCKET_API(float, surface_mix_weight)
-};
-
-class AnisotropicBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(AnisotropicBsdfNode)
-
- NODE_SOCKET_API(float3, tangent)
- NODE_SOCKET_API(float, roughness)
- NODE_SOCKET_API(float, anisotropy)
- NODE_SOCKET_API(float, rotation)
- NODE_SOCKET_API(ClosureType, distribution)
-
- ClosureType get_closure_type()
- {
- return distribution;
- }
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
-};
-
-class DiffuseBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(DiffuseBsdfNode)
-
- NODE_SOCKET_API(float, roughness)
-};
-
-/* Disney principled BRDF */
-class PrincipledBsdfNode : public BsdfBaseNode {
- public:
- SHADER_NODE_CLASS(PrincipledBsdfNode)
-
- void expand(ShaderGraph *graph);
- bool has_surface_bssrdf();
- bool has_bssrdf_bump();
- void compile(SVMCompiler &compiler,
- ShaderInput *metallic,
- ShaderInput *subsurface,
- ShaderInput *subsurface_radius,
- ShaderInput *subsurface_ior,
- ShaderInput *subsurface_anisotropy,
- ShaderInput *specular,
- ShaderInput *roughness,
- ShaderInput *specular_tint,
- ShaderInput *anisotropic,
- ShaderInput *sheen,
- ShaderInput *sheen_tint,
- ShaderInput *clearcoat,
- ShaderInput *clearcoat_roughness,
- ShaderInput *ior,
- ShaderInput *transmission,
- ShaderInput *anisotropic_rotation,
- ShaderInput *transmission_roughness);
-
- NODE_SOCKET_API(float3, base_color)
- NODE_SOCKET_API(float3, subsurface_color)
- NODE_SOCKET_API(float3, subsurface_radius)
- NODE_SOCKET_API(float, subsurface_ior)
- NODE_SOCKET_API(float, subsurface_anisotropy)
- NODE_SOCKET_API(float, metallic)
- NODE_SOCKET_API(float, subsurface)
- NODE_SOCKET_API(float, specular)
- NODE_SOCKET_API(float, roughness)
- NODE_SOCKET_API(float, specular_tint)
- NODE_SOCKET_API(float, anisotropic)
- NODE_SOCKET_API(float, sheen)
- NODE_SOCKET_API(float, sheen_tint)
- NODE_SOCKET_API(float, clearcoat)
- NODE_SOCKET_API(float, clearcoat_roughness)
- NODE_SOCKET_API(float, ior)
- NODE_SOCKET_API(float, transmission)
- NODE_SOCKET_API(float, anisotropic_rotation)
- NODE_SOCKET_API(float, transmission_roughness)
- NODE_SOCKET_API(float3, normal)
- NODE_SOCKET_API(float3, clearcoat_normal)
- NODE_SOCKET_API(float3, tangent)
- NODE_SOCKET_API(float, surface_mix_weight)
- NODE_SOCKET_API(ClosureType, distribution)
- NODE_SOCKET_API(ClosureType, subsurface_method)
- NODE_SOCKET_API(float3, emission)
- NODE_SOCKET_API(float, emission_strength)
- NODE_SOCKET_API(float, alpha)
-
- private:
- ClosureType distribution_orig;
-
- public:
- bool has_integrator_dependency();
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
-};
-
-class TranslucentBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(TranslucentBsdfNode)
-};
-
-class TransparentBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(TransparentBsdfNode)
-
- bool has_surface_transparent()
- {
- return true;
- }
-};
-
-class VelvetBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(VelvetBsdfNode)
-
- NODE_SOCKET_API(float, sigma)
-};
-
-class GlossyBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(GlossyBsdfNode)
-
- void simplify_settings(Scene *scene);
- bool has_integrator_dependency();
- ClosureType get_closure_type()
- {
- return distribution;
- }
-
- NODE_SOCKET_API(float, roughness)
- NODE_SOCKET_API(ClosureType, distribution)
-
- private:
- float roughness_orig;
- ClosureType distribution_orig;
-};
-
-class GlassBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(GlassBsdfNode)
-
- void simplify_settings(Scene *scene);
- bool has_integrator_dependency();
- ClosureType get_closure_type()
- {
- return distribution;
- }
-
- NODE_SOCKET_API(float, roughness)
- NODE_SOCKET_API(float, IOR)
- NODE_SOCKET_API(ClosureType, distribution)
-
- private:
- float roughness_orig;
- ClosureType distribution_orig;
-};
-
-class RefractionBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(RefractionBsdfNode)
-
- void simplify_settings(Scene *scene);
- bool has_integrator_dependency();
- ClosureType get_closure_type()
- {
- return distribution;
- }
-
- NODE_SOCKET_API(float, roughness)
- NODE_SOCKET_API(float, IOR)
- NODE_SOCKET_API(ClosureType, distribution)
-
- private:
- float roughness_orig;
- ClosureType distribution_orig;
-};
-
-class ToonBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(ToonBsdfNode)
-
- NODE_SOCKET_API(float, smooth)
- NODE_SOCKET_API(float, size)
- NODE_SOCKET_API(ClosureType, component)
-};
-
-class SubsurfaceScatteringNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(SubsurfaceScatteringNode)
- bool has_surface_bssrdf()
- {
- return true;
- }
- bool has_bssrdf_bump();
- ClosureType get_closure_type()
- {
- return method;
- }
-
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(float3, radius)
- NODE_SOCKET_API(float, subsurface_ior)
- NODE_SOCKET_API(float, subsurface_anisotropy)
- NODE_SOCKET_API(ClosureType, method)
-};
-
-class EmissionNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(EmissionNode)
- void constant_fold(const ConstantFolder &folder);
-
- bool has_surface_emission()
- {
- return true;
- }
- bool has_volume_support()
- {
- return true;
- }
-
- virtual int get_feature()
- {
- return ShaderNode::get_feature() | KERNEL_FEATURE_NODE_EMISSION;
- }
-
- NODE_SOCKET_API(float3, color)
- NODE_SOCKET_API(float, strength)
- NODE_SOCKET_API(float, surface_mix_weight)
-};
-
-class BackgroundNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(BackgroundNode)
- void constant_fold(const ConstantFolder &folder);
-
- virtual int get_feature()
- {
- return ShaderNode::get_feature() | KERNEL_FEATURE_NODE_EMISSION;
- }
-
- NODE_SOCKET_API(float3, color)
- NODE_SOCKET_API(float, strength)
- NODE_SOCKET_API(float, surface_mix_weight)
-};
-
-class HoldoutNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(HoldoutNode)
- virtual ClosureType get_closure_type()
- {
- return CLOSURE_HOLDOUT_ID;
- }
-
- NODE_SOCKET_API(float, surface_mix_weight)
- NODE_SOCKET_API(float, volume_mix_weight)
-};
-
-class AmbientOcclusionNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(AmbientOcclusionNode)
-
- bool has_spatial_varying()
- {
- return true;
- }
- virtual int get_feature()
- {
- return KERNEL_FEATURE_NODE_RAYTRACE;
- }
-
- NODE_SOCKET_API(float3, color)
- NODE_SOCKET_API(float, distance)
- NODE_SOCKET_API(float3, normal)
- NODE_SOCKET_API(int, samples)
-
- NODE_SOCKET_API(bool, only_local)
- NODE_SOCKET_API(bool, inside)
-};
-
-class VolumeNode : public ShaderNode {
- public:
- VolumeNode(const NodeType *node_type);
- SHADER_NODE_BASE_CLASS(VolumeNode)
-
- void compile(SVMCompiler &compiler, ShaderInput *param1, ShaderInput *param2);
- virtual int get_feature()
- {
- return ShaderNode::get_feature() | KERNEL_FEATURE_NODE_VOLUME;
- }
- virtual ClosureType get_closure_type()
- {
- return closure;
- }
- virtual bool has_volume_support()
- {
- return true;
- }
-
- NODE_SOCKET_API(float3, color)
- NODE_SOCKET_API(float, density)
- NODE_SOCKET_API(float, volume_mix_weight)
-
- protected:
- ClosureType closure;
-
- public:
- virtual bool equals(const ShaderNode & /*other*/)
- {
- /* TODO(sergey): With some care Volume nodes can be de-duplicated. */
- return false;
- }
-};
-
-class AbsorptionVolumeNode : public VolumeNode {
- public:
- SHADER_NODE_CLASS(AbsorptionVolumeNode)
-};
-
-class ScatterVolumeNode : public VolumeNode {
- public:
- SHADER_NODE_CLASS(ScatterVolumeNode)
-
- NODE_SOCKET_API(float, anisotropy)
-};
-
-class PrincipledVolumeNode : public VolumeNode {
- public:
- SHADER_NODE_CLASS(PrincipledVolumeNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
-
- NODE_SOCKET_API(ustring, density_attribute)
- NODE_SOCKET_API(ustring, color_attribute)
- NODE_SOCKET_API(ustring, temperature_attribute)
-
- NODE_SOCKET_API(float, anisotropy)
- NODE_SOCKET_API(float3, absorption_color)
- NODE_SOCKET_API(float, emission_strength)
- NODE_SOCKET_API(float3, emission_color)
- NODE_SOCKET_API(float, blackbody_intensity)
- NODE_SOCKET_API(float3, blackbody_tint)
- NODE_SOCKET_API(float, temperature)
-};
-
-/* Interface between the I/O sockets and the SVM/OSL backend. */
-class PrincipledHairBsdfNode : public BsdfBaseNode {
- public:
- SHADER_NODE_CLASS(PrincipledHairBsdfNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
-
- /* Longitudinal roughness. */
- NODE_SOCKET_API(float, roughness)
- /* Azimuthal roughness. */
- NODE_SOCKET_API(float, radial_roughness)
- /* Randomization factor for roughnesses. */
- NODE_SOCKET_API(float, random_roughness)
- /* Longitudinal roughness factor for only the diffuse bounce (shiny undercoat). */
- NODE_SOCKET_API(float, coat)
- /* Index of reflection. */
- NODE_SOCKET_API(float, ior)
- /* Cuticle tilt angle. */
- NODE_SOCKET_API(float, offset)
- /* Direct coloring's color. */
- NODE_SOCKET_API(float3, color)
- /* Melanin concentration. */
- NODE_SOCKET_API(float, melanin)
- /* Melanin redness ratio. */
- NODE_SOCKET_API(float, melanin_redness)
- /* Dye color. */
- NODE_SOCKET_API(float3, tint)
- /* Randomization factor for melanin quantities. */
- NODE_SOCKET_API(float, random_color)
- /* Absorption coefficient (unfiltered). */
- NODE_SOCKET_API(float3, absorption_coefficient)
-
- NODE_SOCKET_API(float3, normal)
- NODE_SOCKET_API(float, surface_mix_weight)
- /* If linked, here will be the given random number. */
- NODE_SOCKET_API(float, random)
- /* Selected coloring parametrization. */
- NODE_SOCKET_API(NodePrincipledHairParametrization, parametrization)
-};
-
-class HairBsdfNode : public BsdfNode {
- public:
- SHADER_NODE_CLASS(HairBsdfNode)
- ClosureType get_closure_type()
- {
- return component;
- }
-
- NODE_SOCKET_API(ClosureType, component)
- NODE_SOCKET_API(float, offset)
- NODE_SOCKET_API(float, roughness_u)
- NODE_SOCKET_API(float, roughness_v)
- NODE_SOCKET_API(float3, tangent)
-};
-
-class GeometryNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(GeometryNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
- int get_group();
-
- NODE_SOCKET_API(float3, normal_osl)
-};
-
-class TextureCoordinateNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(TextureCoordinateNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(float3, normal_osl)
- NODE_SOCKET_API(bool, from_dupli)
- NODE_SOCKET_API(bool, use_transform)
- NODE_SOCKET_API(Transform, ob_tfm)
-};
-
-class UVMapNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(UVMapNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(ustring, attribute)
- NODE_SOCKET_API(bool, from_dupli)
-};
-
-class LightPathNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(LightPathNode)
-};
-
-class LightFalloffNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(LightFalloffNode)
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(float, strength)
- NODE_SOCKET_API(float, smooth)
-};
-
-class ObjectInfoNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(ObjectInfoNode)
-};
-
-class ParticleInfoNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(ParticleInfoNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
-};
-
-class HairInfoNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(HairInfoNode)
-
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
- virtual int get_feature()
- {
- return ShaderNode::get_feature() | KERNEL_FEATURE_NODE_HAIR;
- }
-};
-
-class VolumeInfoNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(VolumeInfoNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
- void expand(ShaderGraph *graph);
-};
-
-class VertexColorNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(VertexColorNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(ustring, layer_name)
-};
-
-class ValueNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(ValueNode)
-
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float, value)
-};
-
-class ColorNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(ColorNode)
-
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, value)
-};
-
-class AddClosureNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(AddClosureNode)
- void constant_fold(const ConstantFolder &folder);
-};
-
-class MixClosureNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(MixClosureNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float, fac)
-};
-
-class MixClosureWeightNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(MixClosureWeightNode)
-
- NODE_SOCKET_API(float, weight)
- NODE_SOCKET_API(float, fac)
-};
-
-class InvertNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(InvertNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float, fac)
- NODE_SOCKET_API(float3, color)
-};
-
-class MixNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(MixNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(NodeMix, mix_type)
- NODE_SOCKET_API(bool, use_clamp)
- NODE_SOCKET_API(float3, color1)
- NODE_SOCKET_API(float3, color2)
- NODE_SOCKET_API(float, fac)
-};
-
-class CombineRGBNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(CombineRGBNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float, r)
- NODE_SOCKET_API(float, g)
- NODE_SOCKET_API(float, b)
-};
-
-class CombineHSVNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(CombineHSVNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float, h)
- NODE_SOCKET_API(float, s)
- NODE_SOCKET_API(float, v)
-};
-
-class CombineXYZNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(CombineXYZNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float, x)
- NODE_SOCKET_API(float, y)
- NODE_SOCKET_API(float, z)
-};
-
-class GammaNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(GammaNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, color)
- NODE_SOCKET_API(float, gamma)
-};
-
-class BrightContrastNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(BrightContrastNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, color)
- NODE_SOCKET_API(float, bright)
- NODE_SOCKET_API(float, contrast)
-};
-
-class SeparateRGBNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(SeparateRGBNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, color)
-};
-
-class SeparateHSVNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(SeparateHSVNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, color)
-};
-
-class SeparateXYZNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(SeparateXYZNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, vector)
-};
-
-class HSVNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(HSVNode)
-
- NODE_SOCKET_API(float, hue)
- NODE_SOCKET_API(float, saturation)
- NODE_SOCKET_API(float, value)
- NODE_SOCKET_API(float, fac)
- NODE_SOCKET_API(float3, color)
-};
-
-class AttributeNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(AttributeNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(ustring, attribute)
-};
-
-class CameraNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(CameraNode)
- bool has_spatial_varying()
- {
- return true;
- }
-};
-
-class FresnelNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(FresnelNode)
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(float3, normal)
- NODE_SOCKET_API(float, IOR)
-};
-
-class LayerWeightNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(LayerWeightNode)
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(float3, normal)
- NODE_SOCKET_API(float, blend)
-};
-
-class WireframeNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(WireframeNode)
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(float, size)
- NODE_SOCKET_API(bool, use_pixel_size)
-};
-
-class WavelengthNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(WavelengthNode)
-
- NODE_SOCKET_API(float, wavelength)
-};
-
-class BlackbodyNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(BlackbodyNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float, temperature)
-};
-
-class MapRangeNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(MapRangeNode)
- void expand(ShaderGraph *graph);
-
- NODE_SOCKET_API(float, value)
- NODE_SOCKET_API(float, from_min)
- NODE_SOCKET_API(float, from_max)
- NODE_SOCKET_API(float, to_min)
- NODE_SOCKET_API(float, to_max)
- NODE_SOCKET_API(float, steps)
- NODE_SOCKET_API(NodeMapRangeType, range_type)
- NODE_SOCKET_API(bool, clamp)
-};
-
-class ClampNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(ClampNode)
- void constant_fold(const ConstantFolder &folder);
- NODE_SOCKET_API(float, value)
- NODE_SOCKET_API(float, min)
- NODE_SOCKET_API(float, max)
- NODE_SOCKET_API(NodeClampType, clamp_type)
-};
-
-class MathNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(MathNode)
- void expand(ShaderGraph *graph);
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float, value1)
- NODE_SOCKET_API(float, value2)
- NODE_SOCKET_API(float, value3)
- NODE_SOCKET_API(NodeMathType, math_type)
- NODE_SOCKET_API(bool, use_clamp)
-};
-
-class NormalNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(NormalNode)
-
- NODE_SOCKET_API(float3, direction)
- NODE_SOCKET_API(float3, normal)
-};
-
-class VectorMathNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(VectorMathNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API(float3, vector1)
- NODE_SOCKET_API(float3, vector2)
- NODE_SOCKET_API(float3, vector3)
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(NodeVectorMathType, math_type)
-};
-
-class VectorRotateNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(VectorRotateNode)
-
- NODE_SOCKET_API(NodeVectorRotateType, rotate_type)
- NODE_SOCKET_API(bool, invert)
- NODE_SOCKET_API(float3, vector)
- NODE_SOCKET_API(float3, center)
- NODE_SOCKET_API(float3, axis)
- NODE_SOCKET_API(float, angle)
- NODE_SOCKET_API(float3, rotation)
-};
-
-class VectorTransformNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(VectorTransformNode)
-
- NODE_SOCKET_API(NodeVectorTransformType, transform_type)
- NODE_SOCKET_API(NodeVectorTransformConvertSpace, convert_from)
- NODE_SOCKET_API(NodeVectorTransformConvertSpace, convert_to)
- NODE_SOCKET_API(float3, vector)
-};
-
-class BumpNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(BumpNode)
- void constant_fold(const ConstantFolder &folder);
- bool has_spatial_varying()
- {
- return true;
- }
- virtual int get_feature()
- {
- return KERNEL_FEATURE_NODE_BUMP;
- }
-
- NODE_SOCKET_API(bool, invert)
- NODE_SOCKET_API(bool, use_object_space)
- NODE_SOCKET_API(float, height)
- NODE_SOCKET_API(float, sample_center)
- NODE_SOCKET_API(float, sample_x)
- NODE_SOCKET_API(float, sample_y)
- NODE_SOCKET_API(float3, normal)
- NODE_SOCKET_API(float, strength)
- NODE_SOCKET_API(float, distance)
-};
-
-class CurvesNode : public ShaderNode {
- public:
- explicit CurvesNode(const NodeType *node_type);
- SHADER_NODE_BASE_CLASS(CurvesNode)
-
- NODE_SOCKET_API_ARRAY(array<float3>, curves)
- NODE_SOCKET_API(float, min_x)
- NODE_SOCKET_API(float, max_x)
- NODE_SOCKET_API(float, fac)
- NODE_SOCKET_API(float3, value)
-
- protected:
- using ShaderNode::constant_fold;
- void constant_fold(const ConstantFolder &folder, ShaderInput *value_in);
- void compile(SVMCompiler &compiler, int type, ShaderInput *value_in, ShaderOutput *value_out);
- void compile(OSLCompiler &compiler, const char *name);
-};
-
-class RGBCurvesNode : public CurvesNode {
- public:
- SHADER_NODE_CLASS(RGBCurvesNode)
- void constant_fold(const ConstantFolder &folder);
-};
-
-class VectorCurvesNode : public CurvesNode {
- public:
- SHADER_NODE_CLASS(VectorCurvesNode)
- void constant_fold(const ConstantFolder &folder);
-};
-
-class FloatCurveNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(FloatCurveNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API_ARRAY(array<float>, curve)
- NODE_SOCKET_API(float, min_x)
- NODE_SOCKET_API(float, max_x)
- NODE_SOCKET_API(float, fac)
- NODE_SOCKET_API(float, value)
-};
-
-class RGBRampNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(RGBRampNode)
- void constant_fold(const ConstantFolder &folder);
-
- NODE_SOCKET_API_ARRAY(array<float3>, ramp)
- NODE_SOCKET_API_ARRAY(array<float>, ramp_alpha)
- NODE_SOCKET_API(float, fac)
- NODE_SOCKET_API(bool, interpolate)
-};
-
-class SetNormalNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(SetNormalNode)
- NODE_SOCKET_API(float3, direction)
-};
-
-class OSLNode final : public ShaderNode {
- public:
- static OSLNode *create(ShaderGraph *graph, size_t num_inputs, const OSLNode *from = NULL);
- ~OSLNode();
-
- static void operator delete(void *ptr)
- {
- /* Override delete operator to silence new-delete-type-mismatch ASAN warnings
- * regarding size mismatch in the destructor. This is intentional as we allocate
- * extra space at the end of the node. */
- ::operator delete(ptr);
- }
- static void operator delete(void *, void *)
- {
- /* Deliberately empty placement delete operator, to avoid MSVC warning C4291. */
- }
-
- ShaderNode *clone(ShaderGraph *graph) const;
-
- char *input_default_value();
- void add_input(ustring name, SocketType::Type type);
- void add_output(ustring name, SocketType::Type type);
-
- SHADER_NODE_NO_CLONE_CLASS(OSLNode)
-
- /* Ideally we could better detect this, but we can't query this now. */
- bool has_spatial_varying()
- {
- return true;
- }
- bool has_volume_support()
- {
- return true;
- }
-
- virtual bool equals(const ShaderNode & /*other*/)
- {
- return false;
- }
-
- string filepath;
- string bytecode_hash;
-};
-
-class NormalMapNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(NormalMapNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(NodeNormalMapSpace, space)
- NODE_SOCKET_API(ustring, attribute)
- NODE_SOCKET_API(float, strength)
- NODE_SOCKET_API(float3, color)
- NODE_SOCKET_API(float3, normal_osl)
-};
-
-class TangentNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(TangentNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- bool has_spatial_varying()
- {
- return true;
- }
-
- NODE_SOCKET_API(NodeTangentDirectionType, direction_type)
- NODE_SOCKET_API(NodeTangentAxis, axis)
- NODE_SOCKET_API(ustring, attribute)
- NODE_SOCKET_API(float3, normal_osl)
-};
-
-class BevelNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(BevelNode)
- bool has_spatial_varying()
- {
- return true;
- }
- virtual int get_feature()
- {
- return KERNEL_FEATURE_NODE_RAYTRACE;
- }
-
- NODE_SOCKET_API(float, radius)
- NODE_SOCKET_API(float3, normal)
- NODE_SOCKET_API(int, samples)
-};
-
-class DisplacementNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(DisplacementNode)
- void constant_fold(const ConstantFolder &folder);
- virtual int get_feature()
- {
- return KERNEL_FEATURE_NODE_BUMP;
- }
-
- NODE_SOCKET_API(NodeNormalMapSpace, space)
- NODE_SOCKET_API(float, height)
- NODE_SOCKET_API(float, midlevel)
- NODE_SOCKET_API(float, scale)
- NODE_SOCKET_API(float3, normal)
-};
-
-class VectorDisplacementNode : public ShaderNode {
- public:
- SHADER_NODE_CLASS(VectorDisplacementNode)
- void attributes(Shader *shader, AttributeRequestSet *attributes);
- bool has_attribute_dependency()
- {
- return true;
- }
- void constant_fold(const ConstantFolder &folder);
- virtual int get_feature()
- {
- return KERNEL_FEATURE_NODE_BUMP;
- }
-
- NODE_SOCKET_API(NodeNormalMapSpace, space)
- NODE_SOCKET_API(ustring, attribute)
- NODE_SOCKET_API(float3, vector)
- NODE_SOCKET_API(float, midlevel)
- NODE_SOCKET_API(float, scale)
-};
-
-CCL_NAMESPACE_END
-
-#endif /* __NODES_H__ */