From 0ec67dce7cdaa3fb92d7a5f33af73e13dcc00a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Goszczy=C5=84ski?= Date: Fri, 14 Mar 2025 14:29:40 +0100 Subject: [PATCH] improve perf --- .../LaunchWeek/14/scenes/TicketScene.ts | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/apps/www/components/LaunchWeek/14/scenes/TicketScene.ts b/apps/www/components/LaunchWeek/14/scenes/TicketScene.ts index fba45739243..38a81e99d2a 100644 --- a/apps/www/components/LaunchWeek/14/scenes/TicketScene.ts +++ b/apps/www/components/LaunchWeek/14/scenes/TicketScene.ts @@ -232,6 +232,7 @@ class TicketScene implements BaseScene { // Load fonts before loading the model await this._loadFonts() + await this._preloadAllTextureSets() const gltf = await loadGLTFModel(this.sceneUrl) @@ -600,7 +601,6 @@ class TicketScene implements BaseScene { throw new Error(`Failed to load texture ${textureDescriptor.url}`) } - context.drawImage(textureDescriptor.cachedData.image, 0, 0, canvas.width, canvas.height) // For meshes without base images, just draw custom content @@ -728,6 +728,47 @@ class TicketScene implements BaseScene { this._internalState.fontsLoaded = false } } + + private async _preloadAllTextureSets() { + const textureLoader = new THREE.TextureLoader() + const allSets = ['basic', 'secret', 'platinum'] as const + + let promises: Promise[] = [] + for (const set of allSets) { + const textureSet = this.textureImages[set] + if (textureSet.front.cachedData === null) { + const promise = new Promise((resolve, reject) => { + textureLoader.load( + textureSet.front.url, + (texture) => { + textureSet.front.cachedData = texture + resolve() + }, + undefined, + reject + ) + }) + promises.push(promise) + } + if (textureSet.back.cachedData === null) { + const promise = new Promise((resolve, reject) => { + textureLoader.load( + textureSet.back.url, + (texture) => { + textureSet.back.cachedData = texture + resolve() + }, + undefined, + reject + ) + }) + + promises.push(promise) + } + } + + await Promise.all(promises) + } } export default TicketScene