#version 330 core

layout(location=0) out vec4 vFragColor;	//wyjście shadera fragmentów

//uniformy
uniform vec3 light_position;	//położenie światła w przestrzeni oka
uniform vec3 spot_direction;	//kierunek reflektora w przestrzeni oka
uniform float spot_cutoff;		//kąt odcięcia
uniform float spot_exponent;	//wykładnik tłumienia kątowego
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() { 
	//wyznaczanie wektora światła
	vec3 L = (light_position.xyz-vEyeSpacePosition);
	//Wyznaczanie odległości do źródła światła
	float d = length(L);
	//normalizacja wektora światła
	L = normalize(L);
	//normalizacja kierunku reflektora
	vec3 D = normalize(spot_direction);

	//wyznaczanie kąta między kierunkami reflektora i światła
	vec3 V = -L;
	float diffuse = 1;	  
	float spotEffect = dot(V,D);
	
	//jeśli kąt ten jest większy od kąta odcięcia, cieniujemy powierzchnię
	if(spotEffect > spot_cutoff) {
		//obliczanie składowej rozproszenia
		diffuse = max(0, dot(vEyeSpaceNormal, L));	
		//kątowe wygaszanie światła 
		spotEffect = pow(spotEffect, spot_exponent);
		//zanikanie światła wraz z odległością
		float attenuationAmount = spotEffect/(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);	 
	}  
	else {
        vFragColor =  vec4(0,0,0,0);
    } 
}