#version 120
//input textures
uniform sampler2D colourMap;
uniform sampler2D normalMap;
uniform sampler2D reflectMap;
uniform sampler2D specularMap;
//light properties
uniform vec3 lightPosition = vec3(0.0);
uniform vec3 lightColour = vec3(0.6, 0.6, 0.6);
uniform float lightPower = 0.6;
uniform vec4 lightSpecColour = vec4(0.6, 0.6, 0.6, 1.0);
uniform float lightSpecPower = 0.08; //smaller is more glossy

uniform vec2 reflectOffset; //offset the reflection map by sprite coords
			    //so that the reflection appears static when the sprite moves
uniform vec2 resolution = vec2(60.0, 102.0); //set this to size of the sprite to which this shader is applied
uniform bool invertBumpY = true; //some normal maps require inverted Y channel

void main()
{
	//sample our diffuse and normal maps
	vec2 coord = gl_TexCoord[0].xy;
	vec4 diffuseColour = texture2D(colourMap, coord);
	vec3 normalColour = texture2D(normalMap, coord).rgb;
	
	//get normal value from sample
	normalColour.g = invertBumpY ? 1.0 - normalColour.g : normalColour.g;
	vec3 normal = normalize(normalColour * 2.0 - 1.0);
	
	//mix reflection map with colour using normal map alpha
	float blendVal = texture2D(normalMap, coord).a;
	coord = mod(reflectOffset, resolution) / resolution; //add offset to coord
	coord.y = 1.0 - coord.y;
	vec3 reflectColour = texture2D(reflectMap, coord + (normal.rg * 2.0)).rgb; //adding normal distorts reflection
	diffuseColour.rgb = mix(diffuseColour.rgb, reflectColour, blendVal);
	
	//calculate the light vector
	vec3 lightDir = vec3((lightPosition.xy - gl_FragCoord.xy) / resolution, lightPosition.z);
	
	//calculate the colour intensity based on normal and add specular to pixels facing light
	float colourIntensity = max(dot(normal, normalize(lightDir)), 0.0);
	vec4 specular = vec4(0.0);
	vec4 diffuse = vec4(0.0);
	if(colourIntensity > 0.0)
	{
		//vector half way between light and view direction
		vec3 halfVec = normalize(lightDir + vec3(0.5, 0.5, 0.5)); //fixed 2D view, so view is centred
		//get specular value from map
		vec4 specColour = vec4(texture2D(specularMap, gl_TexCoord[0].xy).rgb, 1.0);
		float specModifier = max(dot(normal, halfVec), 0.0);
		specular = pow(specModifier, lightSpecPower) * specColour * lightSpecColour;
		specular.a *= diffuseColour.a;
		diffuse = lightSpecColour * diffuseColour * colourIntensity;		
	}
	
	//add light colour
	diffuseColour.rgb += ((lightColour * lightPower) * colourIntensity);
	diffuseColour.rgb *= diffuseColour.rgb;
	
	//output sum
	gl_FragColor = clamp(specular + diffuse + diffuseColour, 0.0, 1.0);
}