
float processTexCoord(float coord, int texGenMode, vec4 texGenParamsEye, vec4 texGenParamsObject)
{
    if (texGenMode == 9216) return dot(texGenParamsEye, eyePos);
    else if (texGenMode == 9217) return dot(texGenParamsObject, gl_Vertex);
    else return coord;
}

void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    eyePos = gl_ModelViewMatrix * gl_Vertex;
    gl_FogFragCoord = abs(eyePos.z/eyePos.w);
	if (useTex0)
	{
		vec4 texCoord = gl_MultiTexCoord0;
		if (texGen0_s) texCoord.s = processTexCoord(texCoord.s, texGenMode0_s, texGenParamsEye0_s, texGenParamsObject0_s);
		if (texGen0_t) texCoord.t = processTexCoord(texCoord.t, texGenMode0_t, texGenParamsEye0_t, texGenParamsObject0_t);
		if (texGen0_p) texCoord.p = processTexCoord(texCoord.p, texGenMode0_p, texGenParamsEye0_p, texGenParamsObject0_p);
		if (texGen0_q) texCoord.q = processTexCoord(texCoord.q, texGenMode0_q, texGenParamsEye0_q, texGenParamsObject0_q);
		gl_TexCoord[0] = gl_TextureMatrix[0] * texCoord;
	}
	if (useTex1)
	{
		vec4 texCoord = gl_MultiTexCoord1;
		if (texGen1_s) texCoord.s = processTexCoord(texCoord.s, texGenMode1_s, texGenParamsEye1_s, texGenParamsObject1_s);
		if (texGen1_t) texCoord.t = processTexCoord(texCoord.t, texGenMode1_t, texGenParamsEye1_t, texGenParamsObject1_t);
		if (texGen1_p) texCoord.p = processTexCoord(texCoord.p, texGenMode1_p, texGenParamsEye1_p, texGenParamsObject1_p);
		if (texGen1_q) texCoord.q = processTexCoord(texCoord.q, texGenMode1_q, texGenParamsEye1_q, texGenParamsObject1_q);
		gl_TexCoord[1] = gl_TextureMatrix[1] * texCoord;
	}
	if (useTex2)
    {
        vec4 texCoord = gl_MultiTexCoord2;
        if (texGen2_s) texCoord.s = processTexCoord(texCoord.s, texGenMode2_s, texGenParamsEye2_s, texGenParamsObject2_s);
        if (texGen2_t) texCoord.t = processTexCoord(texCoord.t, texGenMode2_t, texGenParamsEye2_t, texGenParamsObject2_t);
        if (texGen2_p) texCoord.p = processTexCoord(texCoord.p, texGenMode2_p, texGenParamsEye2_p, texGenParamsObject2_p);
        if (texGen2_q) texCoord.q = processTexCoord(texCoord.q, texGenMode2_q, texGenParamsEye2_q, texGenParamsObject2_q);
        gl_TexCoord[2] = gl_TextureMatrix[2] * texCoord;
    }
    if (useTex3)
    {
        vec4 texCoord = gl_MultiTexCoord3;
        if (texGen3_s) texCoord.s = processTexCoord(texCoord.s, texGenMode3_s, texGenParamsEye3_s, texGenParamsObject3_s);
        if (texGen3_t) texCoord.t = processTexCoord(texCoord.t, texGenMode3_t, texGenParamsEye3_t, texGenParamsObject3_t);
        if (texGen3_p) texCoord.p = processTexCoord(texCoord.p, texGenMode3_p, texGenParamsEye3_p, texGenParamsObject3_p);
        if (texGen3_q) texCoord.q = processTexCoord(texCoord.q, texGenMode3_q, texGenParamsEye3_q, texGenParamsObject3_q);
        gl_TexCoord[3] = gl_TextureMatrix[3] * texCoord;
    }
    if (useTex4)
    {
        vec4 texCoord = gl_MultiTexCoord4;
        if (texGen4_s) texCoord.s = processTexCoord(texCoord.s, texGenMode4_s, texGenParamsEye4_s, texGenParamsObject4_s);
        if (texGen4_t) texCoord.t = processTexCoord(texCoord.t, texGenMode4_t, texGenParamsEye4_t, texGenParamsObject4_t);
        if (texGen4_p) texCoord.p = processTexCoord(texCoord.p, texGenMode4_p, texGenParamsEye4_p, texGenParamsObject4_p);
        if (texGen4_q) texCoord.q = processTexCoord(texCoord.q, texGenMode4_q, texGenParamsEye4_q, texGenParamsObject4_q);
        gl_TexCoord[4] = gl_TextureMatrix[4] * texCoord;
    }
    if (useTex5)
    {
        vec4 texCoord = gl_MultiTexCoord5;
        if (texGen5_s) texCoord.s = processTexCoord(texCoord.s, texGenMode5_s, texGenParamsEye5_s, texGenParamsObject5_s);
        if (texGen5_t) texCoord.t = processTexCoord(texCoord.t, texGenMode5_t, texGenParamsEye5_t, texGenParamsObject5_t);
        if (texGen5_p) texCoord.p = processTexCoord(texCoord.p, texGenMode5_p, texGenParamsEye5_p, texGenParamsObject5_p);
        if (texGen5_q) texCoord.q = processTexCoord(texCoord.q, texGenMode5_q, texGenParamsEye5_q, texGenParamsObject5_q);
        gl_TexCoord[5] = gl_TextureMatrix[5] * texCoord;
    }
    if (useTex6)
    {
        vec4 texCoord = gl_MultiTexCoord6;
        if (texGen6_s) texCoord.s = processTexCoord(texCoord.s, texGenMode6_s, texGenParamsEye6_s, texGenParamsObject6_s);
        if (texGen6_t) texCoord.t = processTexCoord(texCoord.t, texGenMode6_t, texGenParamsEye6_t, texGenParamsObject6_t);
        if (texGen6_p) texCoord.p = processTexCoord(texCoord.p, texGenMode6_p, texGenParamsEye6_p, texGenParamsObject6_p);
        if (texGen6_q) texCoord.q = processTexCoord(texCoord.q, texGenMode6_q, texGenParamsEye6_q, texGenParamsObject6_q);
        gl_TexCoord[6] = gl_TextureMatrix[6] * texCoord;
    }
    if (useTex7)
    {
        vec4 texCoord = gl_MultiTexCoord7;
        if (texGen7_s) texCoord.s = processTexCoord(texCoord.s, texGenMode7_s, texGenParamsEye7_s, texGenParamsObject7_s);
        if (texGen7_t) texCoord.t = processTexCoord(texCoord.t, texGenMode7_t, texGenParamsEye7_t, texGenParamsObject7_t);
        if (texGen7_p) texCoord.p = processTexCoord(texCoord.p, texGenMode7_p, texGenParamsEye7_p, texGenParamsObject7_p);
        if (texGen7_q) texCoord.q = processTexCoord(texCoord.q, texGenMode7_q, texGenParamsEye7_q, texGenParamsObject7_q);
        gl_TexCoord[7] = gl_TextureMatrix[7] * texCoord;
    }
    fragNorm = gl_NormalMatrix * gl_Normal;
    fragCol = gl_Color;
    if (useNormals)
    {
        vec3 color = vec3(0.0);
        vec3 Idiff = color;
        vec3 pos = gl_LightSource[0].position.xyz-eyePos.xyz;
        vec3 L = normalize(pos);
        float d = dot(fragNorm, L);
        if (d > 0.0)
        {
            Idiff = gl_LightSource[0].diffuse.rgb * max(d, 0.0);
            Idiff = clamp(Idiff, 0.0, 1.0);
            color += Idiff;
        }
        pos = gl_LightSource[1].position.xyz-eyePos.xyz;
        L = normalize(pos);
        d = dot(fragNorm, L);
        if (d > 0.0)
        {
            Idiff = gl_LightSource[1].diffuse.rgb * max(d, 0.0);
            Idiff = clamp(Idiff, 0.0, 1.0);
            color += Idiff;
        }
        color = vec3(0.4) + (color * 0.6);
        fragCol.rgb *= clamp(color, 0.0, 1.0);
    }