From 9153c26e289c311e2afeaa5985cf4a88d79711e0 Mon Sep 17 00:00:00 2001 From: Zyie <24736175+Zyie@users.noreply.github.com> Date: Mon, 8 Dec 2025 14:38:08 +0000 Subject: [PATCH] chore: Update Pixi.js to v8.15.0 This update required adjustments to the texture monitoring system to correctly retrieve GPU texture data from various Pixi.js rendering backends and newer internal texture management APIs. It also improves the display of textures by showing those that have been garbage collected as unloaded. --- package-lock.json | 114 ++++++++++++------ packages/api/package.json | 2 +- .../src/assets/gpuTextures/textures.ts | 50 +++++++- .../backend/src/rendering/instructions.ts | 6 +- packages/backend/src/rendering/rendering.ts | 19 ++- packages/backend/src/scene/tree/tree.ts | 2 +- packages/backend/src/utils/getPixiType.ts | 1 - packages/backend/src/utils/loop.ts | 4 +- packages/example/package.json | 2 +- packages/frontend/src/pages/assets/assets.ts | 1 + .../frontend/src/pages/rendering/rendering.ts | 14 ++- 11 files changed, 161 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 66885c1..30945cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -164,6 +164,7 @@ "version": "4.23.3", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", + "peer": true, "dependencies": { "@algolia/client-common": "4.23.3", "@algolia/requester-common": "4.23.3", @@ -284,6 +285,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.6", @@ -2152,7 +2154,6 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "optional": true, - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2165,7 +2166,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "optional": true, - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -7584,6 +7584,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -7904,29 +7905,25 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "optional": true, - "peer": true + "optional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "optional": true, - "peer": true + "optional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "optional": true, - "peer": true + "optional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "optional": true, - "peer": true + "optional": true }, "node_modules/@types/acorn": { "version": "4.0.6", @@ -8035,9 +8032,10 @@ } }, "node_modules/@types/earcut": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", - "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-3.0.0.tgz", + "integrity": "sha512-k/9fOUGO39yd2sCjrbAJvGDEQvRwRnQIZlBz43roGwUZo5SHAmyVvSFyaVVZkicRVCaDXPKlbxrUcBuJoSWunQ==", + "license": "MIT" }, "node_modules/@types/eslint": { "version": "8.56.10", @@ -8223,6 +8221,7 @@ "version": "20.14.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.1.tgz", "integrity": "sha512-T2MzSGEu+ysB/FkWfqmhV3PLyQlowdptmmgD20C6QxsS8Fmv5SjpZ1ayXaEC0S21/h5UJ9iA6W/5vSNU5l00OA==", + "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -8264,6 +8263,7 @@ "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -8284,6 +8284,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "devOptional": true, + "peer": true, "dependencies": { "@types/react": "*" } @@ -8462,6 +8463,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.12.0.tgz", "integrity": "sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.12.0", "@typescript-eslint/types": "7.12.0", @@ -8849,6 +8851,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8904,6 +8907,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -8963,6 +8967,7 @@ "version": "4.23.3", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", + "peer": true, "dependencies": { "@algolia/cache-browser-local-storage": "4.23.3", "@algolia/cache-common": "4.23.3", @@ -9742,6 +9747,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -10599,8 +10605,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "optional": true, - "peer": true + "optional": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -11302,7 +11307,6 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "optional": true, - "peer": true, "engines": { "node": ">=0.3.1" } @@ -11460,9 +11464,10 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", + "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", + "license": "ISC" }, "node_modules/eastasianwidth": { "version": "0.2.0", @@ -11788,6 +11793,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "devOptional": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -11843,6 +11849,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -13463,6 +13470,15 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/gifuct-js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gifuct-js/-/gifuct-js-2.1.2.tgz", + "integrity": "sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg==", + "license": "MIT", + "dependencies": { + "js-binary-schema-parser": "^2.0.3" + } + }, "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", @@ -15431,6 +15447,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-binary-schema-parser": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz", + "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -15865,8 +15887,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "optional": true, - "peer": true + "optional": true }, "node_modules/markdown-extensions": { "version": "2.0.0", @@ -19158,19 +19179,26 @@ } }, "node_modules/pixi.js": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.2.2.tgz", - "integrity": "sha512-L/EmsJ74bYyFIZoF4RdaU0yOuWGR179/QMLnptCVjRhhhg4tgW7ABs7uvp2Z0psOKvpNanaRF/kIliD8Rm5dVw==", + "version": "8.14.3", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.14.3.tgz", + "integrity": "sha512-6xGYARV8D9E/fO1c2NmYn+k2dQ5oZldVm5tNlLQJ8obTlOQXdL5QpMc217qTpRyHVDFaw5eoFCLF1gr6p5ZcjQ==", + "license": "MIT", "dependencies": { "@pixi/colord": "^2.9.6", "@types/css-font-loading-module": "^0.0.12", - "@types/earcut": "^2.1.4", + "@types/earcut": "^3.0.0", "@webgpu/types": "^0.1.40", "@xmldom/xmldom": "^0.8.10", - "earcut": "^2.2.4", + "earcut": "^3.0.2", "eventemitter3": "^5.0.1", + "gifuct-js": "^2.1.2", "ismobilejs": "^1.1.1", - "parse-svg-path": "^0.1.2" + "parse-svg-path": "^0.1.2", + "tiny-lru": "^11.4.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" } }, "node_modules/pkg-dir": { @@ -19357,6 +19385,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -20090,6 +20119,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.0.tgz", "integrity": "sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==", "dev": true, + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -20438,6 +20468,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -20636,6 +20667,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -20699,6 +20731,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -20788,6 +20821,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -21710,6 +21744,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -22781,6 +22816,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -22970,6 +23006,15 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, + "node_modules/tiny-lru": { + "version": "11.4.5", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.4.5.tgz", + "integrity": "sha512-hkcz3FjNJfKXjV4mjQ1OrXSLAehg8Hw+cEZclOVT+5c/cWQWImQ9wolzTjth+dmmDe++p3bme3fTxz6Q4Etsqw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -23067,7 +23112,6 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "optional": true, - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -23110,8 +23154,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "optional": true, - "peer": true + "optional": true }, "node_modules/tsconfig-paths": { "version": "3.15.0", @@ -23307,6 +23350,7 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23831,8 +23875,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "optional": true, - "peer": true + "optional": true }, "node_modules/validate-npm-package-license": { "version": "3.0.4", @@ -23917,6 +23960,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", "dev": true, + "peer": true, "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", @@ -24043,6 +24087,7 @@ "version": "5.91.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -24805,7 +24850,6 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "optional": true, - "peer": true, "engines": { "node": ">=6" } @@ -24862,7 +24906,7 @@ "version": "2.2.1", "license": "MIT", "devDependencies": { - "pixi.js": "^8.2.2" + "pixi.js": "^8.14.3" }, "peerDependencies": { "pixi.js": "^7 || ^8" @@ -24929,7 +24973,7 @@ "version": "0.0.0", "dependencies": { "@pixi/devtools": "*", - "pixi.js": "^8.2.2" + "pixi.js": "^8.14.3" } }, "packages/frontend": { diff --git a/packages/api/package.json b/packages/api/package.json index 1ec6fe3..b1f0507 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -32,7 +32,7 @@ "start": "npm run watch" }, "devDependencies": { - "pixi.js": "^8.2.2" + "pixi.js": "^8.14.3" }, "peerDependencies": { "pixi.js": "^7 || ^8" diff --git a/packages/backend/src/assets/gpuTextures/textures.ts b/packages/backend/src/assets/gpuTextures/textures.ts index a6293ec..5f07c37 100644 --- a/packages/backend/src/assets/gpuTextures/textures.ts +++ b/packages/backend/src/assets/gpuTextures/textures.ts @@ -1,5 +1,5 @@ import type { TextureDataState } from '@devtool/frontend/pages/assets/assets'; -import type { CanvasSource, GlTexture, TextureSource, WebGLRenderer, WebGPURenderer } from 'pixi.js'; +import type { CanvasSource, GlTexture, TextureSource, WebGLRenderer } from 'pixi.js'; import { PixiHandler } from '../../handler'; const gpuTextureFormatSize: Record = { @@ -67,6 +67,7 @@ export class Textures extends PixiHandler { private _textures: Map = new Map(); private _gpuTextureSize: Map = new Map(); private _canvas = document.createElement('canvas'); + private _previousData: TextureDataState[] = []; public override init() { this._textures.clear(); @@ -76,6 +77,7 @@ export class Textures extends PixiHandler { public override reset() { this._textures.clear(); this._gpuTextureSize.clear(); + this._previousData = []; } public override update() {} @@ -86,6 +88,7 @@ export class Textures extends PixiHandler { const data: TextureDataState[] = []; currentTextures.forEach((texture) => { + if (!texture) return; if (!texture.resource) return; if (!this._textures.get(texture.uid)) { @@ -103,6 +106,7 @@ export class Textures extends PixiHandler { } data.push({ + uid: texture.uid, name: texture.label, gpuSize: this._gpuTextureSize.get(texture.uid) || 0, pixelWidth: texture.pixelWidth, @@ -123,15 +127,49 @@ export class Textures extends PixiHandler { }); }); + if (!('_glTextures' in this._devtool.renderer.texture)) { + // currentTextures can now contain null values, these null values are the textures that have been garbage collected + // we need to map these null values to the previous data so we can add them back to the data array + // loop through the previous data and any texture that is not in the current data array, add it back to the data array + const currentUids = new Set(data.map((t) => t.uid)); + this._previousData.forEach((previousTexture) => { + if (!currentUids.has(previousTexture.uid)) { + data.push({ ...previousTexture, isLoaded: false }); + } + }); + this._previousData = data.slice(); + } + return data; } public getWebTextures() { - const glRenderer = this._devtool.renderer as WebGLRenderer; - const gpuRenderer = this._devtool.renderer as WebGPURenderer; - - const glTextures: Record = - glRenderer.texture['_glTextures'] || gpuRenderer.texture['_gpuSources']; + const renderer = this._devtool.renderer as WebGLRenderer; + + let glTextures: Record = {}; + const textureSystem = renderer.texture as unknown as + | { _glTextures: Record } + | { _gpuSources: Record } + | { managedTextures: Readonly }; + + if ('_glTextures' in textureSystem || '_gpuSources' in textureSystem) { + glTextures = '_glTextures' in textureSystem ? textureSystem['_glTextures'] : textureSystem['_gpuSources']; + } else { + // we are now using pixi 8.15 + const managedTextures = textureSystem.managedTextures; + glTextures = managedTextures.reduce( + (acc, texture) => { + if (!texture) return acc; + // @ts-expect-error - pixi 8.15 introduced a new property _gpuData + const gpuData = texture._gpuData[this._devtool.renderer.uid]; + if (!gpuData) return acc; + + acc[texture.uid] = 'gpuTexture' in gpuData ? gpuData.gpuTexture : gpuData; + return acc; + }, + {} as Record, + ); + } return glTextures; } diff --git a/packages/backend/src/rendering/instructions.ts b/packages/backend/src/rendering/instructions.ts index 48e3a35..4caa5bb 100644 --- a/packages/backend/src/rendering/instructions.ts +++ b/packages/backend/src/rendering/instructions.ts @@ -152,7 +152,7 @@ export function getFilterInstruction( return { type: filter.constructor.name, padding: filter.padding, - resolution: filter.resolution, + resolution: typeof filter.resolution === 'number' ? filter.resolution : 1, antialias: filter.antialias, blendMode: filter.blendMode, program: { @@ -193,8 +193,8 @@ export function getMeshInstruction( if (!shader) { shader = PixiDevtools.renderer.renderPipes.mesh['_adaptor']._shader; - program.fragment = getProgramSource(shader, 'fragment', rendererType); - program.vertex = getProgramSource(shader, 'vertex', rendererType); + program.fragment = getProgramSource(shader!, 'fragment', rendererType); + program.vertex = getProgramSource(shader!, 'vertex', rendererType); } else { program.fragment = getProgramSource(shader, 'fragment', rendererType); program.vertex = getProgramSource(shader, 'vertex', rendererType); diff --git a/packages/backend/src/rendering/rendering.ts b/packages/backend/src/rendering/rendering.ts index 475ae52..159cc52 100644 --- a/packages/backend/src/rendering/rendering.ts +++ b/packages/backend/src/rendering/rendering.ts @@ -218,7 +218,7 @@ export class Rendering extends PixiHandler { premultipliedAlpha = contextAttributes.premultipliedAlpha?.toString() ?? ''; } - return { + const defaults = { type: this._devtool.rendererType!, width: canvas.width, height: canvas.height, @@ -238,12 +238,25 @@ export class Rendering extends PixiHandler { resolution: renderer.resolution.toString(), roundPixels: renderer.roundPixels.toString(), failIfMajorPerformanceCaveat, + }; - // @ts-expect-error - private properties + if (!('glTextures' in renderer.texture)) { + return { + ...defaults, + // @ts-expect-error - newer pixi version + gcActive: renderer.gc.enabled.toString(), + // @ts-expect-error - newer pixi version + gcMaxUnusedTime: renderer.gc.maxUnusedTime.toString(), + // @ts-expect-error - newer pixi version + gcFrequency: renderer.gc._frequency.toString(), + }; + } + + return { + ...defaults, renderableGCActive: renderer.renderableGC?.enabled.toString(), // @ts-expect-error - private properties renderableGCFrequency: renderer.renderableGC?._frequency.toString(), - // @ts-expect-error - private properties renderableGCMaxUnusedTime: renderer.renderableGC?.maxUnusedTime.toString(), textureGCAMaxIdle: renderer.textureGC.maxIdle.toString(), textureGCActive: renderer.textureGC.active.toString(), diff --git a/packages/backend/src/scene/tree/tree.ts b/packages/backend/src/scene/tree/tree.ts index da31b37..8b95dc5 100644 --- a/packages/backend/src/scene/tree/tree.ts +++ b/packages/backend/src/scene/tree/tree.ts @@ -114,7 +114,7 @@ export class Tree extends PixiHandler { } if (updateSceneGraph) { - const parent = this._sceneGraph.get(container.parent); + const parent = this._sceneGraph.get(container.parent!); parent?.children.push(node); this._sceneGraph.set(container, node); } diff --git a/packages/backend/src/utils/getPixiType.ts b/packages/backend/src/utils/getPixiType.ts index 285c2fe..d97051b 100644 --- a/packages/backend/src/utils/getPixiType.ts +++ b/packages/backend/src/utils/getPixiType.ts @@ -106,7 +106,6 @@ export function isContainer(container: Container, pixi?: (typeof PixiDevtools)[' export function isParticleContainer(container: Container, pixi?: (typeof PixiDevtools)['pixi']): boolean { if (pixi) { - // @ts-expect-error - particle container is a unreleased 8.5 feature return pixi.ParticleContainer && container instanceof pixi.ParticleContainer; } return ('renderPipeId' in container && container['renderPipeId'] === 'particle') || 'particleChildren' in container; diff --git a/packages/backend/src/utils/loop.ts b/packages/backend/src/utils/loop.ts index dddd3d8..863afaa 100644 --- a/packages/backend/src/utils/loop.ts +++ b/packages/backend/src/utils/loop.ts @@ -19,13 +19,13 @@ function loopRecursive(container: Container, opts: Omit void;