in vec2 vertex_uv;
in vec3 vertex_normal;
in vec4 vertex_tangent;
in vec3 vertex_pos;

#include "drive/common/brdf.glsl"

// written from a presentation slide, modified slightly
float valveSpecularAA(vec3 geometricNormal, float roughness)
{
	vec3 dnx = dFdx(geometricNormal);
	vec3 dny = dFdy(geometricNormal);
	float roughFactor = pow(clamp(max(dot(dnx, dnx), dot(dny, dny)) ,0.0, 1.0), 1.0/4.0);
	return max(roughness, roughFactor);
}

void main()
{
	float longitudal_term = sin(vertex_uv.x*PI*0.5) * 0.5 + 0.5;
	float latitudal_term =vertex_uv.y;



	float seam_spread = 0.0125;
	float seam_offset = 0.5;
	float seam_min = seam_offset - seam_spread/2.0;
	float seam_max = seam_offset + seam_spread/2.0;

	vec3 albedo = mix(vec3(1.0, 0.2, 0.2), vec3(0.7, 0.56, 0.45), smoothstep(seam_min, seam_max, latitudal_term));

	float metallic = smoothstep(seam_min, seam_max, latitudal_term);
	
	float roughness = mix(0.04, 0.4, longitudal_term);
	float occlusion = 1.0;

	// normal mapping 
	vec3 worldNormal = normalize(vertex_normal);

	roughness = valveSpecularAA(worldNormal, roughness);

	// build surface state 
	vec3 viewVector = -normalize(vertex_pos - (inverse(u_view) * vec4(0.0, 0.0, 0.0, 1.0)).xyz);
	SurfaceState surf = GetSurfaceState(albedo, metallic, roughness, worldNormal, viewVector, vec4(vertex_pos, 1.0), occlusion);

	vec3 color = vec3(0.0, 0.0, 0.0);

    // apply hardcoded PBR directional lights
	vec3 lightDirs[2] = vec3[](
		normalize(vec3(1.0, 0.0, 0.0)),
		normalize(vec3(-1.0, 0.0, 0.0))
	);

	vec3 lightCols[2] = vec3[](
		vec3(1.0, 0.57, 0.37),
		vec3(0.37, 0.57, 1.0)
	);

	float lightStr[2] = float[](
		3.0, 2.0
	);

	for(int i = 0; i < 2; i++)
	{
		LightState light = GetLightState(surf, lightDirs[i], lightCols[i], lightStr[i]);

		color += DirectLighting(surf, light);
	}

    // Apply IBL
	color += ImageLighting(t_brdf, t_irradiance, t_radiance, surf) * 2.0;


	out_color0 = vec4(color, 1.0);
}