Skip to content

Commit f3ab0ce

Browse files
authored
Merge pull request #7921 from LalitNarayanYadav/patch-8
Add GLSL-based noise(vec2) function to p5.strands (#7897)
2 parents 3333411 + 27ebbe3 commit f3ab0ce

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/webgl/ShaderGenerator.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import { parse } from 'acorn';
88
import { ancestor } from 'acorn-walk';
99
import escodegen from 'escodegen';
10+
import noiseGLSL from './shaders/functions/noiseGLSL.glsl';
1011

1112
function shadergenerator(p5, fn) {
1213

@@ -1578,6 +1579,7 @@ function shadergenerator(p5, fn) {
15781579
],
15791580
'sqrt': { args: ['genType'], returnType: 'genType', isp5Function: true},
15801581
'step': { args: ['genType', 'genType'], returnType: 'genType', isp5Function: false},
1582+
'noise': { args: ['vec2'], returnType: 'float', isp5Function: false },
15811583
'trunc': { args: ['genType'], returnType: 'genType', isp5Function: false},
15821584

15831585
////////// Vector //////////
@@ -1629,10 +1631,19 @@ function shadergenerator(p5, fn) {
16291631
return originalLerp.apply(this, args); // Fallback to normal p5.js lerp
16301632
}
16311633
};
1634+
const originalNoise = fn.noise;
1635+
fn.noise = function (...args) {
1636+
if (!GLOBAL_SHADER?.isGenerating) {
1637+
return originalNoise.apply(this, args); // fallback to regular p5.js noise
1638+
}
1639+
1640+
GLOBAL_SHADER.output.vertexDeclarations.add(noiseGLSL);
1641+
GLOBAL_SHADER.output.fragmentDeclarations.add(noiseGLSL);
1642+
return fnNodeConstructor('noise', args, { args: ['vec2'], returnType: 'float' });
1643+
};
16321644
}
16331645

16341646

1635-
16361647
export default shadergenerator;
16371648

16381649
if (typeof p5 !== 'undefined') {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Based on https://github.com/patriciogonzalezvivo/lygia/blob/main/generative/noise.glsl (MIT)
2+
// Adapted for use in p5.strands
3+
4+
vec2 random2(vec2 st) {
5+
st = vec2(dot(st, vec2(127.1, 311.7)),
6+
dot(st, vec2(269.5, 183.3)));
7+
return -1.0 + 2.0 * fract(sin(st) * 43758.5453123);
8+
}
9+
10+
float noise(vec2 st) {
11+
vec2 i = floor(st);
12+
vec2 f = fract(st);
13+
14+
// Four corners in 2D of a tile
15+
vec2 a = random2(i);
16+
vec2 b = random2(i + vec2(1.0, 0.0));
17+
vec2 c = random2(i + vec2(0.0, 1.0));
18+
vec2 d = random2(i + vec2(1.0, 1.0));
19+
20+
// Smooth interpolation
21+
vec2 u = f * f * (3.0 - 2.0 * f);
22+
23+
// Mix the results
24+
return mix(mix(dot(a, f - vec2(0.0, 0.0)),
25+
dot(b, f - vec2(1.0, 0.0)), u.x),
26+
mix(dot(c, f - vec2(0.0, 1.0)),
27+
dot(d, f - vec2(1.0, 1.0)), u.x), u.y);
28+
}
29+

0 commit comments

Comments
 (0)