#version 330 core
  
layout(location=0) in vec3 vVertex;		//położenie wierzchołka w przestrzeni obiektu
layout(location=1) in vec3 vNormal;		//wektor normalny wierzchołka
 
//uniformy  
uniform mat4 MVP;				//połączona macierz modelu, widoku i rzutowania
uniform mat4 MV;				//macierz modelu i widoku
uniform mat3 N;					//macierz normalna
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 obiekt
uniform float shininess;		//jasność odblasku
//dane wyjściowe dla shadera fragmentów
smooth out vec4 color;    //wyjściowy kolor śwaiatła rozpraszanego dla shadera fragmentów

//stała shaderowa
const vec3 vEyeSpaceCameraPosition = vec3(0,0,0); //obserwator znajduje się w punkcie vec3(0,0,0) przestrzeni oka

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
	vec4 vEyeSpaceLightPosition = MV*vec4(light_position,1);

	//mnożenie położenia wierzchołka w przestrzeni obiektu przez macierz modelu i widoku 
	//w celu wyznaczenia położenia wierzchołka w przestrzeni oka
	vec4 vEyeSpacePosition = MV*vec4(vVertex,1); 

	//mnożenie wektora normalnego z przestrzeni obiektu przez macierz normalną 
	//w celu wyznaczenia wektora normalnego w przestrzeni oka
	vec3 vEyeSpaceNormal   = normalize(N*vNormal);

	//wyznaczanie wektora światła
	vec3 L = normalize(vEyeSpaceLightPosition.xyz-vEyeSpacePosition.xyz);
	//wyznaczanie wektora widoku
	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ładowych rozproszenia i odblasku
	float diffuse = max(0, dot(vEyeSpaceNormal, L));
	float specular = max(0, pow(dot(vEyeSpaceNormal, H), shininess));

	//obliczanie koloru wyjściowego przez sumowanie składników rozproszenia i odblasku
	color = diffuse*vec4(diffuse_color,1) + specular*vec4(specular_color, 1);

	//mnożenie położenia wierzchołka w przestrzeni obiektu przez połączoną macierz modelu, widoku i rzutowania
	//w celu wyznaczenia położenia wierzchołka w przestrzeni przycięcia
    gl_Position = MVP*vec4(vVertex,1); 
}
 