diff --git a/.editorconfig b/.editorconfig index d453dfc..cc17ce5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,6 +8,9 @@ indent_style = tab insert_final_newline = true trim_trailing_whitespace = true -[*.json] +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] indent_size = 2 indent_style = space diff --git a/.gitattributes b/.gitattributes index aa712ec..2f897ca 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ *.png filter=lfs diff=lfs merge=lfs -text +*.webm filter=lfs diff=lfs merge=lfs -text *.woff2 filter=lfs diff=lfs merge=lfs -text diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 588ced3..0000000 Binary files a/bun.lockb and /dev/null differ diff --git a/package.json b/package.json index f0cc034..c9ceae3 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { - "name": "renati.me", - "type": "module", - "scripts": { - "watch": "tailwindcss -i tailwind.css -o src/css/style.css --watch" - }, - "devDependencies": { - "tailwindcss": "^3.4.1" - } + "name": "renati.me", + "type": "module", + "scripts": { + "build": "tailwindcss -i tailwind.css -o src/css/style.css", + "watch": "tailwindcss -i tailwind.css -o src/css/style.css --watch" + }, + "devDependencies": { + "tailwindcss": "^3.4.18" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..d3b5f1c --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,829 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + tailwindcss: + specifier: ^3.4.18 + version: 3.4.18 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwindcss@3.4.18: + resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + camelcase-css@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@4.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + lru-cache@10.4.3: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + normalize-path@3.0.0: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + package-json-from-dist@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + queue-microtask@1.2.3: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwindcss@3.4.18: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - tsx + - yaml + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-interface-checker@0.1.13: {} + + util-deprecate@1.0.2: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 diff --git a/src/asmscript/conditionals.html b/src/asmscript/conditionals.html new file mode 100644 index 0000000..bcc9679 --- /dev/null +++ b/src/asmscript/conditionals.html @@ -0,0 +1,32 @@ + + + + + asmscript (asms) documentation + + + +
+

asmscript

+ +

Conditionals

+

Conditionals are extensions to statements that by their nature do not contain a condition. You can make a conditional by inserting the following syntax right before a semicolon:

+
if CONDITION
+

Conditionals serve as a shorthand for branches with only one statement and no else block.

+

Examples:

+
rax = 0 if rcx > 5;
+rax += rcx if rsi <= -1;
+continue if 0 != r15;
+

Fun fact: the original intention behind conditionals is to have a syntax for conditional move intructions (cmov). Eventually I came to the conclusion that this syntax might as well be applicable to almost every statement, not just assignment. Conditional moves aren't implemented though, so when you use a conditional on an assignment, the compiler will just emit a conditional jump instruction.

+
+ + diff --git a/src/asmscript/conditions.html b/src/asmscript/conditions.html new file mode 100644 index 0000000..4504230 --- /dev/null +++ b/src/asmscript/conditions.html @@ -0,0 +1,40 @@ + + + + + asmscript (asms) documentation + + + +
+

asmscript

+ +

Conditions

+

Conditions are used in branch and looop statements and inside conditionals. Conditions look like so:

+
SOURCE COMPARISON SOURCE
+

Where COMPARISON is one of the following comparison operators:

+ +

Examples:

+
rax == 0
+rbx <= rcx
+-10 > r8
+

The compiler doesn't support conditions which have immediates on both sides (but why would you want that, anyway?).

+
+ + diff --git a/src/asmscript/index.html b/src/asmscript/index.html new file mode 100644 index 0000000..07e7b23 --- /dev/null +++ b/src/asmscript/index.html @@ -0,0 +1,80 @@ + + + + + asmscript (asms) documentation + + + +
+

asmscript

+ +

Overview

+

asmscript (aka asms) is a JIT-compiled programming language made in 48h for the third langjam hosted at langjam/jam0003 on GitHub. The theme was Beautiful Assembly.

+

This is a low-level language, which attempts to make x86_64 assembly look more structured and easier to read. The scope of this language is very limited because of the time constraints, but it is capable of doing some basic computations.

+

The source for this project is hosted on GitHub.

+

Features

+ +

Examples

+

Print integers from 1 to 100.

+
// A procedure named "main", which is the entry point
+proc main {
+    rax = 1;
+
+    loop (rax <= 100) {
+        << rax;   // Print value in rax to stdout
+        << "\n";  // Print newline to stdout
+        rax += 1;
+    }
+}
+

Print prime numbers between 2 and 100.

+
// This procedure will print the rax register if it contains a prime
+proc prime_test {
+    rbx = 2; // Our divisor
+    loop { // Loop without a condition is an infinite loop
+        // We only need to test divisors in range [2, sqrt(rax)]
+        // Loop until rbx * rbx <= rax
+        r8 = rbx;
+        r8 *= rbx;
+        break if r8 > rax; // Is prime, break and print the value
+
+        rdx = rax;
+        rdx %= rbx;
+        return if rdx == 0; // Not prime, return without printing
+
+        rbx += 1;
+    }
+
+    << rax;
+    << "\n";
+}
+
+proc main {
+    rax = 2;
+    loop (rax <= 100) {
+        prime_test; // Call the "prime_test" procedure
+        rax += 1;
+    }
+}
+
+ + diff --git a/src/asmscript/operands.html b/src/asmscript/operands.html new file mode 100644 index 0000000..e7e08a2 --- /dev/null +++ b/src/asmscript/operands.html @@ -0,0 +1,51 @@ + + + + + asmscript (asms) documentation + + + +
+

asmscript

+ +

Operands

+

asmscript supports two types of operands: registers and immediates (aka literals).

+

Registers

+

You can freely use 15 general purpose registers by refering to their names:

+ +

Note that rsp (the stack pointer) is not available. However, you have access to push and pop statements, which do interact with rsp. All registers are assumed to hold a 64-bit signed integer. There is no support for any other registers nor for more narrow versions (e.g. eax, ax, al) of general purpose registers.

+

Immediates

+

You can use a 64-bit signed integer literal as an operand. Only decimal literals are supported.

+

Destination and source operands

+

Statements can make use of two types of operands: destination operands and source operands. Source operands are read-only, while destination operands can be written to.

+

You can only use a register as a destination operand.

+

You can use either a register or an immediate as a source operand.

+
+ + diff --git a/src/asmscript/procedures.html b/src/asmscript/procedures.html new file mode 100644 index 0000000..70f833d --- /dev/null +++ b/src/asmscript/procedures.html @@ -0,0 +1,33 @@ + + + + + asmscript (asms) documentation + + + +
+

asmscript

+ +

Procedures

+

There is only one construct that can exist at the top-level of an asms file - procedure declaration. A procedure has a unique name and contains a block of statements.

+
proc NAME {
+    STATEMENTS
+}
+

You don't specify arguments or return types for procedures. It is up to you to decide how you will pass arguments and return values. In other words, you are responsible for defining and following your own calling convention.

+

A procedure name cannot be a reserved keyword and has to satisfy this regular expression:
[_a-zA-Z][_a-zA-Z0-9]*
Procedure named "main" is special and is considered the entry point. You must have a procedure named "main" in your program.

+

You can call a procedure using a call statement, which will emit a "call" instruction. A "ret" instruction is placed at the end (and also at every return statement), so you don't have to use a return statement if you don't need to.

+

Entry point

+

main isn't actually the true entry point. Right before calling main, every register you have access to is pushed on the stack, and then popped after main returns. This ensures that you can use registers in your code as you wish without worrying about breaking the calling convention of the JIT compiler.

+
+ + diff --git a/src/asmscript/statements.html b/src/asmscript/statements.html new file mode 100644 index 0000000..34a5507 --- /dev/null +++ b/src/asmscript/statements.html @@ -0,0 +1,92 @@ + + + + + asmscript (asms) documentation + + + +
+

asmscript

+ +

Statements

+

You might've heard of expression-oriended programming languages, in which every or nearly every statement is also an expression. asmscript is the exact opposite: everything is a statement and there aren't really any expressions.

+

Assignment

+

Assignment statement lets you assign a source operand to a destination operand.

+
DEST = SOURCE;
+

Examples:

+
rax = rbx;
+rcx = 42;
+rdx = -100;
+

Shorthand

+

Shorthands (as in shorthand assignment) let you do calculations.

+
DEST += SOURCE;
+DEST -= SOURCE;
+DEST *= SOURCE;
+DEST /= SOURCE;
+DEST %= SOURCE;
+DEST &= SOURCE;
+DEST |= SOURCE;
+DEST ^= SOURCE;
+

These statements perform (from top to bottom): addition, subtraction, multiplication, division, modulo, bitwise and, bitwise or, bitwise xor. Numbers are assumed to be 64-bit signed integers.

+

Branch

+

Branch takes a condition, a block of statements and an optional else block.

+
branch (CONDITION) {
+     STATEMENTS
+}
+
+branch (CONDITION) {
+    STATEMENTS
+} else {
+    STATEMENTS
+}
+

Note that braces are mandatory. Branch by its nature contains a condition, so it cannot be combined with a conditional.

+

Loop

+

Loop takes an optional condition and a block of statements. Loop without a condition is an infinite loop.

+
loop {
+     STATEMENTS
+}
+
+loop (CONDITION) {
+    STATEMENTS
+}
+

Note that braces are mandatory. Loop by its nature contains a condition, so it cannot be combined with a conditional.

+

Push and pop

+

You can push and pop registers on the stack. Note that this instruction supports only registers.

+
push REGISTER;
+pop REGISTER;
+

Continue, break and return

+

You can use continue and break from inside a loop and return from anywhere inside a procedure. There are no labeled breaks or continues.

+
continue;
+break;
+return;
+

Note that return never takes any operands. You return values by setting registers appropriately according to your own calling convention.

+

Call

+

You call a procedure by just stating its name followed by a semicolon.

+

NAME;
+

stdout

+

You can output operands and constant strings to stdout through a special statement.

+
<< SOURCE;
+<< STRING;
+

This statement emits a call to a function implemented in the JIT compiler, which performs the actual printing. All registers are saved before the call and restored afterwards, such that the calling convention in the JIT compiler won't interfere with any values in your registers.

+

A string is a special token used only for this statement. The string is contained in double quotes and supports the following escape sequences:

+ +

Note that when you output a string, the string is placed in memory right beside the instruction that prints that string and a jump instruction is emitted that jumps over the string literal. This can confuse disassemblers when you try to decode generated machine code.

+
+ + diff --git a/src/asmscript/style.css b/src/asmscript/style.css new file mode 100644 index 0000000..2bafe4d --- /dev/null +++ b/src/asmscript/style.css @@ -0,0 +1,96 @@ +html, body { + margin: 0; + padding: 0; +} + +body { + color: black; + background-color: white; + font-size: 20px; + font-family: 'Cascadia Mono', 'Fira Mono', Consolas, 'Courier New', 'Liberation Mono', monospace; +} + +main { + margin: 0 auto; + max-width: 800px; +} + +h1 { + margin: 16px 0; + font-size: 32px; + font-family: Arial, Helvetica, 'Liberation Sans', sans-serif; +} + +h1 a:link, h1 a:active, h1 a:visited, h1 a:hover { + text-decoration: none; +} + +a:link, a:active, a:visited { + color: inherit; + text-decoration: underline dotted; +} + +h2 { + margin: 32px 0 8px; + font-size: 24px; + font-family: Arial, Helvetica, 'Liberation Sans', sans-serif; +} + +p { + margin: 8px 0; +} + +ul { + margin: 8px 0; +} + +pre .kw { + color: #af00db; +} + +pre .fn { + color: #795e26; +} + +pre .num { + color: #098658; +} + +pre .comm { + color: #008000; +} + +pre .str { + color: #a31515; +} + +@media (prefers-color-scheme: dark) { + body { + color: #d4d4d4; + background-color: #1E1E1E; + } + + pre .kw { + color: #c586c0; + } + + pre .fn { + color: #dcdcaa; + } + + pre .num { + color: #b5cea8; + } + + pre .comm { + color: #6a9955; + } + + pre .str { + color: #ce9178; + } + + pre .reg { + color: #9cdcfe; + } +} diff --git a/src/oktaeder/example/bundle.css b/src/oktaeder/example/bundle.css new file mode 100644 index 0000000..27c2684 --- /dev/null +++ b/src/oktaeder/example/bundle.css @@ -0,0 +1,14 @@ +/* example/style.css */ +html, +body { + margin: 0; + padding: 0; +} +html, +body, +canvas { + width: 100%; + height: 100%; + overflow: hidden; +} +/*# sourceMappingURL=bundle.css.map */ diff --git a/src/oktaeder/example/bundle.css.map b/src/oktaeder/example/bundle.css.map new file mode 100644 index 0000000..5ff3c36 --- /dev/null +++ b/src/oktaeder/example/bundle.css.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["style.css"], + "sourcesContent": ["html, body {\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml, body, canvas {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n}\n"], + "mappings": ";AAAA;AAAM;AACL,UAAQ;AACR,WAAS;AACV;AAEA;AAAM;AAAM;AACX,SAAO;AACP,UAAQ;AACR,YAAU;AACX;", + "names": [] +} diff --git a/src/oktaeder/example/bundle.js b/src/oktaeder/example/bundle.js new file mode 100644 index 0000000..10f33d1 --- /dev/null +++ b/src/oktaeder/example/bundle.js @@ -0,0 +1,3833 @@ +// src/data/Camera.ts +var OrthographicCamera = class { + _name; + _halfVerticalSize; + _nearPlane; + _farPlane; + /** backreference */ + _node; + constructor({ + name = "", + halfVerticalSize, + nearPlane, + farPlane + }) { + this._name = name; + this._halfVerticalSize = halfVerticalSize; + this._nearPlane = nearPlane; + this._farPlane = farPlane; + this._node = null; + } + set name(value) { + this._name = value; + } + get name() { + return this._name; + } + set halfVerticalSize(value) { + this._halfVerticalSize = value; + } + get halfVerticalSize() { + return this._halfVerticalSize; + } + set nearPlane(value) { + this._nearPlane = value; + } + get nearPlane() { + return this._nearPlane; + } + set farPlane(value) { + this._farPlane = value; + } + get farPlane() { + return this._farPlane; + } + attach(node2) { + if (this._node !== null) { + this._node._camera = null; + } + if (node2._camera !== null) { + node2._camera._node = null; + } + node2._camera = this; + this._node = node2; + return this; + } + detach() { + if (this._node === null) { + return this; + } + this._node._camera = null; + this._node = null; + return this; + } + computeProjectionMatrix(aspectRatio, res) { + const halfHorizontalSize = this._halfVerticalSize / aspectRatio; + return res.set( + 1 / halfHorizontalSize, + 0, + 0, + 0, + 0, + 1 / this._halfVerticalSize, + 0, + 0, + 0, + 0, + 1 / (this._nearPlane - this._farPlane), + 0, + 0, + 0, + this._farPlane / (this._farPlane - this._nearPlane), + 1 + ); + } +}; +var PerspectiveCamera = class { + _name; + _verticalFovRad; + _nearPlane; + _farPlane; + /** backreference */ + _node; + constructor({ + name = "", + verticalFovRad, + nearPlane, + farPlane + }) { + this._name = name; + this._verticalFovRad = verticalFovRad; + this._nearPlane = nearPlane; + this._farPlane = farPlane; + this._node = null; + } + set name(value) { + this._name = value; + } + get name() { + return this._name; + } + set nearPlane(value) { + this._nearPlane = value; + } + get nearPlane() { + return this._nearPlane; + } + set farPlane(value) { + this._farPlane = value; + } + get farPlane() { + return this._farPlane; + } + attach(node2) { + if (this._node !== null) { + this._node._camera = null; + } + if (node2._camera !== null) { + node2._camera._node = null; + } + node2._camera = this; + this._node = node2; + return this; + } + detach() { + if (this._node === null) { + return this; + } + this._node._camera = null; + this._node = null; + return this; + } + computeProjectionMatrix(aspectRatio, res) { + const halfVerticalCotangent = 1 / Math.tan(0.5 * this._verticalFovRad); + if (this._farPlane === Infinity) { + return res.set( + halfVerticalCotangent / aspectRatio, + 0, + 0, + 0, + 0, + halfVerticalCotangent, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + this._nearPlane, + 0 + ); + } else { + return res.set( + halfVerticalCotangent / aspectRatio, + 0, + 0, + 0, + 0, + halfVerticalCotangent, + 0, + 0, + 0, + 0, + this._nearPlane / (this._nearPlane - this._farPlane), + 1, + 0, + 0, + this._nearPlane * this._farPlane / (this._farPlane - this._nearPlane), + 0 + ); + } + } +}; +Object.defineProperty(OrthographicCamera.prototype, "type", { value: "OrthographicCamera" }); +Object.defineProperty(PerspectiveCamera.prototype, "type", { value: "PerspectiveCamera" }); + +// src/data/Color.ts +var Color = class _Color { + r; + g; + b; + constructor(r, g, b) { + this.r = r; + this.g = g; + this.b = b; + } + static fromObject(object) { + return new _Color(object.r, object.g, object.b); + } + static fromTuple(tuple) { + return new _Color(...tuple); + } + static fromName(name) { + switch (name) { + case "black": + return new _Color(0, 0, 0); + case "silver": + return new _Color(192 / 255, 192 / 255, 192 / 255); + case "gray": + return new _Color(128 / 255, 128 / 255, 128 / 255); + case "white": + return new _Color(1, 1, 1); + case "maroon": + return new _Color(128 / 255, 0, 0); + case "red": + return new _Color(1, 0, 0); + case "purple": + return new _Color(128 / 255, 0, 128 / 255); + case "fuchsia": + return new _Color(1, 0, 1); + case "green": + return new _Color(0, 128 / 255, 0); + case "lime": + return new _Color(0, 255, 0); + case "olive": + return new _Color(128 / 255, 128 / 255, 0); + case "yellow": + return new _Color(1, 1, 0); + case "navy": + return new _Color(0, 0, 128 / 255); + case "blue": + return new _Color(0, 0, 1); + case "teal": + return new _Color(0, 128 / 255, 128 / 255); + case "aqua": + return new _Color(0, 1, 1); + case "orange": + return new _Color(1, 165 / 255, 0); + } + } + static fromVector3(vector) { + return new _Color(vector.x, vector.y, vector.z); + } + static white() { + return new _Color(1, 1, 1); + } + static black() { + return new _Color(0, 0, 0); + } + set(r, g, b) { + this.r = r; + this.g = g; + this.b = b; + return this; + } + setObject(object) { + this.r = object.r; + this.g = object.g; + this.b = object.b; + return this; + } + setTuple(tuple) { + this.r = tuple[0]; + this.g = tuple[1]; + this.b = tuple[2]; + return this; + } + setName(name) { + switch (name) { + case "black": + this.r = 0; + this.g = 0; + this.b = 0; + break; + case "silver": + this.r = 192 / 255; + this.g = 192 / 255; + this.b = 192 / 255; + break; + case "gray": + this.r = 128 / 255; + this.g = 128 / 255; + this.b = 128 / 255; + break; + case "white": + this.r = 1; + this.g = 1; + this.b = 1; + break; + case "maroon": + this.r = 128 / 255; + this.g = 0; + this.b = 0; + break; + case "red": + this.r = 1; + this.g = 0; + this.b = 0; + break; + case "purple": + this.r = 128 / 255; + this.g = 0; + this.b = 128 / 255; + break; + case "fuchsia": + this.r = 1; + this.g = 0; + this.b = 1; + break; + case "green": + this.r = 0; + this.g = 128 / 255; + this.b = 0; + break; + case "lime": + this.r = 0; + this.g = 255; + this.b = 0; + break; + case "olive": + this.r = 128 / 255; + this.g = 128 / 255; + this.b = 0; + break; + case "yellow": + this.r = 1; + this.g = 1; + this.b = 0; + break; + case "navy": + this.r = 0; + this.g = 0; + this.b = 128 / 255; + break; + case "blue": + this.r = 0; + this.g = 0; + this.b = 1; + break; + case "teal": + this.r = 0; + this.g = 128 / 255; + this.b = 128 / 255; + break; + case "aqua": + this.r = 0; + this.g = 1; + this.b = 1; + break; + case "orange": + this.r = 1; + this.g = 165 / 255; + this.b = 0; + break; + } + return this; + } + setVector3(vector) { + this.r = vector.x; + this.g = vector.y; + this.b = vector.z; + return this; + } + setWhite() { + this.r = 1; + this.g = 1; + this.b = 1; + return this; + } + setBlack() { + this.r = 0; + this.g = 0; + this.b = 0; + return this; + } + setR(r) { + this.r = r; + return this; + } + setG(g) { + this.g = g; + return this; + } + setB(b) { + this.b = b; + return this; + } +}; +Object.defineProperty(Color.prototype, "type", { value: "Color" }); + +// src/data/DynamicMaterial.ts +var DynamicMaterial = class { + _name; + _baseColor; + _partialCoverage; + _occlusionTextureStrength; + _metallic; + _roughness; + _normalScale; + _emissive; + _transmission; + _collimation; + _ior; + _baseColorPartialCoverageTexture; + _occlusionTexture; + _roughnessMetallicTexture; + _normalTexture; + _emissiveTexture; + _transmissionCollimationTexture; + _transparent; + _doubleSided; + constructor({ + name = "", + baseColor, + partialCoverage = 1, + occlusionTextureStrength = 1, + metallic = 1, + roughness = 1, + normalScale = 1, + emissive, + transmission, + collimation = 1, + ior = 1.45, + baseColorPartialCoverageTexture = null, + occlusionTexture = null, + roughnessMetallicTexture = null, + normalTexture = null, + emissiveTexture = null, + transmissionCollimationTexture = null, + transparent = false, + doubleSided = false + }) { + this._name = name; + this._baseColor = baseColor !== void 0 ? Color.fromObject(baseColor) : Color.white(); + this._partialCoverage = partialCoverage; + this._occlusionTextureStrength = occlusionTextureStrength; + this._metallic = metallic; + this._roughness = roughness; + this._normalScale = normalScale; + this._emissive = emissive !== void 0 ? Color.fromObject(emissive) : Color.black(); + this._transmission = transmission !== void 0 ? Color.fromObject(transmission) : Color.black(); + this._collimation = collimation; + this._ior = ior; + this._baseColorPartialCoverageTexture = baseColorPartialCoverageTexture; + this._occlusionTexture = occlusionTexture; + this._roughnessMetallicTexture = roughnessMetallicTexture; + this._normalTexture = normalTexture; + this._emissiveTexture = emissiveTexture; + this._transmissionCollimationTexture = transmissionCollimationTexture; + this._transparent = transparent; + this._doubleSided = doubleSided; + } + set name(value) { + this._name = value; + } + get name() { + return this._name; + } + setBaseColor(value) { + this._baseColor.setObject(value); + return this; + } + getBaseColor(res) { + return res.setObject(this._baseColor); + } + set partialCoverage(value) { + this._partialCoverage = value; + } + get partialCoverage() { + return this._partialCoverage; + } + set occlusionTextureStrength(value) { + this._occlusionTextureStrength = value; + } + get occlusionTextureStrength() { + return this._occlusionTextureStrength; + } + set metallic(value) { + this._metallic = value; + } + get metallic() { + return this._metallic; + } + set roughness(value) { + this._roughness = value; + } + get roughness() { + return this._roughness; + } + set normalScale(value) { + this._normalScale = value; + } + get normalScale() { + return this._normalScale; + } + setEmissive(value) { + this._emissive.setObject(value); + return this; + } + getEmissive(res) { + return res.setObject(this._emissive); + } + setTransmission(value) { + this._transmission.setObject(value); + return this; + } + getTransmission(res) { + return res.setObject(this._transmission); + } + set collimation(value) { + this._collimation = value; + } + get collimation() { + return this._collimation; + } + set ior(value) { + this._ior = value; + } + get ior() { + return this._ior; + } + set baseColorPartialCoverageTexture(value) { + this._baseColorPartialCoverageTexture = value; + } + get baseColorPartialCoverageTexture() { + return this._baseColorPartialCoverageTexture; + } + set occlusionTexture(value) { + this._occlusionTexture = value; + } + get occlusionTexture() { + return this._occlusionTexture; + } + set roughnessMetallicTexture(value) { + this._roughnessMetallicTexture = value; + } + get roughnessMetallicTexture() { + return this._roughnessMetallicTexture; + } + set normalTexture(value) { + this._normalTexture = value; + } + get normalTexture() { + return this._normalTexture; + } + set emissiveTexture(value) { + this._emissiveTexture = value; + } + get emissiveTexture() { + return this._emissiveTexture; + } + set transmissionCollimationTexture(value) { + this._transmissionCollimationTexture = value; + } + get transmissionCollimationTexture() { + return this._transmissionCollimationTexture; + } + set transparent(value) { + this._transparent = value; + } + get transparent() { + return this._transparent; + } + set doubleSided(value) { + this._doubleSided = value; + } + get doubleSided() { + return this._doubleSided; + } +}; +Object.defineProperty(DynamicMaterial.prototype, "type", { value: "DynamicMaterial" }); +function isDynamicMaterial(value) { + return Boolean(value) && value.type === "DynamicMaterial"; +} + +// src/data/Light.ts +var DirectionalLight = class { + _name; + _color; + /** backreference */ + _node; + constructor({ + name = "", + color + }) { + this._name = name; + this._color = Color.fromObject(color); + this._node = null; + } + set name(value) { + this._name = value; + } + get name() { + return this._name; + } + setColor(value) { + this._color.setObject(value); + return this; + } + getColor(res) { + return res.setObject(this._color); + } + attach(node2) { + if (this._node !== null) { + this._node._light = null; + } + if (node2._light !== null) { + node2._light._node = null; + } + node2._light = this; + this._node = node2; + return this; + } + detach() { + if (this._node === null) { + return this; + } + this._node._light = null; + this._node = null; + return this; + } +}; +var PointLight = class { + _name; + _color; + /** backreference */ + _node; + constructor({ + name = "", + color + }) { + this._name = name; + this._color = Color.fromObject(color); + this._node = null; + } + set name(value) { + this._name = value; + } + get name() { + return this._name; + } + setColor(value) { + this._color.setObject(value); + return this; + } + getColor(res) { + return res.setObject(this._color); + } + attach(node2) { + if (this._node !== null) { + this._node._light = null; + } + if (node2._light !== null) { + node2._light._node = null; + } + node2._light = this; + this._node = node2; + return this; + } + detach() { + if (this._node === null) { + return this; + } + this._node._light = null; + this._node = null; + return this; + } +}; +Object.defineProperty(DirectionalLight.prototype, "type", { value: "DirectionalLight" }); +Object.defineProperty(PointLight.prototype, "type", { value: "PointLight" }); +function isDirectionalLight(value) { + return Boolean(value) && value.type === "DirectionalLight"; +} +function isPointLight(value) { + return Boolean(value) && value.type === "PointLight"; +} + +// src/data/Matrix4x4.ts +var Matrix4x4 = class _Matrix4x4 { + ix; + iy; + iz; + iw; + jx; + jy; + jz; + jw; + kx; + ky; + kz; + kw; + tx; + ty; + tz; + tw; + constructor(ix, iy, iz, iw, jx, jy, jz, jw, kx, ky, kz, kw, tx, ty, tz, tw) { + this.ix = ix; + this.iy = iy; + this.iz = iz; + this.iw = iw; + this.jx = jx; + this.jy = jy; + this.jz = jz; + this.jw = jw; + this.kx = kx; + this.ky = ky; + this.kz = kz; + this.kw = kw; + this.tx = tx; + this.ty = ty; + this.tz = tz; + this.tw = tw; + } + static fromObject(object) { + return new _Matrix4x4( + object.ix, + object.iy, + object.iz, + object.iw, + object.jx, + object.jy, + object.jz, + object.jw, + object.kx, + object.ky, + object.kz, + object.kw, + object.tx, + object.ty, + object.tz, + object.tw + ); + } + static fromTuple(tuple) { + return new _Matrix4x4(...tuple); + } + static identity() { + return new _Matrix4x4( + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ); + } + static fromTranslation(translation) { + return new _Matrix4x4( + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + translation.x, + translation.y, + translation.z, + 1 + ); + } + static fromQuaternion(quaternion) { + const xx = quaternion.x * quaternion.x; + const xy = quaternion.x * quaternion.y; + const xz = quaternion.x * quaternion.z; + const xw = quaternion.x * quaternion.w; + const yy = quaternion.y * quaternion.y; + const yz = quaternion.y * quaternion.z; + const yw = quaternion.y * quaternion.w; + const zz = quaternion.z * quaternion.z; + const zw = quaternion.z * quaternion.w; + return new _Matrix4x4( + 1 - 2 * (yy + zz), + 2 * (xy + zw), + 2 * (xz - yw), + 0, + 2 * (xy - zw), + 1 - 2 * (xx + zz), + 2 * (yz + xw), + 0, + 2 * (xz + yw), + 2 * (yz - xw), + 1 - 2 * (xx + yy), + 0, + 0, + 0, + 0, + 1 + ); + } + static fromScale(scale) { + return new _Matrix4x4( + scale.x, + 0, + 0, + 0, + 0, + scale.y, + 0, + 0, + 0, + 0, + scale.z, + 0, + 0, + 0, + 0, + 1 + ); + } + static fromTranslationRotationScale(translation, rotation, scale) { + const xx = rotation.x * rotation.x; + const xy = rotation.x * rotation.y; + const xz = rotation.x * rotation.z; + const xw = rotation.x * rotation.w; + const yy = rotation.y * rotation.y; + const yz = rotation.y * rotation.z; + const yw = rotation.y * rotation.w; + const zz = rotation.z * rotation.z; + const zw = rotation.z * rotation.w; + return new _Matrix4x4( + scale.x * (1 - 2 * (yy + zz)), + scale.x * 2 * (xy + zw), + scale.x * 2 * (xz - yw), + 0, + scale.y * 2 * (xy - zw), + scale.y * (1 - 2 * (xx + zz)), + scale.y * 2 * (yz + xw), + 0, + scale.z * 2 * (xz + yw), + scale.z * 2 * (yz - xw), + scale.z * (1 - 2 * (xx + yy)), + 0, + translation.x, + translation.y, + translation.z, + 1 + ); + } + set(ix, iy, iz, iw, jx, jy, jz, jw, kx, ky, kz, kw, tx, ty, tz, tw) { + this.ix = ix; + this.iy = iy; + this.iz = iz; + this.iw = iw; + this.jx = jx; + this.jy = jy; + this.jz = jz; + this.jw = jw; + this.kx = kx; + this.ky = ky; + this.kz = kz; + this.kw = kw; + this.tx = tx; + this.ty = ty; + this.tz = tz; + this.tw = tw; + return this; + } + setObject(object) { + this.ix = object.ix; + this.iy = object.iy; + this.iz = object.iz; + this.iw = object.iw; + this.jx = object.jx; + this.jy = object.jy; + this.jz = object.jz; + this.jw = object.jw; + this.kx = object.kx; + this.ky = object.ky; + this.kz = object.kz; + this.kw = object.kw; + this.tx = object.tx; + this.ty = object.ty; + this.tz = object.tz; + this.tw = object.tw; + return this; + } + setTuple(tuple) { + this.ix = tuple[0]; + this.iy = tuple[1]; + this.iz = tuple[2]; + this.iw = tuple[3]; + this.jx = tuple[4]; + this.jy = tuple[5]; + this.jz = tuple[6]; + this.jw = tuple[7]; + this.kx = tuple[8]; + this.ky = tuple[9]; + this.kz = tuple[10]; + this.kw = tuple[11]; + this.tx = tuple[12]; + this.ty = tuple[13]; + this.tz = tuple[14]; + this.tw = tuple[15]; + return this; + } + setIdentity() { + this.ix = 1; + this.iy = 0; + this.iz = 0; + this.iw = 0; + this.jx = 0; + this.jy = 1; + this.jz = 0; + this.jw = 0; + this.kx = 0; + this.ky = 0; + this.kz = 1; + this.kw = 0; + this.tx = 0; + this.ty = 0; + this.tz = 0; + this.tw = 1; + return this; + } + setTranslation(translation) { + this.ix = 1; + this.iy = 0; + this.iz = 0; + this.iw = 0; + this.jx = 0; + this.jy = 1; + this.jz = 0; + this.jw = 0; + this.kx = 0; + this.ky = 0; + this.kz = 1; + this.kw = 0; + this.tx = translation.x; + this.ty = translation.y; + this.tz = translation.z; + this.tw = 1; + return this; + } + setQuaternion(quaternion) { + const xx = quaternion.x * quaternion.x; + const xy = quaternion.x * quaternion.y; + const xz = quaternion.x * quaternion.z; + const xw = quaternion.x * quaternion.w; + const yy = quaternion.y * quaternion.y; + const yz = quaternion.y * quaternion.z; + const yw = quaternion.y * quaternion.w; + const zz = quaternion.z * quaternion.z; + const zw = quaternion.z * quaternion.w; + this.ix = 1 - 2 * (yy + zz); + this.iy = 2 * (xy + zw); + this.iz = 2 * (xz - yw); + this.iw = 0; + this.jx = 2 * (xy - zw); + this.jy = 1 - 2 * (xx + zz); + this.jz = 2 * (yz + xw); + this.jw = 0; + this.kx = 2 * (xz + yw); + this.ky = 2 * (yz - xw); + this.kz = 1 - 2 * (xx + yy); + this.kw = 0; + this.tx = 0; + this.ty = 0; + this.tz = 0; + this.tw = 1; + return this; + } + setScale(scale) { + this.ix = scale.x; + this.iy = 0; + this.iz = 0; + this.iw = 0; + this.jx = 0; + this.jy = scale.y; + this.jz = 0; + this.jw = 0; + this.kx = 0; + this.ky = 0; + this.kz = scale.z; + this.kw = 0; + this.tx = 0; + this.ty = 0; + this.tz = 0; + this.tw = 1; + return this; + } + setTranslationRotationScale(translation, rotation, scale) { + const xx = rotation.x * rotation.x; + const xy = rotation.x * rotation.y; + const xz = rotation.x * rotation.z; + const xw = rotation.x * rotation.w; + const yy = rotation.y * rotation.y; + const yz = rotation.y * rotation.z; + const yw = rotation.y * rotation.w; + const zz = rotation.z * rotation.z; + const zw = rotation.z * rotation.w; + this.ix = scale.x * (1 - 2 * (yy + zz)); + this.iy = scale.x * 2 * (xy + zw); + this.iz = scale.x * 2 * (xz - yw); + this.iw = 0; + this.jx = scale.y * 2 * (xy - zw); + this.jy = scale.y * (1 - 2 * (xx + zz)); + this.jz = scale.y * 2 * (yz + xw); + this.jw = 0; + this.kx = scale.z * 2 * (xz + yw); + this.ky = scale.z * 2 * (yz - xw); + this.kz = scale.z * (1 - 2 * (xx + yy)); + this.kw = 0; + this.tx = translation.x; + this.ty = translation.y; + this.tz = translation.z; + this.tw = 1; + return this; + } + addMatrix(m) { + this.ix += m.ix; + this.iy += m.iy; + this.iz += m.iz; + this.iw += m.iw; + this.jx += m.jx; + this.jy += m.jy; + this.jz += m.jz; + this.jw += m.jw; + this.kx += m.kx; + this.ky += m.ky; + this.kz += m.kz; + this.kw += m.kw; + this.tx += m.tx; + this.ty += m.ty; + this.tz += m.tz; + this.tw += m.tw; + return this; + } + addMatrices(a, b) { + this.ix = a.ix + b.ix; + this.iy = a.iy + b.iy; + this.iz = a.iz + b.iz; + this.iw = a.iw + b.iw; + this.jx = a.jx + b.jx; + this.jy = a.jy + b.jy; + this.jz = a.jz + b.jz; + this.jw = a.jw + b.jw; + this.kx = a.kx + b.kx; + this.ky = a.ky + b.ky; + this.kz = a.kz + b.kz; + this.kw = a.kw + b.kw; + this.tx = a.tx + b.tx; + this.ty = a.ty + b.ty; + this.tz = a.tz + b.tz; + this.tw = a.tw + b.tw; + return this; + } + subMatrix(m) { + this.ix -= m.ix; + this.iy -= m.iy; + this.iz -= m.iz; + this.iw -= m.iw; + this.jx -= m.jx; + this.jy -= m.jy; + this.jz -= m.jz; + this.jw -= m.jw; + this.kx -= m.kx; + this.ky -= m.ky; + this.kz -= m.kz; + this.kw -= m.kw; + this.tx -= m.tx; + this.ty -= m.ty; + this.tz -= m.tz; + this.tw -= m.tw; + return this; + } + subMatrices(a, b) { + this.ix = a.ix - b.ix; + this.iy = a.iy - b.iy; + this.iz = a.iz - b.iz; + this.iw = a.iw - b.iw; + this.jx = a.jx - b.jx; + this.jy = a.jy - b.jy; + this.jz = a.jz - b.jz; + this.jw = a.jw - b.jw; + this.kx = a.kx - b.kx; + this.ky = a.ky - b.ky; + this.kz = a.kz - b.kz; + this.kw = a.kw - b.kw; + this.tx = a.tx - b.tx; + this.ty = a.ty - b.ty; + this.tz = a.tz - b.tz; + this.tw = a.tw - b.tw; + return this; + } + negate() { + this.ix = -this.ix; + this.iy = -this.iy; + this.iz = -this.iz; + this.iw = -this.iw; + this.jx = -this.jx; + this.jy = -this.jy; + this.jz = -this.jz; + this.jw = -this.jw; + this.kx = -this.kx; + this.ky = -this.ky; + this.kz = -this.kz; + this.kw = -this.kw; + this.tx = -this.tx; + this.ty = -this.ty; + this.tz = -this.tz; + this.tw = -this.tw; + return this; + } + mulScalar(k) { + this.ix *= k; + this.iy *= k; + this.iz *= k; + this.iw *= k; + this.jx *= k; + this.jy *= k; + this.jz *= k; + this.jw *= k; + this.kx *= k; + this.ky *= k; + this.kz *= k; + this.kw *= k; + this.tx *= k; + this.ty *= k; + this.tz *= k; + this.tw *= k; + return this; + } + mulMatrix(m) { + const ix = this.ix * m.ix + this.jx * m.iy + this.kx * m.iz + this.tx * m.iw; + const iy = this.iy * m.ix + this.jy * m.iy + this.ky * m.iz + this.ty * m.iw; + const iz = this.iz * m.ix + this.jz * m.iy + this.kz * m.iz + this.tz * m.iw; + const iw = this.iw * m.ix + this.jw * m.iy + this.kw * m.iz + this.tw * m.iw; + const jx = this.ix * m.jx + this.jx * m.jy + this.kx * m.jz + this.tx * m.jw; + const jy = this.iy * m.jx + this.jy * m.jy + this.ky * m.jz + this.ty * m.jw; + const jz = this.iz * m.jx + this.jz * m.jy + this.kz * m.jz + this.tz * m.jw; + const jw = this.iw * m.jx + this.jw * m.jy + this.kw * m.jz + this.tw * m.jw; + const kx = this.ix * m.kx + this.jx * m.ky + this.kx * m.kz + this.tx * m.kw; + const ky = this.iy * m.kx + this.jy * m.ky + this.ky * m.kz + this.ty * m.kw; + const kz = this.iz * m.kx + this.jz * m.ky + this.kz * m.kz + this.tz * m.kw; + const kw = this.iw * m.kx + this.jw * m.ky + this.kw * m.kz + this.tw * m.kw; + const tx = this.ix * m.tx + this.jx * m.ty + this.kx * m.tz + this.tx * m.tw; + const ty = this.iy * m.tx + this.jy * m.ty + this.ky * m.tz + this.ty * m.tw; + const tz = this.iz * m.tx + this.jz * m.ty + this.kz * m.tz + this.tz * m.tw; + const tw = this.iw * m.tx + this.jw * m.ty + this.kw * m.tz + this.tw * m.tw; + this.ix = ix; + this.iy = iy; + this.iz = iz; + this.iw = iw; + this.jx = jx; + this.jy = jy; + this.jz = jz; + this.jw = jw; + this.kx = kx; + this.ky = ky; + this.kz = kz; + this.kw = kw; + this.tx = tx; + this.ty = ty; + this.tz = tz; + this.tw = tw; + return this; + } + premulMatrix(m) { + const ix = m.ix * this.ix + m.jx * this.iy + m.kx * this.iz + m.tx * this.iw; + const iy = m.iy * this.ix + m.jy * this.iy + m.ky * this.iz + m.ty * this.iw; + const iz = m.iz * this.ix + m.jz * this.iy + m.kz * this.iz + m.tz * this.iw; + const iw = m.iw * this.ix + m.jw * this.iy + m.kw * this.iz + m.tw * this.iw; + const jx = m.ix * this.jx + m.jx * this.jy + m.kx * this.jz + m.tx * this.jw; + const jy = m.iy * this.jx + m.jy * this.jy + m.ky * this.jz + m.ty * this.jw; + const jz = m.iz * this.jx + m.jz * this.jy + m.kz * this.jz + m.tz * this.jw; + const jw = m.iw * this.jx + m.jw * this.jy + m.kw * this.jz + m.tw * this.jw; + const kx = m.ix * this.kx + m.jx * this.ky + m.kx * this.kz + m.tx * this.kw; + const ky = m.iy * this.kx + m.jy * this.ky + m.ky * this.kz + m.ty * this.kw; + const kz = m.iz * this.kx + m.jz * this.ky + m.kz * this.kz + m.tz * this.kw; + const kw = m.iw * this.kx + m.jw * this.ky + m.kw * this.kz + m.tw * this.kw; + const tx = m.ix * this.tx + m.jx * this.ty + m.kx * this.tz + m.tx * this.tw; + const ty = m.iy * this.tx + m.jy * this.ty + m.ky * this.tz + m.ty * this.tw; + const tz = m.iz * this.tx + m.jz * this.ty + m.kz * this.tz + m.tz * this.tw; + const tw = m.iw * this.tx + m.jw * this.ty + m.kw * this.tz + m.tw * this.tw; + this.ix = ix; + this.iy = iy; + this.iz = iz; + this.iw = iw; + this.jx = jx; + this.jy = jy; + this.jz = jz; + this.jw = jw; + this.kx = kx; + this.ky = ky; + this.kz = kz; + this.kw = kw; + this.tx = tx; + this.ty = ty; + this.tz = tz; + this.tw = tw; + return this; + } + inverseAffine() { + const ix = this.ix; + const iy = this.iy; + const iz = this.iz; + const jx = this.jx; + const jy = this.jy; + const jz = this.jz; + const kx = this.kx; + const ky = this.ky; + const kz = this.kz; + const tx = this.tx; + const ty = this.ty; + const tz = this.tz; + const det = ix * jy * kz + iy * jz * kx + iz * jx * ky - ix * jz * ky - iy * jx * kz - iz * jy * kx; + const invDet = 1 / det; + this.ix = invDet * (jy * kz - jz * ky); + this.iy = invDet * (iz * ky - iy * kz); + this.iz = invDet * (iy * jz - iz * jy); + this.jx = invDet * (jz * kx - jx * kz); + this.jy = invDet * (ix * kz - iz * kx); + this.jz = invDet * (iz * jx - ix * jz); + this.kx = invDet * (jx * ky - jy * kx); + this.ky = invDet * (iy * kx - ix * ky); + this.kz = invDet * (ix * jy - iy * jx); + this.tx = -(this.ix * tx + this.jx * ty + this.kx * tz); + this.ty = -(this.iy * tx + this.jy * ty + this.ky * tz); + this.tz = -(this.iz * tx + this.jz * ty + this.kz * tz); + return this; + } + inverseTransposeAffine() { + const ix = this.ix; + const iy = this.iy; + const iz = this.iz; + const jx = this.jx; + const jy = this.jy; + const jz = this.jz; + const kx = this.kx; + const ky = this.ky; + const kz = this.kz; + const tx = this.tx; + const ty = this.ty; + const tz = this.tz; + const det = ix * jy * kz + iy * jz * kx + iz * jx * ky - ix * jz * ky - iy * jx * kz - iz * jy * kx; + const invDet = 1 / det; + this.ix = invDet * (jy * kz - jz * ky); + this.iy = invDet * (jz * kx - jx * kz); + this.iz = invDet * (jx * ky - jy * kx); + this.jx = invDet * (iz * ky - iy * kz); + this.jy = invDet * (ix * kz - iz * kx); + this.jz = invDet * (iy * kx - ix * ky); + this.kx = invDet * (iy * jz - iz * jy); + this.ky = invDet * (iz * jx - ix * jz); + this.kz = invDet * (ix * jy - iy * jx); + this.tx = -(this.ix * tx + this.iy * ty + this.iz * tz); + this.ty = -(this.jx * tx + this.jy * ty + this.jz * tz); + this.tz = -(this.kx * tx + this.ky * ty + this.kz * tz); + return this; + } +}; +Object.defineProperty(Matrix4x4.prototype, "type", { value: "Matrix4x4" }); + +// src/data/Mesh.ts +var Mesh = class { + type; + _name; + _vertexBuffer; + _indexBuffer; + _submeshes; + constructor({ + name = "", + vertexBuffer: vertexBuffer2, + indexBuffer: indexBuffer2, + submeshes + }) { + this._name = name; + this._vertexBuffer = vertexBuffer2; + this._indexBuffer = indexBuffer2; + this._submeshes = submeshes; + } + get submeshCount() { + return this._submeshes.length; + } + set name(value) { + this._name = value; + } + get name() { + return this._name; + } + set vertexBuffer(value) { + this._vertexBuffer = value; + } + get vertexBuffer() { + return this._vertexBuffer; + } + set indexBuffer(value) { + this._indexBuffer = value; + } + get indexBuffer() { + return this._indexBuffer; + } + setSubmeshes(value) { + this._submeshes.length = 0; + this._submeshes.push(...value); + return this; + } + getMaterials(res) { + res.length = 0; + res.push(...this._submeshes); + return res; + } +}; +Object.defineProperty(Mesh.prototype, "type", { value: "Mesh" }); + +// src/data/Node.ts +var Node2 = class { + _name; + _translation; + _rotation; + _scale; + /** unique */ + _camera; + /** unique */ + _light; + /** shared */ + _mesh; + /** shared */ + _materials; + /** unique */ + _children; + /** backreference */ + _parent; + _localMatrixNeedsUpdate; + _localMatrix; + _worldMatrixNeedsUpdate; + _worldMatrix; + constructor({ + name = "", + translation, + rotation, + scale, + camera: camera2 = null, + light = null, + mesh: mesh2 = null, + materials = [], + children = [] + }) { + this._name = name; + this._translation = translation !== void 0 ? Vector3.fromObject(translation) : Vector3.zero(); + this._rotation = rotation !== void 0 ? Quaternion.fromObject(rotation) : Quaternion.identity(); + this._scale = scale !== void 0 ? Vector3.fromObject(scale) : Vector3.one(); + this._camera = camera2; + this._light = light; + this._mesh = mesh2; + this._materials = materials; + this._children = children; + this._parent = null; + this._localMatrixNeedsUpdate = true; + this._localMatrix = new Matrix4x4( + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN + ); + this._worldMatrixNeedsUpdate = true; + this._worldMatrix = new Matrix4x4( + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN + ); + if (this._camera !== null) { + this._camera._node = this; + } + if (this._light !== null) { + this._light._node = this; + } + if (this._children !== null) { + for (const child of this._children) { + child._parent = this; + } + } + } + set name(value) { + this._name = value; + } + get name() { + return this._name; + } + setTranslation(value) { + this._translation.setObject(value); + this._localMatrixNeedsUpdate = true; + this._setWorldMatrixNeedsUpdateRecursive(true); + return this; + } + getTranslation(res) { + return res.setObject(this._translation); + } + setRotation(value) { + this._rotation.setObject(value); + this._localMatrixNeedsUpdate = true; + this._setWorldMatrixNeedsUpdateRecursive(true); + return this; + } + getRotation(res) { + return res.setObject(this._rotation); + } + setScale(value) { + this._scale.setObject(value); + this._localMatrixNeedsUpdate = true; + this._setWorldMatrixNeedsUpdateRecursive(true); + return this; + } + getScale(res) { + return res.setObject(this._scale); + } + set camera(value) { + if (value !== null) { + this.attachCamera(value); + } else { + this.detachCamera(); + } + } + get camera() { + return this._camera; + } + attachCamera(camera2) { + if (this._camera !== null) { + this._camera._node = null; + } + this._camera = camera2; + if (camera2._node !== null) { + camera2._node._camera = null; + } + camera2._node = this; + this._camera = camera2; + return this; + } + detachCamera() { + if (this._camera === null) { + return this; + } + this._camera._node = null; + this._camera = null; + return this; + } + set light(value) { + if (value !== null) { + this.attachLight(value); + } else { + this.detachLight(); + } + } + get light() { + return this._light; + } + attachLight(light) { + if (this._light !== null) { + this._light._node = null; + } + this._light = light; + if (light._node !== null) { + light._node._light = null; + } + light._node = this; + this._light = light; + return this; + } + detachLight() { + if (this._light === null) { + return this; + } + this._light._node = null; + this._light = null; + return this; + } + set mesh(value) { + this._mesh = value; + } + get mesh() { + return this._mesh; + } + setMaterials(value) { + this._materials.length = 0; + this._materials.push(...value); + return this; + } + getMaterials(res) { + res.length = 0; + res.push(...this._materials); + return res; + } + // TODO children + set parent(value) { + if (value !== null) { + this.attach(value); + } else { + this.detach(); + } + } + get parent() { + return this._parent; + } + attach(node2) { + if (this._parent !== null) { + this._parent._children.splice(this._parent._children.indexOf(this), 1); + } + node2._children.push(this); + this._parent = node2; + this._setWorldMatrixNeedsUpdateRecursive(true); + return this; + } + detach() { + if (this._parent === null) { + return this; + } + this._parent._children.splice(this._parent._children.indexOf(this), 1); + this._parent = null; + this._setWorldMatrixNeedsUpdateRecursive(true); + return this; + } + getLocalMatrix(res) { + this._updateLocalMatrix(); + res.setObject(this._localMatrix); + return res; + } + getWorldMatrix(res) { + this._updateWorldMatrix(); + res.setObject(this._worldMatrix); + return res; + } + _updateLocalMatrix() { + if (!this._localMatrixNeedsUpdate) { + return this; + } + this._localMatrix.setTranslationRotationScale(this._translation, this._rotation, this._scale); + this._localMatrixNeedsUpdate = false; + return this; + } + _updateWorldMatrix() { + if (!this._worldMatrixNeedsUpdate) { + return this; + } + this._updateLocalMatrix(); + if (this._parent !== null) { + this._parent.getWorldMatrix(this._worldMatrix); + this._worldMatrix.premulMatrix(this._localMatrix); + } else { + this._worldMatrix.setObject(this._localMatrix); + } + return this; + } + _setWorldMatrixNeedsUpdateRecursive(value) { + this._localMatrixNeedsUpdate = true; + for (const child of this._children) { + child._setWorldMatrixNeedsUpdateRecursive(value); + } + return this; + } +}; +Object.defineProperty(Node2.prototype, "type", { value: "Node" }); +function* preOrder(nodes) { + for (const node2 of nodes) { + yield node2; + yield* node2._children; + } +} + +// src/data/Quaternion.ts +var Quaternion = class _Quaternion { + x; + y; + z; + w; + constructor(x, y, z, w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + static fromObject(object) { + return new _Quaternion(object.x, object.y, object.z, object.w); + } + static fromTuple(tuple) { + return new _Quaternion(...tuple); + } + static identity() { + return new _Quaternion(0, 0, 0, 1); + } + static fromRotationXY(angleRad) { + const halfAngleRad = 0.5 * angleRad; + const c = Math.cos(halfAngleRad); + const s = Math.sin(halfAngleRad); + return new _Quaternion(0, 0, s, c); + } + static fromRotationYZ(angleRad) { + const halfAngleRad = 0.5 * angleRad; + const c = Math.cos(halfAngleRad); + const s = Math.sin(halfAngleRad); + return new _Quaternion(s, 0, 0, c); + } + static fromRotationZX(angleRad) { + const halfAngleRad = 0.5 * angleRad; + const c = Math.cos(halfAngleRad); + const s = Math.sin(halfAngleRad); + return new _Quaternion(0, s, 0, c); + } + setObject(object) { + this.x = object.x; + this.y = object.y; + this.z = object.z; + this.w = object.w; + return this; + } + setTuple(tuple) { + this.x = tuple[0]; + this.y = tuple[1]; + this.z = tuple[2]; + this.w = tuple[3]; + return this; + } + setIdentity() { + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 1; + return this; + } + setRotationXY(angleRad) { + const halfAngleRad = 0.5 * angleRad; + this.x = 0; + this.y = 0; + this.z = Math.sin(halfAngleRad); + this.w = Math.cos(halfAngleRad); + return this; + } + setRotationYZ(angleRad) { + const halfAngleRad = 0.5 * angleRad; + this.x = Math.sin(halfAngleRad); + this.y = 0; + this.z = 0; + this.w = Math.cos(halfAngleRad); + return this; + } + setRotationZX(angleRad) { + const halfAngleRad = 0.5 * angleRad; + this.x = 0; + this.y = Math.sin(halfAngleRad); + this.z = 0; + this.w = Math.cos(halfAngleRad); + return this; + } +}; +Object.defineProperty(Quaternion.prototype, "type", { value: "Quaternion" }); + +// src/data/Scene.ts +var Scene = class { + _name; + _nodes; + _ambientLight; + constructor({ + name = "", + nodes = [], + ambientLight + }) { + this._name = name; + this._nodes = nodes; + this._ambientLight = ambientLight !== void 0 ? Color.fromObject(ambientLight) : Color.black(); + } + set name(value) { + this._name = value; + } + get name() { + return this._name; + } + setAmbientLight(value) { + this._ambientLight.setObject(value); + return this; + } + getAmbientLight(res) { + return res.setObject(this._ambientLight); + } +}; +Object.defineProperty(Scene.prototype, "type", { value: "Scene" }); + +// src/data/Vector2.ts +var Vector2 = class _Vector2 { + x; + y; + constructor(x, y) { + this.x = x; + this.y = y; + } + static fromObject(object) { + return new _Vector2(object.x, object.y); + } + static fromTuple(tuple) { + return new _Vector2(...tuple); + } + static zero() { + return new _Vector2(0, 0); + } + static one() { + return new _Vector2(1, 1); + } + set(x, y) { + this.x = x; + this.y = y; + return this; + } + setObject(object) { + this.x = object.x; + this.y = object.y; + return this; + } + setTuple(tuple) { + this.x = tuple[0]; + this.y = tuple[1]; + return this; + } + setZero() { + this.x = 0; + this.y = 0; + return this; + } + setOne() { + this.x = 1; + this.y = 1; + return this; + } + setX(x) { + this.x = x; + return this; + } + setY(y) { + this.y = y; + return this; + } + normalize() { + const l = Math.sqrt(this.x * this.x + this.y * this.y); + this.x /= l; + this.y /= l; + return this; + } +}; +Object.defineProperty(Vector2.prototype, "type", { value: "Vector2" }); + +// src/data/Vector3.ts +var Vector3 = class _Vector3 { + x; + y; + z; + constructor(x, y, z) { + this.x = x; + this.y = y; + this.z = z; + } + static fromObject(object) { + return new _Vector3(object.x, object.y, object.z); + } + static fromTuple(tuple) { + return new _Vector3(...tuple); + } + static zero() { + return new _Vector3(0, 0, 0); + } + static one() { + return new _Vector3(1, 1, 1); + } + set(x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + } + setObject(object) { + this.x = object.x; + this.y = object.y; + this.z = object.z; + return this; + } + setTuple(tuple) { + this.x = tuple[0]; + this.y = tuple[1]; + this.z = tuple[2]; + return this; + } + setZero() { + this.x = 0; + this.y = 0; + this.z = 0; + return this; + } + setOne() { + this.x = 1; + this.y = 1; + this.z = 1; + return this; + } + setX(x) { + this.x = x; + return this; + } + setY(y) { + this.y = y; + return this; + } + setZ(z) { + this.z = z; + return this; + } + normalize() { + const l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + this.x /= l; + this.y /= l; + this.z /= l; + return this; + } +}; +Object.defineProperty(Vector3.prototype, "type", { value: "Vector3" }); + +// src/data/Vector4.ts +var Vector4 = class _Vector4 { + x; + y; + z; + w; + constructor(x, y, z, w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + static fromObject(object) { + return new _Vector4(object.x, object.y, object.z, object.w); + } + static fromTuple(tuple) { + return new _Vector4(...tuple); + } + static zero() { + return new _Vector4(0, 0, 0, 0); + } + static one() { + return new _Vector4(1, 1, 1, 1); + } + set(x, y, z, w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + return this; + } + setObject(object) { + this.x = object.x; + this.y = object.y; + this.z = object.z; + this.w = object.w; + return this; + } + setTuple(tuple) { + this.x = tuple[0]; + this.y = tuple[1]; + this.z = tuple[2]; + this.w = tuple[3]; + return this; + } + setZero() { + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 0; + return this; + } + setOne() { + this.x = 1; + this.y = 1; + this.z = 1; + this.w = 1; + return this; + } + setX(x) { + this.x = x; + return this; + } + setY(y) { + this.y = y; + return this; + } + setZ(z) { + this.z = z; + return this; + } + setW(w) { + this.w = w; + return this; + } + normalize() { + const l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + this.x /= l; + this.y /= l; + this.z /= l; + this.w /= l; + return this; + } +}; +Object.defineProperty(Vector4.prototype, "type", { value: "Vector4" }); + +// src/_BinaryWriter.ts +var _BinaryWriter = class __BinaryWriter { + static DEFAULT_CAPACITY = 16; + _buffer; + _dataView; + _typedArray; + _length; + get subarray() { + return new Uint8Array(this._buffer, 0, this._length); + } + constructor(capacity = __BinaryWriter.DEFAULT_CAPACITY) { + capacity = Math.max(capacity, 1); + this._buffer = new ArrayBuffer(capacity); + this._dataView = new DataView(this._buffer); + this._typedArray = new Uint8Array(this._buffer); + this._length = 0; + } + clear() { + this._length = 0; + return this; + } + ensureCapacity(desiredCapacity) { + if (this._buffer.byteLength >= desiredCapacity) { + return this; + } + let newCapacity = this._buffer.byteLength * 2; + while (newCapacity < desiredCapacity) { + newCapacity *= 2; + } + const newBuffer = new ArrayBuffer(newCapacity); + const newDataView = new DataView(newBuffer); + const newTypedArray = new Uint8Array(newBuffer); + newTypedArray.set(this.subarray); + this._buffer = newBuffer; + this._dataView = newDataView; + this._typedArray = newTypedArray; + return this; + } + ensureUnusedCapacity(desiredUnusedCapacity) { + return this.ensureCapacity(this._length + desiredUnusedCapacity); + } + writeU32(value) { + this.ensureUnusedCapacity(4); + this._dataView.setUint32(this._length, value, true); + this._length += 4; + return this; + } + writeF32(value) { + this.ensureUnusedCapacity(4); + this._dataView.setFloat32(this._length, value, true); + this._length += 4; + return this; + } + writeVector2(value) { + this.writeF32(value.x); + this.writeF32(value.y); + return this; + } + writeVector3(value) { + this.writeF32(value.x); + this.writeF32(value.y); + this.writeF32(value.z); + return this; + } + writeVector4(value) { + this.writeF32(value.x); + this.writeF32(value.y); + this.writeF32(value.z); + this.writeF32(value.w); + return this; + } + writeMatrix4x4(value) { + this.writeF32(value.ix); + this.writeF32(value.iy); + this.writeF32(value.iz); + this.writeF32(value.iw); + this.writeF32(value.jx); + this.writeF32(value.jy); + this.writeF32(value.jz); + this.writeF32(value.jw); + this.writeF32(value.kx); + this.writeF32(value.ky); + this.writeF32(value.kz); + this.writeF32(value.kw); + this.writeF32(value.tx); + this.writeF32(value.ty); + this.writeF32(value.tz); + this.writeF32(value.tw); + return this; + } + writeColorF32(value) { + this.writeF32(value.r); + this.writeF32(value.g); + this.writeF32(value.b); + return this; + } + padToAlign(alignment) { + const alignedLength = this._length + alignment - 1 & ~(alignment - 1); + const padding = alignedLength - this._length; + if (padding === 0) { + return this; + } + this.ensureUnusedCapacity(padding); + this._typedArray.fill(0, this._length, alignedLength); + this._length = alignedLength; + return this; + } + alloc(byteLength) { + this.ensureUnusedCapacity(byteLength); + const dataView = new DataView(this._buffer, this._length, byteLength); + this._length += byteLength; + return dataView; + } +}; + +// src/geometry.ts +function degToRad(angleDeg) { + return angleDeg * Math.PI / 180; +} + +// src/shader.ts +var GLOBAL_UNIFORMS_SIZE = 256; +var MATERIAL_UNIFORMS_SIZE = 256; +var OBJECT_UNIFORMS_SIZE = 256; +function _shaderFlagsKey({ + texCoord, + lightTexCoord, + normal, + tangent +}) { + let key = 0; + key |= Number(texCoord) << 0; + key |= Number(lightTexCoord) << 1; + key |= Number(normal) << 2; + key |= Number(tangent) << 3; + return key; +} +function _createPipeline(renderer2, { + texCoord, + lightTexCoord, + normal, + tangent +}) { + const shaderCode = _createShaderCode({ texCoord, lightTexCoord, normal, tangent }); + const shaderModule = renderer2._device.createShaderModule({ + code: shaderCode, + compilationHints: [ + { entryPoint: "vert", layout: renderer2._pipelineLayout }, + { entryPoint: "frag", layout: renderer2._pipelineLayout } + ] + }); + let vertexLocation = 0; + const pipeline = renderer2._device.createRenderPipeline({ + layout: renderer2._pipelineLayout, + vertex: { + entryPoint: "vert", + module: shaderModule, + buffers: [ + { + arrayStride: 12, + attributes: [{ + shaderLocation: vertexLocation++, + format: "float32x3", + offset: 0 + }] + }, + ...texCoord ? [{ + arrayStride: 8, + attributes: [{ + shaderLocation: vertexLocation++, + format: "float32x2", + offset: 0 + }] + }] : [], + ...lightTexCoord ? [{ + arrayStride: 8, + attributes: [{ + shaderLocation: vertexLocation++, + format: "float32x2", + offset: 0 + }] + }] : [], + ...normal ? [{ + arrayStride: 12, + attributes: [{ + shaderLocation: vertexLocation++, + format: "float32x3", + offset: 0 + }] + }] : [], + ...tangent ? [{ + arrayStride: 16, + attributes: [{ + shaderLocation: vertexLocation++, + format: "float32x4", + offset: 0 + }] + }] : [] + ] + }, + fragment: { + entryPoint: "frag", + module: shaderModule, + targets: [{ + format: renderer2._format, + blend: { + color: { + operation: "add", + srcFactor: "one", + dstFactor: "one-minus-src-alpha" + }, + alpha: { + operation: "add", + srcFactor: "one", + dstFactor: "one-minus-src-alpha" + } + }, + writeMask: GPUColorWrite.ALL + }] + }, + depthStencil: { + depthCompare: "greater", + depthWriteEnabled: true, + format: "depth32float" + }, + primitive: { + cullMode: "back", + frontFace: "ccw", + topology: "triangle-list" + } + }); + return pipeline; +} +function _createShaderCode({ + texCoord, + lightTexCoord, + normal, + tangent +}) { + return ` +struct Vertex { + @location(0) positionOS: vec3, + ${texCoord ? `@location(1) texCoord: vec2,` : ""} + ${lightTexCoord ? `@location(2) lightTexCoord: vec2,` : ""} + ${normal ? `@location(3) normalOS: vec3,` : ""} + ${normal && tangent ? `@location(4) tangentOS: vec4,` : ""} +} + +struct Varyings { + @builtin(position) positionCS: vec4, + @location(0) positionVS: vec3, + ${texCoord ? `@location(1) texCoord: vec2,` : ""} + ${lightTexCoord ? `@location(2) lightTexCoord: vec2,` : ""} + ${normal ? `@location(3) normalVS: vec3,` : ""} + ${normal && tangent ? `@location(4) tangentVS: vec3,` : ""} + ${normal && tangent ? `@location(5) bitangentVS: vec3,` : ""} +} + +struct PointLight { + positionWS: vec3, + color: vec3, +} + +struct DirectionalLight { + directionWS: vec3, + color: vec3, +} + +struct GlobalUniforms { + matrixWStoVS: mat4x4, + matrixVStoCS: mat4x4, + ambientLight: vec3, + pointLightCount: u32, + directionalLightCount: u32, +} + +struct MaterialUniforms { + baseColor: vec3, + partialCoverage: f32, + transmission: vec3, + collimation: f32, + occlusionTextureStrength: f32, + roughness: f32, + metallic: f32, + normalScale: f32, + emissive: vec3, + ior: f32, +} + +struct ObjectUniforms { + matrixOStoWS: mat4x4, + matrixOStoWSNormal: mat4x4, +} + +@group(0) @binding(0) var _Global: GlobalUniforms; +@group(1) @binding(0) var _Material: MaterialUniforms; +@group(2) @binding(0) var _Object: ObjectUniforms; + +@group(0) @binding(1) var _PointLights: array; +@group(0) @binding(2) var _DirectionalLights: array; + +@group(1) @binding(1) var _Sampler: sampler; +@group(1) @binding(2) var _BaseColorPartialCoverageTexture: texture_2d; +@group(1) @binding(3) var _OcclusionTexture: texture_2d; +@group(1) @binding(4) var _RoughnessMetallicTexture: texture_2d; +@group(1) @binding(5) var _NormalTexture: texture_2d; +@group(1) @binding(6) var _EmissiveTexture: texture_2d; +@group(1) @binding(7) var _TransmissionCollimationTexture: texture_2d; + +const INV_PI: f32 = 0.31830987; + +fn fresnelSchlick(dotVH: f32, f0: vec3) -> vec3 { + const f90 = vec3(1.0); + return f0 + (f90 - f0) * pow(1.0 - dotVH, 5.0); +} + +fn visibilityGGX(dotNL: f32, dotNV: f32, alpha: f32) -> f32 { + let alphaSquared = alpha * alpha; + + let vGGX = dotNL * sqrt(dotNV * dotNV * (1.0 - alphaSquared) + alphaSquared); + let lGGX = dotNV * sqrt(dotNL * dotNL * (1.0 - alphaSquared) + alphaSquared); + let GGX = vGGX + lGGX; + return select(0.0, 0.5 / GGX, GGX > 0.0); +} + +fn distributionGGX(dotNH: f32, alpha: f32) -> f32 { + let alphaSquared = alpha * alpha; + let tmp = dotNH * dotNH * (alphaSquared - 1.0) + 1.0; + return alphaSquared * INV_PI / (tmp * tmp); +} + +fn toneMapAcesNarkowicz(color: vec3) -> vec3 { + const A: f32 = 2.51; + const B: f32 = 0.03; + const C: f32 = 2.43; + const D: f32 = 0.59; + const E: f32 = 0.14; + return saturate((color * (A * color + B)) / (color * (C * color + D) + E)); +} + +fn lightOutgoingRadiance( + viewDirectionVS: vec3, actualNormalVS: vec3, dotNV: f32, + baseColor: vec3, alpha: f32, metallic: f32, f0: vec3, + incomingRadiance: vec3, lightDirectionVS: vec3, +) -> vec3 { + let halfVectorVS = normalize(lightDirectionVS + viewDirectionVS); + let dotVH = saturate(dot(viewDirectionVS, halfVectorVS)); + let dotNH = saturate(dot(actualNormalVS, halfVectorVS)); + let dotNL = saturate(dot(actualNormalVS, lightDirectionVS)); + + let fresnel = fresnelSchlick(dotVH, f0); + let visibility = visibilityGGX(dotNL, dotNV, alpha); + let distribution = distributionGGX(dotNH, alpha); + + let scatteredFactor = (1.0 - fresnel) * (1.0 - metallic) * baseColor * INV_PI; + let reflectedFactor = fresnel * visibility * distribution; + + return (scatteredFactor + reflectedFactor) * incomingRadiance * dotNL; +} + +fn screenSpaceMatrixTStoVS(positionVS: vec3, normalVS: vec3, texCoord: vec2) -> mat3x3 { + let q0 = dpdx(positionVS); + let q1 = dpdy(positionVS); + let uv0 = dpdx(texCoord); + let uv1 = dpdy(texCoord); + + let q1perp = cross(q1, normalVS); + let q0perp = cross(normalVS, q0); + + let tangentVS = q1perp * uv0.x + q0perp * uv1.x; + let bitangentVS = q1perp * uv0.y + q0perp * uv1.y; + + let det = max(dot(tangentVS, tangentVS), dot(bitangentVS, bitangentVS)); + let scale = select(0.0, inverseSqrt(det), det != 0.0); + + return mat3x3(tangentVS * scale, bitangentVS * scale, normalVS); +} + +@vertex +fn vert(vertex: Vertex) -> Varyings { + var output: Varyings; + let positionWS = (_Object.matrixOStoWS * vec4(vertex.positionOS, 1.0)).xyz; + let positionVS = (_Global.matrixWStoVS * vec4(positionWS, 1.0)).xyz; + let positionCS = _Global.matrixVStoCS * vec4(positionVS, 1.0); + output.positionCS = positionCS; + output.positionVS = positionVS; + ${normal ? ` + let normalWS = normalize((_Object.matrixOStoWSNormal * vec4(vertex.normalOS, 0.0)).xyz); + let normalVS = normalize((_Global.matrixWStoVS * vec4(normalWS, 0.0)).xyz); + output.normalVS = normalVS; + ${tangent ? ` + let tangentWS = normalize((_Object.matrixOStoWS * vec4(vertex.tangentOS.xyz, 0.0)).xyz); + let tangentVS = normalize((_Global.matrixWStoVS * vec4(tangentWS, 0.0)).xyz); + let bitangentVS = vertex.tangentOS.w * normalize(cross(normalVS, tangentVS)); + output.tangentVS = tangentVS; + output.bitangentVS = bitangentVS; + ` : ""} + ` : ""} + ${texCoord ? "output.texCoord = vertex.texCoord;" : ""} + ${lightTexCoord ? "output.lightTexCoord = vertex.lightTexCoord;" : ""} + return output; +} + +@fragment +fn frag(fragment: Varyings) -> @location(0) vec4 { + var baseColor = _Material.baseColor; + var partialCoverage = _Material.partialCoverage; + var occlusion = 1.0; + var roughness = _Material.roughness; + var metallic = _Material.metallic; + var normalScale = _Material.normalScale; + var emissive = _Material.emissive; + var ior = _Material.ior; + ${texCoord ? ` + let baseColorPartialCoverageTexel = textureSample(_BaseColorPartialCoverageTexture, _Sampler, fragment.texCoord); + baseColor *= baseColorPartialCoverageTexel.rgb; + partialCoverage *= baseColorPartialCoverageTexel.a; + let roughnessMetallicTexel = textureSample(_RoughnessMetallicTexture, _Sampler, fragment.texCoord); + roughness *= roughnessMetallicTexel.g; + metallic *= roughnessMetallicTexel.b; + let emissiveTexel = textureSample(_EmissiveTexture, _Sampler, fragment.texCoord); + emissive *= emissiveTexel.rgb; + ` : ""} + ${lightTexCoord ? ` + let occlusionTexel = textureSample(_OcclusionTexture, _Sampler, fragment.lightTexCoord); + occlusion += _Material.occlusionTextureStrength * (occlusionTexel.r - 1.0); + ` : ""} + + let positionVS = fragment.positionVS; + ${normal ? ` + let geometricNormalVS = fragment.normalVS; + ` : ` + let dPositionVSdx = dpdx(positionVS); + let dPositionVSdy = dpdy(positionVS); + let geometricNormalVS = normalize(cross(dPositionVSdx, dPositionVSdy)); + `} + ${texCoord ? ` + ${tangent ? ` + let tangentVS = normalize(fragment.tangentVS); + let bitangentVS = normalize(fragment.bitangentVS); + let matrixTStoVS = mat3x3(tangentVS, bitangentVS, geometricNormalVS); + ` : ` + let matrixTStoVS = screenSpaceMatrixTStoVS(positionVS, geometricNormalVS, fragment.texCoord); + `} + let normalTextureTexel = textureSample(_NormalTexture, _Sampler, fragment.texCoord); + var normalTS = normalTextureTexel.xyz * 2.0 - 1.0; + normalTS = vec3(normalTS.xy * _Material.normalScale, normalTS.z); + let actualNormalVS = normalize(matrixTStoVS * normalTS); + ` : ` + let actualNormalVS = geometricNormalVS; + `} + + let viewDirectionVS = normalize(-positionVS); + let dotNV = saturate(dot(actualNormalVS, viewDirectionVS)); + let alpha = roughness * roughness; + + var f0 = vec3(pow((ior - 1.0) / (ior + 1.0), 2.0)); + f0 = mix(f0, baseColor, metallic); + + var outgoingRadiance = vec3(0.0); + + for (var i: u32 = 0; i < _Global.pointLightCount; i++) { + let light = _PointLights[i]; + + let lightPositionVS = (_Global.matrixWStoVS * vec4(light.positionWS, 1.0)).xyz; + let lightDirectionVS = normalize(lightPositionVS - positionVS); + let lightDistance = distance(positionVS, lightPositionVS); + let lightAttenuation = 1.0 / (lightDistance * lightDistance); + let incomingRadiance = light.color * lightAttenuation; + + outgoingRadiance += lightOutgoingRadiance( + viewDirectionVS, actualNormalVS, dotNV, + baseColor, alpha, metallic, f0, + incomingRadiance, lightDirectionVS, + ); + } + + for (var i: u32 = 0; i < _Global.directionalLightCount; i++) { + let light = _DirectionalLights[i]; + + let lightDirectionVS = normalize((_Global.matrixWStoVS * vec4(light.directionWS, 0.0)).xyz); + let incomingRadiance = light.color; + + outgoingRadiance += lightOutgoingRadiance( + viewDirectionVS, actualNormalVS, dotNV, + baseColor, alpha, metallic, f0, + incomingRadiance, lightDirectionVS, + ); + } + + outgoingRadiance += _Global.ambientLight * baseColor * occlusion; + + let toneMappedLinearColor = toneMapAcesNarkowicz(outgoingRadiance); + let toneMappedSrgbColor = pow(toneMappedLinearColor, vec3(1.0 / 2.2)); + + return vec4(toneMappedSrgbColor, 1.0); +}`; +} + +// src/_Mapping.ts +var _Mapping = class { + table; + map; + constructor() { + this.table = []; + this.map = /* @__PURE__ */ new Map(); + } + add(item) { + if (this.map.has(item)) { + return; + } + const id = this.table.length; + this.table.push(item); + this.map.set(item, id); + } + get(item) { + return this.map.get(item); + } +}; + +// src/resources/IndexBuffer.ts +var IndexBuffer = class { + _renderer; + _name; + _buffer; + _indexFormat; + constructor(renderer2, { + name = "", + indexFormat, + indexCount + }) { + this._renderer = renderer2; + this._name = name; + this._buffer = renderer2._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX, + size: indexCount * indexSize(indexFormat), + label: name + }); + this._indexFormat = indexFormat; + } + /** + * Destroys owned GPU resources. The index buffer should not be used after + * calling this method. + * @returns `this` for chaining + */ + dispose() { + this._buffer.destroy(); + return this; + } + get indexCount() { + return this._buffer.size / indexSize(this._indexFormat) | 0; + } + writeArray(offset, indices) { + const array = this._indexFormat === "uint16" ? new Uint16Array(indices) : new Uint32Array(indices); + return this.writeTypedArray(offset, array); + } + writeTypedArray(offset, indices) { + if (this._indexFormat === "uint16" && !(indices instanceof Uint16Array) || this._indexFormat === "uint32" && !(indices instanceof Uint32Array)) { + throw new Error(`Cannot write typed array to a mismatched index type. Typed array is of type ${indices.constructor.name}. Index buffer [${this._name}] uses format ${this._indexFormat}`); + } + this._renderer._device.queue.writeBuffer(this._buffer, offset * indexSize(this._indexFormat) | 0, indices); + return this; + } + /** + * Resize the index buffer, discarding currently stored data. + * @param props Desired buffer properties. Any unspecified property will + * stay unchanged. + * @returns `this` for chaining + */ + resizeDiscard({ + indexFormat = this._indexFormat, + indexCount = this.indexCount + }) { + this._buffer.destroy(); + this._buffer = this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX, + size: indexCount * indexSize(indexFormat), + label: this._name + }); + this._indexFormat = indexFormat; + return this; + } + /** + * Resize the index buffer if it can't hold provided number of indices or + * its index format is smaller than provided, potentially discarding + * currently stored data. + * @param props Desired buffer properties. Any unspecified property will + * be ignored. + * @returns `this` for chaining + */ + ensureSizeDiscard({ + indexFormat = this._indexFormat, + indexCount = this.indexCount + }) { + if (this.indexCount >= indexCount && indexSize(this._indexFormat) >= indexSize(indexFormat)) { + return this; + } + return this.resizeDiscard({ + indexFormat, + indexCount + }); + } + get indexFormat() { + return this._indexFormat; + } + get indexSize() { + return indexSize(this._indexFormat); + } +}; +Object.defineProperty(IndexBuffer.prototype, "type", { value: "IndexBuffer" }); +function indexSize(indexFormat) { + switch (indexFormat) { + case "uint16": + return 2; + case "uint32": + return 4; + } +} + +// src/resources/Material.ts +var Material = class { + _renderer; + _uniformBuffer; + _bindGroup; + _name; + _baseColor; + _partialCoverage; + _occlusionTextureStrength; + _metallic; + _roughness; + _normalScale; + _emissive; + _transmission; + _collimation; + _ior; + _baseColorPartialCoverageTexture; + _occlusionTexture; + _roughnessMetallicTexture; + _normalTexture; + _emissiveTexture; + _transmissionCollimationTexture; + _transparent; + _doubleSided; + constructor(renderer2, { + name = "", + baseColor, + partialCoverage = 1, + occlusionTextureStrength = 1, + metallic = 1, + roughness = 1, + normalScale = 1, + emissive, + transmission, + collimation = 1, + ior = 1.45, + baseColorPartialCoverageTexture = null, + occlusionTexture = null, + roughnessMetallicTexture = null, + normalTexture = null, + emissiveTexture = null, + transmissionCollimationTexture = null, + transparent = false, + doubleSided = false + }) { + this._renderer = renderer2; + this._name = name; + this._baseColor = baseColor !== void 0 ? Color.fromObject(baseColor) : Color.white(); + this._partialCoverage = partialCoverage; + this._occlusionTextureStrength = occlusionTextureStrength; + this._metallic = metallic; + this._roughness = roughness; + this._normalScale = normalScale; + this._emissive = emissive !== void 0 ? Color.fromObject(emissive) : Color.black(); + this._transmission = transmission !== void 0 ? Color.fromObject(transmission) : Color.black(); + this._collimation = collimation; + this._ior = ior; + this._baseColorPartialCoverageTexture = baseColorPartialCoverageTexture; + this._occlusionTexture = occlusionTexture; + this._roughnessMetallicTexture = roughnessMetallicTexture; + this._normalTexture = normalTexture; + this._emissiveTexture = emissiveTexture; + this._transmissionCollimationTexture = transmissionCollimationTexture; + this._transparent = transparent; + this._doubleSided = doubleSided; + this._uniformBuffer = renderer2._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM, + size: 64, + label: name + }); + const writer = new _BinaryWriter(64); + writer.writeColorF32(this._baseColor); + writer.writeF32(this._partialCoverage); + writer.writeColorF32(this._transmission); + writer.writeF32(this._collimation); + writer.writeF32(this._occlusionTextureStrength); + writer.writeF32(this._roughness); + writer.writeF32(this._metallic); + writer.writeF32(this._normalScale); + writer.writeColorF32(this._emissive); + writer.writeF32(this._ior); + renderer2._device.queue.writeBuffer(this._uniformBuffer, 0, writer.subarray); + this._bindGroup = renderer2._device.createBindGroup({ + layout: renderer2._materialBindGroupLayout, + entries: [ + { binding: 0, resource: { buffer: this._uniformBuffer, size: 64 } }, + { binding: 1, resource: renderer2._sampler }, + { binding: 2, resource: this._baseColorPartialCoverageTexture?._textureView ?? renderer2._textureWhite._textureView }, + { binding: 3, resource: this._occlusionTexture?._textureView ?? renderer2._textureWhite._textureView }, + { binding: 4, resource: this._roughnessMetallicTexture?._textureView ?? renderer2._textureWhite._textureView }, + { binding: 5, resource: this._normalTexture?._textureView ?? renderer2._textureNormal._textureView }, + { binding: 6, resource: this._emissiveTexture?._textureView ?? renderer2._textureWhite._textureView }, + { binding: 7, resource: this._transmissionCollimationTexture?._textureView ?? renderer2._textureBlack._textureView } + ], + label: name + }); + } + /** + * Destroys owned GPU resources. The index buffer should not be used after + * calling this method. + * @returns `this` for chaining + */ + dispose() { + this._uniformBuffer.destroy(); + return this; + } + getBaseColor(res) { + return res.setObject(this._baseColor); + } + get partialCoverage() { + return this._partialCoverage; + } + get occlusionTextureStrength() { + return this._occlusionTextureStrength; + } + get metallic() { + return this._metallic; + } + get roughness() { + return this._roughness; + } + get normalScale() { + return this._normalScale; + } + getEmissive(res) { + return res.setObject(this._emissive); + } + getTransmission(res) { + return res.setObject(this._transmission); + } + get collimation() { + return this._collimation; + } + get ior() { + return this._ior; + } + get baseColorPartialCoverageTexture() { + return this._baseColorPartialCoverageTexture; + } + get occlusionTexture() { + return this._occlusionTexture; + } + get roughnessMetallicTexture() { + return this._roughnessMetallicTexture; + } + get normalTexture() { + return this._normalTexture; + } + get emissiveTexture() { + return this._emissiveTexture; + } + get transmissionCollimationTexture() { + return this._transmissionCollimationTexture; + } + get transparent() { + return this._transparent; + } + get doubleSided() { + return this._doubleSided; + } +}; +Object.defineProperty(Material.prototype, "type", { value: "Material" }); +function isMaterial(value) { + return Boolean(value) && value.type === "Material"; +} + +// src/resources/Texture2D.ts +var Texture2D = class { + _renderer; + _name; + _texture; + _textureView; + _format; + constructor(renderer2, { + name = "", + width, + height, + format, + usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST + }) { + this._renderer = renderer2; + this._name = name; + const gpuFormat = gpuTextureFormat(format); + this._renderer = renderer2; + this._texture = renderer2._device.createTexture({ + usage, + size: { width, height }, + format: gpuFormat, + label: name + }); + this._textureView = this._texture.createView({ + format: gpuFormat, + dimension: "2d", + label: `${name}.textureView` + }); + this._format = format; + } + /** + * Destroys owned GPU resources. The texture should not be used after + * calling this method. + * @returns `this` for chaining + */ + dispose() { + this._texture.destroy(); + return this; + } + get width() { + return this._texture.width; + } + get height() { + return this._texture.height; + } + get bytesPerSample() { + return sampleSize(this._format); + } + get samplesPerPixel() { + return sampleCount(this._format); + } + writeFull(data) { + const bytesPerSample = this.bytesPerSample; + const samplesPerPixel = this.samplesPerPixel; + const bytesPerRow = this.width * samplesPerPixel * bytesPerSample; + const byteLength = this.height * bytesPerRow; + if (data.byteLength !== byteLength) { + throw new Error(`Cannot fully write to a texture with different byte length. Source data has byte length of ${data.byteLength}. Texture [${this._name}] is ${this.width}\xD7${this.height} pixels in size, uses ${this._format} format at ${bytesPerSample} ${bytesPerSample === 1 ? "byte" : "bytes"} per sample and ${samplesPerPixel} ${samplesPerPixel === 1 ? "sample" : "samples"} per pixel, which makes its byte length equal to ${byteLength}.`); + } + this._renderer._device.queue.writeTexture( + { texture: this._texture }, + data, + { bytesPerRow }, + { width: this.width, height: this.height } + ); + return this; + } + writePartial({ + origin, + data, + bytesPerRow, + width, + height + }) { + this._renderer._device.queue.writeTexture( + { texture: this._texture, origin }, + data, + { bytesPerRow }, + { width, height } + ); + return this; + } + /** + * Resize the texture and/or change its format, discarding currently stored + * data. + * @param props Desired texture properties. Any unspecified property will + * stay unchanged. + * @returns `this` for chaining + */ + resizeDiscard({ + width = this._texture.width, + height = this._texture.height, + format = this._format, + usage = this._texture.usage + }) { + this._texture.destroy(); + const gpuFormat = gpuTextureFormat(format); + this._texture = this._renderer._device.createTexture({ + usage, + size: { width, height }, + format: gpuFormat, + label: this._name + }); + this._textureView = this._texture.createView({ + format: gpuFormat, + dimension: "2d", + label: `${this._name}.textureView` + }); + return this; + } +}; +Object.defineProperty(Texture2D.prototype, "type", { value: "Texture2D" }); +function gpuTextureFormat(format) { + switch (format) { + case "linear": + return "rgba8unorm"; + case "srgb": + return "rgba8unorm-srgb"; + case "hdr": + return "rgba16float"; + case "depth": + return "depth32float"; + } +} +function sampleCount(format) { + switch (format) { + case "linear": + return 4; + case "srgb": + return 4; + case "hdr": + return 4; + case "depth": + return 1; + } +} +function sampleSize(format) { + switch (format) { + case "linear": + return 1; + case "srgb": + return 1; + case "hdr": + return 2; + case "depth": + return 4; + } +} + +// src/resources/VertexBuffer.ts +var POSITION_SIZE = 12; +var TEX_COORD_SIZE = 8; +var LIGHT_TEX_COORD_SIZE = 8; +var NORMAL_SIZE = 12; +var TANGENT_SIZE = 16; +var VertexBuffer = class { + _renderer; + _name; + _positionBuffer; + _texCoordBuffer; + _lightTexCoordBuffer; + _normalBuffer; + _tangentBuffer; + constructor(renderer2, { + name = "", + vertexCount, + texCoord = false, + lightTexCoord = false, + normal = false, + tangent = false + }) { + this._renderer = renderer2; + this._name = name; + this._positionBuffer = renderer2._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * POSITION_SIZE, + label: `${this._name}.position` + }); + this._texCoordBuffer = texCoord ? renderer2._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * TEX_COORD_SIZE, + label: `${this._name}.texCoord` + }) : null; + this._lightTexCoordBuffer = lightTexCoord ? renderer2._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * LIGHT_TEX_COORD_SIZE, + label: `${this._name}.lightTexCoord` + }) : null; + this._normalBuffer = normal ? renderer2._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * NORMAL_SIZE, + label: `${this._name}.normal` + }) : null; + this._tangentBuffer = tangent ? renderer2._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * TANGENT_SIZE, + label: `${this._name}.tangent` + }) : null; + } + /** + * Destroys owned GPU resources. The vertex buffer should not be used after + * calling this method. + * @returns `this` for chaining + */ + dispose() { + this._positionBuffer.destroy(); + this._texCoordBuffer?.destroy(); + this._lightTexCoordBuffer?.destroy(); + this._normalBuffer?.destroy(); + this._tangentBuffer?.destroy(); + return this; + } + get vertexCount() { + return this._positionBuffer.size / POSITION_SIZE | 0; + } + get hasTexCoord() { + return this._texCoordBuffer !== null; + } + get hasLightTexCoord() { + return this._lightTexCoordBuffer !== null; + } + get hasNormal() { + return this._normalBuffer !== null; + } + get hasTangent() { + return this._tangentBuffer !== null; + } + writeArray(offset, { + position, + texCoord, + lightTexCoord, + normal, + tangent + }) { + if (position !== void 0) { + const array = new Float32Array(position.length * 3); + for (let vi = 0, ptr = 0; vi < position.length; ++vi) { + const vertex = position[vi]; + array[ptr++] = vertex.x; + array[ptr++] = vertex.y; + array[ptr++] = vertex.z; + } + this._renderer._device.queue.writeBuffer(this._positionBuffer, offset * POSITION_SIZE | 0, array); + } + if (texCoord !== void 0) { + if (this._texCoordBuffer === null) { + throw new Error(`Cannot write array to a missing vertex attribute. Tried writing texture coordinates and vertex buffer [${this._name}] does not have texture coordinates.`); + } + const array = new Float32Array(texCoord.length * 2); + for (let vi = 0, ptr = 0; vi < texCoord.length; ++vi) { + const vertex = texCoord[vi]; + array[ptr++] = vertex.x; + array[ptr++] = vertex.y; + } + this._renderer._device.queue.writeBuffer(this._texCoordBuffer, offset * TEX_COORD_SIZE | 0, array); + } + if (lightTexCoord !== void 0) { + if (this._lightTexCoordBuffer === null) { + throw new Error(`Cannot write array to a missing vertex attribute. Tried writing light texture coordinates and vertex buffer [${this._name}] does not have light texture coordinates.`); + } + const array = new Float32Array(lightTexCoord.length * 2); + for (let vi = 0, ptr = 0; vi < lightTexCoord.length; ++vi) { + const vertex = lightTexCoord[vi]; + array[ptr++] = vertex.x; + array[ptr++] = vertex.y; + } + this._renderer._device.queue.writeBuffer(this._lightTexCoordBuffer, offset * LIGHT_TEX_COORD_SIZE | 0, array); + } + if (normal !== void 0) { + if (this._normalBuffer === null) { + throw new Error(`Cannot write array to a missing vertex attribute. Tried writing normals and vertex buffer [${this._name}] does not have normals.`); + } + const array = new Float32Array(normal.length * 3); + for (let vi = 0, ptr = 0; vi < normal.length; ++vi) { + const vertex = normal[vi]; + array[ptr++] = vertex.x; + array[ptr++] = vertex.y; + array[ptr++] = vertex.z; + } + this._renderer._device.queue.writeBuffer(this._normalBuffer, offset * NORMAL_SIZE | 0, array); + } + if (tangent !== void 0) { + if (this._tangentBuffer === null) { + throw new Error(`Cannot write array to a missing vertex attribute. Tried writing tangents and vertex buffer [${this._name}] does not have tangents.`); + } + const array = new Float32Array(tangent.length * 4); + for (let vi = 0, ptr = 0; vi < tangent.length; ++vi) { + const vertex = tangent[vi]; + array[ptr++] = vertex.x; + array[ptr++] = vertex.y; + array[ptr++] = vertex.z; + array[ptr++] = vertex.w; + } + this._renderer._device.queue.writeBuffer(this._tangentBuffer, offset * TANGENT_SIZE | 0, array); + } + return this; + } + writeTypedArray(offset, { + position, + texCoord, + lightTexCoord, + normal, + tangent + }) { + if (position !== void 0) { + this._renderer._device.queue.writeBuffer(this._positionBuffer, offset * POSITION_SIZE | 0, position); + } + if (texCoord !== void 0) { + if (this._texCoordBuffer === null) { + throw new Error(`Cannot write typed array to a missing vertex attribute. Tried writing texture coordinates and vertex buffer [${this._name}] does not have texture coordinates.`); + } + this._renderer._device.queue.writeBuffer(this._texCoordBuffer, offset * TEX_COORD_SIZE | 0, texCoord); + } + if (lightTexCoord !== void 0) { + if (this._lightTexCoordBuffer === null) { + throw new Error(`Cannot write typed array to a missing vertex attribute. Tried writing light texture coordinates and vertex buffer [${this._name}] does not have light texture coordinates.`); + } + this._renderer._device.queue.writeBuffer(this._lightTexCoordBuffer, offset * LIGHT_TEX_COORD_SIZE | 0, lightTexCoord); + } + if (normal !== void 0) { + if (this._normalBuffer === null) { + throw new Error(`Cannot write typed array to a missing vertex attribute. Tried writing normals and vertex buffer [${this._name}] does not have normals.`); + } + this._renderer._device.queue.writeBuffer(this._normalBuffer, offset * NORMAL_SIZE | 0, normal); + } + if (tangent !== void 0) { + if (this._tangentBuffer === null) { + throw new Error(`Cannot write typed array to a missing vertex attribute. Tried writing tangents and vertex buffer [${this._name}] does not have tangents.`); + } + this._renderer._device.queue.writeBuffer(this._tangentBuffer, offset * TANGENT_SIZE | 0, tangent); + } + return this; + } + /** + * Resize the vertex buffer and/or add or remove vertex attributes, + * discarding currently stored data. + * @param props Desired buffer properties. Any unspecified property will + * stay unchanged. + * @returns `this` for chaining + */ + resizeDiscard({ + vertexCount = this.vertexCount, + texCoord = this.hasTexCoord, + lightTexCoord = this.hasLightTexCoord, + normal = this.hasNormal, + tangent = this.hasTangent + }) { + this._positionBuffer.destroy(); + this._texCoordBuffer?.destroy(); + this._lightTexCoordBuffer?.destroy(); + this._normalBuffer?.destroy(); + this._tangentBuffer?.destroy(); + this._positionBuffer = this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * POSITION_SIZE, + label: `${this._name}.position` + }); + this._texCoordBuffer = texCoord ? this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * TEX_COORD_SIZE, + label: `${this._name}.texCoord` + }) : null; + this._lightTexCoordBuffer = lightTexCoord ? this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * LIGHT_TEX_COORD_SIZE, + label: `${this._name}.lightTexCoord` + }) : null; + this._normalBuffer = normal ? this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * NORMAL_SIZE, + label: `${this._name}.normal` + }) : null; + this._tangentBuffer = tangent ? this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * TANGENT_SIZE, + label: `${this._name}.tangent` + }) : null; + return this; + } + /** + * Resize the vertex buffer and/or add vertex attributes if it can't hold + * provided number of vertices or doesn't have provided attributes, + * potentially discarding currently stored data. + * @param props Desired buffer properties. Any unspecified property will be + * ignored. + * @returns `this` for chaining + */ + ensureSizeDiscard({ + vertexCount = this.vertexCount, + texCoord = this.hasTexCoord, + lightTexCoord = this.hasLightTexCoord, + normal = this.hasNormal, + tangent = this.hasTangent + }) { + const currentVertexCount = this.vertexCount; + if (currentVertexCount < vertexCount) { + this._positionBuffer.destroy(); + this._positionBuffer = this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * POSITION_SIZE, + label: `${this._name}.position` + }); + } + if (currentVertexCount < vertexCount || texCoord && !this.hasTexCoord) { + this._texCoordBuffer?.destroy(); + this._texCoordBuffer = this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * TEX_COORD_SIZE, + label: `${this._name}.texCoord` + }); + } + if (currentVertexCount < vertexCount || lightTexCoord && !this.hasLightTexCoord) { + this._lightTexCoordBuffer?.destroy(); + this._lightTexCoordBuffer = this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * LIGHT_TEX_COORD_SIZE, + label: `${this._name}.lightTexCoord` + }); + } + if (currentVertexCount < vertexCount || normal && !this.hasNormal) { + this._normalBuffer?.destroy(); + this._normalBuffer = this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * NORMAL_SIZE, + label: `${this._name}.normal` + }); + } + if (currentVertexCount < vertexCount || tangent && !this.hasTangent) { + this._tangentBuffer?.destroy(); + this._tangentBuffer = this._renderer._device.createBuffer({ + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX, + size: vertexCount * TANGENT_SIZE, + label: `${this._name}.tangent` + }); + } + return this; + } +}; +Object.defineProperty(VertexBuffer.prototype, "type", { value: "VertexBuffer" }); + +// src/oktaeder.ts +var _matrixOStoWSNormal = new Matrix4x4( + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN +); +var _matrixWStoVS = new Matrix4x4( + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN +); +var _matrixVStoCS = new Matrix4x4( + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN +); +var _directionWS = new Vector3(NaN, NaN, NaN); +var _positionWS = new Vector3(NaN, NaN, NaN); +var Renderer2 = class _Renderer { + _adapter; + _device; + _context; + _format; + /** 1×1 rgba8unorm texture of [255, 255, 255, 255] */ + _textureWhite; + /** 1×1 rgba8unorm texture of [0, 0, 0, 255] */ + _textureBlack; + /** 1×1 rgba8unorm texture of [128, 128, 255, 255] */ + _textureNormal; + _depthBuffer; + _globalBindGroupLayout; + _materialBindGroupLayout; + _objectBindGroupLayout; + _pipelineLayout; + _pipelineCache; + _uniformWriter; + _uniformBuffer; + _lightWriter; + _pointLightBuffer; + _directionalLightBuffer; + _sampler; + _globalBindGroup; + _objectBindGroup; + /** + * This constructor is intended primarily for internal use. Consider using + * `Renderer.createIndexBuffer` instead. + */ + constructor(adapter, device, context, format) { + this._adapter = adapter; + this._device = device; + this._context = context; + this._format = format; + this._textureWhite = new Texture2D(this, { + name: "White", + width: 1, + height: 1, + format: "linear" + }); + this._textureWhite.writeFull(new Uint8Array([255, 255, 255, 255])); + this._textureBlack = new Texture2D(this, { + name: "Black", + width: 1, + height: 1, + format: "linear" + }); + this._textureBlack.writeFull(new Uint8Array([0, 0, 0, 255])); + this._textureNormal = new Texture2D(this, { + name: "Normal", + width: 1, + height: 1, + format: "linear" + }); + this._textureNormal.writeFull(new Uint8Array([128, 128, 255, 255])); + const framebufferTexture = this._context.getCurrentTexture(); + this._depthBuffer = new Texture2D(this, { + name: "Depth Buffer", + width: framebufferTexture.width, + height: framebufferTexture.height, + format: "depth", + usage: GPUTextureUsage.RENDER_ATTACHMENT + }); + this._globalBindGroupLayout = device.createBindGroupLayout({ + entries: [ + { + binding: 0, + visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, + buffer: { + hasDynamicOffset: true, + type: "uniform" + } + }, + { + binding: 1, + visibility: GPUShaderStage.FRAGMENT, + buffer: { + type: "read-only-storage" + } + }, + { + binding: 2, + visibility: GPUShaderStage.FRAGMENT, + buffer: { + type: "read-only-storage" + } + } + ], + label: "Global" + }); + this._materialBindGroupLayout = device.createBindGroupLayout({ + entries: [ + { + binding: 0, + visibility: GPUShaderStage.FRAGMENT, + buffer: { + hasDynamicOffset: true, + type: "uniform" + } + }, + { + binding: 1, + visibility: GPUShaderStage.FRAGMENT, + sampler: { type: "filtering" } + }, + { + binding: 2, + visibility: GPUShaderStage.FRAGMENT, + texture: { + sampleType: "float", + viewDimension: "2d" + } + }, + { + binding: 3, + visibility: GPUShaderStage.FRAGMENT, + texture: { + sampleType: "float", + viewDimension: "2d" + } + }, + { + binding: 4, + visibility: GPUShaderStage.FRAGMENT, + texture: { + sampleType: "float", + viewDimension: "2d" + } + }, + { + binding: 5, + visibility: GPUShaderStage.FRAGMENT, + texture: { + sampleType: "float", + viewDimension: "2d" + } + }, + { + binding: 6, + visibility: GPUShaderStage.FRAGMENT, + texture: { + sampleType: "float", + viewDimension: "2d" + } + }, + { + binding: 7, + visibility: GPUShaderStage.FRAGMENT, + texture: { + sampleType: "float", + viewDimension: "2d" + } + } + ], + label: "Material" + }); + this._objectBindGroupLayout = device.createBindGroupLayout({ + entries: [ + { + binding: 0, + visibility: GPUShaderStage.VERTEX, + buffer: { + hasDynamicOffset: true, + type: "uniform" + } + } + ], + label: "Object" + }); + this._pipelineLayout = device.createPipelineLayout({ + bindGroupLayouts: [ + this._globalBindGroupLayout, + this._materialBindGroupLayout, + this._objectBindGroupLayout + ] + }); + this._pipelineCache = /* @__PURE__ */ new Map(); + this._uniformWriter = new _BinaryWriter(); + this._uniformBuffer = device.createBuffer({ + size: 4 * 1024 * 1024, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM, + label: "Uniform" + }); + this._lightWriter = new _BinaryWriter(); + this._pointLightBuffer = device.createBuffer({ + size: 1024 * 32, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + }); + this._directionalLightBuffer = device.createBuffer({ + size: 1024 * 32, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE + }); + this._sampler = device.createSampler({ + addressModeU: "repeat", + addressModeV: "repeat", + addressModeW: "repeat", + magFilter: "linear", + minFilter: "linear", + mipmapFilter: "linear", + maxAnisotropy: 16 + }); + this._globalBindGroup = device.createBindGroup({ + layout: this._globalBindGroupLayout, + entries: [ + { binding: 0, resource: { buffer: this._uniformBuffer, size: GLOBAL_UNIFORMS_SIZE } }, + { binding: 1, resource: { buffer: this._pointLightBuffer } }, + { binding: 2, resource: { buffer: this._directionalLightBuffer } } + ], + label: "Global" + }); + this._objectBindGroup = device.createBindGroup({ + layout: this._objectBindGroupLayout, + entries: [ + { binding: 0, resource: { buffer: this._uniformBuffer, size: OBJECT_UNIFORMS_SIZE } } + ], + label: "Object" + }); + } + static async init(canvas2) { + if (!navigator.gpu) { + throw new Error("WebGPU is not supported"); + } + const adapter = await navigator.gpu.requestAdapter({ + powerPreference: "high-performance" + }); + if (adapter === null) { + throw new Error("GPUAdapter is not available"); + } + const device = await adapter.requestDevice(); + const context = canvas2.getContext("webgpu"); + if (context === null) { + throw new Error("GPUCanvasContext is not available"); + } + const format = navigator.gpu.getPreferredCanvasFormat(); + context.configure({ device, format }); + return new _Renderer(adapter, device, context, format); + } + /** + * Disposes resources internal to the renderer. Doesn't dispose any objects + * created with this renderer. The renderer should not be used after calling + * this method. + * @returns `this` for chaining + */ + dispose() { + this._textureWhite.dispose(); + this._textureBlack.dispose(); + this._textureNormal.dispose(); + this._depthBuffer.dispose(); + this._uniformBuffer.destroy(); + this._directionalLightBuffer.destroy(); + this._pointLightBuffer.destroy(); + return this; + } + createIndexBuffer(props) { + return new IndexBuffer(this, props); + } + createMaterial(props) { + return new Material(this, props); + } + createTexture(props) { + return new Texture2D(this, props); + } + createVertexBuffer(props) { + return new VertexBuffer(this, props); + } + _getOrCreatePipeline(flags) { + const key = _shaderFlagsKey(flags); + let pipeline = this._pipelineCache.get(key); + if (pipeline !== void 0) { + return pipeline; + } + pipeline = _createPipeline(this, flags); + this._pipelineCache.set(key, pipeline); + return pipeline; + } + render(scene2, camera2) { + const cameraNode = camera2._node; + if (cameraNode === null) { + throw new Error(`Cannot render with a detached camera. Camera [${camera2._name}] is not attached to a node.`); + } + const { width, height } = this._context.getCurrentTexture(); + if (this._depthBuffer.width !== width || this._depthBuffer.height !== height) { + this._depthBuffer.resizeDiscard({ + width, + height + }); + } + const encoder = this._device.createCommandEncoder(); + const pass = encoder.beginRenderPass({ + colorAttachments: [{ + view: this._context.getCurrentTexture().createView(), + loadOp: "clear", + storeOp: "store" + }], + depthStencilAttachment: { + view: this._depthBuffer._textureView, + depthClearValue: 0, + depthLoadOp: "clear", + depthStoreOp: "store" + } + }); + this._uniformWriter.clear(); + const dynamicMaterialMapping = new _Mapping(); + for (const node2 of preOrder(scene2._nodes)) { + for (const material2 of node2._materials) { + if (isDynamicMaterial(material2)) { + dynamicMaterialMapping.add(material2); + } + } + } + const dynamicMaterialBindGroups = dynamicMaterialMapping.table.map((material2) => { + const offset = this._uniformWriter._length; + this._uniformWriter.writeColorF32(material2._baseColor); + this._uniformWriter.writeF32(material2._partialCoverage); + this._uniformWriter.writeColorF32(material2._transmission); + this._uniformWriter.writeF32(material2._collimation); + this._uniformWriter.writeF32(material2._occlusionTextureStrength); + this._uniformWriter.writeF32(material2._roughness); + this._uniformWriter.writeF32(material2._metallic); + this._uniformWriter.writeF32(material2._normalScale); + this._uniformWriter.writeColorF32(material2._emissive); + this._uniformWriter.writeF32(material2._ior); + this._uniformWriter.padToAlign(256); + const bindGroup = this._device.createBindGroup({ + layout: this._materialBindGroupLayout, + entries: [ + { binding: 0, resource: { buffer: this._uniformBuffer, size: MATERIAL_UNIFORMS_SIZE } }, + { binding: 1, resource: this._sampler }, + { binding: 2, resource: material2._baseColorPartialCoverageTexture?._textureView ?? this._textureWhite._textureView }, + { binding: 3, resource: material2._occlusionTexture?._textureView ?? this._textureWhite._textureView }, + { binding: 4, resource: material2._roughnessMetallicTexture?._textureView ?? this._textureWhite._textureView }, + { binding: 5, resource: material2._normalTexture?._textureView ?? this._textureNormal._textureView }, + { binding: 6, resource: material2._emissiveTexture?._textureView ?? this._textureWhite._textureView }, + { binding: 7, resource: material2._transmissionCollimationTexture?._textureView ?? this._textureBlack._textureView } + ], + label: material2._name + }); + return { offset, bindGroup }; + }); + const objectMapping = new _Mapping(); + for (const node2 of preOrder(scene2._nodes)) { + if (node2._mesh !== null) { + objectMapping.add(node2); + } + } + const objectOffsets = objectMapping.table.map((object) => { + const offset = this._uniformWriter._length; + object._updateWorldMatrix(); + this._uniformWriter.writeMatrix4x4(object._worldMatrix); + this._uniformWriter.writeMatrix4x4(_matrixOStoWSNormal.setObject(object._worldMatrix).inverseTransposeAffine()); + this._uniformWriter.padToAlign(256); + return offset; + }); + this._lightWriter.clear(); + let pointLightCount = 0; + for (const node2 of preOrder(scene2._nodes)) { + const light = node2._light; + if (!isPointLight(light)) + continue; + node2._updateWorldMatrix(); + _positionWS.set(node2._worldMatrix.tx, node2._worldMatrix.ty, node2._worldMatrix.tz); + this._lightWriter.writeVector3(_positionWS); + this._lightWriter.writeU32(0); + this._lightWriter.writeColorF32(light._color); + this._lightWriter.writeU32(0); + pointLightCount += 1; + } + this._device.queue.writeBuffer(this._pointLightBuffer, 0, this._lightWriter.subarray); + this._lightWriter.clear(); + let directionalLightCount = 0; + for (const node2 of preOrder(scene2._nodes)) { + const light = node2._light; + if (!isDirectionalLight(light)) + continue; + node2._updateWorldMatrix(); + _directionWS.set(-node2._worldMatrix.kx, -node2._worldMatrix.ky, -node2._worldMatrix.kz); + _directionWS.normalize(); + this._lightWriter.writeVector3(_directionWS); + this._lightWriter.writeU32(0); + this._lightWriter.writeColorF32(light._color); + this._lightWriter.writeU32(0); + directionalLightCount += 1; + } + this._device.queue.writeBuffer(this._directionalLightBuffer, 0, this._lightWriter.subarray); + const globalUniformsOffset = this._uniformWriter._length; + cameraNode._updateWorldMatrix(); + _matrixWStoVS.setObject(cameraNode._worldMatrix).inverseAffine(); + camera2.computeProjectionMatrix(width / height, _matrixVStoCS); + this._uniformWriter.writeMatrix4x4(_matrixWStoVS); + this._uniformWriter.writeMatrix4x4(_matrixVStoCS); + this._uniformWriter.writeColorF32(scene2._ambientLight); + this._uniformWriter.writeU32(pointLightCount); + this._uniformWriter.writeU32(directionalLightCount); + this._uniformWriter.padToAlign(256); + this._device.queue.writeBuffer(this._uniformBuffer, 0, this._uniformWriter.subarray); + pass.setBindGroup(0, this._globalBindGroup, [globalUniformsOffset]); + for (let oi = 0; oi < objectMapping.table.length; ++oi) { + const object = objectMapping.table[oi]; + const objectOffset = objectOffsets[oi]; + const mesh2 = object.mesh; + const { _vertexBuffer: vertexBuffer2, _indexBuffer: indexBuffer2 } = mesh2; + const flags = { + texCoord: vertexBuffer2._texCoordBuffer !== null, + lightTexCoord: vertexBuffer2._lightTexCoordBuffer !== null, + normal: vertexBuffer2._normalBuffer !== null, + tangent: vertexBuffer2._tangentBuffer !== null + }; + const renderPipeline = this._getOrCreatePipeline(flags); + pass.setPipeline(renderPipeline); + pass.setVertexBuffer(0, vertexBuffer2._positionBuffer); + if (vertexBuffer2._texCoordBuffer !== null) + pass.setVertexBuffer(1, vertexBuffer2._texCoordBuffer); + if (vertexBuffer2._lightTexCoordBuffer !== null) + pass.setVertexBuffer(2, vertexBuffer2._lightTexCoordBuffer); + if (vertexBuffer2._normalBuffer !== null) + pass.setVertexBuffer(3, vertexBuffer2._normalBuffer); + if (vertexBuffer2._tangentBuffer !== null) + pass.setVertexBuffer(4, vertexBuffer2._tangentBuffer); + pass.setIndexBuffer(indexBuffer2._buffer, indexBuffer2._indexFormat); + pass.setBindGroup(2, this._objectBindGroup, [objectOffset]); + for (let si = 0; si < mesh2._submeshes.length; ++si) { + const submesh2 = mesh2._submeshes[si]; + const material2 = object._materials[si]; + if (isMaterial(material2)) { + pass.setBindGroup(1, material2._bindGroup, [0]); + } else if (isDynamicMaterial(material2)) { + const { + bindGroup: materialBindGroup, + offset: materialOffset + } = dynamicMaterialBindGroups[dynamicMaterialMapping.get(material2)]; + pass.setBindGroup(1, materialBindGroup, [materialOffset]); + } + pass.drawIndexed(submesh2.length, 1, submesh2.start, 0, 0); + } + } + pass.end(); + const commandBuffer = encoder.finish(); + this._device.queue.submit([commandBuffer]); + return this; + } +}; + +// example/script.ts +var canvas = document.createElement("canvas"); +window.addEventListener("resize", onResize); +onResize.call(window); +var renderer = await Renderer2.init(canvas); +var camera = new PerspectiveCamera({ + verticalFovRad: degToRad(50), + nearPlane: 1e-3, + farPlane: Infinity +}); +var vertexBuffer = renderer.createVertexBuffer({ vertexCount: 12, texCoord: true }); +vertexBuffer.writeTypedArray(0, { + position: new Float32Array([ + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + -1, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + -1, + 0, + 0, + -1, + 1, + 0, + 0, + 0, + -1, + 0, + -1, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1 + ]), + texCoord: new Float32Array([ + 0.5, + 0.7113, + 0.333333, + 1, + 0.166666, + 0.7113, + 0.333333, + 0.4226, + 0, + 0.4226, + 0, + 1, + 1, + 1, + 0.666666, + 1, + 0.833333, + 0.7113, + 0.666666, + 0.4226, + 1, + 0.4226, + 0.5, + 0.7113 + ]) +}); +var indexBuffer = renderer.createIndexBuffer({ indexCount: 24, indexFormat: "uint16" }); +indexBuffer.writeArray(0, [ + 0, + 2, + 1, + 3, + 4, + 2, + 5, + 1, + 2, + 2, + 0, + 3, + 6, + 8, + 7, + 9, + 8, + 10, + 7, + 8, + 11, + 11, + 8, + 9 +]); +var submesh = { start: 0, length: 24 }; +var mesh = new Mesh({ vertexBuffer, indexBuffer, submeshes: [submesh] }); +var imageBitmap = await loadImageBitmap("uvmap.png"); +var texture = renderer.createTexture({ + format: "srgb", + width: imageBitmap.width, + height: imageBitmap.height, + usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT +}); +renderer._device.queue.copyExternalImageToTexture( + { source: imageBitmap, flipY: false }, + { texture: texture._texture }, + { width: imageBitmap.width, height: imageBitmap.height } +); +var material = renderer.createMaterial({ + baseColor: Color.white(), + baseColorPartialCoverageTexture: texture, + roughness: 0.5, + metallic: 0 +}); +var node = new Node2({ mesh, materials: [material] }); +var scene = new Scene({ + nodes: [ + node, + new Node2({ + translation: new Vector3(0, 1, -1), + light: new PointLight({ color: new Color(1, 1, 1) }) + }), + new Node2({ + translation: new Vector3(0, -1, -1), + light: new PointLight({ color: new Color(1, 1, 1) }) + }), + new Node2({ + translation: new Vector3(0, 0.8, -3), + rotation: Quaternion.fromRotationYZ(degToRad(15)), + camera + }) + ], + ambientLight: new Color(0.01, 0.01, 0.01) +}); +function onResize() { + canvas.width = this.innerWidth; + canvas.height = this.innerHeight; +} +var _quaternion = Quaternion.identity(); +async function loadImageBitmap(url) { + const res = await fetch(url); + const blob = await res.blob(); + const imageBitmap2 = await createImageBitmap(blob, { colorSpaceConversion: "none" }); + return imageBitmap2; +} +function draw(timeMs) { + const time = 1e-3 * timeMs; + node.setRotation(_quaternion.setRotationZX(-0.5 * time)); + renderer.render(scene, camera); + requestAnimationFrame(draw); +} +requestAnimationFrame(draw); +document.body.appendChild(canvas); +/*! + * This Source Code Form is subject to the terms of the Mozilla Public License, + * v. 2.0. If a copy of the MPL was not distributed with this file, You can + * obtain one at http://mozilla.org/MPL/2.0/. + */ +//# sourceMappingURL=bundle.js.map diff --git a/src/oktaeder/example/bundle.js.map b/src/oktaeder/example/bundle.js.map new file mode 100644 index 0000000..4fc6c92 --- /dev/null +++ b/src/oktaeder/example/bundle.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/data/Camera.ts", "../src/data/Color.ts", "../src/data/DynamicMaterial.ts", "../src/data/Light.ts", "../src/data/Matrix4x4.ts", "../src/data/Mesh.ts", "../src/data/Node.ts", "../src/data/Quaternion.ts", "../src/data/Scene.ts", "../src/data/Vector2.ts", "../src/data/Vector3.ts", "../src/data/Vector4.ts", "../src/_BinaryWriter.ts", "../src/geometry.ts", "../src/shader.ts", "../src/_Mapping.ts", "../src/resources/IndexBuffer.ts", "../src/resources/Material.ts", "../src/resources/Texture2D.ts", "../src/resources/VertexBuffer.ts", "../src/oktaeder.ts", "script.ts"], + "sourcesContent": ["/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Matrix4x4, Node } from \".\";\n\nexport type Camera = OrthographicCamera | PerspectiveCamera;\n\nexport interface OrthographicCameraProps {\n\treadonly name?: string;\n\n\treadonly halfVerticalSize: number;\n\treadonly nearPlane: number;\n\treadonly farPlane: number;\n}\n\nexport interface PerspectiveCameraProps {\n\treadonly name?: string;\n\n\treadonly verticalFovRad: number;\n\treadonly nearPlane: number;\n\treadonly farPlane: number;\n}\n\nexport class OrthographicCamera {\n\n\tdeclare readonly type: \"OrthographicCamera\";\n\n\t_name: string;\n\n\t_halfVerticalSize: number;\n\t_nearPlane: number;\n\t_farPlane: number;\n\n\t/** backreference */\n\t_node: Node | null;\n\n\tconstructor({\n\t\tname = \"\",\n\t\thalfVerticalSize,\n\t\tnearPlane,\n\t\tfarPlane,\n\t}: OrthographicCameraProps) {\n\t\tthis._name = name;\n\n\t\tthis._halfVerticalSize = halfVerticalSize;\n\t\tthis._nearPlane = nearPlane;\n\t\tthis._farPlane = farPlane;\n\n\t\tthis._node = null;\n\t}\n\n\tset name(value: string) { this._name = value; }\n\tget name(): string { return this._name; }\n\n\tset halfVerticalSize(value: number) { this._halfVerticalSize = value; }\n\tget halfVerticalSize(): number { return this._halfVerticalSize; }\n\n\tset nearPlane(value: number) { this._nearPlane = value; }\n\tget nearPlane(): number { return this._nearPlane; }\n\n\tset farPlane(value: number) { this._farPlane = value; }\n\tget farPlane(): number { return this._farPlane; }\n\n\tattach(node: Node): OrthographicCamera {\n\t\tif (this._node !== null) {\n\t\t\tthis._node._camera = null;\n\t\t}\n\n\t\tif (node._camera !== null) {\n\t\t\tnode._camera._node = null;\n\t\t}\n\n\t\tnode._camera = this;\n\t\tthis._node = node;\n\t\treturn this;\n\t}\n\n\tdetach(): OrthographicCamera {\n\t\tif (this._node === null) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._node._camera = null;\n\t\tthis._node = null;\n\t\treturn this;\n\t}\n\n\tcomputeProjectionMatrix(aspectRatio: number, res: Matrix4x4): Matrix4x4 {\n\t\tconst halfHorizontalSize = this._halfVerticalSize / aspectRatio;\n\t\treturn res.set(\n\t\t\t1 / halfHorizontalSize, 0, 0, 0,\n\t\t\t0, 1 / this._halfVerticalSize, 0, 0,\n\t\t\t0, 0, 1 / (this._nearPlane - this._farPlane), 0,\n\t\t\t0, 0, this._farPlane / (this._farPlane - this._nearPlane), 1,\n\t\t);\n\t}\n}\n\nexport class PerspectiveCamera {\n\n\tdeclare readonly type: \"PerspectiveCamera\";\n\n\t_name: string;\n\n\t_verticalFovRad: number;\n\t_nearPlane: number;\n\t_farPlane: number;\n\n\t/** backreference */\n\t_node: Node | null;\n\n\tconstructor({\n\t\tname = \"\",\n\t\tverticalFovRad,\n\t\tnearPlane,\n\t\tfarPlane,\n\t}: PerspectiveCameraProps) {\n\t\tthis._name = name;\n\n\t\tthis._verticalFovRad = verticalFovRad;\n\t\tthis._nearPlane = nearPlane;\n\t\tthis._farPlane = farPlane;\n\n\t\tthis._node = null;\n\t}\n\n\tset name(value: string) { this._name = value; }\n\tget name(): string { return this._name; }\n\n\tset nearPlane(value: number) { this._nearPlane = value; }\n\tget nearPlane(): number { return this._nearPlane; }\n\n\tset farPlane(value: number) { this._farPlane = value; }\n\tget farPlane(): number { return this._farPlane; }\n\n\tattach(node: Node): PerspectiveCamera {\n\t\tif (this._node !== null) {\n\t\t\tthis._node._camera = null;\n\t\t}\n\n\t\tif (node._camera !== null) {\n\t\t\tnode._camera._node = null;\n\t\t}\n\n\t\tnode._camera = this;\n\t\tthis._node = node;\n\t\treturn this;\n\t}\n\n\tdetach(): PerspectiveCamera {\n\t\tif (this._node === null) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._node._camera = null;\n\t\tthis._node = null;\n\t\treturn this;\n\t}\n\n\tcomputeProjectionMatrix(aspectRatio: number, res: Matrix4x4): Matrix4x4 {\n\t\tconst halfVerticalCotangent = 1 / Math.tan(0.5 * this._verticalFovRad);\n\t\tif (this._farPlane === Infinity) {\n\t\t\treturn res.set(\n\t\t\t\thalfVerticalCotangent / aspectRatio, 0, 0, 0,\n\t\t\t\t0, halfVerticalCotangent, 0, 0,\n\t\t\t\t0, 0, 0, 1,\n\t\t\t\t0, 0, this._nearPlane, 0,\n\t\t\t);\n\t\t} else {\n\t\t\treturn res.set(\n\t\t\t\thalfVerticalCotangent / aspectRatio, 0, 0, 0,\n\t\t\t\t0, halfVerticalCotangent, 0, 0,\n\t\t\t\t0, 0, this._nearPlane / (this._nearPlane - this._farPlane), 1,\n\t\t\t\t0, 0, this._nearPlane * this._farPlane / (this._farPlane - this._nearPlane), 0,\n\t\t\t);\n\t\t}\n\t}\n}\n\nObject.defineProperty(OrthographicCamera.prototype, \"type\", { value: \"OrthographicCamera\" });\n\nObject.defineProperty(PerspectiveCamera.prototype, \"type\", { value: \"PerspectiveCamera\" });\n\nexport function isOrthographicCamera(value: unknown): value is OrthographicCamera {\n\treturn Boolean(value) && (value as OrthographicCamera).type === \"OrthographicCamera\";\n}\n\nexport function isPerspectiveCamera(value: unknown): value is PerspectiveCamera {\n\treturn Boolean(value) && (value as PerspectiveCamera).type === \"PerspectiveCamera\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Vector3Object } from \".\";\n\n/* Named colors\n * black #000000 (0, 0, 0, 1)\n * silver #C0C0C0 (192 / 255, 192 / 255, 192 / 255, 1)\n * gray #808080 (128 / 255, 128 / 255, 128 / 255, 1)\n * white #FFFFFF (1, 1, 1, 1)\n * maroon #800000 (128 / 255, 0, 0, 1)\n * red #FF0000 (1, 0, 0, 1)\n * purple #800080 (128 / 255, 0, 128 / 255, 1)\n * fuchsia #FF00FF (1, 0, 1, 1)\n * green #008000 (0, 128 / 255, 0, 1)\n * lime #00FF00 (0, 255, 0, 1)\n * olive #808000 (128 / 255, 128 / 255, 0, 1)\n * yellow #FFFF00 (1, 1, 0, 1)\n * navy #000080 (0, 0, 128 / 255, 1)\n * blue #0000FF (0, 0, 1, 1)\n * teal #008080 (0, 128 / 255, 128 / 255, 1)\n * aqua #00FFFF (0, 1, 1, 1)\n * orange #FFA500 (1, 165 / 255, 0, 1)\n */\n\nexport type ColorName =\n\t| \"black\"\n\t| \"silver\"\n\t| \"gray\"\n\t| \"white\"\n\t| \"maroon\"\n\t| \"red\"\n\t| \"purple\"\n\t| \"fuchsia\"\n\t| \"green\"\n\t| \"lime\"\n\t| \"olive\"\n\t| \"yellow\"\n\t| \"navy\"\n\t| \"blue\"\n\t| \"teal\"\n\t| \"aqua\"\n\t| \"orange\"\n\t;\n\nexport interface ColorObject {\n\treadonly r: number;\n\treadonly g: number;\n\treadonly b: number;\n}\n\nexport type ColorTuple = readonly [r: number, g: number, b: number];\n\nexport class Color {\n\n\tdeclare readonly type: \"Color\";\n\n\tr: number;\n\tg: number;\n\tb: number;\n\n\tconstructor(r: number, g: number, b: number) {\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\t}\n\n\tstatic fromObject(object: ColorObject): Color {\n\t\treturn new Color(object.r, object.g, object.b);\n\t}\n\n\tstatic fromTuple(tuple: ColorTuple): Color {\n\t\treturn new Color(...tuple);\n\t}\n\n\tstatic fromName(name: ColorName): Color {\n\t\tswitch (name) {\n\t\t\tcase \"black\": return new Color(0, 0, 0);\n\t\t\tcase \"silver\": return new Color(192 / 255, 192 / 255, 192 / 255);\n\t\t\tcase \"gray\": return new Color(128 / 255, 128 / 255, 128 / 255);\n\t\t\tcase \"white\": return new Color(1, 1, 1);\n\t\t\tcase \"maroon\": return new Color(128 / 255, 0, 0);\n\t\t\tcase \"red\": return new Color(1, 0, 0);\n\t\t\tcase \"purple\": return new Color(128 / 255, 0, 128 / 255);\n\t\t\tcase \"fuchsia\": return new Color(1, 0, 1);\n\t\t\tcase \"green\": return new Color(0, 128 / 255, 0);\n\t\t\tcase \"lime\": return new Color(0, 255, 0);\n\t\t\tcase \"olive\": return new Color(128 / 255, 128 / 255, 0);\n\t\t\tcase \"yellow\": return new Color(1, 1, 0);\n\t\t\tcase \"navy\": return new Color(0, 0, 128 / 255);\n\t\t\tcase \"blue\": return new Color(0, 0, 1);\n\t\t\tcase \"teal\": return new Color(0, 128 / 255, 128 / 255);\n\t\t\tcase \"aqua\": return new Color(0, 1, 1);\n\t\t\tcase \"orange\": return new Color(1, 165 / 255, 0);\n\t\t}\n\t}\n\n\tstatic fromVector3(vector: Vector3Object): Color {\n\t\treturn new Color(vector.x, vector.y, vector.z);\n\t}\n\n\tstatic white(): Color {\n\t\treturn new Color(1, 1, 1);\n\t}\n\n\tstatic black(): Color {\n\t\treturn new Color(0, 0, 0);\n\t}\n\n\tset(r: number, g: number, b: number): Color {\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\t\treturn this;\n\t}\n\n\tsetObject(object: ColorObject): Color {\n\t\tthis.r = object.r;\n\t\tthis.g = object.g;\n\t\tthis.b = object.b;\n\t\treturn this;\n\t}\n\n\tsetTuple(tuple: ColorTuple): Color {\n\t\tthis.r = tuple[0];\n\t\tthis.g = tuple[1];\n\t\tthis.b = tuple[2];\n\t\treturn this;\n\t}\n\n\tsetName(name: ColorName): Color {\n\t\tswitch (name) {\n\t\t\tcase \"black\":\n\t\t\t\tthis.r = 0;\n\t\t\t\tthis.g = 0;\n\t\t\t\tthis.b = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"silver\":\n\t\t\t\tthis.r = 192 / 255;\n\t\t\t\tthis.g = 192 / 255;\n\t\t\t\tthis.b = 192 / 255;\n\t\t\t\tbreak;\n\t\t\tcase \"gray\":\n\t\t\t\tthis.r = 128 / 255;\n\t\t\t\tthis.g = 128 / 255;\n\t\t\t\tthis.b = 128 / 255;\n\t\t\t\tbreak;\n\t\t\tcase \"white\":\n\t\t\t\tthis.r = 1;\n\t\t\t\tthis.g = 1;\n\t\t\t\tthis.b = 1;\n\t\t\t\tbreak;\n\t\t\tcase \"maroon\":\n\t\t\t\tthis.r = 128 / 255;\n\t\t\t\tthis.g = 0;\n\t\t\t\tthis.b = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"red\":\n\t\t\t\tthis.r = 1;\n\t\t\t\tthis.g = 0;\n\t\t\t\tthis.b = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"purple\":\n\t\t\t\tthis.r = 128 / 255;\n\t\t\t\tthis.g = 0;\n\t\t\t\tthis.b = 128 / 255;\n\t\t\t\tbreak;\n\t\t\tcase \"fuchsia\":\n\t\t\t\tthis.r = 1;\n\t\t\t\tthis.g = 0;\n\t\t\t\tthis.b = 1;\n\t\t\t\tbreak;\n\t\t\tcase \"green\":\n\t\t\t\tthis.r = 0;\n\t\t\t\tthis.g = 128 / 255;\n\t\t\t\tthis.b = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"lime\":\n\t\t\t\tthis.r = 0;\n\t\t\t\tthis.g = 255;\n\t\t\t\tthis.b = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"olive\":\n\t\t\t\tthis.r = 128 / 255;\n\t\t\t\tthis.g = 128 / 255;\n\t\t\t\tthis.b = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"yellow\":\n\t\t\t\tthis.r = 1;\n\t\t\t\tthis.g = 1;\n\t\t\t\tthis.b = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"navy\":\n\t\t\t\tthis.r = 0;\n\t\t\t\tthis.g = 0;\n\t\t\t\tthis.b = 128 / 255;\n\t\t\t\tbreak;\n\t\t\tcase \"blue\":\n\t\t\t\tthis.r = 0;\n\t\t\t\tthis.g = 0;\n\t\t\t\tthis.b = 1;\n\t\t\t\tbreak;\n\t\t\tcase \"teal\":\n\t\t\t\tthis.r = 0;\n\t\t\t\tthis.g = 128 / 255;\n\t\t\t\tthis.b = 128 / 255;\n\t\t\t\tbreak;\n\t\t\tcase \"aqua\":\n\t\t\t\tthis.r = 0;\n\t\t\t\tthis.g = 1;\n\t\t\t\tthis.b = 1;\n\t\t\t\tbreak;\n\t\t\tcase \"orange\":\n\t\t\t\tthis.r = 1;\n\t\t\t\tthis.g = 165 / 255;\n\t\t\t\tthis.b = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn this;\n\t}\n\n\tsetVector3(vector: Vector3Object): Color {\n\t\tthis.r = vector.x;\n\t\tthis.g = vector.y;\n\t\tthis.b = vector.z;\n\t\treturn this;\n\t}\n\n\tsetWhite(): Color {\n\t\tthis.r = 1;\n\t\tthis.g = 1;\n\t\tthis.b = 1;\n\t\treturn this;\n\t}\n\n\tsetBlack(): Color {\n\t\tthis.r = 0;\n\t\tthis.g = 0;\n\t\tthis.b = 0;\n\t\treturn this;\n\t}\n\n\tsetR(r: number): Color {\n\t\tthis.r = r;\n\t\treturn this;\n\t}\n\n\tsetG(g: number): Color {\n\t\tthis.g = g;\n\t\treturn this;\n\t}\n\n\tsetB(b: number): Color {\n\t\tthis.b = b;\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(Color.prototype, \"type\", { value: \"Color\" });\n\nexport function isColor(value: unknown): value is Color {\n\treturn Boolean(value) && (value as Color).type === \"Color\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Color, ColorObject } from \".\";\nimport { Texture2D } from \"../resources\";\nimport { MaterialProps } from \"./MaterialProps\";\n\nexport class DynamicMaterial {\n\n\tdeclare readonly type: \"DynamicMaterial\";\n\n\t_name: string;\n\n\t_baseColor: Color;\n\t_partialCoverage: number;\n\t_occlusionTextureStrength: number;\n\t_metallic: number;\n\t_roughness: number;\n\t_normalScale: number;\n\t_emissive: Color;\n\t_transmission: Color;\n\t_collimation: number;\n\t_ior: number;\n\n\t_baseColorPartialCoverageTexture: Texture2D | null;\n\t_occlusionTexture: Texture2D | null;\n\t_roughnessMetallicTexture: Texture2D | null;\n\t_normalTexture: Texture2D | null;\n\t_emissiveTexture: Texture2D | null;\n\t_transmissionCollimationTexture: Texture2D | null;\n\n\t_transparent: boolean;\n\t_doubleSided: boolean;\n\n\tconstructor({\n\t\tname = \"\",\n\t\tbaseColor,\n\t\tpartialCoverage = 1,\n\t\tocclusionTextureStrength = 1,\n\t\tmetallic = 1,\n\t\troughness = 1,\n\t\tnormalScale = 1,\n\t\temissive,\n\t\ttransmission,\n\t\tcollimation = 1,\n\t\tior = 1.45,\n\t\tbaseColorPartialCoverageTexture = null,\n\t\tocclusionTexture = null,\n\t\troughnessMetallicTexture = null,\n\t\tnormalTexture = null,\n\t\temissiveTexture = null,\n\t\ttransmissionCollimationTexture = null,\n\t\ttransparent = false,\n\t\tdoubleSided = false,\n\t}: MaterialProps) {\n\t\tthis._name = name;\n\n\t\tthis._baseColor = baseColor !== undefined ? Color.fromObject(baseColor) : Color.white();\n\t\tthis._partialCoverage = partialCoverage;\n\t\tthis._occlusionTextureStrength = occlusionTextureStrength;\n\t\tthis._metallic = metallic;\n\t\tthis._roughness = roughness;\n\t\tthis._normalScale = normalScale;\n\t\tthis._emissive = emissive !== undefined ? Color.fromObject(emissive) : Color.black();\n\t\tthis._transmission = transmission !== undefined ? Color.fromObject(transmission) : Color.black();\n\t\tthis._collimation = collimation;\n\t\tthis._ior = ior;\n\n\t\tthis._baseColorPartialCoverageTexture = baseColorPartialCoverageTexture;\n\t\tthis._occlusionTexture = occlusionTexture;\n\t\tthis._roughnessMetallicTexture = roughnessMetallicTexture;\n\t\tthis._normalTexture = normalTexture;\n\t\tthis._emissiveTexture = emissiveTexture;\n\t\tthis._transmissionCollimationTexture = transmissionCollimationTexture;\n\n\t\tthis._transparent = transparent;\n\t\tthis._doubleSided = doubleSided;\n\t}\n\n\tset name(value: string) { this._name = value; }\n\tget name(): string { return this._name; }\n\n\tsetBaseColor(value: ColorObject): DynamicMaterial {\n\t\tthis._baseColor.setObject(value);\n\t\treturn this;\n\t}\n\tgetBaseColor(res: Color): Color {\n\t\treturn res.setObject(this._baseColor);\n\t}\n\n\tset partialCoverage(value: number) { this._partialCoverage = value; }\n\tget partialCoverage(): number { return this._partialCoverage; }\n\n\tset occlusionTextureStrength(value: number) { this._occlusionTextureStrength = value; }\n\tget occlusionTextureStrength(): number { return this._occlusionTextureStrength; }\n\n\tset metallic(value: number) { this._metallic = value; }\n\tget metallic(): number { return this._metallic; }\n\n\tset roughness(value: number) { this._roughness = value; }\n\tget roughness(): number { return this._roughness; }\n\n\tset normalScale(value: number) { this._normalScale = value; }\n\tget normalScale(): number { return this._normalScale; }\n\n\tsetEmissive(value: ColorObject): DynamicMaterial {\n\t\tthis._emissive.setObject(value);\n\t\treturn this;\n\t}\n\tgetEmissive(res: Color): Color {\n\t\treturn res.setObject(this._emissive);\n\t}\n\n\tsetTransmission(value: ColorObject): DynamicMaterial {\n\t\tthis._transmission.setObject(value);\n\t\treturn this;\n\t}\n\tgetTransmission(res: Color): Color {\n\t\treturn res.setObject(this._transmission);\n\t}\n\n\tset collimation(value: number) { this._collimation = value; }\n\tget collimation(): number { return this._collimation; }\n\n\tset ior(value: number) { this._ior = value; }\n\tget ior(): number { return this._ior; }\n\n\tset baseColorPartialCoverageTexture(value: Texture2D | null) { this._baseColorPartialCoverageTexture = value; }\n\tget baseColorPartialCoverageTexture(): Texture2D | null { return this._baseColorPartialCoverageTexture; }\n\n\tset occlusionTexture(value: Texture2D | null) { this._occlusionTexture = value; }\n\tget occlusionTexture(): Texture2D | null { return this._occlusionTexture; }\n\n\tset roughnessMetallicTexture(value: Texture2D | null) { this._roughnessMetallicTexture = value; }\n\tget roughnessMetallicTexture(): Texture2D | null { return this._roughnessMetallicTexture; }\n\n\tset normalTexture(value: Texture2D | null) { this._normalTexture = value; }\n\tget normalTexture(): Texture2D | null { return this._normalTexture; }\n\n\tset emissiveTexture(value: Texture2D | null) { this._emissiveTexture = value; }\n\tget emissiveTexture(): Texture2D | null { return this._emissiveTexture; }\n\n\tset transmissionCollimationTexture(value: Texture2D | null) { this._transmissionCollimationTexture = value; }\n\tget transmissionCollimationTexture(): Texture2D | null { return this._transmissionCollimationTexture; }\n\n\tset transparent(value: boolean) { this._transparent = value; }\n\tget transparent(): boolean { return this._transparent; }\n\n\tset doubleSided(value: boolean) { this._doubleSided = value; }\n\tget doubleSided(): boolean { return this._doubleSided; }\n}\n\nObject.defineProperty(DynamicMaterial.prototype, \"type\", { value: \"DynamicMaterial\" });\n\nexport function isDynamicMaterial(value: unknown): value is DynamicMaterial {\n\treturn Boolean(value) && (value as DynamicMaterial).type === \"DynamicMaterial\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Color, ColorObject, Node } from \".\";\n\nexport type Light = DirectionalLight | PointLight;\n\nexport interface DirectionalLightProps {\n\treadonly name?: string;\n\n\treadonly color: ColorObject;\n}\n\nexport interface PointLightProps {\n\treadonly name?: string;\n\n\treadonly color: ColorObject;\n}\n\nexport class DirectionalLight {\n\n\tdeclare readonly type: \"DirectionalLight\";\n\n\t_name: string;\n\n\t_color: Color;\n\n\t/** backreference */\n\t_node: Node | null;\n\n\tconstructor({\n\t\tname = \"\",\n\t\tcolor,\n\t}: DirectionalLightProps) {\n\t\tthis._name = name;\n\n\t\tthis._color = Color.fromObject(color);\n\n\t\tthis._node = null;\n\t}\n\n\tset name(value: string) { this._name = value; }\n\tget name(): string { return this._name; }\n\n\tsetColor(value: ColorObject): DirectionalLight {\n\t\tthis._color.setObject(value);\n\t\treturn this;\n\t}\n\n\tgetColor(res: Color): Color {\n\t\treturn res.setObject(this._color);\n\t}\n\n\tattach(node: Node): DirectionalLight {\n\t\tif (this._node !== null) {\n\t\t\tthis._node._light = null;\n\t\t}\n\n\t\tif (node._light !== null) {\n\t\t\tnode._light._node = null;\n\t\t}\n\n\t\tnode._light = this;\n\t\tthis._node = node;\n\t\treturn this;\n\t}\n\n\tdetach(): DirectionalLight {\n\t\tif (this._node === null) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._node._light = null;\n\t\tthis._node = null;\n\t\treturn this;\n\t}\n}\n\nexport class PointLight {\n\n\tdeclare readonly type: \"PointLight\";\n\n\t_name: string;\n\n\t_color: Color;\n\n\t/** backreference */\n\t_node: Node | null;\n\n\tconstructor({\n\t\tname = \"\",\n\t\tcolor,\n\t}: PointLightProps) {\n\t\tthis._name = name;\n\n\t\tthis._color = Color.fromObject(color);\n\n\t\tthis._node = null;\n\t}\n\n\tset name(value: string) { this._name = value; }\n\tget name(): string { return this._name; }\n\n\tsetColor(value: ColorObject): PointLight {\n\t\tthis._color.setObject(value);\n\t\treturn this;\n\t}\n\n\tgetColor(res: Color): Color {\n\t\treturn res.setObject(this._color);\n\t}\n\n\tattach(node: Node): PointLight {\n\t\tif (this._node !== null) {\n\t\t\tthis._node._light = null;\n\t\t}\n\n\t\tif (node._light !== null) {\n\t\t\tnode._light._node = null;\n\t\t}\n\n\t\tnode._light = this;\n\t\tthis._node = node;\n\t\treturn this;\n\t}\n\n\tdetach(): PointLight {\n\t\tif (this._node === null) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._node._light = null;\n\t\tthis._node = null;\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(DirectionalLight.prototype, \"type\", { value: \"DirectionalLight\" });\n\nObject.defineProperty(PointLight.prototype, \"type\", { value: \"PointLight\" });\n\nexport function isDirectionalLight(value: unknown): value is DirectionalLight {\n\treturn Boolean(value) && (value as DirectionalLight).type === \"DirectionalLight\";\n}\n\nexport function isPointLight(value: unknown): value is PointLight {\n\treturn Boolean(value) && (value as PointLight).type === \"PointLight\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { QuaternionObject, Vector3Object } from \".\";\n\nexport interface Matrix4x4Object {\n\treadonly ix: number;\n\treadonly iy: number;\n\treadonly iz: number;\n\treadonly iw: number;\n\treadonly jx: number;\n\treadonly jy: number;\n\treadonly jz: number;\n\treadonly jw: number;\n\treadonly kx: number;\n\treadonly ky: number;\n\treadonly kz: number;\n\treadonly kw: number;\n\treadonly tx: number;\n\treadonly ty: number;\n\treadonly tz: number;\n\treadonly tw: number;\n}\n\nexport type Matrix4x4Tuple = readonly [\n\tix: number, iy: number, iz: number, iw: number,\n\tjx: number, jy: number, jz: number, jw: number,\n\tkx: number, ky: number, kz: number, kw: number,\n\ttx: number, ty: number, tz: number, tw: number,\n];\n\nexport class Matrix4x4 {\n\n\tdeclare readonly type: \"Matrix4x4\";\n\n\tix: number;\n\tiy: number;\n\tiz: number;\n\tiw: number;\n\tjx: number;\n\tjy: number;\n\tjz: number;\n\tjw: number;\n\tkx: number;\n\tky: number;\n\tkz: number;\n\tkw: number;\n\ttx: number;\n\tty: number;\n\ttz: number;\n\ttw: number;\n\n\tconstructor(\n\t\tix: number, iy: number, iz: number, iw: number,\n\t\tjx: number, jy: number, jz: number, jw: number,\n\t\tkx: number, ky: number, kz: number, kw: number,\n\t\ttx: number, ty: number, tz: number, tw: number\n\t) {\n\t\tthis.ix = ix;\n\t\tthis.iy = iy;\n\t\tthis.iz = iz;\n\t\tthis.iw = iw;\n\t\tthis.jx = jx;\n\t\tthis.jy = jy;\n\t\tthis.jz = jz;\n\t\tthis.jw = jw;\n\t\tthis.kx = kx;\n\t\tthis.ky = ky;\n\t\tthis.kz = kz;\n\t\tthis.kw = kw;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t\tthis.tz = tz;\n\t\tthis.tw = tw;\n\t}\n\n\tstatic fromObject(object: Matrix4x4Object): Matrix4x4 {\n\t\treturn new Matrix4x4(\n\t\t\tobject.ix, object.iy, object.iz, object.iw,\n\t\t\tobject.jx, object.jy, object.jz, object.jw,\n\t\t\tobject.kx, object.ky, object.kz, object.kw,\n\t\t\tobject.tx, object.ty, object.tz, object.tw,\n\t\t);\n\t}\n\n\tstatic fromTuple(tuple: Matrix4x4Tuple): Matrix4x4 {\n\t\treturn new Matrix4x4(...tuple);\n\t}\n\n\tstatic identity(): Matrix4x4 {\n\t\treturn new Matrix4x4(\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1,\n\t\t)\n\t}\n\n\tstatic fromTranslation(translation: Vector3Object): Matrix4x4 {\n\t\treturn new Matrix4x4(\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\ttranslation.x, translation.y, translation.z, 1,\n\t\t);\n\t}\n\n\tstatic fromQuaternion(quaternion: QuaternionObject): Matrix4x4 {\n\t\tconst xx = quaternion.x * quaternion.x;\n\t\tconst xy = quaternion.x * quaternion.y;\n\t\tconst xz = quaternion.x * quaternion.z;\n\t\tconst xw = quaternion.x * quaternion.w;\n\t\tconst yy = quaternion.y * quaternion.y;\n\t\tconst yz = quaternion.y * quaternion.z;\n\t\tconst yw = quaternion.y * quaternion.w;\n\t\tconst zz = quaternion.z * quaternion.z;\n\t\tconst zw = quaternion.z * quaternion.w;\n\n\t\treturn new Matrix4x4(\n\t\t\t1 - 2 * (yy + zz), 2 * (xy + zw), 2 * (xz - yw), 0,\n\t\t\t2 * (xy - zw), 1 - 2 * (xx + zz), 2 * (yz + xw), 0,\n\t\t\t2 * (xz + yw), 2 * (yz - xw), 1 - 2 * (xx + yy), 0,\n\t\t\t0, 0, 0, 1,\n\t\t);\n\t}\n\n\tstatic fromScale(scale: Vector3Object): Matrix4x4 {\n\t\treturn new Matrix4x4(\n\t\t\tscale.x, 0, 0, 0,\n\t\t\t0, scale.y, 0, 0,\n\t\t\t0, 0, scale.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\tstatic fromTranslationRotationScale(translation: Vector3Object, rotation: QuaternionObject, scale: Vector3Object): Matrix4x4 {\n\t\tconst xx = rotation.x * rotation.x;\n\t\tconst xy = rotation.x * rotation.y;\n\t\tconst xz = rotation.x * rotation.z;\n\t\tconst xw = rotation.x * rotation.w;\n\t\tconst yy = rotation.y * rotation.y;\n\t\tconst yz = rotation.y * rotation.z;\n\t\tconst yw = rotation.y * rotation.w;\n\t\tconst zz = rotation.z * rotation.z;\n\t\tconst zw = rotation.z * rotation.w;\n\n\t\treturn new Matrix4x4(\n\t\t\tscale.x * (1 - 2 * (yy + zz)), scale.x * 2 * (xy + zw), scale.x * 2 * (xz - yw), 0,\n\t\t\tscale.y * 2 * (xy - zw), scale.y * (1 - 2 * (xx + zz)), scale.y * 2 * (yz + xw), 0,\n\t\t\tscale.z * 2 * (xz + yw), scale.z * 2 * (yz - xw), scale.z * (1 - 2 * (xx + yy)), 0,\n\t\t\ttranslation.x, translation.y, translation.z, 1,\n\t\t);\n\t}\n\n\tset(\n\t\tix: number, iy: number, iz: number, iw: number,\n\t\tjx: number, jy: number, jz: number, jw: number,\n\t\tkx: number, ky: number, kz: number, kw: number,\n\t\ttx: number, ty: number, tz: number, tw: number,\n\t): Matrix4x4 {\n\t\tthis.ix = ix;\n\t\tthis.iy = iy;\n\t\tthis.iz = iz;\n\t\tthis.iw = iw;\n\t\tthis.jx = jx;\n\t\tthis.jy = jy;\n\t\tthis.jz = jz;\n\t\tthis.jw = jw;\n\t\tthis.kx = kx;\n\t\tthis.ky = ky;\n\t\tthis.kz = kz;\n\t\tthis.kw = kw;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t\tthis.tz = tz;\n\t\tthis.tw = tw;\n\t\treturn this;\n\t}\n\n\tsetObject(object: Matrix4x4Object): Matrix4x4 {\n\t\tthis.ix = object.ix;\n\t\tthis.iy = object.iy;\n\t\tthis.iz = object.iz;\n\t\tthis.iw = object.iw;\n\t\tthis.jx = object.jx;\n\t\tthis.jy = object.jy;\n\t\tthis.jz = object.jz;\n\t\tthis.jw = object.jw;\n\t\tthis.kx = object.kx;\n\t\tthis.ky = object.ky;\n\t\tthis.kz = object.kz;\n\t\tthis.kw = object.kw;\n\t\tthis.tx = object.tx;\n\t\tthis.ty = object.ty;\n\t\tthis.tz = object.tz;\n\t\tthis.tw = object.tw;\n\t\treturn this;\n\t}\n\n\tsetTuple(tuple: Matrix4x4Tuple): Matrix4x4 {\n\t\tthis.ix = tuple[0];\n\t\tthis.iy = tuple[1];\n\t\tthis.iz = tuple[2];\n\t\tthis.iw = tuple[3];\n\t\tthis.jx = tuple[4];\n\t\tthis.jy = tuple[5];\n\t\tthis.jz = tuple[6];\n\t\tthis.jw = tuple[7];\n\t\tthis.kx = tuple[8];\n\t\tthis.ky = tuple[9];\n\t\tthis.kz = tuple[10];\n\t\tthis.kw = tuple[11];\n\t\tthis.tx = tuple[12];\n\t\tthis.ty = tuple[13];\n\t\tthis.tz = tuple[14];\n\t\tthis.tw = tuple[15];\n\t\treturn this;\n\t}\n\n\tsetIdentity(): Matrix4x4 {\n\t\tthis.ix = 1;\n\t\tthis.iy = 0;\n\t\tthis.iz = 0;\n\t\tthis.iw = 0;\n\t\tthis.jx = 0;\n\t\tthis.jy = 1;\n\t\tthis.jz = 0;\n\t\tthis.jw = 0;\n\t\tthis.kx = 0;\n\t\tthis.ky = 0;\n\t\tthis.kz = 1;\n\t\tthis.kw = 0;\n\t\tthis.tx = 0;\n\t\tthis.ty = 0;\n\t\tthis.tz = 0;\n\t\tthis.tw = 1;\n\t\treturn this;\n\t}\n\n\tsetTranslation(translation: Vector3Object): Matrix4x4 {\n\t\tthis.ix = 1;\n\t\tthis.iy = 0;\n\t\tthis.iz = 0;\n\t\tthis.iw = 0;\n\t\tthis.jx = 0;\n\t\tthis.jy = 1;\n\t\tthis.jz = 0;\n\t\tthis.jw = 0;\n\t\tthis.kx = 0;\n\t\tthis.ky = 0;\n\t\tthis.kz = 1;\n\t\tthis.kw = 0;\n\t\tthis.tx = translation.x;\n\t\tthis.ty = translation.y;\n\t\tthis.tz = translation.z;\n\t\tthis.tw = 1;\n\t\treturn this;\n\t}\n\n\tsetQuaternion(quaternion: QuaternionObject): Matrix4x4 {\n\t\tconst xx = quaternion.x * quaternion.x;\n\t\tconst xy = quaternion.x * quaternion.y;\n\t\tconst xz = quaternion.x * quaternion.z;\n\t\tconst xw = quaternion.x * quaternion.w;\n\t\tconst yy = quaternion.y * quaternion.y;\n\t\tconst yz = quaternion.y * quaternion.z;\n\t\tconst yw = quaternion.y * quaternion.w;\n\t\tconst zz = quaternion.z * quaternion.z;\n\t\tconst zw = quaternion.z * quaternion.w;\n\n\t\tthis.ix = 1 - 2 * (yy + zz);\n\t\tthis.iy = 2 * (xy + zw);\n\t\tthis.iz = 2 * (xz - yw);\n\t\tthis.iw = 0;\n\t\tthis.jx = 2 * (xy - zw);\n\t\tthis.jy = 1 - 2 * (xx + zz);\n\t\tthis.jz = 2 * (yz + xw);\n\t\tthis.jw = 0;\n\t\tthis.kx = 2 * (xz + yw);\n\t\tthis.ky = 2 * (yz - xw);\n\t\tthis.kz = 1 - 2 * (xx + yy);\n\t\tthis.kw = 0;\n\t\tthis.tx = 0;\n\t\tthis.ty = 0;\n\t\tthis.tz = 0;\n\t\tthis.tw = 1;\n\t\treturn this;\n\t}\n\n\tsetScale(scale: Vector3Object): Matrix4x4 {\n\t\tthis.ix = scale.x;\n\t\tthis.iy = 0;\n\t\tthis.iz = 0;\n\t\tthis.iw = 0;\n\t\tthis.jx = 0;\n\t\tthis.jy = scale.y;\n\t\tthis.jz = 0;\n\t\tthis.jw = 0;\n\t\tthis.kx = 0;\n\t\tthis.ky = 0;\n\t\tthis.kz = scale.z;\n\t\tthis.kw = 0;\n\t\tthis.tx = 0;\n\t\tthis.ty = 0;\n\t\tthis.tz = 0;\n\t\tthis.tw = 1;\n\t\treturn this;\n\t}\n\n\tsetTranslationRotationScale(translation: Vector3Object, rotation: QuaternionObject, scale: Vector3Object): Matrix4x4 {\n\t\tconst xx = rotation.x * rotation.x;\n\t\tconst xy = rotation.x * rotation.y;\n\t\tconst xz = rotation.x * rotation.z;\n\t\tconst xw = rotation.x * rotation.w;\n\t\tconst yy = rotation.y * rotation.y;\n\t\tconst yz = rotation.y * rotation.z;\n\t\tconst yw = rotation.y * rotation.w;\n\t\tconst zz = rotation.z * rotation.z;\n\t\tconst zw = rotation.z * rotation.w;\n\n\t\tthis.ix = scale.x * (1 - 2 * (yy + zz));\n\t\tthis.iy = scale.x * 2 * (xy + zw);\n\t\tthis.iz = scale.x * 2 * (xz - yw);\n\t\tthis.iw = 0;\n\t\tthis.jx = scale.y * 2 * (xy - zw);\n\t\tthis.jy = scale.y * (1 - 2 * (xx + zz));\n\t\tthis.jz = scale.y * 2 * (yz + xw);\n\t\tthis.jw = 0;\n\t\tthis.kx = scale.z * 2 * (xz + yw);\n\t\tthis.ky = scale.z * 2 * (yz - xw);\n\t\tthis.kz = scale.z * (1 - 2 * (xx + yy));\n\t\tthis.kw = 0;\n\t\tthis.tx = translation.x;\n\t\tthis.ty = translation.y;\n\t\tthis.tz = translation.z;\n\t\tthis.tw = 1;\n\t\treturn this;\n\t}\n\n\taddMatrix(m: Matrix4x4): Matrix4x4 {\n\t\tthis.ix += m.ix;\n\t\tthis.iy += m.iy;\n\t\tthis.iz += m.iz;\n\t\tthis.iw += m.iw;\n\t\tthis.jx += m.jx;\n\t\tthis.jy += m.jy;\n\t\tthis.jz += m.jz;\n\t\tthis.jw += m.jw;\n\t\tthis.kx += m.kx;\n\t\tthis.ky += m.ky;\n\t\tthis.kz += m.kz;\n\t\tthis.kw += m.kw;\n\t\tthis.tx += m.tx;\n\t\tthis.ty += m.ty;\n\t\tthis.tz += m.tz;\n\t\tthis.tw += m.tw;\n\t\treturn this;\n\t}\n\n\taddMatrices(a: Matrix4x4, b: Matrix4x4): Matrix4x4 {\n\t\tthis.ix = a.ix + b.ix;\n\t\tthis.iy = a.iy + b.iy;\n\t\tthis.iz = a.iz + b.iz;\n\t\tthis.iw = a.iw + b.iw;\n\t\tthis.jx = a.jx + b.jx;\n\t\tthis.jy = a.jy + b.jy;\n\t\tthis.jz = a.jz + b.jz;\n\t\tthis.jw = a.jw + b.jw;\n\t\tthis.kx = a.kx + b.kx;\n\t\tthis.ky = a.ky + b.ky;\n\t\tthis.kz = a.kz + b.kz;\n\t\tthis.kw = a.kw + b.kw;\n\t\tthis.tx = a.tx + b.tx;\n\t\tthis.ty = a.ty + b.ty;\n\t\tthis.tz = a.tz + b.tz;\n\t\tthis.tw = a.tw + b.tw;\n\t\treturn this;\n\t}\n\n\tsubMatrix(m: Matrix4x4): Matrix4x4 {\n\t\tthis.ix -= m.ix;\n\t\tthis.iy -= m.iy;\n\t\tthis.iz -= m.iz;\n\t\tthis.iw -= m.iw;\n\t\tthis.jx -= m.jx;\n\t\tthis.jy -= m.jy;\n\t\tthis.jz -= m.jz;\n\t\tthis.jw -= m.jw;\n\t\tthis.kx -= m.kx;\n\t\tthis.ky -= m.ky;\n\t\tthis.kz -= m.kz;\n\t\tthis.kw -= m.kw;\n\t\tthis.tx -= m.tx;\n\t\tthis.ty -= m.ty;\n\t\tthis.tz -= m.tz;\n\t\tthis.tw -= m.tw;\n\t\treturn this;\n\t}\n\n\tsubMatrices(a: Matrix4x4, b: Matrix4x4): Matrix4x4 {\n\t\tthis.ix = a.ix - b.ix;\n\t\tthis.iy = a.iy - b.iy;\n\t\tthis.iz = a.iz - b.iz;\n\t\tthis.iw = a.iw - b.iw;\n\t\tthis.jx = a.jx - b.jx;\n\t\tthis.jy = a.jy - b.jy;\n\t\tthis.jz = a.jz - b.jz;\n\t\tthis.jw = a.jw - b.jw;\n\t\tthis.kx = a.kx - b.kx;\n\t\tthis.ky = a.ky - b.ky;\n\t\tthis.kz = a.kz - b.kz;\n\t\tthis.kw = a.kw - b.kw;\n\t\tthis.tx = a.tx - b.tx;\n\t\tthis.ty = a.ty - b.ty;\n\t\tthis.tz = a.tz - b.tz;\n\t\tthis.tw = a.tw - b.tw;\n\t\treturn this;\n\t}\n\n\tnegate(): Matrix4x4 {\n\t\tthis.ix = -this.ix;\n\t\tthis.iy = -this.iy;\n\t\tthis.iz = -this.iz;\n\t\tthis.iw = -this.iw;\n\t\tthis.jx = -this.jx;\n\t\tthis.jy = -this.jy;\n\t\tthis.jz = -this.jz;\n\t\tthis.jw = -this.jw;\n\t\tthis.kx = -this.kx;\n\t\tthis.ky = -this.ky;\n\t\tthis.kz = -this.kz;\n\t\tthis.kw = -this.kw;\n\t\tthis.tx = -this.tx;\n\t\tthis.ty = -this.ty;\n\t\tthis.tz = -this.tz;\n\t\tthis.tw = -this.tw;\n\t\treturn this;\n\t}\n\n\tmulScalar(k: number): Matrix4x4 {\n\t\tthis.ix *= k;\n\t\tthis.iy *= k;\n\t\tthis.iz *= k;\n\t\tthis.iw *= k;\n\t\tthis.jx *= k;\n\t\tthis.jy *= k;\n\t\tthis.jz *= k;\n\t\tthis.jw *= k;\n\t\tthis.kx *= k;\n\t\tthis.ky *= k;\n\t\tthis.kz *= k;\n\t\tthis.kw *= k;\n\t\tthis.tx *= k;\n\t\tthis.ty *= k;\n\t\tthis.tz *= k;\n\t\tthis.tw *= k;\n\t\treturn this;\n\t}\n\n\tmulMatrix(m: Matrix4x4): Matrix4x4 {\n\t\tconst ix = this.ix * m.ix + this.jx * m.iy + this.kx * m.iz + this.tx * m.iw;\n\t\tconst iy = this.iy * m.ix + this.jy * m.iy + this.ky * m.iz + this.ty * m.iw;\n\t\tconst iz = this.iz * m.ix + this.jz * m.iy + this.kz * m.iz + this.tz * m.iw;\n\t\tconst iw = this.iw * m.ix + this.jw * m.iy + this.kw * m.iz + this.tw * m.iw;\n\t\tconst jx = this.ix * m.jx + this.jx * m.jy + this.kx * m.jz + this.tx * m.jw;\n\t\tconst jy = this.iy * m.jx + this.jy * m.jy + this.ky * m.jz + this.ty * m.jw;\n\t\tconst jz = this.iz * m.jx + this.jz * m.jy + this.kz * m.jz + this.tz * m.jw;\n\t\tconst jw = this.iw * m.jx + this.jw * m.jy + this.kw * m.jz + this.tw * m.jw;\n\t\tconst kx = this.ix * m.kx + this.jx * m.ky + this.kx * m.kz + this.tx * m.kw;\n\t\tconst ky = this.iy * m.kx + this.jy * m.ky + this.ky * m.kz + this.ty * m.kw;\n\t\tconst kz = this.iz * m.kx + this.jz * m.ky + this.kz * m.kz + this.tz * m.kw;\n\t\tconst kw = this.iw * m.kx + this.jw * m.ky + this.kw * m.kz + this.tw * m.kw;\n\t\tconst tx = this.ix * m.tx + this.jx * m.ty + this.kx * m.tz + this.tx * m.tw;\n\t\tconst ty = this.iy * m.tx + this.jy * m.ty + this.ky * m.tz + this.ty * m.tw;\n\t\tconst tz = this.iz * m.tx + this.jz * m.ty + this.kz * m.tz + this.tz * m.tw;\n\t\tconst tw = this.iw * m.tx + this.jw * m.ty + this.kw * m.tz + this.tw * m.tw;\n\t\tthis.ix = ix;\n\t\tthis.iy = iy;\n\t\tthis.iz = iz;\n\t\tthis.iw = iw;\n\t\tthis.jx = jx;\n\t\tthis.jy = jy;\n\t\tthis.jz = jz;\n\t\tthis.jw = jw;\n\t\tthis.kx = kx;\n\t\tthis.ky = ky;\n\t\tthis.kz = kz;\n\t\tthis.kw = kw;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t\tthis.tz = tz;\n\t\tthis.tw = tw;\n\t\treturn this;\n\t}\n\n\tpremulMatrix(m: Matrix4x4): Matrix4x4 {\n\t\tconst ix = m.ix * this.ix + m.jx * this.iy + m.kx * this.iz + m.tx * this.iw;\n\t\tconst iy = m.iy * this.ix + m.jy * this.iy + m.ky * this.iz + m.ty * this.iw;\n\t\tconst iz = m.iz * this.ix + m.jz * this.iy + m.kz * this.iz + m.tz * this.iw;\n\t\tconst iw = m.iw * this.ix + m.jw * this.iy + m.kw * this.iz + m.tw * this.iw;\n\t\tconst jx = m.ix * this.jx + m.jx * this.jy + m.kx * this.jz + m.tx * this.jw;\n\t\tconst jy = m.iy * this.jx + m.jy * this.jy + m.ky * this.jz + m.ty * this.jw;\n\t\tconst jz = m.iz * this.jx + m.jz * this.jy + m.kz * this.jz + m.tz * this.jw;\n\t\tconst jw = m.iw * this.jx + m.jw * this.jy + m.kw * this.jz + m.tw * this.jw;\n\t\tconst kx = m.ix * this.kx + m.jx * this.ky + m.kx * this.kz + m.tx * this.kw;\n\t\tconst ky = m.iy * this.kx + m.jy * this.ky + m.ky * this.kz + m.ty * this.kw;\n\t\tconst kz = m.iz * this.kx + m.jz * this.ky + m.kz * this.kz + m.tz * this.kw;\n\t\tconst kw = m.iw * this.kx + m.jw * this.ky + m.kw * this.kz + m.tw * this.kw;\n\t\tconst tx = m.ix * this.tx + m.jx * this.ty + m.kx * this.tz + m.tx * this.tw;\n\t\tconst ty = m.iy * this.tx + m.jy * this.ty + m.ky * this.tz + m.ty * this.tw;\n\t\tconst tz = m.iz * this.tx + m.jz * this.ty + m.kz * this.tz + m.tz * this.tw;\n\t\tconst tw = m.iw * this.tx + m.jw * this.ty + m.kw * this.tz + m.tw * this.tw;\n\t\tthis.ix = ix;\n\t\tthis.iy = iy;\n\t\tthis.iz = iz;\n\t\tthis.iw = iw;\n\t\tthis.jx = jx;\n\t\tthis.jy = jy;\n\t\tthis.jz = jz;\n\t\tthis.jw = jw;\n\t\tthis.kx = kx;\n\t\tthis.ky = ky;\n\t\tthis.kz = kz;\n\t\tthis.kw = kw;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t\tthis.tz = tz;\n\t\tthis.tw = tw;\n\t\treturn this;\n\t}\n\n\tinverseAffine(): Matrix4x4 {\n\t\tconst ix = this.ix;\n\t\tconst iy = this.iy;\n\t\tconst iz = this.iz;\n\t\tconst jx = this.jx;\n\t\tconst jy = this.jy;\n\t\tconst jz = this.jz;\n\t\tconst kx = this.kx;\n\t\tconst ky = this.ky;\n\t\tconst kz = this.kz;\n\t\tconst tx = this.tx;\n\t\tconst ty = this.ty;\n\t\tconst tz = this.tz;\n\n\t\tconst det = ix * jy * kz + iy * jz * kx + iz * jx * ky\n\t\t\t- ix * jz * ky - iy * jx * kz - iz * jy * kx;\n\t\tconst invDet = 1 / det;\n\n\t\tthis.ix = invDet * (jy * kz - jz * ky);\n\t\tthis.iy = invDet * (iz * ky - iy * kz);\n\t\tthis.iz = invDet * (iy * jz - iz * jy);\n\t\tthis.jx = invDet * (jz * kx - jx * kz);\n\t\tthis.jy = invDet * (ix * kz - iz * kx);\n\t\tthis.jz = invDet * (iz * jx - ix * jz);\n\t\tthis.kx = invDet * (jx * ky - jy * kx);\n\t\tthis.ky = invDet * (iy * kx - ix * ky);\n\t\tthis.kz = invDet * (ix * jy - iy * jx);\n\t\tthis.tx = -(this.ix * tx + this.jx * ty + this.kx * tz);\n\t\tthis.ty = -(this.iy * tx + this.jy * ty + this.ky * tz);\n\t\tthis.tz = -(this.iz * tx + this.jz * ty + this.kz * tz);\n\n\t\treturn this;\n\t}\n\n\tinverseTransposeAffine(): Matrix4x4 {\n\t\tconst ix = this.ix;\n\t\tconst iy = this.iy;\n\t\tconst iz = this.iz;\n\t\tconst jx = this.jx;\n\t\tconst jy = this.jy;\n\t\tconst jz = this.jz;\n\t\tconst kx = this.kx;\n\t\tconst ky = this.ky;\n\t\tconst kz = this.kz;\n\t\tconst tx = this.tx;\n\t\tconst ty = this.ty;\n\t\tconst tz = this.tz;\n\n\t\tconst det = ix * jy * kz + iy * jz * kx + iz * jx * ky\n\t\t\t- ix * jz * ky - iy * jx * kz - iz * jy * kx;\n\t\tconst invDet = 1 / det;\n\n\t\tthis.ix = invDet * (jy * kz - jz * ky);\n\t\tthis.iy = invDet * (jz * kx - jx * kz);\n\t\tthis.iz = invDet * (jx * ky - jy * kx);\n\t\tthis.jx = invDet * (iz * ky - iy * kz);\n\t\tthis.jy = invDet * (ix * kz - iz * kx);\n\t\tthis.jz = invDet * (iy * kx - ix * ky);\n\t\tthis.kx = invDet * (iy * jz - iz * jy);\n\t\tthis.ky = invDet * (iz * jx - ix * jz);\n\t\tthis.kz = invDet * (ix * jy - iy * jx);\n\t\tthis.tx = -(this.ix * tx + this.iy * ty + this.iz * tz);\n\t\tthis.ty = -(this.jx * tx + this.jy * ty + this.jz * tz);\n\t\tthis.tz = -(this.kx * tx + this.ky * ty + this.kz * tz);\n\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(Matrix4x4.prototype, \"type\", { value: \"Matrix4x4\" });\n\nexport function isMatrix4x4(value: unknown): value is Matrix4x4 {\n\treturn Boolean(value) && (value as Matrix4x4).type === \"Matrix4x4\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { IndexBuffer, VertexBuffer } from \"../resources\";\n\nexport type Submesh = {\n\tstart: number,\n\tlength: number,\n};\n\nexport interface MeshProps {\n\treadonly name?: string;\n\n\treadonly vertexBuffer: VertexBuffer;\n\treadonly indexBuffer: IndexBuffer;\n\treadonly submeshes: Submesh[];\n}\n\nexport class Mesh {\n\n\treadonly type!: \"Mesh\"\n\n\t_name: string;\n\n\t_vertexBuffer: VertexBuffer;\n\t_indexBuffer: IndexBuffer;\n\t_submeshes: Submesh[];\n\n\tconstructor({\n\t\tname = \"\",\n\t\tvertexBuffer,\n\t\tindexBuffer,\n\t\tsubmeshes,\n\t}: MeshProps) {\n\t\tthis._name = name;\n\n\t\tthis._vertexBuffer = vertexBuffer;\n\t\tthis._indexBuffer = indexBuffer\n\t\tthis._submeshes = submeshes;\n\t}\n\n\tget submeshCount(): number {\n\t\treturn this._submeshes.length;\n\t}\n\n\tset name(value: string) { this._name = value; }\n\tget name(): string { return this._name; }\n\n\tset vertexBuffer(value: VertexBuffer) { this._vertexBuffer = value; }\n\tget vertexBuffer(): VertexBuffer { return this._vertexBuffer; }\n\n\tset indexBuffer(value: IndexBuffer) { this._indexBuffer = value; }\n\tget indexBuffer(): IndexBuffer { return this._indexBuffer; }\n\n\tsetSubmeshes(value: readonly Submesh[]): Mesh {\n\t\tthis._submeshes.length = 0;\n\t\tthis._submeshes.push(...value);\n\t\treturn this;\n\t}\n\n\tgetMaterials(res: Submesh[]): Submesh[] {\n\t\tres.length = 0;\n\t\tres.push(...this._submeshes);\n\t\treturn res;\n\t}\n}\n\nObject.defineProperty(Mesh.prototype, \"type\", { value: \"Mesh\" });\n\nexport function isMesh(value: unknown): value is Mesh {\n\treturn Boolean(value) && (value as Mesh).type === \"Mesh\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Camera, DynamicMaterial, Light, Matrix4x4, Mesh, Quaternion, QuaternionObject, Vector3, Vector3Object } from \".\";\nimport { Material } from \"../resources\";\n\nexport interface NodeProps {\n\treadonly name?: string;\n\n\treadonly translation?: Vector3Object;\n\treadonly rotation?: QuaternionObject;\n\treadonly scale?: Vector3Object;\n\n\treadonly camera?: Camera | null;\n\treadonly light?: Light | null;\n\treadonly mesh?: Mesh | null;\n\treadonly materials?: (Material | DynamicMaterial)[];\n\n\treadonly children?: Node[];\n}\n\nexport class Node {\n\n\tdeclare readonly type: \"Node\";\n\n\t_name: string;\n\n\t_translation: Vector3;\n\t_rotation: Quaternion;\n\t_scale: Vector3;\n\n\t/** unique */\n\t_camera: Camera | null;\n\t/** unique */\n\t_light: Light | null;\n\t/** shared */\n\t_mesh: Mesh | null;\n\t/** shared */\n\t_materials: (Material | DynamicMaterial)[];\n\n\t/** unique */\n\t_children: Node[];\n\n\t/** backreference */\n\t_parent: Node | null;\n\n\t_localMatrixNeedsUpdate: boolean;\n\t_localMatrix: Matrix4x4;\n\n\t_worldMatrixNeedsUpdate: boolean;\n\t_worldMatrix: Matrix4x4;\n\n\tconstructor({\n\t\tname = \"\",\n\t\ttranslation,\n\t\trotation,\n\t\tscale,\n\t\tcamera = null,\n\t\tlight = null,\n\t\tmesh = null,\n\t\tmaterials = [],\n\t\tchildren = [],\n\t}: NodeProps) {\n\t\tthis._name = name;\n\n\t\tthis._translation = translation !== undefined ? Vector3.fromObject(translation) : Vector3.zero();\n\t\tthis._rotation = rotation !== undefined ? Quaternion.fromObject(rotation) : Quaternion.identity();\n\t\tthis._scale = scale !== undefined ? Vector3.fromObject(scale) : Vector3.one();\n\n\t\tthis._camera = camera;\n\t\tthis._light = light;\n\t\tthis._mesh = mesh;\n\t\tthis._materials = materials;\n\n\t\tthis._children = children;\n\n\t\tthis._parent = null;\n\n\t\tthis._localMatrixNeedsUpdate = true;\n\t\tthis._localMatrix = new Matrix4x4(\n\t\t\tNaN, NaN, NaN, NaN,\n\t\t\tNaN, NaN, NaN, NaN,\n\t\t\tNaN, NaN, NaN, NaN,\n\t\t\tNaN, NaN, NaN, NaN,\n\t\t);\n\n\t\tthis._worldMatrixNeedsUpdate = true;\n\t\tthis._worldMatrix = new Matrix4x4(\n\t\t\tNaN, NaN, NaN, NaN,\n\t\t\tNaN, NaN, NaN, NaN,\n\t\t\tNaN, NaN, NaN, NaN,\n\t\t\tNaN, NaN, NaN, NaN,\n\t\t);\n\n\t\tif (this._camera !== null) {\n\t\t\tthis._camera._node = this;\n\t\t}\n\n\t\tif (this._light !== null) {\n\t\t\tthis._light._node = this;\n\t\t}\n\n\t\tif (this._children !== null) {\n\t\t\tfor (const child of this._children) {\n\t\t\t\tchild._parent = this;\n\t\t\t}\n\t\t}\n\t}\n\n\tset name(value: string) { this._name = value; }\n\tget name(): string { return this._name; }\n\n\tsetTranslation(value: Vector3Object): Node {\n\t\tthis._translation.setObject(value);\n\t\tthis._localMatrixNeedsUpdate = true;\n\t\tthis._setWorldMatrixNeedsUpdateRecursive(true);\n\t\treturn this;\n\t}\n\n\tgetTranslation(res: Vector3): Vector3 {\n\t\treturn res.setObject(this._translation);\n\t}\n\n\tsetRotation(value: QuaternionObject): Node {\n\t\tthis._rotation.setObject(value);\n\t\tthis._localMatrixNeedsUpdate = true;\n\t\tthis._setWorldMatrixNeedsUpdateRecursive(true);\n\t\treturn this;\n\t}\n\n\tgetRotation(res: Quaternion): Quaternion {\n\t\treturn res.setObject(this._rotation);\n\t}\n\n\tsetScale(value: Vector3Object): Node {\n\t\tthis._scale.setObject(value);\n\t\tthis._localMatrixNeedsUpdate = true;\n\t\tthis._setWorldMatrixNeedsUpdateRecursive(true);\n\t\treturn this;\n\t}\n\n\tgetScale(res: Vector3): Vector3 {\n\t\treturn res.setObject(this._scale);\n\t}\n\n\tset camera(value: Camera | null) {\n\t\tif (value !== null) {\n\t\t\tthis.attachCamera(value);\n\t\t} else {\n\t\t\tthis.detachCamera();\n\t\t}\n\t}\n\tget camera(): Camera | null { return this._camera; }\n\n\tattachCamera(camera: Camera): Node {\n\t\tif (this._camera !== null) {\n\t\t\tthis._camera._node = null;\n\t\t}\n\n\t\tthis._camera = camera;\n\n\t\tif (camera._node !== null) {\n\t\t\tcamera._node._camera = null;\n\t\t}\n\n\t\tcamera._node = this;\n\t\tthis._camera = camera;\n\t\treturn this;\n\t}\n\n\tdetachCamera(): Node {\n\t\tif (this._camera === null) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._camera._node = null;\n\t\tthis._camera = null;\n\t\treturn this;\n\t}\n\n\tset light(value: Light | null) {\n\t\tif (value !== null) {\n\t\t\tthis.attachLight(value);\n\t\t} else {\n\t\t\tthis.detachLight();\n\t\t}\n\t}\n\tget light(): Light | null { return this._light; }\n\n\tattachLight(light: Light): Node {\n\t\tif (this._light !== null) {\n\t\t\tthis._light._node = null;\n\t\t}\n\n\t\tthis._light = light;\n\n\t\tif (light._node !== null) {\n\t\t\tlight._node._light = null;\n\t\t}\n\n\t\tlight._node = this;\n\t\tthis._light = light;\n\t\treturn this;\n\t}\n\n\tdetachLight(): Node {\n\t\tif (this._light === null) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._light._node = null;\n\t\tthis._light = null;\n\t\treturn this;\n\t}\n\n\tset mesh(value: Mesh | null) { this._mesh = value; }\n\tget mesh(): Mesh | null { return this._mesh; }\n\n\tsetMaterials(value: readonly (Material | DynamicMaterial)[]): Node {\n\t\tthis._materials.length = 0;\n\t\tthis._materials.push(...value);\n\t\treturn this;\n\t}\n\n\tgetMaterials(res: (Material | DynamicMaterial)[]): (Material | DynamicMaterial)[] {\n\t\tres.length = 0;\n\t\tres.push(...this._materials);\n\t\treturn res;\n\t}\n\n\t// TODO children\n\n\tset parent(value: Node | null) {\n\t\tif (value !== null) {\n\t\t\tthis.attach(value);\n\t\t} else {\n\t\t\tthis.detach();\n\t\t}\n\t}\n\tget parent(): Node | null { return this._parent; }\n\n\tattach(node: Node): Node {\n\t\tif (this._parent !== null) {\n\t\t\tthis._parent._children.splice(this._parent._children.indexOf(this), 1);\n\t\t}\n\n\t\tnode._children.push(this);\n\t\tthis._parent = node;\n\t\tthis._setWorldMatrixNeedsUpdateRecursive(true);\n\t\treturn this;\n\t}\n\n\tdetach(): Node {\n\t\tif (this._parent === null) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._parent._children.splice(this._parent._children.indexOf(this), 1);\n\t\tthis._parent = null;\n\t\tthis._setWorldMatrixNeedsUpdateRecursive(true);\n\t\treturn this;\n\t}\n\n\tgetLocalMatrix(res: Matrix4x4): Matrix4x4 {\n\t\tthis._updateLocalMatrix();\n\t\tres.setObject(this._localMatrix);\n\t\treturn res;\n\t}\n\n\tgetWorldMatrix(res: Matrix4x4): Matrix4x4 {\n\t\tthis._updateWorldMatrix();\n\t\tres.setObject(this._worldMatrix);\n\t\treturn res;\n\t}\n\n\t_updateLocalMatrix(): Node {\n\t\tif (!this._localMatrixNeedsUpdate) {\n\t\t\treturn this;\n\t\t}\n\t\tthis._localMatrix.setTranslationRotationScale(this._translation, this._rotation, this._scale);\n\t\tthis._localMatrixNeedsUpdate = false;\n\t\treturn this;\n\t}\n\n\t_updateWorldMatrix(): Node {\n\t\tif (!this._worldMatrixNeedsUpdate) {\n\t\t\treturn this;\n\t\t}\n\t\tthis._updateLocalMatrix();\n\t\tif (this._parent !== null) {\n\t\t\tthis._parent.getWorldMatrix(this._worldMatrix);\n\t\t\tthis._worldMatrix.premulMatrix(this._localMatrix);\n\t\t} else {\n\t\t\tthis._worldMatrix.setObject(this._localMatrix);\n\t\t}\n\t\treturn this;\n\t}\n\n\t_setWorldMatrixNeedsUpdateRecursive(value: boolean): Node {\n\t\tthis._localMatrixNeedsUpdate = true;\n\t\tfor (const child of this._children) {\n\t\t\tchild._setWorldMatrixNeedsUpdateRecursive(value);\n\t\t}\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(Node.prototype, \"type\", { value: \"Node\" });\n\nexport function isNode(value: unknown): value is Node {\n\treturn Boolean(value) && (value as Node).type === \"Node\";\n}\n\nexport function* preOrder(nodes: Iterable): Generator {\n\tfor (const node of nodes) {\n\t\tyield node;\n\t\tyield* node._children;\n\t}\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nexport interface QuaternionObject {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly z: number;\n\treadonly w: number;\n}\n\nexport type QuaternionTuple = readonly [x: number, y: number, z: number, w: number];\n\nexport class Quaternion {\n\n\tdeclare readonly type: \"Quaternion\";\n\n\tx: number;\n\ty: number;\n\tz: number;\n\tw: number;\n\n\tconstructor(x: number, y: number, z: number, w: number) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\t}\n\n\tstatic fromObject(object: QuaternionObject): Quaternion {\n\t\treturn new Quaternion(object.x, object.y, object.z, object.w);\n\t}\n\n\tstatic fromTuple(tuple: QuaternionTuple): Quaternion {\n\t\treturn new Quaternion(...tuple);\n\t}\n\n\tstatic identity(): Quaternion {\n\t\treturn new Quaternion(0, 0, 0, 1);\n\t}\n\n\tstatic fromRotationXY(angleRad: number): Quaternion {\n\t\tconst halfAngleRad = 0.5 * angleRad;\n\t\tconst c = Math.cos(halfAngleRad);\n\t\tconst s = Math.sin(halfAngleRad);\n\t\treturn new Quaternion(0, 0, s, c);\n\t}\n\n\tstatic fromRotationYZ(angleRad: number): Quaternion {\n\t\tconst halfAngleRad = 0.5 * angleRad;\n\t\tconst c = Math.cos(halfAngleRad);\n\t\tconst s = Math.sin(halfAngleRad);\n\t\treturn new Quaternion(s, 0, 0, c);\n\t}\n\n\tstatic fromRotationZX(angleRad: number): Quaternion {\n\t\tconst halfAngleRad = 0.5 * angleRad;\n\t\tconst c = Math.cos(halfAngleRad);\n\t\tconst s = Math.sin(halfAngleRad);\n\t\treturn new Quaternion(0, s, 0, c);\n\t}\n\n\tsetObject(object: QuaternionObject): Quaternion {\n\t\tthis.x = object.x;\n\t\tthis.y = object.y;\n\t\tthis.z = object.z;\n\t\tthis.w = object.w;\n\t\treturn this;\n\t}\n\n\tsetTuple(tuple: QuaternionTuple): Quaternion {\n\t\tthis.x = tuple[0];\n\t\tthis.y = tuple[1];\n\t\tthis.z = tuple[2];\n\t\tthis.w = tuple[3];\n\t\treturn this;\n\t}\n\n\tsetIdentity(): Quaternion {\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.z = 0;\n\t\tthis.w = 1;\n\t\treturn this;\n\t}\n\n\tsetRotationXY(angleRad: number): Quaternion {\n\t\tconst halfAngleRad = 0.5 * angleRad;\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.z = Math.sin(halfAngleRad);\n\t\tthis.w = Math.cos(halfAngleRad);\n\t\treturn this;\n\t}\n\n\tsetRotationYZ(angleRad: number): Quaternion {\n\t\tconst halfAngleRad = 0.5 * angleRad;\n\t\tthis.x = Math.sin(halfAngleRad);\n\t\tthis.y = 0;\n\t\tthis.z = 0;\n\t\tthis.w = Math.cos(halfAngleRad);\n\t\treturn this;\n\t}\n\n\tsetRotationZX(angleRad: number): Quaternion {\n\t\tconst halfAngleRad = 0.5 * angleRad;\n\t\tthis.x = 0;\n\t\tthis.y = Math.sin(halfAngleRad);\n\t\tthis.z = 0;\n\t\tthis.w = Math.cos(halfAngleRad);\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(Quaternion.prototype, \"type\", { value: \"Quaternion\" });\n\nexport function isQuaternion(value: unknown): value is Quaternion {\n\treturn Boolean(value) && (value as Quaternion).type === \"Quaternion\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Color, ColorObject, Node } from \".\";\n\nexport interface SceneProps {\n\treadonly name?: string;\n\n\treadonly nodes?: Node[];\n\n\treadonly ambientLight?: ColorObject;\n}\n\nexport class Scene {\n\n\tdeclare readonly type: \"Scene\";\n\n\t_name: string;\n\n\t_nodes: Node[];\n\n\t_ambientLight: Color;\n\n\tconstructor({\n\t\tname = \"\",\n\t\tnodes = [],\n\t\tambientLight,\n\t}: SceneProps) {\n\t\tthis._name = name;\n\n\t\tthis._nodes = nodes;\n\n\t\tthis._ambientLight = ambientLight !== undefined ? Color.fromObject(ambientLight) : Color.black();\n\t}\n\n\tset name(value: string) { this._name = value; }\n\tget name(): string { return this._name; }\n\n\tsetAmbientLight(value: ColorObject): Scene {\n\t\tthis._ambientLight.setObject(value);\n\t\treturn this;\n\t}\n\n\tgetAmbientLight(res: Color): Color {\n\t\treturn res.setObject(this._ambientLight);\n\t}\n}\n\nObject.defineProperty(Scene.prototype, \"type\", { value: \"Scene\" });\n\nexport function isScene(value: unknown): value is Scene {\n\treturn Boolean(value) && (value as Scene).type === \"Scene\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nexport interface Vector2Object {\n\treadonly x: number;\n\treadonly y: number;\n}\n\nexport type Vector2Tuple = readonly [x: number, y: number];\n\nexport class Vector2 {\n\n\tdeclare readonly type: \"Vector2\";\n\n\tx: number;\n\ty: number;\n\n\tconstructor(x: number, y: number) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\tstatic fromObject(object: Vector2Object): Vector2 {\n\t\treturn new Vector2(object.x, object.y);\n\t}\n\n\tstatic fromTuple(tuple: Vector2Tuple): Vector2 {\n\t\treturn new Vector2(...tuple);\n\t}\n\n\tstatic zero(): Vector2 {\n\t\treturn new Vector2(0, 0);\n\t}\n\n\tstatic one(): Vector2 {\n\t\treturn new Vector2(1, 1);\n\t}\n\n\tset(x: number, y: number): Vector2 {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\treturn this;\n\t}\n\n\tsetObject(object: Vector2Object): Vector2 {\n\t\tthis.x = object.x;\n\t\tthis.y = object.y;\n\t\treturn this;\n\t}\n\n\tsetTuple(tuple: Vector2Tuple): Vector2 {\n\t\tthis.x = tuple[0];\n\t\tthis.y = tuple[1];\n\t\treturn this;\n\t}\n\n\tsetZero(): Vector2 {\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\treturn this;\n\t}\n\n\tsetOne(): Vector2 {\n\t\tthis.x = 1;\n\t\tthis.y = 1;\n\t\treturn this;\n\t}\n\n\tsetX(x: number): Vector2 {\n\t\tthis.x = x;\n\t\treturn this;\n\t}\n\n\tsetY(y: number): Vector2 {\n\t\tthis.y = y;\n\t\treturn this;\n\t}\n\n\tnormalize(): Vector2 {\n\t\tconst l = Math.sqrt(this.x * this.x + this.y * this.y);\n\t\tthis.x /= l;\n\t\tthis.y /= l;\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(Vector2.prototype, \"type\", { value: \"Vector2\" });\n\nexport function isVector2(value: unknown): value is Vector2 {\n\treturn Boolean(value) && (value as Vector2).type === \"Vector2\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nexport interface Vector3Object {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly z: number;\n}\n\nexport type Vector3Tuple = readonly [x: number, y: number, z: number];\n\nexport class Vector3 {\n\n\tdeclare readonly type: \"Vector3\";\n\n\tx: number;\n\ty: number;\n\tz: number;\n\n\tconstructor(x: number, y: number, z: number) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\n\tstatic fromObject(object: Vector3Object): Vector3 {\n\t\treturn new Vector3(object.x, object.y, object.z);\n\t}\n\n\tstatic fromTuple(tuple: Vector3Tuple): Vector3 {\n\t\treturn new Vector3(...tuple);\n\t}\n\n\tstatic zero(): Vector3 {\n\t\treturn new Vector3(0, 0, 0);\n\t}\n\n\tstatic one(): Vector3 {\n\t\treturn new Vector3(1, 1, 1);\n\t}\n\n\tset(x: number, y: number, z: number): Vector3 {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\treturn this;\n\t}\n\n\tsetObject(object: Vector3Object): Vector3 {\n\t\tthis.x = object.x;\n\t\tthis.y = object.y;\n\t\tthis.z = object.z;\n\t\treturn this;\n\t}\n\n\tsetTuple(tuple: Vector3Tuple): Vector3 {\n\t\tthis.x = tuple[0];\n\t\tthis.y = tuple[1];\n\t\tthis.z = tuple[2];\n\t\treturn this;\n\t}\n\n\tsetZero(): Vector3 {\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.z = 0;\n\t\treturn this;\n\t}\n\n\tsetOne(): Vector3 {\n\t\tthis.x = 1;\n\t\tthis.y = 1;\n\t\tthis.z = 1;\n\t\treturn this;\n\t}\n\n\tsetX(x: number): Vector3 {\n\t\tthis.x = x;\n\t\treturn this;\n\t}\n\n\tsetY(y: number): Vector3 {\n\t\tthis.y = y;\n\t\treturn this;\n\t}\n\n\tsetZ(z: number): Vector3 {\n\t\tthis.z = z;\n\t\treturn this;\n\t}\n\n\tnormalize(): Vector3 {\n\t\tconst l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n\t\tthis.x /= l;\n\t\tthis.y /= l;\n\t\tthis.z /= l;\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(Vector3.prototype, \"type\", { value: \"Vector3\" });\n\nexport function isVector3(value: unknown): value is Vector3 {\n\treturn Boolean(value) && (value as Vector3).type === \"Vector3\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nexport interface Vector4Object {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly z: number;\n\treadonly w: number;\n}\n\nexport type Vector4Tuple = readonly [x: number, y: number, z: number, w: number];\n\nexport class Vector4 {\n\n\tdeclare readonly type: \"Vector4\";\n\n\tx: number;\n\ty: number;\n\tz: number;\n\tw: number;\n\n\tconstructor(x: number, y: number, z: number, w: number) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\t}\n\n\tstatic fromObject(object: Vector4Object): Vector4 {\n\t\treturn new Vector4(object.x, object.y, object.z, object.w);\n\t}\n\n\tstatic fromTuple(tuple: Vector4Tuple): Vector4 {\n\t\treturn new Vector4(...tuple);\n\t}\n\n\tstatic zero(): Vector4 {\n\t\treturn new Vector4(0, 0, 0, 0);\n\t}\n\n\tstatic one(): Vector4 {\n\t\treturn new Vector4(1, 1, 1, 1);\n\t}\n\n\tset(x: number, y: number, z: number, w: number): Vector4 {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\t\treturn this;\n\t}\n\n\tsetObject(object: Vector4Object): Vector4 {\n\t\tthis.x = object.x;\n\t\tthis.y = object.y;\n\t\tthis.z = object.z;\n\t\tthis.w = object.w;\n\t\treturn this;\n\t}\n\n\tsetTuple(tuple: Vector4Tuple): Vector4 {\n\t\tthis.x = tuple[0];\n\t\tthis.y = tuple[1];\n\t\tthis.z = tuple[2];\n\t\tthis.w = tuple[3];\n\t\treturn this;\n\t}\n\n\tsetZero(): Vector4 {\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.z = 0;\n\t\tthis.w = 0;\n\t\treturn this;\n\t}\n\n\tsetOne(): Vector4 {\n\t\tthis.x = 1;\n\t\tthis.y = 1;\n\t\tthis.z = 1;\n\t\tthis.w = 1;\n\t\treturn this;\n\t}\n\n\tsetX(x: number): Vector4 {\n\t\tthis.x = x;\n\t\treturn this;\n\t}\n\n\tsetY(y: number): Vector4 {\n\t\tthis.y = y;\n\t\treturn this;\n\t}\n\n\tsetZ(z: number): Vector4 {\n\t\tthis.z = z;\n\t\treturn this;\n\t}\n\n\tsetW(w: number): Vector4 {\n\t\tthis.w = w;\n\t\treturn this;\n\t}\n\n\tnormalize(): Vector4 {\n\t\tconst l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n\t\tthis.x /= l;\n\t\tthis.y /= l;\n\t\tthis.z /= l;\n\t\tthis.w /= l;\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(Vector4.prototype, \"type\", { value: \"Vector4\" });\n\nexport function isVector4(value: unknown): value is Vector4 {\n\treturn Boolean(value) && (value as Vector4).type === \"Vector4\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { ColorObject, Matrix4x4Object, Vector2Object, Vector3Object, Vector4Object } from \"./data\";\n\nexport class _BinaryWriter {\n\n\tstatic readonly DEFAULT_CAPACITY = 16;\n\n\t_buffer: ArrayBuffer;\n\t_dataView: DataView;\n\t_typedArray: Uint8Array;\n\t_length: number;\n\n\tget subarray(): Uint8Array { return new Uint8Array(this._buffer, 0, this._length); }\n\n\tconstructor(capacity = _BinaryWriter.DEFAULT_CAPACITY) {\n\t\tcapacity = Math.max(capacity, 1);\n\t\tthis._buffer = new ArrayBuffer(capacity);\n\t\tthis._dataView = new DataView(this._buffer);\n\t\tthis._typedArray = new Uint8Array(this._buffer);\n\t\tthis._length = 0;\n\t}\n\n\tclear(): _BinaryWriter {\n\t\tthis._length = 0;\n\t\treturn this;\n\t}\n\n\tensureCapacity(desiredCapacity: number): _BinaryWriter {\n\t\tif (this._buffer.byteLength >= desiredCapacity) {\n\t\t\treturn this;\n\t\t}\n\n\t\tlet newCapacity = this._buffer.byteLength * 2;\n\t\twhile (newCapacity < desiredCapacity) {\n\t\t\tnewCapacity *= 2;\n\t\t}\n\n\t\tconst newBuffer = new ArrayBuffer(newCapacity);\n\t\tconst newDataView = new DataView(newBuffer);\n\t\tconst newTypedArray = new Uint8Array(newBuffer);\n\n\t\tnewTypedArray.set(this.subarray);\n\n\t\tthis._buffer = newBuffer;\n\t\tthis._dataView = newDataView;\n\t\tthis._typedArray = newTypedArray;\n\t\treturn this;\n\t}\n\n\tensureUnusedCapacity(desiredUnusedCapacity: number): _BinaryWriter {\n\t\treturn this.ensureCapacity(this._length + desiredUnusedCapacity);\n\t}\n\n\twriteU32(value: number): _BinaryWriter {\n\t\tthis.ensureUnusedCapacity(4);\n\t\tthis._dataView.setUint32(this._length, value, true);\n\t\tthis._length += 4;\n\t\treturn this;\n\t}\n\n\twriteF32(value: number): _BinaryWriter {\n\t\tthis.ensureUnusedCapacity(4);\n\t\tthis._dataView.setFloat32(this._length, value, true);\n\t\tthis._length += 4;\n\t\treturn this;\n\t}\n\n\twriteVector2(value: Vector2Object): _BinaryWriter {\n\t\tthis.writeF32(value.x);\n\t\tthis.writeF32(value.y);\n\t\treturn this;\n\t}\n\n\twriteVector3(value: Vector3Object): _BinaryWriter {\n\t\tthis.writeF32(value.x);\n\t\tthis.writeF32(value.y);\n\t\tthis.writeF32(value.z);\n\t\treturn this;\n\t}\n\n\twriteVector4(value: Vector4Object): _BinaryWriter {\n\t\tthis.writeF32(value.x);\n\t\tthis.writeF32(value.y);\n\t\tthis.writeF32(value.z);\n\t\tthis.writeF32(value.w);\n\t\treturn this;\n\t}\n\n\twriteMatrix4x4(value: Matrix4x4Object): _BinaryWriter {\n\t\tthis.writeF32(value.ix);\n\t\tthis.writeF32(value.iy);\n\t\tthis.writeF32(value.iz);\n\t\tthis.writeF32(value.iw);\n\t\tthis.writeF32(value.jx);\n\t\tthis.writeF32(value.jy);\n\t\tthis.writeF32(value.jz);\n\t\tthis.writeF32(value.jw);\n\t\tthis.writeF32(value.kx);\n\t\tthis.writeF32(value.ky);\n\t\tthis.writeF32(value.kz);\n\t\tthis.writeF32(value.kw);\n\t\tthis.writeF32(value.tx);\n\t\tthis.writeF32(value.ty);\n\t\tthis.writeF32(value.tz);\n\t\tthis.writeF32(value.tw);\n\t\treturn this;\n\t}\n\n\twriteColorF32(value: ColorObject): _BinaryWriter {\n\t\tthis.writeF32(value.r);\n\t\tthis.writeF32(value.g);\n\t\tthis.writeF32(value.b);\n\t\treturn this;\n\t}\n\n\tpadToAlign(alignment: number): _BinaryWriter {\n\t\tconst alignedLength = (this._length + alignment - 1) & ~(alignment - 1);\n\t\tconst padding = alignedLength - this._length;\n\t\tif (padding === 0) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.ensureUnusedCapacity(padding);\n\t\tthis._typedArray.fill(0, this._length, alignedLength);\n\t\tthis._length = alignedLength;\n\t\treturn this;\n\t}\n\n\talloc(byteLength: number): DataView {\n\t\tthis.ensureUnusedCapacity(byteLength);\n\t\tconst dataView = new DataView(this._buffer, this._length, byteLength);\n\t\tthis._length += byteLength;\n\t\treturn dataView;\n\t}\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nexport function degToRad(angleDeg: number): number {\n\treturn angleDeg * Math.PI / 180;\n}\n\nexport function radToDeg(angleRad: number): number {\n\treturn angleRad * 180 / Math.PI;\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Renderer } from \"./oktaeder\";\n\n// 152 bytes padded to 256\nexport const GLOBAL_UNIFORMS_SIZE = 256;\n// 64 bytes padded to 256\nexport const MATERIAL_UNIFORMS_SIZE = 256;\n// 128 bytes padded to 256\nexport const OBJECT_UNIFORMS_SIZE = 256;\n\nexport type ShaderFlagKey = number;\n\nexport interface ShaderFlags {\n\treadonly texCoord: boolean;\n\treadonly lightTexCoord: boolean;\n\treadonly normal: boolean;\n\treadonly tangent: boolean;\n}\n\nexport function _shaderFlagsKey({\n\ttexCoord,\n\tlightTexCoord,\n\tnormal,\n\ttangent,\n}: ShaderFlags): ShaderFlagKey {\n\tlet key = 0;\n\tkey |= Number(texCoord) << 0;\n\tkey |= Number(lightTexCoord) << 1;\n\tkey |= Number(normal) << 2;\n\tkey |= Number(tangent) << 3;\n\treturn key;\n}\n\nexport function _createPipeline(renderer: Renderer, {\n\ttexCoord,\n\tlightTexCoord,\n\tnormal,\n\ttangent,\n}: ShaderFlags): GPURenderPipeline {\n\tconst shaderCode = _createShaderCode({ texCoord, lightTexCoord, normal, tangent });\n\n\tconst shaderModule = renderer._device.createShaderModule({\n\t\tcode: shaderCode,\n\t\tcompilationHints: [\n\t\t\t{ entryPoint: \"vert\", layout: renderer._pipelineLayout },\n\t\t\t{ entryPoint: \"frag\", layout: renderer._pipelineLayout },\n\t\t],\n\t});\n\n\tlet vertexLocation = 0;\n\n\tconst pipeline = renderer._device.createRenderPipeline({\n\t\tlayout: renderer._pipelineLayout,\n\t\tvertex: {\n\t\t\tentryPoint: \"vert\",\n\t\t\tmodule: shaderModule,\n\t\t\tbuffers: [\n\t\t\t\t{\n\t\t\t\t\tarrayStride: 12,\n\t\t\t\t\tattributes: [{\n\t\t\t\t\t\tshaderLocation: vertexLocation++,\n\t\t\t\t\t\tformat: \"float32x3\",\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t}],\n\t\t\t\t},\n\t\t\t\t...(texCoord ? [{\n\t\t\t\t\tarrayStride: 8,\n\t\t\t\t\tattributes: [{\n\t\t\t\t\t\tshaderLocation: vertexLocation++,\n\t\t\t\t\t\tformat: \"float32x2\",\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t}],\n\t\t\t\t} satisfies GPUVertexBufferLayout] : []),\n\t\t\t\t...(lightTexCoord ? [{\n\t\t\t\t\tarrayStride: 8,\n\t\t\t\t\tattributes: [{\n\t\t\t\t\t\tshaderLocation: vertexLocation++,\n\t\t\t\t\t\tformat: \"float32x2\",\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t}],\n\t\t\t\t} satisfies GPUVertexBufferLayout] : []),\n\t\t\t\t...(normal ? [{\n\t\t\t\t\tarrayStride: 12,\n\t\t\t\t\tattributes: [{\n\t\t\t\t\t\tshaderLocation: vertexLocation++,\n\t\t\t\t\t\tformat: \"float32x3\",\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t}],\n\t\t\t\t} satisfies GPUVertexBufferLayout] : []),\n\t\t\t\t...(tangent ? [{\n\t\t\t\t\tarrayStride: 16,\n\t\t\t\t\tattributes: [{\n\t\t\t\t\t\tshaderLocation: vertexLocation++,\n\t\t\t\t\t\tformat: \"float32x4\",\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t}],\n\t\t\t\t} satisfies GPUVertexBufferLayout] : []),\n\t\t\t],\n\t\t},\n\t\tfragment: {\n\t\t\tentryPoint: \"frag\",\n\t\t\tmodule: shaderModule,\n\t\t\ttargets: [{\n\t\t\t\tformat: renderer._format,\n\t\t\t\tblend: {\n\t\t\t\t\tcolor: {\n\t\t\t\t\t\toperation: \"add\",\n\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t},\n\t\t\t\t\talpha: {\n\t\t\t\t\t\toperation: \"add\",\n\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\twriteMask: GPUColorWrite.ALL,\n\t\t\t}],\n\t\t},\n\t\tdepthStencil: {\n\t\t\tdepthCompare: \"greater\",\n\t\t\tdepthWriteEnabled: true,\n\t\t\tformat: \"depth32float\",\n\t\t},\n\t\tprimitive: {\n\t\t\tcullMode: \"back\",\n\t\t\tfrontFace: \"ccw\",\n\t\t\ttopology: \"triangle-list\",\n\t\t},\n\t});\n\n\treturn pipeline;\n}\n\nexport function _createShaderCode({\n\ttexCoord,\n\tlightTexCoord,\n\tnormal,\n\ttangent,\n}: ShaderFlags): string {\n\treturn `\nstruct Vertex {\n\t@location(0) positionOS: vec3,\n\t${texCoord ? `@location(1) texCoord: vec2,` : \"\"}\n\t${lightTexCoord ? `@location(2) lightTexCoord: vec2,` : \"\"}\n\t${normal ? `@location(3) normalOS: vec3,` : \"\"}\n\t${normal && tangent ? `@location(4) tangentOS: vec4,` : \"\"}\n}\n\nstruct Varyings {\n\t@builtin(position) positionCS: vec4,\n\t@location(0) positionVS: vec3,\n\t${texCoord ? `@location(1) texCoord: vec2,` : \"\"}\n\t${lightTexCoord ? `@location(2) lightTexCoord: vec2,` : \"\"}\n\t${normal ? `@location(3) normalVS: vec3,` : \"\"}\n\t${normal && tangent ? `@location(4) tangentVS: vec3,` : \"\"}\n\t${normal && tangent ? `@location(5) bitangentVS: vec3,` : \"\"}\n}\n\nstruct PointLight {\n\tpositionWS: vec3,\n\tcolor: vec3,\n}\n\nstruct DirectionalLight {\n\tdirectionWS: vec3,\n\tcolor: vec3,\n}\n\nstruct GlobalUniforms {\n\tmatrixWStoVS: mat4x4,\n\tmatrixVStoCS: mat4x4,\n\tambientLight: vec3,\n\tpointLightCount: u32,\n\tdirectionalLightCount: u32,\n}\n\nstruct MaterialUniforms {\n\tbaseColor: vec3,\n\tpartialCoverage: f32,\n\ttransmission: vec3,\n\tcollimation: f32,\n\tocclusionTextureStrength: f32,\n\troughness: f32,\n\tmetallic: f32,\n\tnormalScale: f32,\n\temissive: vec3,\n\tior: f32,\n}\n\nstruct ObjectUniforms {\n\tmatrixOStoWS: mat4x4,\n\tmatrixOStoWSNormal: mat4x4,\n}\n\n@group(0) @binding(0) var _Global: GlobalUniforms;\n@group(1) @binding(0) var _Material: MaterialUniforms;\n@group(2) @binding(0) var _Object: ObjectUniforms;\n\n@group(0) @binding(1) var _PointLights: array;\n@group(0) @binding(2) var _DirectionalLights: array;\n\n@group(1) @binding(1) var _Sampler: sampler;\n@group(1) @binding(2) var _BaseColorPartialCoverageTexture: texture_2d;\n@group(1) @binding(3) var _OcclusionTexture: texture_2d;\n@group(1) @binding(4) var _RoughnessMetallicTexture: texture_2d;\n@group(1) @binding(5) var _NormalTexture: texture_2d;\n@group(1) @binding(6) var _EmissiveTexture: texture_2d;\n@group(1) @binding(7) var _TransmissionCollimationTexture: texture_2d;\n\nconst INV_PI: f32 = 0.31830987;\n\nfn fresnelSchlick(dotVH: f32, f0: vec3) -> vec3 {\n\tconst f90 = vec3(1.0);\n\treturn f0 + (f90 - f0) * pow(1.0 - dotVH, 5.0);\n}\n\nfn visibilityGGX(dotNL: f32, dotNV: f32, alpha: f32) -> f32 {\n\tlet alphaSquared = alpha * alpha;\n\n\tlet vGGX = dotNL * sqrt(dotNV * dotNV * (1.0 - alphaSquared) + alphaSquared);\n\tlet lGGX = dotNV * sqrt(dotNL * dotNL * (1.0 - alphaSquared) + alphaSquared);\n\tlet GGX = vGGX + lGGX;\n\treturn select(0.0, 0.5 / GGX, GGX > 0.0);\n}\n\nfn distributionGGX(dotNH: f32, alpha: f32) -> f32 {\n\tlet alphaSquared = alpha * alpha;\n\tlet tmp = dotNH * dotNH * (alphaSquared - 1.0) + 1.0;\n\treturn alphaSquared * INV_PI / (tmp * tmp);\n}\n\nfn toneMapAcesNarkowicz(color: vec3) -> vec3 {\n\tconst A: f32 = 2.51;\n\tconst B: f32 = 0.03;\n\tconst C: f32 = 2.43;\n\tconst D: f32 = 0.59;\n\tconst E: f32 = 0.14;\n\treturn saturate((color * (A * color + B)) / (color * (C * color + D) + E));\n}\n\nfn lightOutgoingRadiance(\n\tviewDirectionVS: vec3, actualNormalVS: vec3, dotNV: f32,\n\tbaseColor: vec3, alpha: f32, metallic: f32, f0: vec3,\n\tincomingRadiance: vec3, lightDirectionVS: vec3,\n) -> vec3 {\n\tlet halfVectorVS = normalize(lightDirectionVS + viewDirectionVS);\n\tlet dotVH = saturate(dot(viewDirectionVS, halfVectorVS));\n\tlet dotNH = saturate(dot(actualNormalVS, halfVectorVS));\n\tlet dotNL = saturate(dot(actualNormalVS, lightDirectionVS));\n\n\tlet fresnel = fresnelSchlick(dotVH, f0);\n\tlet visibility = visibilityGGX(dotNL, dotNV, alpha);\n\tlet distribution = distributionGGX(dotNH, alpha);\n\n\tlet scatteredFactor = (1.0 - fresnel) * (1.0 - metallic) * baseColor * INV_PI;\n\tlet reflectedFactor = fresnel * visibility * distribution;\n\n\treturn (scatteredFactor + reflectedFactor) * incomingRadiance * dotNL;\n}\n\nfn screenSpaceMatrixTStoVS(positionVS: vec3, normalVS: vec3, texCoord: vec2) -> mat3x3 {\n\tlet q0 = dpdx(positionVS);\n\tlet q1 = dpdy(positionVS);\n\tlet uv0 = dpdx(texCoord);\n\tlet uv1 = dpdy(texCoord);\n\n\tlet q1perp = cross(q1, normalVS);\n\tlet q0perp = cross(normalVS, q0);\n\n\tlet tangentVS = q1perp * uv0.x + q0perp * uv1.x;\n\tlet bitangentVS = q1perp * uv0.y + q0perp * uv1.y;\n\n\tlet det = max(dot(tangentVS, tangentVS), dot(bitangentVS, bitangentVS));\n\tlet scale = select(0.0, inverseSqrt(det), det != 0.0);\n\n\treturn mat3x3(tangentVS * scale, bitangentVS * scale, normalVS);\n}\n\n@vertex\nfn vert(vertex: Vertex) -> Varyings {\n\tvar output: Varyings;\n\tlet positionWS = (_Object.matrixOStoWS * vec4(vertex.positionOS, 1.0)).xyz;\n\tlet positionVS = (_Global.matrixWStoVS * vec4(positionWS, 1.0)).xyz;\n\tlet positionCS = _Global.matrixVStoCS * vec4(positionVS, 1.0);\n\toutput.positionCS = positionCS;\n\toutput.positionVS = positionVS;\n\t${normal ? `\n\t\tlet normalWS = normalize((_Object.matrixOStoWSNormal * vec4(vertex.normalOS, 0.0)).xyz);\n\t\tlet normalVS = normalize((_Global.matrixWStoVS * vec4(normalWS, 0.0)).xyz);\n\t\toutput.normalVS = normalVS;\n\t\t${tangent ? `\n\t\t\tlet tangentWS = normalize((_Object.matrixOStoWS * vec4(vertex.tangentOS.xyz, 0.0)).xyz);\n\t\t\tlet tangentVS = normalize((_Global.matrixWStoVS * vec4(tangentWS, 0.0)).xyz);\n\t\t\tlet bitangentVS = vertex.tangentOS.w * normalize(cross(normalVS, tangentVS));\n\t\t\toutput.tangentVS = tangentVS;\n\t\t\toutput.bitangentVS = bitangentVS;\n\t\t` : \"\"}\n\t` : \"\"}\n\t${texCoord ? \"output.texCoord = vertex.texCoord;\" : \"\"}\n\t${lightTexCoord ? \"output.lightTexCoord = vertex.lightTexCoord;\" : \"\"}\n\treturn output;\n}\n\n@fragment\nfn frag(fragment: Varyings) -> @location(0) vec4 {\n\tvar baseColor = _Material.baseColor;\n\tvar partialCoverage = _Material.partialCoverage;\n\tvar occlusion = 1.0;\n\tvar roughness = _Material.roughness;\n\tvar metallic = _Material.metallic;\n\tvar normalScale = _Material.normalScale;\n\tvar emissive = _Material.emissive;\n\tvar ior = _Material.ior;\n\t${texCoord ? `\n\t\tlet baseColorPartialCoverageTexel = textureSample(_BaseColorPartialCoverageTexture, _Sampler, fragment.texCoord);\n\t\tbaseColor *= baseColorPartialCoverageTexel.rgb;\n\t\tpartialCoverage *= baseColorPartialCoverageTexel.a;\n\t\tlet roughnessMetallicTexel = textureSample(_RoughnessMetallicTexture, _Sampler, fragment.texCoord);\n\t\troughness *= roughnessMetallicTexel.g;\n\t\tmetallic *= roughnessMetallicTexel.b;\n\t\tlet emissiveTexel = textureSample(_EmissiveTexture, _Sampler, fragment.texCoord);\n\t\temissive *= emissiveTexel.rgb;\n\t` : \"\"}\n\t${lightTexCoord ? `\n\t\tlet occlusionTexel = textureSample(_OcclusionTexture, _Sampler, fragment.lightTexCoord);\n\t\tocclusion += _Material.occlusionTextureStrength * (occlusionTexel.r - 1.0);\n\t` : \"\"}\n\n\tlet positionVS = fragment.positionVS;\n\t${normal ? `\n\t\tlet geometricNormalVS = fragment.normalVS;\n\t` : `\n\t\tlet dPositionVSdx = dpdx(positionVS);\n\t\tlet dPositionVSdy = dpdy(positionVS);\n\t\tlet geometricNormalVS = normalize(cross(dPositionVSdx, dPositionVSdy));\n\t`}\n\t${texCoord ? `\n\t\t${tangent ? `\n\t\t\tlet tangentVS = normalize(fragment.tangentVS);\n\t\t\tlet bitangentVS = normalize(fragment.bitangentVS);\n\t\t\tlet matrixTStoVS = mat3x3(tangentVS, bitangentVS, geometricNormalVS);\n\t\t` : `\n\t\t\tlet matrixTStoVS = screenSpaceMatrixTStoVS(positionVS, geometricNormalVS, fragment.texCoord);\n\t\t`}\n\t\tlet normalTextureTexel = textureSample(_NormalTexture, _Sampler, fragment.texCoord);\n\t\tvar normalTS = normalTextureTexel.xyz * 2.0 - 1.0;\n\t\tnormalTS = vec3(normalTS.xy * _Material.normalScale, normalTS.z);\n\t\tlet actualNormalVS = normalize(matrixTStoVS * normalTS);\n\t` : `\n\t\tlet actualNormalVS = geometricNormalVS;\n\t`}\n\n\tlet viewDirectionVS = normalize(-positionVS);\n\tlet dotNV = saturate(dot(actualNormalVS, viewDirectionVS));\n\tlet alpha = roughness * roughness;\n\n\tvar f0 = vec3(pow((ior - 1.0) / (ior + 1.0), 2.0));\n\tf0 = mix(f0, baseColor, metallic);\n\n\tvar outgoingRadiance = vec3(0.0);\n\n\tfor (var i: u32 = 0; i < _Global.pointLightCount; i++) {\n\t\tlet light = _PointLights[i];\n\n\t\tlet lightPositionVS = (_Global.matrixWStoVS * vec4(light.positionWS, 1.0)).xyz;\n\t\tlet lightDirectionVS = normalize(lightPositionVS - positionVS);\n\t\tlet lightDistance = distance(positionVS, lightPositionVS);\n\t\tlet lightAttenuation = 1.0 / (lightDistance * lightDistance);\n\t\tlet incomingRadiance = light.color * lightAttenuation;\n\n\t\toutgoingRadiance += lightOutgoingRadiance(\n\t\t\tviewDirectionVS, actualNormalVS, dotNV,\n\t\t\tbaseColor, alpha, metallic, f0,\n\t\t\tincomingRadiance, lightDirectionVS,\n\t\t);\n\t}\n\n\tfor (var i: u32 = 0; i < _Global.directionalLightCount; i++) {\n\t\tlet light = _DirectionalLights[i];\n\n\t\tlet lightDirectionVS = normalize((_Global.matrixWStoVS * vec4(light.directionWS, 0.0)).xyz);\n\t\tlet incomingRadiance = light.color;\n\n\t\toutgoingRadiance += lightOutgoingRadiance(\n\t\t\tviewDirectionVS, actualNormalVS, dotNV,\n\t\t\tbaseColor, alpha, metallic, f0,\n\t\t\tincomingRadiance, lightDirectionVS,\n\t\t);\n\t}\n\n\toutgoingRadiance += _Global.ambientLight * baseColor * occlusion;\n\n\tlet toneMappedLinearColor = toneMapAcesNarkowicz(outgoingRadiance);\n\tlet toneMappedSrgbColor = pow(toneMappedLinearColor, vec3(1.0 / 2.2));\n\n\treturn vec4(toneMappedSrgbColor, 1.0);\n}`;\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nexport class _Mapping {\n\ttable: T[];\n\tmap: Map;\n\n\tconstructor() {\n\t\tthis.table = [];\n\t\tthis.map = new Map();\n\t}\n\n\tadd(item: T) {\n\t\tif (this.map.has(item)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst id = this.table.length;\n\t\tthis.table.push(item);\n\t\tthis.map.set(item, id);\n\t}\n\n\tget(item: T): number | undefined {\n\t\treturn this.map.get(item);\n\t}\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Renderer } from \"../oktaeder\";\n\nexport interface IndexBufferProps {\n\treadonly name?: string;\n\n\treadonly indexFormat: \"uint16\" | \"uint32\";\n\treadonly indexCount: number;\n}\n\nexport interface IndexBufferResizeProps {\n\treadonly indexFormat?: \"uint16\" | \"uint32\";\n\treadonly indexCount?: number;\n}\n\nexport class IndexBuffer {\n\n\tdeclare readonly type: \"IndexBuffer\";\n\t_renderer: Renderer;\n\n\t_name: string;\n\n\t_buffer: GPUBuffer;\n\t_indexFormat: \"uint16\" | \"uint32\";\n\n\tconstructor(renderer: Renderer, {\n\t\tname = \"\",\n\t\tindexFormat,\n\t\tindexCount,\n\t}: IndexBufferProps) {\n\t\tthis._renderer = renderer;\n\n\t\tthis._name = name;\n\n\t\tthis._buffer = renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX,\n\t\t\tsize: indexCount * indexSize(indexFormat),\n\t\t\tlabel: name,\n\t\t});\n\t\tthis._indexFormat = indexFormat;\n\t}\n\n\t/**\n\t * Destroys owned GPU resources. The index buffer should not be used after\n\t * calling this method.\n\t * @returns `this` for chaining\n\t */\n\tdispose(): IndexBuffer {\n\t\tthis._buffer.destroy();\n\t\treturn this;\n\t}\n\n\tget indexCount(): number {\n\t\treturn this._buffer.size / indexSize(this._indexFormat) | 0;\n\t}\n\n\twriteArray(offset: number, indices: readonly number[]): IndexBuffer {\n\t\tconst array = this._indexFormat === \"uint16\" ? new Uint16Array(indices) : new Uint32Array(indices);\n\t\treturn this.writeTypedArray(offset, array);\n\t}\n\n\twriteTypedArray(offset: number, indices: Uint16Array | Uint32Array): IndexBuffer {\n\t\tif (\n\t\t\tthis._indexFormat === \"uint16\" && !(indices instanceof Uint16Array)\n\t\t\t|| this._indexFormat === \"uint32\" && !(indices instanceof Uint32Array)\n\t\t) {\n\t\t\tthrow new Error(`Cannot write typed array to a mismatched index type. Typed array is of type ${indices.constructor.name}. Index buffer [${this._name}] uses format ${this._indexFormat}`);\n\t\t}\n\t\tthis._renderer._device.queue.writeBuffer(this._buffer, offset * indexSize(this._indexFormat) | 0, indices);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resize the index buffer, discarding currently stored data.\n\t * @param props Desired buffer properties. Any unspecified property will\n\t * stay unchanged.\n\t * @returns `this` for chaining\n\t */\n\tresizeDiscard({\n\t\tindexFormat = this._indexFormat,\n\t\tindexCount = this.indexCount,\n\t}: IndexBufferResizeProps): IndexBuffer {\n\t\tthis._buffer.destroy();\n\n\t\tthis._buffer = this._renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDEX,\n\t\t\tsize: indexCount * indexSize(indexFormat),\n\t\t\tlabel: this._name,\n\t\t});\n\t\tthis._indexFormat = indexFormat;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resize the index buffer if it can't hold provided number of indices or\n\t * its index format is smaller than provided, potentially discarding\n\t * currently stored data.\n\t * @param props Desired buffer properties. Any unspecified property will\n\t * be ignored.\n\t * @returns `this` for chaining\n\t */\n\tensureSizeDiscard({\n\t\tindexFormat = this._indexFormat,\n\t\tindexCount = this.indexCount,\n\t}: IndexBufferResizeProps): IndexBuffer {\n\t\tif (this.indexCount >= indexCount && indexSize(this._indexFormat) >= indexSize(indexFormat)) {\n\t\t\treturn this;\n\t\t}\n\t\treturn this.resizeDiscard({\n\t\t\tindexFormat,\n\t\t\tindexCount,\n\t\t});\n\t}\n\n\tget indexFormat(): \"uint16\" | \"uint32\" { return this._indexFormat; }\n\tget indexSize(): number { return indexSize(this._indexFormat); }\n}\n\nObject.defineProperty(IndexBuffer.prototype, \"type\", { value: \"IndexBuffer\" });\n\nexport function isIndexBuffer(value: unknown): value is IndexBuffer {\n\treturn Boolean(value) && (value as IndexBuffer).type === \"IndexBuffer\";\n}\n\nfunction indexSize(indexFormat: \"uint16\" | \"uint32\"): number {\n\tswitch (indexFormat) {\n\t\tcase \"uint16\": return 2;\n\t\tcase \"uint32\": return 4;\n\t}\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Texture2D } from \".\";\nimport { Color, MaterialProps } from \"../data\";\nimport { Renderer, _BinaryWriter } from \"../oktaeder\";\n\nexport class Material {\n\n\tdeclare readonly type: \"Material\";\n\t_renderer: Renderer;\n\n\t_uniformBuffer: GPUBuffer;\n\t_bindGroup: GPUBindGroup;\n\n\t_name: string;\n\n\treadonly _baseColor: Color;\n\treadonly _partialCoverage: number;\n\treadonly _occlusionTextureStrength: number;\n\treadonly _metallic: number;\n\treadonly _roughness: number;\n\treadonly _normalScale: number;\n\treadonly _emissive: Color;\n\treadonly _transmission: Color;\n\treadonly _collimation: number;\n\treadonly _ior: number;\n\n\treadonly _baseColorPartialCoverageTexture: Texture2D | null;\n\treadonly _occlusionTexture: Texture2D | null;\n\treadonly _roughnessMetallicTexture: Texture2D | null;\n\treadonly _normalTexture: Texture2D | null;\n\treadonly _emissiveTexture: Texture2D | null;\n\treadonly _transmissionCollimationTexture: Texture2D | null;\n\n\treadonly _transparent: boolean;\n\treadonly _doubleSided: boolean;\n\n\tconstructor(renderer: Renderer, {\n\t\tname = \"\",\n\t\tbaseColor,\n\t\tpartialCoverage = 1,\n\t\tocclusionTextureStrength = 1,\n\t\tmetallic = 1,\n\t\troughness = 1,\n\t\tnormalScale = 1,\n\t\temissive,\n\t\ttransmission,\n\t\tcollimation = 1,\n\t\tior = 1.45,\n\t\tbaseColorPartialCoverageTexture = null,\n\t\tocclusionTexture = null,\n\t\troughnessMetallicTexture = null,\n\t\tnormalTexture = null,\n\t\temissiveTexture = null,\n\t\ttransmissionCollimationTexture = null,\n\t\ttransparent = false,\n\t\tdoubleSided = false,\n\t}: MaterialProps) {\n\t\tthis._renderer = renderer;\n\n\t\tthis._name = name;\n\n\t\tthis._baseColor = baseColor !== undefined ? Color.fromObject(baseColor) : Color.white();\n\t\tthis._partialCoverage = partialCoverage;\n\t\tthis._occlusionTextureStrength = occlusionTextureStrength;\n\t\tthis._metallic = metallic;\n\t\tthis._roughness = roughness;\n\t\tthis._normalScale = normalScale;\n\t\tthis._emissive = emissive !== undefined ? Color.fromObject(emissive) : Color.black();\n\t\tthis._transmission = transmission !== undefined ? Color.fromObject(transmission) : Color.black();\n\t\tthis._collimation = collimation;\n\t\tthis._ior = ior;\n\n\t\tthis._baseColorPartialCoverageTexture = baseColorPartialCoverageTexture;\n\t\tthis._occlusionTexture = occlusionTexture;\n\t\tthis._roughnessMetallicTexture = roughnessMetallicTexture;\n\t\tthis._normalTexture = normalTexture;\n\t\tthis._emissiveTexture = emissiveTexture;\n\t\tthis._transmissionCollimationTexture = transmissionCollimationTexture;\n\n\t\tthis._transparent = transparent;\n\t\tthis._doubleSided = doubleSided;\n\n\t\tthis._uniformBuffer = renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM,\n\t\t\tsize: 64,\n\t\t\tlabel: name,\n\t\t});\n\n\t\tconst writer = new _BinaryWriter(64);\n\t\twriter.writeColorF32(this._baseColor);\n\t\twriter.writeF32(this._partialCoverage);\n\t\twriter.writeColorF32(this._transmission);\n\t\twriter.writeF32(this._collimation);\n\t\twriter.writeF32(this._occlusionTextureStrength);\n\t\twriter.writeF32(this._roughness);\n\t\twriter.writeF32(this._metallic);\n\t\twriter.writeF32(this._normalScale);\n\t\twriter.writeColorF32(this._emissive);\n\t\twriter.writeF32(this._ior);\n\n\t\trenderer._device.queue.writeBuffer(this._uniformBuffer, 0, writer.subarray);\n\n\t\tthis._bindGroup = renderer._device.createBindGroup({\n\t\t\tlayout: renderer._materialBindGroupLayout,\n\t\t\tentries: [\n\t\t\t\t{ binding: 0, resource: { buffer: this._uniformBuffer, size: 64 } },\n\t\t\t\t{ binding: 1, resource: renderer._sampler },\n\t\t\t\t{ binding: 2, resource: this._baseColorPartialCoverageTexture?._textureView ?? renderer._textureWhite._textureView },\n\t\t\t\t{ binding: 3, resource: this._occlusionTexture?._textureView ?? renderer._textureWhite._textureView },\n\t\t\t\t{ binding: 4, resource: this._roughnessMetallicTexture?._textureView ?? renderer._textureWhite._textureView },\n\t\t\t\t{ binding: 5, resource: this._normalTexture?._textureView ?? renderer._textureNormal._textureView },\n\t\t\t\t{ binding: 6, resource: this._emissiveTexture?._textureView ?? renderer._textureWhite._textureView },\n\t\t\t\t{ binding: 7, resource: this._transmissionCollimationTexture?._textureView ?? renderer._textureBlack._textureView },\n\t\t\t],\n\t\t\tlabel: name,\n\t\t});\n\t}\n\n\t/**\n\t * Destroys owned GPU resources. The index buffer should not be used after\n\t * calling this method.\n\t * @returns `this` for chaining\n\t */\n\tdispose(): Material {\n\t\tthis._uniformBuffer.destroy();\n\t\treturn this;\n\t}\n\n\tgetBaseColor(res: Color): Color {\n\t\treturn res.setObject(this._baseColor);\n\t}\n\n\tget partialCoverage(): number { return this._partialCoverage; }\n\tget occlusionTextureStrength(): number { return this._occlusionTextureStrength; }\n\tget metallic(): number { return this._metallic; }\n\tget roughness(): number { return this._roughness; }\n\tget normalScale(): number { return this._normalScale; }\n\n\tgetEmissive(res: Color): Color {\n\t\treturn res.setObject(this._emissive);\n\t}\n\n\tgetTransmission(res: Color): Color {\n\t\treturn res.setObject(this._transmission);\n\t}\n\n\tget collimation(): number { return this._collimation; }\n\tget ior(): number { return this._ior; }\n\tget baseColorPartialCoverageTexture(): Texture2D | null { return this._baseColorPartialCoverageTexture; }\n\tget occlusionTexture(): Texture2D | null { return this._occlusionTexture; }\n\tget roughnessMetallicTexture(): Texture2D | null { return this._roughnessMetallicTexture; }\n\tget normalTexture(): Texture2D | null { return this._normalTexture; }\n\tget emissiveTexture(): Texture2D | null { return this._emissiveTexture; }\n\tget transmissionCollimationTexture(): Texture2D | null { return this._transmissionCollimationTexture; }\n\n\tget transparent(): boolean { return this._transparent; }\n\tget doubleSided(): boolean { return this._doubleSided; }\n}\n\nObject.defineProperty(Material.prototype, \"type\", { value: \"Material\" });\n\nexport function isMaterial(value: unknown): value is Material {\n\treturn Boolean(value) && (value as Material).type === \"Material\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Vector2Object, Vector2Tuple } from \"../data\";\nimport { Renderer } from \"../oktaeder\";\n\nexport type Texture2DFormat =\n\t| \"linear\"\n\t| \"srgb\"\n\t| \"hdr\"\n\t| \"depth\"\n\t;\n\nexport interface Texture2DProps {\n\treadonly name?: string;\n\n\treadonly width: number;\n\treadonly height: number;\n\n\treadonly format: Texture2DFormat;\n\n\treadonly usage?: GPUTextureUsageFlags;\n}\n\nexport interface Texture2DResizeProps {\n\treadonly width?: number;\n\treadonly height?: number;\n\treadonly format?: Texture2DFormat;\n\treadonly usage?: GPUTextureUsageFlags;\n}\n\nexport interface Texture2DAdvancedWriteProps {\n\treadonly origin: Vector2Object | Vector2Tuple,\n\treadonly data: BufferSource | SharedArrayBuffer,\n\treadonly bytesPerRow: number,\n\treadonly width: number,\n\treadonly height: number,\n}\n\nexport class Texture2D {\n\n\tdeclare readonly type: \"Texture2D\";\n\t_renderer: Renderer;\n\n\t_name: string;\n\n\t_texture: GPUTexture;\n\t_textureView: GPUTextureView;\n\t_format: Texture2DFormat;\n\n\tconstructor(renderer: Renderer, {\n\t\tname = \"\",\n\t\twidth,\n\t\theight,\n\t\tformat,\n\t\tusage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n\t}: Texture2DProps) {\n\t\tthis._renderer = renderer;\n\n\t\tthis._name = name;\n\n\t\tconst gpuFormat = gpuTextureFormat(format);\n\n\t\tthis._renderer = renderer;\n\t\tthis._texture = renderer._device.createTexture({\n\t\t\tusage,\n\t\t\tsize: { width, height },\n\t\t\tformat: gpuFormat,\n\t\t\tlabel: name\n\t\t});\n\t\tthis._textureView = this._texture.createView({\n\t\t\tformat: gpuFormat,\n\t\t\tdimension: \"2d\",\n\t\t\tlabel: `${name}.textureView`,\n\t\t});\n\t\tthis._format = format;\n\t}\n\n\t/**\n\t * Destroys owned GPU resources. The texture should not be used after\n\t * calling this method.\n\t * @returns `this` for chaining\n\t */\n\tdispose(): Texture2D {\n\t\tthis._texture.destroy();\n\t\treturn this;\n\t}\n\n\tget width(): number {\n\t\treturn this._texture.width;\n\t}\n\n\tget height(): number {\n\t\treturn this._texture.height;\n\t}\n\n\tget bytesPerSample(): number {\n\t\treturn sampleSize(this._format);\n\t}\n\n\tget samplesPerPixel(): number {\n\t\treturn sampleCount(this._format);\n\t}\n\n\twriteFull(data: BufferSource | SharedArrayBuffer): Texture2D {\n\t\tconst bytesPerSample = this.bytesPerSample;\n\t\tconst samplesPerPixel = this.samplesPerPixel;\n\t\tconst bytesPerRow = this.width * samplesPerPixel * bytesPerSample;\n\t\tconst byteLength = this.height * bytesPerRow;\n\n\t\tif (data.byteLength !== byteLength) {\n\t\t\tthrow new Error(`Cannot fully write to a texture with different byte length. Source data has byte length of ${data.byteLength}. Texture [${this._name}] is ${this.width}\u00D7${this.height} pixels in size, uses ${this._format} format at ${bytesPerSample} ${bytesPerSample === 1 ? \"byte\" : \"bytes\"} per sample and ${samplesPerPixel} ${samplesPerPixel === 1 ? \"sample\" : \"samples\"} per pixel, which makes its byte length equal to ${byteLength}.`);\n\t\t}\n\n\t\tthis._renderer._device.queue.writeTexture(\n\t\t\t{ texture: this._texture },\n\t\t\tdata,\n\t\t\t{ bytesPerRow },\n\t\t\t{ width: this.width, height: this.height },\n\t\t);\n\t\treturn this;\n\t}\n\n\twritePartial({\n\t\torigin,\n\t\tdata,\n\t\tbytesPerRow,\n\t\twidth,\n\t\theight,\n\t}: Texture2DAdvancedWriteProps): Texture2D {\n\t\tthis._renderer._device.queue.writeTexture(\n\t\t\t{ texture: this._texture, origin },\n\t\t\tdata,\n\t\t\t{ bytesPerRow },\n\t\t\t{ width, height },\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resize the texture and/or change its format, discarding currently stored\n\t * data.\n\t * @param props Desired texture properties. Any unspecified property will\n\t * stay unchanged.\n\t * @returns `this` for chaining\n\t */\n\tresizeDiscard({\n\t\twidth = this._texture.width,\n\t\theight = this._texture.height,\n\t\tformat = this._format,\n\t\tusage = this._texture.usage,\n\t}: Texture2DResizeProps): Texture2D {\n\t\tthis._texture.destroy();\n\n\t\tconst gpuFormat = gpuTextureFormat(format);\n\n\t\tthis._texture = this._renderer._device.createTexture({\n\t\t\tusage,\n\t\t\tsize: { width, height },\n\t\t\tformat: gpuFormat,\n\t\t\tlabel: this._name\n\t\t});\n\t\tthis._textureView = this._texture.createView({\n\t\t\tformat: gpuFormat,\n\t\t\tdimension: \"2d\",\n\t\t\tlabel: `${this._name}.textureView`,\n\t\t});\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(Texture2D.prototype, \"type\", { value: \"Texture2D\" });\n\nexport function isTexture2D(value: unknown): value is Texture2D {\n\treturn Boolean(value) && (value as Texture2D).type === \"Texture2D\";\n}\n\nfunction gpuTextureFormat(format: Texture2DFormat): GPUTextureFormat {\n\tswitch (format) {\n\t\tcase \"linear\": return \"rgba8unorm\";\n\t\tcase \"srgb\": return \"rgba8unorm-srgb\";\n\t\tcase \"hdr\": return \"rgba16float\";\n\t\tcase \"depth\": return \"depth32float\";\n\t}\n}\n\nfunction sampleCount(format: Texture2DFormat): number {\n\tswitch (format) {\n\t\tcase \"linear\": return 4;\n\t\tcase \"srgb\": return 4;\n\t\tcase \"hdr\": return 4;\n\t\tcase \"depth\": return 1;\n\t}\n}\n\nfunction sampleSize(format: Texture2DFormat): number {\n\tswitch (format) {\n\t\tcase \"linear\": return 1;\n\t\tcase \"srgb\": return 1;\n\t\tcase \"hdr\": return 2;\n\t\tcase \"depth\": return 4;\n\t}\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport { Vector2Object, Vector3Object, Vector4Object } from \"../data\";\nimport { Renderer } from \"../oktaeder\";\n\nexport const POSITION_SIZE = 12;\nexport const TEX_COORD_SIZE = 8;\nexport const LIGHT_TEX_COORD_SIZE = 8;\nexport const NORMAL_SIZE = 12;\nexport const TANGENT_SIZE = 16;\n\nexport interface VertexBufferProps {\n\treadonly name?: string;\n\n\treadonly vertexCount: number;\n\n\treadonly texCoord?: boolean;\n\treadonly lightTexCoord?: boolean;\n\treadonly normal?: boolean;\n\treadonly tangent?: boolean;\n}\n\nexport interface VertexBufferResizeProps {\n\treadonly vertexCount?: number;\n\n\treadonly texCoord?: boolean;\n\treadonly lightTexCoord?: boolean;\n\treadonly normal?: boolean;\n\treadonly tangent?: boolean;\n}\n\nexport interface VertexBufferWriteArrayProps {\n\treadonly position?: readonly Vector3Object[];\n\treadonly texCoord?: readonly Vector2Object[];\n\treadonly lightTexCoord?: readonly Vector2Object[];\n\treadonly normal?: readonly Vector3Object[];\n\treadonly tangent?: readonly Vector4Object[];\n}\n\nexport interface VertexBufferWriteTypedArrayProps {\n\treadonly position?: Float32Array;\n\treadonly texCoord?: Float32Array;\n\treadonly lightTexCoord?: Float32Array;\n\treadonly normal?: Float32Array;\n\treadonly tangent?: Float32Array;\n}\n\nexport class VertexBuffer {\n\n\tdeclare readonly type: \"VertexBuffer\";\n\t_renderer: Renderer;\n\n\t_name: string;\n\n\t_positionBuffer: GPUBuffer;\n\t_texCoordBuffer: GPUBuffer | null;\n\t_lightTexCoordBuffer: GPUBuffer | null;\n\t_normalBuffer: GPUBuffer | null;\n\t_tangentBuffer: GPUBuffer | null;\n\n\tconstructor(renderer: Renderer, {\n\t\tname = \"\",\n\t\tvertexCount,\n\t\ttexCoord = false,\n\t\tlightTexCoord = false,\n\t\tnormal = false,\n\t\ttangent = false,\n\t}: VertexBufferProps) {\n\t\tthis._renderer = renderer;\n\n\t\tthis._name = name;\n\n\t\tthis._positionBuffer = renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * POSITION_SIZE,\n\t\t\tlabel: `${this._name}.position`,\n\t\t});\n\n\t\tthis._texCoordBuffer = texCoord ? renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * TEX_COORD_SIZE,\n\t\t\tlabel: `${this._name}.texCoord`,\n\t\t}) : null;\n\n\t\tthis._lightTexCoordBuffer = lightTexCoord ? renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * LIGHT_TEX_COORD_SIZE,\n\t\t\tlabel: `${this._name}.lightTexCoord`,\n\t\t}) : null;\n\n\t\tthis._normalBuffer = normal ? renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * NORMAL_SIZE,\n\t\t\tlabel: `${this._name}.normal`,\n\t\t}) : null;\n\n\t\tthis._tangentBuffer = tangent ? renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * TANGENT_SIZE,\n\t\t\tlabel: `${this._name}.tangent`,\n\t\t}) : null;\n\t}\n\n\t/**\n\t * Destroys owned GPU resources. The vertex buffer should not be used after\n\t * calling this method.\n\t * @returns `this` for chaining\n\t */\n\tdispose(): VertexBuffer {\n\t\tthis._positionBuffer.destroy();\n\t\tthis._texCoordBuffer?.destroy();\n\t\tthis._lightTexCoordBuffer?.destroy();\n\t\tthis._normalBuffer?.destroy();\n\t\tthis._tangentBuffer?.destroy();\n\t\treturn this;\n\t}\n\n\tget vertexCount(): number {\n\t\treturn this._positionBuffer.size / POSITION_SIZE | 0;\n\t}\n\n\tget hasTexCoord(): boolean {\n\t\treturn this._texCoordBuffer !== null;\n\t}\n\n\tget hasLightTexCoord(): boolean {\n\t\treturn this._lightTexCoordBuffer !== null;\n\t}\n\n\tget hasNormal(): boolean {\n\t\treturn this._normalBuffer !== null;\n\t}\n\n\tget hasTangent(): boolean {\n\t\treturn this._tangentBuffer !== null;\n\t}\n\n\twriteArray(offset: number, {\n\t\tposition,\n\t\ttexCoord,\n\t\tlightTexCoord,\n\t\tnormal,\n\t\ttangent,\n\t}: VertexBufferWriteArrayProps): VertexBuffer {\n\n\t\tif (position !== undefined) {\n\t\t\tconst array = new Float32Array(position.length * 3);\n\t\t\tfor (let vi = 0, ptr = 0; vi < position.length; ++vi) {\n\t\t\t\tconst vertex = position[vi]!;\n\t\t\t\tarray[ptr++] = vertex.x;\n\t\t\t\tarray[ptr++] = vertex.y;\n\t\t\t\tarray[ptr++] = vertex.z;\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._positionBuffer, offset * POSITION_SIZE | 0, array);\n\t\t}\n\n\t\tif (texCoord !== undefined) {\n\t\t\tif (this._texCoordBuffer === null) {\n\t\t\t\tthrow new Error(`Cannot write array to a missing vertex attribute. Tried writing texture coordinates and vertex buffer [${this._name}] does not have texture coordinates.`);\n\t\t\t}\n\t\t\tconst array = new Float32Array(texCoord.length * 2);\n\t\t\tfor (let vi = 0, ptr = 0; vi < texCoord.length; ++vi) {\n\t\t\t\tconst vertex = texCoord[vi]!;\n\t\t\t\tarray[ptr++] = vertex.x;\n\t\t\t\tarray[ptr++] = vertex.y;\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._texCoordBuffer, offset * TEX_COORD_SIZE | 0, array);\n\t\t}\n\n\t\tif (lightTexCoord !== undefined) {\n\t\t\tif (this._lightTexCoordBuffer === null) {\n\t\t\t\tthrow new Error(`Cannot write array to a missing vertex attribute. Tried writing light texture coordinates and vertex buffer [${this._name}] does not have light texture coordinates.`);\n\t\t\t}\n\t\t\tconst array = new Float32Array(lightTexCoord.length * 2);\n\t\t\tfor (let vi = 0, ptr = 0; vi < lightTexCoord.length; ++vi) {\n\t\t\t\tconst vertex = lightTexCoord[vi]!;\n\t\t\t\tarray[ptr++] = vertex.x;\n\t\t\t\tarray[ptr++] = vertex.y;\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._lightTexCoordBuffer, offset * LIGHT_TEX_COORD_SIZE | 0, array);\n\t\t}\n\n\t\tif (normal !== undefined) {\n\t\t\tif (this._normalBuffer === null) {\n\t\t\t\tthrow new Error(`Cannot write array to a missing vertex attribute. Tried writing normals and vertex buffer [${this._name}] does not have normals.`);\n\t\t\t}\n\t\t\tconst array = new Float32Array(normal.length * 3);\n\t\t\tfor (let vi = 0, ptr = 0; vi < normal.length; ++vi) {\n\t\t\t\tconst vertex = normal[vi]!;\n\t\t\t\tarray[ptr++] = vertex.x;\n\t\t\t\tarray[ptr++] = vertex.y;\n\t\t\t\tarray[ptr++] = vertex.z;\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._normalBuffer, offset * NORMAL_SIZE | 0, array);\n\t\t}\n\n\t\tif (tangent !== undefined) {\n\t\t\tif (this._tangentBuffer === null) {\n\t\t\t\tthrow new Error(`Cannot write array to a missing vertex attribute. Tried writing tangents and vertex buffer [${this._name}] does not have tangents.`);\n\t\t\t}\n\t\t\tconst array = new Float32Array(tangent.length * 4);\n\t\t\tfor (let vi = 0, ptr = 0; vi < tangent.length; ++vi) {\n\t\t\t\tconst vertex = tangent[vi]!;\n\t\t\t\tarray[ptr++] = vertex.x;\n\t\t\t\tarray[ptr++] = vertex.y;\n\t\t\t\tarray[ptr++] = vertex.z;\n\t\t\t\tarray[ptr++] = vertex.w;\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._tangentBuffer, offset * TANGENT_SIZE | 0, array);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\twriteTypedArray(offset: number, {\n\t\tposition,\n\t\ttexCoord,\n\t\tlightTexCoord,\n\t\tnormal,\n\t\ttangent,\n\t}: VertexBufferWriteTypedArrayProps): VertexBuffer {\n\n\t\tif (position !== undefined) {\n\t\t\tthis._renderer._device.queue.writeBuffer(this._positionBuffer, offset * POSITION_SIZE | 0, position);\n\t\t}\n\n\t\tif (texCoord !== undefined) {\n\t\t\tif (this._texCoordBuffer === null) {\n\t\t\t\tthrow new Error(`Cannot write typed array to a missing vertex attribute. Tried writing texture coordinates and vertex buffer [${this._name}] does not have texture coordinates.`);\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._texCoordBuffer, offset * TEX_COORD_SIZE | 0, texCoord);\n\t\t}\n\n\t\tif (lightTexCoord !== undefined) {\n\t\t\tif (this._lightTexCoordBuffer === null) {\n\t\t\t\tthrow new Error(`Cannot write typed array to a missing vertex attribute. Tried writing light texture coordinates and vertex buffer [${this._name}] does not have light texture coordinates.`);\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._lightTexCoordBuffer, offset * LIGHT_TEX_COORD_SIZE | 0, lightTexCoord);\n\t\t}\n\n\t\tif (normal !== undefined) {\n\t\t\tif (this._normalBuffer === null) {\n\t\t\t\tthrow new Error(`Cannot write typed array to a missing vertex attribute. Tried writing normals and vertex buffer [${this._name}] does not have normals.`);\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._normalBuffer, offset * NORMAL_SIZE | 0, normal);\n\t\t}\n\n\t\tif (tangent !== undefined) {\n\t\t\tif (this._tangentBuffer === null) {\n\t\t\t\tthrow new Error(`Cannot write typed array to a missing vertex attribute. Tried writing tangents and vertex buffer [${this._name}] does not have tangents.`);\n\t\t\t}\n\t\t\tthis._renderer._device.queue.writeBuffer(this._tangentBuffer, offset * TANGENT_SIZE | 0, tangent);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resize the vertex buffer and/or add or remove vertex attributes,\n\t * discarding currently stored data.\n\t * @param props Desired buffer properties. Any unspecified property will\n\t * stay unchanged.\n\t * @returns `this` for chaining\n\t */\n\tresizeDiscard({\n\t\tvertexCount = this.vertexCount,\n\t\ttexCoord = this.hasTexCoord,\n\t\tlightTexCoord = this.hasLightTexCoord,\n\t\tnormal = this.hasNormal,\n\t\ttangent = this.hasTangent,\n\t}: VertexBufferResizeProps): VertexBuffer {\n\n\t\tthis._positionBuffer.destroy();\n\t\tthis._texCoordBuffer?.destroy();\n\t\tthis._lightTexCoordBuffer?.destroy();\n\t\tthis._normalBuffer?.destroy();\n\t\tthis._tangentBuffer?.destroy();\n\n\t\tthis._positionBuffer = this._renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * POSITION_SIZE,\n\t\t\tlabel: `${this._name}.position`,\n\t\t});\n\n\t\tthis._texCoordBuffer = texCoord ? this._renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * TEX_COORD_SIZE,\n\t\t\tlabel: `${this._name}.texCoord`,\n\t\t}) : null;\n\n\t\tthis._lightTexCoordBuffer = lightTexCoord ? this._renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * LIGHT_TEX_COORD_SIZE,\n\t\t\tlabel: `${this._name}.lightTexCoord`,\n\t\t}) : null;\n\n\t\tthis._normalBuffer = normal ? this._renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * NORMAL_SIZE,\n\t\t\tlabel: `${this._name}.normal`,\n\t\t}) : null;\n\n\t\tthis._tangentBuffer = tangent ? this._renderer._device.createBuffer({\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\tsize: vertexCount * TANGENT_SIZE,\n\t\t\tlabel: `${this._name}.tangent`,\n\t\t}) : null;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resize the vertex buffer and/or add vertex attributes if it can't hold\n\t * provided number of vertices or doesn't have provided attributes,\n\t * potentially discarding currently stored data.\n\t * @param props Desired buffer properties. Any unspecified property will be\n\t * ignored.\n\t * @returns `this` for chaining\n\t */\n\tensureSizeDiscard({\n\t\tvertexCount = this.vertexCount,\n\t\ttexCoord = this.hasTexCoord,\n\t\tlightTexCoord = this.hasLightTexCoord,\n\t\tnormal = this.hasNormal,\n\t\ttangent = this.hasTangent,\n\t}): VertexBuffer {\n\t\tconst currentVertexCount = this.vertexCount;\n\n\t\tif (currentVertexCount < vertexCount) {\n\t\t\tthis._positionBuffer.destroy();\n\t\t\tthis._positionBuffer = this._renderer._device.createBuffer({\n\t\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\t\tsize: vertexCount * POSITION_SIZE,\n\t\t\t\tlabel: `${this._name}.position`,\n\t\t\t});\n\t\t}\n\n\t\tif (currentVertexCount < vertexCount || texCoord && !this.hasTexCoord) {\n\t\t\tthis._texCoordBuffer?.destroy();\n\t\t\tthis._texCoordBuffer = this._renderer._device.createBuffer({\n\t\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\t\tsize: vertexCount * TEX_COORD_SIZE,\n\t\t\t\tlabel: `${this._name}.texCoord`,\n\t\t\t});\n\t\t}\n\n\t\tif (currentVertexCount < vertexCount || lightTexCoord && !this.hasLightTexCoord) {\n\t\t\tthis._lightTexCoordBuffer?.destroy();\n\t\t\tthis._lightTexCoordBuffer = this._renderer._device.createBuffer({\n\t\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\t\tsize: vertexCount * LIGHT_TEX_COORD_SIZE,\n\t\t\t\tlabel: `${this._name}.lightTexCoord`,\n\t\t\t});\n\t\t}\n\n\t\tif (currentVertexCount < vertexCount || normal && !this.hasNormal) {\n\t\t\tthis._normalBuffer?.destroy();\n\t\t\tthis._normalBuffer = this._renderer._device.createBuffer({\n\t\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\t\tsize: vertexCount * NORMAL_SIZE,\n\t\t\t\tlabel: `${this._name}.normal`,\n\t\t\t});\n\t\t}\n\n\t\tif (currentVertexCount < vertexCount || tangent && !this.hasTangent) {\n\t\t\tthis._tangentBuffer?.destroy();\n\t\t\tthis._tangentBuffer = this._renderer._device.createBuffer({\n\t\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.VERTEX,\n\t\t\t\tsize: vertexCount * TANGENT_SIZE,\n\t\t\t\tlabel: `${this._name}.tangent`,\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n}\n\nObject.defineProperty(VertexBuffer.prototype, \"type\", { value: \"VertexBuffer\" });\n\nexport function isVertexBuffer(value: unknown): value is VertexBuffer {\n\treturn Boolean(value) && (value as VertexBuffer).type === \"VertexBuffer\";\n}\n", "/*!\n * This Source Code Form is subject to the terms of the Mozilla Public License,\n * v. 2.0. If a copy of the MPL was not distributed with this file, You can\n * obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nexport * from \"./_BinaryWriter\";\nexport * from \"./geometry\";\nexport * from \"./shader\";\n\nimport { _BinaryWriter as BinaryWriter } from \"./_BinaryWriter\";\nimport { _Mapping as Mapping } from \"./_Mapping\";\nimport { Camera, DynamicMaterial, MaterialProps, Matrix4x4, Node, Scene, Vector3, isDirectionalLight, isDynamicMaterial, isPointLight, preOrder } from \"./data\";\nimport { IndexBuffer, IndexBufferProps, Material, Texture2D, Texture2DProps, VertexBuffer, VertexBufferProps, isMaterial } from \"./resources\";\nimport { GLOBAL_UNIFORMS_SIZE, MATERIAL_UNIFORMS_SIZE, OBJECT_UNIFORMS_SIZE, ShaderFlagKey, ShaderFlags, _createPipeline, _shaderFlagsKey } from \"./shader\";\n\nconst _matrixOStoWSNormal = new Matrix4x4(\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n);\n\nconst _matrixWStoVS = new Matrix4x4(\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n);\n\nconst _matrixVStoCS = new Matrix4x4(\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n\tNaN, NaN, NaN, NaN,\n);\n\nconst _directionWS = new Vector3(NaN, NaN, NaN);\nconst _positionWS = new Vector3(NaN, NaN, NaN);\n\nexport class Renderer {\n\n\t_adapter: GPUAdapter;\n\t_device: GPUDevice;\n\t_context: GPUCanvasContext;\n\t_format: GPUTextureFormat;\n\n\t/** 1\u00D71 rgba8unorm texture of [255, 255, 255, 255] */\n\t_textureWhite: Texture2D;\n\t/** 1\u00D71 rgba8unorm texture of [0, 0, 0, 255] */\n\t_textureBlack: Texture2D;\n\t/** 1\u00D71 rgba8unorm texture of [128, 128, 255, 255] */\n\t_textureNormal: Texture2D;\n\n\t_depthBuffer: Texture2D;\n\n\t_globalBindGroupLayout: GPUBindGroupLayout;\n\t_materialBindGroupLayout: GPUBindGroupLayout;\n\t_objectBindGroupLayout: GPUBindGroupLayout;\n\t_pipelineLayout: GPUPipelineLayout;\n\n\t_pipelineCache: Map;\n\n\t_uniformWriter: BinaryWriter;\n\t_uniformBuffer: GPUBuffer;\n\n\t_lightWriter: BinaryWriter;\n\t_pointLightBuffer: GPUBuffer;\n\t_directionalLightBuffer: GPUBuffer;\n\n\t_sampler: GPUSampler;\n\n\t_globalBindGroup: GPUBindGroup;\n\t_objectBindGroup: GPUBindGroup;\n\n\t/**\n\t * This constructor is intended primarily for internal use. Consider using\n\t * `Renderer.createIndexBuffer` instead.\n\t */\n\tprivate constructor(\n\t\tadapter: GPUAdapter,\n\t\tdevice: GPUDevice,\n\t\tcontext: GPUCanvasContext,\n\t\tformat: GPUTextureFormat,\n\t) {\n\t\tthis._adapter = adapter;\n\t\tthis._device = device;\n\t\tthis._context = context;\n\t\tthis._format = format;\n\n\t\tthis._textureWhite = new Texture2D(this, {\n\t\t\tname: \"White\",\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tformat: \"linear\",\n\t\t});\n\t\tthis._textureWhite.writeFull(new Uint8Array([255, 255, 255, 255]));\n\n\t\tthis._textureBlack = new Texture2D(this, {\n\t\t\tname: \"Black\",\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tformat: \"linear\",\n\t\t});\n\t\tthis._textureBlack.writeFull(new Uint8Array([0, 0, 0, 255]));\n\n\t\tthis._textureNormal = new Texture2D(this, {\n\t\t\tname: \"Normal\",\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\tformat: \"linear\",\n\t\t});\n\t\tthis._textureNormal.writeFull(new Uint8Array([128, 128, 255, 255]));\n\n\t\tconst framebufferTexture = this._context.getCurrentTexture();\n\t\tthis._depthBuffer = new Texture2D(this, {\n\t\t\tname: \"Depth Buffer\",\n\t\t\twidth: framebufferTexture.width,\n\t\t\theight: framebufferTexture.height,\n\t\t\tformat: \"depth\",\n\t\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT,\n\t\t});\n\n\t\tthis._globalBindGroupLayout = device.createBindGroupLayout({\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\t\t\tbuffer: {\n\t\t\t\t\t\thasDynamicOffset: true,\n\t\t\t\t\t\ttype: \"uniform\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\tbuffer: {\n\t\t\t\t\t\ttype: \"read-only-storage\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\tbuffer: {\n\t\t\t\t\t\ttype: \"read-only-storage\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tlabel: \"Global\",\n\t\t});\n\t\tthis._materialBindGroupLayout = device.createBindGroupLayout({\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\tbuffer: {\n\t\t\t\t\t\thasDynamicOffset: true,\n\t\t\t\t\t\ttype: \"uniform\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\tsampler: { type: \"filtering\" },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\ttexture: {\n\t\t\t\t\t\tsampleType: \"float\",\n\t\t\t\t\t\tviewDimension: \"2d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\ttexture: {\n\t\t\t\t\t\tsampleType: \"float\",\n\t\t\t\t\t\tviewDimension: \"2d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\ttexture: {\n\t\t\t\t\t\tsampleType: \"float\",\n\t\t\t\t\t\tviewDimension: \"2d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\ttexture: {\n\t\t\t\t\t\tsampleType: \"float\",\n\t\t\t\t\t\tviewDimension: \"2d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\ttexture: {\n\t\t\t\t\t\tsampleType: \"float\",\n\t\t\t\t\t\tviewDimension: \"2d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\t\ttexture: {\n\t\t\t\t\t\tsampleType: \"float\",\n\t\t\t\t\t\tviewDimension: \"2d\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tlabel: \"Material\",\n\t\t});\n\t\tthis._objectBindGroupLayout = device.createBindGroupLayout({\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tvisibility: GPUShaderStage.VERTEX,\n\t\t\t\t\tbuffer: {\n\t\t\t\t\t\thasDynamicOffset: true,\n\t\t\t\t\t\ttype: \"uniform\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tlabel: \"Object\",\n\t\t});\n\n\t\tthis._pipelineLayout = device.createPipelineLayout({\n\t\t\tbindGroupLayouts: [\n\t\t\t\tthis._globalBindGroupLayout,\n\t\t\t\tthis._materialBindGroupLayout,\n\t\t\t\tthis._objectBindGroupLayout,\n\t\t\t],\n\t\t});\n\n\t\tthis._pipelineCache = new Map();\n\n\t\tthis._uniformWriter = new BinaryWriter();\n\t\tthis._uniformBuffer = device.createBuffer({\n\t\t\tsize: 4 * 1024 * 1024,\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM,\n\t\t\tlabel: \"Uniform\",\n\t\t});\n\n\t\tthis._lightWriter = new BinaryWriter();\n\t\tthis._pointLightBuffer = device.createBuffer({\n\t\t\tsize: 1024 * 32,\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE,\n\t\t});\n\t\tthis._directionalLightBuffer = device.createBuffer({\n\t\t\tsize: 1024 * 32,\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE,\n\t\t});\n\n\t\tthis._sampler = device.createSampler({\n\t\t\taddressModeU: \"repeat\",\n\t\t\taddressModeV: \"repeat\",\n\t\t\taddressModeW: \"repeat\",\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\",\n\t\t\tmipmapFilter: \"linear\",\n\t\t\tmaxAnisotropy: 16,\n\t\t});\n\n\t\tthis._globalBindGroup = device.createBindGroup({\n\t\t\tlayout: this._globalBindGroupLayout,\n\t\t\tentries: [\n\t\t\t\t{ binding: 0, resource: { buffer: this._uniformBuffer, size: GLOBAL_UNIFORMS_SIZE } },\n\t\t\t\t{ binding: 1, resource: { buffer: this._pointLightBuffer } },\n\t\t\t\t{ binding: 2, resource: { buffer: this._directionalLightBuffer } },\n\t\t\t],\n\t\t\tlabel: \"Global\",\n\t\t});\n\t\tthis._objectBindGroup = device.createBindGroup({\n\t\t\tlayout: this._objectBindGroupLayout,\n\t\t\tentries: [\n\t\t\t\t{ binding: 0, resource: { buffer: this._uniformBuffer, size: OBJECT_UNIFORMS_SIZE } },\n\t\t\t],\n\t\t\tlabel: \"Object\",\n\t\t});\n\t}\n\n\tstatic async init(canvas: HTMLCanvasElement): Promise {\n\t\tif (!navigator.gpu) {\n\t\t\tthrow new Error(\"WebGPU is not supported\");\n\t\t}\n\n\t\tconst adapter = await navigator.gpu.requestAdapter({\n\t\t\tpowerPreference: \"high-performance\",\n\t\t});\n\t\tif (adapter === null) {\n\t\t\tthrow new Error(\"GPUAdapter is not available\");\n\t\t}\n\n\t\tconst device = await adapter.requestDevice();\n\n\t\tconst context = canvas.getContext(\"webgpu\");\n\t\tif (context === null) {\n\t\t\tthrow new Error(\"GPUCanvasContext is not available\");\n\t\t}\n\n\t\tconst format = navigator.gpu.getPreferredCanvasFormat();\n\t\tcontext.configure({ device, format });\n\n\t\treturn new Renderer(adapter, device, context, format);\n\t}\n\n\t/**\n\t * Disposes resources internal to the renderer. Doesn't dispose any objects\n\t * created with this renderer. The renderer should not be used after calling\n\t * this method.\n\t * @returns `this` for chaining\n\t */\n\tdispose(): Renderer {\n\t\tthis._textureWhite.dispose();\n\t\tthis._textureBlack.dispose();\n\t\tthis._textureNormal.dispose();\n\t\tthis._depthBuffer.dispose();\n\t\tthis._uniformBuffer.destroy();\n\t\tthis._directionalLightBuffer.destroy();\n\t\tthis._pointLightBuffer.destroy();\n\t\treturn this;\n\t}\n\n\tcreateIndexBuffer(props: IndexBufferProps): IndexBuffer {\n\t\treturn new IndexBuffer(this, props);\n\t}\n\n\tcreateMaterial(props: MaterialProps): Material {\n\t\treturn new Material(this, props);\n\t}\n\n\tcreateTexture(props: Texture2DProps): Texture2D {\n\t\treturn new Texture2D(this, props);\n\t}\n\n\tcreateVertexBuffer(props: VertexBufferProps): VertexBuffer {\n\t\treturn new VertexBuffer(this, props);\n\t}\n\n\t_getOrCreatePipeline(flags: ShaderFlags): GPURenderPipeline {\n\t\tconst key = _shaderFlagsKey(flags);\n\n\t\tlet pipeline = this._pipelineCache.get(key);\n\t\tif (pipeline !== undefined) {\n\t\t\treturn pipeline;\n\t\t}\n\n\t\tpipeline = _createPipeline(this, flags);\n\t\tthis._pipelineCache.set(key, pipeline);\n\t\treturn pipeline;\n\t}\n\n\trender(scene: Scene, camera: Camera): Renderer {\n\t\tconst cameraNode = camera._node;\n\t\tif (cameraNode === null) {\n\t\t\tthrow new Error(`Cannot render with a detached camera. Camera [${camera._name}] is not attached to a node.`);\n\t\t}\n\n\t\tconst { width, height } = this._context.getCurrentTexture();\n\t\tif (this._depthBuffer.width !== width || this._depthBuffer.height !== height) {\n\t\t\tthis._depthBuffer.resizeDiscard({\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t});\n\t\t}\n\n\t\tconst encoder = this._device.createCommandEncoder();\n\n\t\tconst pass = encoder.beginRenderPass({\n\t\t\tcolorAttachments: [{\n\t\t\t\tview: this._context.getCurrentTexture().createView(),\n\t\t\t\tloadOp: \"clear\",\n\t\t\t\tstoreOp: \"store\",\n\t\t\t}],\n\t\t\tdepthStencilAttachment: {\n\t\t\t\tview: this._depthBuffer._textureView,\n\t\t\t\tdepthClearValue: 0,\n\t\t\t\tdepthLoadOp: \"clear\",\n\t\t\t\tdepthStoreOp: \"store\",\n\t\t\t},\n\t\t});\n\n\t\tthis._uniformWriter.clear();\n\n\t\t// gather dynamic materials\n\n\t\tconst dynamicMaterialMapping = new Mapping();\n\t\tfor (const node of preOrder(scene._nodes)) {\n\t\t\tfor (const material of node._materials) {\n\t\t\t\tif (isDynamicMaterial(material)) {\n\t\t\t\t\tdynamicMaterialMapping.add(material);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst dynamicMaterialBindGroups = dynamicMaterialMapping.table.map((material) => {\n\t\t\tconst offset = this._uniformWriter._length;\n\t\t\tthis._uniformWriter.writeColorF32(material._baseColor);\n\t\t\tthis._uniformWriter.writeF32(material._partialCoverage);\n\t\t\tthis._uniformWriter.writeColorF32(material._transmission);\n\t\t\tthis._uniformWriter.writeF32(material._collimation);\n\t\t\tthis._uniformWriter.writeF32(material._occlusionTextureStrength);\n\t\t\tthis._uniformWriter.writeF32(material._roughness);\n\t\t\tthis._uniformWriter.writeF32(material._metallic);\n\t\t\tthis._uniformWriter.writeF32(material._normalScale);\n\t\t\tthis._uniformWriter.writeColorF32(material._emissive);\n\t\t\tthis._uniformWriter.writeF32(material._ior);\n\t\t\tthis._uniformWriter.padToAlign(256);\n\n\t\t\tconst bindGroup = this._device.createBindGroup({\n\t\t\t\tlayout: this._materialBindGroupLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{ binding: 0, resource: { buffer: this._uniformBuffer, size: MATERIAL_UNIFORMS_SIZE } },\n\t\t\t\t\t{ binding: 1, resource: this._sampler },\n\t\t\t\t\t{ binding: 2, resource: material._baseColorPartialCoverageTexture?._textureView ?? this._textureWhite._textureView },\n\t\t\t\t\t{ binding: 3, resource: material._occlusionTexture?._textureView ?? this._textureWhite._textureView },\n\t\t\t\t\t{ binding: 4, resource: material._roughnessMetallicTexture?._textureView ?? this._textureWhite._textureView },\n\t\t\t\t\t{ binding: 5, resource: material._normalTexture?._textureView ?? this._textureNormal._textureView },\n\t\t\t\t\t{ binding: 6, resource: material._emissiveTexture?._textureView ?? this._textureWhite._textureView },\n\t\t\t\t\t{ binding: 7, resource: material._transmissionCollimationTexture?._textureView ?? this._textureBlack._textureView },\n\t\t\t\t],\n\t\t\t\tlabel: material._name,\n\t\t\t});\n\t\t\treturn { offset, bindGroup };\n\t\t});\n\n\t\t// gather objects\n\n\t\tconst objectMapping = new Mapping();\n\t\tfor (const node of preOrder(scene._nodes)) {\n\t\t\tif (node._mesh !== null) {\n\t\t\t\tobjectMapping.add(node);\n\t\t\t}\n\t\t}\n\n\t\tconst objectOffsets = objectMapping.table.map((object) => {\n\t\t\tconst offset = this._uniformWriter._length;\n\t\t\tobject._updateWorldMatrix();\n\t\t\tthis._uniformWriter.writeMatrix4x4(object._worldMatrix);\n\t\t\tthis._uniformWriter.writeMatrix4x4(_matrixOStoWSNormal.setObject(object._worldMatrix).inverseTransposeAffine());\n\t\t\tthis._uniformWriter.padToAlign(256);\n\t\t\treturn offset;\n\t\t});\n\n\t\t// gather point lights\n\n\t\tthis._lightWriter.clear();\n\t\tlet pointLightCount = 0;\n\t\tfor (const node of preOrder(scene._nodes)) {\n\t\t\tconst light = node._light;\n\t\t\tif (!isPointLight(light)) continue;\n\n\t\t\tnode._updateWorldMatrix();\n\t\t\t_positionWS.set(node._worldMatrix.tx, node._worldMatrix.ty, node._worldMatrix.tz);\n\n\t\t\tthis._lightWriter.writeVector3(_positionWS);\n\t\t\tthis._lightWriter.writeU32(0);\n\t\t\tthis._lightWriter.writeColorF32(light._color);\n\t\t\tthis._lightWriter.writeU32(0);\n\n\t\t\tpointLightCount += 1;\n\t\t}\n\n\t\tthis._device.queue.writeBuffer(this._pointLightBuffer, 0, this._lightWriter.subarray);\n\n\t\t// gather directional lights\n\n\t\tthis._lightWriter.clear();\n\t\tlet directionalLightCount = 0;\n\t\tfor (const node of preOrder(scene._nodes)) {\n\t\t\tconst light = node._light;\n\t\t\tif (!isDirectionalLight(light)) continue;\n\n\t\t\tnode._updateWorldMatrix();\n\t\t\t_directionWS.set(-node._worldMatrix.kx, -node._worldMatrix.ky, -node._worldMatrix.kz);\n\t\t\t_directionWS.normalize();\n\n\t\t\tthis._lightWriter.writeVector3(_directionWS);\n\t\t\tthis._lightWriter.writeU32(0);\n\t\t\tthis._lightWriter.writeColorF32(light._color);\n\t\t\tthis._lightWriter.writeU32(0);\n\n\t\t\tdirectionalLightCount += 1;\n\t\t}\n\n\t\tthis._device.queue.writeBuffer(this._directionalLightBuffer, 0, this._lightWriter.subarray);\n\n\t\t// global uniforms\n\n\t\tconst globalUniformsOffset = this._uniformWriter._length;\n\t\tcameraNode._updateWorldMatrix();\n\t\t_matrixWStoVS.setObject(cameraNode._worldMatrix).inverseAffine();\n\t\tcamera.computeProjectionMatrix(width / height, _matrixVStoCS);\n\n\t\tthis._uniformWriter.writeMatrix4x4(_matrixWStoVS);\n\t\tthis._uniformWriter.writeMatrix4x4(_matrixVStoCS);\n\t\tthis._uniformWriter.writeColorF32(scene._ambientLight);\n\t\tthis._uniformWriter.writeU32(pointLightCount);\n\t\tthis._uniformWriter.writeU32(directionalLightCount);\n\t\tthis._uniformWriter.padToAlign(256);\n\n\t\t// upload uniforms\n\n\t\tthis._device.queue.writeBuffer(this._uniformBuffer, 0, this._uniformWriter.subarray);\n\n\t\t// render\n\n\t\tpass.setBindGroup(0, this._globalBindGroup, [globalUniformsOffset]);\n\n\t\tfor (let oi = 0; oi < objectMapping.table.length; ++oi) {\n\t\t\tconst object = objectMapping.table[oi]!;\n\t\t\tconst objectOffset = objectOffsets[oi]!;\n\t\t\tconst mesh = object.mesh!;\n\t\t\tconst { _vertexBuffer: vertexBuffer, _indexBuffer: indexBuffer } = mesh;\n\n\t\t\tconst flags: ShaderFlags = {\n\t\t\t\ttexCoord: vertexBuffer._texCoordBuffer !== null,\n\t\t\t\tlightTexCoord: vertexBuffer._lightTexCoordBuffer !== null,\n\t\t\t\tnormal: vertexBuffer._normalBuffer !== null,\n\t\t\t\ttangent: vertexBuffer._tangentBuffer !== null,\n\t\t\t};\n\n\t\t\tconst renderPipeline = this._getOrCreatePipeline(flags);\n\n\t\t\tpass.setPipeline(renderPipeline);\n\n\t\t\t/* WORKAROUND\n\t\t\t *\n\t\t\t * As of writing, Chrome doesn't support passing null as the second\n\t\t\t * argument. We could (and should) bind the buffers unconditionally\n\t\t\t * for increased safety. For now, we only do this when they are not\n\t\t\t * null.\n\t\t\t */\n\t\t\tpass.setVertexBuffer(0, vertexBuffer._positionBuffer);\n\t\t\tif (vertexBuffer._texCoordBuffer !== null) pass.setVertexBuffer(1, vertexBuffer._texCoordBuffer);\n\t\t\tif (vertexBuffer._lightTexCoordBuffer !== null) pass.setVertexBuffer(2, vertexBuffer._lightTexCoordBuffer);\n\t\t\tif (vertexBuffer._normalBuffer !== null) pass.setVertexBuffer(3, vertexBuffer._normalBuffer);\n\t\t\tif (vertexBuffer._tangentBuffer !== null) pass.setVertexBuffer(4, vertexBuffer._tangentBuffer);\n\t\t\tpass.setIndexBuffer(indexBuffer._buffer, indexBuffer._indexFormat);\n\n\t\t\tpass.setBindGroup(2, this._objectBindGroup, [objectOffset]);\n\n\t\t\tfor (let si = 0; si < mesh._submeshes.length; ++si) {\n\t\t\t\tconst submesh = mesh._submeshes[si]!;\n\t\t\t\tconst material = object._materials[si]!;\n\n\t\t\t\tif (isMaterial(material)) {\n\t\t\t\t\tpass.setBindGroup(1, material._bindGroup, [0]);\n\t\t\t\t} else if (isDynamicMaterial(material)) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tbindGroup: materialBindGroup,\n\t\t\t\t\t\toffset: materialOffset\n\t\t\t\t\t} = dynamicMaterialBindGroups[dynamicMaterialMapping.get(material)!]!;\n\t\t\t\t\tpass.setBindGroup(1, materialBindGroup, [materialOffset]);\n\t\t\t\t}\n\n\t\t\t\tpass.drawIndexed(submesh.length, 1, submesh.start, 0, 0);\n\t\t\t}\n\t\t}\n\n\t\tpass.end();\n\n\t\tconst commandBuffer = encoder.finish();\n\t\tthis._device.queue.submit([commandBuffer]);\n\n\t\treturn this;\n\t}\n}\n", "/// \n\nimport { Color, Mesh, Node, PerspectiveCamera, PointLight, Quaternion, Scene, Submesh, Vector3 } from \"../src/data/index\";\nimport { Renderer, degToRad } from \"../src/oktaeder\";\nimport \"./style.css\";\n\nconst canvas = document.createElement(\"canvas\");\nwindow.addEventListener(\"resize\", onResize);\nonResize.call(window);\n\nconst renderer = await Renderer.init(canvas);\n\nconst camera = new PerspectiveCamera({\n\tverticalFovRad: degToRad(50),\n\tnearPlane: 0.001,\n\tfarPlane: Infinity,\n});\n\nconst vertexBuffer = renderer.createVertexBuffer({ vertexCount: 12, texCoord: true });\nvertexBuffer.writeTypedArray(0, {\n\tposition: new Float32Array([\n\t\t0, 0, 1,\n\t\t1, 0, 0,\n\t\t0, 1, 0,\n\t\t-1, 0, 0,\n\t\t0, 0, -1,\n\t\t0, 0, -1,\n\t\t0, 0, -1,\n\t\t1, 0, 0,\n\t\t0, -1, 0,\n\t\t-1, 0, 0,\n\t\t0, 0, -1,\n\t\t0, 0, 1,\n\t]),\n\ttexCoord: new Float32Array([\n\t\t0.5, 0.7113,\n\t\t0.333333, 1,\n\t\t0.166666, 0.7113,\n\t\t0.333333, 0.4226,\n\t\t0, 0.4226,\n\t\t0, 1,\n\t\t1, 1,\n\t\t0.666666, 1,\n\t\t0.833333, 0.7113,\n\t\t0.666666, 0.4226,\n\t\t1, 0.4226,\n\t\t0.5, 0.7113,\n\t]),\n});\n\nconst indexBuffer = renderer.createIndexBuffer({ indexCount: 24, indexFormat: \"uint16\" });\nindexBuffer.writeArray(0, [\n\t0, 2, 1,\n\t3, 4, 2,\n\t5, 1, 2,\n\t2, 0, 3,\n\t6, 8, 7,\n\t9, 8, 10,\n\t7, 8, 11,\n\t11, 8, 9,\n]);\n\nconst submesh: Submesh = { start: 0, length: 24 };\n\nconst mesh = new Mesh({ vertexBuffer, indexBuffer, submeshes: [submesh] });\n\nconst imageBitmap = await loadImageBitmap(\"uvmap.png\");\n\nconst texture = renderer.createTexture({\n\tformat: \"srgb\",\n\twidth: imageBitmap.width,\n\theight: imageBitmap.height,\n\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n});\n\nrenderer._device.queue.copyExternalImageToTexture(\n\t{ source: imageBitmap, flipY: false },\n\t{ texture: texture._texture },\n\t{ width: imageBitmap.width, height: imageBitmap.height },\n);\n\nconst material = renderer.createMaterial({\n\tbaseColor: Color.white(),\n\tbaseColorPartialCoverageTexture: texture,\n\troughness: 0.5,\n\tmetallic: 0,\n});\n\nconst node = new Node({ mesh, materials: [material] });\n\nconst scene = new Scene({\n\tnodes: [\n\t\tnode,\n\t\tnew Node({\n\t\t\ttranslation: new Vector3(0, 1, -1),\n\t\t\tlight: new PointLight({ color: new Color(1, 1, 1) }),\n\t\t}),\n\t\tnew Node({\n\t\t\ttranslation: new Vector3(0, -1, -1),\n\t\t\tlight: new PointLight({ color: new Color(1, 1, 1) }),\n\t\t}),\n\t\tnew Node({\n\t\t\ttranslation: new Vector3(0, 0.8, -3),\n\t\t\trotation: Quaternion.fromRotationYZ(degToRad(15)),\n\t\t\tcamera,\n\t\t}),\n\t],\n\tambientLight: new Color(0.01, 0.01, 0.01),\n});\n\nfunction onResize(this: Window) {\n\tcanvas.width = this.innerWidth;\n\tcanvas.height = this.innerHeight;\n}\n\nconst _quaternion = Quaternion.identity();\n\nasync function loadImageBitmap(url: string) {\n\tconst res = await fetch(url);\n\tconst blob = await res.blob();\n\tconst imageBitmap = await createImageBitmap(blob, { colorSpaceConversion: \"none\" });\n\n\treturn imageBitmap;\n}\n\nfunction draw(timeMs: number) {\n\tconst time = 0.001 * timeMs;\n\tnode.setRotation(_quaternion.setRotationZX(-0.5 * time));\n\n\trenderer.render(scene, camera);\n\trequestAnimationFrame(draw);\n}\n\nrequestAnimationFrame(draw);\n\ndocument.body.appendChild(canvas);\n"], + "mappings": "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KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAC1E,UAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EA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", + "names": ["node", "node", "vertexBuffer", "indexBuffer", "Node", "camera", "mesh", "node", "node", "renderer", "renderer", "renderer", "renderer", "renderer", "Renderer", "canvas", "scene", "camera", "node", "material", "mesh", "vertexBuffer", "indexBuffer", "submesh", "Renderer", "Node", "imageBitmap"] +} diff --git a/src/oktaeder/example/index.html b/src/oktaeder/example/index.html new file mode 100644 index 0000000..b0b7d08 --- /dev/null +++ b/src/oktaeder/example/index.html @@ -0,0 +1,11 @@ + + + + + oktaeder example + + + + + + diff --git a/src/oktaeder/example/uvmap.png b/src/oktaeder/example/uvmap.png new file mode 100644 index 0000000..64689f8 --- /dev/null +++ b/src/oktaeder/example/uvmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9ad63b29f85aed2ef2a6d630028d50a63f3a9050a3f9f0b291dcb5878adf820 +size 1079056 diff --git a/src/oktaeder/index.html b/src/oktaeder/index.html new file mode 100644 index 0000000..9c03ee4 --- /dev/null +++ b/src/oktaeder/index.html @@ -0,0 +1,23 @@ + + + + + oktaeder: 3D rendering library for WebGPU + + + + +
+

oktaeder

+

3D rendering library for WebGPU

+ + +
+ + diff --git a/src/oktaeder/oktaeder.webm b/src/oktaeder/oktaeder.webm new file mode 100644 index 0000000..8f7c101 --- /dev/null +++ b/src/oktaeder/oktaeder.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09a1c81aafe1f0ec381863f1a5bf54535be99d5ffa91c9a3cc913dd7fb2050b6 +size 166040 diff --git a/src/oktaeder/style.css b/src/oktaeder/style.css new file mode 100644 index 0000000..b19c030 --- /dev/null +++ b/src/oktaeder/style.css @@ -0,0 +1,51 @@ +@import url('https://fonts.googleapis.com/css2?family=Fira+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap'); + +html, +body { + margin: 0; + padding: 0; +} + +body { + color: black; + background-color: white; + line-height: 150%; + font-size: 16px; + font-family: 'Fira Sans', sans-serif; +} + +main { + margin: 0 auto; + max-width: 800px; +} + +h1 { + margin: 16px 0; + font-size: 32px; +} + +p { + margin: 8px 0; +} + +video { + display: block; + width: 100%; + height: auto; +} + +a:link, a:active, a:visited { + color: inherit; + text-decoration: underline dotted; +} + +ul { + margin: 8px 0; +} + +@media (prefers-color-scheme: dark) { + body { + color: white; + background-color: #1C1917; + } +} \ No newline at end of file diff --git a/src/runtypescript/expressions.html b/src/runtypescript/expressions.html new file mode 100644 index 0000000..f522e33 --- /dev/null +++ b/src/runtypescript/expressions.html @@ -0,0 +1,237 @@ + + + + + RuntypeScript (rts) documentation + + + +
+

RuntypeScript

+ +

Binary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorApplicable toDescription
+number literalsaddition
+string literalsconcatenation
-number literalssubtraction
*number literalsmultiplication
/number literalsdivision
%number literalsmodulo
==all typestype equality
!=all typestype inequality
>number literalscomparison
>=number literalscomparison
<number literalscomparison
<=number literalscomparison
andfalse or truelogical and
orfalse or truelogical or
|all typestype union
&all typestype intersection
extendsall typestype assignability
+

Unary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorApplicable toDescription
-number literalsnegation
#tuplestuple length
~all typesdeliteralization
notfalse or truelogical not
decltypeidentifiersdeclared type
+

Operator priority

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PriorityOperators
0or
1and
2< > <= >= == != extends
3|
4&
5+ - (binary)
6* / %
7- (unary) not # ~ decltype
+

Identifier

+

An identifier starts with a letter (as defined by Unicode Letter category) or underscore optionally followed by a sequence of letters, numbers (as defined by Unicode Letter, Decimal Number and Letter Number categories) and underscores, and is not one of the reserved keywords:

+
    +
  • and
  • +
  • break
  • +
  • const
  • +
  • continue
  • +
  • decltype
  • +
  • elif
  • +
  • else
  • +
  • extends
  • +
  • fn
  • +
  • if
  • +
  • not
  • +
  • or
  • +
  • return
  • +
  • sig
  • +
  • var
  • +
  • while
  • +
+

Keep in mind that there are also predefined global constants, and that shadowing is forbidden.

+

Function call

+

Function is called with a set of round brackets. Arguments are seperated by a comma. Leading comma is permitted.

+

Argument count has to match exactly or a runtime error will occur.

+
const add = fn (a: number, b: number) number { return a + b; };
+println(add(1, 2));
+println(add(1, 2, 3)); // wrong
+println(add(1, "foo")); // also wrong
+

Indexing

+

Indexing is performed with a set of square brackets. You can index tuples with number literals or objects with string literals.

+
const array: number[] = [];
+array[0] = 1;
+
+const object: any = {};
+object["foo"] = "bar";
+

Note that there is no shorthand notation (i.e. dot notation) for accessing object properties.

+

Literals

+

Check the documentation about type system to learn about literals.

+
+ + diff --git a/src/runtypescript/global-constants.html b/src/runtypescript/global-constants.html new file mode 100644 index 0000000..774a937 --- /dev/null +++ b/src/runtypescript/global-constants.html @@ -0,0 +1,41 @@ + + + + + RuntypeScript (rts) documentation + + + +
+

RuntypeScript

+ +

Global constants

+

Global constants are implicitly defined constant variables at the top-level scope.

+
const nil: nil                    // the nil type
+const false: false                // the false type
+const true: true                  // the true type
+const boolean: boolean            // the boolean type
+const string: string              // the string type
+const number: number              // the number type
+const any: any                    // the any type
+const nan: number                 // not a number
+const inf: number                 // positive infinity
+const pi: number                  // pi constant
+const tau: number                 // tau constant (2 * pi)
+const e: number                   // Euler's number
+const print: sig (any) nil        // prints to stdout
+const println: sig (any) nil      // prints to stdout and appends a line feed
+const to_string: sig (any) string // converts every type to string
+const sqrt: sig (number) number   // square root
+const panic: sig (string) nil     // terminates the program with a runtime error
+
+ + diff --git a/src/runtypescript/index.html b/src/runtypescript/index.html new file mode 100644 index 0000000..70f9ede --- /dev/null +++ b/src/runtypescript/index.html @@ -0,0 +1,26 @@ + + + + + RuntypeScript (rts) documentation + + + +
+

RuntypeScript

+ +

Overview

+

RuntypeScript (aka rts) is a scripting language made in 48h for the fourth langjam hosted at langjam/jam0004. The theme was The sound(ness) of one hand typing.

+

The language is heavily inspired by TypeScript's type system, so being familiar with it will make it easier to understand this language.

+

The source for this project is hosted on GitHub.

+
+ + diff --git a/src/runtypescript/statements.html b/src/runtypescript/statements.html new file mode 100644 index 0000000..d98052a --- /dev/null +++ b/src/runtypescript/statements.html @@ -0,0 +1,94 @@ + + + + + RuntypeScript (rts) documentation + + + +
+

RuntypeScript

+ +

Comments

+
// Only single line comments
+

Declarations

+
var x = y;
+var x: T = y;
+const x = y;
+const x: T = y;
+

Declaration with no declared type:

+
const x = y;
+

is a shorthand for:

+
const x: ~y = y;
+

except that y is evaluated only once.

+

Declaration cannot shadow other variables.

+

Assignment

+

Left-hand side of an assignment can only consist of an identifier followed by an optional chain of indexing expressions. Indexes themselves can be arbitrary expressions.

+

An assignment results in a runtime error if a variable after assignment (including mutation) is not assignable to its declared type.

+
const x: { prop: string } = { prop: "foo" };
+
+// allowed
+x["prop"] = "bar";
+
+// not allowed, { prop: 1 } not assignable to { prop: string }
+x["prop"] = 1;
+

You can also use the following assignment shorthands:

+
    +
  • +=
  • +
  • -=
  • +
  • *=
  • +
  • /=
  • +
  • %=
  • +
  • |=
  • +
  • &=
  • +
+

If, elif, else

+
if (CONDITION) {
+    // (...)
+} elif (CONDITION) {
+    // (...)
+} else {
+    // (...)
+}
+

Braces are always required.

+

While

+
while (CONDITION) {
+    // (...)
+}
+

Braces are always required.

+

You can use break and continue statements inside a while loop.

+

Return

+
return EXPRESSION;
+return; // shorthand for return nil;
+
+ + + + diff --git a/src/runtypescript/style_v2.css b/src/runtypescript/style_v2.css new file mode 100644 index 0000000..689196b --- /dev/null +++ b/src/runtypescript/style_v2.css @@ -0,0 +1,145 @@ +html, body { + margin: 0; + padding: 0; +} + +body { + color: black; + background-color: white; + font-size: 20px; + font-family: 'Cascadia Mono', 'Fira Mono', Consolas, 'Courier New', 'Liberation Mono', monospace; + line-height: 1.35; +} + +main { + margin: 0 auto; + max-width: 800px; +} + +h1 { + margin: 16px 0; + font-size: 32px; + font-family: Arial, Helvetica, 'Liberation Sans', sans-serif; +} + +h1 a:link, h1 a:active, h1 a:visited, h1 a:hover { + text-decoration: none; +} + +a:link, a:active, a:visited { + color: inherit; + text-decoration: underline dotted; +} + +h2 { + margin: 32px 0 8px; + font-size: 24px; + font-family: Arial, Helvetica, 'Liberation Sans', sans-serif; +} + +p { + margin: 8px 0; +} + +ul { + margin: 8px 0; +} + +pre .kw { + color: #af00db; +} + +pre .fn { + color: #795e26; +} + +pre .num { + color: #098658; +} + +pre .comm { + color: #008000; +} + +pre .str { + color: #a31515; +} + +pre .var { + color: #001080; +} + +pre .const { + color: #0070c1; +} + +pre .decl { + color: #0000ff; +} + +table { + width: 100%; + border-color: black; + border-spacing: 0; +} + +td, th { + padding: 0.25rem 0.5rem; + border-top-width: 1px; + border-top-style: solid; + border-left-width: 1px; + border-left-style: solid; +} + +td:last-child, th:last-child { + border-right-width: 1px; + border-right-style: solid; +} + +tr:last-child td { + border-bottom-width: 1px; + border-bottom-style: solid; +} + +@media (prefers-color-scheme: dark) { + body { + color: #d4d4d4; + background-color: #1E1E1E; + } + + pre .kw { + color: #c586c0; + } + + pre .fn { + color: #dcdcaa; + } + + pre .num { + color: #b5cea8; + } + + pre .comm { + color: #6a9955; + } + + pre .str { + color: #ce9178; + } + + pre .var { + color: #9cdcfe; + } + + pre .const { + color: #4fc1ff; + } + + pre .decl { + color: #569cd6; + } + + table { + border-color: #d4d4d4; + } +} diff --git a/src/runtypescript/type-system.html b/src/runtypescript/type-system.html new file mode 100644 index 0000000..65f5327 --- /dev/null +++ b/src/runtypescript/type-system.html @@ -0,0 +1,109 @@ + + + + + RuntypeScript (rts) documentation + + + +
+

RuntypeScript

+ +

Type system is the value system

+

Types and values are mixed with each other, so using the terms type and value interchangeably can get confusing (because they aren't different things in this language). Since these value/type hybrids work more like types than values, we will refer to them only as types on this page.

+

nil

+

Nil represents nothing. It is returned by a function when nothing is returned explicitly.

+

false, true

+

False and true are the results of comparison operators and can be used as operand for logical operators.

+

boolean

+

Boolean is a union of false and true.

+

string

+

String is a union of every possible string literal.

+

String literals

+

String literals are enclosed in double quotes. You can make use of the following escape sequences in a string literal:

+
    +
  • \\ (backslash)
  • +
  • \" (double quote)
  • +
  • \n (line feed)
  • +
  • \t (tab)
  • +
  • \r (carriage return)
  • +
+

number

+

Number is a union of every possible number literal.

+

Number literals

+

Number literals are double presicion floating-point. Only decimal literals are supported (no hexadecimal or exponentials).

+

Typed array

+

Typed array is defined by specifying its element type. Type array is a union of every possible tuple, for which every element is assignable to typed array's element type. You can turn any type into a typed array by appending a pair of square brackets after the type.

+
const array_of_number = number[];
+const array_of_zero_or_foo = (0 | "foo")[];
+const array_of_array = any[][];
+

Tuple

+

Tuples are arrays of types and are indexed by number literals.

+
const tuple = [number, string];
+const also_tuple = [0, 1, 2, fn () nil {}, boolean, [number, "foo"]];
+

Tuples are passed by reference and are mutable.

+

Object

+

Objects can hold multiple properties and are indexed by string literals.

+
const empty_obj = {};
+const simple_obj = { foo: "bar", baz: string[] };
+const nested_obj = { foo: {}, baz: [{}] };
+
+

Signatures

+

Signatures are specified by a list of argument types and a return type. A signature is a union of every possible function assignable to that signature.

+
const binary_sig = sig (any, any) any;
+const filter_sig = sig (any[], sig (any) boolean) any[];
+

Signatures never contain names of arguments.

+

Functions

+

Every function is its own distinct type tied to its literal.

+
const concat = fn (a: string, b: string) string { return a + b; };
+

Function arguments are not constants and can be reassigned inside the function body. A function will capture its outside scope.

+

There are intrinsic functions in this language, which are global constants and their function bodies are implemented in the interpreter itself instead of the language. They cannot be created by language users.

+

Unions

+

Unions represents a type, to which many other types are assignable. You can create unions using "|" operator. Unions do not nest (a union of unions collapses into a single union) and are immutable.

+

any

+

Any is a union of every possible type in this language, including itself.

+

Deliteralization

+

Deliteralization is a transformation of types, that is performed to determine the declared type when none was provided. You can use unary "~" operator to perform the same process yourself. Deliteralization rules:

+
    +
  • false becomes boolean
  • +
  • true becomes boolean
  • +
  • string literals become string
  • +
  • number literals become number
  • +
  • tuples become typed arrays of union of all tuple's elements deliteralized
  • +
  • object become objects with their properties deliteralized
  • +
  • functions become signatures with equivalent argument and return types
  • +
  • unions become a union of its types deliteralized
  • +
  • other types are left intact
  • +
+

Assignability

+

Assignability is a process that determines whether a type can be assigned to a variable's declared type. You can use binary "extends" operator to perform the same process yourself. Assignability rules:

+
    +
  • a union is assignable to a type when all union's types are assignable to that type
  • +
  • only nil is assignable to nil
  • +
  • only false is assignable to false
  • +
  • only true is assignable to true
  • +
  • false, true and boolean are assignable to boolean
  • +
  • string and string literals are assignable to string
  • +
  • only identical string literals are assignable to string literals
  • +
  • number and number literals are assignable to number
  • +
  • only identical number literals are assignable to number literals
  • +
  • a typed array is assignable to other typed array if its element type is assignable to other typed array's element type
  • +
  • a tuple is assignable to a typed array if all its elements are assignable to typed array's element type
  • +
  • an object is assignable to other object if every property of other object also exists in the object and types of the object properties are assignable to correspoding types of the other object properties
  • +
  • a signature is assignable to other signature if every argument of the signature is assignable to corresponding other signature's arguments and other siganture's return type is assignable to the signature return type
  • +
  • a function is assignable to a signature if its deliteralization is assignable to the signature
  • +
  • only identical functions (by reference) are assignable to functions
  • +
  • a type is assignable to a union if its assignable to any of union's types
  • +
  • every type is assignable to any
  • +
+
+ +