diff --git a/README.md b/README.md
index ea4f1d5..f84c2ee 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# P5LIVE
-v 1.6.2
+v 1.6.3
cc [teddavis.org](http://teddavis.org) – 2019 - 2024
p5.js collaborative live-coding vj environment!
diff --git a/includes/demos/P5L_demos.json b/includes/demos/P5L_demos.json
index 43d42ac..2b93689 100644
--- a/includes/demos/P5L_demos.json
+++ b/includes/demos/P5L_demos.json
@@ -1,6 +1,6 @@
{
- "version": "1.6.2",
- "revision": 51,
+ "version": "1.6.3",
+ "revision": 52,
"structure": [
{
"name": "demos",
@@ -43,7 +43,7 @@
"name": "_meta_basel.codes",
"mod": "1698712810913",
"type": "sketch",
- "code": "/*\t\n\t_meta_basel.codes\n\thttps://basel.codes/2019 // PCD 2019\n\t+ why P5LIVE was created!\n\t@maxfrischknecht\n\t@yannmartins\n\t@teddavis\n\tmodified Boid class to ES5\n*/\n\nlet personaggini = []\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight)\n\ttextAlign(CENTER, CENTER)\n\tvar loopc = innerWidth / 100\n\tvar brdr = 20\n\tpersonaggini = []\n\tfor(var i = 0; i < loopc; i++) {\n\t\tpersonaggini.push(new Boid(random(brdr, width - brdr), random(brdr, height - brdr)))\n\t}\n\n}\n\nfunction draw() {\n\tbackground(0)\n\tfor(let boid of personaggini) {\n\t\tboid.update()\n\t\tboid.proximity(personaggini)\n\t\tboid.edges()\n\t\tboid.show(personaggini)\n\t}\n}\n\nfunction mousePressed() {\n\tpersonaggini.push(new Boid(mouseX, mouseY))\n}\n\nfunction keyPressed() {\n\tif(keyCode == 8) {\n\t\tpersonaggini = []\n\t}\n\n}\n\n\nvar emojis = [\n\t'ð¦', 'ð¶', 'ð¶ð»', 'ð¶ð¼', 'ð¶ð½', 'ð¶ð¾', 'ð¶ð¿', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð¦', 'ð¦ð»', 'ð¦ð¼', 'ð¦ð½', 'ð¦ð¾', 'ð¦ð¿', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð¨', 'ð¨ð»', 'ð¨ð¼', 'ð¨ð½', 'ð¨ð¾', 'ð¨ð¿', 'ð©', 'ð©ð»', 'ð©ð¼', 'ð©ð½', 'ð©ð¾', 'ð©ð¿', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð´', 'ð´ð»', 'ð´ð¼', 'ð´ð½', 'ð´ð¾', 'ð´ð¿', 'ðµ', 'ðµð»', 'ðµð¼', 'ðµð½', 'ðµð¾', 'ðµð¿', 'ð¨ââï¸', 'ð¨ââ', 'ð¨ð»ââï¸', 'ð¨ð»ââ', 'ð¨ð¼ââï¸', 'ð¨ð¼ââ', 'ð¨ð½ââï¸', 'ð¨ð½ââ', 'ð¨ð¾ââï¸', 'ð¨ð¾ââ', 'ð¨ð¿ââï¸', 'ð¨ð¿ââ', 'ð©ââï¸', 'ð©ââ', 'ð©ð»ââï¸', 'ð©ð»ââ', 'ð©ð¼ââï¸', 'ð©ð¼ââ', 'ð©ð½ââï¸', 'ð©ð½ââ', 'ð©ð¾ââï¸', 'ð©ð¾ââ', 'ð©ð¿ââï¸', 'ð©ð¿ââ', 'ð¨âð', 'ð¨ð»âð', 'ð¨ð¼âð', 'ð¨ð½âð', 'ð¨ð¾âð', 'ð¨ð¿âð', 'ð©âð', 'ð©ð»âð', 'ð©ð¼âð', 'ð©ð½âð', 'ð©ð¾âð', 'ð©ð¿âð', 'ð¨âð«', 'ð¨ð»âð«', 'ð¨ð¼âð«', 'ð¨ð½âð«', 'ð¨ð¾âð«', 'ð¨ð¿âð«', 'ð©âð«', 'ð©ð»âð«', 'ð©ð¼âð«', 'ð©ð½âð«', 'ð©ð¾âð«', 'ð©ð¿âð«', 'ð¨ââï¸', 'ð¨ââ', 'ð¨ð»ââï¸', 'ð¨ð»ââ', 'ð¨ð¼ââï¸', 'ð¨ð¼ââ', 'ð¨ð½ââï¸', 'ð¨ð½ââ', 'ð¨ð¾ââï¸', 'ð¨ð¾ââ', 'ð¨ð¿ââï¸', 'ð¨ð¿ââ', 'ð©ââï¸', 'ð©ââ', 'ð©ð»ââï¸', 'ð©ð»ââ', 'ð©ð¼ââï¸', 'ð©ð¼ââ', 'ð©ð½ââï¸', 'ð©ð½ââ', 'ð©ð¾ââï¸', 'ð©ð¾ââ', 'ð©ð¿ââï¸', 'ð©ð¿ââ', 'ð¨âð¾', 'ð¨ð»âð¾', 'ð¨ð¼âð¾', 'ð¨ð½âð¾', 'ð¨ð¾âð¾', 'ð¨ð¿âð¾', 'ð©âð¾', 'ð©ð»âð¾', 'ð©ð¼âð¾', 'ð©ð½âð¾', 'ð©ð¾âð¾', 'ð©ð¿âð¾', 'ð¨âð³', 'ð¨ð»âð³', 'ð¨ð¼âð³', 'ð¨ð½âð³', 'ð¨ð¾âð³', 'ð¨ð¿âð³', 'ð©âð³', 'ð©ð»âð³', 'ð©ð¼âð³', 'ð©ð½âð³', 'ð©ð¾âð³', 'ð©ð¿âð³', 'ð¨âð§', 'ð¨ð»âð§', 'ð¨ð¼âð§', 'ð¨ð½âð§', 'ð¨ð¾âð§', 'ð¨ð¿âð§', 'ð©âð§', 'ð©ð»âð§', 'ð©ð¼âð§', 'ð©ð½âð§', 'ð©ð¾âð§', 'ð©ð¿âð§', 'ð¨âð', 'ð¨ð»âð', 'ð¨ð¼âð', 'ð¨ð½âð', 'ð¨ð¾âð', 'ð¨ð¿âð', 'ð©âð', 'ð©ð»âð', 'ð©ð¼âð', 'ð©ð½âð', 'ð©ð¾âð', 'ð©ð¿âð', 'ð¨âð¼', 'ð¨ð»âð¼', 'ð¨ð¼âð¼', 'ð¨ð½âð¼', 'ð¨ð¾âð¼', 'ð¨ð¿âð¼', 'ð©âð¼', 'ð©ð»âð¼', 'ð©ð¼âð¼', 'ð©ð½âð¼', 'ð©ð¾âð¼', 'ð©ð¿âð¼', 'ð¨âð¬', 'ð¨ð»âð¬', 'ð¨ð¼âð¬', 'ð¨ð½âð¬', 'ð¨ð¾âð¬', 'ð¨ð¿âð¬', 'ð©âð¬', 'ð©ð»âð¬', 'ð©ð¼âð¬', 'ð©ð½âð¬', 'ð©ð¾âð¬', 'ð©ð¿âð¬', 'ð¨âð»', 'ð¨ð»âð»', 'ð¨ð¼âð»', 'ð¨ð½âð»', 'ð¨ð¾âð»', 'ð¨ð¿âð»', 'ð©âð»', 'ð©ð»âð»', 'ð©ð¼âð»', 'ð©ð½âð»', 'ð©ð¾âð»', 'ð©ð¿âð»', 'ð¨âð¤', 'ð¨ð»âð¤', 'ð¨ð¼âð¤', 'ð¨ð½âð¤', 'ð¨ð¾âð¤', 'ð¨ð¿âð¤', 'ð©âð¤', 'ð©ð»âð¤', 'ð©ð¼âð¤', 'ð©ð½âð¤', 'ð©ð¾âð¤', 'ð©ð¿âð¤', 'ð¨âð¨', 'ð¨ð»âð¨', 'ð¨ð¼âð¨', 'ð¨ð½âð¨', 'ð¨ð¾âð¨', 'ð¨ð¿âð¨', 'ð©âð¨', 'ð©ð»âð¨', 'ð©ð¼âð¨', 'ð©ð½âð¨', 'ð©ð¾âð¨', 'ð©ð¿âð¨', 'ð¨ââï¸', 'ð¨ââ', 'ð¨ð»ââï¸', 'ð¨ð»ââ', 'ð¨ð¼ââï¸', 'ð¨ð¼ââ', 'ð¨ð½ââï¸', 'ð¨ð½ââ', 'ð¨ð¾ââï¸', 'ð¨ð¾ââ', 'ð¨ð¿ââï¸', 'ð¨ð¿ââ', 'ð©ââï¸', 'ð©ââ', 'ð©ð»ââï¸', 'ð©ð»ââ', 'ð©ð¼ââï¸', 'ð©ð¼ââ', 'ð©ð½ââï¸', 'ð©ð½ââ', 'ð©ð¾ââï¸', 'ð©ð¾ââ', 'ð©ð¿ââï¸', 'ð©ð¿ââ', 'ð¨âð', 'ð¨ð»âð', 'ð¨ð¼âð', 'ð¨ð½âð', 'ð¨ð¾âð', 'ð¨ð¿âð', 'ð©âð', 'ð©ð»âð', 'ð©ð¼âð', 'ð©ð½âð', 'ð©ð¾âð', 'ð©ð¿âð', 'ð¨âð', 'ð¨ð»âð', 'ð¨ð¼âð', 'ð¨ð½âð', 'ð¨ð¾âð', 'ð¨ð¿âð', 'ð©âð', 'ð©ð»âð', 'ð©ð¼âð', 'ð©ð½âð', 'ð©ð¾âð', 'ð©ð¿âð', 'ð®', 'ð®ð»', 'ð®ð¼', 'ð®ð½', 'ð®ð¾', 'ð®ð¿', 'ð®ââï¸', 'ð®ââ', 'ð®ð»ââï¸', 'ð®ð»ââ', 'ð®ð¼ââï¸', 'ð®ð¼ââ', 'ð®ð½ââï¸', 'ð®ð½ââ', 'ð®ð¾ââï¸', 'ð®ð¾ââ', 'ð®ð¿ââï¸', 'ð®ð¿ââ', 'ð®ââï¸', 'ð®ââ', 'ð®ð»ââï¸', 'ð®ð»ââ', 'ð®ð¼ââï¸', 'ð®ð¼ââ', 'ð®ð½ââï¸', 'ð®ð½ââ', 'ð®ð¾ââï¸', 'ð®ð¾ââ', 'ð®ð¿ââï¸', 'ð®ð¿ââ', 'ðµï¸', 'ðµ', 'ðµð»', 'ðµð¼', 'ðµð½', 'ðµð¾', 'ðµð¿', 'ðµï¸ââï¸', 'ðµââï¸', 'ðµï¸â', 'ðµââ', 'ðµð»ââï¸', 'ðµð»ââ', 'ðµð¼ââï¸', 'ðµð¼ââ', 'ðµð½ââï¸', 'ðµð½ââ', 'ðµð¾ââï¸', 'ðµð¾ââ', 'ðµð¿ââï¸', 'ðµð¿ââ', 'ðµï¸ââï¸', 'ðµââï¸', 'ðµï¸â', 'ðµââ', 'ðµð»ââï¸', 'ðµð»ââ', 'ðµð¼ââï¸', 'ðµð¼ââ', 'ðµð½ââï¸', 'ðµð½ââ', 'ðµð¾ââï¸', 'ðµð¾ââ', 'ðµð¿ââï¸', 'ðµð¿ââ', 'ð', 'ðð»', 'ðð¼', 'ðð½', 'ðð¾', 'ðð¿', 'ðââï¸', 'ðââ', 'ðð»ââï¸', 'ðð»ââ', 'ðð¼ââï¸', 'ðð¼ââ', 'ðð½ââï¸', 'ðð½ââ', 'ðð¾ââï¸', 'ðð¾ââ', 'ðð¿ââï¸', 'ðð¿ââ', 'ðââï¸', 'ðââ', 'ðð»ââï¸', 'ðð»ââ', 'ðð¼ââï¸', 'ðð¼ââ', 'ðð½ââï¸', 'ðð½ââ', 'ðð¾ââï¸', 'ðð¾ââ', 'ðð¿ââï¸', 'ðð¿ââ', 'ð·', 'ð·ð»', 'ð·ð¼', 'ð·ð½', 'ð·ð¾', 'ð·ð¿', 'ð·ââï¸', 'ð·ââ', 'ð·ð»ââï¸', 'ð·ð»ââ', 'ð·ð¼ââï¸', 'ð·ð¼ââ', 'ð·ð½ââï¸', 'ð·ð½ââ', 'ð·ð¾ââï¸', 'ð·ð¾ââ', 'ð·ð¿ââï¸', 'ð·ð¿ââ', 'ð·ââï¸', 'ð·ââ', 'ð·ð»ââï¸', 'ð·ð»ââ', 'ð·ð¼ââï¸', 'ð·ð¼ââ', 'ð·ð½ââï¸', 'ð·ð½ââ', 'ð·ð¾ââï¸', 'ð·ð¾ââ', 'ð·ð¿ââï¸', 'ð·ð¿ââ', 'ð¤´', 'ð¤´ð»', 'ð¤´ð¼', 'ð¤´ð½', 'ð¤´ð¾', 'ð¤´ð¿', 'ð¸', 'ð¸ð»', 'ð¸ð¼', 'ð¸ð½', 'ð¸ð¾', 'ð¸ð¿', 'ð³', 'ð³ð»', 'ð³ð¼', 'ð³ð½', 'ð³ð¾', 'ð³ð¿', 'ð³ââï¸', 'ð³ââ', 'ð³ð»ââï¸', 'ð³ð»ââ', 'ð³ð¼ââï¸', 'ð³ð¼ââ', 'ð³ð½ââï¸', 'ð³ð½ââ', 'ð³ð¾ââï¸', 'ð³ð¾ââ', 'ð³ð¿ââï¸', 'ð³ð¿ââ', 'ð³ââï¸', 'ð³ââ', 'ð³ð»ââï¸', 'ð³ð»ââ', 'ð³ð¼ââï¸', 'ð³ð¼ââ', 'ð³ð½ââï¸', 'ð³ð½ââ', 'ð³ð¾ââï¸', 'ð³ð¾ââ', 'ð³ð¿ââï¸', 'ð³ð¿ââ', 'ð²', 'ð²ð»', 'ð²ð¼', 'ð²ð½', 'ð²ð¾', 'ð²ð¿', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð±', 'ð±ð»', 'ð±ð¼', 'ð±ð½', 'ð±ð¾', 'ð±ð¿', 'ð±ââï¸', 'ð±ââ', 'ð±ð»ââï¸', 'ð±ð»ââ', 'ð±ð¼ââï¸', 'ð±ð¼ââ', 'ð±ð½ââï¸', 'ð±ð½ââ', 'ð±ð¾ââï¸', 'ð±ð¾ââ', 'ð±ð¿ââï¸', 'ð±ð¿ââ', 'ð±ââï¸', 'ð±ââ', 'ð±ð»ââï¸', 'ð±ð»ââ', 'ð±ð¼ââï¸', 'ð±ð¼ââ', 'ð±ð½ââï¸', 'ð±ð½ââ', 'ð±ð¾ââï¸', 'ð±ð¾ââ', 'ð±ð¿ââï¸', 'ð±ð¿ââ', 'ð¨â', 'ð¨ð»â', 'ð¨ð¼â', 'ð¨ð½â', 'ð¨ð¾â', 'ð¨ð¿â', 'ð©â', 'ð©ð»â', 'ð©ð¼â', 'ð©ð½â', 'ð©ð¾â', 'ð©ð¿â', 'ð¨â', 'ð¨ð»â', 'ð¨ð¼â', 'ð¨ð½â', 'ð¨ð¾â', 'ð¨ð¿â', 'ð©â', 'ð©ð»â', 'ð©ð¼â', 'ð©ð½â', 'ð©ð¾â', 'ð©ð¿â', 'ð¨â', 'ð¨ð»â', 'ð¨ð¼â', 'ð¨ð½â', 'ð¨ð¾â', 'ð¨', 'ð©â', 'ð©ð»â', 'ð©ð¼â', 'ð©ð½â', 'ð©ð¾â', 'ð©', 'ð¨', 'ð¨ð»', 'ð¨ð¼', 'ð¨ð½', 'ð¨ð¾', 'ð¨ð¿', 'ð©', 'ð©ð»', 'ð©ð¼', 'ð©ð½', 'ð©ð¾', 'ð©ð¿â', 'ð¤µ', 'ð¤µð»', 'ð¤µð¼', 'ð¤µð½', 'ð¤µð¾', 'ð¤µð¿', 'ð°', 'ð°ð»', 'ð°ð¼', 'ð°ð½', 'ð°ð¾', 'ð°ð¿', 'ð¤°', 'ð¤°ð»', 'ð¤°ð¼', 'ð¤°ð½', 'ð¤°ð¾', 'ð¤°ð¿', 'ð¤±', 'ð¤±ð»', 'ð¤±ð¼', 'ð¤±ð½', 'ð¤±ð¾', 'ð¤±ð¿', 'ð¼', 'ð¼ð»', 'ð¼ð¼', 'ð¼ð½', 'ð¼ð¾', 'ð¼ð¿', 'ð
', 'ð
ð»', 'ð
ð¼', 'ð
ð½', 'ð
ð¾', 'ð
ð¿', 'ð¤¶', 'ð¤¶ð»', 'ð¤¶ð¼', 'ð¤¶ð½', 'ð¤¶ð¾', 'ð¤¶ð¿', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§', 'ð§ââï¸', 'ð§ââ', 'ð§ââï¸', 'ð§ââ', 'ð§', 'ð§ââï¸', 'ð§ââ', 'ð§ââï¸', 'ð§ââ', 'ð', 'ðð»', 'ðð¼', 'ðð½', 'ðð¾', 'ðð¿', 'ðââï¸', 'ðââ', 'ðð»ââï¸', 'ðð»ââ', 'ðð¼ââï¸', 'ðð¼ââ', 'ðð½ââï¸', 'ðð½ââ', 'ðð¾ââï¸', 'ðð¾ââ', 'ðð¿ââï¸', 'ðð¿ââ', 'ðââï¸', 'ðââ', 'ðð»ââï¸', 'ðð»ââ', 'ðð¼ââï¸', 'ðð¼ââ', 'ðð½ââï¸', 'ðð½ââ', 'ðð¾ââï¸', 'ðð¾ââ', 'ðð¿ââï¸', 'ðð¿ââ', 'ð¶', 'ð¶ð»', 'ð¶ð¼', 'ð¶ð½', 'ð¶ð¾', 'ð¶ð¿', 'ð¶ââï¸', 'ð¶ââ', 'ð¶ð»ââï¸', 'ð¶ð»ââ', 'ð¶ð¼ââï¸', 'ð¶ð¼ââ', 'ð¶ð½ââï¸', 'ð¶ð½ââ', 'ð¶ð¾ââï¸', 'ð¶ð¾ââ', 'ð¶ð¿ââï¸', 'ð¶ð¿ââ', 'ð¶ââï¸', 'ð¶ââ', 'ð¶ð»ââï¸', 'ð¶ð»ââ', 'ð¶ð¼ââï¸', 'ð¶ð¼ââ', 'ð¶ð½ââï¸', 'ð¶ð½ââ', 'ð¶ð¾ââï¸', 'ð¶ð¾ââ', 'ð¶ð¿ââï¸', 'ð¶ð¿ââ', 'ð', 'ðð»', 'ðð¼', 'ðð½', 'ðð¾', 'ðð¿', 'ðââï¸', 'ðââ', 'ðð»ââï¸', 'ðð»ââ', 'ðð¼ââï¸', 'ðð¼ââ', 'ðð½ââï¸', 'ðð½ââ', 'ðð¾ââï¸', 'ðð¾ââ', 'ðð¿ââï¸', 'ðð¿ââ', 'ðââï¸', 'ðââ', 'ðð»ââï¸', 'ðð»ââ', 'ðð¼ââï¸', 'ðð¼ââ', 'ðð½ââï¸', 'ðð½ââ', 'ðð¾ââï¸', 'ðð¾ââ', 'ðð¿ââï¸', 'ðð¿ââ', 'ð', 'ðð»', 'ðð¼', 'ðð½', 'ðð¾', 'ðð¿', 'ðº', 'ðºð»', 'ðºð¼', 'ðºð½', 'ðºð¾', 'ðºð¿', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§', 'ð§ð»', 'ð§ð¼', 'ð§ð½', 'ð§ð¾', 'ð§ð¿', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð§ââï¸', 'ð§ââ', 'ð§ð»ââï¸', 'ð§ð»ââ', 'ð§ð¼ââï¸', 'ð§ð¼ââ', 'ð§ð½ââï¸', 'ð§ð½ââ', 'ð§ð¾ââï¸', 'ð§ð¾ââ', 'ð§ð¿ââï¸', 'ð§ð¿ââ', 'ð´ï¸', 'ð´', 'ð´ð»', 'ð´ð¼', 'ð´ð½', 'ð´ð¾', 'ð´ð¿', 'ðª', 'ð¨âð©âð¦', 'ð¨âð©âð§', 'ð¨âð©âð§âð¦', 'ð¨âð©âð¦âð¦', 'ð¨âð©âð§âð§', 'ð¨âð¨âð¦', 'ð¨âð¨âð§', 'ð¨âð¨âð§âð¦', 'ð¨âð¨âð¦âð¦', 'ð¨âð¨âð§âð§', 'ð©âð©âð¦', 'ð©âð©âð§', 'ð©âð©âð§âð¦', 'ð©âð©âð¦âð¦', 'ð©âð©âð§âð§', 'ð¨âð¦', 'ð¨âð¦âð¦', 'ð¨âð§', 'ð¨âð§âð¦', 'ð¨âð§âð§', 'ð©âð¦', 'ð©âð¦âð¦', 'ð©âð§', 'ð©âð§âð¦', 'ð©âð§âð§', 'ðµ', 'ð', 'ð¦', 'ð¶', 'ð', 'ð©', 'ðº', 'ð¦', 'ð±', 'ð', 'ð¦', 'ð¯', 'ð
', 'ð', 'ð´', 'ð', 'ð¦', 'ð¦', 'ð¦', 'ð®', 'ð', 'ð', 'ð', 'ð·', 'ð', 'ð', 'ð½', 'ð', 'ð', 'ð', 'ðª', 'ð«', 'ð¦', 'ð', 'ð¦', 'ð', 'ð', 'ð', 'ð¹', 'ð°', 'ð', 'ð¿ï¸', 'ð¿', 'ð¦', 'ð¦', 'ð»', 'ð¨', 'ð¼', 'ð¾', 'ð¦', 'ð', 'ð', 'ð£', 'ð¤', 'ð¥', 'ð¦', 'ð§', 'ðï¸', 'ð', 'ð¦
', 'ð¦', 'ð¦', 'ð¸', 'ð', 'ð¢', 'ð¦', 'ð', 'ð²', 'ð', 'ð¦', 'ð¦', 'ð³', 'ð', 'ð¬', 'ð', 'ð ', 'ð¡', 'ð¦', 'ð', 'ð', 'ð¦', 'ð¦', 'ð¦', 'ð', 'ð¦', 'ð', 'ð', 'ð', 'ð', 'ð¦', 'ð·ï¸', 'ð·', 'ð¦', 'ð', 'ð', 'ð', 'ðï¸', 'ð ', 'ð¢', 'ð¨', 'ð«', 'ð°', 'âª', 'ð', 'ð', 'â©ï¸', 'ð', 'âº', 'ð', 'ð', 'ð
', 'ð', 'ð', 'ð', 'ð', 'ð', 'ð', 'ð', 'ð', 'ð', 'ð', 'ð', 'ð¢', 'ð¥ï¸', 'ð³ï¸', 'âï¸', 'ð©ï¸', 'ð', 'ð', 'ð ', 'ð¡', 'ð', 'ð¸', 'âï¸', 'â', 'â'\n]\n\n\"use strict\";\n\nfunction _classCallCheck(instance, Constructor) {\n\tif(!(instance instanceof Constructor)) {\n\t\tthrow new TypeError(\"Cannot call a class as a function\")\n\t}\n}\n\nvar Boid = (function() {\n\tfunction Boid(x, y) {\n\t\t_classCallCheck(this, Boid)\n\n\t\tthis.boid = random(emojis)\n\t\tthis.pos = createVector(x, y)\n\t\tthis.ppos = createVector(this.pos.x, this.pos.y)\n\t\tthis.rvel = 1.5\n\t\tthis.vel = createVector(\n\t\t\trandom(-this.rvel, this.rvel),\n\t\t\trandom(-this.rvel, this.rvel)\n\t\t)\n\t\tthis.r = random(15, 45)\n\t\tthis.directionx = 1\n\t\tthis.directiony = 1\n\t\tthis.maxSpeed = 50\n\t\tthis.trail = []\n\t}\n\n\tBoid.prototype.show = function show(balls) {\n\t\tthis.proximity(balls)\n\t\ttextSize(this.r)\n\t\ttext(this.boid, this.pos.x, this.pos.y)\n\t};\n\n\tBoid.prototype.update = function update() {\n\t\tthis.pos.x += this.vel.x * this.directionx\n\t\tthis.pos.y += this.vel.y * this.directiony\n\t};\n\n\tBoid.prototype.edges = function edges() {\n\t\tif(this.pos.x > width - this.r / 2 || this.pos.x < this.r / 2) {\n\t\t\tthis.directionx *= -1\n\t\t}\n\t\tif(this.pos.y > height - this.r / 2 || this.pos.y < this.r / 2) {\n\t\t\tthis.directiony *= -1\n\t\t}\n\t};\n\n\tBoid.prototype.proximity = function proximity(balls) {\n\t\tfor(\n\t\t\tvar _iterator = balls,\n\t\t\t\t_isArray = Array.isArray(_iterator),\n\t\t\t\t_i = 0,\n\t\t\t\t_iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;\n\n\t\t) {\n\t\t\tvar _ref\n\n\t\t\tif(_isArray) {\n\t\t\t\tif(_i >= _iterator.length) break;\n\t\t\t\t_ref = _iterator[_i++];\n\t\t\t} else {\n\t\t\t\t_i = _iterator.next();\n\t\t\t\tif(_i.done) break;\n\t\t\t\t_ref = _i.value;\n\t\t\t}\n\n\t\t\tvar ball = _ref\n\n\t\t\tif(ball != this) {\n\t\t\t\tif(ball.pos.dist(this.pos) < 50) {\n\t\t\t\t\tstrokeWeight(2)\n\t\t\t\t\tstroke(255)\n\t\t\t\t\tline(ball.pos.x, ball.pos.y, this.pos.x, this.pos.y)\n\t\t\t\t\tif(this.r < 60) this.r += 0.1\n\t\t\t\t\tvar dir = p5.Vector.sub(this.pos, ball.pos)\n\t\t\t\t\tdir.normalize()\n\t\t\t\t\tif(\n\t\t\t\t\t\tthis.pos.y < height - this.r / 2 &&\n\t\t\t\t\t\tthis.pos.y > this.r / 2 &&\n\t\t\t\t\t\tthis.pos.x < width - this.r / 2 &&\n\t\t\t\t\t\tthis.pos.x > this.r / 2\n\t\t\t\t\t)\n\t\t\t\t\t\tthis.pos.add(dir)\n\t\t\t\t\tthis.ppos = this.pos\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn Boid\n})()"
+ "code": "/*\t\n\t_meta_basel.codes\n\thttps://basel.codes/2019 // PCD 2019\n\t+ why P5LIVE was created!\n\t@maxfrischknecht\n\t@yannmartins\n\t@teddavis\n\tmodified Boid class to ES5\n*/\n\nlet personaggini = []\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight)\n\ttextAlign(CENTER, CENTER)\n\tvar loopc = innerWidth / 100\n\tvar brdr = 20\n\tpersonaggini = []\n\tfor(var i = 0; i < loopc; i++) {\n\t\tpersonaggini.push(new Boid(random(brdr, width - brdr), random(brdr, height - brdr)))\n\t}\n\n}\n\nfunction draw() {\n\tbackground(0)\n\tfor(let boid of personaggini) {\n\t\tboid.update()\n\t\tboid.proximity(personaggini)\n\t\tboid.edges()\n\t\tboid.show(personaggini)\n\t}\n}\n\nfunction mousePressed() {\n\tpersonaggini.push(new Boid(mouseX, mouseY))\n}\n\nfunction keyPressed() {\n\tif(keyCode == 8) {\n\t\tpersonaggini = []\n\t}\n\n}\n\n\nvar emojis = [\n\t'🦄', '👶', '👶🏻', '👶🏼', '👶🏽', '👶🏾', '👶🏿', '🧒', '🧒🏻', '🧒🏼', '🧒🏽', '🧒🏾', '🧒🏿', '👦', '👦🏻', '👦🏼', '👦🏽', '👦🏾', '👦🏿', '👧', '👧🏻', '👧🏼', '👧🏽', '👧🏾', '👧🏿', '🧑', '🧑🏻', '🧑🏼', '🧑🏽', '🧑🏾', '🧑🏿', '👨', '👨🏻', '👨🏼', '👨🏽', '👨🏾', '👨🏿', '👩', '👩🏻', '👩🏼', '👩🏽', '👩🏾', '👩🏿', '🧓', '🧓🏻', '🧓🏼', '🧓🏽', '🧓🏾', '🧓🏿', '👴', '👴🏻', '👴🏼', '👴🏽', '👴🏾', '👴🏿', '👵', '👵🏻', '👵🏼', '👵🏽', '👵🏾', '👵🏿', '👨⚕️', '👨⚕', '👨🏻⚕️', '👨🏻⚕', '👨🏼⚕️', '👨🏼⚕', '👨🏽⚕️', '👨🏽⚕', '👨🏾⚕️', '👨🏾⚕', '👨🏿⚕️', '👨🏿⚕', '👩⚕️', '👩⚕', '👩🏻⚕️', '👩🏻⚕', '👩🏼⚕️', '👩🏼⚕', '👩🏽⚕️', '👩🏽⚕', '👩🏾⚕️', '👩🏾⚕', '👩🏿⚕️', '👩🏿⚕', '👨🎓', '👨🏻🎓', '👨🏼🎓', '👨🏽🎓', '👨🏾🎓', '👨🏿🎓', '👩🎓', '👩🏻🎓', '👩🏼🎓', '👩🏽🎓', '👩🏾🎓', '👩🏿🎓', '👨🏫', '👨🏻🏫', '👨🏼🏫', '👨🏽🏫', '👨🏾🏫', '👨🏿🏫', '👩🏫', '👩🏻🏫', '👩🏼🏫', '👩🏽🏫', '👩🏾🏫', '👩🏿🏫', '👨⚖️', '👨⚖', '👨🏻⚖️', '👨🏻⚖', '👨🏼⚖️', '👨🏼⚖', '👨🏽⚖️', '👨🏽⚖', '👨🏾⚖️', '👨🏾⚖', '👨🏿⚖️', '👨🏿⚖', '👩⚖️', '👩⚖', '👩🏻⚖️', '👩🏻⚖', '👩🏼⚖️', '👩🏼⚖', '👩🏽⚖️', '👩🏽⚖', '👩🏾⚖️', '👩🏾⚖', '👩🏿⚖️', '👩🏿⚖', '👨🌾', '👨🏻🌾', '👨🏼🌾', '👨🏽🌾', '👨🏾🌾', '👨🏿🌾', '👩🌾', '👩🏻🌾', '👩🏼🌾', '👩🏽🌾', '👩🏾🌾', '👩🏿🌾', '👨🍳', '👨🏻🍳', '👨🏼🍳', '👨🏽🍳', '👨🏾🍳', '👨🏿🍳', '👩🍳', '👩🏻🍳', '👩🏼🍳', '👩🏽🍳', '👩🏾🍳', '👩🏿🍳', '👨🔧', '👨🏻🔧', '👨🏼🔧', '👨🏽🔧', '👨🏾🔧', '👨🏿🔧', '👩🔧', '👩🏻🔧', '👩🏼🔧', '👩🏽🔧', '👩🏾🔧', '👩🏿🔧', '👨🏭', '👨🏻🏭', '👨🏼🏭', '👨🏽🏭', '👨🏾🏭', '👨🏿🏭', '👩🏭', '👩🏻🏭', '👩🏼🏭', '👩🏽🏭', '👩🏾🏭', '👩🏿🏭', '👨💼', '👨🏻💼', '👨🏼💼', '👨🏽💼', '👨🏾💼', '👨🏿💼', '👩💼', '👩🏻💼', '👩🏼💼', '👩🏽💼', '👩🏾💼', '👩🏿💼', '👨🔬', '👨🏻🔬', '👨🏼🔬', '👨🏽🔬', '👨🏾🔬', '👨🏿🔬', '👩🔬', '👩🏻🔬', '👩🏼🔬', '👩🏽🔬', '👩🏾🔬', '👩🏿🔬', '👨💻', '👨🏻💻', '👨🏼💻', '👨🏽💻', '👨🏾💻', '👨🏿💻', '👩💻', '👩🏻💻', '👩🏼💻', '👩🏽💻', '👩🏾💻', '👩🏿💻', '👨🎤', '👨🏻🎤', '👨🏼🎤', '👨🏽🎤', '👨🏾🎤', '👨🏿🎤', '👩🎤', '👩🏻🎤', '👩🏼🎤', '👩🏽🎤', '👩🏾🎤', '👩🏿🎤', '👨🎨', '👨🏻🎨', '👨🏼🎨', '👨🏽🎨', '👨🏾🎨', '👨🏿🎨', '👩🎨', '👩🏻🎨', '👩🏼🎨', '👩🏽🎨', '👩🏾🎨', '👩🏿🎨', '👨✈️', '👨✈', '👨🏻✈️', '👨🏻✈', '👨🏼✈️', '👨🏼✈', '👨🏽✈️', '👨🏽✈', '👨🏾✈️', '👨🏾✈', '👨🏿✈️', '👨🏿✈', '👩✈️', '👩✈', '👩🏻✈️', '👩🏻✈', '👩🏼✈️', '👩🏼✈', '👩🏽✈️', '👩🏽✈', '👩🏾✈️', '👩🏾✈', '👩🏿✈️', '👩🏿✈', '👨🚀', '👨🏻🚀', '👨🏼🚀', '👨🏽🚀', '👨🏾🚀', '👨🏿🚀', '👩🚀', '👩🏻🚀', '👩🏼🚀', '👩🏽🚀', '👩🏾🚀', '👩🏿🚀', '👨🚒', '👨🏻🚒', '👨🏼🚒', '👨🏽🚒', '👨🏾🚒', '👨🏿🚒', '👩🚒', '👩🏻🚒', '👩🏼🚒', '👩🏽🚒', '👩🏾🚒', '👩🏿🚒', '👮', '👮🏻', '👮🏼', '👮🏽', '👮🏾', '👮🏿', '👮♂️', '👮♂', '👮🏻♂️', '👮🏻♂', '👮🏼♂️', '👮🏼♂', '👮🏽♂️', '👮🏽♂', '👮🏾♂️', '👮🏾♂', '👮🏿♂️', '👮🏿♂', '👮♀️', '👮♀', '👮🏻♀️', '👮🏻♀', '👮🏼♀️', '👮🏼♀', '👮🏽♀️', '👮🏽♀', '👮🏾♀️', '👮🏾♀', '👮🏿♀️', '👮🏿♀', '🕵️', '🕵', '🕵🏻', '🕵🏼', '🕵🏽', '🕵🏾', '🕵🏿', '🕵️♂️', '🕵♂️', '🕵️', '🕵♂', '🕵🏻♂️', '🕵🏻♂', '🕵🏼♂️', '🕵🏼♂', '🕵🏽♂️', '🕵🏽♂', '🕵🏾♂️', '🕵🏾♂', '🕵🏿♂️', '🕵🏿♂', '🕵️♀️', '🕵♀️', '🕵️', '🕵♀', '🕵🏻♀️', '🕵🏻♀', '🕵🏼♀️', '🕵🏼♀', '🕵🏽♀️', '🕵🏽♀', '🕵🏾♀️', '🕵🏾♀', '🕵🏿♀️', '🕵🏿♀', '💂', '💂🏻', '💂🏼', '💂🏽', '💂🏾', '💂🏿', '💂♂️', '💂♂', '💂🏻♂️', '💂🏻♂', '💂🏼♂️', '💂🏼♂', '💂🏽♂️', '💂🏽♂', '💂🏾♂️', '💂🏾♂', '💂🏿♂️', '💂🏿♂', '💂♀️', '💂♀', '💂🏻♀️', '💂🏻♀', '💂🏼♀️', '💂🏼♀', '💂🏽♀️', '💂🏽♀', '💂🏾♀️', '💂🏾♀', '💂🏿♀️', '💂🏿♀', '👷', '👷🏻', '👷🏼', '👷🏽', '👷🏾', '👷🏿', '👷♂️', '👷♂', '👷🏻♂️', '👷🏻♂', '👷🏼♂️', '👷🏼♂', '👷🏽♂️', '👷🏽♂', '👷🏾♂️', '👷🏾♂', '👷🏿♂️', '👷🏿♂', '👷♀️', '👷♀', '👷🏻♀️', '👷🏻♀', '👷🏼♀️', '👷🏼♀', '👷🏽♀️', '👷🏽♀', '👷🏾♀️', '👷🏾♀', '👷🏿♀️', '👷🏿♀', '🤴', '🤴🏻', '🤴🏼', '🤴🏽', '🤴🏾', '🤴🏿', '👸', '👸🏻', '👸🏼', '👸🏽', '👸🏾', '👸🏿', '👳', '👳🏻', '👳🏼', '👳🏽', '👳🏾', '👳🏿', '👳♂️', '👳♂', '👳🏻♂️', '👳🏻♂', '👳🏼♂️', '👳🏼♂', '👳🏽♂️', '👳🏽♂', '👳🏾♂️', '👳🏾♂', '👳🏿♂️', '👳🏿♂', '👳♀️', '👳♀', '👳🏻♀️', '👳🏻♀', '👳🏼♀️', '👳🏼♀', '👳🏽♀️', '👳🏽♀', '👳🏾♀️', '👳🏾♀', '👳🏿♀️', '👳🏿♀', '👲', '👲🏻', '👲🏼', '👲🏽', '👲🏾', '👲🏿', '🧕', '🧕🏻', '🧕🏼', '🧕🏽', '🧕🏾', '🧕🏿', '🧔', '🧔🏻', '🧔🏼', '🧔🏽', '🧔🏾', '🧔🏿', '👱', '👱🏻', '👱🏼', '👱🏽', '👱🏾', '👱🏿', '👱♂️', '👱♂', '👱🏻♂️', '👱🏻♂', '👱🏼♂️', '👱🏼♂', '👱🏽♂️', '👱🏽♂', '👱🏾♂️', '👱🏾♂', '👱🏿♂️', '👱🏿♂', '👱♀️', '👱♀', '👱🏻♀️', '👱🏻♀', '👱🏼♀️', '👱🏼♀', '👱🏽♀️', '👱🏽♀', '👱🏾♀️', '👱🏾♀', '👱🏿♀️', '👱🏿♀', '👨', '👨🏻', '👨🏼', '👨🏽', '👨🏾', '👨🏿', '👩', '👩🏻', '👩🏼', '👩🏽', '👩🏾', '👩🏿', '👨', '👨🏻', '👨🏼', '👨🏽', '👨🏾', '👨🏿', '👩', '👩🏻', '👩🏼', '👩🏽', '👩🏾', '👩🏿', '👨', '👨🏻', '👨🏼', '👨🏽', '👨🏾', '👨', '👩', '👩🏻', '👩🏼', '👩🏽', '👩🏾', '👩', '👨', '👨🏻', '👨🏼', '👨🏽', '👨🏾', '👨🏿', '👩', '👩🏻', '👩🏼', '👩🏽', '👩🏾', '👩🏿', '🤵', '🤵🏻', '🤵🏼', '🤵🏽', '🤵🏾', '🤵🏿', '👰', '👰🏻', '👰🏼', '👰🏽', '👰🏾', '👰🏿', '🤰', '🤰🏻', '🤰🏼', '🤰🏽', '🤰🏾', '🤰🏿', '🤱', '🤱🏻', '🤱🏼', '🤱🏽', '🤱🏾', '🤱🏿', '👼', '👼🏻', '👼🏼', '👼🏽', '👼🏾', '👼🏿', '🎅', '🎅🏻', '🎅🏼', '🎅🏽', '🎅🏾', '🎅🏿', '🤶', '🤶🏻', '🤶🏼', '🤶🏽', '🤶🏾', '🤶🏿', '🧙', '🧙🏻', '🧙🏼', '🧙🏽', '🧙🏾', '🧙🏿', '🧙♀️', '🧙♀', '🧙🏻♀️', '🧙🏻♀', '🧙🏼♀️', '🧙🏼♀', '🧙🏽♀️', '🧙🏽♀', '🧙🏾♀️', '🧙🏾♀', '🧙🏿♀️', '🧙🏿♀', '🧙♂️', '🧙♂', '🧙🏻♂️', '🧙🏻♂', '🧙🏼♂️', '🧙🏼♂', '🧙🏽♂️', '🧙🏽♂', '🧙🏾♂️', '🧙🏾♂', '🧙🏿♂️', '🧙🏿♂', '🧚', '🧚🏻', '🧚🏼', '🧚🏽', '🧚🏾', '🧚🏿', '🧚♀️', '🧚♀', '🧚🏻♀️', '🧚🏻♀', '🧚🏼♀️', '🧚🏼♀', '🧚🏽♀️', '🧚🏽♀', '🧚🏾♀️', '🧚🏾♀', '🧚🏿♀️', '🧚🏿♀', '🧚♂️', '🧚♂', '🧚🏻♂️', '🧚🏻♂', '🧚🏼♂️', '🧚🏼♂', '🧚🏽♂️', '🧚🏽♂', '🧚🏾♂️', '🧚🏾♂', '🧚🏿♂️', '🧚🏿♂', '🧛', '🧛🏻', '🧛🏼', '🧛🏽', '🧛🏾', '🧛🏿', '🧛♀️', '🧛♀', '🧛🏻♀️', '🧛🏻♀', '🧛🏼♀️', '🧛🏼♀', '🧛🏽♀️', '🧛🏽♀', '🧛🏾♀️', '🧛🏾♀', '🧛🏿♀️', '🧛🏿♀', '🧛♂️', '🧛♂', '🧛🏻♂️', '🧛🏻♂', '🧛🏼♂️', '🧛🏼♂', '🧛🏽♂️', '🧛🏽♂', '🧛🏾♂️', '🧛🏾♂', '🧛🏿♂️', '🧛🏿♂', '🧜', '🧜🏻', '🧜🏼', '🧜🏽', '🧜🏾', '🧜🏿', '🧜♀️', '🧜♀', '🧜🏻♀️', '🧜🏻♀', '🧜🏼♀️', '🧜🏼♀', '🧜🏽♀️', '🧜🏽♀', '🧜🏾♀️', '🧜🏾♀', '🧜🏿♀️', '🧜🏿♀', '🧜♂️', '🧜♂', '🧜🏻♂️', '🧜🏻♂', '🧜🏼♂️', '🧜🏼♂', '🧜🏽♂️', '🧜🏽♂', '🧜🏾♂️', '🧜🏾♂', '🧜🏿♂️', '🧜🏿♂', '🧝', '🧝🏻', '🧝🏼', '🧝🏽', '🧝🏾', '🧝🏿', '🧝♀️', '🧝♀', '🧝🏻♀️', '🧝🏻♀', '🧝🏼♀️', '🧝🏼♀', '🧝🏽♀️', '🧝🏽♀', '🧝🏾♀️', '🧝🏾♀', '🧝🏿♀️', '🧝🏿♀', '🧝♂️', '🧝♂', '🧝🏻♂️', '🧝🏻♂', '🧝🏼♂️', '🧝🏼♂', '🧝🏽♂️', '🧝🏽♂', '🧝🏾♂️', '🧝🏾♂', '🧝🏿♂️', '🧝🏿♂', '🧞', '🧞♀️', '🧞♀', '🧞♂️', '🧞♂', '🧟', '🧟♀️', '🧟♀', '🧟♂️', '🧟♂', '🙎', '🙎🏻', '🙎🏼', '🙎🏽', '🙎🏾', '🙎🏿', '🙎♂️', '🙎♂', '🙎🏻♂️', '🙎🏻♂', '🙎🏼♂️', '🙎🏼♂', '🙎🏽♂️', '🙎🏽♂', '🙎🏾♂️', '🙎🏾♂', '🙎🏿♂️', '🙎🏿♂', '🙎♀️', '🙎♀', '🙎🏻♀️', '🙎🏻♀', '🙎🏼♀️', '🙎🏼♀', '🙎🏽♀️', '🙎🏽♀', '🙎🏾♀️', '🙎🏾♀', '🙎🏿♀️', '🙎🏿♀', '🚶', '🚶🏻', '🚶🏼', '🚶🏽', '🚶🏾', '🚶🏿', '🚶♂️', '🚶♂', '🚶🏻♂️', '🚶🏻♂', '🚶🏼♂️', '🚶🏼♂', '🚶🏽♂️', '🚶🏽♂', '🚶🏾♂️', '🚶🏾♂', '🚶🏿♂️', '🚶🏿♂', '🚶♀️', '🚶♀', '🚶🏻♀️', '🚶🏻♀', '🚶🏼♀️', '🚶🏼♀', '🚶🏽♀️', '🚶🏽♀', '🚶🏾♀️', '🚶🏾♀', '🚶🏿♀️', '🚶🏿♀', '🏃', '🏃🏻', '🏃🏼', '🏃🏽', '🏃🏾', '🏃🏿', '🏃♂️', '🏃♂', '🏃🏻♂️', '🏃🏻♂', '🏃🏼♂️', '🏃🏼♂', '🏃🏽♂️', '🏃🏽♂', '🏃🏾♂️', '🏃🏾♂', '🏃🏿♂️', '🏃🏿♂', '🏃♀️', '🏃♀', '🏃🏻♀️', '🏃🏻♀', '🏃🏼♀️', '🏃🏼♀', '🏃🏽♀️', '🏃🏽♀', '🏃🏾♀️', '🏃🏾♀', '🏃🏿♀️', '🏃🏿♀', '💃', '💃🏻', '💃🏼', '💃🏽', '💃🏾', '💃🏿', '🕺', '🕺🏻', '🕺🏼', '🕺🏽', '🕺🏾', '🕺🏿', '🧖', '🧖🏻', '🧖🏼', '🧖🏽', '🧖🏾', '🧖🏿', '🧖♀️', '🧖♀', '🧖🏻♀️', '🧖🏻♀', '🧖🏼♀️', '🧖🏼♀', '🧖🏽♀️', '🧖🏽♀', '🧖🏾♀️', '🧖🏾♀', '🧖🏿♀️', '🧖🏿♀', '🧖♂️', '🧖♂', '🧖🏻♂️', '🧖🏻♂', '🧖🏼♂️', '🧖🏼♂', '🧖🏽♂️', '🧖🏽♂', '🧖🏾♂️', '🧖🏾♂', '🧖🏿♂️', '🧖🏿♂', '🧘', '🧘🏻', '🧘🏼', '🧘🏽', '🧘🏾', '🧘🏿', '🧘♀️', '🧘♀', '🧘🏻♀️', '🧘🏻♀', '🧘🏼♀️', '🧘🏼♀', '🧘🏽♀️', '🧘🏽♀', '🧘🏾♀️', '🧘🏾♀', '🧘🏿♀️', '🧘🏿♀', '🧘♂️', '🧘♂', '🧘🏻♂️', '🧘🏻♂', '🧘🏼♂️', '🧘🏼♂', '🧘🏽♂️', '🧘🏽♂', '🧘🏾♂️', '🧘🏾♂', '🧘🏿♂️', '🧘🏿♂', '🕴️', '🕴', '🕴🏻', '🕴🏼', '🕴🏽', '🕴🏾', '🕴🏿', '👪', '👨👩👦', '👨👩👧', '👨👩👧👦', '👨👩👦👦', '👨👩👧👧', '👨👨👦', '👨👨👧', '👨👨👧👦', '👨👨👦👦', '👨👨👧👧', '👩👩👦', '👩👩👧', '👩👩👧👦', '👩👩👦👦', '👩👩👧👧', '👨👦', '👨👦👦', '👨👧', '👨👧👦', '👨👧👧', '👩👦', '👩👦👦', '👩👧', '👩👧👦', '👩👧👧', '🐵', '🐒', '🦍', '🐶', '🐕', '🐩', '🐺', '🦊', '🐱', '🐈', '🦁', '🐯', '🐅', '🐆', '🐴', '🐎', '🦄', '🦓', '🦌', '🐮', '🐂', '🐃', '🐄', '🐷', '🐖', '🐗', '🐽', '🐏', '🐑', '🐐', '🐪', '🐫', '🦒', '🐘', '🦏', '🐭', '🐁', '🐀', '🐹', '🐰', '🐇', '🐿️', '🐿', '🦔', '🦇', '🐻', '🐨', '🐼', '🐾', '🦃', '🐔', '🐓', '🐣', '🐤', '🐥', '🐦', '🐧', '🕊️', '🕊', '🦅', '🦆', '🦉', '🐸', '🐊', '🐢', '🦎', '🐍', '🐲', '🐉', '🦕', '🦖', '🐳', '🐋', '🐬', '🐟', '🐠', '🐡', '🦈', '🐙', '🐚', '🦀', '🦐', '🦑', '🐌', '🦋', '🐛', '🐜', '🐝', '🐞', '🦗', '🕷️', '🕷', '🦂', '🌍', '🌎', '🌏', '🏛️', '🏠', '🏢', '🏨', '🏫', '🏰', '⛪', '🕌', '🕍', '⛩️', '🕋', '⛺', '🚃', '🚄', '🚅', '🚆', '🚇', '🚈', '🚉', '🚊', '🚝', '🚞', '🚋', '🚌', '🚐', '🚎', '🚢', '🛥️', '🛳️', '✈️', '🛩️', '🚁', '🚟', '🚠', '🚡', '🚀', '🛸', '☃️', '⛄', '☃'\n]\n\n\"use strict\";\n\nfunction _classCallCheck(instance, Constructor) {\n\tif(!(instance instanceof Constructor)) {\n\t\tthrow new TypeError(\"Cannot call a class as a function\")\n\t}\n}\n\nvar Boid = (function() {\n\tfunction Boid(x, y) {\n\t\t_classCallCheck(this, Boid)\n\n\t\tthis.boid = random(emojis)\n\t\tthis.pos = createVector(x, y)\n\t\tthis.ppos = createVector(this.pos.x, this.pos.y)\n\t\tthis.rvel = 1.5\n\t\tthis.vel = createVector(\n\t\t\trandom(-this.rvel, this.rvel),\n\t\t\trandom(-this.rvel, this.rvel)\n\t\t)\n\t\tthis.r = random(15, 45)\n\t\tthis.directionx = 1\n\t\tthis.directiony = 1\n\t\tthis.maxSpeed = 50\n\t\tthis.trail = []\n\t}\n\n\tBoid.prototype.show = function show(balls) {\n\t\tthis.proximity(balls)\n\t\ttextSize(this.r)\n\t\ttext(this.boid, this.pos.x, this.pos.y)\n\t};\n\n\tBoid.prototype.update = function update() {\n\t\tthis.pos.x += this.vel.x * this.directionx\n\t\tthis.pos.y += this.vel.y * this.directiony\n\t};\n\n\tBoid.prototype.edges = function edges() {\n\t\tif(this.pos.x > width - this.r / 2 || this.pos.x < this.r / 2) {\n\t\t\tthis.directionx *= -1\n\t\t}\n\t\tif(this.pos.y > height - this.r / 2 || this.pos.y < this.r / 2) {\n\t\t\tthis.directiony *= -1\n\t\t}\n\t};\n\n\tBoid.prototype.proximity = function proximity(balls) {\n\t\tfor(\n\t\t\tvar _iterator = balls,\n\t\t\t\t_isArray = Array.isArray(_iterator),\n\t\t\t\t_i = 0,\n\t\t\t\t_iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;\n\n\t\t) {\n\t\t\tvar _ref\n\n\t\t\tif(_isArray) {\n\t\t\t\tif(_i >= _iterator.length) break;\n\t\t\t\t_ref = _iterator[_i++];\n\t\t\t} else {\n\t\t\t\t_i = _iterator.next();\n\t\t\t\tif(_i.done) break;\n\t\t\t\t_ref = _i.value;\n\t\t\t}\n\n\t\t\tvar ball = _ref\n\n\t\t\tif(ball != this) {\n\t\t\t\tif(ball.pos.dist(this.pos) < 50) {\n\t\t\t\t\tstrokeWeight(2)\n\t\t\t\t\tstroke(255)\n\t\t\t\t\tline(ball.pos.x, ball.pos.y, this.pos.x, this.pos.y)\n\t\t\t\t\tif(this.r < 60) this.r += 0.1\n\t\t\t\t\tvar dir = p5.Vector.sub(this.pos, ball.pos)\n\t\t\t\t\tdir.normalize()\n\t\t\t\t\tif(\n\t\t\t\t\t\tthis.pos.y < height - this.r / 2 &&\n\t\t\t\t\t\tthis.pos.y > this.r / 2 &&\n\t\t\t\t\t\tthis.pos.x < width - this.r / 2 &&\n\t\t\t\t\t\tthis.pos.x > this.r / 2\n\t\t\t\t\t)\n\t\t\t\t\t\tthis.pos.add(dir)\n\t\t\t\t\tthis.ppos = this.pos\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn Boid\n})()"
}
]
},
@@ -69,7 +69,7 @@
"name": "_canvas_embed",
"mod": "1712882153982",
"type": "sketch",
- "code": "/*\n\t_canvas_embed // cc teddavis.org 2020\n\thow to embed (almost) ANYTHING behind our sketch!\n*/\n\nlet vidFrame, embedURL = \"https://www.youtube.com/embed/7HubjUPIftQ\"\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight)\n\tlet vidW = windowWidth\n\tlet vidH = vidW / 16 * 9\n\tvidFrame = createDiv('vidPlayer')\n\tvidFrame.position(0, 0)\n\t// setup for YT, but replace with iframe of choice\n\tvidFrame.html('');\n\tvidFrame.style('pointer-events', 'none') // prevent losing mouse\n\tvidFrame.style('z-index', -2) // send video back\n}\n\nfunction draw() {\n\tif(mouseIsPressed){\n\t\tclear()\n\t}\n\tnoCursor()\n\tfill(255)\n\ttextSize(100)\n\ttextAlign(CENTER, CENTER)\n\ttext(\"â\", mouseX, mouseY)\n\ttranslate(mouseX, height - mouseY)\n\trotate(radians(180))\n\ttext(\"â\", 0, 0)\n}"
+ "code": "/*\n\t_canvas_embed // cc teddavis.org 2020\n\thow to embed (almost) ANYTHING behind our sketch!\n*/\n\nlet vidFrame, embedURL = \"https://www.youtube.com/embed/7HubjUPIftQ\"\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight)\n\tlet vidW = windowWidth\n\tlet vidH = vidW / 16 * 9\n\tvidFrame = createDiv('vidPlayer')\n\tvidFrame.position(0, 0)\n\t// setup for YT, but replace with iframe of choice\n\tvidFrame.html('');\n\tvidFrame.style('pointer-events', 'none') // prevent losing mouse\n\tvidFrame.style('z-index', -2) // send video back\n}\n\nfunction draw() {\n\tif(mouseIsPressed){\n\t\tclear()\n\t}\n\tnoCursor()\n\tfill(255)\n\ttextSize(100)\n\ttextAlign(CENTER, CENTER)\n\ttext(\"☕\", mouseX, mouseY)\n\ttranslate(mouseX, height - mouseY)\n\trotate(radians(180))\n\ttext(\"☕\", 0, 0)\n}"
},
{
"name": "_canvas_chalkboard",
@@ -295,7 +295,7 @@
"name": "_hardware_serial",
"mod": "1700691535700",
"type": "sketch",
- "code": "/*\t\n\t_hardware_serial\n\t\n\trun the p5.serial App or Node.js server\n\thttps://github.com/p5-serial/p5.serialport\n\t\n\tBelow based on Basic Example\n\n*/\n\nlet libs = ['includes/libs/p5.serialport.js']\nlet serial\nlet serialPort = '/dev/cu.usbmodem1421' // adjust as needed\n\n// Methods available\n// serial.read() returns a single byte of data (first in the buffer)\n// serial.readChar() returns a single char 'A', 'a'\n// serial.readBytes() returns all of the data available as an array of bytes\n// serial.readBytesUntil('\\n') returns all of the data available until a '\\n' (line break) is encountered\n// serial.readString() retunrs all of the data available as a string\n// serial.readStringUntil('\\n') returns all of the data available as a tring until a (line break) is encountered\n// serial.last() returns the last byte of data from the buffer\n// serial.lastChar() returns the last byte of data from the buffer as a char\n// serial.clear() clears the underlying serial buffer\n// serial.available() returns the number of bytes available in the buffer\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight)\n\n\t// Instantiate our SerialPort object\n\tserial = new p5.SerialPort() // instantiate\n\tlet portlist = serial.list() // list available ports\n\tserial.open(serialPort) // connect with serial port (set var above)\n\n\t// Register some callbacks\n\tserial.on('connected', serverConnected) // connected to server\n\tserial.on('list', gotList) // list available serial ports\n\tserial.on('data', gotData) // received data from serial port\n\tserial.on('error', gotError) // on error\n\tserial.on('open', gotOpen) // serial port read for read/write\n\t\n\ttextAlign(CENTER, CENTER)\n\ttextSize(50)\n\tfill(255)\n\ttext(\"p5.serial template = not much to see here...\\nhappy live » [ hardware ] « coding!\", 0, 0, width, height)\n}\n\n\nfunction draw() {\n\t// Polling method\n\n\t//if (serial.available() > 0) {\n\t// let data = serial.read()\n\t// ellipse(50, 50, data, data)\n\t//}\n\n}\n\n// We are connected and ready to go\nfunction serverConnected() {\n\tprint(\"We are connected!\")\n}\n\n// Got the list of ports\nfunction gotList(thelist) {\n\t// theList is an array of their names\n\tfor(let i = 0; i < thelist.length; i++) {\n\t\t// Display in the console\n\t\tprint(i + \" \" + thelist[i])\n\t}\n}\n\n// Connected to our serial device\nfunction gotOpen() {\n\tprint(\"Serial Port is open!\")\n}\n\n// Ut oh, here is an error, let's log it\nfunction gotError(theerror) {\n\tprint(theerror)\n}\n\n// There is data available to work with from the serial port\nfunction gotData() {\n\tlet currentString = serial.readStringUntil(\"\\r\\n\")\n\tconsole.log(currentString)\n}"
+ "code": "/*\t\n\t_hardware_serial\n\t\n\trun the p5.serial App or Node.js server\n\thttps://github.com/p5-serial/p5.serialport\n\t\n\tBelow based on Basic Example\n\n*/\n\nlet libs = ['includes/libs/p5.serialport.js']\nlet serial\nlet serialPort = '/dev/cu.usbmodem1421' // adjust as needed\n\n// Methods available\n// serial.read() returns a single byte of data (first in the buffer)\n// serial.readChar() returns a single char 'A', 'a'\n// serial.readBytes() returns all of the data available as an array of bytes\n// serial.readBytesUntil('\\n') returns all of the data available until a '\\n' (line break) is encountered\n// serial.readString() retunrs all of the data available as a string\n// serial.readStringUntil('\\n') returns all of the data available as a tring until a (line break) is encountered\n// serial.last() returns the last byte of data from the buffer\n// serial.lastChar() returns the last byte of data from the buffer as a char\n// serial.clear() clears the underlying serial buffer\n// serial.available() returns the number of bytes available in the buffer\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight)\n\n\t// Instantiate our SerialPort object\n\tserial = new p5.SerialPort() // instantiate\n\tlet portlist = serial.list() // list available ports\n\tserial.open(serialPort) // connect with serial port (set var above)\n\n\t// Register some callbacks\n\tserial.on('connected', serverConnected) // connected to server\n\tserial.on('list', gotList) // list available serial ports\n\tserial.on('data', gotData) // received data from serial port\n\tserial.on('error', gotError) // on error\n\tserial.on('open', gotOpen) // serial port read for read/write\n\t\n\ttextAlign(CENTER, CENTER)\n\ttextSize(50)\n\tfill(255)\n\ttext(\"p5.serial template = not much to see here...\\nhappy live » [ hardware ] « coding!\", 0, 0, width, height)\n}\n\n\nfunction draw() {\n\t// Polling method\n\n\t//if (serial.available() > 0) {\n\t// let data = serial.read()\n\t// ellipse(50, 50, data, data)\n\t//}\n\n}\n\n// We are connected and ready to go\nfunction serverConnected() {\n\tprint(\"We are connected!\")\n}\n\n// Got the list of ports\nfunction gotList(thelist) {\n\t// theList is an array of their names\n\tfor(let i = 0; i < thelist.length; i++) {\n\t\t// Display in the console\n\t\tprint(i + \" \" + thelist[i])\n\t}\n}\n\n// Connected to our serial device\nfunction gotOpen() {\n\tprint(\"Serial Port is open!\")\n}\n\n// Ut oh, here is an error, let's log it\nfunction gotError(theerror) {\n\tprint(theerror)\n}\n\n// There is data available to work with from the serial port\nfunction gotData() {\n\tlet currentString = serial.readStringUntil(\"\\r\\n\")\n\tconsole.log(currentString)\n}"
},
{
"name": "_hardware_ar",
@@ -427,13 +427,13 @@
"name": "_shader_shadertoy_template",
"mod": "1693697213644",
"type": "sketch",
- "code": "/*\n\t_shader_shadertoy_template // cc teddavis.org 2020\n\t// remixing: https://www.shadertoy.com/view/Ms23DR\n\t\n\timporting from shadertoy.com\n\t- grab frag code from 'image' tab\n\t- add to 'frag' shader below, between following code:\n\t\t//////\tSTART SHADERTOY\t//////\n\t\t\n\t\t//////\tEND SHADERTOY\t//////\n\t\n\t- add necessary uniforms (iChannel0, iResolution, etc. as needed)\n\t- add custom uniforms for softCompile live-coding fun!\n\t\n\tcommon issues\n\t- change all: texture() -> texture2D()\n\t- uv.y = 1.0 - uv.y; // fix vertical flip\n\n*/\n\n// define global variables for a texture (tex) and shader (warp)\nlet tex, theShader\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight, WEBGL) // Shaders require WEBGL\n\tbackground(0)\n\n\tpixelDensity(1) // fixes retina display offset\n\n\t// create 2D/3D layers for passing into shader\n\ttex = createGraphics(width, height)\n\ttex.background(0)\n\n\t// load vert/frag defined below\n\ttheShader = createShader(vertShader, fragShader)\n}\n\n\nfunction draw() {\n\t// draw on 'tex', which is passed into shader\n\ttex.stroke(255)\n\ttex.noFill()\n\ttex.ellipse(random(width), random(height), random(50, 150))\n\n\t// text\n\ttex.fill(255)\n\ttex.textSize(tex.width / 5)\n\ttex.textAlign(CENTER, CENTER)\n\ttex.text(\"P5LIVE\", tex.width / 2, tex.height / 2)\n\n\t// pass required uniforms to our shader (shadertoy style)\n\ttheShader.setUniform(\"iResolution\", [width, height])\n\ttheShader.setUniform('iChannel0', tex) // pass layer here\n\ttheShader.setUniform(\"iTime\", frameCount * .3)\n\ttheShader.setUniform(\"iMouse\", [map(mouseX, 0, width, 0, 1), map(mouseY, 0, height, 0, 1)])\n\n\tshader(theShader) // apply shader\n\trect(0, 0, width, height) // display shader\n}\n\n/* SHADER DEFINITIONS */\n\n// standard p5js vertex shader\nlet vertShader = `\nattribute vec3 aPosition;\nattribute vec2 aTexCoord;\nvarying vec2 vTexCoord;\n\nvoid main() {\n vTexCoord = aTexCoord;\n vec4 positionVec4 = vec4(aPosition, 1.0);\n positionVec4.xy = positionVec4.xy * 2.0 - 1.0;\n gl_Position = positionVec4;\n}`\n\n\nlet fragShader = `\n\tprecision mediump float;\n\t\n\t// add shadertoy uniform's as needed (check imported shader)\n\tuniform vec2 iResolution;\n\tuniform sampler2D iChannel0;\n\tuniform sampler2D iChannel1;\n\tuniform float iTime;\n\tuniform int iFrame;\n\tuniform vec2 iMouse;\n\t\n\t// Don't forget to change all 'texture' to 'texture2D' in pasted shader!\n\t//////\tSTART SHADERTOY\t//////\n\t\n\t// Loosely based on postprocessing shader by inigo quilez, License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.\n\t\n\tvec2 curve(vec2 uv)\n\t{\n\t\tuv = (uv - 0.5) * 2.0;\n\t\tuv *= 1.1;\t\n\t\tuv.x *= 1.0 + pow((abs(uv.y) / 5.0), 2.0);\n\t\tuv.y *= 1.0 + pow((abs(uv.x) / 4.0), 2.0);\n\t\tuv = (uv / 2.0) + 0.5;\n\t\tuv = uv *0.92 + 0.04;\n\t\treturn uv;\n\t}\n\tvoid mainImage( out vec4 fragColor, in vec2 fragCoord )\n\t{\n\t vec2 q = fragCoord.xy / iResolution.xy;\n\t vec2 uv = q;\n\t uv.y = 1.0 - uv.y;\n\t uv = curve( uv );\n\t vec3 oricol = texture2D( iChannel0, vec2(q.x,q.y) ).xyz;\n\t vec3 col;\n\t\tfloat x = sin(0.3*iTime+uv.y*21.0)*sin(0.7*iTime+uv.y*29.0)*sin(0.3+0.33*iTime+uv.y*31.0)*0.0017;\n\t\n\t col.r = texture2D(iChannel0,vec2(x+uv.x+0.001,uv.y+0.001)).x+0.05;\n\t col.g = texture2D(iChannel0,vec2(x+uv.x+0.000,uv.y-0.002)).y+0.05;\n\t col.b = texture2D(iChannel0,vec2(x+uv.x-0.002,uv.y+0.000)).z+0.05;\n\t col.r += 0.08*texture2D(iChannel0,0.75*vec2(x+0.025, -0.027)+vec2(uv.x+0.001,uv.y+0.001)).x;\n\t col.g += 0.05*texture2D(iChannel0,0.75*vec2(x+-0.022, -0.02)+vec2(uv.x+0.000,uv.y-0.002)).y;\n\t col.b += 0.08*texture2D(iChannel0,0.75*vec2(x+-0.02, -0.018)+vec2(uv.x-0.002,uv.y+0.000)).z;\n\t\n\t col = clamp(col*0.6+0.4*col*col*1.0,0.0,1.0);\n\t\n\t float vig = (0.0 + 1.0*16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y));\n\t\tcol *= vec3(pow(vig,0.3));\n\t\n\t col *= vec3(0.95,1.05,0.95);\n\t\tcol *= 2.8;\n\t\n\t\tfloat scans = clamp( 0.35+0.35*sin(3.5*iTime+uv.y*iResolution.y*1.5), 0.0, 1.0);\n\t\t\n\t\tfloat s = pow(scans,1.7);\n\t\tcol = col*vec3( 0.4+0.7*s) ;\n\t\n\t col *= 1.0+0.01*sin(110.0*iTime);\n\t\tif (uv.x < 0.0 || uv.x > 1.0)\n\t\t\tcol *= 0.0;\n\t\tif (uv.y < 0.0 || uv.y > 1.0)\n\t\t\tcol *= 0.0;\n\t\t\n\t\tcol*=1.0-0.65*vec3(clamp((mod(fragCoord.x, 2.0)-1.0)*2.0,0.0,1.0));\n\t\t\n\t float comp = smoothstep( 0.1, 0.9, sin(iTime) );\n\t \n\t\t// Remove the next line to stop cross-fade between original and postprocess\n\t//\tcol = mix( col, oricol, comp );\n\t\n\t fragColor = vec4(col,1.0);\n\t}\n\t\n\t//////\tEND SHADERTOY\t//////\n\t\n\t// call shadertoy style above\n\tvoid main() {\n\t mainImage(gl_FragColor, gl_FragCoord.xy);\n\t}\n\t// caling mainImage() tip from: https://github.com/n1ckfg/PShaderToy/blob/master/p5jsShaderToy/js/shaders/snow.frag#L137\n`"
+ "code": "/*\n\t_shader_shadertoy_template // cc teddavis.org 2020\n\t// remixing: https://www.shadertoy.com/view/Ms23DR\n\t\n\timporting from shadertoy.com\n\t- grab frag code from 'image' tab\n\t- add to 'frag' shader below, between following code:\n\t\t//////\tSTART SHADERTOY\t//////\n\t\t\n\t\t//////\tEND SHADERTOY\t//////\n\t\n\t- add necessary uniforms (iChannel0, iResolution, etc. as needed)\n\t- add custom uniforms for softCompile live-coding fun!\n\t\n\tcommon issues\n\t- change all: texture -> texture2D\n\t- change mainImage() -> main() remove params\n\t- change fragCoord -> gl_FragCoord\n\t- change fragColor -> gl_FragColor\n\t- uv.y = 1.0 - uv.y; // fix vertical flip\n\n*/\n\n// define global variables for a texture (tex) and shader (warp)\nlet tex, theShader\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight, WEBGL) // Shaders require WEBGL\n\t// setAttributes({ version: 1 });\n\tprint(webglVersion)\n\tbackground(0)\n\tpixelDensity(1) // fixes retina display offset\n\n\t// create 2D/3D layers for passing into shader\n\ttex = createGraphics(width, height)\n\ttex.background(0)\n\n\t// load vert/frag defined below\n\ttheShader = createShader(vertShader, fragShader)\n}\n\n\nfunction draw() {\n\t// draw on 'tex', which is passed into shader\n\ttex.stroke(255)\n\ttex.noFill()\n\ttex.ellipse(random(width), random(height), random(50, 150))\n\n\t// text\n\ttex.fill(255)\n\ttex.textSize(tex.width / 5)\n\ttex.textAlign(CENTER, CENTER)\n\ttex.text(\"P5LIVE\", tex.width / 2, tex.height / 2)\n\n\t// pass required uniforms to our shader (shadertoy style)\n\ttheShader.setUniform(\"iResolution\", [width, height])\n\ttheShader.setUniform('iChannel0', tex) // pass layer here\n\ttheShader.setUniform(\"iTime\", frameCount * .3)\n\ttheShader.setUniform(\"iMouse\", [map(mouseX, 0, width, 0, 1), map(mouseY, 0, height, 0, 1)])\n\n\tshader(theShader) // apply shader\n\trect(0, 0, width, height) // display shader\n}\n\n/* SHADER DEFINITIONS */\n\n// standard p5js vertex shader\nlet vertShader = `\nattribute vec3 aPosition;\nattribute vec2 aTexCoord;\nvarying vec2 vTexCoord;\n\nvoid main() {\n vTexCoord = aTexCoord;\n vec4 positionVec4 = vec4(aPosition, 1.0);\n positionVec4.xy = positionVec4.xy * 2.0 - 1.0;\n gl_Position = positionVec4;\n}`\n\n\nlet fragShader = `\n\tprecision mediump float;\n\t\n\t// add shadertoy uniform's as needed (check imported shader)\n\tuniform vec2 iResolution;\n\tuniform sampler2D iChannel0;\n\tuniform sampler2D iChannel1;\n\tuniform float iTime;\n\tuniform int iFrame;\n\tuniform vec2 iMouse;\n\t\n\t/* \n\tDon't forget to:\n\t - change all: texture -> texture2D\n\t - change mainImage() -> main() remove params\n\t - change fragCoord -> gl_FragCoord\n\t - change fragColor -> gl_FragColor\n\t*/\n\t\n\t//////\tSTART SHADERTOY\t//////\n\t\n\t// Loosely based on postprocessing shader by inigo quilez, License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.\n\t\n\tvec2 curve(vec2 uv)\n\t{\n\t\tuv = (uv - 0.5) * 2.0;\n\t\tuv *= 1.1;\t\n\t\tuv.x *= 1.0 + pow((abs(uv.y) / 5.0), 2.0);\n\t\tuv.y *= 1.0 + pow((abs(uv.x) / 4.0), 2.0);\n\t\tuv = (uv / 2.0) + 0.5;\n\t\tuv = uv *0.92 + 0.04;\n\t\treturn uv;\n\t}\n\tvoid main()\n\t{\n\t vec2 q = gl_FragCoord.xy / iResolution.xy;\n\t vec2 uv = q;\n\t uv.y = 1.0 - uv.y;\n\t uv = curve( uv );\n\t vec3 oricol = texture2D( iChannel0, vec2(q.x,q.y) ).xyz;\n\t vec3 col;\n\t\tfloat x = sin(0.3*iTime+uv.y*21.0)*sin(0.7*iTime+uv.y*29.0)*sin(0.3+0.33*iTime+uv.y*31.0)*0.0017;\n\t\n\t col.r = texture2D(iChannel0,vec2(x+uv.x+0.001,uv.y+0.001)).x+0.05;\n\t col.g = texture2D(iChannel0,vec2(x+uv.x+0.000,uv.y-0.002)).y+0.05;\n\t col.b = texture2D(iChannel0,vec2(x+uv.x-0.002,uv.y+0.000)).z+0.05;\n\t col.r += 0.08*texture2D(iChannel0,0.75*vec2(x+0.025, -0.027)+vec2(uv.x+0.001,uv.y+0.001)).x;\n\t col.g += 0.05*texture2D(iChannel0,0.75*vec2(x+-0.022, -0.02)+vec2(uv.x+0.000,uv.y-0.002)).y;\n\t col.b += 0.08*texture2D(iChannel0,0.75*vec2(x+-0.02, -0.018)+vec2(uv.x-0.002,uv.y+0.000)).z;\n\t\n\t col = clamp(col*0.6+0.4*col*col*1.0,0.0,1.0);\n\t\n\t float vig = (0.0 + 1.0*16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y));\n\t\tcol *= vec3(pow(vig,0.3));\n\t\n\t col *= vec3(0.95,1.05,0.95);\n\t\tcol *= 2.8;\n\t\n\t\tfloat scans = clamp( 0.35+0.35*sin(3.5*iTime+uv.y*iResolution.y*1.5), 0.0, 1.0);\n\t\t\n\t\tfloat s = pow(scans,1.7);\n\t\tcol = col*vec3( 0.4+0.7*s) ;\n\t\n\t col *= 1.0+0.01*sin(110.0*iTime);\n\t\tif (uv.x < 0.0 || uv.x > 1.0)\n\t\t\tcol *= 0.0;\n\t\tif (uv.y < 0.0 || uv.y > 1.0)\n\t\t\tcol *= 0.0;\n\t\t\n\t\tcol*=1.0-0.65*vec3(clamp((mod(gl_FragCoord.x, 2.0)-1.0)*2.0,0.0,1.0));\n\t\t\n\t float comp = smoothstep( 0.1, 0.9, sin(iTime) );\n\t \n\t\t// Remove the next line to stop cross-fade between original and postprocess\n\t//\tcol = mix( col, oricol, comp );\n\t\n\t gl_FragColor = vec4(col,1.0);\n\t}\n\t\n\t//////\tEND SHADERTOY\t//////\n`"
},
{
"name": "_shader_poisson_disc_blur",
"mod": "1693697303056",
"type": "sketch",
- "code": "/*\n\t_shader_poisson_disc_blur\n\t'Blur: Poisson Disc' by hornet\n\thttps://www.shadertoy.com/view/lsfGWn\n\tremix cc teddavis.org 2020\n*/\n\n// define global variables for a texture (tex) and shader (warp)\nlet tex, theShader\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight, WEBGL) // Shaders require WEBGL\n\tbackground(0)\n\n\tpixelDensity(1) // fixes retina display offset\n\n\t// create 2D/3D layer for passing into shader\n\ttex = createGraphics(width, height)\n\ttex.background(0)\n\n\t// load vert/frag defined below\n\ttheShader = createShader(vertShader, fragShader)\n}\n\n\nfunction draw() {\n\t// draw on 'tex', which is passed into shader\n\ttex.stroke(255)\n\ttex.noFill()\n\ttex.ellipse(random(width), random(height), random(50, 150))\n\n\t// text\n\ttex.fill(255)\n\ttex.textSize(tex.width / 5)\n\ttex.textAlign(CENTER, CENTER)\n\ttex.text(\"P5LIVE\", tex.width / 2, tex.height / 2)\n\n\t// pass required uniforms to our shader (shadertoy style)\n\ttheShader.setUniform(\"iResolution\", [width, height])\n\ttheShader.setUniform('iChannel0', tex) // pass layer here\n\ttheShader.setUniform(\"iTime\", frameCount * .001)\n\n\ttheShader.setUniform(\"iOffset\", map(mouseY, 0, height, 0, 1))\n\ttheShader.setUniform(\"iDistort\", 4.0)\n\ttheShader.setUniform(\"iMaxBlur\", map(mouseX, 0, width, 10, 100))\n\n\n\tshader(theShader) // apply shader\n\trect(0, 0, width, height) // display shader\n}\n\n/* SHADER DEFINITIONS */\n\nlet vertShader = `\n\tattribute vec3 aPosition;\n\tattribute vec2 aTexCoord;\n\tvarying vec2 vTexCoord;\n\t\n\tvoid main() {\n\t\tvTexCoord = aTexCoord;\n\t\n\t\tvec4 positionVec4 = vec4(aPosition, 1.0);\n\t\tpositionVec4.xy = positionVec4.xy * 2.0 - 1.0;\n\t\n\t\tgl_Position = positionVec4;\n\t}\n`\n\n\nlet fragShader = `\n\tprecision mediump float;\n\t\n\t//////\tSTART SHADERTOY\t//////\n\t\n\t#define ANIMATE_NOISE\n\t\n\tuniform vec2 iResolution;\n\tuniform sampler2D iChannel0;\n\tuniform float iTime;\n\t\n\tuniform float iOffset;\n\tuniform float iDistort;\n\tuniform float iMaxBlur;\n\t\n\tfloat nrand( vec2 n ) {\n\t\treturn fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);\n\t}\n\t\n\tvec2 rot2d( vec2 p, float a ) {\n\t\tvec2 sc = vec2(sin(a),cos(a));\n\t\treturn vec2( dot( p, vec2(sc.y, -sc.x) ), dot( p, sc.xy ) );\n\t}\n\t\n\tconst int NUM_TAPS = 27;\n\tconst float rcp_maxdist = 1.0 / 3.22244;\n\t\n\tvoid mainImage( out vec4 fragColor, in vec2 fragCoord ){\n\t\n\t vec2 uv = fragCoord / iResolution.xy;\n\t\tuv.y = 1.0-uv.y;\n\t \n\t float max_siz;\n\t max_siz = iMaxBlur * (0.5 - 0.5 * sin(iDistort * uv.y - iOffset));\n\t \n\t //fragColor = vec4( vec3(max_siz), 1.0 );\n\t //return;\n\t\t\n\t //note: for samples-positions see\n\t // https://github.com/GPUOpen-Effects/ShadowFX/blob/master/amd_shadowfx/src/Shaders/\n\t \n\t\tvec2 fTaps_Poisson[NUM_TAPS];\n\t fTaps_Poisson[0] = rcp_maxdist * vec2( -0.8835609, 2.523391 );\n\t fTaps_Poisson[1] = rcp_maxdist * vec2( -1.387375, 1.056318 );\n\t fTaps_Poisson[2] = rcp_maxdist * vec2( -2.854452, 1.313645 );\n\t fTaps_Poisson[3] = rcp_maxdist * vec2( 0.6326182, 1.14569 );\n\t fTaps_Poisson[4] = rcp_maxdist * vec2( 1.331515, 3.637297 );\n\t fTaps_Poisson[5] = rcp_maxdist * vec2( -2.175307, 3.885795 );\n\t fTaps_Poisson[6] = rcp_maxdist * vec2( -0.5396664, 4.1938 );\n\t fTaps_Poisson[7] = rcp_maxdist * vec2( -0.6708734, -0.36875 );\n\t fTaps_Poisson[8] = rcp_maxdist * vec2( -2.083908, -0.6921188 );\n\t fTaps_Poisson[9] = rcp_maxdist * vec2( -3.219028, 2.85465 );\n\t fTaps_Poisson[10] = rcp_maxdist * vec2( -1.863933, -2.742254 );\n\t fTaps_Poisson[11] = rcp_maxdist * vec2( -4.125739, -1.283028 );\n\t fTaps_Poisson[12] = rcp_maxdist * vec2( -3.376766, -2.81844 );\n\t fTaps_Poisson[13] = rcp_maxdist * vec2( -3.974553, 0.5459405 );\n\t fTaps_Poisson[14] = rcp_maxdist * vec2( 3.102514, 1.717692 );\n\t fTaps_Poisson[15] = rcp_maxdist * vec2( 2.951887, 3.186624 );\n\t fTaps_Poisson[16] = rcp_maxdist * vec2( 1.33941, -0.166395 );\n\t fTaps_Poisson[17] = rcp_maxdist * vec2( 2.814727, -0.3216669 );\n\t fTaps_Poisson[18] = rcp_maxdist * vec2( 0.7786853, -2.235639 );\n\t fTaps_Poisson[19] = rcp_maxdist * vec2( -0.7396695, -1.702466 );\n\t fTaps_Poisson[20] = rcp_maxdist * vec2( 0.4621856, -3.62525 );\n\t fTaps_Poisson[21] = rcp_maxdist * vec2( 4.181541, 0.5883132 );\n\t fTaps_Poisson[22] = rcp_maxdist * vec2( 4.22244, -1.11029 );\n\t fTaps_Poisson[23] = rcp_maxdist * vec2( 2.116917, -1.789436 );\n\t fTaps_Poisson[24] = rcp_maxdist * vec2( 1.915774, -3.425885 );\n\t fTaps_Poisson[25] = rcp_maxdist * vec2( 3.142686, -2.656329 );\n\t fTaps_Poisson[26] = rcp_maxdist * vec2( -1.108632, -4.023479 );\n\t\n\t vec4 sum = vec4(0);\n\t vec2 seed = uv;\n\t #if defined( ANIMATE_NOISE )\n\t seed += fract( iTime );\n\t #endif\n\t float rnd = 6.28 * nrand( seed );\n\t\n\t vec4 basis = vec4( rot2d(vec2(1,0),rnd), rot2d(vec2(0,1),rnd) );\n\t for (int i=0; i < NUM_TAPS; i++)\n\t {\n\t vec2 ofs = fTaps_Poisson[i]; ofs = vec2(dot(ofs,basis.xz),dot(ofs,basis.yw) );\n\t //vec2 ofs = rot2d( fTaps_Poisson[i], rnd );\n\t vec2 texcoord = uv + max_siz * ofs / iResolution.xy;\n\t sum += texture2D(iChannel0, texcoord, -10.0);\n\t }\n\t\n\t\tfragColor = sum / vec4(NUM_TAPS);\n\t}\n\t\n\t//////\tEND SHADERTOY\t//////\n\t\n\t// call shadertoy style above\n\tvoid main() {\n\t\tmainImage(gl_FragColor, gl_FragCoord.xy);\n\t}\n`"
+ "code": "/*\n\t_shader_poisson_disc_blur\n\t'Blur: Poisson Disc' by hornet\n\thttps://www.shadertoy.com/view/lsfGWn\n\tremix cc teddavis.org 2020\n*/\n\n// define global variables for a texture (tex) and shader (warp)\nlet tex, theShader\n\nfunction setup() {\n\tcreateCanvas(windowWidth, windowHeight, WEBGL) // Shaders require WEBGL\n\tbackground(0)\n\n\tpixelDensity(1) // fixes retina display offset\n\n\t// create 2D/3D layer for passing into shader\n\ttex = createGraphics(width, height)\n\ttex.background(0)\n\n\t// load vert/frag defined below\n\ttheShader = createShader(vertShader, fragShader)\n}\n\n\nfunction draw() {\n\t// draw on 'tex', which is passed into shader\n\ttex.stroke(255)\n\ttex.noFill()\n\ttex.ellipse(random(width), random(height), random(50, 150))\n\n\t// text\n\ttex.fill(255)\n\ttex.textSize(tex.width / 5)\n\ttex.textAlign(CENTER, CENTER)\n\ttex.text(\"P5LIVE\", tex.width / 2, tex.height / 2)\n\n\t// pass required uniforms to our shader (shadertoy style)\n\ttheShader.setUniform(\"iResolution\", [width, height])\n\ttheShader.setUniform('iChannel0', tex) // pass layer here\n\ttheShader.setUniform(\"iTime\", frameCount * .001)\n\n\ttheShader.setUniform(\"iOffset\", map(mouseY, 0, height, 0, 1))\n\ttheShader.setUniform(\"iDistort\", 4.0)\n\ttheShader.setUniform(\"iMaxBlur\", map(mouseX, 0, width, 10, 100))\n\n\n\tshader(theShader) // apply shader\n\trect(0, 0, width, height) // display shader\n}\n\n/* SHADER DEFINITIONS */\n\nlet vertShader = `\n\tattribute vec3 aPosition;\n\tattribute vec2 aTexCoord;\n\tvarying vec2 vTexCoord;\n\t\n\tvoid main() {\n\t\tvTexCoord = aTexCoord;\n\t\n\t\tvec4 positionVec4 = vec4(aPosition, 1.0);\n\t\tpositionVec4.xy = positionVec4.xy * 2.0 - 1.0;\n\t\n\t\tgl_Position = positionVec4;\n\t}\n`\n\n\nlet fragShader = `\n\tprecision mediump float;\n\t\n\t//////\tSTART SHADERTOY\t//////\n\t\n\t#define ANIMATE_NOISE\n\t\n\tuniform vec2 iResolution;\n\tuniform sampler2D iChannel0;\n\tuniform float iTime;\n\t\n\tuniform float iOffset;\n\tuniform float iDistort;\n\tuniform float iMaxBlur;\n\t\n\tfloat nrand( vec2 n ) {\n\t\treturn fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);\n\t}\n\t\n\tvec2 rot2d( vec2 p, float a ) {\n\t\tvec2 sc = vec2(sin(a),cos(a));\n\t\treturn vec2( dot( p, vec2(sc.y, -sc.x) ), dot( p, sc.xy ) );\n\t}\n\t\n\tconst int NUM_TAPS = 27;\n\tconst float rcp_maxdist = 1.0 / 3.22244;\n\t\n\tvoid main(){\n\t\n\t vec2 uv = gl_FragCoord.xy / iResolution.xy;\n\t\tuv.y = 1.0-uv.y;\n\t \n\t float max_siz;\n\t max_siz = iMaxBlur * (0.5 - 0.5 * sin(iDistort * uv.y - iOffset));\n\t \n\t //fragColor = vec4( vec3(max_siz), 1.0 );\n\t //return;\n\t\t\n\t //note: for samples-positions see\n\t // https://github.com/GPUOpen-Effects/ShadowFX/blob/master/amd_shadowfx/src/Shaders/\n\t \n\t\tvec2 fTaps_Poisson[NUM_TAPS];\n\t fTaps_Poisson[0] = rcp_maxdist * vec2( -0.8835609, 2.523391 );\n\t fTaps_Poisson[1] = rcp_maxdist * vec2( -1.387375, 1.056318 );\n\t fTaps_Poisson[2] = rcp_maxdist * vec2( -2.854452, 1.313645 );\n\t fTaps_Poisson[3] = rcp_maxdist * vec2( 0.6326182, 1.14569 );\n\t fTaps_Poisson[4] = rcp_maxdist * vec2( 1.331515, 3.637297 );\n\t fTaps_Poisson[5] = rcp_maxdist * vec2( -2.175307, 3.885795 );\n\t fTaps_Poisson[6] = rcp_maxdist * vec2( -0.5396664, 4.1938 );\n\t fTaps_Poisson[7] = rcp_maxdist * vec2( -0.6708734, -0.36875 );\n\t fTaps_Poisson[8] = rcp_maxdist * vec2( -2.083908, -0.6921188 );\n\t fTaps_Poisson[9] = rcp_maxdist * vec2( -3.219028, 2.85465 );\n\t fTaps_Poisson[10] = rcp_maxdist * vec2( -1.863933, -2.742254 );\n\t fTaps_Poisson[11] = rcp_maxdist * vec2( -4.125739, -1.283028 );\n\t fTaps_Poisson[12] = rcp_maxdist * vec2( -3.376766, -2.81844 );\n\t fTaps_Poisson[13] = rcp_maxdist * vec2( -3.974553, 0.5459405 );\n\t fTaps_Poisson[14] = rcp_maxdist * vec2( 3.102514, 1.717692 );\n\t fTaps_Poisson[15] = rcp_maxdist * vec2( 2.951887, 3.186624 );\n\t fTaps_Poisson[16] = rcp_maxdist * vec2( 1.33941, -0.166395 );\n\t fTaps_Poisson[17] = rcp_maxdist * vec2( 2.814727, -0.3216669 );\n\t fTaps_Poisson[18] = rcp_maxdist * vec2( 0.7786853, -2.235639 );\n\t fTaps_Poisson[19] = rcp_maxdist * vec2( -0.7396695, -1.702466 );\n\t fTaps_Poisson[20] = rcp_maxdist * vec2( 0.4621856, -3.62525 );\n\t fTaps_Poisson[21] = rcp_maxdist * vec2( 4.181541, 0.5883132 );\n\t fTaps_Poisson[22] = rcp_maxdist * vec2( 4.22244, -1.11029 );\n\t fTaps_Poisson[23] = rcp_maxdist * vec2( 2.116917, -1.789436 );\n\t fTaps_Poisson[24] = rcp_maxdist * vec2( 1.915774, -3.425885 );\n\t fTaps_Poisson[25] = rcp_maxdist * vec2( 3.142686, -2.656329 );\n\t fTaps_Poisson[26] = rcp_maxdist * vec2( -1.108632, -4.023479 );\n\t\n\t vec4 sum = vec4(0);\n\t vec2 seed = uv;\n\t #if defined( ANIMATE_NOISE )\n\t seed += fract( iTime );\n\t #endif\n\t float rnd = 6.28 * nrand( seed );\n\t\n\t vec4 basis = vec4( rot2d(vec2(1,0),rnd), rot2d(vec2(0,1),rnd) );\n\t for (int i=0; i < NUM_TAPS; i++)\n\t {\n\t vec2 ofs = fTaps_Poisson[i]; ofs = vec2(dot(ofs,basis.xz),dot(ofs,basis.yw) );\n\t //vec2 ofs = rot2d( fTaps_Poisson[i], rnd );\n\t vec2 texcoord = uv + max_siz * ofs / iResolution.xy;\n\t sum += texture2D(iChannel0, texcoord, -10.0);\n\t }\n\t\n\t\tgl_FragColor = sum / vec4(NUM_TAPS);\n\t}\n\t\n\t//////\tEND SHADERTOY\t//////\n\t\n`"
},
{
"name": "_shaders_chromatic_aberration",
diff --git a/includes/templates/p5live_sketch.html b/includes/templates/p5live_sketch.html
index c681b37..22fbc11 100644
--- a/includes/templates/p5live_sketch.html
+++ b/includes/templates/p5live_sketch.html
@@ -28,8 +28,8 @@
}
-
-
+
+