Testers Wanted π
This is a release candidate (RC), which means it is not yet live on the p5.js Editor. Please help us to improve the stability of the newest version of p5.js by trying out this release candidate, and reporting bugs.
To help with testing, you can use this starter sketch!
Or load both p5.js and WebGPU mode by adding these two script tags to your sketch:
<script src="https://cdn.jsdelivr.net/npm/p5@2.3.0-rc.1/lib/p5.js"></script>
<script src="https://cdn.jsdelivr.net/npm/p5@2.3.0-rc.1/lib/p5.webgpu.js"></script>Then load WebGPU mode in createCanvas - note the async/await, this is needed for WebGPU but not WebGL:
async function setup() {
await createCanvas(400, 400, WEBGPU);
}What's Changed π
Work since 2.2.3 has focused on graphics and stabilization, including on version p5.Vector. In version 1, it was common to use createVector() which would create a three-dimensional vector at (0, 0, 0). In version 2, empty vectors should be made with createVector(0, 0) or createVector(0, 0, 0), to make clear when it is two or three dimensional. This is because version 2 supports vectors of different dimensions, although usages are still related to graphics and require 3D vectors.
We've also introduced some workflow improvements to support testing new contributions, including the @p5js-bot - look for this comment on any Pull Request, and use the CDN link in test sketches to help with review:
On graphics, we have continued to work on beginner-friendly shader programming API features (p5.strands), as well as the experimental WebGPU renderer.
This minor release includes exciting additions by the growing p5.strands contributor community:
- filter shaders are supported on 2D sketches, thanks to @LalitNarayanYadav
random()andrandomSeed()is available in p5.strands code, thanks to @perminder-17map()is available in p5.strands code, thanks to @Nixxx19lerp()andinstandceID()are more consistently supported, thanks to @aashu2006- more helpful error messages, thanks to @kushal1061
- corrected TypeScript typing, thanks to @Kathrina-dev
- simple shader materials can be written much easier, using only
finalColorhook thanks to @YuktiNandwana
Here is an example p5.js sketch using p5.strands, with the noise-based texture:
let myShader;
function setup() {
createCanvas(400, 400, WEBGL);
myShader = buildMaterialShader(myShaderBuilder);
}
function myShaderBuilder(){
finalColor.begin();
let coord = finalColor.texCoord;
finalColor.set(noise(coord.x, coord.y));
finalColor.end();
}
function draw() {
stroke(255);
background("#f1678e");
shader(myShader);
orbitControl();
box(100);
}
The p5.strands code has also been refactored and simplified, which will make maintenance and contribution easier in the future, thanks to @davepagurek and @LalitNarayanYadav! Finally, p5.strands, used with the experimental WebGPU renderer, now supports compute shaders, thanks to @davepagurek and @aashu2006. For example, below is code for a Game of Life simulation, written by @davepagurek. This uses compute shaders (compare the code to the [non-shader example here(https://beta.p5js.org/examples/math-and-physics-game-of-life/).)
// noprotect
// Authored by Dave Pagurek to demonstrate an WebGPU compute shaders
let cells;
let nextCells;
let gameShader;
let displayShader;
let W = 0;
let H = 0;
async function setup() {
W = 100;
H = 100;
await createCanvas(100, 100, WEBGPU);
pixelDensity(1);
let initial = new Float32Array(W * H);
for (let i = 0; i < initial.length; i++) {
initial[i] = random() > 0.7 ? 1 : 0;
}
cells = createStorage(initial);
nextCells = createStorage(W * H);
gameShader = buildComputeShader(simulate);
displayShader = buildFilterShader(display);
}
function simulate() {
let current = uniformStorage(() => cells);
let next = uniformStorage(() => nextCells);
let w = uniformInt(() => W);
let h = uniformInt(() => H);
let x = index.x;
let y = index.y;
let n = 0;
for (let dy = -1; dy <= 1; dy++) {
for (let dx = -1; dx <= 1; dx++) {
if (dx != 0 || dy != 0) {
let nx = (x + dx + w) % w;
let ny = (y + dy + h) % h;
n += current[ny * w + nx];
}
}
}
let alive = current[y * w + x];
let nextOutput = 0;
if (alive == 1) {
if (n == 2 || n == 3) {
nextOutput = 1;
}
} else {
if (n == 3) {
nextOutput = 1;
}
}
next[y * w + x] = nextOutput;
}
function display() {
let data = uniformStorage(() => cells);
let w = uniformInt(() => W);
let h = uniformInt(() => H);
filterColor.begin();
let x = floor(filterColor.texCoord.x * w);
let y = floor(filterColor.texCoord.y * h);
let alive = data[y * w + x];
filterColor.set([alive, alive, alive, 1]);
filterColor.end();
}
function draw() {
compute(gameShader, W, H);
[nextCells, cells] = [cells, nextCells];
filter(displayShader);
}p5.strands and WebGPU
- Fix: restore lerp alias to GLSL mix in p5.strands by @aashu2006 in #8681
- Ternary support for p5.strands by @davepagurek in #8638
- Make instanceID() work in both vertex and fragment shaders by @aashu2006 in #8695
- Make sure we don't transpile uniform callbacks by @davepagurek in #8709
- Auto-spread large WebGPU compute dispatches by @aashu2006 in #8696
- WebGPU compute shaders by @davepagurek in #8531
- Fix: Add filterColor alias support for 2D filter shaders by @LalitNarayanYadav in #8699
- Fix swizzle assignment for array element properties in compute shaders by @davepagurek in #8724
- Fix swizzle assignment for array element properties in compute shaders by @davepagurek in #8724
- Minor WebGL->WebGPU fixes by @davepagurek in #8731
- Fix TypeScript typing for filterColor shader hook by @Kathrina-dev in #8644
- Refactor: Deduplicate BinaryExpression and LogicalExpression transformation logic by @LalitNarayanYadav in #8741
- feat(webgpu): add read() to p5.StorageBuffer with tests by @aashu2006 in #8726
- Refactor: Move getNoiseShaderSnippet to strands backend by @LalitNarayanYadav in #8705
- implementing random function for strands by @perminder-17 in #8730
- added productive error when loop protection breaks in p5.strands by @kushal1061 in #8725
- Add StorageBuffer.set(index, value) for single-element GPU updates by @aashu2006 in #8772
- support map() inside p5.strands shaders by @Nixxx19 in #8753
- Refactor: Extract shared addCopyingAndReturn helper for control flow transformations by @LalitNarayanYadav in #8754
- Refactor: Extract replaceIdentifierReferences and remove reliance on
thisin ASTCallbacks by @LalitNarayanYadav in #8728 - feat(webgl): add texCoord parameter to getFinalColor hook by @YuktiNandwana in #8706
- Fix/feedback by @davepagurek in #8704
Workflow and Stabilization
- Continuous release with pkg.pr.new and esm.sh by @limzykenneth in #8603
- Resolves #8278 by @dhowe in #8328
- Revise p5.js 2.0 Beta Bug Report template by @ksen0 in #8693
- Add ShapePrimitive support for arcs and ellipses by @VANSH3104 in #8617
- fix: allow setup() to return Promise for async workflows by @LalitNarayanYadav in #8700
- fix: gracefully handle mixed-material OBJ models instead of crashing by @Nixxx19 in #8666
- Use more circular rounding for WebGL rect corners by @davepagurek in #8743
- Save + restore 2D text canvas context when font is applied in WebGL mode by @davepagurek in #8747
- Remove canvas style attribute update when changing font weight by @davepagurek in #8733
- fix: prevent browser freeze when tessellating >50k vertices (dev-2.0) by @Nixxx19 in #8729
- Fixes for server side usage by @limzykenneth in #8357
- Make default sketch canvas ID autoincrement by @limzykenneth in #7836
Documentation and Friendly Errors
- Docs: Add pipeline overview for transpileStrandsToJS by @LalitNarayanYadav in #8755
- Reference example typo fix by @limzykenneth in #8680
- docs: fix typos and grammar in contributor docs by @Xavrir in #8654
- lf use min() and max() with Infinity or -Infinity, it throws friendly error by @menacingly-coded in #8389
- Update vector docs to indicate recommended usage by @ksen0 in #8783
- remove unused
@requiresfrom all jsdoc by @nbogie in #8713 - Update RendererGL comments to reflect current state of pixel functions by @davepagurek in #8738
- docs: remove broken beginGeometry/endGeometry links from buildGeometry reference by @mitre88 in #8739
- Fix JSDoc typos: widhts β widths, coordniates β coordinates, coordianβ¦ by @harshiltewari2004 in #8757
- Fix: restrict setHeading() to 2D vectors and add friendly error for others by @reshma045 in #8255
- States tests and rename by @harshiltewari2004 in #8778
- Refactor p5.Vector to prioritize smaller dimension in binary operations on mismatched-size vectors by @ksen0 in #8676
New Contributors
- @Xavrir made their first contribution in #8654
- @YuktiNandwana made their first contribution in #8706
- @Kathrina-dev made their first contribution in #8644
- @mitre88 made their first contribution in #8739
- @kushal1061 made their first contribution in #8725
Full Changelog: v2.2.3...v2.3.0-rc.1