#version 330 core

layout(location=0) out vec4 vFragColor;	//wyjście shadera fragmentów
 
//uniformy
uniform mat4 MV;				//macierz modelu i widoku
uniform vec3 light_position;	//położenie światła w przestrzeni obiektu
uniform vec3 diffuse_color;		//kolor światła rozpraszanego przez obiekt
uniform vec3 specular_color;	//kolor światła odbijanego przez powierzchnię obiektu
uniform float shininess;		//jasność odblasku 

//dane wejściowe z shadera wierzchołków
smooth in vec3 vEyeSpaceNormal;		//interpolowany wektor normalny w przestrzeni oka
smooth in vec3 vEyeSpacePosition;	//interpolowany wektor położenia w przestrzeni oka

//stała shaderowa
const vec3 vEyeSpaceCameraPosition = vec3(0,0,0);

void main() { 
	//mnożenie położenia światła w przestrzeni obiektu przez macierz modelu i widoku 
	//w celu wyznaczenia położenia swiatła w przestrzeni oka
	vec3 vEyeSpaceLightPosition = (MV * vec4(light_position,1)).xyz;

	//normalizacja wektora normalnego w przestrzeni oka
	vec3 N = normalize(vEyeSpaceNormal);	
	//wyznaczanie wektora światła i jego normalizacja
	vec3 L = normalize(vEyeSpaceLightPosition-vEyeSpacePosition);
	//wyznaczanie wektora widoku i jego normalizacja
	vec3 V = normalize(vEyeSpaceCameraPosition.xyz-vEyeSpacePosition.xyz);
	//wyznaczanie wektora pośredniego między wektorami światła i widoku
	vec3 H = normalize(L+V);
	//obliczanie składowej rozproszenia
	float diffuse = max(0, dot(N, L));
	//obliczanie składowej odblasku
	float specular = max(0, pow(dot(N, H), shininess));

	//wyprowadzenie sumy składowych koloru
	//jako ostatecznego koloru fragmentu 
	vFragColor = diffuse*vec4(diffuse_color,1) + specular*vec4(specular_color, 1);
}