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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
void node_tex_voronoi(vec3 co,
float scale,
float exponent,
float coloring,
float metric,
float feature,
out vec4 color,
out float fac)
{
vec3 p = co * scale;
int xx, yy, zz, xi, yi, zi;
vec4 da = vec4(1e10);
vec3 pa[4] = vec3[4](vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));
xi = floor_to_int(p[0]);
yi = floor_to_int(p[1]);
zi = floor_to_int(p[2]);
for (xx = xi - 1; xx <= xi + 1; xx++) {
for (yy = yi - 1; yy <= yi + 1; yy++) {
for (zz = zi - 1; zz <= zi + 1; zz++) {
vec3 ip = vec3(xx, yy, zz);
vec3 vp = cellnoise_color(ip);
vec3 pd = p - (vp + ip);
float d = 0.0;
if (metric == 0.0) { /* SHD_VORONOI_DISTANCE 0 */
d = dot(pd, pd);
}
else if (metric == 1.0) { /* SHD_VORONOI_MANHATTAN 1 */
d = abs(pd[0]) + abs(pd[1]) + abs(pd[2]);
}
else if (metric == 2.0) { /* SHD_VORONOI_CHEBYCHEV 2 */
d = max(abs(pd[0]), max(abs(pd[1]), abs(pd[2])));
}
else if (metric == 3.0) { /* SHD_VORONOI_MINKOWSKI 3 */
d = pow(pow(abs(pd[0]), exponent) + pow(abs(pd[1]), exponent) +
pow(abs(pd[2]), exponent),
1.0 / exponent);
}
vp += vec3(xx, yy, zz);
if (d < da[0]) {
da.yzw = da.xyz;
da[0] = d;
pa[3] = pa[2];
pa[2] = pa[1];
pa[1] = pa[0];
pa[0] = vp;
}
else if (d < da[1]) {
da.zw = da.yz;
da[1] = d;
pa[3] = pa[2];
pa[2] = pa[1];
pa[1] = vp;
}
else if (d < da[2]) {
da[3] = da[2];
da[2] = d;
pa[3] = pa[2];
pa[2] = vp;
}
else if (d < da[3]) {
da[3] = d;
pa[3] = vp;
}
}
}
}
if (coloring == 0.0) {
/* Intensity output */
if (feature == 0.0) { /* F1 */
fac = abs(da[0]);
}
else if (feature == 1.0) { /* F2 */
fac = abs(da[1]);
}
else if (feature == 2.0) { /* F3 */
fac = abs(da[2]);
}
else if (feature == 3.0) { /* F4 */
fac = abs(da[3]);
}
else if (feature == 4.0) { /* F2F1 */
fac = abs(da[1] - da[0]);
}
color = vec4(fac, fac, fac, 1.0);
}
else {
/* Color output */
vec3 col = vec3(fac, fac, fac);
if (feature == 0.0) { /* F1 */
col = pa[0];
}
else if (feature == 1.0) { /* F2 */
col = pa[1];
}
else if (feature == 2.0) { /* F3 */
col = pa[2];
}
else if (feature == 3.0) { /* F4 */
col = pa[3];
}
else if (feature == 4.0) { /* F2F1 */
col = abs(pa[1] - pa[0]);
}
color = vec4(cellnoise_color(col), 1.0);
fac = (color.x + color.y + color.z) * (1.0 / 3.0);
}
}
|