summaryrefslogtreecommitdiff
path: root/shaders
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2013-04-09 11:28:31 -0700
committerEric Anholt <eric@anholt.net>2013-04-09 11:28:31 -0700
commite83b31b23b2c90fbe4e7d1c8b1a0d90adf1d2520 (patch)
tree1209192d058174ba6be6246ec8286136b4636fae /shaders
parent08dc04697010faa80a949200577cae01ffb27202 (diff)
Convert warsow to .shader_tests.
Diffstat (limited to 'shaders')
-rw-r--r--shaders/warsow/1.frag342
-rw-r--r--shaders/warsow/1.shader_test689
-rw-r--r--shaders/warsow/1.vert342
-rw-r--r--shaders/warsow/10.frag342
-rw-r--r--shaders/warsow/10.shader_test697
-rw-r--r--shaders/warsow/10.vert342
-rw-r--r--shaders/warsow/11.frag344
-rw-r--r--shaders/warsow/11.vert344
-rw-r--r--shaders/warsow/12.frag345
-rw-r--r--shaders/warsow/12.vert345
-rw-r--r--shaders/warsow/13.frag346
-rw-r--r--shaders/warsow/13.shader_test693
-rw-r--r--shaders/warsow/13.vert346
-rw-r--r--shaders/warsow/14.frag344
-rw-r--r--shaders/warsow/14.vert344
-rw-r--r--shaders/warsow/15.frag151
-rw-r--r--shaders/warsow/15.vert151
-rw-r--r--shaders/warsow/16.frag110
-rw-r--r--shaders/warsow/16.shader_test307
-rw-r--r--shaders/warsow/16.vert110
-rw-r--r--shaders/warsow/17.frag49
-rw-r--r--shaders/warsow/17.vert49
-rw-r--r--shaders/warsow/18.frag63
-rw-r--r--shaders/warsow/18.vert63
-rw-r--r--shaders/warsow/19.frag345
-rw-r--r--shaders/warsow/19.shader_test225
-rw-r--r--shaders/warsow/19.vert345
-rw-r--r--shaders/warsow/2.frag344
-rw-r--r--shaders/warsow/2.vert344
-rw-r--r--shaders/warsow/20.frag342
-rw-r--r--shaders/warsow/20.vert342
-rw-r--r--shaders/warsow/21.frag344
-rw-r--r--shaders/warsow/21.vert344
-rw-r--r--shaders/warsow/22.frag345
-rw-r--r--shaders/warsow/22.shader_test103
-rw-r--r--shaders/warsow/22.vert345
-rw-r--r--shaders/warsow/23.frag346
-rw-r--r--shaders/warsow/23.vert346
-rw-r--r--shaders/warsow/24.frag344
-rw-r--r--shaders/warsow/24.vert344
-rw-r--r--shaders/warsow/25.frag151
-rw-r--r--shaders/warsow/25.shader_test132
-rw-r--r--shaders/warsow/25.vert151
-rw-r--r--shaders/warsow/26.frag110
-rw-r--r--shaders/warsow/26.vert110
-rw-r--r--shaders/warsow/27.frag49
-rw-r--r--shaders/warsow/27.vert49
-rw-r--r--shaders/warsow/28.frag63
-rw-r--r--shaders/warsow/28.vert63
-rw-r--r--shaders/warsow/3.frag345
-rw-r--r--shaders/warsow/3.vert345
-rw-r--r--shaders/warsow/30.shader_test26
-rw-r--r--shaders/warsow/31.shader_test689
-rw-r--r--shaders/warsow/34.shader_test693
-rw-r--r--shaders/warsow/37.shader_test695
-rw-r--r--shaders/warsow/4.frag346
-rw-r--r--shaders/warsow/4.shader_test693
-rw-r--r--shaders/warsow/4.vert346
-rw-r--r--shaders/warsow/40.shader_test697
-rw-r--r--shaders/warsow/43.shader_test693
-rw-r--r--shaders/warsow/46.shader_test307
-rw-r--r--shaders/warsow/49.shader_test225
-rw-r--r--shaders/warsow/5.frag344
-rw-r--r--shaders/warsow/5.vert344
-rw-r--r--shaders/warsow/52.shader_test103
-rw-r--r--shaders/warsow/55.shader_test140
-rw-r--r--shaders/warsow/6.frag151
-rw-r--r--shaders/warsow/6.vert151
-rw-r--r--shaders/warsow/60.shader_test17
-rw-r--r--shaders/warsow/63.shader_test22
-rw-r--r--shaders/warsow/64.shader_test696
-rw-r--r--shaders/warsow/67.shader_test689
-rw-r--r--shaders/warsow/7.frag110
-rw-r--r--shaders/warsow/7.shader_test695
-rw-r--r--shaders/warsow/7.vert110
-rw-r--r--shaders/warsow/70.shader_test693
-rw-r--r--shaders/warsow/73.shader_test695
-rw-r--r--shaders/warsow/76.shader_test697
-rw-r--r--shaders/warsow/79.shader_test693
-rw-r--r--shaders/warsow/8.frag49
-rw-r--r--shaders/warsow/8.vert49
-rw-r--r--shaders/warsow/82.shader_test307
-rw-r--r--shaders/warsow/85.shader_test225
-rw-r--r--shaders/warsow/88.shader_test103
-rw-r--r--shaders/warsow/9.frag63
-rw-r--r--shaders/warsow/91.shader_test (renamed from shaders/warsow/9.vert)14
86 files changed, 13343 insertions, 13201 deletions
diff --git a/shaders/warsow/1.frag b/shaders/warsow/1.frag
deleted file mode 100644
index dce1c71..0000000
--- a/shaders/warsow/1.frag
+++ /dev/null
@@ -1,342 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/1.shader_test b/shaders/warsow/1.shader_test
new file mode 100644
index 0000000..f005219
--- /dev/null
+++ b/shaders/warsow/1.shader_test
@@ -0,0 +1,689 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/1.vert b/shaders/warsow/1.vert
deleted file mode 100644
index 7cbe02c..0000000
--- a/shaders/warsow/1.vert
+++ /dev/null
@@ -1,342 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/10.frag b/shaders/warsow/10.frag
deleted file mode 100644
index dce1c71..0000000
--- a/shaders/warsow/10.frag
+++ /dev/null
@@ -1,342 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/10.shader_test b/shaders/warsow/10.shader_test
new file mode 100644
index 0000000..de4bd35
--- /dev/null
+++ b/shaders/warsow/10.shader_test
@@ -0,0 +1,697 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+#define APPLY_AMBIENT_COMPENSATION
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+#define APPLY_AMBIENT_COMPENSATION
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/10.vert b/shaders/warsow/10.vert
deleted file mode 100644
index 7cbe02c..0000000
--- a/shaders/warsow/10.vert
+++ /dev/null
@@ -1,342 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/11.frag b/shaders/warsow/11.frag
deleted file mode 100644
index 4b7ece2..0000000
--- a/shaders/warsow/11.frag
+++ /dev/null
@@ -1,344 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/11.vert b/shaders/warsow/11.vert
deleted file mode 100644
index d34482c..0000000
--- a/shaders/warsow/11.vert
+++ /dev/null
@@ -1,344 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/12.frag b/shaders/warsow/12.frag
deleted file mode 100644
index 00a170c..0000000
--- a/shaders/warsow/12.frag
+++ /dev/null
@@ -1,345 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/12.vert b/shaders/warsow/12.vert
deleted file mode 100644
index 2ddc43a..0000000
--- a/shaders/warsow/12.vert
+++ /dev/null
@@ -1,345 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/13.frag b/shaders/warsow/13.frag
deleted file mode 100644
index f106fbe..0000000
--- a/shaders/warsow/13.frag
+++ /dev/null
@@ -1,346 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-#define APPLY_AMBIENT_COMPENSATION
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/13.shader_test b/shaders/warsow/13.shader_test
new file mode 100644
index 0000000..4a2358e
--- /dev/null
+++ b/shaders/warsow/13.shader_test
@@ -0,0 +1,693 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_DIRECTIONAL_LIGHT
+#define APPLY_CELLSHADING
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_DIRECTIONAL_LIGHT
+#define APPLY_CELLSHADING
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/13.vert b/shaders/warsow/13.vert
deleted file mode 100644
index 4fe15fd..0000000
--- a/shaders/warsow/13.vert
+++ /dev/null
@@ -1,346 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-#define APPLY_AMBIENT_COMPENSATION
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/14.frag b/shaders/warsow/14.frag
deleted file mode 100644
index 4292f6c..0000000
--- a/shaders/warsow/14.frag
+++ /dev/null
@@ -1,344 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_DIRECTIONAL_LIGHT
-#define APPLY_CELLSHADING
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/14.vert b/shaders/warsow/14.vert
deleted file mode 100644
index 78f8084..0000000
--- a/shaders/warsow/14.vert
+++ /dev/null
@@ -1,344 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_DIRECTIONAL_LIGHT
-#define APPLY_CELLSHADING
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/15.frag b/shaders/warsow/15.frag
deleted file mode 100644
index af536af..0000000
--- a/shaders/warsow/15.frag
+++ /dev/null
@@ -1,151 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 TexCoord;
-varying vec4 ProjVector;
-#ifdef APPLY_EYEDOT
-varying vec3 EyeVector;
-#endif
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-#ifdef APPLY_EYEDOT
-uniform vec3 EyeOrigin;
-uniform float FrontPlane;
-#endif
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-textureMatrix = gl_TextureMatrix[0];
-textureMatrix[0] = -textureMatrix[0];
-textureMatrix[1] = -textureMatrix[1];
-TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-#ifdef APPLY_EYEDOT
-mat3 strMatrix;
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-gl_Position = ftransform();
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_DUDV
-uniform sampler2D DuDvMapTexture;
-#endif
-
-#ifdef APPLY_EYEDOT
-uniform sampler2D NormalmapTexture;
-#endif
-uniform sampler2D ReflectionTexture;
-uniform sampler2D RefractionTexture;
-uniform float TextureWidth, TextureHeight;
-
-void main(void)
-{
-myhalf3 color;
-
-#ifdef APPLY_DUDV
-vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
-vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
-
-vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
-#else
-vec3 fdist = vec3(0.0);
-#endif
-
-// get projective texcoords
-float scale = float(1.0 / float(ProjVector.w));
-float inv2NW = 1.0 / (2.0 * float (TextureWidth));
-float inv2NH = 1.0 / (2.0 * float (TextureHeight));
-vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
-projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
-projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
-
-
-myhalf3 refr = myhalf3(0.0);
-myhalf3 refl = myhalf3(0.0);
-
-#ifdef APPLY_EYEDOT
-// calculate dot product between the surface normal and eye vector
-// great for simulating varying water translucency based on the view angle
-myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
-vec3 eyeNormal = normalize(myhalf3(EyeVector));
-
-float refrdot = float(dot(surfaceNormal, eyeNormal));
-//refrdot = float (clamp (refrdot, 0.0, 1.0));
-float refldot = 1.0 - refrdot;
-// get refraction and reflection
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
-#endif
-
-#else
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
-#endif
-
-#endif
-
-// add reflection and refraction
-#ifdef APPLY_DISTORTION_ALPHA
-color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
-#else
-color = myhalf3(gl_Color.rgb) + refr + refl;
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),1.0);
-#else
-gl_FragColor = vec4(vec3(color),1.0);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/15.vert b/shaders/warsow/15.vert
deleted file mode 100644
index 6ee1e1e..0000000
--- a/shaders/warsow/15.vert
+++ /dev/null
@@ -1,151 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 TexCoord;
-varying vec4 ProjVector;
-#ifdef APPLY_EYEDOT
-varying vec3 EyeVector;
-#endif
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-#ifdef APPLY_EYEDOT
-uniform vec3 EyeOrigin;
-uniform float FrontPlane;
-#endif
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-textureMatrix = gl_TextureMatrix[0];
-textureMatrix[0] = -textureMatrix[0];
-textureMatrix[1] = -textureMatrix[1];
-TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-#ifdef APPLY_EYEDOT
-mat3 strMatrix;
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-gl_Position = ftransform();
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_DUDV
-uniform sampler2D DuDvMapTexture;
-#endif
-
-#ifdef APPLY_EYEDOT
-uniform sampler2D NormalmapTexture;
-#endif
-uniform sampler2D ReflectionTexture;
-uniform sampler2D RefractionTexture;
-uniform float TextureWidth, TextureHeight;
-
-void main(void)
-{
-myhalf3 color;
-
-#ifdef APPLY_DUDV
-vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
-vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
-
-vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
-#else
-vec3 fdist = vec3(0.0);
-#endif
-
-// get projective texcoords
-float scale = float(1.0 / float(ProjVector.w));
-float inv2NW = 1.0 / (2.0 * float (TextureWidth));
-float inv2NH = 1.0 / (2.0 * float (TextureHeight));
-vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
-projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
-projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
-
-
-myhalf3 refr = myhalf3(0.0);
-myhalf3 refl = myhalf3(0.0);
-
-#ifdef APPLY_EYEDOT
-// calculate dot product between the surface normal and eye vector
-// great for simulating varying water translucency based on the view angle
-myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
-vec3 eyeNormal = normalize(myhalf3(EyeVector));
-
-float refrdot = float(dot(surfaceNormal, eyeNormal));
-//refrdot = float (clamp (refrdot, 0.0, 1.0));
-float refldot = 1.0 - refrdot;
-// get refraction and reflection
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
-#endif
-
-#else
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
-#endif
-
-#endif
-
-// add reflection and refraction
-#ifdef APPLY_DISTORTION_ALPHA
-color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
-#else
-color = myhalf3(gl_Color.rgb) + refr + refl;
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),1.0);
-#else
-gl_FragColor = vec4(vec3(color),1.0);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/16.frag b/shaders/warsow/16.frag
deleted file mode 100644
index d917740..0000000
--- a/shaders/warsow/16.frag
+++ /dev/null
@@ -1,110 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-
-gl_Position = ftransform();
-ProjVector = textureMatrix * gl_Vertex;
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform myhalf3 LightAmbient;
-
-uniform float TextureWidth, TextureHeight;
-uniform float ProjDistance;
-uniform sampler2DShadow ShadowmapTexture;
-
-void main(void)
-{
-myhalf color = myhalf(1.0);
-
-if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
-discard;
-
-float dtW = 1.0 / TextureWidth;
-float dtH = 1.0 / TextureHeight;
-
-vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
-coord = (coord + vec3 (1.0)) * vec3 (0.5);
-coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
-coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
-coord.r = float (clamp (float(coord.r), 0.0, 1.0));
-
-myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
-myhalf shadow = shadow0;
-
-#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
-
-vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
-myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, dtH, 0.0);
-myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, 0.0, 0.0);
-myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-#if defined(APPLY_PCF3x3)
-coord2 = coord + vec3(-dtW, 0.0, 0.0);
-myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, -dtH, 0.0);
-myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(0.0, -dtH, 0.0);
-myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, -dtH, 0.0);
-myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, dtH, 0.0);
-myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
-#else
-shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
-#endif
-#else
-shadow = shadow0;
-#endif
-
-float attenuation = float (ProjVector.w) / ProjDistance;
-myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
-;compensation = max (compensation, 0.0);
-color = shadow + attenuation + compensation;
-
-gl_FragColor = vec4(vec3(color),1.0);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/16.shader_test b/shaders/warsow/16.shader_test
new file mode 100644
index 0000000..76c961a
--- /dev/null
+++ b/shaders/warsow/16.shader_test
@@ -0,0 +1,307 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 TexCoord;
+varying vec4 ProjVector;
+#ifdef APPLY_EYEDOT
+varying vec3 EyeVector;
+#endif
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+#ifdef APPLY_EYEDOT
+uniform vec3 EyeOrigin;
+uniform float FrontPlane;
+#endif
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+textureMatrix = gl_TextureMatrix[0];
+textureMatrix[0] = -textureMatrix[0];
+textureMatrix[1] = -textureMatrix[1];
+TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+#ifdef APPLY_EYEDOT
+mat3 strMatrix;
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+gl_Position = ftransform();
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_DUDV
+uniform sampler2D DuDvMapTexture;
+#endif
+
+#ifdef APPLY_EYEDOT
+uniform sampler2D NormalmapTexture;
+#endif
+uniform sampler2D ReflectionTexture;
+uniform sampler2D RefractionTexture;
+uniform float TextureWidth, TextureHeight;
+
+void main(void)
+{
+myhalf3 color;
+
+#ifdef APPLY_DUDV
+vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
+vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
+
+vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
+#else
+vec3 fdist = vec3(0.0);
+#endif
+
+// get projective texcoords
+float scale = float(1.0 / float(ProjVector.w));
+float inv2NW = 1.0 / (2.0 * float (TextureWidth));
+float inv2NH = 1.0 / (2.0 * float (TextureHeight));
+vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
+projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
+projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
+
+
+myhalf3 refr = myhalf3(0.0);
+myhalf3 refl = myhalf3(0.0);
+
+#ifdef APPLY_EYEDOT
+// calculate dot product between the surface normal and eye vector
+// great for simulating varying water translucency based on the view angle
+myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
+vec3 eyeNormal = normalize(myhalf3(EyeVector));
+
+float refrdot = float(dot(surfaceNormal, eyeNormal));
+//refrdot = float (clamp (refrdot, 0.0, 1.0));
+float refldot = 1.0 - refrdot;
+// get refraction and reflection
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
+#endif
+
+#else
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
+#endif
+
+#endif
+
+// add reflection and refraction
+#ifdef APPLY_DISTORTION_ALPHA
+color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
+#else
+color = myhalf3(gl_Color.rgb) + refr + refl;
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),1.0);
+#else
+gl_FragColor = vec4(vec3(color),1.0);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 TexCoord;
+varying vec4 ProjVector;
+#ifdef APPLY_EYEDOT
+varying vec3 EyeVector;
+#endif
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+#ifdef APPLY_EYEDOT
+uniform vec3 EyeOrigin;
+uniform float FrontPlane;
+#endif
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+textureMatrix = gl_TextureMatrix[0];
+textureMatrix[0] = -textureMatrix[0];
+textureMatrix[1] = -textureMatrix[1];
+TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+#ifdef APPLY_EYEDOT
+mat3 strMatrix;
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+gl_Position = ftransform();
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_DUDV
+uniform sampler2D DuDvMapTexture;
+#endif
+
+#ifdef APPLY_EYEDOT
+uniform sampler2D NormalmapTexture;
+#endif
+uniform sampler2D ReflectionTexture;
+uniform sampler2D RefractionTexture;
+uniform float TextureWidth, TextureHeight;
+
+void main(void)
+{
+myhalf3 color;
+
+#ifdef APPLY_DUDV
+vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
+vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
+
+vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
+#else
+vec3 fdist = vec3(0.0);
+#endif
+
+// get projective texcoords
+float scale = float(1.0 / float(ProjVector.w));
+float inv2NW = 1.0 / (2.0 * float (TextureWidth));
+float inv2NH = 1.0 / (2.0 * float (TextureHeight));
+vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
+projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
+projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
+
+
+myhalf3 refr = myhalf3(0.0);
+myhalf3 refl = myhalf3(0.0);
+
+#ifdef APPLY_EYEDOT
+// calculate dot product between the surface normal and eye vector
+// great for simulating varying water translucency based on the view angle
+myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
+vec3 eyeNormal = normalize(myhalf3(EyeVector));
+
+float refrdot = float(dot(surfaceNormal, eyeNormal));
+//refrdot = float (clamp (refrdot, 0.0, 1.0));
+float refldot = 1.0 - refrdot;
+// get refraction and reflection
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
+#endif
+
+#else
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
+#endif
+
+#endif
+
+// add reflection and refraction
+#ifdef APPLY_DISTORTION_ALPHA
+color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
+#else
+color = myhalf3(gl_Color.rgb) + refr + refl;
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),1.0);
+#else
+gl_FragColor = vec4(vec3(color),1.0);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/16.vert b/shaders/warsow/16.vert
deleted file mode 100644
index f5a1571..0000000
--- a/shaders/warsow/16.vert
+++ /dev/null
@@ -1,110 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-
-gl_Position = ftransform();
-ProjVector = textureMatrix * gl_Vertex;
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform myhalf3 LightAmbient;
-
-uniform float TextureWidth, TextureHeight;
-uniform float ProjDistance;
-uniform sampler2DShadow ShadowmapTexture;
-
-void main(void)
-{
-myhalf color = myhalf(1.0);
-
-if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
-discard;
-
-float dtW = 1.0 / TextureWidth;
-float dtH = 1.0 / TextureHeight;
-
-vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
-coord = (coord + vec3 (1.0)) * vec3 (0.5);
-coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
-coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
-coord.r = float (clamp (float(coord.r), 0.0, 1.0));
-
-myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
-myhalf shadow = shadow0;
-
-#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
-
-vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
-myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, dtH, 0.0);
-myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, 0.0, 0.0);
-myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-#if defined(APPLY_PCF3x3)
-coord2 = coord + vec3(-dtW, 0.0, 0.0);
-myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, -dtH, 0.0);
-myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(0.0, -dtH, 0.0);
-myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, -dtH, 0.0);
-myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, dtH, 0.0);
-myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
-#else
-shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
-#endif
-#else
-shadow = shadow0;
-#endif
-
-float attenuation = float (ProjVector.w) / ProjDistance;
-myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
-;compensation = max (compensation, 0.0);
-color = shadow + attenuation + compensation;
-
-gl_FragColor = vec4(vec3(color),1.0);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/17.frag b/shaders/warsow/17.frag
deleted file mode 100644
index 0e60fc6..0000000
--- a/shaders/warsow/17.frag
+++ /dev/null
@@ -1,49 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float OutlineHeight;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 n = vec4(gl_Normal.xyz, 0.0);
-vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
-
-gl_Position = gl_ModelViewProjectionMatrix * v;
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * v;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform float OutlineCutOff;
-
-void main(void)
-{
-
-#ifdef APPLY_OUTLINES_CUTOFF
-if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
-discard;
-#endif
-
-gl_FragColor = vec4 (gl_Color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/17.vert b/shaders/warsow/17.vert
deleted file mode 100644
index 368238c..0000000
--- a/shaders/warsow/17.vert
+++ /dev/null
@@ -1,49 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float OutlineHeight;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 n = vec4(gl_Normal.xyz, 0.0);
-vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
-
-gl_Position = gl_ModelViewProjectionMatrix * v;
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * v;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform float OutlineCutOff;
-
-void main(void)
-{
-
-#ifdef APPLY_OUTLINES_CUTOFF
-if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
-discard;
-#endif
-
-gl_FragColor = vec4 (gl_Color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/18.frag b/shaders/warsow/18.frag
deleted file mode 100644
index f9d9ae2..0000000
--- a/shaders/warsow/18.frag
+++ /dev/null
@@ -1,63 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-#define M_TWOPI 6.28318530717958647692
-
-varying vec2 TexCoord;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float TurbAmplitude, TurbPhase;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 turb;
-turb = vec4(gl_MultiTexCoord0);
-turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
-turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
-TexCoord = vec2(gl_TextureMatrix[0] * turb);
-
-gl_Position = ftransform();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform sampler2D BaseTexture;
-
-void main(void)
-{
-
-myhalf4 color;
-
-color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
-
-gl_FragColor = vec4(color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/18.vert b/shaders/warsow/18.vert
deleted file mode 100644
index 27e76e5..0000000
--- a/shaders/warsow/18.vert
+++ /dev/null
@@ -1,63 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-#define M_TWOPI 6.28318530717958647692
-
-varying vec2 TexCoord;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float TurbAmplitude, TurbPhase;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 turb;
-turb = vec4(gl_MultiTexCoord0);
-turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
-turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
-TexCoord = vec2(gl_TextureMatrix[0] * turb);
-
-gl_Position = ftransform();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform sampler2D BaseTexture;
-
-void main(void)
-{
-
-myhalf4 color;
-
-color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
-
-gl_FragColor = vec4(color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/19.frag b/shaders/warsow/19.frag
deleted file mode 100644
index 28fd36b..0000000
--- a/shaders/warsow/19.frag
+++ /dev/null
@@ -1,345 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_AMBIENT_COMPENSATION
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/19.shader_test b/shaders/warsow/19.shader_test
new file mode 100644
index 0000000..9b644bc
--- /dev/null
+++ b/shaders/warsow/19.shader_test
@@ -0,0 +1,225 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+
+gl_Position = ftransform();
+ProjVector = textureMatrix * gl_Vertex;
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform myhalf3 LightAmbient;
+
+uniform float TextureWidth, TextureHeight;
+uniform float ProjDistance;
+uniform sampler2DShadow ShadowmapTexture;
+
+void main(void)
+{
+myhalf color = myhalf(1.0);
+
+if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
+discard;
+
+float dtW = 1.0 / TextureWidth;
+float dtH = 1.0 / TextureHeight;
+
+vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
+coord = (coord + vec3 (1.0)) * vec3 (0.5);
+coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
+coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
+coord.r = float (clamp (float(coord.r), 0.0, 1.0));
+
+myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
+myhalf shadow = shadow0;
+
+#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
+
+vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
+myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, dtH, 0.0);
+myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, 0.0, 0.0);
+myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+#if defined(APPLY_PCF3x3)
+coord2 = coord + vec3(-dtW, 0.0, 0.0);
+myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, -dtH, 0.0);
+myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(0.0, -dtH, 0.0);
+myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, -dtH, 0.0);
+myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, dtH, 0.0);
+myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
+#else
+shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
+#endif
+#else
+shadow = shadow0;
+#endif
+
+float attenuation = float (ProjVector.w) / ProjDistance;
+myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
+;compensation = max (compensation, 0.0);
+color = shadow + attenuation + compensation;
+
+gl_FragColor = vec4(vec3(color),1.0);
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+
+gl_Position = ftransform();
+ProjVector = textureMatrix * gl_Vertex;
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform myhalf3 LightAmbient;
+
+uniform float TextureWidth, TextureHeight;
+uniform float ProjDistance;
+uniform sampler2DShadow ShadowmapTexture;
+
+void main(void)
+{
+myhalf color = myhalf(1.0);
+
+if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
+discard;
+
+float dtW = 1.0 / TextureWidth;
+float dtH = 1.0 / TextureHeight;
+
+vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
+coord = (coord + vec3 (1.0)) * vec3 (0.5);
+coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
+coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
+coord.r = float (clamp (float(coord.r), 0.0, 1.0));
+
+myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
+myhalf shadow = shadow0;
+
+#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
+
+vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
+myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, dtH, 0.0);
+myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, 0.0, 0.0);
+myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+#if defined(APPLY_PCF3x3)
+coord2 = coord + vec3(-dtW, 0.0, 0.0);
+myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, -dtH, 0.0);
+myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(0.0, -dtH, 0.0);
+myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, -dtH, 0.0);
+myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, dtH, 0.0);
+myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
+#else
+shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
+#endif
+#else
+shadow = shadow0;
+#endif
+
+float attenuation = float (ProjVector.w) / ProjDistance;
+myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
+;compensation = max (compensation, 0.0);
+color = shadow + attenuation + compensation;
+
+gl_FragColor = vec4(vec3(color),1.0);
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/19.vert b/shaders/warsow/19.vert
deleted file mode 100644
index 2303a5d..0000000
--- a/shaders/warsow/19.vert
+++ /dev/null
@@ -1,345 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_AMBIENT_COMPENSATION
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/2.frag b/shaders/warsow/2.frag
deleted file mode 100644
index 4b7ece2..0000000
--- a/shaders/warsow/2.frag
+++ /dev/null
@@ -1,344 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/2.vert b/shaders/warsow/2.vert
deleted file mode 100644
index d34482c..0000000
--- a/shaders/warsow/2.vert
+++ /dev/null
@@ -1,344 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/20.frag b/shaders/warsow/20.frag
deleted file mode 100644
index dce1c71..0000000
--- a/shaders/warsow/20.frag
+++ /dev/null
@@ -1,342 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/20.vert b/shaders/warsow/20.vert
deleted file mode 100644
index 7cbe02c..0000000
--- a/shaders/warsow/20.vert
+++ /dev/null
@@ -1,342 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/21.frag b/shaders/warsow/21.frag
deleted file mode 100644
index 4b7ece2..0000000
--- a/shaders/warsow/21.frag
+++ /dev/null
@@ -1,344 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/21.vert b/shaders/warsow/21.vert
deleted file mode 100644
index d34482c..0000000
--- a/shaders/warsow/21.vert
+++ /dev/null
@@ -1,344 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/22.frag b/shaders/warsow/22.frag
deleted file mode 100644
index 00a170c..0000000
--- a/shaders/warsow/22.frag
+++ /dev/null
@@ -1,345 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/22.shader_test b/shaders/warsow/22.shader_test
new file mode 100644
index 0000000..b4f6f7c
--- /dev/null
+++ b/shaders/warsow/22.shader_test
@@ -0,0 +1,103 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float OutlineHeight;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 n = vec4(gl_Normal.xyz, 0.0);
+vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
+
+gl_Position = gl_ModelViewProjectionMatrix * v;
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * v;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform float OutlineCutOff;
+
+void main(void)
+{
+
+#ifdef APPLY_OUTLINES_CUTOFF
+if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
+discard;
+#endif
+
+gl_FragColor = vec4 (gl_Color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float OutlineHeight;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 n = vec4(gl_Normal.xyz, 0.0);
+vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
+
+gl_Position = gl_ModelViewProjectionMatrix * v;
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * v;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform float OutlineCutOff;
+
+void main(void)
+{
+
+#ifdef APPLY_OUTLINES_CUTOFF
+if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
+discard;
+#endif
+
+gl_FragColor = vec4 (gl_Color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/22.vert b/shaders/warsow/22.vert
deleted file mode 100644
index 2ddc43a..0000000
--- a/shaders/warsow/22.vert
+++ /dev/null
@@ -1,345 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/23.frag b/shaders/warsow/23.frag
deleted file mode 100644
index f106fbe..0000000
--- a/shaders/warsow/23.frag
+++ /dev/null
@@ -1,346 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-#define APPLY_AMBIENT_COMPENSATION
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/23.vert b/shaders/warsow/23.vert
deleted file mode 100644
index 4fe15fd..0000000
--- a/shaders/warsow/23.vert
+++ /dev/null
@@ -1,346 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-#define APPLY_AMBIENT_COMPENSATION
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/24.frag b/shaders/warsow/24.frag
deleted file mode 100644
index 4292f6c..0000000
--- a/shaders/warsow/24.frag
+++ /dev/null
@@ -1,344 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_DIRECTIONAL_LIGHT
-#define APPLY_CELLSHADING
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/24.vert b/shaders/warsow/24.vert
deleted file mode 100644
index 78f8084..0000000
--- a/shaders/warsow/24.vert
+++ /dev/null
@@ -1,344 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_DIRECTIONAL_LIGHT
-#define APPLY_CELLSHADING
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/25.frag b/shaders/warsow/25.frag
deleted file mode 100644
index af536af..0000000
--- a/shaders/warsow/25.frag
+++ /dev/null
@@ -1,151 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 TexCoord;
-varying vec4 ProjVector;
-#ifdef APPLY_EYEDOT
-varying vec3 EyeVector;
-#endif
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-#ifdef APPLY_EYEDOT
-uniform vec3 EyeOrigin;
-uniform float FrontPlane;
-#endif
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-textureMatrix = gl_TextureMatrix[0];
-textureMatrix[0] = -textureMatrix[0];
-textureMatrix[1] = -textureMatrix[1];
-TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-#ifdef APPLY_EYEDOT
-mat3 strMatrix;
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-gl_Position = ftransform();
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_DUDV
-uniform sampler2D DuDvMapTexture;
-#endif
-
-#ifdef APPLY_EYEDOT
-uniform sampler2D NormalmapTexture;
-#endif
-uniform sampler2D ReflectionTexture;
-uniform sampler2D RefractionTexture;
-uniform float TextureWidth, TextureHeight;
-
-void main(void)
-{
-myhalf3 color;
-
-#ifdef APPLY_DUDV
-vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
-vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
-
-vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
-#else
-vec3 fdist = vec3(0.0);
-#endif
-
-// get projective texcoords
-float scale = float(1.0 / float(ProjVector.w));
-float inv2NW = 1.0 / (2.0 * float (TextureWidth));
-float inv2NH = 1.0 / (2.0 * float (TextureHeight));
-vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
-projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
-projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
-
-
-myhalf3 refr = myhalf3(0.0);
-myhalf3 refl = myhalf3(0.0);
-
-#ifdef APPLY_EYEDOT
-// calculate dot product between the surface normal and eye vector
-// great for simulating varying water translucency based on the view angle
-myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
-vec3 eyeNormal = normalize(myhalf3(EyeVector));
-
-float refrdot = float(dot(surfaceNormal, eyeNormal));
-//refrdot = float (clamp (refrdot, 0.0, 1.0));
-float refldot = 1.0 - refrdot;
-// get refraction and reflection
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
-#endif
-
-#else
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
-#endif
-
-#endif
-
-// add reflection and refraction
-#ifdef APPLY_DISTORTION_ALPHA
-color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
-#else
-color = myhalf3(gl_Color.rgb) + refr + refl;
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),1.0);
-#else
-gl_FragColor = vec4(vec3(color),1.0);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/25.shader_test b/shaders/warsow/25.shader_test
new file mode 100644
index 0000000..7b223e1
--- /dev/null
+++ b/shaders/warsow/25.shader_test
@@ -0,0 +1,132 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+#define M_TWOPI 6.28318530717958647692
+
+varying vec2 TexCoord;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float TurbAmplitude, TurbPhase;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 turb;
+turb = vec4(gl_MultiTexCoord0);
+turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
+turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
+TexCoord = vec2(gl_TextureMatrix[0] * turb);
+
+gl_Position = ftransform();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform sampler2D BaseTexture;
+
+void main(void)
+{
+
+myhalf4 color;
+
+color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
+
+gl_FragColor = vec4(color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+#define M_TWOPI 6.28318530717958647692
+
+varying vec2 TexCoord;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float TurbAmplitude, TurbPhase;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 turb;
+turb = vec4(gl_MultiTexCoord0);
+turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
+turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
+TexCoord = vec2(gl_TextureMatrix[0] * turb);
+
+gl_Position = ftransform();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform sampler2D BaseTexture;
+
+void main(void)
+{
+
+myhalf4 color;
+
+color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
+
+gl_FragColor = vec4(color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/25.vert b/shaders/warsow/25.vert
deleted file mode 100644
index 6ee1e1e..0000000
--- a/shaders/warsow/25.vert
+++ /dev/null
@@ -1,151 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 TexCoord;
-varying vec4 ProjVector;
-#ifdef APPLY_EYEDOT
-varying vec3 EyeVector;
-#endif
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-#ifdef APPLY_EYEDOT
-uniform vec3 EyeOrigin;
-uniform float FrontPlane;
-#endif
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-textureMatrix = gl_TextureMatrix[0];
-textureMatrix[0] = -textureMatrix[0];
-textureMatrix[1] = -textureMatrix[1];
-TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-#ifdef APPLY_EYEDOT
-mat3 strMatrix;
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-gl_Position = ftransform();
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_DUDV
-uniform sampler2D DuDvMapTexture;
-#endif
-
-#ifdef APPLY_EYEDOT
-uniform sampler2D NormalmapTexture;
-#endif
-uniform sampler2D ReflectionTexture;
-uniform sampler2D RefractionTexture;
-uniform float TextureWidth, TextureHeight;
-
-void main(void)
-{
-myhalf3 color;
-
-#ifdef APPLY_DUDV
-vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
-vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
-
-vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
-#else
-vec3 fdist = vec3(0.0);
-#endif
-
-// get projective texcoords
-float scale = float(1.0 / float(ProjVector.w));
-float inv2NW = 1.0 / (2.0 * float (TextureWidth));
-float inv2NH = 1.0 / (2.0 * float (TextureHeight));
-vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
-projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
-projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
-
-
-myhalf3 refr = myhalf3(0.0);
-myhalf3 refl = myhalf3(0.0);
-
-#ifdef APPLY_EYEDOT
-// calculate dot product between the surface normal and eye vector
-// great for simulating varying water translucency based on the view angle
-myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
-vec3 eyeNormal = normalize(myhalf3(EyeVector));
-
-float refrdot = float(dot(surfaceNormal, eyeNormal));
-//refrdot = float (clamp (refrdot, 0.0, 1.0));
-float refldot = 1.0 - refrdot;
-// get refraction and reflection
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
-#endif
-
-#else
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
-#endif
-
-#endif
-
-// add reflection and refraction
-#ifdef APPLY_DISTORTION_ALPHA
-color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
-#else
-color = myhalf3(gl_Color.rgb) + refr + refl;
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),1.0);
-#else
-gl_FragColor = vec4(vec3(color),1.0);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/26.frag b/shaders/warsow/26.frag
deleted file mode 100644
index d917740..0000000
--- a/shaders/warsow/26.frag
+++ /dev/null
@@ -1,110 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-
-gl_Position = ftransform();
-ProjVector = textureMatrix * gl_Vertex;
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform myhalf3 LightAmbient;
-
-uniform float TextureWidth, TextureHeight;
-uniform float ProjDistance;
-uniform sampler2DShadow ShadowmapTexture;
-
-void main(void)
-{
-myhalf color = myhalf(1.0);
-
-if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
-discard;
-
-float dtW = 1.0 / TextureWidth;
-float dtH = 1.0 / TextureHeight;
-
-vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
-coord = (coord + vec3 (1.0)) * vec3 (0.5);
-coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
-coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
-coord.r = float (clamp (float(coord.r), 0.0, 1.0));
-
-myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
-myhalf shadow = shadow0;
-
-#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
-
-vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
-myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, dtH, 0.0);
-myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, 0.0, 0.0);
-myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-#if defined(APPLY_PCF3x3)
-coord2 = coord + vec3(-dtW, 0.0, 0.0);
-myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, -dtH, 0.0);
-myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(0.0, -dtH, 0.0);
-myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, -dtH, 0.0);
-myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, dtH, 0.0);
-myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
-#else
-shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
-#endif
-#else
-shadow = shadow0;
-#endif
-
-float attenuation = float (ProjVector.w) / ProjDistance;
-myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
-;compensation = max (compensation, 0.0);
-color = shadow + attenuation + compensation;
-
-gl_FragColor = vec4(vec3(color),1.0);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/26.vert b/shaders/warsow/26.vert
deleted file mode 100644
index f5a1571..0000000
--- a/shaders/warsow/26.vert
+++ /dev/null
@@ -1,110 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-
-gl_Position = ftransform();
-ProjVector = textureMatrix * gl_Vertex;
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform myhalf3 LightAmbient;
-
-uniform float TextureWidth, TextureHeight;
-uniform float ProjDistance;
-uniform sampler2DShadow ShadowmapTexture;
-
-void main(void)
-{
-myhalf color = myhalf(1.0);
-
-if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
-discard;
-
-float dtW = 1.0 / TextureWidth;
-float dtH = 1.0 / TextureHeight;
-
-vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
-coord = (coord + vec3 (1.0)) * vec3 (0.5);
-coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
-coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
-coord.r = float (clamp (float(coord.r), 0.0, 1.0));
-
-myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
-myhalf shadow = shadow0;
-
-#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
-
-vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
-myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, dtH, 0.0);
-myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, 0.0, 0.0);
-myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-#if defined(APPLY_PCF3x3)
-coord2 = coord + vec3(-dtW, 0.0, 0.0);
-myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, -dtH, 0.0);
-myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(0.0, -dtH, 0.0);
-myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, -dtH, 0.0);
-myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, dtH, 0.0);
-myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
-#else
-shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
-#endif
-#else
-shadow = shadow0;
-#endif
-
-float attenuation = float (ProjVector.w) / ProjDistance;
-myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
-;compensation = max (compensation, 0.0);
-color = shadow + attenuation + compensation;
-
-gl_FragColor = vec4(vec3(color),1.0);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/27.frag b/shaders/warsow/27.frag
deleted file mode 100644
index 0e60fc6..0000000
--- a/shaders/warsow/27.frag
+++ /dev/null
@@ -1,49 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float OutlineHeight;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 n = vec4(gl_Normal.xyz, 0.0);
-vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
-
-gl_Position = gl_ModelViewProjectionMatrix * v;
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * v;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform float OutlineCutOff;
-
-void main(void)
-{
-
-#ifdef APPLY_OUTLINES_CUTOFF
-if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
-discard;
-#endif
-
-gl_FragColor = vec4 (gl_Color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/27.vert b/shaders/warsow/27.vert
deleted file mode 100644
index 368238c..0000000
--- a/shaders/warsow/27.vert
+++ /dev/null
@@ -1,49 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float OutlineHeight;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 n = vec4(gl_Normal.xyz, 0.0);
-vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
-
-gl_Position = gl_ModelViewProjectionMatrix * v;
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * v;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform float OutlineCutOff;
-
-void main(void)
-{
-
-#ifdef APPLY_OUTLINES_CUTOFF
-if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
-discard;
-#endif
-
-gl_FragColor = vec4 (gl_Color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/28.frag b/shaders/warsow/28.frag
deleted file mode 100644
index f9d9ae2..0000000
--- a/shaders/warsow/28.frag
+++ /dev/null
@@ -1,63 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-#define M_TWOPI 6.28318530717958647692
-
-varying vec2 TexCoord;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float TurbAmplitude, TurbPhase;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 turb;
-turb = vec4(gl_MultiTexCoord0);
-turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
-turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
-TexCoord = vec2(gl_TextureMatrix[0] * turb);
-
-gl_Position = ftransform();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform sampler2D BaseTexture;
-
-void main(void)
-{
-
-myhalf4 color;
-
-color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
-
-gl_FragColor = vec4(color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/28.vert b/shaders/warsow/28.vert
deleted file mode 100644
index 27e76e5..0000000
--- a/shaders/warsow/28.vert
+++ /dev/null
@@ -1,63 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-#define M_TWOPI 6.28318530717958647692
-
-varying vec2 TexCoord;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float TurbAmplitude, TurbPhase;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 turb;
-turb = vec4(gl_MultiTexCoord0);
-turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
-turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
-TexCoord = vec2(gl_TextureMatrix[0] * turb);
-
-gl_Position = ftransform();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform sampler2D BaseTexture;
-
-void main(void)
-{
-
-myhalf4 color;
-
-color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
-
-gl_FragColor = vec4(color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/3.frag b/shaders/warsow/3.frag
deleted file mode 100644
index 00a170c..0000000
--- a/shaders/warsow/3.frag
+++ /dev/null
@@ -1,345 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/3.vert b/shaders/warsow/3.vert
deleted file mode 100644
index 2ddc43a..0000000
--- a/shaders/warsow/3.vert
+++ /dev/null
@@ -1,345 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/30.shader_test b/shaders/warsow/30.shader_test
new file mode 100644
index 0000000..04dc676
--- /dev/null
+++ b/shaders/warsow/30.shader_test
@@ -0,0 +1,26 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#version 130
+uniform sampler2D texSampler;
+in vec3 texCoords;
+out vec4 out_color;
+
+void main()
+{
+ out_color = texture(texSampler, texCoords.xy);
+}
+
+[vertex shader]
+#version 130
+in vec2 position;
+in vec3 textureCoords;
+out vec3 texCoords;
+void main()
+{
+ texCoords = textureCoords;
+ gl_Position = vec4(position, 0.0, 1.0);
+}
+
+
diff --git a/shaders/warsow/31.shader_test b/shaders/warsow/31.shader_test
new file mode 100644
index 0000000..f005219
--- /dev/null
+++ b/shaders/warsow/31.shader_test
@@ -0,0 +1,689 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/34.shader_test b/shaders/warsow/34.shader_test
new file mode 100644
index 0000000..62d5d00
--- /dev/null
+++ b/shaders/warsow/34.shader_test
@@ -0,0 +1,693 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/37.shader_test b/shaders/warsow/37.shader_test
new file mode 100644
index 0000000..6e68fc9
--- /dev/null
+++ b/shaders/warsow/37.shader_test
@@ -0,0 +1,695 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/4.frag b/shaders/warsow/4.frag
deleted file mode 100644
index f106fbe..0000000
--- a/shaders/warsow/4.frag
+++ /dev/null
@@ -1,346 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-#define APPLY_AMBIENT_COMPENSATION
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/4.shader_test b/shaders/warsow/4.shader_test
new file mode 100644
index 0000000..62d5d00
--- /dev/null
+++ b/shaders/warsow/4.shader_test
@@ -0,0 +1,693 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/4.vert b/shaders/warsow/4.vert
deleted file mode 100644
index 4fe15fd..0000000
--- a/shaders/warsow/4.vert
+++ /dev/null
@@ -1,346 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_LIGHTSTYLE0
-#define APPLY_FBLIGHTMAP
-#define APPLY_SPECULAR
-#define APPLY_AMBIENT_COMPENSATION
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/40.shader_test b/shaders/warsow/40.shader_test
new file mode 100644
index 0000000..de4bd35
--- /dev/null
+++ b/shaders/warsow/40.shader_test
@@ -0,0 +1,697 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+#define APPLY_AMBIENT_COMPENSATION
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+#define APPLY_AMBIENT_COMPENSATION
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/43.shader_test b/shaders/warsow/43.shader_test
new file mode 100644
index 0000000..4a2358e
--- /dev/null
+++ b/shaders/warsow/43.shader_test
@@ -0,0 +1,693 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_DIRECTIONAL_LIGHT
+#define APPLY_CELLSHADING
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_DIRECTIONAL_LIGHT
+#define APPLY_CELLSHADING
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/46.shader_test b/shaders/warsow/46.shader_test
new file mode 100644
index 0000000..76c961a
--- /dev/null
+++ b/shaders/warsow/46.shader_test
@@ -0,0 +1,307 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 TexCoord;
+varying vec4 ProjVector;
+#ifdef APPLY_EYEDOT
+varying vec3 EyeVector;
+#endif
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+#ifdef APPLY_EYEDOT
+uniform vec3 EyeOrigin;
+uniform float FrontPlane;
+#endif
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+textureMatrix = gl_TextureMatrix[0];
+textureMatrix[0] = -textureMatrix[0];
+textureMatrix[1] = -textureMatrix[1];
+TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+#ifdef APPLY_EYEDOT
+mat3 strMatrix;
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+gl_Position = ftransform();
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_DUDV
+uniform sampler2D DuDvMapTexture;
+#endif
+
+#ifdef APPLY_EYEDOT
+uniform sampler2D NormalmapTexture;
+#endif
+uniform sampler2D ReflectionTexture;
+uniform sampler2D RefractionTexture;
+uniform float TextureWidth, TextureHeight;
+
+void main(void)
+{
+myhalf3 color;
+
+#ifdef APPLY_DUDV
+vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
+vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
+
+vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
+#else
+vec3 fdist = vec3(0.0);
+#endif
+
+// get projective texcoords
+float scale = float(1.0 / float(ProjVector.w));
+float inv2NW = 1.0 / (2.0 * float (TextureWidth));
+float inv2NH = 1.0 / (2.0 * float (TextureHeight));
+vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
+projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
+projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
+
+
+myhalf3 refr = myhalf3(0.0);
+myhalf3 refl = myhalf3(0.0);
+
+#ifdef APPLY_EYEDOT
+// calculate dot product between the surface normal and eye vector
+// great for simulating varying water translucency based on the view angle
+myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
+vec3 eyeNormal = normalize(myhalf3(EyeVector));
+
+float refrdot = float(dot(surfaceNormal, eyeNormal));
+//refrdot = float (clamp (refrdot, 0.0, 1.0));
+float refldot = 1.0 - refrdot;
+// get refraction and reflection
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
+#endif
+
+#else
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
+#endif
+
+#endif
+
+// add reflection and refraction
+#ifdef APPLY_DISTORTION_ALPHA
+color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
+#else
+color = myhalf3(gl_Color.rgb) + refr + refl;
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),1.0);
+#else
+gl_FragColor = vec4(vec3(color),1.0);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 TexCoord;
+varying vec4 ProjVector;
+#ifdef APPLY_EYEDOT
+varying vec3 EyeVector;
+#endif
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+#ifdef APPLY_EYEDOT
+uniform vec3 EyeOrigin;
+uniform float FrontPlane;
+#endif
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+textureMatrix = gl_TextureMatrix[0];
+textureMatrix[0] = -textureMatrix[0];
+textureMatrix[1] = -textureMatrix[1];
+TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+#ifdef APPLY_EYEDOT
+mat3 strMatrix;
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+gl_Position = ftransform();
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_DUDV
+uniform sampler2D DuDvMapTexture;
+#endif
+
+#ifdef APPLY_EYEDOT
+uniform sampler2D NormalmapTexture;
+#endif
+uniform sampler2D ReflectionTexture;
+uniform sampler2D RefractionTexture;
+uniform float TextureWidth, TextureHeight;
+
+void main(void)
+{
+myhalf3 color;
+
+#ifdef APPLY_DUDV
+vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
+vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
+
+vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
+#else
+vec3 fdist = vec3(0.0);
+#endif
+
+// get projective texcoords
+float scale = float(1.0 / float(ProjVector.w));
+float inv2NW = 1.0 / (2.0 * float (TextureWidth));
+float inv2NH = 1.0 / (2.0 * float (TextureHeight));
+vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
+projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
+projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
+
+
+myhalf3 refr = myhalf3(0.0);
+myhalf3 refl = myhalf3(0.0);
+
+#ifdef APPLY_EYEDOT
+// calculate dot product between the surface normal and eye vector
+// great for simulating varying water translucency based on the view angle
+myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
+vec3 eyeNormal = normalize(myhalf3(EyeVector));
+
+float refrdot = float(dot(surfaceNormal, eyeNormal));
+//refrdot = float (clamp (refrdot, 0.0, 1.0));
+float refldot = 1.0 - refrdot;
+// get refraction and reflection
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
+#endif
+
+#else
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
+#endif
+
+#endif
+
+// add reflection and refraction
+#ifdef APPLY_DISTORTION_ALPHA
+color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
+#else
+color = myhalf3(gl_Color.rgb) + refr + refl;
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),1.0);
+#else
+gl_FragColor = vec4(vec3(color),1.0);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/49.shader_test b/shaders/warsow/49.shader_test
new file mode 100644
index 0000000..9b644bc
--- /dev/null
+++ b/shaders/warsow/49.shader_test
@@ -0,0 +1,225 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+
+gl_Position = ftransform();
+ProjVector = textureMatrix * gl_Vertex;
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform myhalf3 LightAmbient;
+
+uniform float TextureWidth, TextureHeight;
+uniform float ProjDistance;
+uniform sampler2DShadow ShadowmapTexture;
+
+void main(void)
+{
+myhalf color = myhalf(1.0);
+
+if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
+discard;
+
+float dtW = 1.0 / TextureWidth;
+float dtH = 1.0 / TextureHeight;
+
+vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
+coord = (coord + vec3 (1.0)) * vec3 (0.5);
+coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
+coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
+coord.r = float (clamp (float(coord.r), 0.0, 1.0));
+
+myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
+myhalf shadow = shadow0;
+
+#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
+
+vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
+myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, dtH, 0.0);
+myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, 0.0, 0.0);
+myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+#if defined(APPLY_PCF3x3)
+coord2 = coord + vec3(-dtW, 0.0, 0.0);
+myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, -dtH, 0.0);
+myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(0.0, -dtH, 0.0);
+myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, -dtH, 0.0);
+myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, dtH, 0.0);
+myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
+#else
+shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
+#endif
+#else
+shadow = shadow0;
+#endif
+
+float attenuation = float (ProjVector.w) / ProjDistance;
+myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
+;compensation = max (compensation, 0.0);
+color = shadow + attenuation + compensation;
+
+gl_FragColor = vec4(vec3(color),1.0);
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+
+gl_Position = ftransform();
+ProjVector = textureMatrix * gl_Vertex;
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform myhalf3 LightAmbient;
+
+uniform float TextureWidth, TextureHeight;
+uniform float ProjDistance;
+uniform sampler2DShadow ShadowmapTexture;
+
+void main(void)
+{
+myhalf color = myhalf(1.0);
+
+if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
+discard;
+
+float dtW = 1.0 / TextureWidth;
+float dtH = 1.0 / TextureHeight;
+
+vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
+coord = (coord + vec3 (1.0)) * vec3 (0.5);
+coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
+coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
+coord.r = float (clamp (float(coord.r), 0.0, 1.0));
+
+myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
+myhalf shadow = shadow0;
+
+#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
+
+vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
+myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, dtH, 0.0);
+myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, 0.0, 0.0);
+myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+#if defined(APPLY_PCF3x3)
+coord2 = coord + vec3(-dtW, 0.0, 0.0);
+myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, -dtH, 0.0);
+myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(0.0, -dtH, 0.0);
+myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, -dtH, 0.0);
+myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, dtH, 0.0);
+myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
+#else
+shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
+#endif
+#else
+shadow = shadow0;
+#endif
+
+float attenuation = float (ProjVector.w) / ProjDistance;
+myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
+;compensation = max (compensation, 0.0);
+color = shadow + attenuation + compensation;
+
+gl_FragColor = vec4(vec3(color),1.0);
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/5.frag b/shaders/warsow/5.frag
deleted file mode 100644
index 4292f6c..0000000
--- a/shaders/warsow/5.frag
+++ /dev/null
@@ -1,344 +0,0 @@
-#define FRAGMENT_SHADER
-#define APPLY_DIRECTIONAL_LIGHT
-#define APPLY_CELLSHADING
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/5.vert b/shaders/warsow/5.vert
deleted file mode 100644
index 78f8084..0000000
--- a/shaders/warsow/5.vert
+++ /dev/null
@@ -1,344 +0,0 @@
-#define VERTEX_SHADER
-#define APPLY_DIRECTIONAL_LIGHT
-#define APPLY_CELLSHADING
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec2 TexCoord;
-#ifdef APPLY_LIGHTSTYLE0
-varying vec4 LightmapTexCoord01;
-#ifdef APPLY_LIGHTSTYLE2
-varying vec4 LightmapTexCoord23;
-#endif
-#endif
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-varying vec3 EyeVector;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-varying vec3 LightVector;
-#endif
-
-varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform vec3 EyeOrigin;
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform vec3 LightDir;
-#endif
-
-void main()
-{
-gl_FrontColor = gl_Color;
-
-TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
-
-#ifdef APPLY_LIGHTSTYLE0
-LightmapTexCoord01.st = gl_MultiTexCoord4.st;
-#ifdef APPLY_LIGHTSTYLE1
-LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
-#ifdef APPLY_LIGHTSTYLE2
-LightmapTexCoord23.st = gl_MultiTexCoord6.st;
-#ifdef APPLY_LIGHTSTYLE3
-LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
-#endif
-#endif
-#endif
-#endif
-
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-LightVector = LightDir * strMatrix;
-#endif
-
-gl_Position = ftransform ();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_LIGHTSTYLE0
-uniform sampler2D LightmapTexture0;
-uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
-uniform myhalf3 lsColor0; // lightstyle color
-
-#ifdef APPLY_LIGHTSTYLE1
-uniform sampler2D LightmapTexture1;
-uniform float DeluxemapOffset1;
-uniform myhalf3 lsColor1;
-
-#ifdef APPLY_LIGHTSTYLE2
-uniform sampler2D LightmapTexture2;
-uniform float DeluxemapOffset2;
-uniform myhalf3 lsColor2;
-
-#ifdef APPLY_LIGHTSTYLE3
-uniform sampler2D LightmapTexture3;
-uniform float DeluxemapOffset3;
-uniform myhalf3 lsColor3;
-
-#endif
-#endif
-#endif
-#endif
-
-uniform sampler2D BaseTexture;
-uniform sampler2D NormalmapTexture;
-uniform sampler2D GlossTexture;
-#ifdef APPLY_DECAL
-uniform sampler2D DecalTexture;
-#endif
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-uniform float OffsetMappingScale;
-#endif
-
-uniform myhalf3 LightAmbient;
-#ifdef APPLY_DIRECTIONAL_LIGHT
-uniform myhalf3 LightDiffuse;
-#endif
-
-uniform myhalf GlossIntensity; // gloss scaling factor
-uniform myhalf GlossExponent; // gloss exponent factor
-
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
-// The credit goes to LordHavoc (as always)
-vec2 OffsetMapping(vec2 TexCoord)
-{
-#ifdef APPLY_RELIEFMAPPING
-// 14 sample relief mapping: linear search and then binary search
-// this basically steps forward a small amount repeatedly until it finds
-// itself inside solid, then jitters forward and back using decreasing
-// amounts to find the impact
-//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
-//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
-vec3 RT = vec3(TexCoord, 1);
-OffsetVector *= 0.1;
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
-RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
-return RT.xy;
-#else
-// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
-// this basically moves forward the full distance, and then backs up based
-// on height of samples
-//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
-//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
-vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
-TexCoord += OffsetVector;
-OffsetVector *= 0.5;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
-return TexCoord;
-#endif
-}
-#endif
-
-void main()
-{
-#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
-// apply offsetmapping
-vec2 TexCoordOffset = OffsetMapping(TexCoord);
-#define TexCoord TexCoordOffset
-#endif
-myhalf3 surfaceNormal;
-myhalf3 diffuseNormalModelspace;
-myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
-float diffuseProduct;
-#ifdef APPLY_CELLSHADING
-int lightcell;
-float diffuseProductPositive;
-float diffuseProductNegative;
-float hardShadow;
-#endif
-
-myhalf3 weightedDiffuseNormal;
-myhalf3 specularNormal;
-float specularProduct;
-
-#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
-myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
-#else
-myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
-#endif
-
-// get the surface normal
-surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
-
-#ifdef APPLY_DIRECTIONAL_LIGHT
-diffuseNormal = myhalf3 (LightVector);
-weightedDiffuseNormal = diffuseNormal;
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-#ifdef APPLY_CELLSHADING
-hardShadow = 0.0;
-diffuseProductPositive = max (diffuseProduct, 0.0);
-diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
-
-// smooth the hard shadow edge
-lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
-hardShadow += float(lightcell);
-
-lightcell = int(diffuseProductPositive * 2.0);
-hardShadow += float(lightcell);
-
-color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
-
-// backlight
-lightcell = int (diffuseProductNegative * 2.0);
-color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
-#else
-color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
-#endif
-
-#endif
-
-// deluxemapping using light vectors in modelspace
-
-#ifdef APPLY_LIGHTSTYLE0
-
-// get light normal
-diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-// calculate directional shading
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-
-#ifdef APPLY_FBLIGHTMAP
-weightedDiffuseNormal = diffuseNormal;
-// apply lightmap color
-color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
-#else
-
-#define NORMALIZE_DIFFUSE_NORMAL
-
-weightedDiffuseNormal = lsColor0 * diffuseNormal;
-// apply lightmap color
-color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
-#endif
-
-#ifdef APPLY_AMBIENT_COMPENSATION
-// compensate for ambient lighting
-color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
-#endif
-
-#ifdef APPLY_LIGHTSTYLE1
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor1 * diffuseNormal;
-color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
-
-#ifdef APPLY_LIGHTSTYLE2
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor2 * diffuseNormal;
-color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
-
-#ifdef APPLY_LIGHTSTYLE3
-diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
-diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
-diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
-weightedDiffuseNormal += lsColor3 * diffuseNormal;
-color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
-
-#endif
-#endif
-#endif
-#endif
-
-#ifdef APPLY_SPECULAR
-
-#ifdef NORMALIZE_DIFFUSE_NORMAL
-specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
-#else
-specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
-#endif
-
-specularProduct = float (dot (surfaceNormal, specularNormal));
-color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
-#endif
-
-#ifdef APPLY_BASETEX_ALPHA_ONLY
-color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
-#else
-#ifdef APPLY_COLOR_CLAMPING
-color = min(color, myhalf4(1.0));
-#endif
-color = color * myhalf4(texture2D(BaseTexture, TexCoord));
-#endif
-
-#ifdef APPLY_DECAL
-#ifdef APPLY_DECAL_ADD
-myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb + color.rgb;
-color.a = color.a * myhalf(gl_Color.a);
-#else
-myhalf4 decal = myhalf4(gl_Color.rgba);
-if (decal.a > 0.0)
-{
-decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
-color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
-}
-#endif
-#else
-color = color * myhalf4(gl_Color.rgba);
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),color.a);
-#else
-gl_FragColor = vec4(color);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/52.shader_test b/shaders/warsow/52.shader_test
new file mode 100644
index 0000000..b4f6f7c
--- /dev/null
+++ b/shaders/warsow/52.shader_test
@@ -0,0 +1,103 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float OutlineHeight;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 n = vec4(gl_Normal.xyz, 0.0);
+vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
+
+gl_Position = gl_ModelViewProjectionMatrix * v;
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * v;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform float OutlineCutOff;
+
+void main(void)
+{
+
+#ifdef APPLY_OUTLINES_CUTOFF
+if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
+discard;
+#endif
+
+gl_FragColor = vec4 (gl_Color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float OutlineHeight;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 n = vec4(gl_Normal.xyz, 0.0);
+vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
+
+gl_Position = gl_ModelViewProjectionMatrix * v;
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * v;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform float OutlineCutOff;
+
+void main(void)
+{
+
+#ifdef APPLY_OUTLINES_CUTOFF
+if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
+discard;
+#endif
+
+gl_FragColor = vec4 (gl_Color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/55.shader_test b/shaders/warsow/55.shader_test
new file mode 100644
index 0000000..3e97234
--- /dev/null
+++ b/shaders/warsow/55.shader_test
@@ -0,0 +1,140 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+#define M_TWOPI 6.28318530717958647692
+
+varying vec2 TexCoord;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float TurbAmplitude, TurbPhase;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 turb;
+turb = vec4(gl_MultiTexCoord0);
+turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
+turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
+TexCoord = vec2(gl_TextureMatrix[0] * turb);
+
+gl_Position = ftransform();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform sampler2D BaseTexture;
+
+void main(void)
+{
+
+myhalf4 color;
+
+color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
+
+gl_FragColor = vec4(color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
+
+=====================================
+wdm16
+
+Silver connected from 127.0.0.1
+Silver skill 50
+Sector connected from 127.0.0.1
+Sector skill 50
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+#define M_TWOPI 6.28318530717958647692
+
+varying vec2 TexCoord;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float TurbAmplitude, TurbPhase;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 turb;
+turb = vec4(gl_MultiTexCoord0);
+turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
+turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
+TexCoord = vec2(gl_TextureMatrix[0] * turb);
+
+gl_Position = ftransform();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform sampler2D BaseTexture;
+
+void main(void)
+{
+
+myhalf4 color;
+
+color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
+
+gl_FragColor = vec4(color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/6.frag b/shaders/warsow/6.frag
deleted file mode 100644
index af536af..0000000
--- a/shaders/warsow/6.frag
+++ /dev/null
@@ -1,151 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 TexCoord;
-varying vec4 ProjVector;
-#ifdef APPLY_EYEDOT
-varying vec3 EyeVector;
-#endif
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-#ifdef APPLY_EYEDOT
-uniform vec3 EyeOrigin;
-uniform float FrontPlane;
-#endif
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-textureMatrix = gl_TextureMatrix[0];
-textureMatrix[0] = -textureMatrix[0];
-textureMatrix[1] = -textureMatrix[1];
-TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-#ifdef APPLY_EYEDOT
-mat3 strMatrix;
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-gl_Position = ftransform();
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_DUDV
-uniform sampler2D DuDvMapTexture;
-#endif
-
-#ifdef APPLY_EYEDOT
-uniform sampler2D NormalmapTexture;
-#endif
-uniform sampler2D ReflectionTexture;
-uniform sampler2D RefractionTexture;
-uniform float TextureWidth, TextureHeight;
-
-void main(void)
-{
-myhalf3 color;
-
-#ifdef APPLY_DUDV
-vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
-vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
-
-vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
-#else
-vec3 fdist = vec3(0.0);
-#endif
-
-// get projective texcoords
-float scale = float(1.0 / float(ProjVector.w));
-float inv2NW = 1.0 / (2.0 * float (TextureWidth));
-float inv2NH = 1.0 / (2.0 * float (TextureHeight));
-vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
-projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
-projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
-
-
-myhalf3 refr = myhalf3(0.0);
-myhalf3 refl = myhalf3(0.0);
-
-#ifdef APPLY_EYEDOT
-// calculate dot product between the surface normal and eye vector
-// great for simulating varying water translucency based on the view angle
-myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
-vec3 eyeNormal = normalize(myhalf3(EyeVector));
-
-float refrdot = float(dot(surfaceNormal, eyeNormal));
-//refrdot = float (clamp (refrdot, 0.0, 1.0));
-float refldot = 1.0 - refrdot;
-// get refraction and reflection
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
-#endif
-
-#else
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
-#endif
-
-#endif
-
-// add reflection and refraction
-#ifdef APPLY_DISTORTION_ALPHA
-color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
-#else
-color = myhalf3(gl_Color.rgb) + refr + refl;
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),1.0);
-#else
-gl_FragColor = vec4(vec3(color),1.0);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/6.vert b/shaders/warsow/6.vert
deleted file mode 100644
index 6ee1e1e..0000000
--- a/shaders/warsow/6.vert
+++ /dev/null
@@ -1,151 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 TexCoord;
-varying vec4 ProjVector;
-#ifdef APPLY_EYEDOT
-varying vec3 EyeVector;
-#endif
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-#ifdef APPLY_EYEDOT
-uniform vec3 EyeOrigin;
-uniform float FrontPlane;
-#endif
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-textureMatrix = gl_TextureMatrix[0];
-textureMatrix[0] = -textureMatrix[0];
-textureMatrix[1] = -textureMatrix[1];
-TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
-
-#ifdef APPLY_EYEDOT
-mat3 strMatrix;
-strMatrix[0] = gl_MultiTexCoord1.xyz;
-strMatrix[2] = gl_Normal.xyz;
-strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
-
-vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
-EyeVector = EyeVectorWorld * strMatrix;
-#endif
-
-gl_Position = ftransform();
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-#ifdef APPLY_DUDV
-uniform sampler2D DuDvMapTexture;
-#endif
-
-#ifdef APPLY_EYEDOT
-uniform sampler2D NormalmapTexture;
-#endif
-uniform sampler2D ReflectionTexture;
-uniform sampler2D RefractionTexture;
-uniform float TextureWidth, TextureHeight;
-
-void main(void)
-{
-myhalf3 color;
-
-#ifdef APPLY_DUDV
-vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
-vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
-
-vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
-#else
-vec3 fdist = vec3(0.0);
-#endif
-
-// get projective texcoords
-float scale = float(1.0 / float(ProjVector.w));
-float inv2NW = 1.0 / (2.0 * float (TextureWidth));
-float inv2NH = 1.0 / (2.0 * float (TextureHeight));
-vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
-projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
-projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
-
-
-myhalf3 refr = myhalf3(0.0);
-myhalf3 refl = myhalf3(0.0);
-
-#ifdef APPLY_EYEDOT
-// calculate dot product between the surface normal and eye vector
-// great for simulating varying water translucency based on the view angle
-myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
-vec3 eyeNormal = normalize(myhalf3(EyeVector));
-
-float refrdot = float(dot(surfaceNormal, eyeNormal));
-//refrdot = float (clamp (refrdot, 0.0, 1.0));
-float refldot = 1.0 - refrdot;
-// get refraction and reflection
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
-#endif
-
-#else
-
-#ifdef APPLY_REFRACTION
-refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
-#endif
-#ifdef APPLY_REFLECTION
-refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
-#endif
-
-#endif
-
-// add reflection and refraction
-#ifdef APPLY_DISTORTION_ALPHA
-color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
-#else
-color = myhalf3(gl_Color.rgb) + refr + refl;
-#endif
-
-#ifdef APPLY_GRAYSCALE
-float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
-gl_FragColor = vec4(vec3(grey),1.0);
-#else
-gl_FragColor = vec4(vec3(color),1.0);
-#endif
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/60.shader_test b/shaders/warsow/60.shader_test
new file mode 100644
index 0000000..30ba541
--- /dev/null
+++ b/shaders/warsow/60.shader_test
@@ -0,0 +1,17 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+uniform vec4 color;
+void main()
+{
+ gl_FragColor = color;
+}
+
+[vertex shader]
+attribute vec4 position;
+void main()
+{
+ gl_Position = position;
+}
+
diff --git a/shaders/warsow/63.shader_test b/shaders/warsow/63.shader_test
new file mode 100644
index 0000000..7497b6b
--- /dev/null
+++ b/shaders/warsow/63.shader_test
@@ -0,0 +1,22 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#version 130
+uniform ivec4 color;
+out ivec4 out_color;
+
+void main()
+{
+ out_color = color;
+}
+
+[vertex shader]
+#version 130
+in vec4 position;
+void main()
+{
+ gl_Position = position;
+}
+
+
diff --git a/shaders/warsow/64.shader_test b/shaders/warsow/64.shader_test
new file mode 100644
index 0000000..b59d973
--- /dev/null
+++ b/shaders/warsow/64.shader_test
@@ -0,0 +1,696 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_AMBIENT_COMPENSATION
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_AMBIENT_COMPENSATION
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/67.shader_test b/shaders/warsow/67.shader_test
new file mode 100644
index 0000000..f005219
--- /dev/null
+++ b/shaders/warsow/67.shader_test
@@ -0,0 +1,689 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/7.frag b/shaders/warsow/7.frag
deleted file mode 100644
index d917740..0000000
--- a/shaders/warsow/7.frag
+++ /dev/null
@@ -1,110 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-
-gl_Position = ftransform();
-ProjVector = textureMatrix * gl_Vertex;
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform myhalf3 LightAmbient;
-
-uniform float TextureWidth, TextureHeight;
-uniform float ProjDistance;
-uniform sampler2DShadow ShadowmapTexture;
-
-void main(void)
-{
-myhalf color = myhalf(1.0);
-
-if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
-discard;
-
-float dtW = 1.0 / TextureWidth;
-float dtH = 1.0 / TextureHeight;
-
-vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
-coord = (coord + vec3 (1.0)) * vec3 (0.5);
-coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
-coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
-coord.r = float (clamp (float(coord.r), 0.0, 1.0));
-
-myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
-myhalf shadow = shadow0;
-
-#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
-
-vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
-myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, dtH, 0.0);
-myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, 0.0, 0.0);
-myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-#if defined(APPLY_PCF3x3)
-coord2 = coord + vec3(-dtW, 0.0, 0.0);
-myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, -dtH, 0.0);
-myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(0.0, -dtH, 0.0);
-myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, -dtH, 0.0);
-myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, dtH, 0.0);
-myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
-#else
-shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
-#endif
-#else
-shadow = shadow0;
-#endif
-
-float attenuation = float (ProjVector.w) / ProjDistance;
-myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
-;compensation = max (compensation, 0.0);
-color = shadow + attenuation + compensation;
-
-gl_FragColor = vec4(vec3(color),1.0);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/7.shader_test b/shaders/warsow/7.shader_test
new file mode 100644
index 0000000..6e68fc9
--- /dev/null
+++ b/shaders/warsow/7.shader_test
@@ -0,0 +1,695 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/7.vert b/shaders/warsow/7.vert
deleted file mode 100644
index f5a1571..0000000
--- a/shaders/warsow/7.vert
+++ /dev/null
@@ -1,110 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-
-mat4 textureMatrix;
-
-textureMatrix = gl_TextureMatrix[0];
-
-gl_Position = ftransform();
-ProjVector = textureMatrix * gl_Vertex;
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform myhalf3 LightAmbient;
-
-uniform float TextureWidth, TextureHeight;
-uniform float ProjDistance;
-uniform sampler2DShadow ShadowmapTexture;
-
-void main(void)
-{
-myhalf color = myhalf(1.0);
-
-if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
-discard;
-
-float dtW = 1.0 / TextureWidth;
-float dtH = 1.0 / TextureHeight;
-
-vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
-coord = (coord + vec3 (1.0)) * vec3 (0.5);
-coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
-coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
-coord.r = float (clamp (float(coord.r), 0.0, 1.0));
-
-myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
-myhalf shadow = shadow0;
-
-#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
-
-vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
-myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, dtH, 0.0);
-myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, 0.0, 0.0);
-myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-#if defined(APPLY_PCF3x3)
-coord2 = coord + vec3(-dtW, 0.0, 0.0);
-myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, -dtH, 0.0);
-myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(0.0, -dtH, 0.0);
-myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(dtW, -dtH, 0.0);
-myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-coord2 = coord + vec3(-dtW, dtH, 0.0);
-myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
-
-shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
-#else
-shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
-#endif
-#else
-shadow = shadow0;
-#endif
-
-float attenuation = float (ProjVector.w) / ProjDistance;
-myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
-;compensation = max (compensation, 0.0);
-color = shadow + attenuation + compensation;
-
-gl_FragColor = vec4(vec3(color),1.0);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/70.shader_test b/shaders/warsow/70.shader_test
new file mode 100644
index 0000000..62d5d00
--- /dev/null
+++ b/shaders/warsow/70.shader_test
@@ -0,0 +1,693 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/73.shader_test b/shaders/warsow/73.shader_test
new file mode 100644
index 0000000..6e68fc9
--- /dev/null
+++ b/shaders/warsow/73.shader_test
@@ -0,0 +1,695 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/76.shader_test b/shaders/warsow/76.shader_test
new file mode 100644
index 0000000..de4bd35
--- /dev/null
+++ b/shaders/warsow/76.shader_test
@@ -0,0 +1,697 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+#define APPLY_AMBIENT_COMPENSATION
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_LIGHTSTYLE0
+#define APPLY_FBLIGHTMAP
+#define APPLY_SPECULAR
+#define APPLY_AMBIENT_COMPENSATION
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/79.shader_test b/shaders/warsow/79.shader_test
new file mode 100644
index 0000000..4a2358e
--- /dev/null
+++ b/shaders/warsow/79.shader_test
@@ -0,0 +1,693 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+#define APPLY_DIRECTIONAL_LIGHT
+#define APPLY_CELLSHADING
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+#define APPLY_DIRECTIONAL_LIGHT
+#define APPLY_CELLSHADING
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec2 TexCoord;
+#ifdef APPLY_LIGHTSTYLE0
+varying vec4 LightmapTexCoord01;
+#ifdef APPLY_LIGHTSTYLE2
+varying vec4 LightmapTexCoord23;
+#endif
+#endif
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+varying vec3 EyeVector;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+varying vec3 LightVector;
+#endif
+
+varying mat3 strMatrix; // directions of S/T/R texcoords (tangent, binormal, normal)
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform vec3 EyeOrigin;
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform vec3 LightDir;
+#endif
+
+void main()
+{
+gl_FrontColor = gl_Color;
+
+TexCoord = vec2 (gl_TextureMatrix[0] * gl_MultiTexCoord0);
+
+#ifdef APPLY_LIGHTSTYLE0
+LightmapTexCoord01.st = gl_MultiTexCoord4.st;
+#ifdef APPLY_LIGHTSTYLE1
+LightmapTexCoord01.pq = gl_MultiTexCoord5.st;
+#ifdef APPLY_LIGHTSTYLE2
+LightmapTexCoord23.st = gl_MultiTexCoord6.st;
+#ifdef APPLY_LIGHTSTYLE3
+LightmapTexCoord23.pq = gl_MultiTexCoord7.st;
+#endif
+#endif
+#endif
+#endif
+
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+#if defined(APPLY_SPECULAR) || defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+vec3 EyeVectorWorld = EyeOrigin - gl_Vertex.xyz;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+LightVector = LightDir * strMatrix;
+#endif
+
+gl_Position = ftransform ();
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_LIGHTSTYLE0
+uniform sampler2D LightmapTexture0;
+uniform float DeluxemapOffset0; // s-offset for LightmapTexCoord
+uniform myhalf3 lsColor0; // lightstyle color
+
+#ifdef APPLY_LIGHTSTYLE1
+uniform sampler2D LightmapTexture1;
+uniform float DeluxemapOffset1;
+uniform myhalf3 lsColor1;
+
+#ifdef APPLY_LIGHTSTYLE2
+uniform sampler2D LightmapTexture2;
+uniform float DeluxemapOffset2;
+uniform myhalf3 lsColor2;
+
+#ifdef APPLY_LIGHTSTYLE3
+uniform sampler2D LightmapTexture3;
+uniform float DeluxemapOffset3;
+uniform myhalf3 lsColor3;
+
+#endif
+#endif
+#endif
+#endif
+
+uniform sampler2D BaseTexture;
+uniform sampler2D NormalmapTexture;
+uniform sampler2D GlossTexture;
+#ifdef APPLY_DECAL
+uniform sampler2D DecalTexture;
+#endif
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+uniform float OffsetMappingScale;
+#endif
+
+uniform myhalf3 LightAmbient;
+#ifdef APPLY_DIRECTIONAL_LIGHT
+uniform myhalf3 LightDiffuse;
+#endif
+
+uniform myhalf GlossIntensity; // gloss scaling factor
+uniform myhalf GlossExponent; // gloss exponent factor
+
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// The following reliefmapping and offsetmapping routine was taken from DarkPlaces
+// The credit goes to LordHavoc (as always)
+vec2 OffsetMapping(vec2 TexCoord)
+{
+#ifdef APPLY_RELIEFMAPPING
+// 14 sample relief mapping: linear search and then binary search
+// this basically steps forward a small amount repeatedly until it finds
+// itself inside solid, then jitters forward and back using decreasing
+// amounts to find the impact
+//vec3 OffsetVector = vec3(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1), -1);
+//vec3 OffsetVector = vec3(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 OffsetVector = vec3(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1), -1);
+vec3 RT = vec3(TexCoord, 1);
+OffsetVector *= 0.1;
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * step(texture2D(NormalmapTexture, RT.xy).a, RT.z);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) - 0.5);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.5 - 0.25);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.25 - 0.125);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.125 - 0.0625);
+RT += OffsetVector * (step(texture2D(NormalmapTexture, RT.xy).a, RT.z) * 0.0625 - 0.03125);
+return RT.xy;
+#else
+// 2 sample offset mapping (only 2 samples because of ATI Radeon 9500-9800/X300 limits)
+// this basically moves forward the full distance, and then backs up based
+// on height of samples
+//vec2 OffsetVector = vec2(EyeVector.xy * ((1.0 / EyeVector.z) * OffsetMappingScale) * vec2(-1, 1));
+//vec2 OffsetVector = vec2(normalize(EyeVector.xy) * OffsetMappingScale * vec2(-1, 1));
+vec2 OffsetVector = vec2(normalize(EyeVector).xy * OffsetMappingScale * vec2(-1, 1));
+TexCoord += OffsetVector;
+OffsetVector *= 0.5;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+TexCoord -= OffsetVector * texture2D(NormalmapTexture, TexCoord).a;
+return TexCoord;
+#endif
+}
+#endif
+
+void main()
+{
+#if defined(APPLY_OFFSETMAPPING) || defined(APPLY_RELIEFMAPPING)
+// apply offsetmapping
+vec2 TexCoordOffset = OffsetMapping(TexCoord);
+#define TexCoord TexCoordOffset
+#endif
+myhalf3 surfaceNormal;
+myhalf3 diffuseNormalModelspace;
+myhalf3 diffuseNormal = myhalf3 (0.0, 0.0, -1.0);
+float diffuseProduct;
+#ifdef APPLY_CELLSHADING
+int lightcell;
+float diffuseProductPositive;
+float diffuseProductNegative;
+float hardShadow;
+#endif
+
+myhalf3 weightedDiffuseNormal;
+myhalf3 specularNormal;
+float specularProduct;
+
+#if !defined(APPLY_DIRECTIONAL_LIGHT) && !defined(APPLY_LIGHTSTYLE0)
+myhalf4 color = myhalf4 (1.0, 1.0, 1.0, 1.0);
+#else
+myhalf4 color = myhalf4 (0.0, 0.0, 0.0, 1.0);
+#endif
+
+// get the surface normal
+surfaceNormal = normalize (myhalf3 (texture2D (NormalmapTexture, TexCoord)) - myhalf3 (0.5));
+
+#ifdef APPLY_DIRECTIONAL_LIGHT
+diffuseNormal = myhalf3 (LightVector);
+weightedDiffuseNormal = diffuseNormal;
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+#ifdef APPLY_CELLSHADING
+hardShadow = 0.0;
+diffuseProductPositive = max (diffuseProduct, 0.0);
+diffuseProductNegative = (-min (diffuseProduct, 0.0) - 0.3);
+
+// smooth the hard shadow edge
+lightcell = int(max(diffuseProduct + 0.1, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(max(diffuseProduct + 0.055, 0.0) * 2.0);
+hardShadow += float(lightcell);
+
+lightcell = int(diffuseProductPositive * 2.0);
+hardShadow += float(lightcell);
+
+color.rgb += myhalf(0.6 + hardShadow * 0.3333333333 * 0.27 + diffuseProductPositive * 0.14);
+
+// backlight
+lightcell = int (diffuseProductNegative * 2.0);
+color.rgb += myhalf (float(lightcell) * 0.085 + diffuseProductNegative * 0.085);
+#else
+color.rgb += LightDiffuse.rgb * myhalf(max (diffuseProduct, 0.0)) + LightAmbient.rgb;
+#endif
+
+#endif
+
+// deluxemapping using light vectors in modelspace
+
+#ifdef APPLY_LIGHTSTYLE0
+
+// get light normal
+diffuseNormalModelspace = myhalf3 (texture2D(LightmapTexture0, vec2(LightmapTexCoord01.s+DeluxemapOffset0,LightmapTexCoord01.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+// calculate directional shading
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+
+#ifdef APPLY_FBLIGHTMAP
+weightedDiffuseNormal = diffuseNormal;
+// apply lightmap color
+color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st)));
+#else
+
+#define NORMALIZE_DIFFUSE_NORMAL
+
+weightedDiffuseNormal = lsColor0 * diffuseNormal;
+// apply lightmap color
+color.rgb += lsColor0 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture0, LightmapTexCoord01.st));
+#endif
+
+#ifdef APPLY_AMBIENT_COMPENSATION
+// compensate for ambient lighting
+color.rgb += myhalf((1.0 - max (diffuseProduct, 0.0))) * LightAmbient;
+#endif
+
+#ifdef APPLY_LIGHTSTYLE1
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture1, vec2(LightmapTexCoord01.p+DeluxemapOffset1,LightmapTexCoord01.q))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor1 * diffuseNormal;
+color.rgb += lsColor1 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture1, LightmapTexCoord01.pq));
+
+#ifdef APPLY_LIGHTSTYLE2
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture2, vec2(LightmapTexCoord23.s+DeluxemapOffset2,LightmapTexCoord23.t))) - myhalf3 (0.5);
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor2 * diffuseNormal;
+color.rgb += lsColor2 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture2, LightmapTexCoord23.st));
+
+#ifdef APPLY_LIGHTSTYLE3
+diffuseNormalModelspace = myhalf3 (texture2D (LightmapTexture3, vec2(LightmapTexCoord23.p+DeluxemapOffset3,LightmapTexCoord23.q))) - myhalf3 (0.5);;
+diffuseNormal = normalize (myhalf3(dot(diffuseNormalModelspace,myhalf3(strMatrix[0])),dot(diffuseNormalModelspace,myhalf3(strMatrix[1])),dot(diffuseNormalModelspace,myhalf3(strMatrix[2]))));
+diffuseProduct = float (dot (surfaceNormal, diffuseNormal));
+weightedDiffuseNormal += lsColor3 * diffuseNormal;
+color.rgb += lsColor3 * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (texture2D (LightmapTexture3, LightmapTexCoord23.pq));
+
+#endif
+#endif
+#endif
+#endif
+
+#ifdef APPLY_SPECULAR
+
+#ifdef NORMALIZE_DIFFUSE_NORMAL
+specularNormal = normalize (myhalf3 (normalize (weightedDiffuseNormal)) + myhalf3 (normalize (EyeVector)));
+#else
+specularNormal = normalize (weightedDiffuseNormal + myhalf3 (normalize (EyeVector)));
+#endif
+
+specularProduct = float (dot (surfaceNormal, specularNormal));
+color.rgb += (myhalf3(texture2D(GlossTexture, TexCoord)) * GlossIntensity) * pow(myhalf(max(specularProduct, 0.0)), GlossExponent);
+#endif
+
+#ifdef APPLY_BASETEX_ALPHA_ONLY
+color = min(color, myhalf4(texture2D(BaseTexture, TexCoord).a));
+#else
+#ifdef APPLY_COLOR_CLAMPING
+color = min(color, myhalf4(1.0));
+#endif
+color = color * myhalf4(texture2D(BaseTexture, TexCoord));
+#endif
+
+#ifdef APPLY_DECAL
+#ifdef APPLY_DECAL_ADD
+myhalf3 decal = myhalf3(gl_Color.rgb) * myhalf3(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb + color.rgb;
+color.a = color.a * myhalf(gl_Color.a);
+#else
+myhalf4 decal = myhalf4(gl_Color.rgba);
+if (decal.a > 0.0)
+{
+decal = decal * myhalf4(texture2D(DecalTexture, TexCoord));
+color.rgb = decal.rgb * decal.a + color.rgb * (1.0-decal.a);
+}
+#endif
+#else
+color = color * myhalf4(gl_Color.rgba);
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),color.a);
+#else
+gl_FragColor = vec4(color);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/8.frag b/shaders/warsow/8.frag
deleted file mode 100644
index 0e60fc6..0000000
--- a/shaders/warsow/8.frag
+++ /dev/null
@@ -1,49 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float OutlineHeight;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 n = vec4(gl_Normal.xyz, 0.0);
-vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
-
-gl_Position = gl_ModelViewProjectionMatrix * v;
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * v;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform float OutlineCutOff;
-
-void main(void)
-{
-
-#ifdef APPLY_OUTLINES_CUTOFF
-if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
-discard;
-#endif
-
-gl_FragColor = vec4 (gl_Color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/8.vert b/shaders/warsow/8.vert
deleted file mode 100644
index 368238c..0000000
--- a/shaders/warsow/8.vert
+++ /dev/null
@@ -1,49 +0,0 @@
-#define VERTEX_SHADER
-// Warsow GLSL shader
-
-
-varying vec4 ProjVector;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float OutlineHeight;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 n = vec4(gl_Normal.xyz, 0.0);
-vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
-
-gl_Position = gl_ModelViewProjectionMatrix * v;
-ProjVector = gl_Position;
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * v;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform float OutlineCutOff;
-
-void main(void)
-{
-
-#ifdef APPLY_OUTLINES_CUTOFF
-if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
-discard;
-#endif
-
-gl_FragColor = vec4 (gl_Color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/82.shader_test b/shaders/warsow/82.shader_test
new file mode 100644
index 0000000..76c961a
--- /dev/null
+++ b/shaders/warsow/82.shader_test
@@ -0,0 +1,307 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 TexCoord;
+varying vec4 ProjVector;
+#ifdef APPLY_EYEDOT
+varying vec3 EyeVector;
+#endif
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+#ifdef APPLY_EYEDOT
+uniform vec3 EyeOrigin;
+uniform float FrontPlane;
+#endif
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+textureMatrix = gl_TextureMatrix[0];
+textureMatrix[0] = -textureMatrix[0];
+textureMatrix[1] = -textureMatrix[1];
+TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+#ifdef APPLY_EYEDOT
+mat3 strMatrix;
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+gl_Position = ftransform();
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_DUDV
+uniform sampler2D DuDvMapTexture;
+#endif
+
+#ifdef APPLY_EYEDOT
+uniform sampler2D NormalmapTexture;
+#endif
+uniform sampler2D ReflectionTexture;
+uniform sampler2D RefractionTexture;
+uniform float TextureWidth, TextureHeight;
+
+void main(void)
+{
+myhalf3 color;
+
+#ifdef APPLY_DUDV
+vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
+vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
+
+vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
+#else
+vec3 fdist = vec3(0.0);
+#endif
+
+// get projective texcoords
+float scale = float(1.0 / float(ProjVector.w));
+float inv2NW = 1.0 / (2.0 * float (TextureWidth));
+float inv2NH = 1.0 / (2.0 * float (TextureHeight));
+vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
+projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
+projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
+
+
+myhalf3 refr = myhalf3(0.0);
+myhalf3 refl = myhalf3(0.0);
+
+#ifdef APPLY_EYEDOT
+// calculate dot product between the surface normal and eye vector
+// great for simulating varying water translucency based on the view angle
+myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
+vec3 eyeNormal = normalize(myhalf3(EyeVector));
+
+float refrdot = float(dot(surfaceNormal, eyeNormal));
+//refrdot = float (clamp (refrdot, 0.0, 1.0));
+float refldot = 1.0 - refrdot;
+// get refraction and reflection
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
+#endif
+
+#else
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
+#endif
+
+#endif
+
+// add reflection and refraction
+#ifdef APPLY_DISTORTION_ALPHA
+color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
+#else
+color = myhalf3(gl_Color.rgb) + refr + refl;
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),1.0);
+#else
+gl_FragColor = vec4(vec3(color),1.0);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 TexCoord;
+varying vec4 ProjVector;
+#ifdef APPLY_EYEDOT
+varying vec3 EyeVector;
+#endif
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+#ifdef APPLY_EYEDOT
+uniform vec3 EyeOrigin;
+uniform float FrontPlane;
+#endif
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+TexCoord.st = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+textureMatrix = gl_TextureMatrix[0];
+textureMatrix[0] = -textureMatrix[0];
+textureMatrix[1] = -textureMatrix[1];
+TexCoord.pq = vec2 (textureMatrix * gl_MultiTexCoord0);
+
+#ifdef APPLY_EYEDOT
+mat3 strMatrix;
+strMatrix[0] = gl_MultiTexCoord1.xyz;
+strMatrix[2] = gl_Normal.xyz;
+strMatrix[1] = gl_MultiTexCoord1.w * cross (strMatrix[2], strMatrix[0]);
+
+vec3 EyeVectorWorld = (EyeOrigin - gl_Vertex.xyz) * FrontPlane;
+EyeVector = EyeVectorWorld * strMatrix;
+#endif
+
+gl_Position = ftransform();
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+#ifdef APPLY_DUDV
+uniform sampler2D DuDvMapTexture;
+#endif
+
+#ifdef APPLY_EYEDOT
+uniform sampler2D NormalmapTexture;
+#endif
+uniform sampler2D ReflectionTexture;
+uniform sampler2D RefractionTexture;
+uniform float TextureWidth, TextureHeight;
+
+void main(void)
+{
+myhalf3 color;
+
+#ifdef APPLY_DUDV
+vec3 displacement = vec3(texture2D(DuDvMapTexture, vec2(TexCoord.pq) * vec2(0.25)));
+vec2 coord = vec2(TexCoord.st) + vec2(displacement) * vec2 (0.2);
+
+vec3 fdist = vec3 (normalize(vec3(texture2D(DuDvMapTexture, coord)) - vec3 (0.5))) * vec3(0.005);
+#else
+vec3 fdist = vec3(0.0);
+#endif
+
+// get projective texcoords
+float scale = float(1.0 / float(ProjVector.w));
+float inv2NW = 1.0 / (2.0 * float (TextureWidth));
+float inv2NH = 1.0 / (2.0 * float (TextureHeight));
+vec2 projCoord = (vec2(ProjVector.xy) * scale + vec2 (1.0)) * vec2 (0.5) + vec2(fdist.xy);
+projCoord.s = float (clamp (float(projCoord.s), inv2NW, 1.0 - inv2NW));
+projCoord.t = float (clamp (float(projCoord.t), inv2NH, 1.0 - inv2NH));
+
+
+myhalf3 refr = myhalf3(0.0);
+myhalf3 refl = myhalf3(0.0);
+
+#ifdef APPLY_EYEDOT
+// calculate dot product between the surface normal and eye vector
+// great for simulating varying water translucency based on the view angle
+myhalf3 surfaceNormal = normalize(myhalf3(texture2D(NormalmapTexture, coord)) - myhalf3 (0.5));
+vec3 eyeNormal = normalize(myhalf3(EyeVector));
+
+float refrdot = float(dot(surfaceNormal, eyeNormal));
+//refrdot = float (clamp (refrdot, 0.0, 1.0));
+float refldot = 1.0 - refrdot;
+// get refraction and reflection
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord))) * refrdot;
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord))) * refldot;
+#endif
+
+#else
+
+#ifdef APPLY_REFRACTION
+refr = (myhalf3(texture2D(RefractionTexture, projCoord)));
+#endif
+#ifdef APPLY_REFLECTION
+refl = (myhalf3(texture2D(ReflectionTexture, projCoord)));
+#endif
+
+#endif
+
+// add reflection and refraction
+#ifdef APPLY_DISTORTION_ALPHA
+color = myhalf3(gl_Color.rgb) + myhalf3(mix (refr, refl, float(gl_Color.a)));
+#else
+color = myhalf3(gl_Color.rgb) + refr + refl;
+#endif
+
+#ifdef APPLY_GRAYSCALE
+float grey = dot(color, myhalf3(0.299, 0.587, 0.114));
+gl_FragColor = vec4(vec3(grey),1.0);
+#else
+gl_FragColor = vec4(vec3(color),1.0);
+#endif
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/85.shader_test b/shaders/warsow/85.shader_test
new file mode 100644
index 0000000..9b644bc
--- /dev/null
+++ b/shaders/warsow/85.shader_test
@@ -0,0 +1,225 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+
+gl_Position = ftransform();
+ProjVector = textureMatrix * gl_Vertex;
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform myhalf3 LightAmbient;
+
+uniform float TextureWidth, TextureHeight;
+uniform float ProjDistance;
+uniform sampler2DShadow ShadowmapTexture;
+
+void main(void)
+{
+myhalf color = myhalf(1.0);
+
+if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
+discard;
+
+float dtW = 1.0 / TextureWidth;
+float dtH = 1.0 / TextureHeight;
+
+vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
+coord = (coord + vec3 (1.0)) * vec3 (0.5);
+coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
+coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
+coord.r = float (clamp (float(coord.r), 0.0, 1.0));
+
+myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
+myhalf shadow = shadow0;
+
+#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
+
+vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
+myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, dtH, 0.0);
+myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, 0.0, 0.0);
+myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+#if defined(APPLY_PCF3x3)
+coord2 = coord + vec3(-dtW, 0.0, 0.0);
+myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, -dtH, 0.0);
+myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(0.0, -dtH, 0.0);
+myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, -dtH, 0.0);
+myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, dtH, 0.0);
+myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
+#else
+shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
+#endif
+#else
+shadow = shadow0;
+#endif
+
+float attenuation = float (ProjVector.w) / ProjDistance;
+myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
+;compensation = max (compensation, 0.0);
+color = shadow + attenuation + compensation;
+
+gl_FragColor = vec4(vec3(color),1.0);
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+#if !defined(__GLSL_CG_DATA_TYPES)
+#define myhalf float
+#define myhalf2 vec2
+#define myhalf3 vec3
+#define myhalf4 vec4
+#else
+#define myhalf half
+#define myhalf2 half2
+#define myhalf3 half3
+#define myhalf4 half4
+#endif
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+
+mat4 textureMatrix;
+
+textureMatrix = gl_TextureMatrix[0];
+
+gl_Position = ftransform();
+ProjVector = textureMatrix * gl_Vertex;
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform myhalf3 LightAmbient;
+
+uniform float TextureWidth, TextureHeight;
+uniform float ProjDistance;
+uniform sampler2DShadow ShadowmapTexture;
+
+void main(void)
+{
+myhalf color = myhalf(1.0);
+
+if (ProjVector.w <= 0.0 || ProjVector.w >= ProjDistance)
+discard;
+
+float dtW = 1.0 / TextureWidth;
+float dtH = 1.0 / TextureHeight;
+
+vec3 coord = vec3 (ProjVector.xyz / ProjVector.w);
+coord = (coord + vec3 (1.0)) * vec3 (0.5);
+coord.s = float (clamp (float(coord.s), dtW, 1.0 - dtW));
+coord.t = float (clamp (float(coord.t), dtH, 1.0 - dtH));
+coord.r = float (clamp (float(coord.r), 0.0, 1.0));
+
+myhalf shadow0 = myhalf(shadow2D(ShadowmapTexture, coord).r);
+myhalf shadow = shadow0;
+
+#if defined(APPLY_PCF2x2) || defined(APPLY_PCF3x3)
+
+vec3 coord2 = coord + vec3(0.0, dtH, 0.0);
+myhalf shadow1 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, dtH, 0.0);
+myhalf shadow2 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, 0.0, 0.0);
+myhalf shadow3 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+#if defined(APPLY_PCF3x3)
+coord2 = coord + vec3(-dtW, 0.0, 0.0);
+myhalf shadow4 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, -dtH, 0.0);
+myhalf shadow5 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(0.0, -dtH, 0.0);
+myhalf shadow6 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(dtW, -dtH, 0.0);
+myhalf shadow7 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+coord2 = coord + vec3(-dtW, dtH, 0.0);
+myhalf shadow8 = myhalf (shadow2D (ShadowmapTexture, coord2).r);
+
+shadow = (shadow0 + shadow1 + shadow2 + shadow3 + shadow4 + shadow5 + shadow6 + shadow7 + shadow8) * myhalf(0.11);
+#else
+shadow = (shadow0 + shadow1 + shadow2 + shadow3) * myhalf(0.25);
+#endif
+#else
+shadow = shadow0;
+#endif
+
+float attenuation = float (ProjVector.w) / ProjDistance;
+myhalf compensation = myhalf(0.25) - max(LightAmbient.x, max(LightAmbient.y, LightAmbient.z))
+;compensation = max (compensation, 0.0);
+color = shadow + attenuation + compensation;
+
+gl_FragColor = vec4(vec3(color),1.0);
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/88.shader_test b/shaders/warsow/88.shader_test
new file mode 100644
index 0000000..b4f6f7c
--- /dev/null
+++ b/shaders/warsow/88.shader_test
@@ -0,0 +1,103 @@
+[require]
+GLSL >= 1.10
+
+[fragment shader]
+#define FRAGMENT_SHADER
+// Warsow GLSL shader
+
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float OutlineHeight;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 n = vec4(gl_Normal.xyz, 0.0);
+vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
+
+gl_Position = gl_ModelViewProjectionMatrix * v;
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * v;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform float OutlineCutOff;
+
+void main(void)
+{
+
+#ifdef APPLY_OUTLINES_CUTOFF
+if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
+discard;
+#endif
+
+gl_FragColor = vec4 (gl_Color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
+[vertex shader]
+#define VERTEX_SHADER
+// Warsow GLSL shader
+
+
+varying vec4 ProjVector;
+
+#ifdef VERTEX_SHADER
+// Vertex shader
+
+uniform float OutlineHeight;
+
+void main(void)
+{
+gl_FrontColor = gl_Color;
+
+vec4 n = vec4(gl_Normal.xyz, 0.0);
+vec4 v = vec4(gl_Vertex) + n * OutlineHeight;
+
+gl_Position = gl_ModelViewProjectionMatrix * v;
+ProjVector = gl_Position;
+#ifdef APPLY_CLIPPING
+#ifdef __GLSL_CG_DATA_TYPES
+gl_ClipVertex = gl_ModelViewMatrix * v;
+#endif
+#endif
+}
+
+#endif // VERTEX_SHADER
+
+
+#ifdef FRAGMENT_SHADER
+// Fragment shader
+
+uniform float OutlineCutOff;
+
+void main(void)
+{
+
+#ifdef APPLY_OUTLINES_CUTOFF
+if (OutlineCutOff > 0.0 && (ProjVector.w > OutlineCutOff))
+discard;
+#endif
+
+gl_FragColor = vec4 (gl_Color);
+}
+
+#endif // FRAGMENT_SHADER
+
+
diff --git a/shaders/warsow/9.frag b/shaders/warsow/9.frag
deleted file mode 100644
index f9d9ae2..0000000
--- a/shaders/warsow/9.frag
+++ /dev/null
@@ -1,63 +0,0 @@
-#define FRAGMENT_SHADER
-// Warsow GLSL shader
-
-#if !defined(__GLSL_CG_DATA_TYPES)
-#define myhalf float
-#define myhalf2 vec2
-#define myhalf3 vec3
-#define myhalf4 vec4
-#else
-#define myhalf half
-#define myhalf2 half2
-#define myhalf3 half3
-#define myhalf4 half4
-#endif
-
-#define M_TWOPI 6.28318530717958647692
-
-varying vec2 TexCoord;
-
-#ifdef VERTEX_SHADER
-// Vertex shader
-
-uniform float TurbAmplitude, TurbPhase;
-
-void main(void)
-{
-gl_FrontColor = gl_Color;
-
-vec4 turb;
-turb = vec4(gl_MultiTexCoord0);
-turb.s += TurbAmplitude * sin( ((gl_MultiTexCoord0.t / 4.0 + TurbPhase)) * M_TWOPI );
-turb.t += TurbAmplitude * sin( ((gl_MultiTexCoord0.s / 4.0 + TurbPhase)) * M_TWOPI );
-TexCoord = vec2(gl_TextureMatrix[0] * turb);
-
-gl_Position = ftransform();
-#ifdef APPLY_CLIPPING
-#ifdef __GLSL_CG_DATA_TYPES
-gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
-#endif
-#endif
-}
-
-#endif // VERTEX_SHADER
-
-
-#ifdef FRAGMENT_SHADER
-// Fragment shader
-
-uniform sampler2D BaseTexture;
-
-void main(void)
-{
-
-myhalf4 color;
-
-color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
-
-gl_FragColor = vec4(color);
-}
-
-#endif // FRAGMENT_SHADER
-
-
diff --git a/shaders/warsow/9.vert b/shaders/warsow/91.shader_test
index 27e76e5..e32eb19 100644
--- a/shaders/warsow/9.vert
+++ b/shaders/warsow/91.shader_test
@@ -1,3 +1,7 @@
+[require]
+GLSL >= 1.10
+
+[vertex shader]
#define VERTEX_SHADER
// Warsow GLSL shader
@@ -51,13 +55,3 @@ uniform sampler2D BaseTexture;
void main(void)
{
-myhalf4 color;
-
-color = myhalf4(gl_Color) * myhalf4(texture2D(BaseTexture, TexCoord));
-
-gl_FragColor = vec4(color);
-}
-
-#endif // FRAGMENT_SHADER
-
-