add_options.push_back(AddOption("If","Conditional","Functions","VisualShaderNodeIf",TTR("Returns an associated vector if the provided scalars are equal, greater or less."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Switch","Conditional","Functions","VisualShaderNodeSwitch",TTR("Returns an associated vector if the provided boolean value is true or false."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Camera","Input","All","VisualShaderNodeInput",TTR("'camera' input parameter for all shader modes."),"camera",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("InvCamera","Input","All","VisualShaderNodeInput",TTR("'inv_camera' input parameter for all shader modes."),"inv_camera",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("InvProjection","Input","All","VisualShaderNodeInput",TTR("'inv_projection' input parameter for all shader modes."),"inv_projection",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Normal","Input","All","VisualShaderNodeInput",TTR("'normal' input parameter for all shader modes."),"normal",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Projection","Input","All","VisualShaderNodeInput",TTR("'projection' input parameter for all shader modes."),"projection",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Time","Input","All","VisualShaderNodeInput",TTR("'time' input parameter for all shader modes."),"time",VisualShaderNode::PORT_TYPE_SCALAR,-1,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("ViewportSize","Input","All","VisualShaderNodeInput",TTR("'viewport_size' input parameter for all shader modes."),"viewport_size",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("World","Input","All","VisualShaderNodeInput",TTR("'world' input parameter for all shader modes."),"world",VisualShaderNode::PORT_TYPE_TRANSFORM,-1,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Alpha","Input","All","VisualShaderNodeInput",TTR("'alpha' input parameter for all shader modes."),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,-1,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Color","Input","All","VisualShaderNodeInput",TTR("'color' input parameter for all shader modes."),"color",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("TexturePixelSize","Input","All","VisualShaderNodeInput",TTR("'texture_pixel_size' input parameter for all shader modes."),"texture_pixel_size",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Time","Input","All","VisualShaderNodeInput",TTR("'time' input parameter for all shader modes."),"time",VisualShaderNode::PORT_TYPE_SCALAR,-1,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("UV","Input","All","VisualShaderNodeInput",TTR("'uv' input parameter for all shader modes."),"uv",VisualShaderNode::PORT_TYPE_VECTOR,-1,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Alpha","Input","Fragment","VisualShaderNodeInput",TTR("'alpha' input parameter for vertex and fragment shader modes."),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Binormal","Input","Fragment","VisualShaderNodeInput",TTR("'binormal' input parameter for vertex and fragment shader modes."),"binormal",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Color","Input","Fragment","VisualShaderNodeInput",TTR("'color' input parameter for vertex and fragment shader modes."),"color",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("FragCoord","Input","Fragment","VisualShaderNodeInput",TTR("'fragcoord' input parameter for fragment and light shader modes."),"fragcoord",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("PointCoord","Input","Fragment","VisualShaderNodeInput",TTR("'point_coord' input parameter for fragment shader mode."),"point_coord",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("ScreenUV","Input","Fragment","VisualShaderNodeInput",TTR("'screen_uv' input parameter for fragment shader mode."),"screen_uv",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Side","Input","Fragment","VisualShaderNodeInput",TTR("'side' input parameter for fragment shader mode."),"side",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Tangent","Input","Fragment","VisualShaderNodeInput",TTR("'tangent' input parameter for vertex and fragment shader modes."),"tangent",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("UV","Input","Fragment","VisualShaderNodeInput",TTR("'uv' input parameter for vertex and fragment shader modes."),"uv",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("UV2","Input","Fragment","VisualShaderNodeInput",TTR("'uv2' input parameter for vertex and fragment shader modes."),"uv2",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Vertex","Input","Fragment","VisualShaderNodeInput",TTR("'vertex' input parameter for vertex and fragment shader modes."),"vertex",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("View","Input","Fragment","VisualShaderNodeInput",TTR("'view' input parameter for fragment and light shader modes."),"view",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Albedo","Input","Light","VisualShaderNodeInput",TTR("'albedo' input parameter for light shader mode."),"albedo",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Attenuation","Input","Light","VisualShaderNodeInput",TTR("'attenuation' input parameter for light shader mode."),"attenuation",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Diffuse","Input","Light","VisualShaderNodeInput",TTR("'diffuse' input parameter for light shader mode."),"diffuse",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("FragCoord","Input","Light","VisualShaderNodeInput",TTR("'fragcoord' input parameter for fragment and light shader modes."),"fragcoord",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Light","Input","Light","VisualShaderNodeInput",TTR("'light' input parameter for light shader mode."),"light",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("LightColor","Input","Light","VisualShaderNodeInput",TTR("'light_color' input parameter for light shader mode."),"light_color",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Roughness","Input","Light","VisualShaderNodeInput",TTR("'roughness' input parameter for light shader mode."),"roughness",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Specular","Input","Light","VisualShaderNodeInput",TTR("'specular' input parameter for light shader mode."),"specular",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Transmission","Input","Light","VisualShaderNodeInput",TTR("'transmission' input parameter for light shader mode."),"transmission",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("View","Input","Light","VisualShaderNodeInput",TTR("'view' input parameter for fragment and light shader modes."),"view",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Alpha","Input","Vertex","VisualShaderNodeInput",TTR("'alpha' input parameter for vertex and fragment shader modes."),"alpha",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Binormal","Input","Vertex","VisualShaderNodeInput",TTR("'binormal' input parameter for vertex and fragment shader modes."),"binormal",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Color","Input","Vertex","VisualShaderNodeInput",TTR("'color' input parameter for vertex and fragment shader modes."),"color",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("ModelView","Input","Vertex","VisualShaderNodeInput",TTR("'modelview' input parameter for vertex shader mode."),"modelview",VisualShaderNode::PORT_TYPE_TRANSFORM,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("PointSize","Input","Vertex","VisualShaderNodeInput",TTR("'point_size' input parameter for vertex shader mode."),"point_size",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Tangent","Input","Vertex","VisualShaderNodeInput",TTR("'tangent' input parameter for vertex and fragment shader mode."),"tangent",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("UV","Input","Vertex","VisualShaderNodeInput",TTR("'uv' input parameter for vertex and fragment shader modes."),"uv",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("UV2","Input","Vertex","VisualShaderNodeInput",TTR("'uv2' input parameter for vertex and fragment shader modes."),"uv2",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("Vertex","Input","Vertex","VisualShaderNodeInput",TTR("'vertex' input parameter for vertex and fragment shader modes."),"vertex",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_VERTEX,Shader::MODE_SPATIAL));
add_options.push_back(AddOption("FragCoord","Input","Fragment","VisualShaderNodeInput",TTR("'fragcoord' input parameter for fragment and light shader modes."),"fragcoord",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightPass","Input","Fragment","VisualShaderNodeInput",TTR("'light_pass' input parameter for vertex and fragment shader modes."),"light_pass",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_FRAGMENT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("PointCoord","Input","Fragment","VisualShaderNodeInput",TTR("'point_coord' input parameter for fragment and light shader modes."),"point_coord",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("ScreenPixelSize","Input","Fragment","VisualShaderNodeInput",TTR("'screen_pixel_size' input parameter for fragment shader mode."),"screen_pixel_size",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("ScreenUV","Input","Fragment","VisualShaderNodeInput",TTR("'screen_uv' input parameter for fragment and light shader modes."),"screen_uv",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("FragCoord","Input","Light","VisualShaderNodeInput",TTR("'fragcoord' input parameter for fragment and light shader modes."),"fragcoord",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightAlpha","Input","Light","VisualShaderNodeInput",TTR("'light_alpha' input parameter for light shader mode."),"light_alpha",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightColor","Input","Light","VisualShaderNodeInput",TTR("'light_color' input parameter for light shader mode."),"light_color",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightHeight","Input","Light","VisualShaderNodeInput",TTR("'light_height' input parameter for light shader mode."),"light_height",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightUV","Input","Light","VisualShaderNodeInput",TTR("'light_uv' input parameter for light shader mode."),"light_uv",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightVector","Input","Light","VisualShaderNodeInput",TTR("'light_vec' input parameter for light shader mode."),"light_vec",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Normal","Input","Light","VisualShaderNodeInput",TTR("'normal' input parameter for light shader mode."),"normal",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("PointCoord","Input","Light","VisualShaderNodeInput",TTR("'point_coord' input parameter for fragment and light shader modes."),"point_coord",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("ScreenUV","Input","Light","VisualShaderNodeInput",TTR("'screen_uv' input parameter for fragment and light shader modes."),"screen_uv",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("ShadowColor","Input","Light","VisualShaderNodeInput",TTR("'shadow_color' input parameter for light shader mode."),"shadow_color",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_LIGHT,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Extra","Input","Vertex","VisualShaderNodeInput",TTR("'extra' input parameter for vertex shader mode."),"extra",VisualShaderNode::PORT_TYPE_TRANSFORM,VisualShader::TYPE_VERTEX,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("LightPass","Input","Vertex","VisualShaderNodeInput",TTR("'light_pass' input parameter for vertex and fragment shader modes."),"light_pass",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_VERTEX,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("PointSize","Input","Vertex","VisualShaderNodeInput",TTR("'point_size' input parameter for vertex shader mode."),"point_size",VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_VERTEX,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Projection","Input","Vertex","VisualShaderNodeInput",TTR("'projection' input parameter for vertex shader mode."),"projection",VisualShaderNode::PORT_TYPE_TRANSFORM,VisualShader::TYPE_VERTEX,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("Vertex","Input","Vertex","VisualShaderNodeInput",TTR("'vertex' input parameter for vertex shader mode."),"vertex",VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_VERTEX,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("World","Input","Vertex","VisualShaderNodeInput",TTR("'world' input parameter for vertex shader mode."),"world",VisualShaderNode::PORT_TYPE_TRANSFORM,VisualShader::TYPE_VERTEX,Shader::MODE_CANVAS_ITEM));
add_options.push_back(AddOption("E","Scalar","Constants","VisualShaderNodeScalarConstant",TTR("E constant (2.718282). Represents the base of the natural logarithm."),-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,Math_E));
add_options.push_back(AddOption("Epsilon","Scalar","Constants","VisualShaderNodeScalarConstant",TTR("Epsilon constant (0.00001). Smallest possible scalar number."),-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,CMP_EPSILON));
add_options.push_back(AddOption("Phi","Scalar","Constants","VisualShaderNodeScalarConstant",TTR("Phi constant (1.618034). Golden ratio."),-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,1.618034f));
add_options.push_back(AddOption("Pi/4","Scalar","Constants","VisualShaderNodeScalarConstant",TTR("Pi/4 constant (0.785398) or 45 degrees."),-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,Math_PI/4));
add_options.push_back(AddOption("Pi/2","Scalar","Constants","VisualShaderNodeScalarConstant",TTR("Pi/2 constant (1.570796) or 90 degrees."),-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,Math_PI/2));
add_options.push_back(AddOption("Pi","Scalar","Constants","VisualShaderNodeScalarConstant",TTR("Pi constant (3.141593) or 180 degrees."),-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,Math_PI));
add_options.push_back(AddOption("Tau","Scalar","Constants","VisualShaderNodeScalarConstant",TTR("Tau constant (6.283185) or 360 degrees."),-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,Math_TAU));
add_options.push_back(AddOption("Sqrt2","Scalar","Constants","VisualShaderNodeScalarConstant",TTR("Sqrt2 constant (1.414214). Square root of 2."),-1,VisualShaderNode::PORT_TYPE_SCALAR,-1,-1,Math_SQRT2));
add_options.push_back(AddOption("Abs","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the absolute value of the parameter."),VisualShaderNodeScalarFunc::FUNC_ABS,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("ACos","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the arc-cosine of the parameter."),VisualShaderNodeScalarFunc::FUNC_ACOS,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("ACosH","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Returns the inverse hyperbolic cosine of the parameter."),VisualShaderNodeScalarFunc::FUNC_ACOSH,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("ASin","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the arc-sine of the parameter."),VisualShaderNodeScalarFunc::FUNC_ASIN,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("ASinH","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Returns the inverse hyperbolic sine of the parameter."),VisualShaderNodeScalarFunc::FUNC_ASINH,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("ATan","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the arc-tangent of the parameter."),VisualShaderNodeScalarFunc::FUNC_ATAN,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("ATan2","Scalar","Functions","VisualShaderNodeScalarOp",TTR("Returns the arc-tangent of the parameters."),VisualShaderNodeScalarOp::OP_ATAN2,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("ATanH","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Returns the inverse hyperbolic tangent of the parameter."),VisualShaderNodeScalarFunc::FUNC_ATANH,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Ceil","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Finds the nearest integer that is greater than or equal to the parameter."),VisualShaderNodeScalarFunc::FUNC_CEIL,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Clamp","Scalar","Functions","VisualShaderNodeScalarClamp",TTR("Constrains a value to lie between two further values."),-1,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Cos","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the cosine of the parameter."),VisualShaderNodeScalarFunc::FUNC_COS,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("CosH","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Returns the hyperbolic cosine of the parameter."),VisualShaderNodeScalarFunc::FUNC_COSH,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Degrees","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Converts a quantity in radians to degrees."),VisualShaderNodeScalarFunc::FUNC_DEGREES,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Floor","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Finds the nearest integer less than or equal to the parameter."),VisualShaderNodeScalarFunc::FUNC_FLOOR,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Fract","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Computes the fractional part of the argument."),VisualShaderNodeScalarFunc::FUNC_FRAC,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("InverseSqrt","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the inverse of the square root of the parameter."),VisualShaderNodeScalarFunc::FUNC_INVERSE_SQRT,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Max","Scalar","Functions","VisualShaderNodeScalarOp",TTR("Returns the greater of two values."),VisualShaderNodeScalarOp::OP_MAX,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Min","Scalar","Functions","VisualShaderNodeScalarOp",TTR("Returns the lesser of two values."),VisualShaderNodeScalarOp::OP_MIN,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Mix","Scalar","Functions","VisualShaderNodeScalarInterp",TTR("Linear interpolation between two scalars."),-1,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Negate","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the opposite value of the parameter."),VisualShaderNodeScalarFunc::FUNC_NEGATE,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Pow","Scalar","Functions","VisualShaderNodeScalarOp",TTR("Returns the value of the first parameter raised to the power of the second."),VisualShaderNodeScalarOp::OP_POW,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Radians","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Converts a quantity in degrees to radians."),VisualShaderNodeScalarFunc::FUNC_RADIANS,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Round","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Finds the nearest integer to the parameter."),VisualShaderNodeScalarFunc::FUNC_ROUND,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("RoundEven","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Finds the nearest even integer to the parameter."),VisualShaderNodeScalarFunc::FUNC_ROUNDEVEN,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Saturate","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Clamps the value between 0.0 and 1.0."),VisualShaderNodeScalarFunc::FUNC_SATURATE,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Sign","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Extracts the sign of the parameter."),VisualShaderNodeScalarFunc::FUNC_SIGN,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Sin","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the sine of the parameter."),VisualShaderNodeScalarFunc::FUNC_SIN,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("SinH","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Returns the hyperbolic sine of the parameter."),VisualShaderNodeScalarFunc::FUNC_SINH,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Sqrt","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the square root of the parameter."),VisualShaderNodeScalarFunc::FUNC_SQRT,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("SmoothStep","Scalar","Functions","VisualShaderNodeScalarSmoothStep",TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."),-1,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Step","Scalar","Functions","VisualShaderNodeScalarOp",TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."),VisualShaderNodeScalarOp::OP_STEP,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Tan","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("Returns the tangent of the parameter."),VisualShaderNodeScalarFunc::FUNC_TAN,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("TanH","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Returns the hyperbolic tangent of the parameter."),VisualShaderNodeScalarFunc::FUNC_TANH,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Trunc","Scalar","Functions","VisualShaderNodeScalarFunc",TTR("(GLES3 only) Finds the truncated value of the parameter."),VisualShaderNodeScalarFunc::FUNC_TRUNC,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Add","Scalar","Operators","VisualShaderNodeScalarOp",TTR("Adds scalar to scalar."),VisualShaderNodeScalarOp::OP_ADD,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Divide","Scalar","Operators","VisualShaderNodeScalarOp",TTR("Divides scalar by scalar."),VisualShaderNodeScalarOp::OP_DIV,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Multiply","Scalar","Operators","VisualShaderNodeScalarOp",TTR("Multiplies scalar by scalar."),VisualShaderNodeScalarOp::OP_MUL,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Remainder","Scalar","Operators","VisualShaderNodeScalarOp",TTR("Returns the remainder of the two scalars."),VisualShaderNodeScalarOp::OP_MOD,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Subtract","Scalar","Operators","VisualShaderNodeScalarOp",TTR("Subtracts scalar from scalar."),VisualShaderNodeScalarOp::OP_SUB,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("CubeMap","Textures","Functions","VisualShaderNodeCubeMap",TTR("Perform the cubic texture lookup."),-1,VisualShaderNode::PORT_TYPE_COLOR));
add_options.push_back(AddOption("Texture","Textures","Functions","VisualShaderNodeTexture",TTR("Perform the texture lookup."),-1,VisualShaderNode::PORT_TYPE_COLOR));
add_options.push_back(AddOption("OuterProduct","Transform","Composition","VisualShaderNodeOuterProduct",TTR("(GLES3 only) Calculate the outer product of a pair of vectors.\n\nOuterProduct treats the first parameter 'c' as a column vector (matrix with one column) and the second parameter 'r' as a row vector (matrix with one row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix whose number of rows is the number of components in 'c' and whose number of columns is the number of components in 'r'."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));
add_options.push_back(AddOption("TransformCompose","Transform","Composition","VisualShaderNodeTransformCompose",TTR("Composes transform from four vectors."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));
add_options.push_back(AddOption("TransformDecompose","Transform","Composition","VisualShaderNodeTransformDecompose",TTR("Decomposes transform to four vectors.")));
add_options.push_back(AddOption("Determinant","Transform","Functions","VisualShaderNodeDeterminant",TTR("(GLES3 only) Calculates the determinant of a transform."),-1,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Inverse","Transform","Functions","VisualShaderNodeTransformFunc",TTR("(GLES3 only) Calculates the inverse of a transform."),VisualShaderNodeTransformFunc::FUNC_INVERSE,VisualShaderNode::PORT_TYPE_TRANSFORM));
add_options.push_back(AddOption("Transpose","Transform","Functions","VisualShaderNodeTransformFunc",TTR("(GLES3 only) Calculates the transpose of a transform."),VisualShaderNodeTransformFunc::FUNC_TRANSPOSE,VisualShaderNode::PORT_TYPE_TRANSFORM));
add_options.push_back(AddOption("TransformMult","Transform","Operators","VisualShaderNodeTransformMult",TTR("Multiplies transform by transform."),-1,VisualShaderNode::PORT_TYPE_TRANSFORM));
add_options.push_back(AddOption("TransformVectorMult","Transform","Operators","VisualShaderNodeTransformVecMult",TTR("Multiplies vector by transform."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("VectorCompose","Vector","Composition","VisualShaderNodeVectorCompose",TTR("Composes vector from three scalars."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("VectorDecompose","Vector","Composition","VisualShaderNodeVectorDecompose",TTR("Decomposes vector to three scalars.")));
add_options.push_back(AddOption("Abs","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the absolute value of the parameter."),VisualShaderNodeVectorFunc::FUNC_ABS,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("ACos","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the arc-cosine of the parameter."),VisualShaderNodeVectorFunc::FUNC_ACOS,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("ACosH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Returns the inverse hyperbolic cosine of the parameter."),VisualShaderNodeVectorFunc::FUNC_ACOSH,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("ASin","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the arc-sine of the parameter."),VisualShaderNodeVectorFunc::FUNC_ASIN,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("ASinH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Returns the inverse hyperbolic sine of the parameter."),VisualShaderNodeVectorFunc::FUNC_ASINH,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("ATan","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the arc-tangent of the parameter."),VisualShaderNodeVectorFunc::FUNC_ATAN,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("ATan2","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the arc-tangent of the parameters."),VisualShaderNodeVectorOp::OP_ATAN2,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("ATanH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Returns the inverse hyperbolic tangent of the parameter."),VisualShaderNodeVectorFunc::FUNC_ATANH,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Ceil","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Finds the nearest integer that is greater than or equal to the parameter."),VisualShaderNodeVectorFunc::FUNC_CEIL,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Clamp","Vector","Functions","VisualShaderNodeVectorClamp",TTR("Constrains a value to lie between two further values."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Cos","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the cosine of the parameter."),VisualShaderNodeVectorFunc::FUNC_COS,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("CosH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Returns the hyperbolic cosine of the parameter."),VisualShaderNodeVectorFunc::FUNC_COSH,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Cross","Vector","Functions","VisualShaderNodeVectorOp",TTR("Calculates the cross product of two vectors."),VisualShaderNodeVectorOp::OP_CROSS,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Degrees","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Converts a quantity in radians to degrees."),VisualShaderNodeVectorFunc::FUNC_DEGREES,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Distance","Vector","Functions","VisualShaderNodeVectorDistance",TTR("Returns the distance between two points."),-1,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Dot","Vector","Functions","VisualShaderNodeDotProduct",TTR("Calculates the dot product of two vectors."),-1,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("FaceForward","Vector","Functions","VisualShaderNodeFaceForward",TTR("Returns a vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Floor","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Finds the nearest integer less than or equal to the parameter."),VisualShaderNodeVectorFunc::FUNC_FLOOR,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Fract","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Computes the fractional part of the argument."),VisualShaderNodeVectorFunc::FUNC_FRAC,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("InverseSqrt","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the inverse of the square root of the parameter."),VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Length","Vector","Functions","VisualShaderNodeVectorLen",TTR("Calculates the length of a vector."),-1,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("Max","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the greater of two values."),VisualShaderNodeVectorOp::OP_MAX,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Min","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the lesser of two values."),VisualShaderNodeVectorOp::OP_MIN,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Mix","Vector","Functions","VisualShaderNodeVectorInterp",TTR("Linear interpolation between two vectors."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Negate","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the opposite value of the parameter."),VisualShaderNodeVectorFunc::FUNC_NEGATE,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Normalize","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Calculates the normalize product of vector."),VisualShaderNodeVectorFunc::FUNC_NORMALIZE,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Pow","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns the value of the first parameter raised to the power of the second."),VisualShaderNodeVectorOp::OP_POW,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Radians","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Converts a quantity in degrees to radians."),VisualShaderNodeVectorFunc::FUNC_RADIANS,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Reflect","Vector","Functions","VisualShaderNodeVectorOp",TTR("Returns a vector that points in the direction of reflection ( a : incident vector, b : normal vector )."),VisualShaderNodeVectorOp::OP_REFLECT,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Refract","Vector","Functions","VisualShaderNodeVectorRefract",TTR("Returns a vector that points in the direction of refraction."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Round","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Finds the nearest integer to the parameter."),VisualShaderNodeVectorFunc::FUNC_ROUND,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("RoundEven","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Finds the nearest even integer to the parameter."),VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Saturate","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Clamps the value between 0.0 and 1.0."),VisualShaderNodeVectorFunc::FUNC_SATURATE,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Sign","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Extracts the sign of the parameter."),VisualShaderNodeVectorFunc::FUNC_SIGN,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Sin","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the sine of the parameter."),VisualShaderNodeVectorFunc::FUNC_SIN,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("SinH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Returns the hyperbolic sine of the parameter."),VisualShaderNodeVectorFunc::FUNC_SINH,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Sqrt","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the square root of the parameter."),VisualShaderNodeVectorFunc::FUNC_SQRT,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("SmoothStep","Vector","Functions","VisualShaderNodeVectorSmoothStep",TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("SmoothStepS","Vector","Functions","VisualShaderNodeVectorScalarSmoothStep",TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Step","Vector","Functions","VisualShaderNodeVectorOp",TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."),VisualShaderNodeVectorOp::OP_STEP,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("StepS","Vector","Functions","VisualShaderNodeVectorScalarStep",TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."),-1,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Tan","Vector","Functions","VisualShaderNodeVectorFunc",TTR("Returns the tangent of the parameter."),VisualShaderNodeVectorFunc::FUNC_TAN,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("TanH","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Returns the hyperbolic tangent of the parameter."),VisualShaderNodeVectorFunc::FUNC_TANH,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Trunc","Vector","Functions","VisualShaderNodeVectorFunc",TTR("(GLES3 only) Finds the truncated value of the parameter."),VisualShaderNodeVectorFunc::FUNC_TRUNC,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Add","Vector","Operators","VisualShaderNodeVectorOp",TTR("Adds vector to vector."),VisualShaderNodeVectorOp::OP_ADD,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Divide","Vector","Operators","VisualShaderNodeVectorOp",TTR("Divides vector by vector."),VisualShaderNodeVectorOp::OP_DIV,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Multiply","Vector","Operators","VisualShaderNodeVectorOp",TTR("Multiplies vector by vector."),VisualShaderNodeVectorOp::OP_MUL,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Remainder","Vector","Operators","VisualShaderNodeVectorOp",TTR("Returns the remainder of the two vectors."),VisualShaderNodeVectorOp::OP_MOD,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Subtract","Vector","Operators","VisualShaderNodeVectorOp",TTR("Subtracts vector from vector."),VisualShaderNodeVectorOp::OP_SUB,VisualShaderNode::PORT_TYPE_VECTOR));
add_options.push_back(AddOption("Expression","Special","","VisualShaderNodeExpression",TTR("Custom Godot Shader Language expression, with custom amount of input and output ports. This is a direct injection of code into the vertex/fragment/light function, do not use it to write the function declarations inside.")));
add_options.push_back(AddOption("Fresnel","Special","","VisualShaderNodeFresnel",TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."),-1,VisualShaderNode::PORT_TYPE_SCALAR));
add_options.push_back(AddOption("DdX","Special","Derivative","VisualShaderNodeVectorDerivativeFunc",TTR("(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."),VisualShaderNodeVectorDerivativeFunc::FUNC_X,VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT|VisualShader::TYPE_LIGHT));
add_options.push_back(AddOption("DdXS","Special","Derivative","VisualShaderNodeScalarDerivativeFunc",TTR("(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."),VisualShaderNodeScalarDerivativeFunc::FUNC_X,VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_FRAGMENT|VisualShader::TYPE_LIGHT));
add_options.push_back(AddOption("DdY","Special","Derivative","VisualShaderNodeVectorDerivativeFunc",TTR("(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."),VisualShaderNodeVectorDerivativeFunc::FUNC_Y,VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT|VisualShader::TYPE_LIGHT));
add_options.push_back(AddOption("DdYS","Special","Derivative","VisualShaderNodeScalarDerivativeFunc",TTR("(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."),VisualShaderNodeScalarDerivativeFunc::FUNC_Y,VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_FRAGMENT|VisualShader::TYPE_LIGHT));
add_options.push_back(AddOption("Sum","Special","Derivative","VisualShaderNodeVectorDerivativeFunc",TTR("(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."),VisualShaderNodeVectorDerivativeFunc::FUNC_SUM,VisualShaderNode::PORT_TYPE_VECTOR,VisualShader::TYPE_FRAGMENT|VisualShader::TYPE_LIGHT));
add_options.push_back(AddOption("SumS","Special","Derivative","VisualShaderNodeScalarDerivativeFunc",TTR("(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."),VisualShaderNodeScalarDerivativeFunc::FUNC_SUM,VisualShaderNode::PORT_TYPE_SCALAR,VisualShader::TYPE_FRAGMENT|VisualShader::TYPE_LIGHT));