#version 120
#define pi 3.141592653589793238462643383279
#define twopi (pi * 2.0)
varying vec2 uv, uv1, uv2;
uniform sampler2D textures[4];
uniform vec4 sprite1;
uniform vec4 sprite2;
uniform float fade;
uniform float isDisabled;
uniform float isUsed;
uniform float isExported;
uniform float isColonizing;
uniform float isOwned;
uniform float isDecaying;
uniform float classIcon;
uniform vec4 captureColor;
uniform float capturePct;
uniform vec4 disableColor;

const float w = 128.0;
const float h = 256.0;
const float modRatio = 26.0/21.0;
const float modShift = 0.09;
const float row = 4.0;
const vec4 disabled_icon = vec4(28.0/w, 81.0/h, 55.0/w, 110.0/h);
const vec4 unused_icon = vec4(83.0/w, 2.0/h, 108.0/w, 27.0/h);
const vec4 decay_icon = vec4(29.0/w, 56.0/h, 54.0/w, 81.0/h);
const vec4 exported_icon = vec4(29.0/w, 2.0/h, 54.0/w, 27.0/h);
const vec4 colonizing_icon = vec4(2.0/w, 56.0/h, 29.0/w, 81.0/h);
const vec4 class_icon = vec4(2.0/w, 29.0/h, 27.0/w, 54.0/h);
const vec2 class_offset = vec2(27.0/w, 27.0/h);

void main() {
	vec4 result = texture2D(textures[0],uv);

	vec2 uv3 = (uv2 / modRatio) + vec2(modShift);
	vec4 disIcon = texture2D(textures[3], mix(disabled_icon.xy, disabled_icon.zw, uv1)) * disableColor;
	vec4 uIcon = texture2D(textures[3], mix(unused_icon.xy, unused_icon.zw, uv3));
	vec4 dIcon = texture2D(textures[3], mix(decay_icon.xy, decay_icon.zw, uv3));
	vec4 expIcon = texture2D(textures[3], mix(exported_icon.xy, exported_icon.zw, uv3));
	vec2 classOff = vec2(class_offset.x * mod(classIcon - 4.0, row), class_offset.y * floor((classIcon - 4.0)/row));
	vec4 clsIcon = texture2D(textures[3], mix(class_icon.xy+classOff, class_icon.zw+classOff, uv3));
	vec4 colIcon = texture2D(textures[3], mix(colonizing_icon.xy, colonizing_icon.zw, uv3-vec2(-0.4, -0.4)));
	
	result.rgb *= gl_Color.rgb;

	//Base of black transparent if unowned
	result *= isOwned;

	vec4 icon1 = texture2D(textures[1], mix(sprite1.xy, sprite1.zw, uv1));

	icon1.rgb = (fade * icon1.rgb) + ((1.0 - fade) * gl_Color.rgb);
	if(all(bvec4( greaterThanEqual(uv1, vec2(0.0)), lessThanEqual(uv1, vec2(1.0))))) {
		result = mix( result, vec4(icon1.rgb, 1.0), icon1.a );
		result = mix( result, vec4(disIcon.rgb, 1.0), disIcon.a * fade * isDisabled );
	}
	
	vec4 icon2 = texture2D(textures[2], mix(sprite2.xy, sprite2.zw, uv2));
	if(all(bvec4( greaterThanEqual(uv2, vec2(0.0)), lessThanEqual(uv2, vec2(1.0))))) {
		result = mix( result, vec4(icon2.rgb, 1.0), icon2.a * fade );
	}
	
	if(all(bvec4( greaterThanEqual(uv3, vec2(0.0)), lessThanEqual(uv3, vec2(1.0))))) {
		vec2 showCls = step(vec2(3.0, classIcon), vec2(classIcon, 20.0));
		result = mix( result, vec4(clsIcon.rgb, 1.0), clsIcon.a * fade * showCls.x * showCls.y );
		result = mix( result, vec4(dIcon.rgb, 1.0), dIcon.a * fade * isDecaying );
		result = mix( result, vec4(uIcon.rgb, 1.0), uIcon.a * fade * (1.0 - isUsed) );
		result = mix( result, vec4(expIcon.rgb, 1.0), expIcon.a * fade * isExported );
	}

	if(all(bvec4( greaterThanEqual(uv3, vec2(-0.4, -0.4)), lessThanEqual(uv3, vec2(0.6, 0.4))))) {
		result = mix( result, vec4(colIcon.rgb, 1.0), colIcon.a * fade * isColonizing );
	}

	if(captureColor.a > 0.0) {
		vec2 rcoords = (uv - vec2(0.5, 0.5)) * 2.0;
		float radius = length(rcoords);
		if(radius > 0.8 && radius < 1.0) {
			float ang = (atan(rcoords.x, rcoords.y) + pi) / twopi;
			if(ang < capturePct) {
				/*float alpha = sqrt((radius - 0.8) * 5.0);*/
				float alpha = 1.0 - (abs(radius - 0.9) * 11.0);
				result = mix( result, vec4(captureColor.rgb, 1.0), alpha * captureColor.a);
			}
		}
	}
	
	result.a *= gl_Color.a;
	gl_FragColor = result;
}
