#define pi 3.141592653589793238462643383279

const float gridWidth = 120.0;
const float gridSize = 25000.0;
const float gridFadeDist = 300000000.0;

const float subGridWidth = 0.0;
const float subGridSize = 50.0;
const float subGridFadeDist = 0.0;

const float subsubGridWidth = 0.0;
const float subsubGridSize = 50.0;
const float subsubGridFadeDist = 0.0;

uniform float radius;
uniform float planeDist;

varying vec2 uv;
varying vec2 rcoords;

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

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

	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 = 0.0;
	return res;
}

void main() {
	float distance = length(rcoords);
	float bordMult = 1.0;
	if(distance > 0.9)
		discard;

	vec4 color;
	if(uv.x > 0.5 && abs(uv.y - 0.5) < 0.002)
		color = vec4(1.0, 0.0, 0.0, 1.0);
	else
		color = grid(distance, bordMult);

	color.a *= clamp((planeDist - 32000.0) / 60000.0, 0.0, 1.0);
	color.a *= clamp(1.0 - (planeDist - 300000.0) / 60000.0, 0.0, 1.0);

	if (color.a == 0.0)
		discard;
	gl_FragColor = color;
}
