Skip to content

Commit 3557b6e

Browse files
committed
Add Voronoi node.
1 parent b703a2e commit 3557b6e

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed

packages/stores/blueprints.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import floor from "../../resources/nodes/utilities/floor";
1515
import invert from "../../resources/nodes/utilities/invert";
1616
import passthrough from "../../resources/nodes/utilities/pass-through";
1717
import perlinNoise from "../../resources/nodes/noises/perlin";
18+
import voronoi from "../../resources/nodes/noises/voronoi";
1819
import { MaterialNodeBlueprint, MaterialNodeBlueprintsPackage } from "../material/node";
1920

2021
const BUILTIN_NODES_PACKAGE: MaterialNodeBlueprintsPackage = new Map<string, MaterialNodeBlueprint>(
@@ -29,6 +30,7 @@ const BUILTIN_NODES_PACKAGE: MaterialNodeBlueprintsPackage = new Map<string, Mat
2930

3031
["perlin-noise", perlinNoise],
3132
["anisotropic-noise", anisotropicNoise],
33+
["voronoi", voronoi],
3234

3335
["gaussian-blur", gaussianBlur],
3436

resources/nodes/noises/voronoi.fs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#version 300 es
2+
precision highp float;
3+
4+
in vec2 a_texCoord;
5+
6+
uniform float p_offsetX;
7+
uniform float p_offsetY;
8+
uniform float p_scale;
9+
uniform float p_limit;
10+
11+
out vec4 out_color;
12+
13+
vec2 random2f(ivec2 x) {
14+
vec2 p = vec2(float(x.x), float(x.y));
15+
return fract(sin(vec2(dot(p, vec2(127.1f, 311.7f)), dot(p, vec2(269.5f, 183.3f)))) * 43758.5453f);
16+
}
17+
18+
// Based on: https://iquilezles.org/articles/voronoilines/
19+
20+
float voronoiDistance(vec2 x) {
21+
ivec2 p = ivec2(floor(x));
22+
vec2 f = fract(x);
23+
24+
ivec2 mb;
25+
vec2 mr;
26+
27+
float res = 8.0f;
28+
for(int j = -1; j <= 1; j++) {
29+
for(int i = -1; i <= 1; i++) {
30+
ivec2 b = ivec2(i, j);
31+
vec2 r = vec2(b) + random2f(p + b) - f;
32+
float d = dot(r, r);
33+
34+
if(d < res) {
35+
res = d;
36+
mr = r;
37+
mb = b;
38+
}
39+
}
40+
}
41+
42+
res = 8.0f;
43+
for(int j = -2; j <= 2; j++) {
44+
for(int i = -2; i <= 2; i++) {
45+
ivec2 b = mb + ivec2(i, j);
46+
vec2 r = vec2(b) + random2f(p + b) - f;
47+
float d = dot(0.5f * (mr + r), normalize(r - mr));
48+
49+
res = min(res, d);
50+
}
51+
}
52+
53+
return res;
54+
}
55+
56+
void main(void) {
57+
vec2 uv = (a_texCoord + vec2(p_offsetX, p_offsetY)) * p_scale;
58+
59+
float m_dist = voronoiDistance(uv);
60+
m_dist = smoothstep(0.0f, p_limit, m_dist);
61+
62+
out_color = vec4(vec3(m_dist), 1.0f);
63+
}

resources/nodes/noises/voronoi.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { MaterialNodeBlueprint } from "../../../packages/material/node";
2+
import glsl from "./voronoi.fs?raw";
3+
4+
export default {
5+
id: "voronoi",
6+
name: "Voronoi",
7+
groupName: "Noises",
8+
parameters: {
9+
offsetX: {
10+
id: "offsetX",
11+
name: "Offset X",
12+
inputType: "number",
13+
inputProps: { min: 0, max: 1 },
14+
valueType: "float",
15+
default: 0,
16+
},
17+
offsetY: {
18+
id: "offsetY",
19+
name: "Offset Y",
20+
inputType: "number",
21+
inputProps: { min: 0, max: 1 },
22+
valueType: "float",
23+
default: 0,
24+
},
25+
scale: {
26+
id: "scale",
27+
name: "Scale",
28+
inputType: "number",
29+
inputProps: { min: 0, max: 32 },
30+
valueType: "float",
31+
default: 12,
32+
},
33+
limit: {
34+
id: "limit",
35+
name: "Limit",
36+
inputType: "number",
37+
inputProps: { min: 0.01, max: 0.1, step: 0.001 },
38+
valueType: "float",
39+
default: 0.05,
40+
},
41+
},
42+
inputs: {},
43+
outputs: {
44+
color: {
45+
id: "color",
46+
textureType: "rgb",
47+
hidden: false,
48+
},
49+
},
50+
painter: {
51+
type: "glsl",
52+
fragmentShader: glsl,
53+
},
54+
} satisfies MaterialNodeBlueprint;

0 commit comments

Comments
 (0)