precision mediump float;
uniform sampler2D Texture;
uniform float Transparency;


varying vec3 position;
varying vec3 normal;
varying vec2 texCoord;

uniform vec3 lightPos;
uniform vec3 cameraPos;
uniform vec3 ambientLight;
uniform vec3 diffuseLight;
uniform vec3 specularLight;
uniform float specularPower;

void phongModel( vec3 norm, out vec3 ambAndDiff, out vec3 spec ) 
{
    vec3 lightDirection =  normalize(vec3(lightPos));
	vec3 cameraDirection =  normalize(vec3(cameraPos) - position);
    vec3 lightReflection = reflect( -lightDirection, norm );

    float sDotN = max( dot(lightDirection,norm), 0.0 );
	
    vec3 diffuse = diffuseLight * sDotN;
    ambAndDiff = ambientLight + diffuse;
	
    spec = vec3(0.0);
    if(sDotN > 0.0)
    {
        spec = specularLight * pow(max( dot(lightReflection, cameraDirection), 0.0 ), specularPower);
		// spec is NAN, if dot == 0 && specularPower <= 0
    }
}

void main()
{
    vec3 ambAndDiff, spec;
	vec3 norm = normalize(normal);	
	
	phongModel(norm, ambAndDiff, spec);

    vec4 textureColor = texture2D(Texture, texCoord).rgba;
	
	textureColor.r = textureColor.r * ambAndDiff.r + spec.r;
	textureColor.g = textureColor.g * ambAndDiff.g + spec.g;
	textureColor.b = textureColor.b * ambAndDiff.b + spec.b;
	
	gl_FragColor = textureColor;
}