From 75d33a0d2e8de92b8bc17cee614fb54f6343247b Mon Sep 17 00:00:00 2001 From: Luca Heft Date: Tue, 25 Nov 2025 10:35:18 +0100 Subject: [PATCH 1/4] Use AssetListLoader to preload assets --- src/framework/app-base.js | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/framework/app-base.js b/src/framework/app-base.js index 077bdedf9f2..84220542760 100644 --- a/src/framework/app-base.js +++ b/src/framework/app-base.js @@ -42,6 +42,7 @@ import { RESOLUTION_AUTO, RESOLUTION_FIXED } from './constants.js'; import { Asset } from './asset/asset.js'; +import { AssetListLoader } from './asset/asset-list-loader.js'; import { AssetRegistry } from './asset/asset-registry.js'; import { BundleRegistry } from './bundle/bundle-registry.js'; import { ComponentSystemRegistry } from './components/registry.js'; @@ -707,9 +708,7 @@ class AppBase extends EventHandler { this.fire('preload:start'); // get list of assets to preload - const assets = this.assets.list({ - preload: true - }); + const assets = this.assets.filter(asset => asset.preload === true && asset.loaded === false) if (assets.length === 0) { this.fire('preload:end'); @@ -719,25 +718,18 @@ class AppBase extends EventHandler { let loadedCount = 0; - const onAssetLoadOrError = () => { + const onAssetLoad = () => { loadedCount++; this.fire('preload:progress', loadedCount / assets.length); - - if (loadedCount === assets.length) { - this.fire('preload:end'); - callback(); - } }; - // for each asset - assets.forEach((asset) => { - if (!asset.loaded) { - asset.once('load', onAssetLoadOrError); - asset.once('error', onAssetLoadOrError); - this.assets.load(asset); - } else { - onAssetLoadOrError(); - } + const assetListLoader = new AssetListLoader(assets, this.assets); + + assetListLoader.on('progress', onAssetLoad); + + assetListLoader.load(() => { + this.fire('preload:end'); + callback(); }); } From 6da5af341173431dc479adb05084aed7496df542 Mon Sep 17 00:00:00 2001 From: Luca Heft Date: Tue, 25 Nov 2025 11:59:56 +0100 Subject: [PATCH 2/4] Add tests --- test/framework/application.test.mjs | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/test/framework/application.test.mjs b/test/framework/application.test.mjs index 30d5f4a9a7d..616036c6cd0 100644 --- a/test/framework/application.test.mjs +++ b/test/framework/application.test.mjs @@ -1,5 +1,6 @@ import { expect } from 'chai'; +import { Asset } from '../../src/framework/asset/asset.js'; import { AssetRegistry } from '../../src/framework/asset/asset-registry.js'; import { ComponentSystemRegistry } from '../../src/framework/components/registry.js'; import { FILLMODE_KEEP_ASPECT, RESOLUTION_FIXED } from '../../src/framework/constants.js'; @@ -19,6 +20,7 @@ import { jsdomSetup, jsdomTeardown } from '../jsdom.mjs'; describe('Application', function () { let app; + const assetPath = 'http://localhost:3000/test/assets/'; beforeEach(function () { jsdomSetup(); @@ -89,4 +91,43 @@ describe('Application', function () { }); + describe('#preload', function () { + + it('should preload assets with preload set to true', function (done) { + const assets = [ + new Asset('model', 'container', { url: `${assetPath}test.glb` }), + new Asset('styling', 'css', { url: `${assetPath}test.css` }) + ]; + assets.forEach((asset) => { + asset.preload = true; + app.assets.add(asset); + }); + + app.preload(function () { + assets.forEach((asset) => { + expect(asset.loaded).to.be.true; + }); + done(); + }); + }); + + it('should not preload assets with preload set to false', function (done) { + const assets = [ + new Asset('model', 'container', { url: `${assetPath}test.glb` }), + new Asset('styling', 'css', { url: `${assetPath}test.css` }) + ]; + assets.forEach((asset) => { + app.assets.add(asset); + }); + + app.preload(function () { + assets.forEach((asset) => { + expect(asset.loaded).to.be.false; + }); + done(); + }); + }); + + }); + }); From 8f5f09c1a432a0aa4c50a027b94337d7c7b20a0f Mon Sep 17 00:00:00 2001 From: Martin Valigursky <59932779+mvaligursky@users.noreply.github.com> Date: Tue, 25 Nov 2025 11:43:17 +0000 Subject: [PATCH 3/4] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/framework/app-base.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/framework/app-base.js b/src/framework/app-base.js index 84220542760..a20016b3b1c 100644 --- a/src/framework/app-base.js +++ b/src/framework/app-base.js @@ -708,7 +708,7 @@ class AppBase extends EventHandler { this.fire('preload:start'); // get list of assets to preload - const assets = this.assets.filter(asset => asset.preload === true && asset.loaded === false) + const assets = this.assets.filter(asset => asset.preload === true && asset.loaded === false); if (assets.length === 0) { this.fire('preload:end'); From 1534ae332d4a5aa005b1597e73cc16f137b192c9 Mon Sep 17 00:00:00 2001 From: Luca Heft Date: Thu, 27 Nov 2025 14:00:19 +0100 Subject: [PATCH 4/4] Fix import order --- test/framework/application.test.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/framework/application.test.mjs b/test/framework/application.test.mjs index 616036c6cd0..0e9b800036b 100644 --- a/test/framework/application.test.mjs +++ b/test/framework/application.test.mjs @@ -1,7 +1,7 @@ import { expect } from 'chai'; -import { Asset } from '../../src/framework/asset/asset.js'; import { AssetRegistry } from '../../src/framework/asset/asset-registry.js'; +import { Asset } from '../../src/framework/asset/asset.js'; import { ComponentSystemRegistry } from '../../src/framework/components/registry.js'; import { FILLMODE_KEEP_ASPECT, RESOLUTION_FIXED } from '../../src/framework/constants.js'; import { Entity } from '../../src/framework/entity.js';