@series-inc/stowkit-phaser-loader 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stowkit-phaser-loader.esm.js","sources":["../src/BasisTranscoder.ts","../src/StowKitPhaserPack.ts","../src/StowKitPhaserLoader.ts"],"sourcesContent":["/**\r\n * BasisTranscoder - Manually decode KTX2 textures to WebGL textures\r\n * Used for Phaser which doesn't have built-in KTX2 support\r\n */\r\n\r\ninterface BasisModule {\r\n initializeBasis: () => void;\r\n BasisFile: new (data: Uint8Array) => BasisFile;\r\n KTX2File: new (data: Uint8Array) => KTX2File;\r\n}\r\n\r\ninterface BasisFile {\r\n getNumImages(): number;\r\n getNumLevels(imageIndex: number): number;\r\n getImageWidth(imageIndex: number, level: number): number;\r\n getImageHeight(imageIndex: number, level: number): number;\r\n startTranscoding(): boolean;\r\n getImageTranscodedSizeInBytes(imageIndex: number, level: number, format: number): number;\r\n transcodeImage(\r\n dst: Uint8Array,\r\n imageIndex: number,\r\n level: number,\r\n format: number,\r\n unused: number,\r\n getAlphaForOpaqueFormats: number\r\n ): number;\r\n close(): void;\r\n delete(): void;\r\n}\r\n\r\ninterface KTX2File {\r\n isValid(): boolean;\r\n isUASTC(): boolean;\r\n isETC1S(): boolean;\r\n isHDR(): boolean;\r\n getWidth(): number;\r\n getHeight(): number;\r\n getLayers(): number;\r\n getLevels(): number;\r\n getFaces(): number;\r\n getHasAlpha(): boolean;\r\n getDFDFlags(): number;\r\n startTranscoding(): boolean;\r\n getImageLevelInfo(mip: number, layer: number, face: number): any;\r\n getImageTranscodedSizeInBytes(mip: number, layer: number, face: number, format: number): number;\r\n transcodeImage(\r\n dst: Uint8Array,\r\n mip: number,\r\n layer: number,\r\n face: number,\r\n format: number,\r\n unused1: number,\r\n unused2: number,\r\n unused3: number\r\n ): number;\r\n close(): void;\r\n delete(): void;\r\n}\r\n\r\n// Basis transcoder formats (from Three.js KTX2Loader.TranscoderFormat)\r\nconst BASIS_FORMAT = {\r\n ETC1: 0,\r\n ETC2: 1,\r\n BC1: 2, // DXT1\r\n BC3: 3, // DXT5\r\n BC4: 4,\r\n BC5: 5,\r\n BC7_M6_OPAQUE_ONLY: 6,\r\n BC7_M5: 7, // BC7\r\n PVRTC1_4_RGB: 8,\r\n PVRTC1_4_RGBA: 9,\r\n ASTC_4x4: 10,\r\n ATC_RGB: 11,\r\n ATC_RGBA: 12,\r\n RGBA32: 13,\r\n RGB565: 14,\r\n BGR565: 15,\r\n RGBA4444: 16,\r\n BC6H: 22,\r\n RGB_HALF: 24,\r\n RGBA_HALF: 25,\r\n};\r\n\r\nexport interface TranscodedTexture {\r\n data: Uint8Array;\r\n width: number;\r\n height: number;\r\n format: number;\r\n internalFormat?: number;\r\n compressed: boolean;\r\n}\r\n\r\nexport class BasisTranscoder {\r\n private module: BasisModule | null = null;\r\n private initialized = false;\r\n private initPromise: Promise<void> | null = null;\r\n private basisPath: string;\r\n\r\n constructor(basisPath: string = '/basis/') {\r\n this.basisPath = basisPath;\r\n }\r\n\r\n /**\r\n * Initialize the Basis Universal transcoder\r\n */\r\n async init(): Promise<void> {\r\n if (this.initialized) return;\r\n if (this.initPromise) return this.initPromise;\r\n\r\n this.initPromise = (async () => {\r\n try {\r\n // Load the basis transcoder\r\n const scriptPath = `${this.basisPath}basis_transcoder.js`;\r\n \r\n // Import the basis module\r\n const BasisModule = await this.loadBasisModule(scriptPath);\r\n \r\n // Initialize\r\n BasisModule.initializeBasis();\r\n this.module = BasisModule;\r\n this.initialized = true;\r\n } catch (error) {\r\n console.error('[BasisTranscoder] Failed to initialize:', error);\r\n throw error;\r\n }\r\n })();\r\n\r\n return this.initPromise;\r\n }\r\n\r\n /**\r\n * Load the basis transcoder module\r\n */\r\n private async loadBasisModule(scriptPath: string): Promise<BasisModule> {\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = scriptPath;\r\n script.async = true;\r\n \r\n script.onload = () => {\r\n // The basis transcoder exposes a global BASIS function\r\n if (typeof (window as any).BASIS === 'function') {\r\n (window as any).BASIS().then((module: BasisModule) => {\r\n resolve(module);\r\n }).catch(reject);\r\n } else {\r\n reject(new Error('BASIS module not found'));\r\n }\r\n };\r\n \r\n script.onerror = () => {\r\n reject(new Error(`Failed to load ${scriptPath}`));\r\n };\r\n \r\n document.head.appendChild(script);\r\n });\r\n }\r\n\r\n /**\r\n * Transcode KTX2 data to a WebGL-compatible format\r\n */\r\n async transcodeKTX2(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TranscodedTexture> {\r\n if (!this.initialized) {\r\n await this.init();\r\n }\r\n\r\n if (!this.module) {\r\n throw new Error('Basis module not initialized');\r\n }\r\n\r\n // Create KTX2File from data\r\n const ktx2File = new this.module.KTX2File(data);\r\n \r\n try {\r\n // Validate file\r\n if (!ktx2File.isValid()) {\r\n throw new Error('Invalid or unsupported KTX2 file');\r\n }\r\n\r\n // Get image dimensions\r\n const width = ktx2File.getWidth();\r\n const height = ktx2File.getHeight();\r\n \r\n // Check if the texture has alpha\r\n const hasAlpha = ktx2File.getHasAlpha();\r\n \r\n // Check format type (UASTC or ETC1S)\r\n const isUASTC = ktx2File.isUASTC();\r\n const isETC1S = ktx2File.isETC1S();\r\n\r\n // Start transcoding\r\n if (!ktx2File.startTranscoding()) {\r\n throw new Error('Failed to start KTX2 transcoding');\r\n }\r\n\r\n // Use first mip level, first layer, first face\r\n const mip = 0;\r\n const layer = 0;\r\n const face = 0;\r\n\r\n // Detect best format for this device and file type\r\n const targetFormat = this.detectBestFormat(gl, hasAlpha, isETC1S);\r\n \r\n // Get transcoded size\r\n const transcodedSize = ktx2File.getImageTranscodedSizeInBytes(\r\n mip,\r\n layer,\r\n face,\r\n targetFormat.basisFormat\r\n );\r\n\r\n // Allocate output buffer\r\n const transcodedData = new Uint8Array(transcodedSize);\r\n\r\n // Transcode (parameters: dst, mip, layer, face, format, unused1, unused2, unused3)\r\n const result = ktx2File.transcodeImage(\r\n transcodedData,\r\n mip,\r\n layer,\r\n face,\r\n targetFormat.basisFormat,\r\n 0,\r\n -1,\r\n -1\r\n );\r\n\r\n if (result === 0) {\r\n throw new Error('KTX2 transcoding failed');\r\n }\r\n\r\n return {\r\n data: transcodedData,\r\n width,\r\n height,\r\n format: targetFormat.glFormat,\r\n internalFormat: targetFormat.glInternalFormat,\r\n compressed: targetFormat.compressed\r\n };\r\n\r\n } finally {\r\n ktx2File.close();\r\n ktx2File.delete();\r\n }\r\n }\r\n\r\n /**\r\n * Detect the best compression format supported by the device\r\n */\r\n private detectBestFormat(gl: WebGLRenderingContext | WebGL2RenderingContext, hasAlpha: boolean = true, isETC1S: boolean = false): {\r\n basisFormat: number;\r\n glFormat: number;\r\n glInternalFormat: number;\r\n compressed: boolean;\r\n } {\r\n const isWebGL2 = gl instanceof WebGL2RenderingContext;\r\n\r\n // Check for extensions\r\n const s3tc = gl.getExtension('WEBGL_compressed_texture_s3tc') || \r\n gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');\r\n const bptc = gl.getExtension('EXT_texture_compression_bptc');\r\n const etc1 = gl.getExtension('WEBGL_compressed_texture_etc1');\r\n const etc = gl.getExtension('WEBGL_compressed_texture_etc');\r\n const astc = gl.getExtension('WEBGL_compressed_texture_astc');\r\n const pvrtc = gl.getExtension('WEBGL_compressed_texture_pvrtc') ||\r\n gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');\r\n\r\n // For ETC1S: Use BC1 (no alpha support in ETC1S)\r\n // For UASTC with alpha: Use BC3/BC7\r\n // For UASTC without alpha: Use BC1\r\n \r\n // BC7 on desktop with WebGL2 (requires separate BPTC extension)\r\n // Only use for UASTC with alpha\r\n if (isWebGL2 && bptc && hasAlpha && !isETC1S) {\r\n return {\r\n basisFormat: BASIS_FORMAT.BC7_M5,\r\n glFormat: gl.RGBA,\r\n glInternalFormat: (bptc as any).COMPRESSED_RGBA_BPTC_UNORM_EXT,\r\n compressed: true\r\n };\r\n }\r\n\r\n // BC3 (DXT5) on desktop - only for textures with alpha (UASTC)\r\n if (s3tc && hasAlpha && !isETC1S) {\r\n return {\r\n basisFormat: BASIS_FORMAT.BC3,\r\n glFormat: gl.RGBA,\r\n glInternalFormat: (s3tc as any).COMPRESSED_RGBA_S3TC_DXT5_EXT,\r\n compressed: true\r\n };\r\n }\r\n \r\n // BC1 (DXT1) on desktop - for ETC1S or textures without alpha\r\n if (s3tc) {\r\n return {\r\n basisFormat: BASIS_FORMAT.BC1,\r\n glFormat: gl.RGB,\r\n glInternalFormat: (s3tc as any).COMPRESSED_RGB_S3TC_DXT1_EXT,\r\n compressed: true\r\n };\r\n }\r\n\r\n // ASTC on mobile (best quality)\r\n if (astc) {\r\n return {\r\n basisFormat: BASIS_FORMAT.ASTC_4x4,\r\n glFormat: gl.RGBA,\r\n glInternalFormat: (astc as any).COMPRESSED_RGBA_ASTC_4x4_KHR,\r\n compressed: true\r\n };\r\n }\r\n\r\n // ETC2 on mobile with WebGL2\r\n if (isWebGL2 && etc) {\r\n return {\r\n basisFormat: BASIS_FORMAT.ETC2,\r\n glFormat: gl.RGBA,\r\n glInternalFormat: (etc as any).COMPRESSED_RGBA8_ETC2_EAC || 0x9278,\r\n compressed: true\r\n };\r\n }\r\n\r\n // ETC1 on mobile\r\n if (etc1 || etc) {\r\n return {\r\n basisFormat: BASIS_FORMAT.ETC1,\r\n glFormat: gl.RGB,\r\n glInternalFormat: (etc1 as any)?.COMPRESSED_RGB_ETC1_WEBGL || 0x8D64,\r\n compressed: true\r\n };\r\n }\r\n\r\n // PVRTC on iOS (last resort for compressed)\r\n if (pvrtc) {\r\n return {\r\n basisFormat: hasAlpha ? BASIS_FORMAT.PVRTC1_4_RGBA : BASIS_FORMAT.PVRTC1_4_RGB,\r\n glFormat: gl.RGBA,\r\n glInternalFormat: (pvrtc as any).COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\r\n compressed: true\r\n };\r\n }\r\n\r\n // Fallback to uncompressed RGBA\r\n return {\r\n basisFormat: BASIS_FORMAT.RGBA32,\r\n glFormat: gl.RGBA,\r\n glInternalFormat: gl.RGBA,\r\n compressed: false\r\n };\r\n }\r\n\r\n /**\r\n * Dispose resources\r\n */\r\n dispose(): void {\r\n this.module = null;\r\n this.initialized = false;\r\n this.initPromise = null;\r\n }\r\n}\r\n\r\n","import { StowKitReader, AssetType, PerfLogger } from '@series-inc/stowkit-reader';\r\nimport { BasisTranscoder } from './BasisTranscoder';\r\n\r\nexport interface TextureData {\r\n texture: WebGLTexture;\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * Represents an opened StowKit pack for Phaser\r\n * Supports loading images and audio only (no 3D models)\r\n */\r\nexport class StowKitPhaserPack {\r\n public reader: StowKitReader;\r\n private transcoder: BasisTranscoder;\r\n private tempGl: WebGLRenderingContext | WebGL2RenderingContext;\r\n private textureCache: Map<string, any> = new Map();\r\n private transcodedDataCache: Map<number, { data: Uint8Array, width: number, height: number, compressed: boolean, format: number, internalFormat?: number }> = new Map();\r\n\r\n constructor(\r\n reader: StowKitReader,\r\n transcoder: BasisTranscoder,\r\n gl: WebGLRenderingContext | WebGL2RenderingContext\r\n ) {\r\n this.reader = reader;\r\n this.transcoder = transcoder;\r\n this.tempGl = gl;\r\n }\r\n\r\n /**\r\n * Load a texture by its canonical path/name\r\n * Returns a Phaser texture\r\n */\r\n async loadTexture(assetPath: string, scene: any): Promise<any> {\r\n const totalStart = performance.now();\r\n \r\n // Check cache first\r\n if (this.textureCache.has(assetPath)) {\r\n PerfLogger.log(`[Perf] Texture cache hit: ${assetPath}`);\r\n return this.textureCache.get(assetPath)!;\r\n }\r\n\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Texture not found: ${assetPath}`);\r\n }\r\n\r\n // Verify it's a texture\r\n const info = this.reader.getAssetInfo(assetIndex);\r\n if (!info || info.type !== AssetType.TEXTURE_2D) {\r\n throw new Error(`Asset is not a texture: ${assetPath}`);\r\n }\r\n\r\n // Use the same logic as getPhaserTexture but with custom key\r\n const key = assetPath;\r\n const gl = scene.sys.game.renderer.gl;\r\n \r\n // Read and transcode\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data for ${assetPath}`);\r\n }\r\n\r\n const transcodeStart = performance.now();\r\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\r\n PerfLogger.log(`[Perf] Phaser Basis transcode: ${(performance.now() - transcodeStart).toFixed(2)}ms (${transcoded.width}x${transcoded.height})`);\r\n \r\n // Format like Phaser's KTX parser\r\n const compressedTextureData = {\r\n mipmaps: [{\r\n data: transcoded.data,\r\n width: transcoded.width,\r\n height: transcoded.height\r\n }],\r\n width: transcoded.width,\r\n height: transcoded.height,\r\n internalFormat: transcoded.internalFormat,\r\n compressed: transcoded.compressed,\r\n generateMipmap: false,\r\n format: transcoded.internalFormat\r\n };\r\n \r\n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\r\n this.textureCache.set(assetPath, phaserTexture);\r\n \r\n PerfLogger.log(`[Perf] ===== Total Phaser texture load: ${(performance.now() - totalStart).toFixed(2)}ms =====`);\r\n return phaserTexture;\r\n }\r\n\r\n /**\r\n * Get a Phaser texture by index (for previews/demos)\r\n * Creates compressed texture directly in Phaser's GL context\r\n */\r\n async getPhaserTexture(index: number, scene: any): Promise<any> {\r\n const key = `texture_${index}`;\r\n \r\n // Check if already exists in Phaser's texture manager\r\n if (scene.textures.exists(key)) {\r\n return scene.textures.get(key);\r\n }\r\n \r\n // Get Phaser's GL context\r\n const gl = scene.sys.game.renderer.gl;\r\n \r\n // Read and transcode the KTX2 data\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data for index ${index}`);\r\n }\r\n\r\n // Transcode to compressed format (don't create the WebGL texture yet - let Phaser do it)\r\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\r\n \r\n // Format the data exactly like Phaser's KTX parser output\r\n const compressedTextureData = {\r\n mipmaps: [{\r\n data: transcoded.data,\r\n width: transcoded.width,\r\n height: transcoded.height\r\n }],\r\n width: transcoded.width,\r\n height: transcoded.height,\r\n internalFormat: transcoded.internalFormat,\r\n compressed: transcoded.compressed,\r\n generateMipmap: false,\r\n format: transcoded.internalFormat // Phaser uses this for compressionAlgorithm\r\n };\r\n \r\n // Add to Phaser's texture manager as a compressed texture\r\n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\r\n \r\n // Cache it\r\n this.textureCache.set(key, phaserTexture);\r\n \r\n return phaserTexture;\r\n }\r\n \r\n /**\r\n * Load texture by index into a specific GL context\r\n */\r\n private async loadTextureInContext(index: number, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\r\n // Read texture data\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data for index ${index}`);\r\n }\r\n\r\n // Get metadata - all textures in .stow files are KTX2 format\r\n const metadata = this.reader.parseTextureMetadata(index);\r\n const isKtx2 = metadata?.channelFormat !== undefined;\r\n\r\n if (isKtx2) {\r\n // Transcode KTX2 to WebGL texture using the provided context\r\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\r\n \r\n // Create WebGL texture in the provided context\r\n const texture = gl.createTexture();\r\n if (!texture) {\r\n throw new Error('Failed to create WebGL texture');\r\n }\r\n\r\n gl.bindTexture(gl.TEXTURE_2D, texture);\r\n\r\n if (transcoded.compressed) {\r\n gl.compressedTexImage2D(\r\n gl.TEXTURE_2D,\r\n 0,\r\n transcoded.internalFormat!,\r\n transcoded.width,\r\n transcoded.height,\r\n 0,\r\n transcoded.data\r\n );\r\n } else {\r\n gl.texImage2D(\r\n gl.TEXTURE_2D,\r\n 0,\r\n transcoded.internalFormat!,\r\n transcoded.width,\r\n transcoded.height,\r\n 0,\r\n transcoded.format,\r\n gl.UNSIGNED_BYTE,\r\n transcoded.data\r\n );\r\n }\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n\r\n gl.bindTexture(gl.TEXTURE_2D, null);\r\n\r\n return {\r\n texture,\r\n width: transcoded.width,\r\n height: transcoded.height\r\n };\r\n } else {\r\n // Handle uncompressed image data\r\n return await this.loadUncompressedTextureInContext(data, gl);\r\n }\r\n }\r\n\r\n /**\r\n * Load uncompressed image (PNG, JPEG) as WebGL texture in a specific context\r\n */\r\n private async loadUncompressedTextureInContext(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\r\n return new Promise((resolve, reject) => {\r\n const blob = new Blob([data.buffer as ArrayBuffer]);\r\n const url = URL.createObjectURL(blob);\r\n \r\n const img = new Image();\r\n img.onload = () => {\r\n const texture = gl.createTexture();\r\n if (!texture) {\r\n URL.revokeObjectURL(url);\r\n reject(new Error('Failed to create WebGL texture'));\r\n return;\r\n }\r\n\r\n gl.bindTexture(gl.TEXTURE_2D, texture);\r\n gl.texImage2D(\r\n gl.TEXTURE_2D,\r\n 0,\r\n gl.RGBA,\r\n gl.RGBA,\r\n gl.UNSIGNED_BYTE,\r\n img\r\n );\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n\r\n gl.bindTexture(gl.TEXTURE_2D, null);\r\n\r\n URL.revokeObjectURL(url);\r\n\r\n resolve({\r\n texture,\r\n width: img.width,\r\n height: img.height\r\n });\r\n };\r\n\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n reject(new Error('Failed to load image'));\r\n };\r\n\r\n img.src = url;\r\n });\r\n }\r\n\r\n /**\r\n * Load audio by its canonical path/name\r\n * Returns an AudioBuffer\r\n */\r\n async loadAudio(assetPath: string, audioContext?: AudioContext): Promise<AudioBuffer> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Audio not found: ${assetPath}`);\r\n }\r\n\r\n // Verify it's audio\r\n const info = this.reader.getAssetInfo(assetIndex);\r\n if (!info || info.type !== AssetType.AUDIO) {\r\n throw new Error(`Asset is not audio: ${assetPath}`);\r\n }\r\n\r\n return await this.loadAudioByIndex(assetIndex, audioContext);\r\n }\r\n\r\n /**\r\n * Load audio by index\r\n */\r\n async loadAudioByIndex(index: number, audioContext?: AudioContext): Promise<AudioBuffer> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for index ${index}`);\r\n }\r\n\r\n // Use provided context or create a new one\r\n const ctx = audioContext || new AudioContext();\r\n\r\n // Decode audio data\r\n const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const audioBuffer = await ctx.decodeAudioData(arrayBuffer);\r\n\r\n return audioBuffer;\r\n }\r\n\r\n /**\r\n * Create an HTML audio element for preview\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read audio for index ${index}`);\r\n }\r\n\r\n const blob = new Blob([data.buffer as ArrayBuffer], { type: 'audio/mp4' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n\r\n /**\r\n * Get list of all assets in pack\r\n */\r\n listAssets() {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Get asset count\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get asset info by index\r\n */\r\n getAssetInfo(index: number) {\r\n return this.reader.getAssetInfo(index);\r\n }\r\n\r\n /**\r\n * Get texture metadata\r\n */\r\n getTextureMetadata(index: number) {\r\n return this.reader.parseTextureMetadata(index);\r\n }\r\n\r\n /**\r\n * Get audio metadata\r\n */\r\n getAudioMetadata(index: number) {\r\n return this.reader.parseAudioMetadata(index);\r\n }\r\n\r\n /**\r\n * Close the pack and free resources\r\n */\r\n dispose(): void {\r\n // Clear texture cache (Phaser manages texture disposal)\r\n this.textureCache.clear();\r\n this.transcodedDataCache.clear();\r\n\r\n // Close reader\r\n this.reader.close();\r\n }\r\n}\r\n\r\n\r\n","import { StowKitReader } from '@series-inc/stowkit-reader';\r\nimport { BasisTranscoder } from './BasisTranscoder';\r\nimport { StowKitPhaserPack } from './StowKitPhaserPack';\r\n\r\nexport interface StowKitPhaserLoaderOptions {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/basis/'\r\n */\r\n basisPath?: string;\r\n\r\n /**\r\n * Path to WASM reader module\r\n * @default '/stowkit/stowkit_reader.wasm'\r\n */\r\n wasmPath?: string;\r\n\r\n /**\r\n * WebGL context to use for texture loading\r\n * If not provided, a temporary canvas will be created\r\n */\r\n gl?: WebGLRenderingContext | WebGL2RenderingContext;\r\n}\r\n\r\n/**\r\n * Phaser loader for StowKit asset packs\r\n * Supports images and audio only (no 3D models)\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const pack = await StowKitPhaserLoader.load('assets.stow');\r\n * const texture = await pack.loadTexture('textures/player');\r\n * const audio = await pack.loadAudio('sounds/bgm');\r\n * ```\r\n */\r\nexport class StowKitPhaserLoader {\r\n private static transcoder: BasisTranscoder | null = null;\r\n private static initialized = false;\r\n private static gl: WebGLRenderingContext | WebGL2RenderingContext | null = null;\r\n private static ownGl = false;\r\n private static wasmPath: string = '/stowkit/stowkit_reader.wasm';\r\n\r\n /**\r\n * Load a .stow pack file from a URL\r\n */\r\n static async load(url: string, options?: StowKitPhaserLoaderOptions): Promise<StowKitPhaserPack> {\r\n // Initialize loaders if needed\r\n if (!this.initialized) {\r\n await this.initialize(options);\r\n }\r\n\r\n // Fetch the pack file\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n\r\n // Create a new reader instance for this pack\r\n const reader = new StowKitReader(this.wasmPath);\r\n await reader.init();\r\n await reader.open(arrayBuffer);\r\n\r\n // Return pack wrapper with its own dedicated reader\r\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\r\n }\r\n\r\n /**\r\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\r\n */\r\n static async loadFromMemory(\r\n data: ArrayBuffer | Blob | File,\r\n options?: StowKitPhaserLoaderOptions\r\n ): Promise<StowKitPhaserPack> {\r\n // Initialize loaders if needed\r\n if (!this.initialized) {\r\n await this.initialize(options);\r\n }\r\n\r\n // Convert to ArrayBuffer if needed\r\n let arrayBuffer: ArrayBuffer;\r\n if (data instanceof ArrayBuffer) {\r\n arrayBuffer = data;\r\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\r\n arrayBuffer = await data.arrayBuffer();\r\n } else if ('arrayBuffer' in data && typeof (data as any).arrayBuffer === 'function') {\r\n arrayBuffer = await (data as any).arrayBuffer();\r\n } else {\r\n throw new Error('Data must be ArrayBuffer, Blob, or File');\r\n }\r\n\r\n // Create a new reader instance for this pack\r\n const reader = new StowKitReader(this.wasmPath);\r\n await reader.init();\r\n await reader.open(arrayBuffer);\r\n\r\n // Return pack wrapper with its own dedicated reader\r\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\r\n }\r\n\r\n /**\r\n * Initialize the loader (called automatically on first load)\r\n */\r\n private static async initialize(options?: StowKitPhaserLoaderOptions): Promise<void> {\r\n this.wasmPath = options?.wasmPath || '/stowkit/stowkit_reader.wasm';\r\n const basisPath = options?.basisPath || '/basis/';\r\n\r\n // Get or create WebGL context (shared across all packs)\r\n if (options?.gl) {\r\n this.gl = options.gl;\r\n this.ownGl = false;\r\n } else {\r\n // Create a temporary canvas for WebGL operations\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 1;\r\n canvas.height = 1;\r\n canvas.style.display = 'none';\r\n document.body.appendChild(canvas);\r\n\r\n this.gl = canvas.getContext('webgl2') || canvas.getContext('webgl');\r\n if (!this.gl) {\r\n throw new Error('Failed to create WebGL context');\r\n }\r\n this.ownGl = true;\r\n }\r\n\r\n // Initialize basis transcoder (shared across all packs)\r\n this.transcoder = new BasisTranscoder(basisPath);\r\n await this.transcoder.init();\r\n\r\n this.initialized = true;\r\n }\r\n\r\n /**\r\n * Dispose of shared resources\r\n */\r\n static dispose(): void {\r\n if (this.transcoder) {\r\n this.transcoder.dispose();\r\n this.transcoder = null;\r\n }\r\n\r\n // Only dispose GL if we created it\r\n if (this.gl && this.ownGl) {\r\n const canvas = (this.gl as any).canvas;\r\n if (canvas && canvas.parentNode) {\r\n canvas.parentNode.removeChild(canvas);\r\n }\r\n this.gl = null;\r\n }\r\n\r\n this.initialized = false;\r\n }\r\n}\r\n\r\n"],"names":[],"mappings":"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"}