cosmetic changes;
authorMichal Krol <mjkrol@gmail.org>
Wed, 13 Apr 2005 13:03:23 +0000 (13:03 +0000)
committerMichal Krol <mjkrol@gmail.org>
Wed, 13 Apr 2005 13:03:23 +0000 (13:03 +0000)
fix syntax errors;

src/mesa/shader/slang/library/slang_common_builtin.gc
src/mesa/shader/slang/library/slang_common_builtin_gc.h [new file with mode: 0644]

index 65c5c79..0b3ed0e 100755 (executable)
@@ -209,14 +209,14 @@ uniform gl_FogParameters gl_Fog;
 // 
 // The built-in functions basically fall into three categories:
 // 
-// \95 They expose some necessary hardware functionality in a convenient way such as accessing
+// * They expose some necessary hardware functionality in a convenient way such as accessing
 //   a texture map. There is no way in the language for these functions to be emulated by a shader.
 // 
-// \95 They represent a trivial operation (clamp, mix, etc.) that is very simple for the user
+// * They represent a trivial operation (clamp, mix, etc.) that is very simple for the user
 //   to write, but they are very common and may have direct hardware support. It is a very hard
 //   problem for the compiler to map expressions to complex assembler instructions.
 // 
-// \95 They represent an operation graphics hardware is likely to accelerate at some point. The
+// * They represent an operation graphics hardware is likely to accelerate at some point. The
 //   trigonometry functions fall into this category.
 // 
 // Many of the functions are similar to the same named ones in common C libraries, but they support
@@ -927,7 +927,8 @@ vec4 faceforward (vec4 N, vec4 I, vec4 Nref) {
 // 
 // For the incident vector I and surface orientation N, returns the reflection direction:
 // result = I - 2 * dot (N, I) * N
-// N must already be normalized in order to achieve the desired result.
+// N must already be normalized in order to achieve the desired result.\r
+//
 
 float reflect (float I, float N) {
     return I - 2.0 * dot (N, I) * N;
@@ -959,7 +960,7 @@ vec4 reflect (vec4 I, vec4 N) {
 float refract (float I, float N, float eta) {
     const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));
     if (k < 0.0)
-        return 0.0;
+        return 0.0;\r
     return eta * I - (eta * dot (N, I) + sqrt (k)) * N;
 }
 vec2 refract (vec2 I, vec2 N, float eta) {
@@ -1146,16 +1147,16 @@ bvec3 notEqual (vec3 x, vec3 y) {
     return bvec3 (x.x != y.x, x.y != y.y, x.z != y.z);
 }
 bvec4 notEqual (vec4 x, vec4 y) {
-    return (bvec4 (x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);
+    return bvec4 (x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);
 }
 bvec2 notEqual (ivec2 x, ivec2 y) {
-    return (bvec2 (x.x != y.x, x.y != y.y);
+    return bvec2 (x.x != y.x, x.y != y.y);
 }
 bvec3 notEqual (ivec3 x, ivec3 y) {
-    return (bvec3 (x.x != y.x, x.y != y.y, x.z != y.z);
+    return bvec3 (x.x != y.x, x.y != y.y, x.z != y.z);
 }
 bvec4 notEqual (ivec4 x, ivec4 y) {
-    return (bvec4 (x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);
+    return bvec4 (x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);
 }
 
 // 
@@ -1225,13 +1226,13 @@ bvec4 not (bvec4 x) {
 // running in a fragment shader, the LOD computed by the implementation is used to do the texture
 // lookup. If it is mip-mapped and running on the vertex shader, then the base texture is used.
 // 
-// The built-ins suffixed with \93Lod\94 are allowed only in a vertex shader. For the \93Lod\94 functions,
+// The built-ins suffixed with "Lod" are allowed only in a vertex shader. For the "Lod" functions,
 // lod is directly used as the level of detail.
 // 
 
 // 
 // Use the texture coordinate coord to do a texture lookup in the 1D texture currently bound
-// to sampler. For the projective (\93Proj\94) versions, the texture coordinate coord.s is divided by
+// to sampler. For the projective ("Proj") versions, the texture coordinate coord.s is divided by
 // the last component of coord.
 // 
 // XXX
@@ -1247,7 +1248,7 @@ vec4 texture1DProj (sampler1D sampler, vec4 coord) {
 
 // 
 // Use the texture coordinate coord to do a texture lookup in the 2D texture currently bound
-// to sampler. For the projective (\93Proj\94) versions, the texture coordinate (coord.s, coord.t) is
+// to sampler. For the projective ("Proj") versions, the texture coordinate (coord.s, coord.t) is
 // divided by the last component of coord. The third component of coord is ignored for the vec4
 // coord variant.
 // 
@@ -1264,7 +1265,7 @@ vec4 texture2DProj (sampler2D sampler, vec4 coord) {
 
 // 
 // Use the texture coordinate coord to do a texture lookup in the 3D texture currently bound
-// to sampler. For the projective (\93Proj\94) versions, the texture coordinate is divided by coord.q.
+// to sampler. For the projective ("Proj") versions, the texture coordinate is divided by coord.q.
 // 
 // XXX
 vec4 texture3D (sampler3D sampler, vec3 coord) {
@@ -1288,9 +1289,9 @@ vec4 textureCube (samplerCube sampler, vec3 coord) {
 // Use texture coordinate coord to do a depth comparison lookup on the depth texture bound
 // to sampler, as described in section 3.8.14 of version 1.4 of the OpenGL specification. The 3rd
 // component of coord (coord.p) is used as the R value. The texture bound to sampler must be a
-// depth texture, or results are undefined. For the projective (\93Proj\94) version of each built-in,
+// depth texture, or results are undefined. For the projective ("Proj") version of each built-in,
 // the texture coordinate is divide by coord.q, giving a depth value R of coord.p/coord.q. The
-// second component of coord is ignored for the \931D\94 variants.
+// second component of coord is ignored for the "1D" variants.
 // 
 // XXX
 vec4 shadow1D (sampler1DShadow sampler, vec3 coord) {
@@ -1317,13 +1318,13 @@ vec4 shadow2DProj (sampler2DShadow sampler, vec4 coord) {
 // 
 // - The return value(s) are always in the range [-1,1], and cover at least the range [-0.6, 0.6],
 //   with a gaussian-like distribution.
-// \95 The return value(s) have an overall average of 0.0
-// \95 They are repeatable, in that a particular input value will always produce the same return value
-// \95 They are statistically invariant under rotation (i.e., no matter how the domain is rotated, it
+// * The return value(s) have an overall average of 0.0
+// * They are repeatable, in that a particular input value will always produce the same return value
+// * They are statistically invariant under rotation (i.e., no matter how the domain is rotated, it
 //   has the same statistical character)
-// \95 They have a statistical invariance under translation (i.e., no matter how the domain is
+// * They have a statistical invariance under translation (i.e., no matter how the domain is
 //   translated, it has the same statistical character)
-// \95 They typically give different results under translation.
+// * They typically give different results under translation.
 // - The spatial frequency is narrowly concentrated, centered somewhere between 0.5 to 1.0.
 // 
 
diff --git a/src/mesa/shader/slang/library/slang_common_builtin_gc.h b/src/mesa/shader/slang/library/slang_common_builtin_gc.h
new file mode 100644 (file)
index 0000000..cd9d9ac
--- /dev/null
@@ -0,0 +1,1410 @@
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"const int gl_MaxLights = 8;\n"
+"const int gl_MaxClipPlanes = 6;\n"
+"const int gl_MaxTextureUnits = 2;\n"
+"const int gl_MaxTextureCoords = 2;\n"
+"const int gl_MaxVertexAttribs = 16;\n"
+"const int gl_MaxVertexUniformComponents = 512;\n"
+"const int gl_MaxVaryingFloats = 32;\n"
+"const int gl_MaxVertexTextureImageUnits = 0;\n"
+"const int gl_MaxCombinedTextureImageUnits = 2;\n"
+"const int gl_MaxTextureImageUnits = 2;\n"
+"const int gl_MaxFragmentUniformComponents = 64;\n"
+"const int gl_MaxDrawBuffers = 1;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"uniform mat4 gl_ModelViewMatrix;\n"
+"uniform mat4 gl_ProjectionMatrix;\n"
+"uniform mat4 gl_ModelViewProjectionMatrix;\n"
+"uniform mat4 gl_TextureMatrix[gl_MaxTextureCoords];\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"uniform mat3 gl_NormalMatrix;\n"
+"\n"
+"\n"
+"uniform mat4 gl_ModelViewMatrixInverse;\n"
+"uniform mat4 gl_ProjectionMatrixInverse;\n"
+"uniform mat4 gl_ModelViewProjectionMatrixInverse;\n"
+"uniform mat4 gl_TextureMatrixInverse[gl_MaxTextureCoords];\n"
+"\n"
+"uniform mat4 gl_ModelViewMatrixTranspose;\n"
+"uniform mat4 gl_ProjectionMatrixTranspose;\n"
+"uniform mat4 gl_ModelViewProjectionMatrixTranspose;\n"
+"uniform mat4 gl_TextureMatrixTranspose[gl_MaxTextureCoords];\n"
+"\n"
+"uniform mat4 gl_ModelViewMatrixInverseTranspose;\n"
+"uniform mat4 gl_ProjectionMatrixInverseTranspose;\n"
+"uniform mat4 gl_ModelViewProjectionMatrixInverseTranspose;\n"
+"uniform mat4 gl_TextureMatrixInverseTranspose[gl_MaxTextureCoords];\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"uniform float gl_NormalScale;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"struct gl_DepthRangeParameters {\n"
+"    float near;\n"
+"    float far;\n"
+"    float diff;\n"
+"};\n"
+"\n"
+"uniform gl_DepthRangeParameters gl_DepthRange;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"uniform vec4 gl_ClipPlane[gl_MaxClipPlanes];\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"struct gl_PointParameters {\n"
+"    float size;\n"
+"    float sizeMin;\n"
+"    float sizeMax;\n"
+"    float fadeThresholdSize;\n"
+"    float distanceConstantAttenuation;\n"
+"    float distanceLinearAttenuation;\n"
+"    float distanceQuadraticAttenuation;\n"
+"};\n"
+"\n"
+"uniform gl_PointParameters gl_Point;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"struct gl_MaterialParameters {\n"
+"    vec4 emission;\n"
+"    vec4 ambient;\n"
+"    vec4 diffuse;\n"
+"    vec4 specular;\n"
+"    float shininess;\n"
+"};\n"
+"\n"
+"uniform gl_MaterialParameters gl_FrontMaterial;\n"
+"uniform gl_MaterialParameters gl_BackMaterial;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"struct gl_LightSourceParameters {\n"
+"    vec4 ambient;\n"
+"    vec4 diffuse;\n"
+"    vec4 specular;\n"
+"    vec4 position;\n"
+"    vec4 halfVector;\n"
+"    vec3 spotDirection;\n"
+"    float spotExponent;\n"
+"    float spotCutoff;\n"
+"\n"
+"    float spotCosCutoff;\n"
+"\n"
+"    float constantAttenuation;\n"
+"    float linearAttenuation;\n"
+"    float quadraticAttenuation;\n"
+"};\n"
+"\n"
+"uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];\n"
+"\n"
+"struct gl_LightModelParameters {\n"
+"    vec4 ambient;\n"
+"};\n"
+"\n"
+"uniform gl_LightModelParameters gl_LightModel;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"struct gl_LightModelProducts {\n"
+"    vec4 sceneColor;\n"
+"};\n"
+"\n"
+"uniform gl_LightModelProducts gl_FrontLightModelProduct;\n"
+"uniform gl_LightModelProducts gl_BackLightModelProduct;\n"
+"\n"
+"struct gl_LightProducts {\n"
+"    vec4 ambient;\n"
+"    vec4 diffuse;\n"
+"    vec4 specular;\n"
+"};\n"
+"\n"
+"uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];\n"
+"uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"uniform vec4 gl_TextureEnvColor[gl_MaxTextureImageUnits];\n"
+"uniform vec4 gl_EyePlaneS[gl_MaxTextureCoords];\n"
+"uniform vec4 gl_EyePlaneT[gl_MaxTextureCoords];\n"
+"uniform vec4 gl_EyePlaneR[gl_MaxTextureCoords];\n"
+"uniform vec4 gl_EyePlaneQ[gl_MaxTextureCoords];\n"
+"uniform vec4 gl_ObjectPlaneS[gl_MaxTextureCoords];\n"
+"uniform vec4 gl_ObjectPlaneT[gl_MaxTextureCoords];\n"
+"uniform vec4 gl_ObjectPlaneR[gl_MaxTextureCoords];\n"
+"uniform vec4 gl_ObjectPlaneQ[gl_MaxTextureCoords];\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"struct gl_FogParameters {\n"
+"    vec4 color;\n"
+"    float density;\n"
+"    float start;\n"
+"    float end;\n"
+"    float scale;\n"
+"};\n"
+"\n"
+"uniform gl_FogParameters gl_Fog;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float radians (float deg) {\n"
+"    return 3.141593 * deg / 180.0;\n"
+"}\n"
+"vec2 radians (vec2 deg) {\n"
+"    return vec2 (radians (deg.x), radians (deg.y));\n"
+"}\n"
+"vec3 radians (vec3 deg) {\n"
+"    return vec3 (radians (deg.x), radians (deg.y), radians (deg.z));\n"
+"}\n"
+"vec4 radians (vec4 deg) {\n"
+"    return vec4 (radians (deg.x), radians (deg.y), radians (deg.z), radians (deg.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float degrees (float rad) {\n"
+"    return 180.0 * rad / 3.141593;\n"
+"}\n"
+"vec2 degrees (vec2 rad) {\n"
+"    return vec2 (degrees (rad.x), degrees (rad.y));\n"
+"}\n"
+"vec3 degrees (vec3 rad) {\n"
+"    return vec3 (degrees (rad.x), degrees (rad.y), degrees (rad.z));\n"
+"}\n"
+"vec4 degrees (vec4 rad) {\n"
+"    return vec4 (degrees (rad.x), degrees (rad.y), degrees (rad.z), degrees (rad.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float sin (float angle) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 sin (vec2 angle) {\n"
+"    return vec2 (sin (angle.x), sin (angle.y));\n"
+"}\n"
+"vec3 sin (vec3 angle) {\n"
+"    return vec3 (sin (angle.x), sin (angle.y), sin (angle.z));\n"
+"}\n"
+"vec4 sin (vec4 angle) {\n"
+"    return vec4 (sin (angle.x), sin (angle.y), sin (angle.z), sin (angle.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float cos (float angle) {\n"
+"    return sin (angle + 1.5708);\n"
+"}\n"
+"vec2 cos (vec2 angle) {\n"
+"    return vec2 (cos (angle.x), cos (angle.y));\n"
+"}\n"
+"vec3 cos (vec3 angle) {\n"
+"    return vec3 (cos (angle.x), cos (angle.y), cos (angle.z));\n"
+"}\n"
+"vec4 cos (vec4 angle) {\n"
+"    return vec4 (cos (angle.x), cos (angle.y), cos (angle.z), cos (angle.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float tan (float angle) {\n"
+"    return sin (angle) / cos (angle);\n"
+"}\n"
+"vec2 tan (vec2 angle) {\n"
+"    return vec2 (tan (angle.x), tan (angle.y));\n"
+"}\n"
+"vec3 tan (vec3 angle) {\n"
+"    return vec3 (tan (angle.x), tan (angle.y), tan (angle.z));\n"
+"}\n"
+"vec4 tan (vec4 angle) {\n"
+"    return vec4 (tan (angle.x), tan (angle.y), tan (angle.z), tan (angle.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float asin (float x) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 asin (vec2 x) {\n"
+"    return vec2 (asin (x.x), asin (x.y));\n"
+"}\n"
+"vec3 asin (vec3 x) {\n"
+"    return vec3 (asin (x.x), asin (x.y), asin (x.z));\n"
+"}\n"
+"vec4 asin (vec4 x) {\n"
+"    return vec4 (asin (x.x), asin (x.y), asin (x.z), asin (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float acos (float x) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 acos (vec2 x) {\n"
+"    return vec2 (acos (x.x), acos (x.y));\n"
+"}\n"
+"vec3 acos (vec3 x) {\n"
+"    return vec3 (acos (x.x), acos (x.y), acos (x.z));\n"
+"}\n"
+"vec4 acos (vec4 x) {\n"
+"    return vec4 (acos (x.x), acos (x.y), acos (x.z), acos (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float atan (float x, float y) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 atan (vec2 x, vec2 y) {\n"
+"    return vec2 (atan (x.x, y.x), atan (x.y, y.y));\n"
+"}\n"
+"vec3 atan (vec3 x, vec3 y) {\n"
+"    return vec3 (atan (x.x, y.x), atan (x.y, y.y), atan (x.z, y.z));\n"
+"}\n"
+"vec4 atan (vec4 x, vec4 y) {\n"
+"    return vec4 (atan (x.x, y.x), atan (x.y, y.y), atan (x.z, y.z), atan (x.w, y.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float atan (float y_over_x) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 atan (vec2 y_over_x) {\n"
+"    return vec2 (atan (y_over_x.x), atan (y_over_x.y));\n"
+"}\n"
+"vec3 atan (vec3 y_over_x) {\n"
+"    return vec3 (atan (y_over_x.x), atan (y_over_x.y), atan (y_over_x.z));\n"
+"}\n"
+"vec4 atan (vec4 y_over_x) {\n"
+"    return vec4 (atan (y_over_x.x), atan (y_over_x.y), atan (y_over_x.z), atan (y_over_x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float pow (float x, float y) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 pow (vec2 x, vec2 y) {\n"
+"    return vec2 (pow (x.x, y.x), pow (x.y, y.y));\n"
+"}\n"
+"vec3 pow (vec3 x, vec3 y) {\n"
+"    return vec3 (pow (x.x, y.x), pow (x.y, y.y), pow (x.z, y.z));\n"
+"}\n"
+"vec4 pow (vec4 x, vec4 y) {\n"
+"    return vec4 (pow (x.x, y.x), pow (x.y, y.y), pow (x.z, y.z), pow (x.w, y.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float exp (float x) {\n"
+"    return pow (2.71828183, x);\n"
+"}\n"
+"vec2 exp (vec2 x) {\n"
+"    return vec2 (exp (x.x), exp (x.y));\n"
+"}\n"
+"vec3 exp (vec3 x) {\n"
+"    return vec3 (exp (x.x), exp (x.y), exp (x.z));\n"
+"}\n"
+"vec4 exp (vec4 x) {\n"
+"    return vec4 (exp (x.x), exp (x.y), exp (x.z), exp (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float log (float x) {\n"
+"    return log2 (x) / log2 (2.71828183);\n"
+"}\n"
+"vec2 log (vec2 x) {\n"
+"    return vec2 (log (x.x), log (x.y));\n"
+"}\n"
+"vec3 log (vec3 x) {\n"
+"    return vec3 (log (x.x), log (x.y), log (x.z));\n"
+"}\n"
+"vec4 log (vec4 x) {\n"
+"    return vec4 (log (x.x), log (x.y), log (x.z), log (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float exp2 (float x) {\n"
+"    return pow (2.0, x);\n"
+"}\n"
+"vec2 exp2 (vec2 x) {\n"
+"    return vec2 (exp2 (x.x), exp2 (x.y));\n"
+"}\n"
+"vec3 exp2 (vec3 x) {\n"
+"    return vec3 (exp2 (x.x), exp2 (x.y), exp2 (x.z));\n"
+"}\n"
+"vec4 exp2 (vec4 x) {\n"
+"    return vec4 (exp2 (x.x), exp2 (x.y), exp2 (x.z), exp2 (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float log2 (float x) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 log2 (vec2 x) {\n"
+"    return vec2 (log2 (x.x), log2 (x.y));\n"
+"}\n"
+"vec3 log2 (vec3 x) {\n"
+"    return vec3 (log2 (x.x), log2 (x.y), log2 (x.z));\n"
+"}\n"
+"vec4 log2 (vec4 x) {\n"
+"    return vec4 (log2 (x.x), log2 (x.y), log2 (x.z), log2 (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float sqrt (float x) {\n"
+"    return pow (x, 0.5);\n"
+"}\n"
+"vec2 sqrt (vec2 x) {\n"
+"    return vec2 (sqrt (x.x), sqrt (x.y));\n"
+"}\n"
+"vec3 sqrt (vec3 x) {\n"
+"    return vec3 (sqrt (x.x), sqrt (x.y), sqrt (x.z));\n"
+"}\n"
+"vec4 sqrt (vec4 x) {\n"
+"    return vec4 (sqrt (x.x), sqrt (x.y), sqrt (x.z), sqrt (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float inversesqrt (float x) {\n"
+"    return 1.0 / sqrt (x);\n"
+"}\n"
+"vec2 inversesqrt (vec2 x) {\n"
+"    return vec2 (inversesqrt (x.x), inversesqrt (x.y));\n"
+"}\n"
+"vec3 inversesqrt (vec3 x) {\n"
+"    return vec3 (inversesqrt (x.x), inversesqrt (x.y), inversesqrt (x.z));\n"
+"}\n"
+"vec4 inversesqrt (vec4 x) {\n"
+"    return vec4 (inversesqrt (x.x), inversesqrt (x.y), inversesqrt (x.z), inversesqrt (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float abs (float x) {\n"
+"    return x >= 0.0 ? x : -x;\n"
+"}\n"
+"vec2 abs (vec2 x) {\n"
+"    return vec2 (abs (x.x), abs (x.y));\n"
+"}\n"
+"vec3 abs (vec3 x) {\n"
+"    return vec3 (abs (x.x), abs (x.y), abs (x.z));\n"
+"}\n"
+"vec4 abs (vec4 x) {\n"
+"    return vec4 (abs (x.x), abs (x.y), abs (x.z), abs (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float sign (float x) {\n"
+"    return x > 0.0 ? 1.0 : x < 0.0 ? -1.0 : 0.0;\n"
+"}\n"
+"vec2 sign (vec2 x) {\n"
+"    return vec2 (sign (x.x), sign (x.y));\n"
+"}\n"
+"vec3 sign (vec3 x) {\n"
+"    return vec3 (sign (x.x), sign (x.y), sign (x.z));\n"
+"}\n"
+"vec4 sign (vec4 x) {\n"
+"    return vec4 (sign (x.x), sign (x.y), sign (x.z), sign (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float floor (float x) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 floor (vec2 x) {\n"
+"    return vec2 (floor (x.x), floor (x.y));\n"
+"}\n"
+"vec3 floor (vec3 x) {\n"
+"    return vec3 (floor (x.x), floor (x.y), floor (x.z));\n"
+"}\n"
+"vec4 floor (vec4 x) {\n"
+"    return vec4 (floor (x.x), floor (x.y), floor (x.z), floor (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float ceil (float x) {\n"
+"    return 0.0;\n"
+"}\n"
+"vec2 ceil (vec2 x) {\n"
+"    return vec2 (ceil (x.x), ceil (x.y));\n"
+"}\n"
+"vec3 ceil (vec3 x) {\n"
+"    return vec3 (ceil (x.x), ceil (x.y), ceil (x.z));\n"
+"}\n"
+"vec4 ceil (vec4 x) {\n"
+"    return vec4 (ceil (x.x), ceil (x.y), ceil (x.z), ceil (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float fract (float x) {\n"
+"    return x - floor (x);\n"
+"}\n"
+"vec2 fract (vec2 x) {\n"
+"    return vec2 (fract (x.x), fract (x.y));\n"
+"}\n"
+"vec3 fract (vec3 x) {\n"
+"    return vec3 (fract (x.x), fract (x.y), fract (x.z));\n"
+"}\n"
+"vec4 fract (vec4 x) {\n"
+"    return vec4 (fract (x.x), fract (x.y), fract (x.z), fract (x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float mod (float x, float y) {\n"
+"    return x - y * floor (x / y);\n"
+"}\n"
+"vec2 mod (vec2 x, float y) {\n"
+"    return vec2 (mod (x.x, y), mod (x.y, y));\n"
+"}\n"
+"vec3 mod (vec3 x, float y) {\n"
+"    return vec3 (mod (x.x, y), mod (x.y, y), mod (x.z, y));\n"
+"}\n"
+"vec4 mod (vec4 x, float y) {\n"
+"    return vec4 (mod (x.x, y), mod (x.y, y), mod (x.z, y), mod (x.w, y));\n"
+"}\n"
+"vec2 mod (vec2 x, vec2 y) {\n"
+"    return vec2 (mod (x.x, y.x), mod (x.y, y.y));\n"
+"}\n"
+"vec3 mod (vec3 x, vec3 y) {\n"
+"    return vec3 (mod (x.x, y.x), mod (x.y, y.y), mod (x.z, y.z));\n"
+"}\n"
+"vec4 mod (vec4 x, vec4 y) {\n"
+"    return vec4 (mod (x.x, y.x), mod (x.y, y.y), mod (x.z, y.z), mod (x.w, y.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float min (float x, float y) {\n"
+"    return y < x ? y : x;\n"
+"}\n"
+"vec2 min (vec2 x, float y) {\n"
+"    return vec2 (min (x.x, y), min (x.y, y));\n"
+"}\n"
+"vec3 min (vec3 x, float y) {\n"
+"    return vec3 (min (x.x, y), min (x.y, y), min (x.z, y));\n"
+"}\n"
+"vec4 min (vec4 x, float y) {\n"
+"    return vec4 (min (x.x, y), min (x.y, y), min (x.z, y), min (x.w, y));\n"
+"}\n"
+"vec2 min (vec2 x, vec2 y) {\n"
+"    return vec2 (min (x.x, y.x), min (x.y, y.y));\n"
+"}\n"
+"vec3 min (vec3 x, vec3 y) {\n"
+"    return vec3 (min (x.x, y.x), min (x.y, y.y), min (x.z, y.z));\n"
+"}\n"
+"vec4 min (vec4 x, vec4 y) {\n"
+"    return vec4 (min (x.x, y.x), min (x.y, y.y), min (x.z, y.z), min (x.w, y.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float max (float x, float y) {\n"
+"    return min (y, x);\n"
+"}\n"
+"vec2 max (vec2 x, float y) {\n"
+"    return vec2 (max (x.x, y), max (x.y, y));\n"
+"}\n"
+"vec3 max (vec3 x, float y) {\n"
+"    return vec3 (max (x.x, y), max (x.y, y), max (x.z, y));\n"
+"}\n"
+"vec4 max (vec4 x, float y) {\n"
+"    return vec4 (max (x.x, y), max (x.y, y), max (x.z, y), max (x.w, y));\n"
+"}\n"
+"vec2 max (vec2 x, vec2 y) {\n"
+"    return vec2 (max (x.x, y.x), max (x.y, y.y));\n"
+"}\n"
+"vec3 max (vec3 x, vec3 y) {\n"
+"    return vec3 (max (x.x, y.x), max (x.y, y.y), max (x.z, y.z));\n"
+"}\n"
+"vec4 max (vec4 x, vec4 y) {\n"
+"    return vec4 (max (x.x, y.x), max (x.y, y.y), max (x.z, y.z), max (x.w, y.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float clamp (float x, float minVal, float maxVal) {\n"
+"    return min (max (x, minVal), maxVal);\n"
+"}\n"
+"vec2 clamp (vec2 x, float minVal, float maxVal) {\n"
+"    return vec2 (clamp (x.x, minVal, maxVal), clamp (x.y, minVal, maxVal));\n"
+"}\n"
+"vec3 clamp (vec3 x, float minVal, float maxVal) {\n"
+"    return vec3 (clamp (x.x, minVal, maxVal), clamp (x.y, minVal, maxVal),\n"
+"        clamp (x.z, minVal, maxVal));\n"
+"}\n"
+"vec4 clamp (vec4 x, float minVal, float maxVal) {\n"
+"    return vec4 (clamp (x.x, minVal, maxVal), clamp (x.y, minVal, maxVal),\n"
+"        clamp (x.z, minVal, maxVal), clamp (x.w, minVal, maxVal));\n"
+"}\n"
+"vec2 clamp (vec2 x, vec2 minVal, vec2 maxVal) {\n"
+"    return vec2 (clamp (x.x, minVal.x, maxVal.x), clamp (x.y, minVal.y, maxVal.y));\n"
+"}\n"
+"vec3 clamp (vec3 x, vec3 minVal, vec3 maxVal) {\n"
+"    return vec3 (clamp (x.x, minVal.x, maxVal.x), clamp (x.y, minVal.y, maxVal.y),\n"
+"        clamp (x.z, minVal.z, maxVal.z));\n"
+"}\n"
+"vec4 clamp (vec4 x, vec4 minVal, vec4 maxVal) {\n"
+"    return vec4 (clamp (x.x, minVal.x, maxVal.y), clamp (x.y, minVal.y, maxVal.y),\n"
+"        clamp (x.z, minVal.z, maxVal.z), clamp (x.w, minVal.w, maxVal.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float mix (float x, float y, float a) {\n"
+"    return x * (1.0 - a) + y * a;\n"
+"}\n"
+"vec2 mix (vec2 x, vec2 y, float a) {\n"
+"    return vec2 (mix (x.x, y.x, a), mix (x.y, y.y, a));\n"
+"}\n"
+"vec3 mix (vec3 x, vec3 y, float a) {\n"
+"    return vec3 (mix (x.x, y.x, a), mix (x.y, y.y, a), mix (x.z, y.z, a));\n"
+"}\n"
+"vec4 mix (vec4 x, vec4 y, float a) {\n"
+"    return vec4 (mix (x.x, y.x, a), mix (x.y, y.y, a), mix (x.z, y.z, a), mix (x.w, y.w, a));\n"
+"}\n"
+"vec2 mix (vec2 x, vec2 y, vec2 a) {\n"
+"    return vec2 (mix (x.x, y.x, a.x), mix (x.y, y.y, a.y));\n"
+"}\n"
+"vec3 mix (vec3 x, vec3 y, vec3 a) {\n"
+"    return vec3 (mix (x.x, y.x, a.x), mix (x.y, y.y, a.y), mix (x.z, y.z, a.z));\n"
+"}\n"
+"vec4 mix (vec4 x, vec4 y, vec4 a) {\n"
+"    return vec4 (mix (x.x, y.x, a.x), mix (x.y, y.y, a.y), mix (x.z, y.z, a.z),\n"
+"        mix (x.w, y.w, a.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float step (float edge, float x) {\n"
+"    return x < edge ? 0.0 : 1.0;\n"
+"}\n"
+"vec2 step (float edge, vec2 x) {\n"
+"    return vec2 (step (edge, x.x), step (edge, x.y));\n"
+"}\n"
+"vec3 step (float edge, vec3 x) {\n"
+"    return vec3 (step (edge, x.x), step (edge, x.y), step (edge, x.z));\n"
+"}\n"
+"vec4 step (float edge, vec4 x) {\n"
+"    return vec4 (step (edge, x.x), step (edge, x.y), step (edge, x.z), step (edge, x.w));\n"
+"}\n"
+"vec2 step (vec2 edge, vec2 x) {\n"
+"    return vec2 (step (edge.x, x.x), step (edge.y, x.y));\n"
+"}\n"
+"vec3 step (vec3 edge, vec3 x) {\n"
+"    return vec3 (step (edge.x, x.x), step (edge.y, x.y), step (edge.z, x.z));\n"
+"}\n"
+"vec4 step (vec4 edge, vec4 x) {\n"
+"    return vec4 (step (edge.x, x.x), step (edge.y, x.y), step (edge.z, x.z), step (edge.w, x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float smoothstep (float edge0, float edge1, float x) {\n"
+"    const float t = clamp ((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n"
+"    return t * t * (3.0 - 2.0 * t);\n"
+"}\n"
+"vec2 smoothstep (float edge0, float edge1, vec2 x) {\n"
+"    return vec2 (smoothstep (edge0, edge1, x.x), smoothstep (edge0, edge1, x.y));\n"
+"}\n"
+"vec3 smoothstep (float edge0, float edge1, vec3 x) {\n"
+"    return vec3 (smoothstep (edge0, edge1, x.x), smoothstep (edge0, edge1, x.y),\n"
+"        smoothstep (edge0, edge1, x.z));\n"
+"}\n"
+"vec4 smoothstep (float edge0, float edge1, vec4 x) {\n"
+"    return vec4 (smoothstep (edge0, edge1, x.x), smoothstep (edge0, edge1, x.y),\n"
+"        smoothstep (edge0, edge1, x.z), smoothstep (edge0, edge1, x.w));\n"
+"}\n"
+"vec2 smoothstep (vec2 edge0, vec2 edge1, vec2 x) {\n"
+"    return vec2 (smoothstep (edge0.x, edge1.x, x.x), smoothstep (edge0.y, edge1.y, x.y));\n"
+"}\n"
+"vec3 smoothstep (vec3 edge0, vec3 edge1, vec3 x) {\n"
+"    return vec3 (smoothstep (edge0.x, edge1.x, x.x), smoothstep (edge0.y, edge1.y, x.y),\n"
+"        smoothstep (edge0.z, edge1.z, x.z));\n"
+"}\n"
+"vec4 smoothstep (vec4 edge0, vec4 edge1, vec4 x) {\n"
+"    return vec4 (smoothstep (edge0.x, edge1.x, x.x), smoothstep (edge0.y, edge1.y, x.y),\n"
+"        smoothstep (edge0.z, edge1.z, x.z), smoothstep (edge0.w, edge1.w, x.w));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float dot (float x, float y) {\n"
+"    return x * y;\n"
+"}\n"
+"float dot (vec2 x, vec2 y) {\n"
+"    return dot (x.x, y.x) + dot (x.y, y.y);\n"
+"}\n"
+"float dot (vec3 x, vec3 y) {\n"
+"    return dot (x.x, y.x) + dot (x.y, y.y) + dot (x.z, y.z);\n"
+"}\n"
+"float dot (vec4 x, vec4 y) {\n"
+"    return dot (x.x, y.x) + dot (x.y, y.y) + dot (x.z, y.z) + dot (x.w, y.w);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float length (float x) {\n"
+"    return sqrt (dot (x, x));\n"
+"}\n"
+"float length (vec2 x) {\n"
+"    return sqrt (dot (x, x));\n"
+"}\n"
+"float length (vec3 x) {\n"
+"    return sqrt (dot (x, x));\n"
+"}\n"
+"float length (vec4 x) {\n"
+"    return sqrt (dot (x, x));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float distance (float x, float y) {\n"
+"    return length (x - y);\n"
+"}\n"
+"float distance (vec2 x, vec2 y) {\n"
+"    return length (x - y);\n"
+"}\n"
+"float distance (vec3 x, vec3 y) {\n"
+"    return length (x - y);\n"
+"}\n"
+"float distance (vec4 x, vec4 y) {\n"
+"    return length (x - y);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec3 cross (vec3 x, vec3 y) {\n"
+"    return vec3 (x.y * y.z - y.y * x.z, x.z * y.x - y.z * x.x, x.x * y.y - y.x * x.y);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float normalize (float x) {\n"
+"    return 1.0;\n"
+"}\n"
+"vec2 normalize (vec2 x) {\n"
+"    return x / length (x);\n"
+"}\n"
+"vec3 normalize (vec3 x) {\n"
+"    return x / length (x);\n"
+"}\n"
+"vec4 normalize (vec4 x) {\n"
+"    return x / length (x);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float faceforward (float N, float I, float Nref) {\n"
+"    return dot (Nref, I) < 0.0 ? N : -N;\n"
+"}\n"
+"vec2 faceforward (vec2 N, vec2 I, vec2 Nref) {\n"
+"    return dot (Nref, I) < 0.0 ? N : -N;\n"
+"}\n"
+"vec3 faceforward (vec3 N, vec3 I, vec3 Nref) {\n"
+"    return dot (Nref, I) < 0.0 ? N : -N;\n"
+"}\n"
+"vec4 faceforward (vec4 N, vec4 I, vec4 Nref) {\n"
+"    return dot (Nref, I) < 0.0 ? N : -N;\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float reflect (float I, float N) {\n"
+"    return I - 2.0 * dot (N, I) * N;\n"
+"}\n"
+"vec2 reflect (vec2 I, vec2 N) {\n"
+"    return I - 2.0 * dot (N, I) * N;\n"
+"}\n"
+"vec3 reflect (vec3 I, vec3 N) {\n"
+"    return I - 2.0 * dot (N, I) * N;\n"
+"}\n"
+"vec4 reflect (vec4 I, vec4 N) {\n"
+"    return I - 2.0 * dot (N, I) * N;\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float refract (float I, float N, float eta) {\n"
+"    const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));\n"
+"    if (k < 0.0)\n"
+"        return 0.0;\n"
+"    return eta * I - (eta * dot (N, I) + sqrt (k)) * N;\n"
+"}\n"
+"vec2 refract (vec2 I, vec2 N, float eta) {\n"
+"    const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));\n"
+"    if (k < 0.0)\n"
+"        return vec2 (0.0);\n"
+"    return eta * I - (eta * dot (N, I) + sqrt (k)) * N;\n"
+"}\n"
+"vec3 refract (vec3 I, vec3 N, float eta) {\n"
+"    const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));\n"
+"    if (k < 0.0)\n"
+"        return vec3 (0.0);\n"
+"    return eta * I - (eta * dot (N, I) + sqrt (k)) * N;\n"
+"}\n"
+"vec4 refract (vec4 I, vec4 N, float eta) {\n"
+"    const float k = 1.0 - eta * eta * (1.0 - dot (N, I) * dot (N, I));\n"
+"    if (k < 0.0)\n"
+"        return vec4 (0.0);\n"
+"    return eta * I - (eta * dot (N, I) + sqrt (k)) * N;\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"mat2 matrixCompMult (mat2 x, mat2 y) {\n"
+"    return mat2 (\n"
+"        x[0].x * y[0].x, x[0].y * y[0].y,\n"
+"        x[1].x * y[1].x, x[1].y * y[1].y\n"
+"    );\n"
+"}\n"
+"mat3 matrixCompMult (mat3 x, mat3 y) {\n"
+"    return mat4 (\n"
+"        x[0].x * y[0].x, x[0].y * y[0].y, x[0].z * y[0].z,\n"
+"        x[1].x * y[1].x, x[1].y * y[1].y, x[1].z * y[1].z,\n"
+"        x[2].x * y[2].x, x[2].y * y[2].y, x[2].z * y[2].z\n"
+"    );\n"
+"}\n"
+"mat4 matrixCompMult (mat4 x, mat4 y) {\n"
+"    return mat4 (\n"
+"        x[0].x * y[0].x, x[0].y * y[0].y, x[0].z * y[0].z + x[0].w * y[0].w,\n"
+"        x[1].x * y[1].x, x[1].y * y[1].y, x[1].z * y[1].z + x[1].w * y[1].w,\n"
+"        x[2].x * y[2].x, x[2].y * y[2].y, x[2].z * y[2].z + x[2].w * y[2].w,\n"
+"        x[3].x * y[3].x, x[3].y * y[3].y, x[3].z * y[3].z + x[3].w * y[3].w\n"
+"    );\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bvec2 lessThan (vec2 x, vec2 y) {\n"
+"    return bvec2 (x.x < y.x, x.y < y.y);\n"
+"}\n"
+"bvec3 lessThan (vec3 x, vec3 y) {\n"
+"    return bvec3 (x.x < y.x, x.y < y.y, x.z < y.z);\n"
+"}\n"
+"bvec4 lessThan (vec4 x, vec4 y) {\n"
+"    return bvec4 (x.x < y.x, x.y < y.y, x.z < y.z, x.w < y.w);\n"
+"}\n"
+"bvec2 lessThan (ivec2 x, ivec2 y) {\n"
+"    return bvec2 (x.x < y.x, x.y < y.y);\n"
+"}\n"
+"bvec3 lessThan (ivec3 x, ivec3 y) {\n"
+"    return bvec3 (x.x < y.x, x.y < y.y, x.z < y.z);\n"
+"}\n"
+"bvec4 lessThan (ivec4 x, ivec4 y) {\n"
+"    return bvec4 (x.x < y.x, x.y < y.y, x.z < y.z, x.w < y.w);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bvec2 lessThanEqual (vec2 x, vec2 y) {\n"
+"    return bvec2 (x.x <= y.x, x.y <= y.y);\n"
+"}\n"
+"bvec3 lessThanEqual (vec3 x, vec3 y) {\n"
+"    return bvec3 (x.x <= y.x, x.y <= y.y, x.z <= y.z);\n"
+"}\n"
+"bvec4 lessThanEqual (vec4 x, vec4 y) {\n"
+"    return bvec4 (x.x <= y.x, x.y <= y.y, x.z <= y.z, x.w <= y.w);\n"
+"}\n"
+"bvec2 lessThanEqual (ivec2 x, ivec2 y) {\n"
+"    return bvec2 (x.x <= y.x, x.y <= y.y);\n"
+"}\n"
+"bvec3 lessThanEqual (ivec3 x, ivec3 y) {\n"
+"    return bvec3 (x.x <= y.x, x.y <= y.y, x.z <= y.z);\n"
+"}\n"
+"bvec4 lessThanEqual (ivec4 x, ivec4 y) {\n"
+"    return bvec4 (x.x <= y.x, x.y <= y.y, x.z <= y.z, x.w <= y.w);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bvec2 greaterThan (vec2 x, vec2 y) {\n"
+"    return bvec2 (x.x > y.x, x.y > y.y);\n"
+"}\n"
+"bvec3 greaterThan (vec3 x, vec3 y) {\n"
+"    return bvec3 (x.x > y.x, x.y > y.y, x.z > y.z);\n"
+"}\n"
+"bvec4 greaterThan (vec4 x, vec4 y) {\n"
+"    return bvec4 (x.x > y.x, x.y > y.y, x.z > y.z, x.w > y.w);\n"
+"}\n"
+"bvec2 greaterThan (ivec2 x, ivec2 y) {\n"
+"    return bvec2 (x.x > y.x, x.y > y.y);\n"
+"}\n"
+"bvec3 greaterThan (ivec3 x, ivec3 y) {\n"
+"    return bvec3 (x.x > y.x, x.y > y.y, x.z > y.z);\n"
+"}\n"
+"bvec4 greaterThan (ivec4 x, ivec4 y) {\n"
+"    return bvec4 (x.x > y.x, x.y > y.y, x.z > y.z, x.w > y.w);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bvec2 greaterThanEqual (vec2 x, vec2 y) {\n"
+"    return bvec2 (x.x >= y.x, x.y >= y.y);\n"
+"}\n"
+"bvec3 greaterThanEqual (vec3 x, vec3 y) {\n"
+"    return bvec3 (x.x >= y.x, x.y >= y.y, x.z >= y.z);\n"
+"}\n"
+"bvec4 greaterThanEqual (vec4 x, vec4 y) {\n"
+"    return bvec4 (x.x >= y.x, x.y >= y.y, x.z >= y.z, x.w >= y.w);\n"
+"}\n"
+"bvec2 greaterThanEqual (ivec2 x, ivec2 y) {\n"
+"    return bvec2 (x.x >= y.x, x.y >= y.y);\n"
+"}\n"
+"bvec3 greaterThanEqual (ivec3 x, ivec3 y) {\n"
+"    return bvec3 (x.x >= y.x, x.y >= y.y, x.z >= y.z);\n"
+"}\n"
+"bvec4 greaterThanEqual (ivec4 x, ivec4 y) {\n"
+"    return bvec4 (x.x >= y.x, x.y >= y.y, x.z >= y.z, x.w >= y.w);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bvec2 equal (vec2 x, vec2 y) {\n"
+"    return bvec2 (x.x == y.x, x.y == y.y);\n"
+"}\n"
+"bvec3 equal (vec3 x, vec3 y) {\n"
+"    return bvec3 (x.x == y.x, x.y == y.y, x.z == y.z);\n"
+"}\n"
+"bvec4 equal (vec4 x, vec4 y) {\n"
+"    return bvec4 (x.x == y.x, x.y == y.y, x.z == y.z, x.w == y.w);\n"
+"}\n"
+"bvec2 equal (ivec2 x, ivec2 y) {\n"
+"    return bvec2 (x.x == y.x, x.y == y.y);\n"
+"}\n"
+"bvec3 equal (ivec3 x, ivec3 y) {\n"
+"    return bvec3 (x.x == y.x, x.y == y.y, x.z == y.z);\n"
+"}\n"
+"bvec4 equal (ivec4 x, ivec4 y) {\n"
+"    return bvec4 (x.x == y.x, x.y == y.y, x.z == y.z, x.w == y.w);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bvec2 notEqual (vec2 x, vec2 y) {\n"
+"    return bvec2 (x.x != y.x, x.y != y.y);\n"
+"}\n"
+"bvec3 notEqual (vec3 x, vec3 y) {\n"
+"    return bvec3 (x.x != y.x, x.y != y.y, x.z != y.z);\n"
+"}\n"
+"bvec4 notEqual (vec4 x, vec4 y) {\n"
+"    return bvec4 (x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);\n"
+"}\n"
+"bvec2 notEqual (ivec2 x, ivec2 y) {\n"
+"    return bvec2 (x.x != y.x, x.y != y.y);\n"
+"}\n"
+"bvec3 notEqual (ivec3 x, ivec3 y) {\n"
+"    return bvec3 (x.x != y.x, x.y != y.y, x.z != y.z);\n"
+"}\n"
+"bvec4 notEqual (ivec4 x, ivec4 y) {\n"
+"    return bvec4 (x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bool any (bvec2 x) {\n"
+"    return x.x || x.y;\n"
+"}\n"
+"bool any (bvec3 x) {\n"
+"    return x.x || x.y || x.z;\n"
+"}\n"
+"bool any (bvec4 x) {\n"
+"    return x.x || x.y || x.z || x.w;\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bool all (bvec2 x) {\n"
+"    return x.x && x.y;\n"
+"}\n"
+"bool all (bvec3 x) {\n"
+"    return x.x && x.y && x.z;\n"
+"}\n"
+"bool all (bvec4 x) {\n"
+"    return x.x && x.y && x.z && x.w;\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"bvec2 not (bvec2 x) {\n"
+"    return bvec2 (!x.x, !x.y);\n"
+"}\n"
+"bvec3 not (bvec3 x) {\n"
+"    return bvec3 (!x.x, !x.y, !x.z);\n"
+"}\n"
+"bvec4 not (bvec4 x) {\n"
+"    return bvec4 (!x.x, !x.y, !x.z, !x.w);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec4 texture1D (sampler1D sampler, float coord) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"vec4 texture1DProj (sampler1D sampler, vec2 coord) {\n"
+"    return texture1D (sampler, coord.s / coord.t);\n"
+"}\n"
+"vec4 texture1DProj (sampler1D sampler, vec4 coord) {\n"
+"    return texture1D (sampler, coord.s / coord.q);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec4 texture2D (sampler2D sampler, vec2 coord) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"vec4 texture2DProj (sampler2D sampler, vec3 coord) {\n"
+"    return texture2D (sampler, vec2 (coord.s / coord.p, coord.t / coord.p));\n"
+"}\n"
+"vec4 texture2DProj (sampler2D sampler, vec4 coord) {\n"
+"    return texture2D (sampler, vec2 (coord.s / coord.q, coord.t / coord.q));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec4 texture3D (sampler3D sampler, vec3 coord) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"vec4 texture3DProj (sampler3D sampler, vec4 coord) {\n"
+"    return texture3D (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec4 textureCube (samplerCube sampler, vec3 coord) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec4 shadow1D (sampler1DShadow sampler, vec3 coord) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"\n"
+"vec4 shadow2D (sampler2DShadow sampler, vec3 coord) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"vec4 shadow1DProj (sampler1DShadow sampler, vec4 coord) {\n"
+"    return shadow1D (sampler, vec3 (coord.s / coord.q, 0.0, coord.p / coord.q));\n"
+"}\n"
+"vec4 shadow2DProj (sampler2DShadow sampler, vec4 coord) {\n"
+"    return shadow2D (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q));\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"float noise1 (float x) {\n"
+"    return 0.0;\n"
+"}\n"
+"\n"
+"float noise1 (vec2 x) {\n"
+"    return 0.0;\n"
+"}\n"
+"\n"
+"float noise1 (vec3 x) {\n"
+"    return 0.0;\n"
+"}\n"
+"\n"
+"float noise1 (vec4 x) {\n"
+"    return 0.0;\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec2 noise2 (float x) {\n"
+"    return vec2 (0.0);\n"
+"}\n"
+"\n"
+"vec2 noise2 (vec2 x) {\n"
+"    return vec2 (0.0);\n"
+"}\n"
+"\n"
+"vec2 noise2 (vec3 x) {\n"
+"    return vec2 (0.0);\n"
+"}\n"
+"\n"
+"vec2 noise2 (vec4 x) {\n"
+"    return vec2 (0.0);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec3 noise3 (float x) {\n"
+"    return vec3 (0.0);\n"
+"}\n"
+"\n"
+"vec3 noise3 (vec2 x) {\n"
+"    return vec3 (0.0);\n"
+"}\n"
+"\n"
+"vec3 noise3 (vec3 x) {\n"
+"    return vec3 (0.0);\n"
+"}\n"
+"\n"
+"vec3 noise3 (vec4 x) {\n"
+"    return vec3 (0.0);\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"vec4 noise4 (float x) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"\n"
+"vec4 noise4 (vec2 x) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"\n"
+"vec4 noise4 (vec3 x) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"\n"
+"vec4 noise4 (vec4 x) {\n"
+"    return vec4 (0.0);\n"
+"}\n"
+"\n"