Skip to content

Commit 53355a7

Browse files
authored
Merge pull request #7964 from LalitNarayanYadav/patch-9
Enhance p5.strands noise() to support noise(x, y) and 4-octave fractal noise
2 parents 746a481 + b46f73e commit 53355a7

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

src/webgl/ShaderGenerator.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1668,8 +1668,20 @@ function shadergenerator(p5, fn) {
16681668

16691669
GLOBAL_SHADER.output.vertexDeclarations.add(noiseGLSL);
16701670
GLOBAL_SHADER.output.fragmentDeclarations.add(noiseGLSL);
1671-
return fnNodeConstructor('noise', args, { args: ['vec2'], returnType: 'float' });
1671+
// Handle noise(x, y) as noise(vec2)
1672+
let nodeArgs;
1673+
if (args.length === 2) {
1674+
nodeArgs = [fn.vec2(args[0], args[1])];
1675+
} else {
1676+
nodeArgs = args;
1677+
}
1678+
1679+
return fnNodeConstructor('noise', nodeArgs, {
1680+
args: ['vec2'],
1681+
returnType: 'float'
1682+
});
16721683
};
1684+
16731685
}
16741686

16751687

src/webgl/shaders/functions/noiseGLSL.glsl

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,34 @@ vec2 random2(vec2 st) {
77
return -1.0 + 2.0 * fract(sin(st) * 43758.5453123);
88
}
99

10-
float noise(vec2 st) {
10+
float baseNoise(vec2 st) {
1111
vec2 i = floor(st);
1212
vec2 f = fract(st);
1313

14-
// Four corners in 2D of a tile
1514
vec2 a = random2(i);
1615
vec2 b = random2(i + vec2(1.0, 0.0));
1716
vec2 c = random2(i + vec2(0.0, 1.0));
1817
vec2 d = random2(i + vec2(1.0, 1.0));
1918

20-
// Smooth interpolation
2119
vec2 u = f * f * (3.0 - 2.0 * f);
2220

23-
// Mix the results
2421
return mix(mix(dot(a, f - vec2(0.0, 0.0)),
2522
dot(b, f - vec2(1.0, 0.0)), u.x),
2623
mix(dot(c, f - vec2(0.0, 1.0)),
2724
dot(d, f - vec2(1.0, 1.0)), u.x), u.y);
2825
}
2926

27+
// Fractal noise using 4 octaves
28+
float noise(vec2 st) {
29+
float result = 0.0;
30+
float amplitude = 1.0;
31+
float frequency = 1.0;
32+
33+
for (int i = 0; i < 4; i++) {
34+
result += amplitude * baseNoise(st * frequency);
35+
frequency *= 2.0;
36+
amplitude *= 0.5;
37+
}
38+
39+
return result;
40+
}

0 commit comments

Comments
 (0)