#define pi 3.141592653589793238462643383279

const float pipRads = 2.0 * pi / 72.0;
const float pipMargin = 0.15 * pipRads;

const float gridWidth = 8.0;
const float gridSize = 500.0;
const float gridFadeDist = 100000.0;

const float subGridWidth = 4.0;
const float subGridSize = 250.0;
const float subGridFadeDist = 30000.0;

const float subsubGridWidth = 2.0;
const float subsubGridSize = 50.0;
const float subsubGridFadeDist = 10000.0;

uniform float radius;
uniform float inner_radius;
uniform float planeDist;
//uniform float visible;
uniform float cycle;
//uniform vec3 planeColor;
uniform vec4 glowColor;

varying vec2 uv;
varying vec2 rcoords;

//uniform float emp1_endrad;
//uniform float emp2_endrad;
//uniform float emp3_endrad;
//uniform float emp4_endrad;

//uniform float emp2_startrad;
//uniform float emp3_startrad;
//uniform float emp4_startrad;

//uniform vec3 emp1_col;
//uniform vec3 emp2_col;
//uniform vec3 emp3_col;
//uniform vec3 emp4_col;

//vec4 strengthPips(float distance, float bordMult) {
	//float ang = atan(gl_TexCoord[0].y, gl_TexCoord[0].x) + pi;
	//if(ang > emp4_endrad)
		//return vec4(0, 0, 0, 0);
	
	//if(bordMult < 1.5 && mod(ang, pipRads) * bordMult < pipMargin)
		//return vec4(0, 0, 0, 0);

	//vec3 col;
	//if (ang < emp1_endrad) {
		//col = emp1_col;
	//}
	//else if (ang < emp2_endrad) {
		//if (ang < emp2_startrad)
			//return vec4(0, 0, 0, 0);
		//col = emp2_col;
	//}
	//else if (ang < emp3_endrad) {
		//if (ang < emp3_startrad)
			//return vec4(0, 0, 0, 0);
		//col = emp3_col;
	//}
	//else if (ang < emp4_endrad) {
		//if (ang < emp4_startrad)
			//return vec4(0, 0, 0, 0);
		//col = emp4_col;
	//}

	//if (visible == 0.0)
		//return vec4(col, (1.0 - distance) / (0.04 * bordMult) * 0.4);
	//return vec4(col, 1.0);
//}

vec4 grid(float distance, float bordMult) {
	if(distance >= 1.0)
		return vec4(0, 0, 0, 0);

	//float innerPipBorder = 1.0 - (0.04 * bordMult);
	//if (distance > innerPipBorder) {
		//return strengthPips(distance, bordMult);
	//}

	vec4 res;
	res.rgb = gl_Color.rgb;
	float baseAlpha = smoothstep(500.0, 2000.0, planeDist) * 0.08;

	float inner_distance = inner_radius / radius;
	if(distance > inner_distance)
		baseAlpha *= 1.0 - ((distance - inner_distance) / (1.0 - inner_distance));

	vec2 absCoords = rcoords * radius;
	vec2 gridPos = abs(mod(absCoords, gridSize));
	gridPos = min(gridPos, gridSize - gridPos);

	// Main grid alpha
	if(planeDist < gridFadeDist) {
		if(gridPos.x <= gridWidth * bordMult || gridPos.y <= gridWidth * bordMult) {
			res.a = baseAlpha * 2.0;
			return res;
		}

		if(planeDist < subGridFadeDist) {
			vec2 subGridPos = abs(mod(absCoords, subGridSize));
			subGridPos = min(subGridPos, subGridSize - subGridPos);
			if(subGridPos.x <= subGridWidth * bordMult || subGridPos.y <= subGridWidth * bordMult) {
				res.a = baseAlpha * 1.8;
				return res;
			}
			
			if(planeDist < subsubGridFadeDist) {
				vec2 subsubGridPos = abs(mod(absCoords, subsubGridSize));
				subsubGridPos = min(subsubGridPos, subsubGridSize - subsubGridPos);
				if(subsubGridPos.x <= subsubGridWidth * bordMult || subsubGridPos.y <= subsubGridWidth * bordMult) {
					res.a = baseAlpha * 1.5;
					return res;
				}
			}
		}
	}
	
	res.a = baseAlpha;
	return res;
}

vec4 attackGlow(vec4 color, float distance, float bordMult) {
	float inner_distance = 1.0 - ((1.0 - (inner_radius / radius)) * 0.2 * bordMult);
	if(distance < inner_distance || distance > 1.0)
		return color;

	float pct = (distance - inner_distance) / (1.0 - inner_distance);
	pct *= abs(cycle - 0.5) / 0.5;

	return vec4(mix(glowColor.rgb, color.rgb, color.a / pct),
			mix(color.a, glowColor.a, pct));
}

void main() {
	float distance = length(rcoords);
	float glowMult = min(planeDist / 10000.0, 6.0) + 1.0;
	float bordMult = min(planeDist / 2000.0, 2.0);

	vec4 color = grid(distance, bordMult);

	if (glowColor.a != 0.0)
		color = attackGlow(color, distance, glowMult);

	if (color.a == 0.0)
		discard;

	gl_FragColor = color;
}
