2011-04-27 11:58:34 +00:00
|
|
|
/*
|
2013-08-18 14:16:15 +00:00
|
|
|
* Copyright 2011-2013 Blender Foundation
|
2011-04-27 11:58:34 +00:00
|
|
|
*
|
2013-08-18 14:16:15 +00:00
|
|
|
* 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
|
2011-04-27 11:58:34 +00:00
|
|
|
*
|
2013-08-18 14:16:15 +00:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2011-04-27 11:58:34 +00:00
|
|
|
*
|
2013-08-18 14:16:15 +00:00
|
|
|
* 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
|
2014-12-25 01:50:24 +00:00
|
|
|
* limitations under the License.
|
2011-04-27 11:58:34 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __NODES_H__
|
|
|
|
#define __NODES_H__
|
|
|
|
|
|
|
|
#include "graph.h"
|
2016-05-07 17:48:28 +00:00
|
|
|
#include "node.h"
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
#include "util_string.h"
|
|
|
|
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
|
|
|
|
class ImageManager;
|
2015-11-20 13:18:27 +00:00
|
|
|
class Scene;
|
2012-12-12 06:51:06 +00:00
|
|
|
class Shader;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2011-10-12 22:42:13 +00:00
|
|
|
/* Texture Mapping */
|
|
|
|
|
|
|
|
class TextureMapping {
|
|
|
|
public:
|
|
|
|
TextureMapping();
|
|
|
|
Transform compute_transform();
|
|
|
|
bool skip();
|
|
|
|
void compile(SVMCompiler& compiler, int offset_in, int offset_out);
|
2016-05-07 17:48:28 +00:00
|
|
|
int compile(SVMCompiler& compiler, ShaderInput *vector_in);
|
2012-11-20 17:40:10 +00:00
|
|
|
void compile(OSLCompiler &compiler);
|
2011-10-12 22:42:13 +00:00
|
|
|
|
2016-05-02 18:12:42 +00:00
|
|
|
int compile_begin(SVMCompiler& compiler, ShaderInput *vector_in);
|
|
|
|
void compile_end(SVMCompiler& compiler, ShaderInput *vector_in, int vector_offset);
|
|
|
|
|
2011-10-12 22:42:13 +00:00
|
|
|
float3 translation;
|
|
|
|
float3 rotation;
|
|
|
|
float3 scale;
|
|
|
|
|
2012-05-07 20:24:38 +00:00
|
|
|
float3 min, max;
|
|
|
|
bool use_minmax;
|
|
|
|
|
2013-09-25 20:28:49 +00:00
|
|
|
enum Type { POINT = 0, TEXTURE = 1, VECTOR = 2, NORMAL = 3 };
|
|
|
|
Type type;
|
|
|
|
|
2012-06-09 18:56:12 +00:00
|
|
|
enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 };
|
2011-10-12 22:42:13 +00:00
|
|
|
Mapping x_mapping, y_mapping, z_mapping;
|
|
|
|
|
|
|
|
enum Projection { FLAT, CUBE, TUBE, SPHERE };
|
|
|
|
Projection projection;
|
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* Nodes */
|
|
|
|
|
2011-10-12 22:42:13 +00:00
|
|
|
class TextureNode : public ShaderNode {
|
|
|
|
public:
|
2016-05-07 17:48:28 +00:00
|
|
|
explicit TextureNode(const NodeType *node_type) : ShaderNode(node_type) {}
|
2011-10-12 22:42:13 +00:00
|
|
|
TextureMapping tex_mapping;
|
|
|
|
};
|
|
|
|
|
2016-05-01 22:05:16 +00:00
|
|
|
/* Any node which uses image manager's slot should be a subclass of this one. */
|
|
|
|
class ImageSlotTextureNode : public TextureNode {
|
2015-04-02 15:37:57 +00:00
|
|
|
public:
|
2016-05-07 17:48:28 +00:00
|
|
|
explicit ImageSlotTextureNode(const NodeType *node_type) : TextureNode(node_type) {
|
2016-05-01 22:05:16 +00:00
|
|
|
special_type = SHADER_SPECIAL_TYPE_IMAGE_SLOT;
|
2015-12-15 16:56:27 +00:00
|
|
|
}
|
2016-05-01 22:05:16 +00:00
|
|
|
int slot;
|
2015-04-02 15:37:57 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class ImageTextureNode : public ImageSlotTextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
|
|
|
SHADER_NODE_NO_CLONE_CLASS(ImageTextureNode)
|
|
|
|
~ImageTextureNode();
|
|
|
|
ShaderNode *clone() const;
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
ImageManager *image_manager;
|
2012-11-20 17:40:10 +00:00
|
|
|
int is_float;
|
2013-02-14 21:40:29 +00:00
|
|
|
bool is_linear;
|
2014-05-07 14:36:44 +00:00
|
|
|
bool use_alpha;
|
2016-06-12 15:12:25 +00:00
|
|
|
ustring filename;
|
2013-01-30 13:42:12 +00:00
|
|
|
void *builtin_data;
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeImageColorSpace color_space;
|
|
|
|
NodeImageProjection projection;
|
2014-03-07 22:16:09 +00:00
|
|
|
InterpolationType interpolation;
|
2015-07-21 19:58:19 +00:00
|
|
|
ExtensionType extension;
|
2012-09-04 13:29:07 +00:00
|
|
|
float projection_blend;
|
2012-11-21 13:00:51 +00:00
|
|
|
bool animated;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector;
|
2011-05-13 14:32:08 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual bool equals(const ShaderNode& other)
|
|
|
|
{
|
|
|
|
const ImageTextureNode& image_node = (const ImageTextureNode&)other;
|
2015-12-15 16:56:27 +00:00
|
|
|
return ImageSlotTextureNode::equals(other) &&
|
2016-05-07 17:48:28 +00:00
|
|
|
builtin_data == image_node.builtin_data &&
|
|
|
|
animated == image_node.animated;
|
2015-12-15 16:56:27 +00:00
|
|
|
}
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2015-04-02 15:37:57 +00:00
|
|
|
class EnvironmentTextureNode : public ImageSlotTextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
|
|
|
SHADER_NODE_NO_CLONE_CLASS(EnvironmentTextureNode)
|
|
|
|
~EnvironmentTextureNode();
|
|
|
|
ShaderNode *clone() const;
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
ImageManager *image_manager;
|
2012-11-20 17:40:10 +00:00
|
|
|
int is_float;
|
2013-02-14 21:40:29 +00:00
|
|
|
bool is_linear;
|
2014-05-07 14:36:44 +00:00
|
|
|
bool use_alpha;
|
2016-06-12 15:12:25 +00:00
|
|
|
ustring filename;
|
2013-01-30 13:42:12 +00:00
|
|
|
void *builtin_data;
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeImageColorSpace color_space;
|
|
|
|
NodeEnvironmentProjection projection;
|
2015-10-08 01:31:15 +00:00
|
|
|
InterpolationType interpolation;
|
2012-11-21 13:00:51 +00:00
|
|
|
bool animated;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector;
|
2011-05-13 14:32:08 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual bool equals(const ShaderNode& other)
|
|
|
|
{
|
|
|
|
const EnvironmentTextureNode& env_node = (const EnvironmentTextureNode&)other;
|
2015-12-15 16:56:27 +00:00
|
|
|
return ImageSlotTextureNode::equals(other) &&
|
2016-05-07 17:48:28 +00:00
|
|
|
builtin_data == env_node.builtin_data &&
|
|
|
|
animated == env_node.animated;
|
2015-12-15 16:56:27 +00:00
|
|
|
}
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-10-12 22:42:13 +00:00
|
|
|
class SkyTextureNode : public TextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(SkyTextureNode)
|
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeSkyType type;
|
2011-04-27 11:58:34 +00:00
|
|
|
float3 sun_direction;
|
|
|
|
float turbidity;
|
2013-08-28 14:11:28 +00:00
|
|
|
float ground_albedo;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class OutputNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(OutputNode)
|
2015-12-15 16:56:27 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
void* surface;
|
|
|
|
void* volume;
|
|
|
|
float displacement;
|
|
|
|
float3 normal;
|
|
|
|
|
2015-12-15 16:56:27 +00:00
|
|
|
/* Don't allow output node de-duplication. */
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual bool equals(const ShaderNode& /*other*/) { return false; }
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-11-06 21:05:58 +00:00
|
|
|
class GradientTextureNode : public TextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
2011-11-06 21:05:58 +00:00
|
|
|
SHADER_NODE_CLASS(GradientTextureNode)
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeGradientType type;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-11-06 21:05:58 +00:00
|
|
|
class NoiseTextureNode : public TextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
2011-11-06 21:05:58 +00:00
|
|
|
SHADER_NODE_CLASS(NoiseTextureNode)
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float scale, detail, distortion;
|
|
|
|
float3 vector;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-10-12 22:42:13 +00:00
|
|
|
class VoronoiTextureNode : public TextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(VoronoiTextureNode)
|
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeVoronoiColoring coloring;
|
2016-05-07 17:48:28 +00:00
|
|
|
float scale;
|
|
|
|
float3 vector;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-10-12 22:42:13 +00:00
|
|
|
class MusgraveTextureNode : public TextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(MusgraveTextureNode)
|
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeMusgraveType type;
|
2016-05-07 17:48:28 +00:00
|
|
|
float scale, detail, dimension, lacunarity, offset, gain;
|
|
|
|
float3 vector;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-11-06 21:05:58 +00:00
|
|
|
class WaveTextureNode : public TextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
2011-11-06 21:05:58 +00:00
|
|
|
SHADER_NODE_CLASS(WaveTextureNode)
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeWaveType type;
|
|
|
|
NodeWaveProfile profile;
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float scale, distortion, detail, detail_scale;
|
|
|
|
float3 vector;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-10-12 22:42:13 +00:00
|
|
|
class MagicTextureNode : public TextureNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(MagicTextureNode)
|
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
int depth;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector;
|
|
|
|
float scale, distortion;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2012-01-08 14:55:43 +00:00
|
|
|
class CheckerTextureNode : public TextureNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(CheckerTextureNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector, color1, color2;
|
|
|
|
float scale;
|
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
2012-01-08 14:55:43 +00:00
|
|
|
};
|
|
|
|
|
2012-09-04 13:29:07 +00:00
|
|
|
class BrickTextureNode : public TextureNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(BrickTextureNode)
|
2015-12-15 16:56:27 +00:00
|
|
|
|
2012-09-04 13:29:07 +00:00
|
|
|
float offset, squash;
|
|
|
|
int offset_frequency, squash_frequency;
|
2015-06-01 12:48:45 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 color1, color2, mortar;
|
|
|
|
float scale, mortar_size, bias, brick_width, row_height;
|
|
|
|
float3 vector;
|
2015-12-15 16:56:27 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
2012-09-04 13:29:07 +00:00
|
|
|
};
|
|
|
|
|
2015-07-18 20:09:20 +00:00
|
|
|
class PointDensityTextureNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_NO_CLONE_CLASS(PointDensityTextureNode)
|
|
|
|
|
|
|
|
~PointDensityTextureNode();
|
|
|
|
ShaderNode *clone() const;
|
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
|
|
|
|
|
|
|
bool has_spatial_varying() { return true; }
|
|
|
|
bool has_object_dependency() { return true; }
|
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
ustring filename;
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeTexVoxelSpace space;
|
2015-07-18 20:09:20 +00:00
|
|
|
InterpolationType interpolation;
|
|
|
|
Transform tfm;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector;
|
2015-07-18 20:09:20 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
ImageManager *image_manager;
|
|
|
|
int slot;
|
|
|
|
void *builtin_data;
|
2015-12-15 16:56:27 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual bool equals(const ShaderNode& other) {
|
|
|
|
const PointDensityTextureNode& point_dendity_node = (const PointDensityTextureNode&)other;
|
2015-12-15 16:56:27 +00:00
|
|
|
return ShaderNode::equals(other) &&
|
2016-05-07 17:48:28 +00:00
|
|
|
builtin_data == point_dendity_node.builtin_data;
|
2015-12-15 16:56:27 +00:00
|
|
|
}
|
2015-07-18 20:09:20 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class MappingNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(MappingNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector;
|
2011-10-12 22:42:13 +00:00
|
|
|
TextureMapping tex_mapping;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2016-05-29 10:24:47 +00:00
|
|
|
class RGBToBWNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(RGBToBWNode)
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 color;
|
2016-05-29 10:24:47 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class ConvertNode : public ShaderNode {
|
|
|
|
public:
|
2016-05-07 23:32:09 +00:00
|
|
|
ConvertNode(SocketType::Type from, SocketType::Type to, bool autoconvert = false);
|
2011-04-27 11:58:34 +00:00
|
|
|
SHADER_NODE_BASE_CLASS(ConvertNode)
|
|
|
|
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-12-23 20:41:59 +00:00
|
|
|
|
2016-05-07 23:32:09 +00:00
|
|
|
SocketType::Type from, to;
|
2015-12-15 16:56:27 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
union {
|
|
|
|
float value_float;
|
|
|
|
int value_int;
|
|
|
|
float3 value_color;
|
|
|
|
float3 value_vector;
|
|
|
|
float3 value_point;
|
|
|
|
float3 value_normal;
|
|
|
|
};
|
|
|
|
ustring value_string;
|
|
|
|
|
|
|
|
private:
|
|
|
|
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;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class BsdfNode : public ShaderNode {
|
|
|
|
public:
|
2016-05-07 17:48:28 +00:00
|
|
|
explicit BsdfNode(const NodeType *node_type);
|
2013-04-01 20:26:52 +00:00
|
|
|
SHADER_NODE_BASE_CLASS(BsdfNode);
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2013-09-03 22:39:17 +00:00
|
|
|
void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3 = NULL, ShaderInput *param4 = NULL);
|
2016-05-23 12:09:27 +00:00
|
|
|
virtual ClosureType get_closure_type() { return closure; }
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 color;
|
|
|
|
float3 normal;
|
|
|
|
float surface_mix_weight;
|
2011-04-27 11:58:34 +00:00
|
|
|
ClosureType closure;
|
2015-12-15 16:56:27 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual bool equals(const ShaderNode& /*other*/)
|
2015-12-15 16:56:27 +00:00
|
|
|
{
|
|
|
|
/* TODO(sergey): With some care BSDF nodes can be de-duplicated. */
|
|
|
|
return false;
|
|
|
|
}
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2014-06-08 10:16:28 +00:00
|
|
|
class AnisotropicBsdfNode : public BsdfNode {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
2014-06-08 10:16:28 +00:00
|
|
|
SHADER_NODE_CLASS(AnisotropicBsdfNode)
|
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 tangent;
|
|
|
|
float roughness, anisotropy, rotation;
|
2016-05-29 14:13:14 +00:00
|
|
|
ClosureType distribution;
|
2014-06-08 10:16:28 +00:00
|
|
|
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class DiffuseBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(DiffuseBsdfNode)
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float roughness;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class TranslucentBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(TranslucentBsdfNode)
|
|
|
|
};
|
|
|
|
|
|
|
|
class TransparentBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(TransparentBsdfNode)
|
2012-12-12 06:51:06 +00:00
|
|
|
|
|
|
|
bool has_surface_transparent() { return true; }
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class VelvetBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(VelvetBsdfNode)
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float sigma;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class GlossyBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(GlossyBsdfNode)
|
|
|
|
|
2015-11-25 12:52:39 +00:00
|
|
|
void simplify_settings(Scene *scene);
|
2015-11-20 13:18:27 +00:00
|
|
|
bool has_integrator_dependency();
|
2015-11-18 17:47:56 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float roughness;
|
2016-05-29 14:13:14 +00:00
|
|
|
ClosureType distribution, distribution_orig;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class GlassBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(GlassBsdfNode)
|
|
|
|
|
2015-11-25 12:52:39 +00:00
|
|
|
void simplify_settings(Scene *scene);
|
2015-11-20 13:18:27 +00:00
|
|
|
bool has_integrator_dependency();
|
2015-11-18 17:47:56 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float roughness, IOR;
|
2016-05-29 14:13:14 +00:00
|
|
|
ClosureType distribution, distribution_orig;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2012-11-06 19:59:02 +00:00
|
|
|
class RefractionBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(RefractionBsdfNode)
|
|
|
|
|
2015-11-25 12:52:39 +00:00
|
|
|
void simplify_settings(Scene *scene);
|
2015-11-20 13:18:27 +00:00
|
|
|
bool has_integrator_dependency();
|
2015-11-18 17:47:56 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float roughness, IOR;
|
2016-05-29 14:13:14 +00:00
|
|
|
ClosureType distribution, distribution_orig;
|
2012-11-06 19:59:02 +00:00
|
|
|
};
|
|
|
|
|
2013-05-23 17:45:20 +00:00
|
|
|
class ToonBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(ToonBsdfNode)
|
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float smooth, size;
|
2016-05-29 14:13:14 +00:00
|
|
|
ClosureType component;
|
2013-05-23 17:45:20 +00:00
|
|
|
};
|
|
|
|
|
2013-04-01 20:26:52 +00:00
|
|
|
class SubsurfaceScatteringNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(SubsurfaceScatteringNode)
|
|
|
|
bool has_surface_bssrdf() { return true; }
|
2013-08-18 14:15:57 +00:00
|
|
|
bool has_bssrdf_bump();
|
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float scale;
|
|
|
|
float3 radius;
|
|
|
|
float sharpness;
|
|
|
|
float texture_blur;
|
2016-05-29 14:13:14 +00:00
|
|
|
ClosureType falloff;
|
2013-04-01 20:26:52 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class EmissionNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(EmissionNode)
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2016-05-23 12:09:27 +00:00
|
|
|
virtual ClosureType get_closure_type() { return CLOSURE_EMISSION_ID; }
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2012-12-12 06:51:06 +00:00
|
|
|
bool has_surface_emission() { return true; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 color;
|
|
|
|
float strength;
|
|
|
|
float surface_mix_weight;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class BackgroundNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(BackgroundNode)
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2016-05-23 12:09:27 +00:00
|
|
|
virtual ClosureType get_closure_type() { return CLOSURE_BACKGROUND_ID; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 color;
|
|
|
|
float strength;
|
|
|
|
float surface_mix_weight;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-08-28 13:55:59 +00:00
|
|
|
class HoldoutNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(HoldoutNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-23 12:09:27 +00:00
|
|
|
virtual ClosureType get_closure_type() { return CLOSURE_HOLDOUT_ID; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float surface_mix_weight;
|
|
|
|
float volume_mix_weight;
|
2011-08-28 13:55:59 +00:00
|
|
|
};
|
|
|
|
|
2012-11-06 19:59:02 +00:00
|
|
|
class AmbientOcclusionNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(AmbientOcclusionNode)
|
2014-04-03 20:04:39 +00:00
|
|
|
|
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-23 12:09:27 +00:00
|
|
|
virtual ClosureType get_closure_type() { return CLOSURE_AMBIENT_OCCLUSION_ID; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 normal_osl;
|
|
|
|
float3 color;
|
|
|
|
float surface_mix_weight;
|
2012-11-06 19:59:02 +00:00
|
|
|
};
|
|
|
|
|
2011-09-27 20:03:16 +00:00
|
|
|
class VolumeNode : public ShaderNode {
|
|
|
|
public:
|
2016-05-07 17:48:28 +00:00
|
|
|
VolumeNode(const NodeType *node_type);
|
|
|
|
SHADER_NODE_BASE_CLASS(VolumeNode)
|
2011-09-27 20:03:16 +00:00
|
|
|
|
|
|
|
void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-23 10:58:25 +00:00
|
|
|
virtual int get_feature() {
|
|
|
|
return ShaderNode::get_feature() | NODE_FEATURE_VOLUME;
|
|
|
|
}
|
2016-05-23 12:09:27 +00:00
|
|
|
virtual ClosureType get_closure_type() { return closure; }
|
2011-09-27 20:03:16 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 color;
|
|
|
|
float density;
|
|
|
|
float volume_mix_weight;
|
2011-09-27 20:03:16 +00:00
|
|
|
ClosureType closure;
|
2015-12-15 16:56:27 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual bool equals(const ShaderNode& /*other*/)
|
2015-12-15 16:56:27 +00:00
|
|
|
{
|
|
|
|
/* TODO(sergey): With some care Volume nodes can be de-duplicated. */
|
|
|
|
return false;
|
|
|
|
}
|
2011-09-27 20:03:16 +00:00
|
|
|
};
|
|
|
|
|
2013-12-28 00:54:44 +00:00
|
|
|
class AbsorptionVolumeNode : public VolumeNode {
|
2011-09-27 20:03:16 +00:00
|
|
|
public:
|
2013-12-28 00:54:44 +00:00
|
|
|
SHADER_NODE_CLASS(AbsorptionVolumeNode)
|
2011-09-27 20:03:16 +00:00
|
|
|
};
|
|
|
|
|
2013-12-28 00:54:44 +00:00
|
|
|
class ScatterVolumeNode : public VolumeNode {
|
2011-09-27 20:03:16 +00:00
|
|
|
public:
|
2013-12-28 00:54:44 +00:00
|
|
|
SHADER_NODE_CLASS(ScatterVolumeNode)
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float anisotropy;
|
2011-09-27 20:03:16 +00:00
|
|
|
};
|
|
|
|
|
2013-09-15 23:58:00 +00:00
|
|
|
class HairBsdfNode : public BsdfNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(HairBsdfNode)
|
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
ClosureType component;
|
2016-05-07 17:48:28 +00:00
|
|
|
float offset;
|
|
|
|
float roughness_u;
|
|
|
|
float roughness_v;
|
|
|
|
float3 tangent;
|
2013-09-15 23:58:00 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class GeometryNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(GeometryNode)
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 normal_osl;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class TextureCoordinateNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(TextureCoordinateNode)
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-01-21 17:19:31 +00:00
|
|
|
bool has_object_dependency() { return use_transform; }
|
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 normal_osl;
|
2012-10-04 21:40:39 +00:00
|
|
|
bool from_dupli;
|
2015-01-21 17:19:31 +00:00
|
|
|
bool use_transform;
|
|
|
|
Transform ob_tfm;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2014-04-02 09:40:29 +00:00
|
|
|
class UVMapNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(UVMapNode)
|
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2014-04-02 09:40:29 +00:00
|
|
|
|
|
|
|
ustring attribute;
|
|
|
|
bool from_dupli;
|
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class LightPathNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(LightPathNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2012-05-07 20:24:38 +00:00
|
|
|
class LightFalloffNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(LightFalloffNode)
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2016-04-11 08:54:41 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float strength;
|
|
|
|
float smooth;
|
2012-05-07 20:24:38 +00:00
|
|
|
};
|
|
|
|
|
2012-05-21 12:52:28 +00:00
|
|
|
class ObjectInfoNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(ObjectInfoNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2012-05-21 12:52:28 +00:00
|
|
|
};
|
|
|
|
|
2012-06-08 16:17:57 +00:00
|
|
|
class ParticleInfoNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(ParticleInfoNode)
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2012-06-08 16:17:57 +00:00
|
|
|
};
|
|
|
|
|
2012-12-28 14:21:30 +00:00
|
|
|
class HairInfoNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(HairInfoNode)
|
2013-01-03 12:08:54 +00:00
|
|
|
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2015-06-01 09:48:24 +00:00
|
|
|
virtual int get_feature() {
|
|
|
|
return ShaderNode::get_feature() | NODE_FEATURE_HAIR;
|
|
|
|
}
|
2012-12-28 14:21:30 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class ValueNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(ValueNode)
|
|
|
|
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-12-06 22:47:38 +00:00
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
float value;
|
|
|
|
};
|
|
|
|
|
|
|
|
class ColorNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(ColorNode)
|
|
|
|
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-12-06 22:47:38 +00:00
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
float3 value;
|
|
|
|
};
|
|
|
|
|
|
|
|
class AddClosureNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(AddClosureNode)
|
|
|
|
};
|
|
|
|
|
|
|
|
class MixClosureNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(MixClosureNode)
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float fac;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2012-11-26 21:59:41 +00:00
|
|
|
class MixClosureWeightNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(MixClosureWeightNode);
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float weight;
|
|
|
|
float fac;
|
2012-11-26 21:59:41 +00:00
|
|
|
};
|
|
|
|
|
2011-12-03 23:05:35 +00:00
|
|
|
class InvertNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(InvertNode)
|
2016-06-19 10:28:50 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float fac;
|
|
|
|
float3 color;
|
2011-12-03 23:05:35 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class MixNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(MixNode)
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeMix type;
|
2016-05-07 17:48:28 +00:00
|
|
|
bool use_clamp;
|
|
|
|
float3 color1;
|
|
|
|
float3 color2;
|
|
|
|
float fac;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-12-01 21:46:10 +00:00
|
|
|
class CombineRGBNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(CombineRGBNode)
|
2016-06-19 10:28:50 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float r, g, b;
|
2011-12-01 21:46:10 +00:00
|
|
|
};
|
|
|
|
|
2013-07-03 23:46:56 +00:00
|
|
|
class CombineHSVNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(CombineHSVNode)
|
2016-06-19 10:28:50 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float h, s, v;
|
2013-07-03 23:46:56 +00:00
|
|
|
};
|
|
|
|
|
2014-06-13 19:44:48 +00:00
|
|
|
class CombineXYZNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(CombineXYZNode)
|
2016-06-19 10:28:50 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float x, y, z;
|
2014-06-13 19:44:48 +00:00
|
|
|
};
|
|
|
|
|
2011-12-16 20:35:06 +00:00
|
|
|
class GammaNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(GammaNode)
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 color;
|
|
|
|
float gamma;
|
2011-12-16 20:35:06 +00:00
|
|
|
};
|
|
|
|
|
2012-01-24 16:32:31 +00:00
|
|
|
class BrightContrastNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(BrightContrastNode)
|
2016-06-19 10:28:50 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 color;
|
|
|
|
float bright;
|
|
|
|
float contrast;
|
2012-01-24 16:32:31 +00:00
|
|
|
};
|
|
|
|
|
2011-12-01 21:46:10 +00:00
|
|
|
class SeparateRGBNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(SeparateRGBNode)
|
2016-06-19 10:28:50 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 color;
|
2011-12-01 21:46:10 +00:00
|
|
|
};
|
|
|
|
|
2013-07-03 23:46:56 +00:00
|
|
|
class SeparateHSVNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(SeparateHSVNode)
|
2016-06-19 10:28:50 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 color;
|
2013-07-03 23:46:56 +00:00
|
|
|
};
|
|
|
|
|
2014-06-13 19:44:48 +00:00
|
|
|
class SeparateXYZNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(SeparateXYZNode)
|
2016-06-19 10:28:50 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 vector;
|
2014-06-13 19:44:48 +00:00
|
|
|
};
|
|
|
|
|
2011-12-02 16:57:37 +00:00
|
|
|
class HSVNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(HSVNode)
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float hue;
|
|
|
|
float saturation;
|
|
|
|
float value;
|
|
|
|
float fac;
|
|
|
|
float3 color;
|
2011-12-02 16:57:37 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class AttributeNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(AttributeNode)
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
ustring attribute;
|
|
|
|
};
|
|
|
|
|
2011-12-02 20:36:13 +00:00
|
|
|
class CameraNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(CameraNode)
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2011-12-02 20:36:13 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class FresnelNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(FresnelNode)
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 normal;
|
|
|
|
float IOR;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-11-06 21:05:58 +00:00
|
|
|
class LayerWeightNode : public ShaderNode {
|
2011-09-16 13:14:02 +00:00
|
|
|
public:
|
2011-11-06 21:05:58 +00:00
|
|
|
SHADER_NODE_CLASS(LayerWeightNode)
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float3 normal;
|
|
|
|
float blend;
|
2011-09-16 13:14:02 +00:00
|
|
|
};
|
|
|
|
|
2013-05-20 15:58:37 +00:00
|
|
|
class WireframeNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(WireframeNode)
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2015-12-15 16:56:27 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float size;
|
2013-05-20 15:58:37 +00:00
|
|
|
bool use_pixel_size;
|
|
|
|
};
|
|
|
|
|
2013-06-09 20:46:22 +00:00
|
|
|
class WavelengthNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(WavelengthNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float wavelength;
|
2013-06-09 20:46:22 +00:00
|
|
|
};
|
|
|
|
|
2013-07-31 20:56:32 +00:00
|
|
|
class BlackbodyNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(BlackbodyNode)
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2016-05-07 17:48:28 +00:00
|
|
|
|
|
|
|
float temperature;
|
2013-07-31 20:56:32 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class MathNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(MathNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float value1;
|
|
|
|
float value2;
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeMath type;
|
2016-05-07 17:48:28 +00:00
|
|
|
bool use_clamp;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2011-12-16 18:15:07 +00:00
|
|
|
class NormalNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(NormalNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_2; }
|
2011-12-16 18:15:07 +00:00
|
|
|
|
|
|
|
float3 direction;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 normal;
|
2011-12-16 18:15:07 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class VectorMathNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(VectorMathNode)
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector1;
|
|
|
|
float3 vector2;
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeVectorMath type;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2013-07-31 21:18:23 +00:00
|
|
|
class VectorTransformNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(VectorTransformNode)
|
|
|
|
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeVectorTransformType type;
|
|
|
|
NodeVectorTransformConvertSpace convert_from;
|
|
|
|
NodeVectorTransformConvertSpace convert_to;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 vector;
|
2013-07-31 21:18:23 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
class BumpNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(BumpNode)
|
2016-05-29 11:26:41 +00:00
|
|
|
bool constant_fold(ShaderGraph *graph, ShaderOutput *socket, ShaderInput *optimized);
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-02 06:53:10 +00:00
|
|
|
virtual int get_feature() {
|
|
|
|
return NODE_FEATURE_BUMP;
|
|
|
|
}
|
2014-04-03 20:04:39 +00:00
|
|
|
|
2013-05-10 16:57:17 +00:00
|
|
|
bool invert;
|
2016-05-07 17:48:28 +00:00
|
|
|
float height;
|
|
|
|
float sample_center;
|
|
|
|
float sample_x;
|
|
|
|
float sample_y;
|
|
|
|
float3 normal;
|
|
|
|
float strength;
|
|
|
|
float distance;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
2016-06-20 22:19:51 +00:00
|
|
|
class CurvesNode : public ShaderNode {
|
2012-03-26 12:45:14 +00:00
|
|
|
public:
|
2016-06-20 22:19:51 +00:00
|
|
|
explicit CurvesNode(const NodeType *node_type);
|
|
|
|
SHADER_NODE_BASE_CLASS(CurvesNode);
|
2015-06-01 12:48:45 +00:00
|
|
|
|
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
|
|
|
|
2016-06-20 22:19:51 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
|
|
|
void compile(SVMCompiler& compiler, int type, ShaderInput *value_in, ShaderOutput *value_out);
|
|
|
|
void compile(OSLCompiler& compiler, const char *name);
|
|
|
|
|
2016-05-07 23:54:35 +00:00
|
|
|
array<float3> curves;
|
2016-05-07 17:48:28 +00:00
|
|
|
float min_x, max_x, fac;
|
2016-06-20 22:19:51 +00:00
|
|
|
float3 value;
|
2012-03-26 12:45:14 +00:00
|
|
|
};
|
|
|
|
|
2016-06-20 22:19:51 +00:00
|
|
|
class RGBCurvesNode : public CurvesNode {
|
2012-12-11 14:39:37 +00:00
|
|
|
public:
|
2016-06-20 22:19:51 +00:00
|
|
|
SHADER_NODE_CLASS(RGBCurvesNode)
|
|
|
|
};
|
2015-06-01 12:48:45 +00:00
|
|
|
|
2016-06-20 22:19:51 +00:00
|
|
|
class VectorCurvesNode : public CurvesNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(VectorCurvesNode)
|
2012-12-11 14:39:37 +00:00
|
|
|
};
|
|
|
|
|
2012-03-26 12:45:14 +00:00
|
|
|
class RGBRampNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(RGBRampNode)
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_1; }
|
|
|
|
|
2016-05-07 23:54:35 +00:00
|
|
|
array<float3> ramp;
|
|
|
|
array<float> ramp_alpha;
|
2016-05-07 17:48:28 +00:00
|
|
|
float fac;
|
2013-05-10 11:44:24 +00:00
|
|
|
bool interpolate;
|
2012-03-26 12:45:14 +00:00
|
|
|
};
|
|
|
|
|
2012-10-10 15:56:43 +00:00
|
|
|
class SetNormalNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(SetNormalNode)
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 direction;
|
2012-10-10 15:56:43 +00:00
|
|
|
};
|
|
|
|
|
2016-05-29 13:10:34 +00:00
|
|
|
class OSLNode : public ShaderNode {
|
2012-11-03 14:32:35 +00:00
|
|
|
public:
|
2016-05-29 13:10:34 +00:00
|
|
|
static OSLNode *create(size_t num_inputs);
|
|
|
|
~OSLNode();
|
|
|
|
|
2016-06-18 10:30:59 +00:00
|
|
|
ShaderNode *clone() const;
|
|
|
|
|
2016-05-07 17:48:28 +00:00
|
|
|
char* input_default_value();
|
|
|
|
void add_input(ustring name, SocketType::Type type);
|
|
|
|
void add_output(ustring name, SocketType::Type type);
|
|
|
|
|
2016-06-18 10:30:59 +00:00
|
|
|
SHADER_NODE_NO_CLONE_CLASS(OSLNode)
|
2014-04-03 20:04:39 +00:00
|
|
|
|
|
|
|
/* ideally we could beter detect this, but we can't query this now */
|
|
|
|
bool has_spatial_varying() { return true; }
|
2016-05-07 17:48:28 +00:00
|
|
|
virtual bool equals(const ShaderNode& /*other*/) { return false; }
|
2014-04-03 20:04:39 +00:00
|
|
|
|
2012-11-03 14:32:35 +00:00
|
|
|
string filepath;
|
|
|
|
string bytecode_hash;
|
|
|
|
};
|
|
|
|
|
2012-11-06 19:59:02 +00:00
|
|
|
class NormalMapNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(NormalMapNode)
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2012-11-06 19:59:02 +00:00
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeNormalMapSpace space;
|
2012-11-06 19:59:02 +00:00
|
|
|
ustring attribute;
|
2016-05-07 17:48:28 +00:00
|
|
|
float strength;
|
|
|
|
float3 color;
|
|
|
|
float3 normal_osl;
|
2012-11-06 19:59:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class TangentNode : public ShaderNode {
|
|
|
|
public:
|
|
|
|
SHADER_NODE_CLASS(TangentNode)
|
2013-12-31 16:30:34 +00:00
|
|
|
void attributes(Shader *shader, AttributeRequestSet *attributes);
|
2014-04-03 20:04:39 +00:00
|
|
|
bool has_spatial_varying() { return true; }
|
2015-06-01 12:48:45 +00:00
|
|
|
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
|
2012-11-06 19:59:02 +00:00
|
|
|
|
2016-05-29 14:13:14 +00:00
|
|
|
NodeTangentDirectionType direction_type;
|
|
|
|
NodeTangentAxis axis;
|
2012-11-06 19:59:02 +00:00
|
|
|
ustring attribute;
|
2016-05-07 17:48:28 +00:00
|
|
|
float3 normal_osl;
|
2012-11-06 19:59:02 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
CCL_NAMESPACE_END
|
|
|
|
|
|
|
|
#endif /* __NODES_H__ */
|
|
|
|
|