-
Notifications
You must be signed in to change notification settings - Fork 0
/
voronoi_003_manhattan_distance.frag
81 lines (62 loc) · 1.57 KB
/
voronoi_003_manhattan_distance.frag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#ifdef GL_ES
precision mediump float;
#endif
#define S(a,b,t) smoothstep(a, b, t)
// video here: https://www.youtube.com/watch?v=l-07BXzNdPw
uniform vec2 u_resolution;
uniform float u_time;
vec2 N22(vec2 p) {
vec3 a = fract(p.xyx*vec3(123.34, 234.34, 345.65));
a += dot(a, a+34.45);
return fract(vec2(a.x*a.y, a.y*a.z));
}
void main() {
vec2 uv = (2. * gl_FragCoord.xy - u_resolution.xy) / u_resolution.xy;
float m = 0.;//N22(uv).x;
float t = u_time * 1.;
float minDist = 1000.;
float cellIndex = 0.;
vec3 col = vec3(0.);
if (false) {
for (float i = 0.; i<20.; i++){
vec2 n = N22(vec2(i));
vec2 p = sin(n*t);
float d = length(uv-p);
m += S(.02, .01, d);
if (d<minDist){
minDist = d;
cellIndex = i;
}
}
col = vec3(minDist);
} else {
uv *= 6.;
vec2 gv = fract(uv) - 0.5;
vec2 id = floor(uv);
vec2 cellId = vec2(0.);
for (float y=-1.; y<=1.; y++){
for (float x=-1.; x<=1.; x++){
vec2 offset = vec2(x,y);
vec2 n = N22(id+offset);
vec2 p = offset + sin(n*t)*.5;
p -= gv;
// Euclidean distance
float ed = length(p);
// manhattan distance
float md = abs(p.x) + abs(p.y);
// mix both distances...
float d = mix(ed, md, sin(u_time)*.5+ .5);
d=ed;
if (d<minDist){
minDist = d;
cellId = id+offset;
}
}
}
col = vec3(minDist);
//col.rg += cellId*.1;
}
//vec3 col = vec3(cellIndex/50.);
//vec3 col = vec3(minDist);
gl_FragColor = vec4(col,1.);
}