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.
17 #include "render/image.h"
18 #include "render/integrator.h"
19 #include "render/nodes.h"
20 #include "render/scene.h"
21 #include "render/svm.h"
22 #include "kernel/svm/svm_color_util.h"
23 #include "kernel/svm/svm_ramp_util.h"
24 #include "kernel/svm/svm_math_util.h"
25 #include "render/osl.h"
26 #include "render/constant_fold.h"
28 #include "util/util_sky_model.h"
29 #include "util/util_foreach.h"
30 #include "util/util_logging.h"
31 #include "util/util_transform.h"
37 #define TEXTURE_MAPPING_DEFINE(TextureNode) \
38 SOCKET_POINT(tex_mapping.translation, "Translation", make_float3(0.0f, 0.0f, 0.0f)); \
39 SOCKET_VECTOR(tex_mapping.rotation, "Rotation", make_float3(0.0f, 0.0f, 0.0f)); \
40 SOCKET_VECTOR(tex_mapping.scale, "Scale", make_float3(1.0f, 1.0f, 1.0f)); \
42 SOCKET_VECTOR(tex_mapping.min, "Min", make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX)); \
43 SOCKET_VECTOR(tex_mapping.max, "Max", make_float3(FLT_MAX, FLT_MAX, FLT_MAX)); \
44 SOCKET_BOOLEAN(tex_mapping.use_minmax, "Use Min Max", false); \
46 static NodeEnum mapping_axis_enum; \
47 mapping_axis_enum.insert("none", TextureMapping::NONE); \
48 mapping_axis_enum.insert("x", TextureMapping::X); \
49 mapping_axis_enum.insert("y", TextureMapping::Y); \
50 mapping_axis_enum.insert("z", TextureMapping::Z); \
51 SOCKET_ENUM(tex_mapping.x_mapping, "x_mapping", mapping_axis_enum, TextureMapping::X); \
52 SOCKET_ENUM(tex_mapping.y_mapping, "y_mapping", mapping_axis_enum, TextureMapping::Y); \
53 SOCKET_ENUM(tex_mapping.z_mapping, "z_mapping", mapping_axis_enum, TextureMapping::Z); \
55 static NodeEnum mapping_type_enum; \
56 mapping_type_enum.insert("point", TextureMapping::POINT); \
57 mapping_type_enum.insert("texture", TextureMapping::TEXTURE); \
58 mapping_type_enum.insert("vector", TextureMapping::VECTOR); \
59 mapping_type_enum.insert("normal", TextureMapping::NORMAL); \
60 SOCKET_ENUM(tex_mapping.type, "Type", mapping_type_enum, TextureMapping::TEXTURE); \
62 static NodeEnum mapping_projection_enum; \
63 mapping_projection_enum.insert("flat", TextureMapping::FLAT); \
64 mapping_projection_enum.insert("cube", TextureMapping::CUBE); \
65 mapping_projection_enum.insert("tube", TextureMapping::TUBE); \
66 mapping_projection_enum.insert("sphere", TextureMapping::SPHERE); \
67 SOCKET_ENUM(tex_mapping.projection, "Projection", mapping_projection_enum, TextureMapping::FLAT);
69 TextureMapping::TextureMapping()
73 Transform TextureMapping::compute_transform()
75 Transform mmat = transform_scale(make_float3(0.0f, 0.0f, 0.0f));
78 mmat[0][x_mapping-1] = 1.0f;
80 mmat[1][y_mapping-1] = 1.0f;
82 mmat[2][z_mapping-1] = 1.0f;
84 float3 scale_clamped = scale;
86 if(type == TEXTURE || type == NORMAL) {
87 /* keep matrix invertible */
88 if(fabsf(scale.x) < 1e-5f)
89 scale_clamped.x = signf(scale.x)*1e-5f;
90 if(fabsf(scale.y) < 1e-5f)
91 scale_clamped.y = signf(scale.y)*1e-5f;
92 if(fabsf(scale.z) < 1e-5f)
93 scale_clamped.z = signf(scale.z)*1e-5f;
96 Transform smat = transform_scale(scale_clamped);
97 Transform rmat = transform_euler(rotation);
98 Transform tmat = transform_translate(translation);
104 /* inverse transform on texture coordinate gives
105 * forward transform on texture */
106 mat = tmat*rmat*smat;
107 mat = transform_inverse(mat);
111 mat = tmat*rmat*smat;
114 /* no translation for vectors */
118 /* no translation for normals, and inverse transpose */
120 mat = transform_inverse(mat);
121 mat = transform_transpose(mat);
125 /* projection last */
131 bool TextureMapping::skip()
133 if(translation != make_float3(0.0f, 0.0f, 0.0f))
135 if(rotation != make_float3(0.0f, 0.0f, 0.0f))
137 if(scale != make_float3(1.0f, 1.0f, 1.0f))
140 if(x_mapping != X || y_mapping != Y || z_mapping != Z)
148 void TextureMapping::compile(SVMCompiler& compiler, int offset_in, int offset_out)
150 compiler.add_node(NODE_MAPPING, offset_in, offset_out);
152 Transform tfm = compute_transform();
153 compiler.add_node(tfm.x);
154 compiler.add_node(tfm.y);
155 compiler.add_node(tfm.z);
156 compiler.add_node(tfm.w);
159 compiler.add_node(NODE_MIN_MAX, offset_out, offset_out);
160 compiler.add_node(float3_to_float4(min));
161 compiler.add_node(float3_to_float4(max));
165 compiler.add_node(NODE_VECTOR_MATH, NODE_VECTOR_MATH_NORMALIZE, offset_out, offset_out);
166 compiler.add_node(NODE_VECTOR_MATH, SVM_STACK_INVALID, offset_out);
170 /* Convenience function for texture nodes, allocating stack space to output
171 * a modified vector and returning its offset */
172 int TextureMapping::compile_begin(SVMCompiler& compiler, ShaderInput *vector_in)
175 int offset_in = compiler.stack_assign(vector_in);
176 int offset_out = compiler.stack_find_offset(SocketType::VECTOR);
178 compile(compiler, offset_in, offset_out);
183 return compiler.stack_assign(vector_in);
186 void TextureMapping::compile_end(SVMCompiler& compiler, ShaderInput *vector_in, int vector_offset)
189 compiler.stack_clear_offset(vector_in->type(), vector_offset);
193 void TextureMapping::compile(OSLCompiler &compiler)
196 Transform tfm = transform_transpose(compute_transform());
198 compiler.parameter("mapping", tfm);
199 compiler.parameter("use_mapping", 1);
205 NODE_DEFINE(ImageTextureNode)
207 NodeType* type = NodeType::add("image_texture", create, NodeType::SHADER);
209 TEXTURE_MAPPING_DEFINE(ImageTextureNode);
211 SOCKET_STRING(filename, "Filename", ustring(""));
213 static NodeEnum color_space_enum;
214 color_space_enum.insert("none", NODE_COLOR_SPACE_NONE);
215 color_space_enum.insert("color", NODE_COLOR_SPACE_COLOR);
216 SOCKET_ENUM(color_space, "Color Space", color_space_enum, NODE_COLOR_SPACE_COLOR);
218 SOCKET_BOOLEAN(use_alpha, "Use Alpha", true);
220 static NodeEnum interpolation_enum;
221 interpolation_enum.insert("closest", INTERPOLATION_CLOSEST);
222 interpolation_enum.insert("linear", INTERPOLATION_LINEAR);
223 interpolation_enum.insert("cubic", INTERPOLATION_CUBIC);
224 interpolation_enum.insert("smart", INTERPOLATION_SMART);
225 SOCKET_ENUM(interpolation, "Interpolation", interpolation_enum, INTERPOLATION_LINEAR);
227 static NodeEnum extension_enum;
228 extension_enum.insert("periodic", EXTENSION_REPEAT);
229 extension_enum.insert("clamp", EXTENSION_EXTEND);
230 extension_enum.insert("black", EXTENSION_CLIP);
231 SOCKET_ENUM(extension, "Extension", extension_enum, EXTENSION_REPEAT);
233 static NodeEnum projection_enum;
234 projection_enum.insert("flat", NODE_IMAGE_PROJ_FLAT);
235 projection_enum.insert("box", NODE_IMAGE_PROJ_BOX);
236 projection_enum.insert("sphere", NODE_IMAGE_PROJ_SPHERE);
237 projection_enum.insert("tube", NODE_IMAGE_PROJ_TUBE);
238 SOCKET_ENUM(projection, "Projection", projection_enum, NODE_IMAGE_PROJ_FLAT);
240 SOCKET_FLOAT(projection_blend, "Projection Blend", 0.0f);
242 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_UV);
244 SOCKET_OUT_COLOR(color, "Color");
245 SOCKET_OUT_FLOAT(alpha, "Alpha");
250 ImageTextureNode::ImageTextureNode()
251 : ImageSlotTextureNode(node_type)
253 image_manager = NULL;
261 ImageTextureNode::~ImageTextureNode()
264 image_manager->remove_image(filename.string(),
272 ShaderNode *ImageTextureNode::clone() const
274 ImageTextureNode *node = new ImageTextureNode(*this);
275 node->image_manager = NULL;
278 node->is_linear = false;
282 void ImageTextureNode::attributes(Shader *shader, AttributeRequestSet *attributes)
285 /* todo: avoid loading other texture coordinates when using ptex,
286 * and hide texture coordinate socket in the UI */
287 if(shader->has_surface && string_endswith(filename, ".ptx")) {
289 attributes->add(ATTR_STD_PTEX_FACE_ID);
290 attributes->add(ATTR_STD_PTEX_UV);
294 ShaderNode::attributes(shader, attributes);
297 void ImageTextureNode::compile(SVMCompiler& compiler)
299 ShaderInput *vector_in = input("Vector");
300 ShaderOutput *color_out = output("Color");
301 ShaderOutput *alpha_out = output("Alpha");
303 image_manager = compiler.image_manager;
306 slot = image_manager->add_image(filename.string(),
315 is_float = (int)is_float_bool;
319 int srgb = (is_linear || color_space != NODE_COLOR_SPACE_COLOR)? 0: 1;
320 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
322 if(projection != NODE_IMAGE_PROJ_BOX) {
323 compiler.add_node(NODE_TEX_IMAGE,
325 compiler.encode_uchar4(
327 compiler.stack_assign_if_linked(color_out),
328 compiler.stack_assign_if_linked(alpha_out),
333 compiler.add_node(NODE_TEX_IMAGE_BOX,
335 compiler.encode_uchar4(
337 compiler.stack_assign_if_linked(color_out),
338 compiler.stack_assign_if_linked(alpha_out),
340 __float_as_int(projection_blend));
343 tex_mapping.compile_end(compiler, vector_in, vector_offset);
346 /* image not found */
347 if(!color_out->links.empty()) {
348 compiler.add_node(NODE_VALUE_V, compiler.stack_assign(color_out));
349 compiler.add_node(NODE_VALUE_V, make_float3(TEX_IMAGE_MISSING_R,
351 TEX_IMAGE_MISSING_B));
353 if(!alpha_out->links.empty())
354 compiler.add_node(NODE_VALUE_F, __float_as_int(TEX_IMAGE_MISSING_A), compiler.stack_assign(alpha_out));
358 void ImageTextureNode::compile(OSLCompiler& compiler)
360 ShaderOutput *alpha_out = output("Alpha");
362 tex_mapping.compile(compiler);
364 image_manager = compiler.image_manager;
366 if(builtin_data == NULL) {
368 bool builtin_free_cache;
369 type = image_manager->get_image_metadata(filename.string(), NULL, is_linear, builtin_free_cache);
370 if(type == IMAGE_DATA_TYPE_FLOAT || type == IMAGE_DATA_TYPE_FLOAT4)
375 slot = image_manager->add_image(filename.string(),
384 is_float = (int)is_float_bool;
389 compiler.parameter(this, "filename");
392 /* TODO(sergey): It's not so simple to pass custom attribute
393 * to the texture() function in order to make builtin images
394 * support more clear. So we use special file name which is
395 * "@<slot_number>" and check whether file name matches this
396 * mask in the OSLRenderServices::texture().
398 compiler.parameter("filename", string_printf("@%d", slot).c_str());
400 if(is_linear || color_space != NODE_COLOR_SPACE_COLOR)
401 compiler.parameter("color_space", "linear");
403 compiler.parameter("color_space", "sRGB");
404 compiler.parameter(this, "projection");
405 compiler.parameter(this, "projection_blend");
406 compiler.parameter("is_float", is_float);
407 compiler.parameter("use_alpha", !alpha_out->links.empty());
408 compiler.parameter(this, "interpolation");
409 compiler.parameter(this, "extension");
411 compiler.add(this, "node_image_texture");
414 /* Environment Texture */
416 NODE_DEFINE(EnvironmentTextureNode)
418 NodeType* type = NodeType::add("environment_texture", create, NodeType::SHADER);
420 TEXTURE_MAPPING_DEFINE(EnvironmentTextureNode);
422 SOCKET_STRING(filename, "Filename", ustring(""));
424 static NodeEnum color_space_enum;
425 color_space_enum.insert("none", NODE_COLOR_SPACE_NONE);
426 color_space_enum.insert("color", NODE_COLOR_SPACE_COLOR);
427 SOCKET_ENUM(color_space, "Color Space", color_space_enum, NODE_COLOR_SPACE_COLOR);
429 SOCKET_BOOLEAN(use_alpha, "Use Alpha", true);
431 static NodeEnum interpolation_enum;
432 interpolation_enum.insert("closest", INTERPOLATION_CLOSEST);
433 interpolation_enum.insert("linear", INTERPOLATION_LINEAR);
434 interpolation_enum.insert("cubic", INTERPOLATION_CUBIC);
435 interpolation_enum.insert("smart", INTERPOLATION_SMART);
436 SOCKET_ENUM(interpolation, "Interpolation", interpolation_enum, INTERPOLATION_LINEAR);
438 static NodeEnum projection_enum;
439 projection_enum.insert("equirectangular", NODE_ENVIRONMENT_EQUIRECTANGULAR);
440 projection_enum.insert("mirror_ball", NODE_ENVIRONMENT_MIRROR_BALL);
441 SOCKET_ENUM(projection, "Projection", projection_enum, NODE_ENVIRONMENT_EQUIRECTANGULAR);
443 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_POSITION);
445 SOCKET_OUT_COLOR(color, "Color");
446 SOCKET_OUT_FLOAT(alpha, "Alpha");
451 EnvironmentTextureNode::EnvironmentTextureNode()
452 : ImageSlotTextureNode(node_type)
454 image_manager = NULL;
462 EnvironmentTextureNode::~EnvironmentTextureNode()
465 image_manager->remove_image(filename.string(),
473 ShaderNode *EnvironmentTextureNode::clone() const
475 EnvironmentTextureNode *node = new EnvironmentTextureNode(*this);
476 node->image_manager = NULL;
479 node->is_linear = false;
483 void EnvironmentTextureNode::attributes(Shader *shader, AttributeRequestSet *attributes)
486 if(shader->has_surface && string_endswith(filename, ".ptx")) {
488 attributes->add(ATTR_STD_PTEX_FACE_ID);
489 attributes->add(ATTR_STD_PTEX_UV);
493 ShaderNode::attributes(shader, attributes);
496 void EnvironmentTextureNode::compile(SVMCompiler& compiler)
498 ShaderInput *vector_in = input("Vector");
499 ShaderOutput *color_out = output("Color");
500 ShaderOutput *alpha_out = output("Alpha");
502 image_manager = compiler.image_manager;
505 slot = image_manager->add_image(filename.string(),
514 is_float = (int)is_float_bool;
518 int srgb = (is_linear || color_space != NODE_COLOR_SPACE_COLOR)? 0: 1;
519 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
521 compiler.add_node(NODE_TEX_ENVIRONMENT,
523 compiler.encode_uchar4(
525 compiler.stack_assign_if_linked(color_out),
526 compiler.stack_assign_if_linked(alpha_out),
530 tex_mapping.compile_end(compiler, vector_in, vector_offset);
533 /* image not found */
534 if(!color_out->links.empty()) {
535 compiler.add_node(NODE_VALUE_V, compiler.stack_assign(color_out));
536 compiler.add_node(NODE_VALUE_V, make_float3(TEX_IMAGE_MISSING_R,
538 TEX_IMAGE_MISSING_B));
540 if(!alpha_out->links.empty())
541 compiler.add_node(NODE_VALUE_F, __float_as_int(TEX_IMAGE_MISSING_A), compiler.stack_assign(alpha_out));
545 void EnvironmentTextureNode::compile(OSLCompiler& compiler)
547 ShaderOutput *alpha_out = output("Alpha");
549 tex_mapping.compile(compiler);
551 /* See comments in ImageTextureNode::compile about support
554 image_manager = compiler.image_manager;
556 if(builtin_data == NULL) {
558 bool builtin_free_cache;
559 type = image_manager->get_image_metadata(filename.string(), NULL, is_linear, builtin_free_cache);
560 if(type == IMAGE_DATA_TYPE_FLOAT || type == IMAGE_DATA_TYPE_FLOAT4)
565 slot = image_manager->add_image(filename.string(),
574 is_float = (int)is_float_bool;
579 compiler.parameter(this, "filename");
582 compiler.parameter("filename", string_printf("@%d", slot).c_str());
584 compiler.parameter(this, "projection");
585 if(is_linear || color_space != NODE_COLOR_SPACE_COLOR)
586 compiler.parameter("color_space", "linear");
588 compiler.parameter("color_space", "sRGB");
590 compiler.parameter(this, "interpolation");
591 compiler.parameter("is_float", is_float);
592 compiler.parameter("use_alpha", !alpha_out->links.empty());
593 compiler.add(this, "node_environment_texture");
598 static float2 sky_spherical_coordinates(float3 dir)
600 return make_float2(acosf(dir.z), atan2f(dir.x, dir.y));
603 typedef struct SunSky {
604 /* sun direction in spherical and cartesian */
608 float radiance_x, radiance_y, radiance_z;
609 float config_x[9], config_y[9], config_z[9];
613 static float sky_perez_function(float lam[6], float theta, float gamma)
615 return (1.0f + lam[0]*expf(lam[1]/cosf(theta))) * (1.0f + lam[2]*expf(lam[3]*gamma) + lam[4]*cosf(gamma)*cosf(gamma));
618 static void sky_texture_precompute_old(SunSky *sunsky, float3 dir, float turbidity)
621 * We re-use the SunSky struct of the new model, to avoid extra variables
622 * zenith_Y/x/y is now radiance_x/y/z
623 * perez_Y/x/y is now config_x/y/z
626 float2 spherical = sky_spherical_coordinates(dir);
627 float theta = spherical.x;
628 float phi = spherical.y;
630 sunsky->theta = theta;
633 float theta2 = theta*theta;
634 float theta3 = theta2*theta;
638 float chi = (4.0f / 9.0f - T / 120.0f) * (M_PI_F - 2.0f * theta);
639 sunsky->radiance_x = (4.0453f * T - 4.9710f) * tanf(chi) - 0.2155f * T + 2.4192f;
640 sunsky->radiance_x *= 0.06f;
643 (0.00166f * theta3 - 0.00375f * theta2 + 0.00209f * theta) * T2 +
644 (-0.02903f * theta3 + 0.06377f * theta2 - 0.03202f * theta + 0.00394f) * T +
645 (0.11693f * theta3 - 0.21196f * theta2 + 0.06052f * theta + 0.25886f);
648 (0.00275f * theta3 - 0.00610f * theta2 + 0.00317f * theta) * T2 +
649 (-0.04214f * theta3 + 0.08970f * theta2 - 0.04153f * theta + 0.00516f) * T +
650 (0.15346f * theta3 - 0.26756f * theta2 + 0.06670f * theta + 0.26688f);
652 sunsky->config_x[0] = (0.1787f * T - 1.4630f);
653 sunsky->config_x[1] = (-0.3554f * T + 0.4275f);
654 sunsky->config_x[2] = (-0.0227f * T + 5.3251f);
655 sunsky->config_x[3] = (0.1206f * T - 2.5771f);
656 sunsky->config_x[4] = (-0.0670f * T + 0.3703f);
658 sunsky->config_y[0] = (-0.0193f * T - 0.2592f);
659 sunsky->config_y[1] = (-0.0665f * T + 0.0008f);
660 sunsky->config_y[2] = (-0.0004f * T + 0.2125f);
661 sunsky->config_y[3] = (-0.0641f * T - 0.8989f);
662 sunsky->config_y[4] = (-0.0033f * T + 0.0452f);
664 sunsky->config_z[0] = (-0.0167f * T - 0.2608f);
665 sunsky->config_z[1] = (-0.0950f * T + 0.0092f);
666 sunsky->config_z[2] = (-0.0079f * T + 0.2102f);
667 sunsky->config_z[3] = (-0.0441f * T - 1.6537f);
668 sunsky->config_z[4] = (-0.0109f * T + 0.0529f);
670 /* unused for old sky model */
671 for(int i = 5; i < 9; i++) {
672 sunsky->config_x[i] = 0.0f;
673 sunsky->config_y[i] = 0.0f;
674 sunsky->config_z[i] = 0.0f;
677 sunsky->radiance_x /= sky_perez_function(sunsky->config_x, 0, theta);
678 sunsky->radiance_y /= sky_perez_function(sunsky->config_y, 0, theta);
679 sunsky->radiance_z /= sky_perez_function(sunsky->config_z, 0, theta);
683 static void sky_texture_precompute_new(SunSky *sunsky, float3 dir, float turbidity, float ground_albedo)
685 /* Calculate Sun Direction and save coordinates */
686 float2 spherical = sky_spherical_coordinates(dir);
687 float theta = spherical.x;
688 float phi = spherical.y;
690 /* Clamp Turbidity */
691 turbidity = clamp(turbidity, 0.0f, 10.0f);
693 /* Clamp to Horizon */
694 theta = clamp(theta, 0.0f, M_PI_2_F);
696 sunsky->theta = theta;
699 float solarElevation = M_PI_2_F - theta;
701 /* Initialize Sky Model */
702 ArHosekSkyModelState *sky_state;
703 sky_state = arhosek_xyz_skymodelstate_alloc_init((double)turbidity, (double)ground_albedo, (double)solarElevation);
705 /* Copy values from sky_state to SunSky */
706 for(int i = 0; i < 9; ++i) {
707 sunsky->config_x[i] = (float)sky_state->configs[0][i];
708 sunsky->config_y[i] = (float)sky_state->configs[1][i];
709 sunsky->config_z[i] = (float)sky_state->configs[2][i];
711 sunsky->radiance_x = (float)sky_state->radiances[0];
712 sunsky->radiance_y = (float)sky_state->radiances[1];
713 sunsky->radiance_z = (float)sky_state->radiances[2];
716 arhosekskymodelstate_free(sky_state);
719 NODE_DEFINE(SkyTextureNode)
721 NodeType* type = NodeType::add("sky_texture", create, NodeType::SHADER);
723 TEXTURE_MAPPING_DEFINE(SkyTextureNode);
725 static NodeEnum type_enum;
726 type_enum.insert("preetham", NODE_SKY_OLD);
727 type_enum.insert("hosek_wilkie", NODE_SKY_NEW);
728 SOCKET_ENUM(type, "Type", type_enum, NODE_SKY_NEW);
730 SOCKET_VECTOR(sun_direction, "Sun Direction", make_float3(0.0f, 0.0f, 1.0f));
731 SOCKET_FLOAT(turbidity, "Turbidity", 2.2f);
732 SOCKET_FLOAT(ground_albedo, "Ground Albedo", 0.3f);
734 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
736 SOCKET_OUT_COLOR(color, "Color");
741 SkyTextureNode::SkyTextureNode()
742 : TextureNode(node_type)
746 void SkyTextureNode::compile(SVMCompiler& compiler)
748 ShaderInput *vector_in = input("Vector");
749 ShaderOutput *color_out = output("Color");
752 if(type == NODE_SKY_OLD)
753 sky_texture_precompute_old(&sunsky, sun_direction, turbidity);
754 else if(type == NODE_SKY_NEW)
755 sky_texture_precompute_new(&sunsky, sun_direction, turbidity, ground_albedo);
759 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
761 compiler.stack_assign(color_out);
762 compiler.add_node(NODE_TEX_SKY, vector_offset, compiler.stack_assign(color_out), type);
763 compiler.add_node(__float_as_uint(sunsky.phi), __float_as_uint(sunsky.theta), __float_as_uint(sunsky.radiance_x), __float_as_uint(sunsky.radiance_y));
764 compiler.add_node(__float_as_uint(sunsky.radiance_z), __float_as_uint(sunsky.config_x[0]), __float_as_uint(sunsky.config_x[1]), __float_as_uint(sunsky.config_x[2]));
765 compiler.add_node(__float_as_uint(sunsky.config_x[3]), __float_as_uint(sunsky.config_x[4]), __float_as_uint(sunsky.config_x[5]), __float_as_uint(sunsky.config_x[6]));
766 compiler.add_node(__float_as_uint(sunsky.config_x[7]), __float_as_uint(sunsky.config_x[8]), __float_as_uint(sunsky.config_y[0]), __float_as_uint(sunsky.config_y[1]));
767 compiler.add_node(__float_as_uint(sunsky.config_y[2]), __float_as_uint(sunsky.config_y[3]), __float_as_uint(sunsky.config_y[4]), __float_as_uint(sunsky.config_y[5]));
768 compiler.add_node(__float_as_uint(sunsky.config_y[6]), __float_as_uint(sunsky.config_y[7]), __float_as_uint(sunsky.config_y[8]), __float_as_uint(sunsky.config_z[0]));
769 compiler.add_node(__float_as_uint(sunsky.config_z[1]), __float_as_uint(sunsky.config_z[2]), __float_as_uint(sunsky.config_z[3]), __float_as_uint(sunsky.config_z[4]));
770 compiler.add_node(__float_as_uint(sunsky.config_z[5]), __float_as_uint(sunsky.config_z[6]), __float_as_uint(sunsky.config_z[7]), __float_as_uint(sunsky.config_z[8]));
772 tex_mapping.compile_end(compiler, vector_in, vector_offset);
775 void SkyTextureNode::compile(OSLCompiler& compiler)
777 tex_mapping.compile(compiler);
780 if(type == NODE_SKY_OLD)
781 sky_texture_precompute_old(&sunsky, sun_direction, turbidity);
782 else if(type == NODE_SKY_NEW)
783 sky_texture_precompute_new(&sunsky, sun_direction, turbidity, ground_albedo);
787 compiler.parameter(this, "type");
788 compiler.parameter("theta", sunsky.theta);
789 compiler.parameter("phi", sunsky.phi);
790 compiler.parameter_color("radiance", make_float3(sunsky.radiance_x, sunsky.radiance_y, sunsky.radiance_z));
791 compiler.parameter_array("config_x", sunsky.config_x, 9);
792 compiler.parameter_array("config_y", sunsky.config_y, 9);
793 compiler.parameter_array("config_z", sunsky.config_z, 9);
794 compiler.add(this, "node_sky_texture");
797 /* Gradient Texture */
799 NODE_DEFINE(GradientTextureNode)
801 NodeType* type = NodeType::add("gradient_texture", create, NodeType::SHADER);
803 TEXTURE_MAPPING_DEFINE(GradientTextureNode);
805 static NodeEnum type_enum;
806 type_enum.insert("linear", NODE_BLEND_LINEAR);
807 type_enum.insert("quadratic", NODE_BLEND_QUADRATIC);
808 type_enum.insert("easing", NODE_BLEND_EASING);
809 type_enum.insert("diagonal", NODE_BLEND_DIAGONAL);
810 type_enum.insert("radial", NODE_BLEND_RADIAL);
811 type_enum.insert("quadratic_sphere", NODE_BLEND_QUADRATIC_SPHERE);
812 type_enum.insert("spherical", NODE_BLEND_SPHERICAL);
813 SOCKET_ENUM(type, "Type", type_enum, NODE_BLEND_LINEAR);
815 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
817 SOCKET_OUT_COLOR(color, "Color");
818 SOCKET_OUT_FLOAT(fac, "Fac");
823 GradientTextureNode::GradientTextureNode()
824 : TextureNode(node_type)
828 void GradientTextureNode::compile(SVMCompiler& compiler)
830 ShaderInput *vector_in = input("Vector");
831 ShaderOutput *color_out = output("Color");
832 ShaderOutput *fac_out = output("Fac");
834 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
836 compiler.add_node(NODE_TEX_GRADIENT,
837 compiler.encode_uchar4(
840 compiler.stack_assign_if_linked(fac_out),
841 compiler.stack_assign_if_linked(color_out)));
843 tex_mapping.compile_end(compiler, vector_in, vector_offset);
846 void GradientTextureNode::compile(OSLCompiler& compiler)
848 tex_mapping.compile(compiler);
850 compiler.parameter(this, "type");
851 compiler.add(this, "node_gradient_texture");
856 NODE_DEFINE(NoiseTextureNode)
858 NodeType* type = NodeType::add("noise_texture", create, NodeType::SHADER);
860 TEXTURE_MAPPING_DEFINE(NoiseTextureNode);
862 SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
863 SOCKET_IN_FLOAT(detail, "Detail", 2.0f);
864 SOCKET_IN_FLOAT(distortion, "Distortion", 0.0f);
865 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
867 SOCKET_OUT_COLOR(color, "Color");
868 SOCKET_OUT_FLOAT(fac, "Fac");
873 NoiseTextureNode::NoiseTextureNode()
874 : TextureNode(node_type)
878 void NoiseTextureNode::compile(SVMCompiler& compiler)
880 ShaderInput *distortion_in = input("Distortion");
881 ShaderInput *detail_in = input("Detail");
882 ShaderInput *scale_in = input("Scale");
883 ShaderInput *vector_in = input("Vector");
884 ShaderOutput *color_out = output("Color");
885 ShaderOutput *fac_out = output("Fac");
887 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
889 compiler.add_node(NODE_TEX_NOISE,
890 compiler.encode_uchar4(
892 compiler.stack_assign_if_linked(scale_in),
893 compiler.stack_assign_if_linked(detail_in),
894 compiler.stack_assign_if_linked(distortion_in)),
895 compiler.encode_uchar4(
896 compiler.stack_assign_if_linked(color_out),
897 compiler.stack_assign_if_linked(fac_out)));
899 __float_as_int(scale),
900 __float_as_int(detail),
901 __float_as_int(distortion));
903 tex_mapping.compile_end(compiler, vector_in, vector_offset);
906 void NoiseTextureNode::compile(OSLCompiler& compiler)
908 tex_mapping.compile(compiler);
910 compiler.add(this, "node_noise_texture");
913 /* Voronoi Texture */
915 NODE_DEFINE(VoronoiTextureNode)
917 NodeType* type = NodeType::add("voronoi_texture", create, NodeType::SHADER);
919 TEXTURE_MAPPING_DEFINE(VoronoiTextureNode);
921 static NodeEnum coloring_enum;
922 coloring_enum.insert("intensity", NODE_VORONOI_INTENSITY);
923 coloring_enum.insert("cells", NODE_VORONOI_CELLS);
924 SOCKET_ENUM(coloring, "Coloring", coloring_enum, NODE_VORONOI_INTENSITY);
926 SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
927 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
929 SOCKET_OUT_COLOR(color, "Color");
930 SOCKET_OUT_FLOAT(fac, "Fac");
935 VoronoiTextureNode::VoronoiTextureNode()
936 : TextureNode(node_type)
940 void VoronoiTextureNode::compile(SVMCompiler& compiler)
942 ShaderInput *scale_in = input("Scale");
943 ShaderInput *vector_in = input("Vector");
944 ShaderOutput *color_out = output("Color");
945 ShaderOutput *fac_out = output("Fac");
947 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
949 compiler.add_node(NODE_TEX_VORONOI,
951 compiler.encode_uchar4(
952 compiler.stack_assign_if_linked(scale_in),
954 compiler.stack_assign(fac_out),
955 compiler.stack_assign(color_out)),
956 __float_as_int(scale));
958 tex_mapping.compile_end(compiler, vector_in, vector_offset);
961 void VoronoiTextureNode::compile(OSLCompiler& compiler)
963 tex_mapping.compile(compiler);
965 compiler.parameter(this, "coloring");
966 compiler.add(this, "node_voronoi_texture");
969 /* Musgrave Texture */
971 NODE_DEFINE(MusgraveTextureNode)
973 NodeType* type = NodeType::add("musgrave_texture", create, NodeType::SHADER);
975 TEXTURE_MAPPING_DEFINE(MusgraveTextureNode);
977 static NodeEnum type_enum;
978 type_enum.insert("multifractal", NODE_MUSGRAVE_MULTIFRACTAL);
979 type_enum.insert("fBM", NODE_MUSGRAVE_FBM);
980 type_enum.insert("hybrid_multifractal", NODE_MUSGRAVE_HYBRID_MULTIFRACTAL);
981 type_enum.insert("ridged_multifractal", NODE_MUSGRAVE_RIDGED_MULTIFRACTAL);
982 type_enum.insert("hetero_terrain", NODE_MUSGRAVE_HETERO_TERRAIN);
983 SOCKET_ENUM(type, "Type", type_enum, NODE_MUSGRAVE_FBM);
985 SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
986 SOCKET_IN_FLOAT(detail, "Detail", 2.0f);
987 SOCKET_IN_FLOAT(dimension, "Dimension", 2.0f);
988 SOCKET_IN_FLOAT(lacunarity, "Lacunarity", 1.0f);
989 SOCKET_IN_FLOAT(offset, "Offset", 0.0f);
990 SOCKET_IN_FLOAT(gain, "Gain", 1.0f);
991 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
993 SOCKET_OUT_COLOR(color, "Color");
994 SOCKET_OUT_FLOAT(fac, "Fac");
999 MusgraveTextureNode::MusgraveTextureNode()
1000 : TextureNode(node_type)
1004 void MusgraveTextureNode::compile(SVMCompiler& compiler)
1006 ShaderInput *vector_in = input("Vector");
1007 ShaderInput *scale_in = input("Scale");
1008 ShaderInput *dimension_in = input("Dimension");
1009 ShaderInput *lacunarity_in = input("Lacunarity");
1010 ShaderInput *detail_in = input("Detail");
1011 ShaderInput *offset_in = input("Offset");
1012 ShaderInput *gain_in = input("Gain");
1013 ShaderOutput *fac_out = output("Fac");
1014 ShaderOutput *color_out = output("Color");
1016 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
1018 compiler.add_node(NODE_TEX_MUSGRAVE,
1019 compiler.encode_uchar4(
1022 compiler.stack_assign_if_linked(color_out),
1023 compiler.stack_assign_if_linked(fac_out)),
1024 compiler.encode_uchar4(
1025 compiler.stack_assign_if_linked(dimension_in),
1026 compiler.stack_assign_if_linked(lacunarity_in),
1027 compiler.stack_assign_if_linked(detail_in),
1028 compiler.stack_assign_if_linked(offset_in)),
1029 compiler.encode_uchar4(
1030 compiler.stack_assign_if_linked(gain_in),
1031 compiler.stack_assign_if_linked(scale_in)));
1032 compiler.add_node(__float_as_int(dimension),
1033 __float_as_int(lacunarity),
1034 __float_as_int(detail),
1035 __float_as_int(offset));
1036 compiler.add_node(__float_as_int(gain),
1037 __float_as_int(scale));
1039 tex_mapping.compile_end(compiler, vector_in, vector_offset);
1042 void MusgraveTextureNode::compile(OSLCompiler& compiler)
1044 tex_mapping.compile(compiler);
1046 compiler.parameter(this, "type");
1047 compiler.add(this, "node_musgrave_texture");
1052 NODE_DEFINE(WaveTextureNode)
1054 NodeType* type = NodeType::add("wave_texture", create, NodeType::SHADER);
1056 TEXTURE_MAPPING_DEFINE(WaveTextureNode);
1058 static NodeEnum type_enum;
1059 type_enum.insert("bands", NODE_WAVE_BANDS);
1060 type_enum.insert("rings", NODE_WAVE_RINGS);
1061 SOCKET_ENUM(type, "Type", type_enum, NODE_WAVE_BANDS);
1063 static NodeEnum profile_enum;
1064 profile_enum.insert("sine", NODE_WAVE_PROFILE_SIN);
1065 profile_enum.insert("saw", NODE_WAVE_PROFILE_SAW);
1066 SOCKET_ENUM(profile, "Profile", profile_enum, NODE_WAVE_PROFILE_SIN);
1068 SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
1069 SOCKET_IN_FLOAT(distortion, "Distortion", 0.0f);
1070 SOCKET_IN_FLOAT(detail, "Detail", 2.0f);
1071 SOCKET_IN_FLOAT(detail_scale, "Detail Scale", 0.0f);
1072 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
1074 SOCKET_OUT_COLOR(color, "Color");
1075 SOCKET_OUT_FLOAT(fac, "Fac");
1080 WaveTextureNode::WaveTextureNode()
1081 : TextureNode(node_type)
1085 void WaveTextureNode::compile(SVMCompiler& compiler)
1087 ShaderInput *scale_in = input("Scale");
1088 ShaderInput *distortion_in = input("Distortion");
1089 ShaderInput *dscale_in = input("Detail Scale");
1090 ShaderInput *detail_in = input("Detail");
1091 ShaderInput *vector_in = input("Vector");
1092 ShaderOutput *fac_out = output("Fac");
1093 ShaderOutput *color_out = output("Color");
1095 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
1097 compiler.add_node(NODE_TEX_WAVE,
1098 compiler.encode_uchar4(
1100 compiler.stack_assign_if_linked(color_out),
1101 compiler.stack_assign_if_linked(fac_out),
1102 compiler.stack_assign_if_linked(dscale_in)),
1103 compiler.encode_uchar4(
1105 compiler.stack_assign_if_linked(scale_in),
1106 compiler.stack_assign_if_linked(detail_in),
1107 compiler.stack_assign_if_linked(distortion_in)),
1111 __float_as_int(scale),
1112 __float_as_int(detail),
1113 __float_as_int(distortion),
1114 __float_as_int(detail_scale));
1116 tex_mapping.compile_end(compiler, vector_in, vector_offset);
1119 void WaveTextureNode::compile(OSLCompiler& compiler)
1121 tex_mapping.compile(compiler);
1123 compiler.parameter(this, "type");
1124 compiler.parameter(this, "profile");
1126 compiler.add(this, "node_wave_texture");
1131 NODE_DEFINE(MagicTextureNode)
1133 NodeType* type = NodeType::add("magic_texture", create, NodeType::SHADER);
1135 TEXTURE_MAPPING_DEFINE(MagicTextureNode);
1137 SOCKET_INT(depth, "Depth", 2);
1139 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
1140 SOCKET_IN_FLOAT(scale, "Scale", 5.0f);
1141 SOCKET_IN_FLOAT(distortion, "Distortion", 1.0f);
1143 SOCKET_OUT_COLOR(color, "Color");
1144 SOCKET_OUT_FLOAT(fac, "Fac");
1149 MagicTextureNode::MagicTextureNode()
1150 : TextureNode(node_type)
1154 void MagicTextureNode::compile(SVMCompiler& compiler)
1156 ShaderInput *vector_in = input("Vector");
1157 ShaderInput *scale_in = input("Scale");
1158 ShaderInput *distortion_in = input("Distortion");
1159 ShaderOutput *color_out = output("Color");
1160 ShaderOutput *fac_out = output("Fac");
1162 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
1164 compiler.add_node(NODE_TEX_MAGIC,
1165 compiler.encode_uchar4(
1167 compiler.stack_assign_if_linked(color_out),
1168 compiler.stack_assign_if_linked(fac_out)),
1169 compiler.encode_uchar4(
1171 compiler.stack_assign_if_linked(scale_in),
1172 compiler.stack_assign_if_linked(distortion_in)));
1174 __float_as_int(scale),
1175 __float_as_int(distortion));
1177 tex_mapping.compile_end(compiler, vector_in, vector_offset);
1180 void MagicTextureNode::compile(OSLCompiler& compiler)
1182 tex_mapping.compile(compiler);
1184 compiler.parameter(this, "depth");
1185 compiler.add(this, "node_magic_texture");
1188 /* Checker Texture */
1190 NODE_DEFINE(CheckerTextureNode)
1192 NodeType* type = NodeType::add("checker_texture", create, NodeType::SHADER);
1194 TEXTURE_MAPPING_DEFINE(CheckerTextureNode);
1196 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
1197 SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f));
1198 SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f));
1199 SOCKET_IN_FLOAT(scale, "Scale", 1.0f);
1201 SOCKET_OUT_COLOR(color, "Color");
1202 SOCKET_OUT_FLOAT(fac, "Fac");
1207 CheckerTextureNode::CheckerTextureNode()
1208 : TextureNode(node_type)
1212 void CheckerTextureNode::compile(SVMCompiler& compiler)
1214 ShaderInput *vector_in = input("Vector");
1215 ShaderInput *color1_in = input("Color1");
1216 ShaderInput *color2_in = input("Color2");
1217 ShaderInput *scale_in = input("Scale");
1219 ShaderOutput *color_out = output("Color");
1220 ShaderOutput *fac_out = output("Fac");
1222 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
1224 compiler.add_node(NODE_TEX_CHECKER,
1225 compiler.encode_uchar4(
1227 compiler.stack_assign(color1_in),
1228 compiler.stack_assign(color2_in),
1229 compiler.stack_assign_if_linked(scale_in)),
1230 compiler.encode_uchar4(
1231 compiler.stack_assign_if_linked(color_out),
1232 compiler.stack_assign_if_linked(fac_out)),
1233 __float_as_int(scale));
1235 tex_mapping.compile_end(compiler, vector_in, vector_offset);
1238 void CheckerTextureNode::compile(OSLCompiler& compiler)
1240 tex_mapping.compile(compiler);
1242 compiler.add(this, "node_checker_texture");
1247 NODE_DEFINE(BrickTextureNode)
1249 NodeType* type = NodeType::add("brick_texture", create, NodeType::SHADER);
1251 TEXTURE_MAPPING_DEFINE(BrickTextureNode);
1253 SOCKET_FLOAT(offset, "Offset", 0.5f);
1254 SOCKET_INT(offset_frequency, "Offset Frequency", 2);
1255 SOCKET_FLOAT(squash, "Squash", 1.0f);
1256 SOCKET_INT(squash_frequency, "Squash Frequency", 2);
1258 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TEXTURE_GENERATED);
1260 SOCKET_IN_COLOR(color1, "Color1", make_float3(0.0f, 0.0f, 0.0f));
1261 SOCKET_IN_COLOR(color2, "Color2", make_float3(0.0f, 0.0f, 0.0f));
1262 SOCKET_IN_COLOR(mortar, "Mortar", make_float3(0.0f, 0.0f, 0.0f));
1263 SOCKET_IN_FLOAT(scale, "Scale", 5.0f);
1264 SOCKET_IN_FLOAT(mortar_size, "Mortar Size", 0.02f);
1265 SOCKET_IN_FLOAT(mortar_smooth, "Mortar Smooth", 0.0f);
1266 SOCKET_IN_FLOAT(bias, "Bias", 0.0f);
1267 SOCKET_IN_FLOAT(brick_width, "Brick Width", 0.5f);
1268 SOCKET_IN_FLOAT(row_height, "Row Height", 0.25f);
1270 SOCKET_OUT_COLOR(color, "Color");
1271 SOCKET_OUT_FLOAT(fac, "Fac");
1276 BrickTextureNode::BrickTextureNode()
1277 : TextureNode(node_type)
1281 void BrickTextureNode::compile(SVMCompiler& compiler)
1283 ShaderInput *vector_in = input("Vector");
1284 ShaderInput *color1_in = input("Color1");
1285 ShaderInput *color2_in = input("Color2");
1286 ShaderInput *mortar_in = input("Mortar");
1287 ShaderInput *scale_in = input("Scale");
1288 ShaderInput *mortar_size_in = input("Mortar Size");
1289 ShaderInput *mortar_smooth_in = input("Mortar Smooth");
1290 ShaderInput *bias_in = input("Bias");
1291 ShaderInput *brick_width_in = input("Brick Width");
1292 ShaderInput *row_height_in = input("Row Height");
1294 ShaderOutput *color_out = output("Color");
1295 ShaderOutput *fac_out = output("Fac");
1297 int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
1299 compiler.add_node(NODE_TEX_BRICK,
1300 compiler.encode_uchar4(
1302 compiler.stack_assign(color1_in),
1303 compiler.stack_assign(color2_in),
1304 compiler.stack_assign(mortar_in)),
1305 compiler.encode_uchar4(
1306 compiler.stack_assign_if_linked(scale_in),
1307 compiler.stack_assign_if_linked(mortar_size_in),
1308 compiler.stack_assign_if_linked(bias_in),
1309 compiler.stack_assign_if_linked(brick_width_in)),
1310 compiler.encode_uchar4(
1311 compiler.stack_assign_if_linked(row_height_in),
1312 compiler.stack_assign_if_linked(color_out),
1313 compiler.stack_assign_if_linked(fac_out),
1314 compiler.stack_assign_if_linked(mortar_smooth_in)));
1316 compiler.add_node(compiler.encode_uchar4(offset_frequency, squash_frequency),
1317 __float_as_int(scale),
1318 __float_as_int(mortar_size),
1319 __float_as_int(bias));
1321 compiler.add_node(__float_as_int(brick_width),
1322 __float_as_int(row_height),
1323 __float_as_int(offset),
1324 __float_as_int(squash));
1326 compiler.add_node(__float_as_int(mortar_smooth),
1331 tex_mapping.compile_end(compiler, vector_in, vector_offset);
1334 void BrickTextureNode::compile(OSLCompiler& compiler)
1336 tex_mapping.compile(compiler);
1338 compiler.parameter(this, "offset");
1339 compiler.parameter(this, "offset_frequency");
1340 compiler.parameter(this, "squash");
1341 compiler.parameter(this, "squash_frequency");
1342 compiler.add(this, "node_brick_texture");
1345 /* Point Density Texture */
1347 NODE_DEFINE(PointDensityTextureNode)
1349 NodeType* type = NodeType::add("point_density_texture", create, NodeType::SHADER);
1351 SOCKET_STRING(filename, "Filename", ustring(""));
1353 static NodeEnum space_enum;
1354 space_enum.insert("object", NODE_TEX_VOXEL_SPACE_OBJECT);
1355 space_enum.insert("world", NODE_TEX_VOXEL_SPACE_WORLD);
1356 SOCKET_ENUM(space, "Space", space_enum, NODE_TEX_VOXEL_SPACE_OBJECT);
1358 static NodeEnum interpolation_enum;
1359 interpolation_enum.insert("closest", INTERPOLATION_CLOSEST);
1360 interpolation_enum.insert("linear", INTERPOLATION_LINEAR);
1361 interpolation_enum.insert("cubic", INTERPOLATION_CUBIC);
1362 interpolation_enum.insert("smart", INTERPOLATION_SMART);
1363 SOCKET_ENUM(interpolation, "Interpolation", interpolation_enum, INTERPOLATION_LINEAR);
1365 SOCKET_TRANSFORM(tfm, "Transform", transform_identity());
1367 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_POSITION);
1369 SOCKET_OUT_FLOAT(density, "Density");
1370 SOCKET_OUT_COLOR(color, "Color");
1375 PointDensityTextureNode::PointDensityTextureNode()
1376 : ShaderNode(node_type)
1378 image_manager = NULL;
1380 builtin_data = NULL;
1383 PointDensityTextureNode::~PointDensityTextureNode()
1386 image_manager->remove_image(filename.string(),
1394 ShaderNode *PointDensityTextureNode::clone() const
1396 PointDensityTextureNode *node = new PointDensityTextureNode(*this);
1397 node->image_manager = NULL;
1402 void PointDensityTextureNode::attributes(Shader *shader,
1403 AttributeRequestSet *attributes)
1405 if(shader->has_volume)
1406 attributes->add(ATTR_STD_GENERATED_TRANSFORM);
1408 ShaderNode::attributes(shader, attributes);
1411 void PointDensityTextureNode::compile(SVMCompiler& compiler)
1413 ShaderInput *vector_in = input("Vector");
1414 ShaderOutput *density_out = output("Density");
1415 ShaderOutput *color_out = output("Color");
1417 const bool use_density = !density_out->links.empty();
1418 const bool use_color = !color_out->links.empty();
1420 image_manager = compiler.image_manager;
1422 if(use_density || use_color) {
1424 bool is_float, is_linear;
1425 slot = image_manager->add_image(filename.string(), builtin_data,
1427 is_float, is_linear,
1434 compiler.stack_assign(vector_in);
1435 compiler.add_node(NODE_TEX_VOXEL,
1437 compiler.encode_uchar4(compiler.stack_assign(vector_in),
1438 compiler.stack_assign_if_linked(density_out),
1439 compiler.stack_assign_if_linked(color_out),
1441 if(space == NODE_TEX_VOXEL_SPACE_WORLD) {
1442 compiler.add_node(tfm.x);
1443 compiler.add_node(tfm.y);
1444 compiler.add_node(tfm.z);
1445 compiler.add_node(tfm.w);
1450 compiler.add_node(NODE_VALUE_F,
1451 __float_as_int(0.0f),
1452 compiler.stack_assign(density_out));
1455 compiler.add_node(NODE_VALUE_V, compiler.stack_assign(color_out));
1456 compiler.add_node(NODE_VALUE_V, make_float3(TEX_IMAGE_MISSING_R,
1457 TEX_IMAGE_MISSING_G,
1458 TEX_IMAGE_MISSING_B));
1464 void PointDensityTextureNode::compile(OSLCompiler& compiler)
1466 ShaderOutput *density_out = output("Density");
1467 ShaderOutput *color_out = output("Color");
1469 const bool use_density = !density_out->links.empty();
1470 const bool use_color = !color_out->links.empty();
1472 image_manager = compiler.image_manager;
1474 if(use_density || use_color) {
1476 bool is_float, is_linear;
1477 slot = image_manager->add_image(filename.string(), builtin_data,
1479 is_float, is_linear,
1486 compiler.parameter("filename", string_printf("@%d", slot).c_str());
1488 if(space == NODE_TEX_VOXEL_SPACE_WORLD) {
1489 compiler.parameter("mapping", transform_transpose(tfm));
1490 compiler.parameter("use_mapping", 1);
1492 compiler.parameter(this, "interpolation");
1493 compiler.add(this, "node_voxel_texture");
1499 NODE_DEFINE(NormalNode)
1501 NodeType* type = NodeType::add("normal", create, NodeType::SHADER);
1503 SOCKET_VECTOR(direction, "direction", make_float3(0.0f, 0.0f, 0.0f));
1505 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f));
1507 SOCKET_OUT_NORMAL(normal, "Normal");
1508 SOCKET_OUT_FLOAT(dot, "Dot");
1513 NormalNode::NormalNode()
1514 : ShaderNode(node_type)
1518 void NormalNode::compile(SVMCompiler& compiler)
1520 ShaderInput *normal_in = input("Normal");
1521 ShaderOutput *normal_out = output("Normal");
1522 ShaderOutput *dot_out = output("Dot");
1524 compiler.add_node(NODE_NORMAL,
1525 compiler.stack_assign(normal_in),
1526 compiler.stack_assign(normal_out),
1527 compiler.stack_assign(dot_out));
1529 __float_as_int(direction.x),
1530 __float_as_int(direction.y),
1531 __float_as_int(direction.z));
1534 void NormalNode::compile(OSLCompiler& compiler)
1536 compiler.parameter(this, "direction");
1537 compiler.add(this, "node_normal");
1542 NODE_DEFINE(MappingNode)
1544 NodeType* type = NodeType::add("mapping", create, NodeType::SHADER);
1546 TEXTURE_MAPPING_DEFINE(MappingNode);
1548 SOCKET_IN_POINT(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
1549 SOCKET_OUT_POINT(vector, "Vector");
1554 MappingNode::MappingNode()
1555 : ShaderNode(node_type)
1559 void MappingNode::compile(SVMCompiler& compiler)
1561 ShaderInput *vector_in = input("Vector");
1562 ShaderOutput *vector_out = output("Vector");
1564 tex_mapping.compile(compiler, compiler.stack_assign(vector_in), compiler.stack_assign(vector_out));
1567 void MappingNode::compile(OSLCompiler& compiler)
1569 Transform tfm = transform_transpose(tex_mapping.compute_transform());
1570 compiler.parameter("Matrix", tfm);
1571 compiler.parameter_point("mapping_min", tex_mapping.min);
1572 compiler.parameter_point("mapping_max", tex_mapping.max);
1573 compiler.parameter("use_minmax", tex_mapping.use_minmax);
1575 compiler.add(this, "node_mapping");
1580 NODE_DEFINE(RGBToBWNode)
1582 NodeType* type = NodeType::add("rgb_to_bw", create, NodeType::SHADER);
1584 SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
1585 SOCKET_OUT_FLOAT(val, "Val");
1590 RGBToBWNode::RGBToBWNode()
1591 : ShaderNode(node_type)
1595 void RGBToBWNode::constant_fold(const ConstantFolder& folder)
1597 if(folder.all_inputs_constant()) {
1598 folder.make_constant(linear_rgb_to_gray(color));
1602 void RGBToBWNode::compile(SVMCompiler& compiler)
1604 compiler.add_node(NODE_CONVERT,
1606 compiler.stack_assign(inputs[0]),
1607 compiler.stack_assign(outputs[0]));
1610 void RGBToBWNode::compile(OSLCompiler& compiler)
1612 compiler.add(this, "node_rgb_to_bw");
1617 const NodeType* ConvertNode::node_types[ConvertNode::MAX_TYPE][ConvertNode::MAX_TYPE];
1618 bool ConvertNode::initialized = ConvertNode::register_types();
1620 Node* ConvertNode::create(const NodeType *type)
1622 return new ConvertNode(type->inputs[0].type, type->outputs[0].type);
1625 bool ConvertNode::register_types()
1627 const int num_types = 8;
1628 SocketType::Type types[num_types] = {SocketType::FLOAT,
1635 SocketType::CLOSURE};
1637 for(size_t i = 0; i < num_types; i++) {
1638 SocketType::Type from = types[i];
1639 ustring from_name(SocketType::type_name(from));
1640 ustring from_value_name("value_" + from_name.string());
1642 for(size_t j = 0; j < num_types; j++) {
1643 SocketType::Type to = types[j];
1644 ustring to_name(SocketType::type_name(to));
1645 ustring to_value_name("value_" + to_name.string());
1647 string node_name = "convert_" + from_name.string() + "_to_" + to_name.string();
1648 NodeType* type = NodeType::add(node_name.c_str(), create, NodeType::SHADER);
1650 type->register_input(from_value_name, from_value_name, from,
1651 SOCKET_OFFSETOF(ConvertNode, value_float), SocketType::zero_default_value(),
1652 NULL, NULL, SocketType::LINKABLE);
1653 type->register_output(to_value_name, to_value_name, to);
1655 assert(from < MAX_TYPE);
1656 assert(to < MAX_TYPE);
1658 node_types[from][to] = type;
1665 ConvertNode::ConvertNode(SocketType::Type from_, SocketType::Type to_, bool autoconvert)
1666 : ShaderNode(node_types[from_][to_])
1672 special_type = SHADER_SPECIAL_TYPE_PROXY;
1673 else if(autoconvert)
1674 special_type = SHADER_SPECIAL_TYPE_AUTOCONVERT;
1677 void ConvertNode::constant_fold(const ConstantFolder& folder)
1679 /* proxy nodes should have been removed at this point */
1680 assert(special_type != SHADER_SPECIAL_TYPE_PROXY);
1682 /* TODO(DingTo): conversion from/to int is not supported yet, don't fold in that case */
1684 if(folder.all_inputs_constant()) {
1685 if(from == SocketType::FLOAT) {
1686 if(SocketType::is_float3(to)) {
1687 folder.make_constant(make_float3(value_float, value_float, value_float));
1690 else if(SocketType::is_float3(from)) {
1691 if(to == SocketType::FLOAT) {
1692 if(from == SocketType::COLOR) {
1693 /* color to float */
1694 folder.make_constant(linear_rgb_to_gray(value_color));
1697 /* vector/point/normal to float */
1698 folder.make_constant(average(value_vector));
1701 else if(SocketType::is_float3(to)) {
1702 folder.make_constant(value_color);
1707 ShaderInput *in = inputs[0];
1708 ShaderNode *prev = in->link->parent;
1710 /* no-op conversion of A to B to A */
1711 if(prev->type == node_types[to][from]) {
1712 ShaderInput *prev_in = prev->inputs[0];
1714 if(SocketType::is_float3(from) && (to == SocketType::FLOAT || SocketType::is_float3(to)) && prev_in->link) {
1715 folder.bypass(prev_in->link);
1721 void ConvertNode::compile(SVMCompiler& compiler)
1723 /* proxy nodes should have been removed at this point */
1724 assert(special_type != SHADER_SPECIAL_TYPE_PROXY);
1726 ShaderInput *in = inputs[0];
1727 ShaderOutput *out = outputs[0];
1729 if(from == SocketType::FLOAT) {
1730 if(to == SocketType::INT)
1732 compiler.add_node(NODE_CONVERT, NODE_CONVERT_FI, compiler.stack_assign(in), compiler.stack_assign(out));
1734 /* float to float3 */
1735 compiler.add_node(NODE_CONVERT, NODE_CONVERT_FV, compiler.stack_assign(in), compiler.stack_assign(out));
1737 else if(from == SocketType::INT) {
1738 if(to == SocketType::FLOAT)
1740 compiler.add_node(NODE_CONVERT, NODE_CONVERT_IF, compiler.stack_assign(in), compiler.stack_assign(out));
1742 /* int to vector/point/normal */
1743 compiler.add_node(NODE_CONVERT, NODE_CONVERT_IV, compiler.stack_assign(in), compiler.stack_assign(out));
1745 else if(to == SocketType::FLOAT) {
1746 if(from == SocketType::COLOR)
1747 /* color to float */
1748 compiler.add_node(NODE_CONVERT, NODE_CONVERT_CF, compiler.stack_assign(in), compiler.stack_assign(out));
1750 /* vector/point/normal to float */
1751 compiler.add_node(NODE_CONVERT, NODE_CONVERT_VF, compiler.stack_assign(in), compiler.stack_assign(out));
1753 else if(to == SocketType::INT) {
1754 if(from == SocketType::COLOR)
1756 compiler.add_node(NODE_CONVERT, NODE_CONVERT_CI, compiler.stack_assign(in), compiler.stack_assign(out));
1758 /* vector/point/normal to int */
1759 compiler.add_node(NODE_CONVERT, NODE_CONVERT_VI, compiler.stack_assign(in), compiler.stack_assign(out));
1762 /* float3 to float3 */
1765 compiler.stack_link(in, out);
1768 /* set 0,0,0 value */
1769 compiler.add_node(NODE_VALUE_V, compiler.stack_assign(out));
1770 compiler.add_node(NODE_VALUE_V, value_color);
1775 void ConvertNode::compile(OSLCompiler& compiler)
1777 /* proxy nodes should have been removed at this point */
1778 assert(special_type != SHADER_SPECIAL_TYPE_PROXY);
1780 if(from == SocketType::FLOAT)
1781 compiler.add(this, "node_convert_from_float");
1782 else if(from == SocketType::INT)
1783 compiler.add(this, "node_convert_from_int");
1784 else if(from == SocketType::COLOR)
1785 compiler.add(this, "node_convert_from_color");
1786 else if(from == SocketType::VECTOR)
1787 compiler.add(this, "node_convert_from_vector");
1788 else if(from == SocketType::POINT)
1789 compiler.add(this, "node_convert_from_point");
1790 else if(from == SocketType::NORMAL)
1791 compiler.add(this, "node_convert_from_normal");
1796 /* Base type for all closure-type nodes */
1798 BsdfBaseNode::BsdfBaseNode(const NodeType *node_type)
1799 : ShaderNode(node_type)
1801 special_type = SHADER_SPECIAL_TYPE_CLOSURE;
1804 bool BsdfBaseNode::has_bump()
1806 /* detect if anything is plugged into the normal input besides the default */
1807 ShaderInput *normal_in = input("Normal");
1808 return (normal_in && normal_in->link &&
1809 normal_in->link->parent->special_type != SHADER_SPECIAL_TYPE_GEOMETRY);
1814 BsdfNode::BsdfNode(const NodeType *node_type)
1815 : BsdfBaseNode(node_type)
1819 void BsdfNode::compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3, ShaderInput *param4)
1821 ShaderInput *color_in = input("Color");
1822 ShaderInput *normal_in = input("Normal");
1823 ShaderInput *tangent_in = input("Tangent");
1826 compiler.add_node(NODE_CLOSURE_WEIGHT, compiler.stack_assign(color_in));
1828 compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color);
1830 int normal_offset = (normal_in) ? compiler.stack_assign_if_linked(normal_in) : SVM_STACK_INVALID;
1831 int tangent_offset = (tangent_in) ? compiler.stack_assign_if_linked(tangent_in) : SVM_STACK_INVALID;
1832 int param3_offset = (param3) ? compiler.stack_assign(param3) : SVM_STACK_INVALID;
1833 int param4_offset = (param4) ? compiler.stack_assign(param4) : SVM_STACK_INVALID;
1835 compiler.add_node(NODE_CLOSURE_BSDF,
1836 compiler.encode_uchar4(closure,
1837 (param1)? compiler.stack_assign(param1): SVM_STACK_INVALID,
1838 (param2)? compiler.stack_assign(param2): SVM_STACK_INVALID,
1839 compiler.closure_mix_weight_offset()),
1840 __float_as_int((param1)? get_float(param1->socket_type): 0.0f),
1841 __float_as_int((param2)? get_float(param2->socket_type): 0.0f));
1843 compiler.add_node(normal_offset, tangent_offset, param3_offset, param4_offset);
1846 void BsdfNode::compile(SVMCompiler& compiler)
1848 compile(compiler, NULL, NULL);
1851 void BsdfNode::compile(OSLCompiler& /*compiler*/)
1856 /* Anisotropic BSDF Closure */
1858 NODE_DEFINE(AnisotropicBsdfNode)
1860 NodeType* type = NodeType::add("anisotropic_bsdf", create, NodeType::SHADER);
1862 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
1863 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
1864 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
1866 static NodeEnum distribution_enum;
1867 distribution_enum.insert("beckmann", CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID);
1868 distribution_enum.insert("GGX", CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID);
1869 distribution_enum.insert("Multiscatter GGX", CLOSURE_BSDF_MICROFACET_MULTI_GGX_ANISO_ID);
1870 distribution_enum.insert("ashikhmin_shirley", CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID);
1871 SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID);
1873 SOCKET_IN_VECTOR(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TANGENT);
1875 SOCKET_IN_FLOAT(roughness, "Roughness", 0.2f);
1876 SOCKET_IN_FLOAT(anisotropy, "Anisotropy", 0.5f);
1877 SOCKET_IN_FLOAT(rotation, "Rotation", 0.0f);
1879 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
1884 AnisotropicBsdfNode::AnisotropicBsdfNode()
1885 : BsdfNode(node_type)
1887 closure = CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID;
1890 void AnisotropicBsdfNode::attributes(Shader *shader, AttributeRequestSet *attributes)
1892 if(shader->has_surface) {
1893 ShaderInput *tangent_in = input("Tangent");
1895 if(!tangent_in->link)
1896 attributes->add(ATTR_STD_GENERATED);
1899 ShaderNode::attributes(shader, attributes);
1902 void AnisotropicBsdfNode::compile(SVMCompiler& compiler)
1904 closure = distribution;
1906 if(closure == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ANISO_ID)
1907 BsdfNode::compile(compiler, input("Roughness"), input("Anisotropy"), input("Rotation"), input("Color"));
1909 BsdfNode::compile(compiler, input("Roughness"), input("Anisotropy"), input("Rotation"));
1912 void AnisotropicBsdfNode::compile(OSLCompiler& compiler)
1914 compiler.parameter(this, "distribution");
1915 compiler.add(this, "node_anisotropic_bsdf");
1918 /* Glossy BSDF Closure */
1920 NODE_DEFINE(GlossyBsdfNode)
1922 NodeType* type = NodeType::add("glossy_bsdf", create, NodeType::SHADER);
1924 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
1925 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
1926 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
1928 static NodeEnum distribution_enum;
1929 distribution_enum.insert("sharp", CLOSURE_BSDF_REFLECTION_ID);
1930 distribution_enum.insert("beckmann", CLOSURE_BSDF_MICROFACET_BECKMANN_ID);
1931 distribution_enum.insert("GGX", CLOSURE_BSDF_MICROFACET_GGX_ID);
1932 distribution_enum.insert("ashikhmin_shirley", CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID);
1933 distribution_enum.insert("Multiscatter GGX", CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID);
1934 SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_GGX_ID);
1935 SOCKET_IN_FLOAT(roughness, "Roughness", 0.2f);
1937 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
1942 GlossyBsdfNode::GlossyBsdfNode()
1943 : BsdfNode(node_type)
1945 closure = CLOSURE_BSDF_MICROFACET_GGX_ID;
1946 distribution_orig = NBUILTIN_CLOSURES;
1949 void GlossyBsdfNode::simplify_settings(Scene *scene)
1951 if(distribution_orig == NBUILTIN_CLOSURES) {
1952 roughness_orig = roughness;
1953 distribution_orig = distribution;
1956 /* By default we use original values, so we don't worry about restoring
1957 * defaults later one and can only do override when needed.
1959 roughness = roughness_orig;
1960 distribution = distribution_orig;
1962 Integrator *integrator = scene->integrator;
1963 ShaderInput *roughness_input = input("Roughness");
1964 if(integrator->filter_glossy == 0.0f) {
1965 /* Fallback to Sharp closure for Roughness close to 0.
1966 * Note: Keep the epsilon in sync with kernel!
1968 if(!roughness_input->link && roughness <= 1e-4f) {
1969 VLOG(1) << "Using sharp glossy BSDF.";
1970 distribution = CLOSURE_BSDF_REFLECTION_ID;
1974 /* If filter glossy is used we replace Sharp glossy with GGX so we can
1975 * benefit from closure blur to remove unwanted noise.
1977 if(roughness_input->link == NULL &&
1978 distribution == CLOSURE_BSDF_REFLECTION_ID)
1980 VLOG(1) << "Using GGX glossy with filter glossy.";
1981 distribution = CLOSURE_BSDF_MICROFACET_GGX_ID;
1985 closure = distribution;
1988 bool GlossyBsdfNode::has_integrator_dependency()
1990 ShaderInput *roughness_input = input("Roughness");
1991 return !roughness_input->link &&
1992 (distribution == CLOSURE_BSDF_REFLECTION_ID || roughness <= 1e-4f);
1995 void GlossyBsdfNode::compile(SVMCompiler& compiler)
1997 closure = distribution;
1999 if(closure == CLOSURE_BSDF_REFLECTION_ID)
2000 BsdfNode::compile(compiler, NULL, NULL);
2001 else if(closure == CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID)
2002 BsdfNode::compile(compiler, input("Roughness"), NULL, input("Color"));
2004 BsdfNode::compile(compiler, input("Roughness"), NULL);
2007 void GlossyBsdfNode::compile(OSLCompiler& compiler)
2009 compiler.parameter(this, "distribution");
2010 compiler.add(this, "node_glossy_bsdf");
2013 /* Glass BSDF Closure */
2015 NODE_DEFINE(GlassBsdfNode)
2017 NodeType* type = NodeType::add("glass_bsdf", create, NodeType::SHADER);
2019 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2020 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2021 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2023 static NodeEnum distribution_enum;
2024 distribution_enum.insert("sharp", CLOSURE_BSDF_SHARP_GLASS_ID);
2025 distribution_enum.insert("beckmann", CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID);
2026 distribution_enum.insert("GGX", CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID);
2027 distribution_enum.insert("Multiscatter GGX", CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID);
2028 SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID);
2029 SOCKET_IN_FLOAT(roughness, "Roughness", 0.0f);
2030 SOCKET_IN_FLOAT(IOR, "IOR", 0.3f);
2032 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2037 GlassBsdfNode::GlassBsdfNode()
2038 : BsdfNode(node_type)
2040 closure = CLOSURE_BSDF_SHARP_GLASS_ID;
2041 distribution_orig = NBUILTIN_CLOSURES;
2044 void GlassBsdfNode::simplify_settings(Scene *scene)
2046 if(distribution_orig == NBUILTIN_CLOSURES) {
2047 roughness_orig = roughness;
2048 distribution_orig = distribution;
2051 /* By default we use original values, so we don't worry about restoring
2052 * defaults later one and can only do override when needed.
2054 roughness = roughness_orig;
2055 distribution = distribution_orig;
2057 Integrator *integrator = scene->integrator;
2058 ShaderInput *roughness_input = input("Roughness");
2059 if(integrator->filter_glossy == 0.0f) {
2060 /* Fallback to Sharp closure for Roughness close to 0.
2061 * Note: Keep the epsilon in sync with kernel!
2063 if(!roughness_input->link && roughness <= 1e-4f) {
2064 VLOG(1) << "Using sharp glass BSDF.";
2065 distribution = CLOSURE_BSDF_SHARP_GLASS_ID;
2069 /* If filter glossy is used we replace Sharp glossy with GGX so we can
2070 * benefit from closure blur to remove unwanted noise.
2072 if(roughness_input->link == NULL &&
2073 distribution == CLOSURE_BSDF_SHARP_GLASS_ID)
2075 VLOG(1) << "Using GGX glass with filter glossy.";
2076 distribution = CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID;
2080 closure = distribution;
2083 bool GlassBsdfNode::has_integrator_dependency()
2085 ShaderInput *roughness_input = input("Roughness");
2086 return !roughness_input->link &&
2087 (distribution == CLOSURE_BSDF_SHARP_GLASS_ID || roughness <= 1e-4f);
2090 void GlassBsdfNode::compile(SVMCompiler& compiler)
2092 closure = distribution;
2094 if(closure == CLOSURE_BSDF_SHARP_GLASS_ID)
2095 BsdfNode::compile(compiler, NULL, input("IOR"));
2096 else if(closure == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID)
2097 BsdfNode::compile(compiler, input("Roughness"), input("IOR"), input("Color"));
2099 BsdfNode::compile(compiler, input("Roughness"), input("IOR"));
2102 void GlassBsdfNode::compile(OSLCompiler& compiler)
2104 compiler.parameter(this, "distribution");
2105 compiler.add(this, "node_glass_bsdf");
2108 /* Refraction BSDF Closure */
2110 NODE_DEFINE(RefractionBsdfNode)
2112 NodeType* type = NodeType::add("refraction_bsdf", create, NodeType::SHADER);
2114 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2115 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2116 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2118 static NodeEnum distribution_enum;
2119 distribution_enum.insert("sharp", CLOSURE_BSDF_REFRACTION_ID);
2120 distribution_enum.insert("beckmann", CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID);
2121 distribution_enum.insert("GGX", CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID);
2122 SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID);
2124 SOCKET_IN_FLOAT(roughness, "Roughness", 0.0f);
2125 SOCKET_IN_FLOAT(IOR, "IOR", 0.3f);
2127 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2132 RefractionBsdfNode::RefractionBsdfNode()
2133 : BsdfNode(node_type)
2135 closure = CLOSURE_BSDF_REFRACTION_ID;
2136 distribution_orig = NBUILTIN_CLOSURES;
2139 void RefractionBsdfNode::simplify_settings(Scene *scene)
2141 if(distribution_orig == NBUILTIN_CLOSURES) {
2142 roughness_orig = roughness;
2143 distribution_orig = distribution;
2146 /* By default we use original values, so we don't worry about restoring
2147 * defaults later one and can only do override when needed.
2149 roughness = roughness_orig;
2150 distribution = distribution_orig;
2152 Integrator *integrator = scene->integrator;
2153 ShaderInput *roughness_input = input("Roughness");
2154 if(integrator->filter_glossy == 0.0f) {
2155 /* Fallback to Sharp closure for Roughness close to 0.
2156 * Note: Keep the epsilon in sync with kernel!
2158 if(!roughness_input->link && roughness <= 1e-4f) {
2159 VLOG(1) << "Using sharp refraction BSDF.";
2160 distribution = CLOSURE_BSDF_REFRACTION_ID;
2164 /* If filter glossy is used we replace Sharp glossy with GGX so we can
2165 * benefit from closure blur to remove unwanted noise.
2167 if(roughness_input->link == NULL &&
2168 distribution == CLOSURE_BSDF_REFRACTION_ID)
2170 VLOG(1) << "Using GGX refraction with filter glossy.";
2171 distribution = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
2175 closure = distribution;
2178 bool RefractionBsdfNode::has_integrator_dependency()
2180 ShaderInput *roughness_input = input("Roughness");
2181 return !roughness_input->link &&
2182 (distribution == CLOSURE_BSDF_REFRACTION_ID || roughness <= 1e-4f);
2185 void RefractionBsdfNode::compile(SVMCompiler& compiler)
2187 closure = distribution;
2189 if(closure == CLOSURE_BSDF_REFRACTION_ID)
2190 BsdfNode::compile(compiler, NULL, input("IOR"));
2192 BsdfNode::compile(compiler, input("Roughness"), input("IOR"));
2195 void RefractionBsdfNode::compile(OSLCompiler& compiler)
2197 compiler.parameter(this, "distribution");
2198 compiler.add(this, "node_refraction_bsdf");
2201 /* Toon BSDF Closure */
2203 NODE_DEFINE(ToonBsdfNode)
2205 NodeType* type = NodeType::add("toon_bsdf", create, NodeType::SHADER);
2207 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2208 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2209 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2211 static NodeEnum component_enum;
2212 component_enum.insert("diffuse", CLOSURE_BSDF_DIFFUSE_TOON_ID);
2213 component_enum.insert("glossy", CLOSURE_BSDF_GLOSSY_TOON_ID);
2214 SOCKET_ENUM(component, "Component", component_enum, CLOSURE_BSDF_DIFFUSE_TOON_ID);
2215 SOCKET_IN_FLOAT(size, "Size", 0.5f);
2216 SOCKET_IN_FLOAT(smooth, "Smooth", 0.0f);
2218 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2223 ToonBsdfNode::ToonBsdfNode()
2224 : BsdfNode(node_type)
2226 closure = CLOSURE_BSDF_DIFFUSE_TOON_ID;
2229 void ToonBsdfNode::compile(SVMCompiler& compiler)
2231 closure = component;
2233 BsdfNode::compile(compiler, input("Size"), input("Smooth"));
2236 void ToonBsdfNode::compile(OSLCompiler& compiler)
2238 compiler.parameter(this, "component");
2239 compiler.add(this, "node_toon_bsdf");
2242 /* Velvet BSDF Closure */
2244 NODE_DEFINE(VelvetBsdfNode)
2246 NodeType* type = NodeType::add("velvet_bsdf", create, NodeType::SHADER);
2248 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2249 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2250 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2251 SOCKET_IN_FLOAT(sigma, "Sigma", 1.0f);
2253 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2258 VelvetBsdfNode::VelvetBsdfNode()
2259 : BsdfNode(node_type)
2261 closure = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID;
2264 void VelvetBsdfNode::compile(SVMCompiler& compiler)
2266 BsdfNode::compile(compiler, input("Sigma"), NULL);
2269 void VelvetBsdfNode::compile(OSLCompiler& compiler)
2271 compiler.add(this, "node_velvet_bsdf");
2274 /* Diffuse BSDF Closure */
2276 NODE_DEFINE(DiffuseBsdfNode)
2278 NodeType* type = NodeType::add("diffuse_bsdf", create, NodeType::SHADER);
2280 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2281 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2282 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2283 SOCKET_IN_FLOAT(roughness, "Roughness", 0.0f);
2285 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2290 DiffuseBsdfNode::DiffuseBsdfNode()
2291 : BsdfNode(node_type)
2293 closure = CLOSURE_BSDF_DIFFUSE_ID;
2296 void DiffuseBsdfNode::compile(SVMCompiler& compiler)
2298 BsdfNode::compile(compiler, input("Roughness"), NULL);
2301 void DiffuseBsdfNode::compile(OSLCompiler& compiler)
2303 compiler.add(this, "node_diffuse_bsdf");
2306 /* Disney principled BSDF Closure */
2307 NODE_DEFINE(PrincipledBsdfNode)
2309 NodeType* type = NodeType::add("principled_bsdf", create, NodeType::SHADER);
2311 static NodeEnum distribution_enum;
2312 distribution_enum.insert("GGX", CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID);
2313 distribution_enum.insert("Multiscatter GGX", CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID);
2314 SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID);
2316 static NodeEnum subsurface_method_enum;
2317 subsurface_method_enum.insert("burley", CLOSURE_BSSRDF_PRINCIPLED_ID);
2318 subsurface_method_enum.insert("random_walk", CLOSURE_BSSRDF_PRINCIPLED_RANDOM_WALK_ID);
2319 SOCKET_ENUM(subsurface_method, "Subsurface Method", subsurface_method_enum, CLOSURE_BSSRDF_PRINCIPLED_ID);
2321 SOCKET_IN_COLOR(base_color, "Base Color", make_float3(0.8f, 0.8f, 0.8f));
2322 SOCKET_IN_COLOR(subsurface_color, "Subsurface Color", make_float3(0.8f, 0.8f, 0.8f));
2323 SOCKET_IN_FLOAT(metallic, "Metallic", 0.0f);
2324 SOCKET_IN_FLOAT(subsurface, "Subsurface", 0.0f);
2325 SOCKET_IN_VECTOR(subsurface_radius, "Subsurface Radius", make_float3(0.1f, 0.1f, 0.1f));
2326 SOCKET_IN_FLOAT(specular, "Specular", 0.0f);
2327 SOCKET_IN_FLOAT(roughness, "Roughness", 0.5f);
2328 SOCKET_IN_FLOAT(specular_tint, "Specular Tint", 0.0f);
2329 SOCKET_IN_FLOAT(anisotropic, "Anisotropic", 0.0f);
2330 SOCKET_IN_FLOAT(sheen, "Sheen", 0.0f);
2331 SOCKET_IN_FLOAT(sheen_tint, "Sheen Tint", 0.0f);
2332 SOCKET_IN_FLOAT(clearcoat, "Clearcoat", 0.0f);
2333 SOCKET_IN_FLOAT(clearcoat_roughness, "Clearcoat Roughness", 0.03f);
2334 SOCKET_IN_FLOAT(ior, "IOR", 0.0f);
2335 SOCKET_IN_FLOAT(transmission, "Transmission", 0.0f);
2336 SOCKET_IN_FLOAT(transmission_roughness, "Transmission Roughness", 0.0f);
2337 SOCKET_IN_FLOAT(anisotropic_rotation, "Anisotropic Rotation", 0.0f);
2338 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2339 SOCKET_IN_NORMAL(clearcoat_normal, "Clearcoat Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2340 SOCKET_IN_NORMAL(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_TANGENT);
2341 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2343 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2348 PrincipledBsdfNode::PrincipledBsdfNode()
2349 : BsdfBaseNode(node_type)
2351 closure = CLOSURE_BSDF_PRINCIPLED_ID;
2352 distribution = CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID;
2353 distribution_orig = NBUILTIN_CLOSURES;
2356 bool PrincipledBsdfNode::has_surface_bssrdf()
2358 ShaderInput *subsurface_in = input("Subsurface");
2359 return (subsurface_in->link != NULL || subsurface > CLOSURE_WEIGHT_CUTOFF);
2362 void PrincipledBsdfNode::attributes(Shader *shader, AttributeRequestSet *attributes)
2364 if(shader->has_surface) {
2365 ShaderInput *tangent_in = input("Tangent");
2367 if(!tangent_in->link)
2368 attributes->add(ATTR_STD_GENERATED);
2371 ShaderNode::attributes(shader, attributes);
2374 void PrincipledBsdfNode::compile(SVMCompiler& compiler, ShaderInput *p_metallic, ShaderInput *p_subsurface, ShaderInput *p_subsurface_radius,
2375 ShaderInput *p_specular, ShaderInput *p_roughness, ShaderInput *p_specular_tint, ShaderInput *p_anisotropic,
2376 ShaderInput *p_sheen, ShaderInput *p_sheen_tint, ShaderInput *p_clearcoat, ShaderInput *p_clearcoat_roughness,
2377 ShaderInput *p_ior, ShaderInput *p_transmission, ShaderInput *p_anisotropic_rotation, ShaderInput *p_transmission_roughness)
2379 ShaderInput *base_color_in = input("Base Color");
2380 ShaderInput *subsurface_color_in = input("Subsurface Color");
2381 ShaderInput *normal_in = input("Normal");
2382 ShaderInput *clearcoat_normal_in = input("Clearcoat Normal");
2383 ShaderInput *tangent_in = input("Tangent");
2385 float3 weight = make_float3(1.0f, 1.0f, 1.0f);
2387 compiler.add_node(NODE_CLOSURE_SET_WEIGHT, weight);
2389 int normal_offset = compiler.stack_assign_if_linked(normal_in);
2390 int clearcoat_normal_offset = compiler.stack_assign_if_linked(clearcoat_normal_in);
2391 int tangent_offset = compiler.stack_assign_if_linked(tangent_in);
2392 int specular_offset = compiler.stack_assign(p_specular);
2393 int roughness_offset = compiler.stack_assign(p_roughness);
2394 int specular_tint_offset = compiler.stack_assign(p_specular_tint);
2395 int anisotropic_offset = compiler.stack_assign(p_anisotropic);
2396 int sheen_offset = compiler.stack_assign(p_sheen);
2397 int sheen_tint_offset = compiler.stack_assign(p_sheen_tint);
2398 int clearcoat_offset = compiler.stack_assign(p_clearcoat);
2399 int clearcoat_roughness_offset = compiler.stack_assign(p_clearcoat_roughness);
2400 int ior_offset = compiler.stack_assign(p_ior);
2401 int transmission_offset = compiler.stack_assign(p_transmission);
2402 int transmission_roughness_offset = compiler.stack_assign(p_transmission_roughness);
2403 int anisotropic_rotation_offset = compiler.stack_assign(p_anisotropic_rotation);
2404 int subsurface_radius_offset = compiler.stack_assign(p_subsurface_radius);
2406 compiler.add_node(NODE_CLOSURE_BSDF,
2407 compiler.encode_uchar4(closure,
2408 compiler.stack_assign(p_metallic),
2409 compiler.stack_assign(p_subsurface),
2410 compiler.closure_mix_weight_offset()),
2411 __float_as_int((p_metallic) ? get_float(p_metallic->socket_type) : 0.0f),
2412 __float_as_int((p_subsurface) ? get_float(p_subsurface->socket_type) : 0.0f));
2414 compiler.add_node(normal_offset, tangent_offset,
2415 compiler.encode_uchar4(specular_offset, roughness_offset, specular_tint_offset, anisotropic_offset),
2416 compiler.encode_uchar4(sheen_offset, sheen_tint_offset, clearcoat_offset, clearcoat_roughness_offset));
2418 compiler.add_node(compiler.encode_uchar4(ior_offset, transmission_offset, anisotropic_rotation_offset, transmission_roughness_offset),
2419 distribution, subsurface_method, SVM_STACK_INVALID);
2421 float3 bc_default = get_float3(base_color_in->socket_type);
2423 compiler.add_node(((base_color_in->link) ? compiler.stack_assign(base_color_in) : SVM_STACK_INVALID),
2424 __float_as_int(bc_default.x), __float_as_int(bc_default.y), __float_as_int(bc_default.z));
2426 compiler.add_node(clearcoat_normal_offset, subsurface_radius_offset, SVM_STACK_INVALID, SVM_STACK_INVALID);
2428 float3 ss_default = get_float3(subsurface_color_in->socket_type);
2430 compiler.add_node(((subsurface_color_in->link) ? compiler.stack_assign(subsurface_color_in) : SVM_STACK_INVALID),
2431 __float_as_int(ss_default.x), __float_as_int(ss_default.y), __float_as_int(ss_default.z));
2434 bool PrincipledBsdfNode::has_integrator_dependency()
2436 ShaderInput *roughness_input = input("Roughness");
2437 return !roughness_input->link && roughness <= 1e-4f;
2440 void PrincipledBsdfNode::compile(SVMCompiler& compiler)
2442 compile(compiler, input("Metallic"), input("Subsurface"), input("Subsurface Radius"), input("Specular"),
2443 input("Roughness"), input("Specular Tint"), input("Anisotropic"), input("Sheen"), input("Sheen Tint"),
2444 input("Clearcoat"), input("Clearcoat Roughness"), input("IOR"), input("Transmission"),
2445 input("Anisotropic Rotation"), input("Transmission Roughness"));
2448 void PrincipledBsdfNode::compile(OSLCompiler& compiler)
2450 compiler.parameter(this, "distribution");
2451 compiler.parameter(this, "subsurface_method");
2452 compiler.add(this, "node_principled_bsdf");
2455 bool PrincipledBsdfNode::has_bssrdf_bump()
2457 return has_surface_bssrdf() && has_bump();
2460 /* Translucent BSDF Closure */
2462 NODE_DEFINE(TranslucentBsdfNode)
2464 NodeType* type = NodeType::add("translucent_bsdf", create, NodeType::SHADER);
2466 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2467 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2468 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2470 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2475 TranslucentBsdfNode::TranslucentBsdfNode()
2476 : BsdfNode(node_type)
2478 closure = CLOSURE_BSDF_TRANSLUCENT_ID;
2481 void TranslucentBsdfNode::compile(SVMCompiler& compiler)
2483 BsdfNode::compile(compiler, NULL, NULL);
2486 void TranslucentBsdfNode::compile(OSLCompiler& compiler)
2488 compiler.add(this, "node_translucent_bsdf");
2491 /* Transparent BSDF Closure */
2493 NODE_DEFINE(TransparentBsdfNode)
2495 NodeType* type = NodeType::add("transparent_bsdf", create, NodeType::SHADER);
2497 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2498 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2500 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2505 TransparentBsdfNode::TransparentBsdfNode()
2506 : BsdfNode(node_type)
2508 closure = CLOSURE_BSDF_TRANSPARENT_ID;
2511 void TransparentBsdfNode::compile(SVMCompiler& compiler)
2513 BsdfNode::compile(compiler, NULL, NULL);
2516 void TransparentBsdfNode::compile(OSLCompiler& compiler)
2518 compiler.add(this, "node_transparent_bsdf");
2521 /* Subsurface Scattering Closure */
2523 NODE_DEFINE(SubsurfaceScatteringNode)
2525 NodeType* type = NodeType::add("subsurface_scattering", create, NodeType::SHADER);
2527 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2528 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2529 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2531 static NodeEnum falloff_enum;
2532 falloff_enum.insert("cubic", CLOSURE_BSSRDF_CUBIC_ID);
2533 falloff_enum.insert("gaussian", CLOSURE_BSSRDF_GAUSSIAN_ID);
2534 falloff_enum.insert("burley", CLOSURE_BSSRDF_BURLEY_ID);
2535 falloff_enum.insert("random_walk", CLOSURE_BSSRDF_RANDOM_WALK_ID);
2536 SOCKET_ENUM(falloff, "Falloff", falloff_enum, CLOSURE_BSSRDF_BURLEY_ID);
2537 SOCKET_IN_FLOAT(scale, "Scale", 0.01f);
2538 SOCKET_IN_VECTOR(radius, "Radius", make_float3(0.1f, 0.1f, 0.1f));
2539 SOCKET_IN_FLOAT(sharpness, "Sharpness", 0.0f);
2540 SOCKET_IN_FLOAT(texture_blur, "Texture Blur", 1.0f);
2542 SOCKET_OUT_CLOSURE(BSSRDF, "BSSRDF");
2547 SubsurfaceScatteringNode::SubsurfaceScatteringNode()
2548 : BsdfNode(node_type)
2553 void SubsurfaceScatteringNode::compile(SVMCompiler& compiler)
2556 BsdfNode::compile(compiler, input("Scale"), input("Texture Blur"), input("Radius"), input("Sharpness"));
2559 void SubsurfaceScatteringNode::compile(OSLCompiler& compiler)
2562 compiler.parameter(this, "falloff");
2563 compiler.add(this, "node_subsurface_scattering");
2566 bool SubsurfaceScatteringNode::has_bssrdf_bump()
2568 /* detect if anything is plugged into the normal input besides the default */
2569 ShaderInput *normal_in = input("Normal");
2570 return (normal_in->link && normal_in->link->parent->special_type != SHADER_SPECIAL_TYPE_GEOMETRY);
2573 /* Emissive Closure */
2575 NODE_DEFINE(EmissionNode)
2577 NodeType* type = NodeType::add("emission", create, NodeType::SHADER);
2579 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2580 SOCKET_IN_FLOAT(strength, "Strength", 10.0f);
2581 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2583 SOCKET_OUT_CLOSURE(emission, "Emission");
2588 EmissionNode::EmissionNode()
2589 : ShaderNode(node_type)
2593 void EmissionNode::compile(SVMCompiler& compiler)
2595 ShaderInput *color_in = input("Color");
2596 ShaderInput *strength_in = input("Strength");
2598 if(color_in->link || strength_in->link) {
2599 compiler.add_node(NODE_EMISSION_WEIGHT,
2600 compiler.stack_assign(color_in),
2601 compiler.stack_assign(strength_in));
2604 compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color * strength);
2606 compiler.add_node(NODE_CLOSURE_EMISSION, compiler.closure_mix_weight_offset());
2609 void EmissionNode::compile(OSLCompiler& compiler)
2611 compiler.add(this, "node_emission");
2614 void EmissionNode::constant_fold(const ConstantFolder& folder)
2616 ShaderInput *color_in = input("Color");
2617 ShaderInput *strength_in = input("Strength");
2619 if((!color_in->link && color == make_float3(0.0f, 0.0f, 0.0f)) ||
2620 (!strength_in->link && strength == 0.0f))
2626 /* Background Closure */
2628 NODE_DEFINE(BackgroundNode)
2630 NodeType* type = NodeType::add("background_shader", create, NodeType::SHADER);
2632 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2633 SOCKET_IN_FLOAT(strength, "Strength", 1.0f);
2634 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2636 SOCKET_OUT_CLOSURE(background, "Background");
2641 BackgroundNode::BackgroundNode()
2642 : ShaderNode(node_type)
2646 void BackgroundNode::compile(SVMCompiler& compiler)
2648 ShaderInput *color_in = input("Color");
2649 ShaderInput *strength_in = input("Strength");
2651 if(color_in->link || strength_in->link) {
2652 compiler.add_node(NODE_EMISSION_WEIGHT,
2653 compiler.stack_assign(color_in),
2654 compiler.stack_assign(strength_in));
2657 compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color*strength);
2659 compiler.add_node(NODE_CLOSURE_BACKGROUND, compiler.closure_mix_weight_offset());
2662 void BackgroundNode::compile(OSLCompiler& compiler)
2664 compiler.add(this, "node_background");
2667 void BackgroundNode::constant_fold(const ConstantFolder& folder)
2669 ShaderInput *color_in = input("Color");
2670 ShaderInput *strength_in = input("Strength");
2672 if((!color_in->link && color == make_float3(0.0f, 0.0f, 0.0f)) ||
2673 (!strength_in->link && strength == 0.0f))
2679 /* Holdout Closure */
2681 NODE_DEFINE(HoldoutNode)
2683 NodeType* type = NodeType::add("holdout", create, NodeType::SHADER);
2685 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2686 SOCKET_IN_FLOAT(volume_mix_weight, "VolumeMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2688 SOCKET_OUT_CLOSURE(holdout, "Holdout");
2693 HoldoutNode::HoldoutNode()
2694 : ShaderNode(node_type)
2698 void HoldoutNode::compile(SVMCompiler& compiler)
2700 float3 value = make_float3(1.0f, 1.0f, 1.0f);
2702 compiler.add_node(NODE_CLOSURE_SET_WEIGHT, value);
2703 compiler.add_node(NODE_CLOSURE_HOLDOUT, compiler.closure_mix_weight_offset());
2706 void HoldoutNode::compile(OSLCompiler& compiler)
2708 compiler.add(this, "node_holdout");
2711 /* Ambient Occlusion */
2713 NODE_DEFINE(AmbientOcclusionNode)
2715 NodeType* type = NodeType::add("ambient_occlusion", create, NodeType::SHADER);
2717 SOCKET_IN_NORMAL(normal_osl, "NormalIn", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
2718 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2719 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2721 SOCKET_OUT_CLOSURE(AO, "AO");
2726 AmbientOcclusionNode::AmbientOcclusionNode()
2727 : ShaderNode(node_type)
2731 void AmbientOcclusionNode::compile(SVMCompiler& compiler)
2733 ShaderInput *color_in = input("Color");
2736 compiler.add_node(NODE_CLOSURE_WEIGHT, compiler.stack_assign(color_in));
2738 compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color);
2740 compiler.add_node(NODE_CLOSURE_AMBIENT_OCCLUSION, compiler.closure_mix_weight_offset());
2743 void AmbientOcclusionNode::compile(OSLCompiler& compiler)
2745 compiler.add(this, "node_ambient_occlusion");
2748 /* Volume Closure */
2750 VolumeNode::VolumeNode(const NodeType *node_type)
2751 : ShaderNode(node_type)
2753 closure = CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID;
2756 void VolumeNode::compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2)
2758 ShaderInput *color_in = input("Color");
2761 compiler.add_node(NODE_CLOSURE_WEIGHT, compiler.stack_assign(color_in));
2763 compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color);
2765 compiler.add_node(NODE_CLOSURE_VOLUME,
2766 compiler.encode_uchar4(closure,
2767 (param1)? compiler.stack_assign(param1): SVM_STACK_INVALID,
2768 (param2)? compiler.stack_assign(param2): SVM_STACK_INVALID,
2769 compiler.closure_mix_weight_offset()),
2770 __float_as_int((param1)? get_float(param1->socket_type): 0.0f),
2771 __float_as_int((param2)? get_float(param2->socket_type): 0.0f));
2774 void VolumeNode::compile(SVMCompiler& compiler)
2776 compile(compiler, NULL, NULL);
2779 void VolumeNode::compile(OSLCompiler& /*compiler*/)
2784 /* Absorption Volume Closure */
2786 NODE_DEFINE(AbsorptionVolumeNode)
2788 NodeType* type = NodeType::add("absorption_volume", create, NodeType::SHADER);
2790 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2791 SOCKET_IN_FLOAT(density, "Density", 1.0f);
2792 SOCKET_IN_FLOAT(volume_mix_weight, "VolumeMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2794 SOCKET_OUT_CLOSURE(volume, "Volume");
2799 AbsorptionVolumeNode::AbsorptionVolumeNode()
2800 : VolumeNode(node_type)
2802 closure = CLOSURE_VOLUME_ABSORPTION_ID;
2805 void AbsorptionVolumeNode::compile(SVMCompiler& compiler)
2807 VolumeNode::compile(compiler, input("Density"), NULL);
2810 void AbsorptionVolumeNode::compile(OSLCompiler& compiler)
2812 compiler.add(this, "node_absorption_volume");
2815 /* Scatter Volume Closure */
2817 NODE_DEFINE(ScatterVolumeNode)
2819 NodeType* type = NodeType::add("scatter_volume", create, NodeType::SHADER);
2821 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2822 SOCKET_IN_FLOAT(density, "Density", 1.0f);
2823 SOCKET_IN_FLOAT(anisotropy, "Anisotropy", 0.0f);
2824 SOCKET_IN_FLOAT(volume_mix_weight, "VolumeMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2826 SOCKET_OUT_CLOSURE(volume, "Volume");
2831 ScatterVolumeNode::ScatterVolumeNode()
2832 : VolumeNode(node_type)
2834 closure = CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID;
2837 void ScatterVolumeNode::compile(SVMCompiler& compiler)
2839 VolumeNode::compile(compiler, input("Density"), input("Anisotropy"));
2842 void ScatterVolumeNode::compile(OSLCompiler& compiler)
2844 compiler.add(this, "node_scatter_volume");
2847 /* Hair BSDF Closure */
2849 NODE_DEFINE(HairBsdfNode)
2851 NodeType* type = NodeType::add("hair_bsdf", create, NodeType::SHADER);
2853 SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
2854 SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
2855 SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
2857 static NodeEnum component_enum;
2858 component_enum.insert("reflection", CLOSURE_BSDF_HAIR_REFLECTION_ID);
2859 component_enum.insert("transmission", CLOSURE_BSDF_HAIR_TRANSMISSION_ID);
2860 SOCKET_ENUM(component, "Component", component_enum, CLOSURE_BSDF_HAIR_REFLECTION_ID);
2861 SOCKET_IN_FLOAT(offset, "Offset", 0.0f);
2862 SOCKET_IN_FLOAT(roughness_u, "RoughnessU", 0.2f);
2863 SOCKET_IN_FLOAT(roughness_v, "RoughnessV", 0.2f);
2864 SOCKET_IN_VECTOR(tangent, "Tangent", make_float3(0.0f, 0.0f, 0.0f));
2866 SOCKET_OUT_CLOSURE(BSDF, "BSDF");
2871 HairBsdfNode::HairBsdfNode()
2872 : BsdfNode(node_type)
2874 closure = CLOSURE_BSDF_HAIR_REFLECTION_ID;
2877 void HairBsdfNode::compile(SVMCompiler& compiler)
2879 closure = component;
2881 BsdfNode::compile(compiler, input("RoughnessU"), input("RoughnessV"), input("Offset"));
2884 void HairBsdfNode::compile(OSLCompiler& compiler)
2886 compiler.parameter(this, "component");
2887 compiler.add(this, "node_hair_bsdf");
2892 NODE_DEFINE(GeometryNode)
2894 NodeType* type = NodeType::add("geometry", create, NodeType::SHADER);
2896 SOCKET_IN_NORMAL(normal_osl, "NormalIn", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
2898 SOCKET_OUT_POINT(position, "Position");
2899 SOCKET_OUT_NORMAL(normal, "Normal");
2900 SOCKET_OUT_NORMAL(tangent, "Tangent");
2901 SOCKET_OUT_NORMAL(true_normal, "True Normal");
2902 SOCKET_OUT_VECTOR(incoming, "Incoming");
2903 SOCKET_OUT_POINT(parametric, "Parametric");
2904 SOCKET_OUT_FLOAT(backfacing, "Backfacing");
2905 SOCKET_OUT_FLOAT(pointiness, "Pointiness");
2910 GeometryNode::GeometryNode()
2911 : ShaderNode(node_type)
2913 special_type = SHADER_SPECIAL_TYPE_GEOMETRY;
2916 void GeometryNode::attributes(Shader *shader, AttributeRequestSet *attributes)
2918 if(shader->has_surface) {
2919 if(!output("Tangent")->links.empty()) {
2920 attributes->add(ATTR_STD_GENERATED);
2922 if(!output("Pointiness")->links.empty()) {
2923 attributes->add(ATTR_STD_POINTINESS);
2927 ShaderNode::attributes(shader, attributes);
2930 void GeometryNode::compile(SVMCompiler& compiler)
2933 ShaderNodeType geom_node = NODE_GEOMETRY;
2934 ShaderNodeType attr_node = NODE_ATTR;
2936 if(bump == SHADER_BUMP_DX) {
2937 geom_node = NODE_GEOMETRY_BUMP_DX;
2938 attr_node = NODE_ATTR_BUMP_DX;
2940 else if(bump == SHADER_BUMP_DY) {
2941 geom_node = NODE_GEOMETRY_BUMP_DY;
2942 attr_node = NODE_ATTR_BUMP_DY;
2945 out = output("Position");
2946 if(!out->links.empty()) {
2947 compiler.add_node(geom_node, NODE_GEOM_P, compiler.stack_assign(out));
2950 out = output("Normal");
2951 if(!out->links.empty()) {
2952 compiler.add_node(geom_node, NODE_GEOM_N, compiler.stack_assign(out));
2955 out = output("Tangent");
2956 if(!out->links.empty()) {
2957 compiler.add_node(geom_node, NODE_GEOM_T, compiler.stack_assign(out));
2960 out = output("True Normal");
2961 if(!out->links.empty()) {
2962 compiler.add_node(geom_node, NODE_GEOM_Ng, compiler.stack_assign(out));
2965 out = output("Incoming");
2966 if(!out->links.empty()) {
2967 compiler.add_node(geom_node, NODE_GEOM_I, compiler.stack_assign(out));
2970 out = output("Parametric");
2971 if(!out->links.empty()) {
2972 compiler.add_node(geom_node, NODE_GEOM_uv, compiler.stack_assign(out));
2975 out = output("Backfacing");
2976 if(!out->links.empty()) {
2977 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_backfacing, compiler.stack_assign(out));
2980 out = output("Pointiness");
2981 if(!out->links.empty()) {
2982 if(compiler.output_type() != SHADER_TYPE_VOLUME) {
2983 compiler.add_node(attr_node,
2984 ATTR_STD_POINTINESS,
2985 compiler.stack_assign(out),
2989 compiler.add_node(NODE_VALUE_F, __float_as_int(0.0f), compiler.stack_assign(out));
2994 void GeometryNode::compile(OSLCompiler& compiler)
2996 if(bump == SHADER_BUMP_DX)
2997 compiler.parameter("bump_offset", "dx");
2998 else if(bump == SHADER_BUMP_DY)
2999 compiler.parameter("bump_offset", "dy");
3001 compiler.parameter("bump_offset", "center");
3003 compiler.add(this, "node_geometry");
3006 /* TextureCoordinate */
3008 NODE_DEFINE(TextureCoordinateNode)
3010 NodeType* type = NodeType::add("texture_coordinate", create, NodeType::SHADER);
3012 SOCKET_BOOLEAN(from_dupli, "From Dupli", false);
3013 SOCKET_BOOLEAN(use_transform, "Use Transform", false);
3014 SOCKET_TRANSFORM(ob_tfm, "Object Transform", transform_identity());
3016 SOCKET_IN_NORMAL(normal_osl, "NormalIn", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
3018 SOCKET_OUT_POINT(generated, "Generated");
3019 SOCKET_OUT_NORMAL(normal, "Normal");
3020 SOCKET_OUT_POINT(UV, "UV");
3021 SOCKET_OUT_POINT(object, "Object");
3022 SOCKET_OUT_POINT(camera, "Camera");
3023 SOCKET_OUT_POINT(window, "Window");
3024 SOCKET_OUT_NORMAL(reflection, "Reflection");
3029 TextureCoordinateNode::TextureCoordinateNode()
3030 : ShaderNode(node_type)
3034 void TextureCoordinateNode::attributes(Shader *shader, AttributeRequestSet *attributes)
3036 if(shader->has_surface) {
3038 if(!output("Generated")->links.empty())
3039 attributes->add(ATTR_STD_GENERATED);
3040 if(!output("UV")->links.empty())
3041 attributes->add(ATTR_STD_UV);
3045 if(shader->has_volume) {
3047 if(!output("Generated")->links.empty()) {
3048 attributes->add(ATTR_STD_GENERATED_TRANSFORM);
3053 ShaderNode::attributes(shader, attributes);
3056 void TextureCoordinateNode::compile(SVMCompiler& compiler)
3059 ShaderNodeType texco_node = NODE_TEX_COORD;
3060 ShaderNodeType attr_node = NODE_ATTR;
3061 ShaderNodeType geom_node = NODE_GEOMETRY;
3063 if(bump == SHADER_BUMP_DX) {
3064 texco_node = NODE_TEX_COORD_BUMP_DX;
3065 attr_node = NODE_ATTR_BUMP_DX;
3066 geom_node = NODE_GEOMETRY_BUMP_DX;
3068 else if(bump == SHADER_BUMP_DY) {
3069 texco_node = NODE_TEX_COORD_BUMP_DY;
3070 attr_node = NODE_ATTR_BUMP_DY;
3071 geom_node = NODE_GEOMETRY_BUMP_DY;
3074 out = output("Generated");
3075 if(!out->links.empty()) {
3076 if(compiler.background) {
3077 compiler.add_node(geom_node, NODE_GEOM_P, compiler.stack_assign(out));
3081 compiler.add_node(texco_node, NODE_TEXCO_DUPLI_GENERATED, compiler.stack_assign(out));
3083 else if(compiler.output_type() == SHADER_TYPE_VOLUME) {
3084 compiler.add_node(texco_node, NODE_TEXCO_VOLUME_GENERATED, compiler.stack_assign(out));
3087 int attr = compiler.attribute(ATTR_STD_GENERATED);
3088 compiler.add_node(attr_node, attr, compiler.stack_assign(out), NODE_ATTR_FLOAT3);
3093 out = output("Normal");
3094 if(!out->links.empty()) {
3095 compiler.add_node(texco_node, NODE_TEXCO_NORMAL, compiler.stack_assign(out));
3099 if(!out->links.empty()) {
3101 compiler.add_node(texco_node, NODE_TEXCO_DUPLI_UV, compiler.stack_assign(out));
3104 int attr = compiler.attribute(ATTR_STD_UV);
3105 compiler.add_node(attr_node, attr, compiler.stack_assign(out), NODE_ATTR_FLOAT3);
3109 out = output("Object");
3110 if(!out->links.empty()) {
3111 compiler.add_node(texco_node, NODE_TEXCO_OBJECT, compiler.stack_assign(out), use_transform);
3113 Transform ob_itfm = transform_inverse(ob_tfm);
3114 compiler.add_node(ob_itfm.x);
3115 compiler.add_node(ob_itfm.y);
3116 compiler.add_node(ob_itfm.z);
3117 compiler.add_node(ob_itfm.w);
3121 out = output("Camera");
3122 if(!out->links.empty()) {
3123 compiler.add_node(texco_node, NODE_TEXCO_CAMERA, compiler.stack_assign(out));
3126 out = output("Window");
3127 if(!out->links.empty()) {
3128 compiler.add_node(texco_node, NODE_TEXCO_WINDOW, compiler.stack_assign(out));
3131 out = output("Reflection");
3132 if(!out->links.empty()) {
3133 if(compiler.background) {
3134 compiler.add_node(geom_node, NODE_GEOM_I, compiler.stack_assign(out));
3137 compiler.add_node(texco_node, NODE_TEXCO_REFLECTION, compiler.stack_assign(out));
3142 void TextureCoordinateNode::compile(OSLCompiler& compiler)
3144 if(bump == SHADER_BUMP_DX)
3145 compiler.parameter("bump_offset", "dx");
3146 else if(bump == SHADER_BUMP_DY)
3147 compiler.parameter("bump_offset", "dy");
3149 compiler.parameter("bump_offset", "center");
3151 if(compiler.background)
3152 compiler.parameter("is_background", true);
3153 if(compiler.output_type() == SHADER_TYPE_VOLUME)
3154 compiler.parameter("is_volume", true);
3155 compiler.parameter(this, "use_transform");
3156 Transform ob_itfm = transform_transpose(transform_inverse(ob_tfm));
3157 compiler.parameter("object_itfm", ob_itfm);
3159 compiler.parameter(this, "from_dupli");
3161 compiler.add(this, "node_texture_coordinate");
3166 NODE_DEFINE(UVMapNode)
3168 NodeType* type = NodeType::add("uvmap", create, NodeType::SHADER);
3170 SOCKET_IN_STRING(attribute, "attribute", ustring(""));
3171 SOCKET_IN_BOOLEAN(from_dupli, "from dupli", false);
3173 SOCKET_OUT_POINT(UV, "UV");
3178 UVMapNode::UVMapNode()
3179 : ShaderNode(node_type)
3183 void UVMapNode::attributes(Shader *shader, AttributeRequestSet *attributes)
3185 if(shader->has_surface) {
3187 if(!output("UV")->links.empty()) {
3189 attributes->add(attribute);
3191 attributes->add(ATTR_STD_UV);
3196 ShaderNode::attributes(shader, attributes);
3199 void UVMapNode::compile(SVMCompiler& compiler)
3201 ShaderOutput *out = output("UV");
3202 ShaderNodeType texco_node = NODE_TEX_COORD;
3203 ShaderNodeType attr_node = NODE_ATTR;
3206 if(bump == SHADER_BUMP_DX) {
3207 texco_node = NODE_TEX_COORD_BUMP_DX;
3208 attr_node = NODE_ATTR_BUMP_DX;
3210 else if(bump == SHADER_BUMP_DY) {
3211 texco_node = NODE_TEX_COORD_BUMP_DY;
3212 attr_node = NODE_ATTR_BUMP_DY;
3215 if(!out->links.empty()) {
3217 compiler.add_node(texco_node, NODE_TEXCO_DUPLI_UV, compiler.stack_assign(out));
3221 attr = compiler.attribute(attribute);
3223 attr = compiler.attribute(ATTR_STD_UV);
3225 compiler.add_node(attr_node, attr, compiler.stack_assign(out), NODE_ATTR_FLOAT3);
3230 void UVMapNode::compile(OSLCompiler& compiler)
3232 if(bump == SHADER_BUMP_DX)
3233 compiler.parameter("bump_offset", "dx");
3234 else if(bump == SHADER_BUMP_DY)
3235 compiler.parameter("bump_offset", "dy");
3237 compiler.parameter("bump_offset", "center");
3239 compiler.parameter(this, "from_dupli");
3240 compiler.parameter(this, "attribute");
3241 compiler.add(this, "node_uv_map");
3246 NODE_DEFINE(LightPathNode)
3248 NodeType* type = NodeType::add("light_path", create, NodeType::SHADER);
3250 SOCKET_OUT_FLOAT(is_camera_ray, "Is Camera Ray");
3251 SOCKET_OUT_FLOAT(is_shadow_ray, "Is Shadow Ray");
3252 SOCKET_OUT_FLOAT(is_diffuse_ray, "Is Diffuse Ray");
3253 SOCKET_OUT_FLOAT(is_glossy_ray, "Is Glossy Ray");
3254 SOCKET_OUT_FLOAT(is_singular_ray, "Is Singular Ray");
3255 SOCKET_OUT_FLOAT(is_reflection_ray, "Is Reflection Ray");
3256 SOCKET_OUT_FLOAT(is_transmission_ray, "Is Transmission Ray");
3257 SOCKET_OUT_FLOAT(is_volume_scatter_ray, "Is Volume Scatter Ray");
3258 SOCKET_OUT_FLOAT(ray_length, "Ray Length");
3259 SOCKET_OUT_FLOAT(ray_depth, "Ray Depth");
3260 SOCKET_OUT_FLOAT(diffuse_depth, "Diffuse Depth");
3261 SOCKET_OUT_FLOAT(glossy_depth, "Glossy Depth");
3262 SOCKET_OUT_FLOAT(transparent_depth, "Transparent Depth");
3263 SOCKET_OUT_FLOAT(transmission_depth, "Transmission Depth");
3268 LightPathNode::LightPathNode()
3269 : ShaderNode(node_type)
3273 void LightPathNode::compile(SVMCompiler& compiler)
3277 out = output("Is Camera Ray");
3278 if(!out->links.empty()) {
3279 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_camera, compiler.stack_assign(out));
3282 out = output("Is Shadow Ray");
3283 if(!out->links.empty()) {
3284 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_shadow, compiler.stack_assign(out));
3287 out = output("Is Diffuse Ray");
3288 if(!out->links.empty()) {
3289 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_diffuse, compiler.stack_assign(out));
3292 out = output("Is Glossy Ray");
3293 if(!out->links.empty()) {
3294 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_glossy, compiler.stack_assign(out));
3297 out = output("Is Singular Ray");
3298 if(!out->links.empty()) {
3299 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_singular, compiler.stack_assign(out));
3302 out = output("Is Reflection Ray");
3303 if(!out->links.empty()) {
3304 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_reflection, compiler.stack_assign(out));
3308 out = output("Is Transmission Ray");
3309 if(!out->links.empty()) {
3310 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_transmission, compiler.stack_assign(out));
3313 out = output("Is Volume Scatter Ray");
3314 if(!out->links.empty()) {
3315 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_volume_scatter, compiler.stack_assign(out));
3318 out = output("Ray Length");
3319 if(!out->links.empty()) {
3320 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_length, compiler.stack_assign(out));
3323 out = output("Ray Depth");
3324 if(!out->links.empty()) {
3325 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_depth, compiler.stack_assign(out));
3328 out = output("Diffuse Depth");
3329 if(!out->links.empty()) {
3330 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_diffuse, compiler.stack_assign(out));
3333 out = output("Glossy Depth");
3334 if(!out->links.empty()) {
3335 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_glossy, compiler.stack_assign(out));
3338 out = output("Transparent Depth");
3339 if(!out->links.empty()) {
3340 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_transparent, compiler.stack_assign(out));
3343 out = output("Transmission Depth");
3344 if(!out->links.empty()) {
3345 compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_transmission, compiler.stack_assign(out));
3349 void LightPathNode::compile(OSLCompiler& compiler)
3351 compiler.add(this, "node_light_path");
3356 NODE_DEFINE(LightFalloffNode)
3358 NodeType* type = NodeType::add("light_fallof", create, NodeType::SHADER);
3360 SOCKET_IN_FLOAT(strength, "Strength", 100.0f);
3361 SOCKET_IN_FLOAT(smooth, "Smooth", 0.0f);
3363 SOCKET_OUT_FLOAT(quadratic, "Quadratic");
3364 SOCKET_OUT_FLOAT(linear, "Linear");
3365 SOCKET_OUT_FLOAT(constant, "Constant");
3370 LightFalloffNode::LightFalloffNode()
3371 : ShaderNode(node_type)
3375 void LightFalloffNode::compile(SVMCompiler& compiler)
3377 ShaderInput *strength_in = input("Strength");
3378 ShaderInput *smooth_in = input("Smooth");
3380 ShaderOutput *out = output("Quadratic");
3381 if(!out->links.empty()) {
3382 compiler.add_node(NODE_LIGHT_FALLOFF, NODE_LIGHT_FALLOFF_QUADRATIC,
3383 compiler.encode_uchar4(
3384 compiler.stack_assign(strength_in),
3385 compiler.stack_assign(smooth_in),
3386 compiler.stack_assign(out)));
3389 out = output("Linear");
3390 if(!out->links.empty()) {
3391 compiler.add_node(NODE_LIGHT_FALLOFF, NODE_LIGHT_FALLOFF_LINEAR,
3392 compiler.encode_uchar4(
3393 compiler.stack_assign(strength_in),
3394 compiler.stack_assign(smooth_in),
3395 compiler.stack_assign(out)));
3398 out = output("Constant");
3399 if(!out->links.empty()) {
3400 compiler.add_node(NODE_LIGHT_FALLOFF, NODE_LIGHT_FALLOFF_CONSTANT,
3401 compiler.encode_uchar4(
3402 compiler.stack_assign(strength_in),
3403 compiler.stack_assign(smooth_in),
3404 compiler.stack_assign(out)));
3408 void LightFalloffNode::compile(OSLCompiler& compiler)
3410 compiler.add(this, "node_light_falloff");
3415 NODE_DEFINE(ObjectInfoNode)
3417 NodeType* type = NodeType::add("object_info", create, NodeType::SHADER);
3419 SOCKET_OUT_VECTOR(location, "Location");
3420 SOCKET_OUT_FLOAT(object_index, "Object Index");
3421 SOCKET_OUT_FLOAT(material_index, "Material Index");
3422 SOCKET_OUT_FLOAT(random, "Random");
3427 ObjectInfoNode::ObjectInfoNode()
3428 : ShaderNode(node_type)
3432 void ObjectInfoNode::compile(SVMCompiler& compiler)
3434 ShaderOutput *out = output("Location");
3435 if(!out->links.empty()) {
3436 compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_LOCATION, compiler.stack_assign(out));
3439 out = output("Object Index");
3440 if(!out->links.empty()) {
3441 compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_INDEX, compiler.stack_assign(out));
3444 out = output("Material Index");
3445 if(!out->links.empty()) {
3446 compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_MAT_INDEX, compiler.stack_assign(out));
3449 out = output("Random");
3450 if(!out->links.empty()) {
3451 compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_RANDOM, compiler.stack_assign(out));
3455 void ObjectInfoNode::compile(OSLCompiler& compiler)
3457 compiler.add(this, "node_object_info");