#version 330 core
out vec4 finalColor;

in vec2 texCoord;
in vec2 texCoord2;

uniform sampler2D gPosition;
uniform sampler2D gNormal;
uniform sampler2D gAlbedoSpec;
uniform sampler2D gZ;

struct Light {
    int enabled;
    int type; // Unused in this demo.
    vec3 position;
    vec3 target; // Unused in this demo.
    vec4 color;
};

const int NR_LIGHTS = 4;
uniform Light lights[NR_LIGHTS];
uniform vec3 viewPosition;

const float QUADRATIC = 0.032;
const float LINEAR = 0.09;

void main() {
	vec3 fragPosition = texture(gPosition, texCoord).rgb;
	vec3 normal = texture(gNormal, texCoord).rgb;
	vec3 albedo = texture(gAlbedoSpec, texCoord).rgb;
	float specular = texture(gAlbedoSpec, texCoord).a;
	//vec3 depth = texture(gZ, texCoord).rgb;

	vec3 ambient = albedo * vec3(0.1f);
	vec3 viewDirection = normalize(viewPosition - fragPosition);

	for(int i = 0; i < NR_LIGHTS; ++i) {
		if(lights[i].enabled == 0) continue;
		vec3 lightDirection = lights[i].position - fragPosition;
		vec3 diffuse = max(dot(normal, lightDirection), 0.0) * albedo * lights[i].color.xyz;

		vec3 halfwayDirection = normalize(lightDirection + viewDirection);
		float spec = pow(max(dot(normal, halfwayDirection), 0.0), 32.0);
		vec3 specular = specular * spec * lights[i].color.xyz;

		// Attenuation
		float distance = length(lights[i].position - fragPosition);
		float attenuation = 1.0 / (1.0 + LINEAR * distance + QUADRATIC * distance * distance);
		diffuse *= attenuation;
		specular *= attenuation;
		ambient += diffuse + specular;
	}
	finalColor = vec4(ambient, 1.0);
}
