2 * Copyright 2011-2013 Blender Foundation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
22 #include "util_string.h"
31 class TextureMapping {
34 Transform compute_transform();
36 void compile(SVMCompiler& compiler, int offset_in, int offset_out);
37 void compile(OSLCompiler &compiler);
46 enum Type { POINT = 0, TEXTURE = 1, VECTOR = 2, NORMAL = 3 };
49 enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 };
50 Mapping x_mapping, y_mapping, z_mapping;
52 enum Projection { FLAT, CUBE, TUBE, SPHERE };
53 Projection projection;
58 class TextureNode : public ShaderNode {
60 TextureNode(const char *name_) : ShaderNode(name_) {}
61 TextureMapping tex_mapping;
64 class ImageTextureNode : public TextureNode {
66 SHADER_NODE_NO_CLONE_CLASS(ImageTextureNode)
68 ShaderNode *clone() const;
69 void attributes(Shader *shader, AttributeRequestSet *attributes);
71 ImageManager *image_manager;
79 InterpolationType interpolation;
80 float projection_blend;
83 static ShaderEnum color_space_enum;
84 static ShaderEnum projection_enum;
87 class EnvironmentTextureNode : public TextureNode {
89 SHADER_NODE_NO_CLONE_CLASS(EnvironmentTextureNode)
90 ~EnvironmentTextureNode();
91 ShaderNode *clone() const;
92 void attributes(Shader *shader, AttributeRequestSet *attributes);
94 ImageManager *image_manager;
104 static ShaderEnum color_space_enum;
105 static ShaderEnum projection_enum;
108 class SkyTextureNode : public TextureNode {
110 SHADER_NODE_CLASS(SkyTextureNode)
112 float3 sun_direction;
117 static ShaderEnum type_enum;
120 class OutputNode : public ShaderNode {
122 SHADER_NODE_CLASS(OutputNode)
125 class GradientTextureNode : public TextureNode {
127 SHADER_NODE_CLASS(GradientTextureNode)
130 static ShaderEnum type_enum;
133 class NoiseTextureNode : public TextureNode {
135 SHADER_NODE_CLASS(NoiseTextureNode)
138 class VoronoiTextureNode : public TextureNode {
140 SHADER_NODE_CLASS(VoronoiTextureNode)
144 static ShaderEnum coloring_enum;
147 class MusgraveTextureNode : public TextureNode {
149 SHADER_NODE_CLASS(MusgraveTextureNode)
153 static ShaderEnum type_enum;
156 class WaveTextureNode : public TextureNode {
158 SHADER_NODE_CLASS(WaveTextureNode)
161 static ShaderEnum type_enum;
164 class MagicTextureNode : public TextureNode {
166 SHADER_NODE_CLASS(MagicTextureNode)
171 class CheckerTextureNode : public TextureNode {
173 SHADER_NODE_CLASS(CheckerTextureNode)
176 class BrickTextureNode : public TextureNode {
178 SHADER_NODE_CLASS(BrickTextureNode)
180 float offset, squash;
181 int offset_frequency, squash_frequency;
184 class MappingNode : public ShaderNode {
186 SHADER_NODE_CLASS(MappingNode)
188 TextureMapping tex_mapping;
191 class ConvertNode : public ShaderNode {
193 ConvertNode(ShaderSocketType from, ShaderSocketType to, bool autoconvert = false);
194 SHADER_NODE_BASE_CLASS(ConvertNode)
196 ShaderSocketType from, to;
199 class ProxyNode : public ShaderNode {
201 ProxyNode(ShaderSocketType type);
202 SHADER_NODE_BASE_CLASS(ProxyNode)
204 ShaderSocketType type;
207 class BsdfNode : public ShaderNode {
209 BsdfNode(bool scattering = false);
210 SHADER_NODE_BASE_CLASS(BsdfNode);
212 void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3 = NULL, ShaderInput *param4 = NULL);
218 class WardBsdfNode : public BsdfNode {
220 SHADER_NODE_CLASS(WardBsdfNode)
221 void attributes(Shader *shader, AttributeRequestSet *attributes);
224 class DiffuseBsdfNode : public BsdfNode {
226 SHADER_NODE_CLASS(DiffuseBsdfNode)
229 class TranslucentBsdfNode : public BsdfNode {
231 SHADER_NODE_CLASS(TranslucentBsdfNode)
234 class TransparentBsdfNode : public BsdfNode {
236 SHADER_NODE_CLASS(TransparentBsdfNode)
238 bool has_surface_transparent() { return true; }
241 class VelvetBsdfNode : public BsdfNode {
243 SHADER_NODE_CLASS(VelvetBsdfNode)
246 class GlossyBsdfNode : public BsdfNode {
248 SHADER_NODE_CLASS(GlossyBsdfNode)
250 ustring distribution;
251 static ShaderEnum distribution_enum;
254 class GlassBsdfNode : public BsdfNode {
256 SHADER_NODE_CLASS(GlassBsdfNode)
258 ustring distribution;
259 static ShaderEnum distribution_enum;
262 class RefractionBsdfNode : public BsdfNode {
264 SHADER_NODE_CLASS(RefractionBsdfNode)
266 ustring distribution;
267 static ShaderEnum distribution_enum;
270 class ToonBsdfNode : public BsdfNode {
272 SHADER_NODE_CLASS(ToonBsdfNode)
275 static ShaderEnum component_enum;
278 class SubsurfaceScatteringNode : public BsdfNode {
280 SHADER_NODE_CLASS(SubsurfaceScatteringNode)
281 bool has_surface_bssrdf() { return true; }
282 bool has_bssrdf_bump();
284 static ShaderEnum falloff_enum;
287 class EmissionNode : public ShaderNode {
289 SHADER_NODE_CLASS(EmissionNode)
291 bool has_surface_emission() { return true; }
296 class BackgroundNode : public ShaderNode {
298 SHADER_NODE_CLASS(BackgroundNode)
301 class HoldoutNode : public ShaderNode {
303 SHADER_NODE_CLASS(HoldoutNode)
306 class AmbientOcclusionNode : public ShaderNode {
308 SHADER_NODE_CLASS(AmbientOcclusionNode)
311 class VolumeNode : public ShaderNode {
313 SHADER_NODE_CLASS(VolumeNode)
315 void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2);
320 class AbsorptionVolumeNode : public VolumeNode {
322 SHADER_NODE_CLASS(AbsorptionVolumeNode)
325 class ScatterVolumeNode : public VolumeNode {
327 SHADER_NODE_CLASS(ScatterVolumeNode)
330 class HairBsdfNode : public BsdfNode {
332 SHADER_NODE_CLASS(HairBsdfNode)
335 static ShaderEnum component_enum;
339 class GeometryNode : public ShaderNode {
341 SHADER_NODE_CLASS(GeometryNode)
342 void attributes(Shader *shader, AttributeRequestSet *attributes);
345 class TextureCoordinateNode : public ShaderNode {
347 SHADER_NODE_CLASS(TextureCoordinateNode)
348 void attributes(Shader *shader, AttributeRequestSet *attributes);
353 class UVMapNode : public ShaderNode {
355 SHADER_NODE_CLASS(UVMapNode)
356 void attributes(Shader *shader, AttributeRequestSet *attributes);
362 class LightPathNode : public ShaderNode {
364 SHADER_NODE_CLASS(LightPathNode)
367 class LightFalloffNode : public ShaderNode {
369 SHADER_NODE_CLASS(LightFalloffNode)
372 class ObjectInfoNode : public ShaderNode {
374 SHADER_NODE_CLASS(ObjectInfoNode)
377 class ParticleInfoNode : public ShaderNode {
379 SHADER_NODE_CLASS(ParticleInfoNode)
380 void attributes(Shader *shader, AttributeRequestSet *attributes);
383 class HairInfoNode : public ShaderNode {
385 SHADER_NODE_CLASS(HairInfoNode)
387 void attributes(Shader *shader, AttributeRequestSet *attributes);
390 class ValueNode : public ShaderNode {
392 SHADER_NODE_CLASS(ValueNode)
397 class ColorNode : public ShaderNode {
399 SHADER_NODE_CLASS(ColorNode)
404 class AddClosureNode : public ShaderNode {
406 SHADER_NODE_CLASS(AddClosureNode)
409 class MixClosureNode : public ShaderNode {
411 SHADER_NODE_CLASS(MixClosureNode)
414 class MixClosureWeightNode : public ShaderNode {
416 SHADER_NODE_CLASS(MixClosureWeightNode);
419 class InvertNode : public ShaderNode {
421 SHADER_NODE_CLASS(InvertNode)
424 class MixNode : public ShaderNode {
426 SHADER_NODE_CLASS(MixNode)
431 static ShaderEnum type_enum;
434 class CombineRGBNode : public ShaderNode {
436 SHADER_NODE_CLASS(CombineRGBNode)
439 class CombineHSVNode : public ShaderNode {
441 SHADER_NODE_CLASS(CombineHSVNode)
444 class GammaNode : public ShaderNode {
446 SHADER_NODE_CLASS(GammaNode)
449 class BrightContrastNode : public ShaderNode {
451 SHADER_NODE_CLASS(BrightContrastNode)
454 class SeparateRGBNode : public ShaderNode {
456 SHADER_NODE_CLASS(SeparateRGBNode)
459 class SeparateHSVNode : public ShaderNode {
461 SHADER_NODE_CLASS(SeparateHSVNode)
464 class HSVNode : public ShaderNode {
466 SHADER_NODE_CLASS(HSVNode)
469 class AttributeNode : public ShaderNode {
471 SHADER_NODE_CLASS(AttributeNode)
472 void attributes(Shader *shader, AttributeRequestSet *attributes);
477 class CameraNode : public ShaderNode {
479 SHADER_NODE_CLASS(CameraNode)
482 class FresnelNode : public ShaderNode {
484 SHADER_NODE_CLASS(FresnelNode)
487 class LayerWeightNode : public ShaderNode {
489 SHADER_NODE_CLASS(LayerWeightNode)
492 class WireframeNode : public ShaderNode {
494 SHADER_NODE_CLASS(WireframeNode)
499 class WavelengthNode : public ShaderNode {
501 SHADER_NODE_CLASS(WavelengthNode)
504 class BlackbodyNode : public ShaderNode {
506 SHADER_NODE_CLASS(BlackbodyNode)
508 bool has_converter_blackbody() { return true; }
511 class MathNode : public ShaderNode {
513 SHADER_NODE_CLASS(MathNode)
518 static ShaderEnum type_enum;
521 class NormalNode : public ShaderNode {
523 SHADER_NODE_CLASS(NormalNode)
528 class VectorMathNode : public ShaderNode {
530 SHADER_NODE_CLASS(VectorMathNode)
533 static ShaderEnum type_enum;
536 class VectorTransformNode : public ShaderNode {
538 SHADER_NODE_CLASS(VectorTransformNode)
541 ustring convert_from;
544 static ShaderEnum type_enum;
545 static ShaderEnum convert_space_enum;
548 class BumpNode : public ShaderNode {
550 SHADER_NODE_CLASS(BumpNode)
554 class RGBCurvesNode : public ShaderNode {
556 SHADER_NODE_CLASS(RGBCurvesNode)
557 float4 curves[RAMP_TABLE_SIZE];
560 class VectorCurvesNode : public ShaderNode {
562 SHADER_NODE_CLASS(VectorCurvesNode)
563 float4 curves[RAMP_TABLE_SIZE];
566 class RGBRampNode : public ShaderNode {
568 SHADER_NODE_CLASS(RGBRampNode)
569 float4 ramp[RAMP_TABLE_SIZE];
573 class SetNormalNode : public ShaderNode {
575 SHADER_NODE_CLASS(SetNormalNode)
578 class OSLScriptNode : public ShaderNode {
580 SHADER_NODE_CLASS(OSLScriptNode)
582 string bytecode_hash;
584 /* ShaderInput/ShaderOutput only stores a shallow string copy (const char *)!
585 * The actual socket names have to be stored externally to avoid memory errors. */
586 vector<ustring> input_names;
587 vector<ustring> output_names;
590 class NormalMapNode : public ShaderNode {
592 SHADER_NODE_CLASS(NormalMapNode)
593 void attributes(Shader *shader, AttributeRequestSet *attributes);
596 static ShaderEnum space_enum;
601 class TangentNode : public ShaderNode {
603 SHADER_NODE_CLASS(TangentNode)
604 void attributes(Shader *shader, AttributeRequestSet *attributes);
606 ustring direction_type;
607 static ShaderEnum direction_type_enum;
610 static ShaderEnum axis_enum;
617 #endif /* __NODES_H__ */