#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

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

//stałe shadera
const float k0 = 1.0;	//wygaszanie stałe
const float k1 = 0.0;	//wygaszanie liniowe
const float k2 = 0.0;	//wygaszanie kwadratowe

void main() { 
	//mnożenie położenia światła z 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;
	//wyznaczanie wektora światła
	vec3 L = (vEyeSpaceLightPosition-vEyeSpacePosition);
	//Wyznaczanie odległości do źródła światła
	float d = length(L);
	//normalizacja wektora światła
	L = normalize(L);
	//obliczanie składowej rozproszenia
	float diffuse = max(0, dot(vEyeSpaceNormal, L));	
	//wprowadzenie wygaszania
	float attenuationAmount = 1.0/(k0 + (k1*d) + (k2*d*d));
	diffuse *= attenuationAmount;
	//wyprowadzenie iloczynu składowej rozproszenia i koloru rozproszenia 
	//jako kolor bieżącego fragmentu
	vFragColor = diffuse*vec4(diffuse_color,1);	 
}