100 lines
2.6 KiB
GLSL
100 lines
2.6 KiB
GLSL
precision highp float;
|
|
|
|
varying vec2 vUv;
|
|
|
|
const float PI = 3.14159265359;
|
|
|
|
uniform vec2 dimensions;
|
|
uniform vec3 camPos;
|
|
uniform vec2 zoomLimits;
|
|
uniform vec3 backgroundColor;
|
|
uniform vec3 lineColor;
|
|
|
|
float grid(float x, float y, float divisions, float thickness) {
|
|
x = fract(x * divisions);
|
|
x = min(x, 1.0 - x);
|
|
|
|
float xdelta = fwidth(x);
|
|
x = smoothstep(x - xdelta, x + xdelta, thickness);
|
|
|
|
y = fract(y * divisions);
|
|
y = min(y, 1.0 - y);
|
|
|
|
float ydelta = fwidth(y);
|
|
y = smoothstep(y - ydelta, y + ydelta, thickness);
|
|
|
|
return clamp(x + y, 0.0, 1.0);
|
|
}
|
|
|
|
float circle_grid(float x, float y, float divisions, float circleRadius) {
|
|
|
|
float gridX = mod(x + divisions/2.0, divisions) - divisions / 2.0;
|
|
float gridY = mod(y + divisions/2.0, divisions) - divisions / 2.0;
|
|
|
|
// Calculate the distance from the center of the grid
|
|
float gridDistance = length(vec2(gridX, gridY));
|
|
|
|
// Use smoothstep to create a smooth transition at the edges of the circle
|
|
float circle = 1.0 - smoothstep(circleRadius - 0.5, circleRadius + 0.5, gridDistance);
|
|
|
|
return circle;
|
|
}
|
|
|
|
float lerp(float a, float b,float t) {
|
|
return a * (1.0 - t) + b * t;
|
|
}
|
|
|
|
void main(void) {
|
|
|
|
float cx = camPos.x;
|
|
float cy = camPos.y;
|
|
float cz = camPos.z;
|
|
|
|
float width = dimensions.x;
|
|
float height = dimensions.y;
|
|
|
|
float minZ = zoomLimits.x;
|
|
float maxZ = zoomLimits.y;
|
|
|
|
float divisions = 0.1/cz;
|
|
float thickness = 0.05/cz;
|
|
float delta = 0.1 / 2.0;
|
|
|
|
float nz = (cz - minZ) / (maxZ - minZ);
|
|
|
|
float ux = (vUv.x-0.5) * width + cx*cz;
|
|
float uy = (vUv.y-0.5) * height - cy*cz;
|
|
|
|
|
|
//extra small grid
|
|
float m1 = grid(ux, uy, divisions*4.0, thickness*4.0) * 0.9;
|
|
float m2 = grid(ux, uy, divisions*16.0, thickness*16.0) * 0.5;
|
|
float xsmall = max(m1, m2);
|
|
|
|
float s3 = circle_grid(ux, uy, cz/1.6, 1.0) * 0.5;
|
|
xsmall = max(xsmall, s3);
|
|
|
|
// small grid
|
|
float c1 = grid(ux, uy, divisions, thickness) * 0.6;
|
|
float c2 = grid(ux, uy, divisions*2.0, thickness) * 0.5;
|
|
float small = max(c1, c2);
|
|
|
|
float s1 = circle_grid(ux, uy, cz*10.0, 2.0) * 0.5;
|
|
small = max(small, s1);
|
|
|
|
// large grid
|
|
float c3 = grid(ux, uy, divisions/8.0, thickness/8.0) * 0.5;
|
|
float c4 = grid(ux, uy, divisions/2.0, thickness/4.0) * 0.4;
|
|
float large = max(c3, c4);
|
|
|
|
float s2 = circle_grid(ux, uy, cz*20.0, 1.0) * 0.4;
|
|
large = max(large, s2);
|
|
|
|
float c = mix(large, small, min(nz*2.0+0.05, 1.0));
|
|
c = mix(c, xsmall, max(min((nz-0.3)/0.7, 1.0), 0.0));
|
|
|
|
vec3 color = mix(backgroundColor, lineColor, c);
|
|
|
|
gl_FragColor = vec4(color, 1.0);
|
|
}
|