#version 400 core
uniform mat4 mvMatrix;
uniform mat4 projMatrix;
uniform mat3 normalMatrix;
uniform vec3 lDirection;

uniform vec4 color;

uniform bool isSky;
uniform bool isPhong;
uniform bool isLightSource;
uniform bool isPickingMode;
uniform vec3 pointLight[3];

in vec4 vPosition;
in vec3 vNormal;
in vec2 vUv;

out vec2 texCoords;
out vec4 ifColor;
out vec3 fPosition;
out vec3 fNormal;
out vec3 vfNormal;

vec4 calcDirLight(vec4 eye, vec3 fPos, vec3 fNorm) {
    // Get lighting vectors
    vec3 LightDirection = normalize(lDirection);
	vec3 nfNormal = normalize(fNorm);
    vec3 nviewDirection = normalize(fPos);

    // Compute diffuse component
    float diff = 0.65 * max(0.0, dot(nfNormal, LightDirection));

    // Compute specular component
	//vec3 Rl = normalize(-LightDirection+2.0*nfNormal*dot(nfNormal,LightDirection));

	vec3 Rl = reflect(-LightDirection, fNorm);
	float spec = 0.1*pow(max(0.0, dot(Rl, nviewDirection)), 16);

    // Compute ambient component
    vec3 amb = vec3(0.1);

    // Vertex color (currently static, to be replaced with texture)
    vec4 color = ifColor;

	return color * vec4(amb + diff + spec, 1);
}

vec4 calcPointLight(vec4 eye, vec3 fPos, vec3 fNorm, int i) {
    // Get lighting vectors
    vec3 LightDirection = normalize(pointLight[i] - fPos);
    vec3 nfNormal = normalize(fNorm);
    vec3 nviewDirection = normalize(fPos);

    // Attenuation
    float distance    = length(pointLight[i] - nviewDirection);
    float attenuation = 1.0f / (distance * distance);

    // Compute diffuse component
    float diff = attenuation * 0.65 * max(0.0, dot(nfNormal, LightDirection));

    // Compute specular component
    vec3 Rl = normalize(-LightDirection+2.0*nfNormal*dot(nfNormal,LightDirection));
    float spec = attenuation * 0.1*pow(max(0.0, dot(Rl, nviewDirection)), 16);

    // Compute ambient component
    vec3 amb = attenuation * vec3(0.1);

    // Vertex color (currently static, to be replaced with texture)
    vec4 color = ifColor;

    return 0.3 * color * vec4(amb + diff + spec, 1);
}

void
main()
{
    vec4 vEyeCoord = mvMatrix * vPosition;
    gl_Position = projMatrix * vEyeCoord;
    fPosition = -vEyeCoord.xyz;
        fNormal = normalMatrix * vNormal;

    texCoords = vUv;

    ifColor = color;

	if(!isPickingMode && !isPhong && !isSky && !isLightSource) {
        ifColor = calcDirLight(vEyeCoord, fPosition, fNormal)
                + calcPointLight(vEyeCoord, fPosition, fNormal, 0)
                + calcPointLight(vEyeCoord, fPosition, fNormal, 1)
                + calcPointLight(vEyeCoord, fPosition, fNormal, 2);
    }
}

