precision highp float;

varying vec2 texCoord;
varying vec2 bumptexCoord;
varying vec3 tmpNormal;

uniform mat4 modelViewMatrix;
uniform sampler2D textureUnit0;

void main ()
{
    const vec3 tmpKey = -1.0*normalize(vec3(2.0,-10.0,1.0)); // key light
    const vec3 tmpFill = -1.0*normalize(vec3(-2.15,8.0,-0.9)); // fill light
    
    vec3 eyeVec = normalize(vec3(modelViewMatrix[2][0],modelViewMatrix[2][1],modelViewMatrix[2][2]));
    
    vec4 base = texture2D(textureUnit0, texCoord);
    vec4 bump = texture2D(textureUnit0, bumptexCoord);
    
    float bumpf = clamp((bump.r+bump.g+bump.b)*0.333,0.0,1.0);
    float bumpf2 = clamp((base.r+base.g+base.b)*0.333,0.0,1.0);
    float cbump = clamp(2.0*(pow(0.5*(1.0+clamp(bumpf2 - bumpf,-1.0,1.0)),8.0)-0.5),-1.0,1.0);
    vec3 altNormal = normalize(vec3(tmpNormal.x+cbump*(tmpNormal.y + tmpNormal.z)*0.001,tmpNormal.y+cbump*(tmpNormal.x+tmpNormal.z)*0.001,tmpNormal.z+cbump*(tmpNormal.x+tmpNormal.y)*0.001));
        
    float mydiffuse = 2.0*clamp(max(dot(tmpKey,altNormal),0.0) + 0.45*max(dot(tmpFill,altNormal),0.0),0.0,1.0);
    float myspecular = 0.25*clamp(pow(max(dot(reflect(tmpKey,altNormal),eyeVec),0.0),8.0) + 0.75*pow(max(dot(reflect(tmpFill,altNormal),eyeVec),0.0),8.0),0.0,1.0);
    
    gl_FragColor = clamp(2.0*base*(mydiffuse+myspecular),0.0,1.0);
    gl_FragColor.a = 1.0;
}