2 * Copyright 2011, Blender Foundation.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 #include "util_string.h"
33 class TextureMapping {
36 Transform compute_transform();
38 void compile(SVMCompiler& compiler, int offset_in, int offset_out);
39 void compile(OSLCompiler &compiler);
48 enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 };
49 Mapping x_mapping, y_mapping, z_mapping;
51 enum Projection { FLAT, CUBE, TUBE, SPHERE };
52 Projection projection;
57 class TextureNode : public ShaderNode {
59 TextureNode(const char *name_) : ShaderNode(name_) {}
60 TextureMapping tex_mapping;
63 class ImageTextureNode : public TextureNode {
65 SHADER_NODE_NO_CLONE_CLASS(ImageTextureNode)
67 ShaderNode *clone() const;
69 ImageManager *image_manager;
77 float projection_blend;
80 static ShaderEnum color_space_enum;
81 static ShaderEnum projection_enum;
84 class EnvironmentTextureNode : public TextureNode {
86 SHADER_NODE_NO_CLONE_CLASS(EnvironmentTextureNode)
87 ~EnvironmentTextureNode();
88 ShaderNode *clone() const;
90 ImageManager *image_manager;
100 static ShaderEnum color_space_enum;
101 static ShaderEnum projection_enum;
104 class SkyTextureNode : public TextureNode {
106 SHADER_NODE_CLASS(SkyTextureNode)
108 float3 sun_direction;
112 class OutputNode : public ShaderNode {
114 SHADER_NODE_CLASS(OutputNode)
117 class GradientTextureNode : public TextureNode {
119 SHADER_NODE_CLASS(GradientTextureNode)
122 static ShaderEnum type_enum;
125 class NoiseTextureNode : public TextureNode {
127 SHADER_NODE_CLASS(NoiseTextureNode)
130 class VoronoiTextureNode : public TextureNode {
132 SHADER_NODE_CLASS(VoronoiTextureNode)
136 static ShaderEnum coloring_enum;
139 class MusgraveTextureNode : public TextureNode {
141 SHADER_NODE_CLASS(MusgraveTextureNode)
145 static ShaderEnum type_enum;
148 class WaveTextureNode : public TextureNode {
150 SHADER_NODE_CLASS(WaveTextureNode)
153 static ShaderEnum type_enum;
156 class MagicTextureNode : public TextureNode {
158 SHADER_NODE_CLASS(MagicTextureNode)
163 class CheckerTextureNode : public TextureNode {
165 SHADER_NODE_CLASS(CheckerTextureNode)
168 class BrickTextureNode : public TextureNode {
170 SHADER_NODE_CLASS(BrickTextureNode)
172 float offset, squash;
173 int offset_frequency, squash_frequency;
176 class MappingNode : public ShaderNode {
178 SHADER_NODE_CLASS(MappingNode)
180 TextureMapping tex_mapping;
183 class ConvertNode : public ShaderNode {
185 ConvertNode(ShaderSocketType from, ShaderSocketType to, bool autoconvert = false);
186 SHADER_NODE_BASE_CLASS(ConvertNode)
188 ShaderSocketType from, to;
191 class ProxyNode : public ShaderNode {
193 ProxyNode(ShaderSocketType type);
194 SHADER_NODE_BASE_CLASS(ProxyNode)
196 ShaderSocketType type;
199 class BsdfNode : public ShaderNode {
201 BsdfNode(bool scattering = false);
202 SHADER_NODE_BASE_CLASS(BsdfNode);
204 void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3 = NULL);
210 class WardBsdfNode : public BsdfNode {
212 SHADER_NODE_CLASS(WardBsdfNode)
213 void attributes(AttributeRequestSet *attributes);
216 class DiffuseBsdfNode : public BsdfNode {
218 SHADER_NODE_CLASS(DiffuseBsdfNode)
221 class TranslucentBsdfNode : public BsdfNode {
223 SHADER_NODE_CLASS(TranslucentBsdfNode)
226 class TransparentBsdfNode : public BsdfNode {
228 SHADER_NODE_CLASS(TransparentBsdfNode)
230 bool has_surface_transparent() { return true; }
233 class VelvetBsdfNode : public BsdfNode {
235 SHADER_NODE_CLASS(VelvetBsdfNode)
238 class GlossyBsdfNode : public BsdfNode {
240 SHADER_NODE_CLASS(GlossyBsdfNode)
242 ustring distribution;
243 static ShaderEnum distribution_enum;
246 class GlassBsdfNode : public BsdfNode {
248 SHADER_NODE_CLASS(GlassBsdfNode)
250 ustring distribution;
251 static ShaderEnum distribution_enum;
254 class RefractionBsdfNode : public BsdfNode {
256 SHADER_NODE_CLASS(RefractionBsdfNode)
258 ustring distribution;
259 static ShaderEnum distribution_enum;
262 class ToonBsdfNode : public BsdfNode {
264 SHADER_NODE_CLASS(ToonBsdfNode)
267 static ShaderEnum component_enum;
270 class SubsurfaceScatteringNode : public BsdfNode {
272 SHADER_NODE_CLASS(SubsurfaceScatteringNode)
273 bool has_surface_bssrdf() { return true; }
276 class EmissionNode : public ShaderNode {
278 SHADER_NODE_CLASS(EmissionNode)
280 bool has_surface_emission() { return true; }
285 class BackgroundNode : public ShaderNode {
287 SHADER_NODE_CLASS(BackgroundNode)
290 class HoldoutNode : public ShaderNode {
292 SHADER_NODE_CLASS(HoldoutNode)
295 class AmbientOcclusionNode : public ShaderNode {
297 SHADER_NODE_CLASS(AmbientOcclusionNode)
300 class VolumeNode : public ShaderNode {
302 SHADER_NODE_CLASS(VolumeNode)
304 void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2);
309 class TransparentVolumeNode : public VolumeNode {
311 SHADER_NODE_CLASS(TransparentVolumeNode)
314 class IsotropicVolumeNode : public VolumeNode {
316 SHADER_NODE_CLASS(IsotropicVolumeNode)
319 class GeometryNode : public ShaderNode {
321 SHADER_NODE_CLASS(GeometryNode)
322 void attributes(AttributeRequestSet *attributes);
325 class TextureCoordinateNode : public ShaderNode {
327 SHADER_NODE_CLASS(TextureCoordinateNode)
328 void attributes(AttributeRequestSet *attributes);
333 class LightPathNode : public ShaderNode {
335 SHADER_NODE_CLASS(LightPathNode)
338 class LightFalloffNode : public ShaderNode {
340 SHADER_NODE_CLASS(LightFalloffNode)
343 class ObjectInfoNode : public ShaderNode {
345 SHADER_NODE_CLASS(ObjectInfoNode)
348 class ParticleInfoNode : public ShaderNode {
350 SHADER_NODE_CLASS(ParticleInfoNode)
351 void attributes(AttributeRequestSet *attributes);
354 class HairInfoNode : public ShaderNode {
356 SHADER_NODE_CLASS(HairInfoNode)
358 void attributes(AttributeRequestSet *attributes);
361 class ValueNode : public ShaderNode {
363 SHADER_NODE_CLASS(ValueNode)
368 class ColorNode : public ShaderNode {
370 SHADER_NODE_CLASS(ColorNode)
375 class AddClosureNode : public ShaderNode {
377 SHADER_NODE_CLASS(AddClosureNode)
380 class MixClosureNode : public ShaderNode {
382 SHADER_NODE_CLASS(MixClosureNode)
385 class MixClosureWeightNode : public ShaderNode {
387 SHADER_NODE_CLASS(MixClosureWeightNode);
390 class InvertNode : public ShaderNode {
392 SHADER_NODE_CLASS(InvertNode)
395 class MixNode : public ShaderNode {
397 SHADER_NODE_CLASS(MixNode)
402 static ShaderEnum type_enum;
405 class CombineRGBNode : public ShaderNode {
407 SHADER_NODE_CLASS(CombineRGBNode)
410 class GammaNode : public ShaderNode {
412 SHADER_NODE_CLASS(GammaNode)
415 class BrightContrastNode : public ShaderNode {
417 SHADER_NODE_CLASS(BrightContrastNode)
420 class SeparateRGBNode : public ShaderNode {
422 SHADER_NODE_CLASS(SeparateRGBNode)
425 class HSVNode : public ShaderNode {
427 SHADER_NODE_CLASS(HSVNode)
430 class AttributeNode : public ShaderNode {
432 SHADER_NODE_CLASS(AttributeNode)
433 void attributes(AttributeRequestSet *attributes);
438 class CameraNode : public ShaderNode {
440 SHADER_NODE_CLASS(CameraNode)
443 class FresnelNode : public ShaderNode {
445 SHADER_NODE_CLASS(FresnelNode)
448 class LayerWeightNode : public ShaderNode {
450 SHADER_NODE_CLASS(LayerWeightNode)
453 class WireframeNode : public ShaderNode {
455 SHADER_NODE_CLASS(WireframeNode)
460 class WavelengthNode : public ShaderNode {
462 SHADER_NODE_CLASS(WavelengthNode)
465 class BlackbodyNode : public ShaderNode {
467 SHADER_NODE_CLASS(BlackbodyNode)
469 bool has_converter_blackbody() { return true; }
472 class MathNode : public ShaderNode {
474 SHADER_NODE_CLASS(MathNode)
479 static ShaderEnum type_enum;
482 class NormalNode : public ShaderNode {
484 SHADER_NODE_CLASS(NormalNode)
489 class VectorMathNode : public ShaderNode {
491 SHADER_NODE_CLASS(VectorMathNode)
494 static ShaderEnum type_enum;
497 class VectorTransformNode : public ShaderNode {
499 SHADER_NODE_CLASS(VectorTransformNode)
502 ustring convert_from;
505 static ShaderEnum type_enum;
506 static ShaderEnum convert_from_enum;
507 static ShaderEnum convert_to_enum;
510 class BumpNode : public ShaderNode {
512 SHADER_NODE_CLASS(BumpNode)
516 class RGBCurvesNode : public ShaderNode {
518 SHADER_NODE_CLASS(RGBCurvesNode)
519 float4 curves[RAMP_TABLE_SIZE];
522 class VectorCurvesNode : public ShaderNode {
524 SHADER_NODE_CLASS(VectorCurvesNode)
525 float4 curves[RAMP_TABLE_SIZE];
528 class RGBRampNode : public ShaderNode {
530 SHADER_NODE_CLASS(RGBRampNode)
531 float4 ramp[RAMP_TABLE_SIZE];
535 class SetNormalNode : public ShaderNode {
537 SHADER_NODE_CLASS(SetNormalNode)
540 class OSLScriptNode : public ShaderNode {
542 SHADER_NODE_CLASS(OSLScriptNode)
544 string bytecode_hash;
546 /* ShaderInput/ShaderOutput only stores a shallow string copy (const char *)!
547 * The actual socket names have to be stored externally to avoid memory errors. */
548 vector<ustring> input_names;
549 vector<ustring> output_names;
552 class NormalMapNode : public ShaderNode {
554 SHADER_NODE_CLASS(NormalMapNode)
555 void attributes(AttributeRequestSet *attributes);
558 static ShaderEnum space_enum;
563 class TangentNode : public ShaderNode {
565 SHADER_NODE_CLASS(TangentNode)
566 void attributes(AttributeRequestSet *attributes);
568 ustring direction_type;
569 static ShaderEnum direction_type_enum;
572 static ShaderEnum axis_enum;
579 #endif /* __NODES_H__ */