|
|
@@ -20,59 +20,46 @@ uniform sampler2D u_Texture; |
|
|
|
|
|
|
|
varying vec4 pass_Position; |
|
|
|
|
|
|
|
float rand(in vec2 p, in float v) |
|
|
|
float segdist(vec2 p1, vec2 p2, vec2 a) |
|
|
|
{ |
|
|
|
return fract(v * sin(dot(p, vec2(1298.9837, 7823.33145)))); |
|
|
|
float d = max(1e-10, dot(p2 - p1, p2 - p1)); |
|
|
|
float t = clamp(dot(a - p1, p2 - p1) / d, 0.0, 1.0); |
|
|
|
return distance(a, mix(p1, p2, t)); |
|
|
|
} |
|
|
|
|
|
|
|
float point2segment(vec2 p1, vec2 p2, vec2 a) |
|
|
|
{ |
|
|
|
float l2 = dot(p2 - p1, p2 - p1); |
|
|
|
if (l2 == 0.0) |
|
|
|
return distance(a, p1); |
|
|
|
float t = dot(a - p1, p2 - p1) / l2; |
|
|
|
if (t < 0.0) |
|
|
|
return distance(a, p1); |
|
|
|
else if (t > 1.0) |
|
|
|
return distance(a, p2); |
|
|
|
vec2 proj = p1 + t * (p2 - p1); |
|
|
|
return distance(a, proj); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void main(void) |
|
|
|
{ |
|
|
|
float width = 800.0; |
|
|
|
float height = 600.0; |
|
|
|
float line_width = 2.0; |
|
|
|
|
|
|
|
vec2 t = pass_Position.xy; |
|
|
|
vec2 tc1 = floor(t * 128.0) / 128.0; |
|
|
|
vec2 tc2 = tc1 + vec2(1.0, 1.0) / 128.0; |
|
|
|
vec2 tc0 = tc1 - vec2(1.0, 1.0) / 128.0; |
|
|
|
vec2 tc3 = tc2 + vec2(1.0, 1.0) / 128.0; |
|
|
|
float line_width = 1.8; |
|
|
|
vec4 delta = vec4(1.0 / 128, 0.0, |
|
|
|
2.0 / 128, 0.0); |
|
|
|
|
|
|
|
vec2 p = pass_Position.xy; |
|
|
|
vec2 tc = vec2(floor(p.x * 128.0) / 128.0, p.y); |
|
|
|
float t = p.x * 128.0 - floor(p.x * 128.0); |
|
|
|
vec4 c; |
|
|
|
c[0] = texture2D(u_Texture, tc0).x; |
|
|
|
c[1] = texture2D(u_Texture, tc1).x; |
|
|
|
c[2] = texture2D(u_Texture, tc2).x; |
|
|
|
c[3] = texture2D(u_Texture, tc3).x; |
|
|
|
c[0] = texture2D(u_Texture, tc - delta.xy).x; |
|
|
|
c[1] = texture2D(u_Texture, tc).x; |
|
|
|
c[2] = texture2D(u_Texture, tc + delta.xy).x; |
|
|
|
c[3] = texture2D(u_Texture, tc + delta.zw).x; |
|
|
|
|
|
|
|
/* Artificially compress in Y */ |
|
|
|
/* Quick hack: artificially compress display in Y */ |
|
|
|
c *= 0.3; |
|
|
|
|
|
|
|
vec2 p0 = vec2(tc0.x * width, c[0] * height); |
|
|
|
vec2 p1 = vec2(tc1.x * width, c[1] * height); |
|
|
|
vec2 p2 = vec2(tc2.x * width, c[2] * height); |
|
|
|
vec2 p3 = vec2(tc3.x * width, c[3] * height); |
|
|
|
vec2 a = vec2(t.x * width, t.y * height); |
|
|
|
vec2 p0 = vec2((tc.x - delta.x) * width, c[0] * height); |
|
|
|
vec2 p1 = vec2((tc.x) * width, c[1] * height); |
|
|
|
vec2 p2 = vec2((tc.x + delta.x) * width, c[2] * height); |
|
|
|
vec2 p3 = vec2((tc.x + delta.z) * width, c[3] * height); |
|
|
|
vec2 a = vec2(p.x * width, p.y * height); |
|
|
|
|
|
|
|
float d0 = point2segment(p0, p1, a); |
|
|
|
float d1 = point2segment(p1, p2, a); |
|
|
|
float d2 = point2segment(p2, p3, a); |
|
|
|
float d0 = segdist(p0, p1, a); |
|
|
|
float d1 = segdist(p1, p2, a); |
|
|
|
float d2 = segdist(p2, p3, a); |
|
|
|
|
|
|
|
float d = clamp(line_width - min(min(d0, d1), d2), 0.0, 1.0); |
|
|
|
|
|
|
|
gl_FragColor = vec4(t.y, d, d * 0.3, 1.0); |
|
|
|
/* Choose some funny colours */ |
|
|
|
gl_FragColor = vec4(p.y, d, mix(p.x, 0.3, d), 1.0); |
|
|
|
} |
|
|
|
|