var allColors, selectedColors;
var fbm, sh, gl, pixelBuffer;
var speedSlider, turbulenceSlider, variationSlider, revolutionsSlider, fbmCheckbox;
createCanvas(windowWidth, windowHeight);
fbm = createGraphics(width, height, WEBGL);
sh = createShader(vert,frag);
sh.setUniform("u_resolution", [width*pixelDensity(),height*pixelDensity()]);
sh.setUniform("u_tex", this._renderer);
pixelBuffer = new Uint8Array(fbm.width * fbm.height * 4);
speedSlider = createSlider(0.1, 5, 1.8, 0.01);
speedSlider.position(10, 10);
turbulenceSlider = createSlider(0.5, 3, 1, 0.001);
turbulenceSlider.position(10, 30);
variationSlider = createSlider(0, 10, 1, 0.001);
variationSlider.position(10, 50);
revolutionsSlider = createSlider(1, 100, 30, 0.001);
revolutionsSlider.position(10, 70);
fbmCheckbox = createCheckbox('Show shader', false);
fbmCheckbox.position(10, 90);
for (let i = 0; i < TOTAL; i++) {
sh.setUniform("u_time", millis() * variationSlider.value());
sh.setUniform("u_turbulence", turbulenceSlider.value());
fbm.rect(-width/2,-height/2,width,height);
if (fbmCheckbox.checked()) {
image(fbm, 0, 0, width, height);
0, 0, fbm.width, fbm.height,
gl.RGBA, gl.UNSIGNED_BYTE, pixelBuffer
const vel = speedSlider.value();
for (let p of particles) {
let val = getValue(p.x, p.y);
line(p.x, p.y, p.x + p.vx, p.y + p.vy);
if (p.x > width) p.x = 0;
if (p.y > height) p.y = 0;
if (p.x < 0) p.x = width;
if (p.y < 0) p.y = height;
var a = Math.random() * 4 - 2;
var b = Math.random() * 4 - 2;
var c = Math.random() * 4 - 2;
var d = Math.random() * 4 - 2;
function getValue(x, y) {
const index = 4 * (floor(y) * width + floor(x));
const r = pixelBuffer[index+0]/255;
const g = pixelBuffer[index+1]/255;
const b = pixelBuffer[index+2]/255;
const bright = (r+g+b) / 3;
return bright * revolutionsSlider.value();
function selectColors() {
var colors = [...allColors];
selectedColors.push(colors.splice(floor(random(colors.length)), 1)[0]);
selectedColors.push(colors.splice(floor(random(colors.length)), 1)[0]);
selectedColors.push(colors.splice(floor(random(colors.length)), 1)[0]);
p.color = random(selectedColors);