#version 330

layout (std140) uniform Materials {
	vec4 diffuse;
	vec4 ambient;
	vec4 specular;
	vec4 emissive;
	float shininess;
};

in Data {
	vec3 norm;
	vec3 lightDir;
	vec4 colr;
} DataIn;

out vec4 outputF;

void main() {
	//diffuse light
	vec4 diff = vec4(1.0);
	
	//get the pass-through color from vertex shader
	diff = DataIn.colr;
	
	// normalize both input vectors
	vec3 n = normalize(DataIn.norm);
	
	//set color for backfacing polygon
	if (n.z < 0){
        n = -n;
		diff[0] = 1.0 - (0.4 * DataIn.colr[0]);
		diff[1] = 1.0 - (0.4 * DataIn.colr[1]);
		diff[2] = 1.0 - (0.4 * DataIn.colr[2]);
		diff[3] = DataIn.colr[3];
	}
	
	//specular light
	vec4 spec = vec4(0.0);
	
	//light intensity factor for diffuse
	float intensity = 0.0;

	// first light direction from behind the camera
	vec3 l_dir0 = vec3 (0.0); l_dir0[2] = 1.0;
	intensity =  max(dot(n,l_dir0), 0.0);

	//second light direction from behind the camera (at an angle)
	vec3 l_dir1 = vec3 (0.0); l_dir1[1] = 0.65; l_dir1[2] = 1.0;
	intensity =  max(dot(n,l_dir1), intensity);

    if (intensity > 0.0) {
        vec3 h = normalize( l_dir0 );
		vec3 h2 = normalize( l_dir1 );
        float intSpec = max(max(dot(h,n),dot(h2,n)), 0.0);
        spec = vec4 (0.4, 0.4, 0.4, 0.1) * pow(intSpec,100);
    }
	outputF = max(intensity*diff + spec , ambient);
} 