splats2 = {
const canvas = DOM.canvas(width, height);
const gl = canvas.getContext("webgl");
const program = initShaderProgram(gl, vertexSource1, fragSource1);
const positionAttribLocation = gl.getAttribLocation(program, "a_position");
const resolutionUniformLocation = gl.getUniformLocation(
program,
"u_resolution"
);
const numSplatters = 15;
const slicesPerCircle = 10;
const sliceAngle = (2 * Math.PI) / slicesPerCircle;
const padding = 20;
const splatRadRandom = d3.randomNormal(8, 4);
const positions = _.chain(numSplatters)
.times((i) => {
const splatRadius = splatRadRandom();
const xRandom = d3.randomNormal(
_.random(padding, width - padding),
splatRadius
);
const yRandom = d3.randomNormal(
_.random(padding, height - padding),
splatRadius
);
const radRandom = d3.randomNormal(splatRadius / 6, splatRadius / 4);
return _.times(splatRadius * 60, (i) => {
const x = xRandom();
const y = yRandom();
const radius = radRandom();
return _.times(slicesPerCircle, (i) => {
const startAngle = i * sliceAngle;
const endAngle = (i + 1) * sliceAngle;
return [
x + radius * Math.cos(startAngle),
y + radius * Math.sin(startAngle),
x + radius * Math.cos(endAngle),
y + radius * Math.sin(endAngle),
x,
y
];
});
});
})
.flattenDeep()
.value();
const positionBuffer = initPositionBuffer(gl, positions);
gl.viewport(0, 0, width, height);
gl.useProgram(program);
setPositionAttribute(gl, positionBuffer, positionAttribLocation);
gl.uniform2f(resolutionUniformLocation, width, height);
gl.drawArrays(gl.TRIANGLES, 0, positions.length / 3);
return canvas;
}