@series-inc/stowkit-phaser-loader 0.1.19 → 0.1.21

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.
@@ -50,7 +50,7 @@ export declare class StowKitPhaserPack {
50
50
  /**
51
51
  * Get list of all assets in pack
52
52
  */
53
- listAssets(): import("@series-inc/stowkit-reader").AssetListItem[];
53
+ listAssets(): any;
54
54
  /**
55
55
  * Get asset count
56
56
  */
@@ -58,7 +58,7 @@ export declare class StowKitPhaserPack {
58
58
  /**
59
59
  * Get asset info by index
60
60
  */
61
- getAssetInfo(index: number): import("@series-inc/stowkit-reader").AssetInfo | null;
61
+ getAssetInfo(index: number): any;
62
62
  /**
63
63
  * Get texture metadata
64
64
  */
@@ -1 +1 @@
1
- {"version":3,"file":"StowKitPhaserPack.d.ts","sourceRoot":"","sources":["../src/StowKitPhaserPack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IACnB,MAAM,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAiD;IAC/D,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,mBAAmB,CAA6I;gBAGpK,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,eAAe,EAC3B,EAAE,EAAE,qBAAqB,GAAG,sBAAsB;IAOtD;;;OAGG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAyD9D;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IA4C/D;;OAEG;YACW,oBAAoB;IAiElC;;OAEG;YACW,gCAAgC;IAiD9C;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBrF;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBxF;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBlE;;OAEG;IACH,UAAU;IAIV;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM;IAI1B;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAIhC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM;IAI9B;;OAEG;IACH,OAAO,IAAI,IAAI;CAQlB"}
1
+ {"version":3,"file":"StowKitPhaserPack.d.ts","sourceRoot":"","sources":["../src/StowKitPhaserPack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IACnB,MAAM,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAiD;IAC/D,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,mBAAmB,CAA6I;gBAGpK,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,eAAe,EAC3B,EAAE,EAAE,qBAAqB,GAAG,sBAAsB;IAOtD;;;OAGG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAsE9D;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IA4C/D;;OAEG;YACW,oBAAoB;IAmElC;;OAEG;YACW,gCAAgC;IAiD9C;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBrF;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBxF;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBlE;;OAEG;IACH,UAAU;IAIV;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM;IAI1B;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAIhC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM;IAI9B;;OAEG;IACH,OAAO,IAAI,IAAI;CAQlB"}
@@ -290,6 +290,17 @@ class StowKitPhaserPack {
290
290
  format: transcoded.internalFormat
291
291
  };
292
292
  const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);
293
+ // Apply nearest filtering if metadata specifies it
294
+ const metadata = this.reader.parseTextureMetadata(assetIndex);
295
+ if (metadata?.filtering === 1) {
296
+ const glTexture = phaserTexture?.source?.[0]?.glTexture;
297
+ if (glTexture) {
298
+ gl.bindTexture(gl.TEXTURE_2D, glTexture);
299
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
300
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
301
+ gl.bindTexture(gl.TEXTURE_2D, null);
302
+ }
303
+ }
293
304
  this.textureCache.set(assetPath, phaserTexture);
294
305
  PerfLogger.log(`[Perf] ===== Total Phaser texture load: ${(performance.now() - totalStart).toFixed(2)}ms =====`);
295
306
  return phaserTexture;
@@ -362,8 +373,10 @@ class StowKitPhaserPack {
362
373
  }
363
374
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
364
375
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
365
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
366
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
376
+ // Apply nearest filtering if metadata specifies it (filtering === 1)
377
+ const useNearest = metadata?.filtering === 1;
378
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useNearest ? gl.NEAREST : gl.LINEAR);
379
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, useNearest ? gl.NEAREST : gl.LINEAR);
367
380
  gl.bindTexture(gl.TEXTURE_2D, null);
368
381
  return {
369
382
  texture,
@@ -1 +1 @@
1
- {"version":3,"file":"stowkit-phaser-loader.esm.js","sources":["../src/BasisTranscoder.ts","../src/StowKitPhaserPack.ts","../src/StowKitPhaserLoader.ts"],"sourcesContent":["/**\n * BasisTranscoder - Manually decode KTX2 textures to WebGL textures\n * Used for Phaser which doesn't have built-in KTX2 support\n */\n\ninterface BasisModule {\n initializeBasis: () => void;\n BasisFile: new (data: Uint8Array) => BasisFile;\n KTX2File: new (data: Uint8Array) => KTX2File;\n}\n\ninterface BasisFile {\n getNumImages(): number;\n getNumLevels(imageIndex: number): number;\n getImageWidth(imageIndex: number, level: number): number;\n getImageHeight(imageIndex: number, level: number): number;\n startTranscoding(): boolean;\n getImageTranscodedSizeInBytes(imageIndex: number, level: number, format: number): number;\n transcodeImage(\n dst: Uint8Array,\n imageIndex: number,\n level: number,\n format: number,\n unused: number,\n getAlphaForOpaqueFormats: number\n ): number;\n close(): void;\n delete(): void;\n}\n\ninterface KTX2File {\n isValid(): boolean;\n isUASTC(): boolean;\n isETC1S(): boolean;\n isHDR(): boolean;\n getWidth(): number;\n getHeight(): number;\n getLayers(): number;\n getLevels(): number;\n getFaces(): number;\n getHasAlpha(): boolean;\n getDFDFlags(): number;\n startTranscoding(): boolean;\n getImageLevelInfo(mip: number, layer: number, face: number): any;\n getImageTranscodedSizeInBytes(mip: number, layer: number, face: number, format: number): number;\n transcodeImage(\n dst: Uint8Array,\n mip: number,\n layer: number,\n face: number,\n format: number,\n unused1: number,\n unused2: number,\n unused3: number\n ): number;\n close(): void;\n delete(): void;\n}\n\n// Basis transcoder formats (from Three.js KTX2Loader.TranscoderFormat)\nconst BASIS_FORMAT = {\n ETC1: 0,\n ETC2: 1,\n BC1: 2, // DXT1\n BC3: 3, // DXT5\n BC4: 4,\n BC5: 5,\n BC7_M6_OPAQUE_ONLY: 6,\n BC7_M5: 7, // BC7\n PVRTC1_4_RGB: 8,\n PVRTC1_4_RGBA: 9,\n ASTC_4x4: 10,\n ATC_RGB: 11,\n ATC_RGBA: 12,\n RGBA32: 13,\n RGB565: 14,\n BGR565: 15,\n RGBA4444: 16,\n BC6H: 22,\n RGB_HALF: 24,\n RGBA_HALF: 25,\n};\n\nexport interface TranscodedTexture {\n data: Uint8Array;\n width: number;\n height: number;\n format: number;\n internalFormat?: number;\n compressed: boolean;\n}\n\nexport class BasisTranscoder {\n private module: BasisModule | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n private basisPath: string;\n\n constructor(basisPath: string = '/basis/') {\n this.basisPath = basisPath;\n }\n\n /**\n * Initialize the Basis Universal transcoder\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n try {\n // Load the basis transcoder\n const scriptPath = `${this.basisPath}basis_transcoder.js`;\n \n // Import the basis module\n const BasisModule = await this.loadBasisModule(scriptPath);\n \n // Initialize\n BasisModule.initializeBasis();\n this.module = BasisModule;\n this.initialized = true;\n } catch (error) {\n console.error('[BasisTranscoder] Failed to initialize:', error);\n throw error;\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Load the basis transcoder module\n */\n private async loadBasisModule(scriptPath: string): Promise<BasisModule> {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = scriptPath;\n script.async = true;\n \n script.onload = () => {\n // The basis transcoder exposes a global BASIS function\n if (typeof (window as any).BASIS === 'function') {\n (window as any).BASIS().then((module: BasisModule) => {\n resolve(module);\n }).catch(reject);\n } else {\n reject(new Error('BASIS module not found'));\n }\n };\n \n script.onerror = () => {\n reject(new Error(`Failed to load ${scriptPath}`));\n };\n \n document.head.appendChild(script);\n });\n }\n\n /**\n * Transcode KTX2 data to a WebGL-compatible format\n */\n async transcodeKTX2(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TranscodedTexture> {\n if (!this.initialized) {\n await this.init();\n }\n\n if (!this.module) {\n throw new Error('Basis module not initialized');\n }\n\n // Create KTX2File from data\n const ktx2File = new this.module.KTX2File(data);\n \n try {\n // Validate file\n if (!ktx2File.isValid()) {\n throw new Error('Invalid or unsupported KTX2 file');\n }\n\n // Get image dimensions\n const width = ktx2File.getWidth();\n const height = ktx2File.getHeight();\n \n // Check if the texture has alpha\n const hasAlpha = ktx2File.getHasAlpha();\n \n // Check format type (UASTC or ETC1S)\n const isUASTC = ktx2File.isUASTC();\n const isETC1S = ktx2File.isETC1S();\n\n // Start transcoding\n if (!ktx2File.startTranscoding()) {\n throw new Error('Failed to start KTX2 transcoding');\n }\n\n // Use first mip level, first layer, first face\n const mip = 0;\n const layer = 0;\n const face = 0;\n\n // Detect best format for this device and file type\n const targetFormat = this.detectBestFormat(gl, hasAlpha, isETC1S);\n \n // Get transcoded size\n const transcodedSize = ktx2File.getImageTranscodedSizeInBytes(\n mip,\n layer,\n face,\n targetFormat.basisFormat\n );\n\n // Allocate output buffer\n const transcodedData = new Uint8Array(transcodedSize);\n\n // Transcode (parameters: dst, mip, layer, face, format, unused1, unused2, unused3)\n const result = ktx2File.transcodeImage(\n transcodedData,\n mip,\n layer,\n face,\n targetFormat.basisFormat,\n 0,\n -1,\n -1\n );\n\n if (result === 0) {\n throw new Error('KTX2 transcoding failed');\n }\n\n return {\n data: transcodedData,\n width,\n height,\n format: targetFormat.glFormat,\n internalFormat: targetFormat.glInternalFormat,\n compressed: targetFormat.compressed\n };\n\n } finally {\n ktx2File.close();\n ktx2File.delete();\n }\n }\n\n /**\n * Detect the best compression format supported by the device\n */\n private detectBestFormat(gl: WebGLRenderingContext | WebGL2RenderingContext, hasAlpha: boolean = true, isETC1S: boolean = false): {\n basisFormat: number;\n glFormat: number;\n glInternalFormat: number;\n compressed: boolean;\n } {\n const isWebGL2 = gl instanceof WebGL2RenderingContext;\n\n // Check for extensions\n const s3tc = gl.getExtension('WEBGL_compressed_texture_s3tc') || \n gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');\n const bptc = gl.getExtension('EXT_texture_compression_bptc');\n const etc1 = gl.getExtension('WEBGL_compressed_texture_etc1');\n const etc = gl.getExtension('WEBGL_compressed_texture_etc');\n const astc = gl.getExtension('WEBGL_compressed_texture_astc');\n const pvrtc = gl.getExtension('WEBGL_compressed_texture_pvrtc') ||\n gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');\n\n // For ETC1S: Use BC1 (no alpha support in ETC1S)\n // For UASTC with alpha: Use BC3/BC7\n // For UASTC without alpha: Use BC1\n \n // BC7 on desktop with WebGL2 (requires separate BPTC extension)\n // Only use for UASTC with alpha\n if (isWebGL2 && bptc && hasAlpha && !isETC1S) {\n return {\n basisFormat: BASIS_FORMAT.BC7_M5,\n glFormat: gl.RGBA,\n glInternalFormat: (bptc as any).COMPRESSED_RGBA_BPTC_UNORM_EXT,\n compressed: true\n };\n }\n\n // BC3 (DXT5) on desktop - only for textures with alpha (UASTC)\n if (s3tc && hasAlpha && !isETC1S) {\n return {\n basisFormat: BASIS_FORMAT.BC3,\n glFormat: gl.RGBA,\n glInternalFormat: (s3tc as any).COMPRESSED_RGBA_S3TC_DXT5_EXT,\n compressed: true\n };\n }\n \n // BC1 (DXT1) on desktop - for ETC1S or textures without alpha\n if (s3tc) {\n return {\n basisFormat: BASIS_FORMAT.BC1,\n glFormat: gl.RGB,\n glInternalFormat: (s3tc as any).COMPRESSED_RGB_S3TC_DXT1_EXT,\n compressed: true\n };\n }\n\n // ASTC on mobile (best quality)\n if (astc) {\n return {\n basisFormat: BASIS_FORMAT.ASTC_4x4,\n glFormat: gl.RGBA,\n glInternalFormat: (astc as any).COMPRESSED_RGBA_ASTC_4x4_KHR,\n compressed: true\n };\n }\n\n // ETC2 on mobile with WebGL2\n if (isWebGL2 && etc) {\n return {\n basisFormat: BASIS_FORMAT.ETC2,\n glFormat: gl.RGBA,\n glInternalFormat: (etc as any).COMPRESSED_RGBA8_ETC2_EAC || 0x9278,\n compressed: true\n };\n }\n\n // ETC1 on mobile\n if (etc1 || etc) {\n return {\n basisFormat: BASIS_FORMAT.ETC1,\n glFormat: gl.RGB,\n glInternalFormat: (etc1 as any)?.COMPRESSED_RGB_ETC1_WEBGL || 0x8D64,\n compressed: true\n };\n }\n\n // PVRTC on iOS (last resort for compressed)\n if (pvrtc) {\n return {\n basisFormat: hasAlpha ? BASIS_FORMAT.PVRTC1_4_RGBA : BASIS_FORMAT.PVRTC1_4_RGB,\n glFormat: gl.RGBA,\n glInternalFormat: (pvrtc as any).COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n compressed: true\n };\n }\n\n // Fallback to uncompressed RGBA\n return {\n basisFormat: BASIS_FORMAT.RGBA32,\n glFormat: gl.RGBA,\n glInternalFormat: gl.RGBA,\n compressed: false\n };\n }\n\n /**\n * Dispose resources\n */\n dispose(): void {\n this.module = null;\n this.initialized = false;\n this.initPromise = null;\n }\n}\n\n","import { StowKitReader, AssetType, PerfLogger } from '@series-inc/stowkit-reader';\nimport { BasisTranscoder } from './BasisTranscoder';\n\nexport interface TextureData {\n texture: WebGLTexture;\n width: number;\n height: number;\n}\n\n/**\n * Represents an opened StowKit pack for Phaser\n * Supports loading images and audio only (no 3D models)\n */\nexport class StowKitPhaserPack {\n public reader: StowKitReader;\n private transcoder: BasisTranscoder;\n private tempGl: WebGLRenderingContext | WebGL2RenderingContext;\n private textureCache: Map<string, any> = new Map();\n private transcodedDataCache: Map<number, { data: Uint8Array, width: number, height: number, compressed: boolean, format: number, internalFormat?: number }> = new Map();\n\n constructor(\n reader: StowKitReader,\n transcoder: BasisTranscoder,\n gl: WebGLRenderingContext | WebGL2RenderingContext\n ) {\n this.reader = reader;\n this.transcoder = transcoder;\n this.tempGl = gl;\n }\n\n /**\n * Load a texture by its canonical path/name\n * Returns a Phaser texture\n */\n async loadTexture(assetPath: string, scene: any): Promise<any> {\n const totalStart = performance.now();\n \n // Check cache first\n if (this.textureCache.has(assetPath)) {\n PerfLogger.log(`[Perf] Texture cache hit: ${assetPath}`);\n return this.textureCache.get(assetPath)!;\n }\n\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Texture not found: ${assetPath}`);\n }\n\n // Verify it's a texture\n const info = this.reader.getAssetInfo(assetIndex);\n if (!info || info.type !== AssetType.TEXTURE_2D) {\n throw new Error(`Asset is not a texture: ${assetPath}`);\n }\n\n // Use the same logic as getPhaserTexture but with custom key\n const key = assetPath;\n const gl = scene.sys.game.renderer.gl;\n \n // Read and transcode\n const data = this.reader.readAssetData(assetIndex);\n if (!data) {\n throw new Error(`Failed to read texture data for ${assetPath}`);\n }\n\n const transcodeStart = performance.now();\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n PerfLogger.log(`[Perf] Phaser Basis transcode: ${(performance.now() - transcodeStart).toFixed(2)}ms (${transcoded.width}x${transcoded.height})`);\n \n // Format like Phaser's KTX parser\n const compressedTextureData = {\n mipmaps: [{\n data: transcoded.data,\n width: transcoded.width,\n height: transcoded.height\n }],\n width: transcoded.width,\n height: transcoded.height,\n internalFormat: transcoded.internalFormat,\n compressed: transcoded.compressed,\n generateMipmap: false,\n format: transcoded.internalFormat\n };\n \n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\n this.textureCache.set(assetPath, phaserTexture);\n \n PerfLogger.log(`[Perf] ===== Total Phaser texture load: ${(performance.now() - totalStart).toFixed(2)}ms =====`);\n return phaserTexture;\n }\n\n /**\n * Get a Phaser texture by index (for previews/demos)\n * Creates compressed texture directly in Phaser's GL context\n */\n async getPhaserTexture(index: number, scene: any): Promise<any> {\n const key = `texture_${index}`;\n \n // Check if already exists in Phaser's texture manager\n if (scene.textures.exists(key)) {\n return scene.textures.get(key);\n }\n \n // Get Phaser's GL context\n const gl = scene.sys.game.renderer.gl;\n \n // Read and transcode the KTX2 data\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read texture data for index ${index}`);\n }\n\n // Transcode to compressed format (don't create the WebGL texture yet - let Phaser do it)\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n \n // Format the data exactly like Phaser's KTX parser output\n const compressedTextureData = {\n mipmaps: [{\n data: transcoded.data,\n width: transcoded.width,\n height: transcoded.height\n }],\n width: transcoded.width,\n height: transcoded.height,\n internalFormat: transcoded.internalFormat,\n compressed: transcoded.compressed,\n generateMipmap: false,\n format: transcoded.internalFormat // Phaser uses this for compressionAlgorithm\n };\n \n // Add to Phaser's texture manager as a compressed texture\n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\n \n // Cache it\n this.textureCache.set(key, phaserTexture);\n \n return phaserTexture;\n }\n \n /**\n * Load texture by index into a specific GL context\n */\n private async loadTextureInContext(index: number, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\n // Read texture data\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read texture data for index ${index}`);\n }\n\n // Get metadata - all textures in .stow files are KTX2 format\n const metadata = this.reader.parseTextureMetadata(index);\n const isKtx2 = metadata?.channelFormat !== undefined;\n\n if (isKtx2) {\n // Transcode KTX2 to WebGL texture using the provided context\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n \n // Create WebGL texture in the provided context\n const texture = gl.createTexture();\n if (!texture) {\n throw new Error('Failed to create WebGL texture');\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n if (transcoded.compressed) {\n gl.compressedTexImage2D(\n gl.TEXTURE_2D,\n 0,\n transcoded.internalFormat!,\n transcoded.width,\n transcoded.height,\n 0,\n transcoded.data\n );\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n transcoded.internalFormat!,\n transcoded.width,\n transcoded.height,\n 0,\n transcoded.format,\n gl.UNSIGNED_BYTE,\n transcoded.data\n );\n }\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texture,\n width: transcoded.width,\n height: transcoded.height\n };\n } else {\n // Handle uncompressed image data\n return await this.loadUncompressedTextureInContext(data, gl);\n }\n }\n\n /**\n * Load uncompressed image (PNG, JPEG) as WebGL texture in a specific context\n */\n private async loadUncompressedTextureInContext(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\n return new Promise((resolve, reject) => {\n const blob = new Blob([data.buffer as ArrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const img = new Image();\n img.onload = () => {\n const texture = gl.createTexture();\n if (!texture) {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to create WebGL texture'));\n return;\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n img\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n URL.revokeObjectURL(url);\n\n resolve({\n texture,\n width: img.width,\n height: img.height\n });\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to load image'));\n };\n\n img.src = url;\n });\n }\n\n /**\n * Load audio by its canonical path/name\n * Returns an AudioBuffer\n */\n async loadAudio(assetPath: string, audioContext?: AudioContext): Promise<AudioBuffer> {\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Audio not found: ${assetPath}`);\n }\n\n // Verify it's audio\n const info = this.reader.getAssetInfo(assetIndex);\n if (!info || info.type !== AssetType.AUDIO) {\n throw new Error(`Asset is not audio: ${assetPath}`);\n }\n\n return await this.loadAudioByIndex(assetIndex, audioContext);\n }\n\n /**\n * Load audio by index\n */\n async loadAudioByIndex(index: number, audioContext?: AudioContext): Promise<AudioBuffer> {\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read audio data for index ${index}`);\n }\n\n // Use provided context or create a new one\n const ctx = audioContext || new AudioContext();\n\n // Decode audio data\n const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const audioBuffer = await ctx.decodeAudioData(arrayBuffer);\n\n return audioBuffer;\n }\n\n /**\n * Create an HTML audio element for preview\n */\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read audio for index ${index}`);\n }\n\n const blob = new Blob([data.buffer as ArrayBuffer], { type: 'audio/mp4' });\n const url = URL.createObjectURL(blob);\n\n const audio = document.createElement('audio');\n audio.controls = true;\n audio.src = url;\n\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\n\n return audio;\n }\n\n\n /**\n * Get list of all assets in pack\n */\n listAssets() {\n return this.reader.listAssets();\n }\n\n /**\n * Get asset count\n */\n getAssetCount(): number {\n return this.reader.getAssetCount();\n }\n\n /**\n * Get asset info by index\n */\n getAssetInfo(index: number) {\n return this.reader.getAssetInfo(index);\n }\n\n /**\n * Get texture metadata\n */\n getTextureMetadata(index: number) {\n return this.reader.parseTextureMetadata(index);\n }\n\n /**\n * Get audio metadata\n */\n getAudioMetadata(index: number) {\n return this.reader.parseAudioMetadata(index);\n }\n\n /**\n * Close the pack and free resources\n */\n dispose(): void {\n // Clear texture cache (Phaser manages texture disposal)\n this.textureCache.clear();\n this.transcodedDataCache.clear();\n\n // Close reader\n this.reader.close();\n }\n}\n\n\n","import { StowKitReader } from '@series-inc/stowkit-reader';\nimport { BasisTranscoder } from './BasisTranscoder';\nimport { StowKitPhaserPack } from './StowKitPhaserPack';\n\nexport interface StowKitPhaserLoaderOptions {\n /**\n * Path to basis transcoder for KTX2 texture loading\n * @default '/basis/'\n */\n basisPath?: string;\n\n /**\n * Path to WASM reader module\n * @default '/stowkit/stowkit_reader.wasm'\n */\n wasmPath?: string;\n\n /**\n * WebGL context to use for texture loading\n * If not provided, a temporary canvas will be created\n */\n gl?: WebGLRenderingContext | WebGL2RenderingContext;\n}\n\n/**\n * Phaser loader for StowKit asset packs\n * Supports images and audio only (no 3D models)\n * \n * Usage:\n * ```typescript\n * const pack = await StowKitPhaserLoader.load('assets.stow');\n * const texture = await pack.loadTexture('textures/player');\n * const audio = await pack.loadAudio('sounds/bgm');\n * ```\n */\nexport class StowKitPhaserLoader {\n private static transcoder: BasisTranscoder | null = null;\n private static initialized = false;\n private static gl: WebGLRenderingContext | WebGL2RenderingContext | null = null;\n private static ownGl = false;\n private static wasmPath: string = '/stowkit/stowkit_reader.wasm';\n\n /**\n * Load a .stow pack file from a URL\n */\n static async load(url: string, options?: StowKitPhaserLoaderOptions): Promise<StowKitPhaserPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Fetch the pack file\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\n }\n\n /**\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\n */\n static async loadFromMemory(\n data: ArrayBuffer | Blob | File,\n options?: StowKitPhaserLoaderOptions\n ): Promise<StowKitPhaserPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Convert to ArrayBuffer if needed\n let arrayBuffer: ArrayBuffer;\n if (data instanceof ArrayBuffer) {\n arrayBuffer = data;\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n arrayBuffer = await data.arrayBuffer();\n } else if ('arrayBuffer' in data && typeof (data as any).arrayBuffer === 'function') {\n arrayBuffer = await (data as any).arrayBuffer();\n } else {\n throw new Error('Data must be ArrayBuffer, Blob, or File');\n }\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\n }\n\n /**\n * Initialize the loader (called automatically on first load)\n */\n private static async initialize(options?: StowKitPhaserLoaderOptions): Promise<void> {\n this.wasmPath = options?.wasmPath || '/stowkit/stowkit_reader.wasm';\n const basisPath = options?.basisPath || '/basis/';\n\n // Get or create WebGL context (shared across all packs)\n if (options?.gl) {\n this.gl = options.gl;\n this.ownGl = false;\n } else {\n // Create a temporary canvas for WebGL operations\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n canvas.style.display = 'none';\n document.body.appendChild(canvas);\n\n this.gl = canvas.getContext('webgl2') || canvas.getContext('webgl');\n if (!this.gl) {\n throw new Error('Failed to create WebGL context');\n }\n this.ownGl = true;\n }\n\n // Initialize basis transcoder (shared across all packs)\n this.transcoder = new BasisTranscoder(basisPath);\n await this.transcoder.init();\n\n this.initialized = true;\n }\n\n /**\n * Dispose of shared resources\n */\n static dispose(): void {\n if (this.transcoder) {\n this.transcoder.dispose();\n this.transcoder = null;\n }\n\n // Only dispose GL if we created it\n if (this.gl && this.ownGl) {\n const canvas = (this.gl as any).canvas;\n if (canvas && canvas.parentNode) {\n canvas.parentNode.removeChild(canvas);\n }\n this.gl = null;\n }\n\n this.initialized = false;\n }\n}\n\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stowkit-phaser-loader.esm.js","sources":["../src/BasisTranscoder.ts","../src/StowKitPhaserPack.ts","../src/StowKitPhaserLoader.ts"],"sourcesContent":["/**\n * BasisTranscoder - Manually decode KTX2 textures to WebGL textures\n * Used for Phaser which doesn't have built-in KTX2 support\n */\n\ninterface BasisModule {\n initializeBasis: () => void;\n BasisFile: new (data: Uint8Array) => BasisFile;\n KTX2File: new (data: Uint8Array) => KTX2File;\n}\n\ninterface BasisFile {\n getNumImages(): number;\n getNumLevels(imageIndex: number): number;\n getImageWidth(imageIndex: number, level: number): number;\n getImageHeight(imageIndex: number, level: number): number;\n startTranscoding(): boolean;\n getImageTranscodedSizeInBytes(imageIndex: number, level: number, format: number): number;\n transcodeImage(\n dst: Uint8Array,\n imageIndex: number,\n level: number,\n format: number,\n unused: number,\n getAlphaForOpaqueFormats: number\n ): number;\n close(): void;\n delete(): void;\n}\n\ninterface KTX2File {\n isValid(): boolean;\n isUASTC(): boolean;\n isETC1S(): boolean;\n isHDR(): boolean;\n getWidth(): number;\n getHeight(): number;\n getLayers(): number;\n getLevels(): number;\n getFaces(): number;\n getHasAlpha(): boolean;\n getDFDFlags(): number;\n startTranscoding(): boolean;\n getImageLevelInfo(mip: number, layer: number, face: number): any;\n getImageTranscodedSizeInBytes(mip: number, layer: number, face: number, format: number): number;\n transcodeImage(\n dst: Uint8Array,\n mip: number,\n layer: number,\n face: number,\n format: number,\n unused1: number,\n unused2: number,\n unused3: number\n ): number;\n close(): void;\n delete(): void;\n}\n\n// Basis transcoder formats (from Three.js KTX2Loader.TranscoderFormat)\nconst BASIS_FORMAT = {\n ETC1: 0,\n ETC2: 1,\n BC1: 2, // DXT1\n BC3: 3, // DXT5\n BC4: 4,\n BC5: 5,\n BC7_M6_OPAQUE_ONLY: 6,\n BC7_M5: 7, // BC7\n PVRTC1_4_RGB: 8,\n PVRTC1_4_RGBA: 9,\n ASTC_4x4: 10,\n ATC_RGB: 11,\n ATC_RGBA: 12,\n RGBA32: 13,\n RGB565: 14,\n BGR565: 15,\n RGBA4444: 16,\n BC6H: 22,\n RGB_HALF: 24,\n RGBA_HALF: 25,\n};\n\nexport interface TranscodedTexture {\n data: Uint8Array;\n width: number;\n height: number;\n format: number;\n internalFormat?: number;\n compressed: boolean;\n}\n\nexport class BasisTranscoder {\n private module: BasisModule | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n private basisPath: string;\n\n constructor(basisPath: string = '/basis/') {\n this.basisPath = basisPath;\n }\n\n /**\n * Initialize the Basis Universal transcoder\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n try {\n // Load the basis transcoder\n const scriptPath = `${this.basisPath}basis_transcoder.js`;\n \n // Import the basis module\n const BasisModule = await this.loadBasisModule(scriptPath);\n \n // Initialize\n BasisModule.initializeBasis();\n this.module = BasisModule;\n this.initialized = true;\n } catch (error) {\n console.error('[BasisTranscoder] Failed to initialize:', error);\n throw error;\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Load the basis transcoder module\n */\n private async loadBasisModule(scriptPath: string): Promise<BasisModule> {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = scriptPath;\n script.async = true;\n \n script.onload = () => {\n // The basis transcoder exposes a global BASIS function\n if (typeof (window as any).BASIS === 'function') {\n (window as any).BASIS().then((module: BasisModule) => {\n resolve(module);\n }).catch(reject);\n } else {\n reject(new Error('BASIS module not found'));\n }\n };\n \n script.onerror = () => {\n reject(new Error(`Failed to load ${scriptPath}`));\n };\n \n document.head.appendChild(script);\n });\n }\n\n /**\n * Transcode KTX2 data to a WebGL-compatible format\n */\n async transcodeKTX2(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TranscodedTexture> {\n if (!this.initialized) {\n await this.init();\n }\n\n if (!this.module) {\n throw new Error('Basis module not initialized');\n }\n\n // Create KTX2File from data\n const ktx2File = new this.module.KTX2File(data);\n \n try {\n // Validate file\n if (!ktx2File.isValid()) {\n throw new Error('Invalid or unsupported KTX2 file');\n }\n\n // Get image dimensions\n const width = ktx2File.getWidth();\n const height = ktx2File.getHeight();\n \n // Check if the texture has alpha\n const hasAlpha = ktx2File.getHasAlpha();\n \n // Check format type (UASTC or ETC1S)\n const isUASTC = ktx2File.isUASTC();\n const isETC1S = ktx2File.isETC1S();\n\n // Start transcoding\n if (!ktx2File.startTranscoding()) {\n throw new Error('Failed to start KTX2 transcoding');\n }\n\n // Use first mip level, first layer, first face\n const mip = 0;\n const layer = 0;\n const face = 0;\n\n // Detect best format for this device and file type\n const targetFormat = this.detectBestFormat(gl, hasAlpha, isETC1S);\n \n // Get transcoded size\n const transcodedSize = ktx2File.getImageTranscodedSizeInBytes(\n mip,\n layer,\n face,\n targetFormat.basisFormat\n );\n\n // Allocate output buffer\n const transcodedData = new Uint8Array(transcodedSize);\n\n // Transcode (parameters: dst, mip, layer, face, format, unused1, unused2, unused3)\n const result = ktx2File.transcodeImage(\n transcodedData,\n mip,\n layer,\n face,\n targetFormat.basisFormat,\n 0,\n -1,\n -1\n );\n\n if (result === 0) {\n throw new Error('KTX2 transcoding failed');\n }\n\n return {\n data: transcodedData,\n width,\n height,\n format: targetFormat.glFormat,\n internalFormat: targetFormat.glInternalFormat,\n compressed: targetFormat.compressed\n };\n\n } finally {\n ktx2File.close();\n ktx2File.delete();\n }\n }\n\n /**\n * Detect the best compression format supported by the device\n */\n private detectBestFormat(gl: WebGLRenderingContext | WebGL2RenderingContext, hasAlpha: boolean = true, isETC1S: boolean = false): {\n basisFormat: number;\n glFormat: number;\n glInternalFormat: number;\n compressed: boolean;\n } {\n const isWebGL2 = gl instanceof WebGL2RenderingContext;\n\n // Check for extensions\n const s3tc = gl.getExtension('WEBGL_compressed_texture_s3tc') || \n gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');\n const bptc = gl.getExtension('EXT_texture_compression_bptc');\n const etc1 = gl.getExtension('WEBGL_compressed_texture_etc1');\n const etc = gl.getExtension('WEBGL_compressed_texture_etc');\n const astc = gl.getExtension('WEBGL_compressed_texture_astc');\n const pvrtc = gl.getExtension('WEBGL_compressed_texture_pvrtc') ||\n gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');\n\n // For ETC1S: Use BC1 (no alpha support in ETC1S)\n // For UASTC with alpha: Use BC3/BC7\n // For UASTC without alpha: Use BC1\n \n // BC7 on desktop with WebGL2 (requires separate BPTC extension)\n // Only use for UASTC with alpha\n if (isWebGL2 && bptc && hasAlpha && !isETC1S) {\n return {\n basisFormat: BASIS_FORMAT.BC7_M5,\n glFormat: gl.RGBA,\n glInternalFormat: (bptc as any).COMPRESSED_RGBA_BPTC_UNORM_EXT,\n compressed: true\n };\n }\n\n // BC3 (DXT5) on desktop - only for textures with alpha (UASTC)\n if (s3tc && hasAlpha && !isETC1S) {\n return {\n basisFormat: BASIS_FORMAT.BC3,\n glFormat: gl.RGBA,\n glInternalFormat: (s3tc as any).COMPRESSED_RGBA_S3TC_DXT5_EXT,\n compressed: true\n };\n }\n \n // BC1 (DXT1) on desktop - for ETC1S or textures without alpha\n if (s3tc) {\n return {\n basisFormat: BASIS_FORMAT.BC1,\n glFormat: gl.RGB,\n glInternalFormat: (s3tc as any).COMPRESSED_RGB_S3TC_DXT1_EXT,\n compressed: true\n };\n }\n\n // ASTC on mobile (best quality)\n if (astc) {\n return {\n basisFormat: BASIS_FORMAT.ASTC_4x4,\n glFormat: gl.RGBA,\n glInternalFormat: (astc as any).COMPRESSED_RGBA_ASTC_4x4_KHR,\n compressed: true\n };\n }\n\n // ETC2 on mobile with WebGL2\n if (isWebGL2 && etc) {\n return {\n basisFormat: BASIS_FORMAT.ETC2,\n glFormat: gl.RGBA,\n glInternalFormat: (etc as any).COMPRESSED_RGBA8_ETC2_EAC || 0x9278,\n compressed: true\n };\n }\n\n // ETC1 on mobile\n if (etc1 || etc) {\n return {\n basisFormat: BASIS_FORMAT.ETC1,\n glFormat: gl.RGB,\n glInternalFormat: (etc1 as any)?.COMPRESSED_RGB_ETC1_WEBGL || 0x8D64,\n compressed: true\n };\n }\n\n // PVRTC on iOS (last resort for compressed)\n if (pvrtc) {\n return {\n basisFormat: hasAlpha ? BASIS_FORMAT.PVRTC1_4_RGBA : BASIS_FORMAT.PVRTC1_4_RGB,\n glFormat: gl.RGBA,\n glInternalFormat: (pvrtc as any).COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n compressed: true\n };\n }\n\n // Fallback to uncompressed RGBA\n return {\n basisFormat: BASIS_FORMAT.RGBA32,\n glFormat: gl.RGBA,\n glInternalFormat: gl.RGBA,\n compressed: false\n };\n }\n\n /**\n * Dispose resources\n */\n dispose(): void {\n this.module = null;\n this.initialized = false;\n this.initPromise = null;\n }\n}\n\n","import { StowKitReader, AssetType, PerfLogger } from '@series-inc/stowkit-reader';\nimport { BasisTranscoder } from './BasisTranscoder';\n\nexport interface TextureData {\n texture: WebGLTexture;\n width: number;\n height: number;\n}\n\n/**\n * Represents an opened StowKit pack for Phaser\n * Supports loading images and audio only (no 3D models)\n */\nexport class StowKitPhaserPack {\n public reader: StowKitReader;\n private transcoder: BasisTranscoder;\n private tempGl: WebGLRenderingContext | WebGL2RenderingContext;\n private textureCache: Map<string, any> = new Map();\n private transcodedDataCache: Map<number, { data: Uint8Array, width: number, height: number, compressed: boolean, format: number, internalFormat?: number }> = new Map();\n\n constructor(\n reader: StowKitReader,\n transcoder: BasisTranscoder,\n gl: WebGLRenderingContext | WebGL2RenderingContext\n ) {\n this.reader = reader;\n this.transcoder = transcoder;\n this.tempGl = gl;\n }\n\n /**\n * Load a texture by its canonical path/name\n * Returns a Phaser texture\n */\n async loadTexture(assetPath: string, scene: any): Promise<any> {\n const totalStart = performance.now();\n \n // Check cache first\n if (this.textureCache.has(assetPath)) {\n PerfLogger.log(`[Perf] Texture cache hit: ${assetPath}`);\n return this.textureCache.get(assetPath)!;\n }\n\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Texture not found: ${assetPath}`);\n }\n\n // Verify it's a texture\n const info = this.reader.getAssetInfo(assetIndex);\n if (!info || info.type !== AssetType.TEXTURE_2D) {\n throw new Error(`Asset is not a texture: ${assetPath}`);\n }\n\n // Use the same logic as getPhaserTexture but with custom key\n const key = assetPath;\n const gl = scene.sys.game.renderer.gl;\n \n // Read and transcode\n const data = this.reader.readAssetData(assetIndex);\n if (!data) {\n throw new Error(`Failed to read texture data for ${assetPath}`);\n }\n\n const transcodeStart = performance.now();\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n PerfLogger.log(`[Perf] Phaser Basis transcode: ${(performance.now() - transcodeStart).toFixed(2)}ms (${transcoded.width}x${transcoded.height})`);\n \n // Format like Phaser's KTX parser\n const compressedTextureData = {\n mipmaps: [{\n data: transcoded.data,\n width: transcoded.width,\n height: transcoded.height\n }],\n width: transcoded.width,\n height: transcoded.height,\n internalFormat: transcoded.internalFormat,\n compressed: transcoded.compressed,\n generateMipmap: false,\n format: transcoded.internalFormat\n };\n \n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\n\n // Apply nearest filtering if metadata specifies it\n const metadata = this.reader.parseTextureMetadata(assetIndex);\n if (metadata?.filtering === 1) {\n const glTexture = phaserTexture?.source?.[0]?.glTexture;\n if (glTexture) {\n gl.bindTexture(gl.TEXTURE_2D, glTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n }\n\n this.textureCache.set(assetPath, phaserTexture);\n\n PerfLogger.log(`[Perf] ===== Total Phaser texture load: ${(performance.now() - totalStart).toFixed(2)}ms =====`);\n return phaserTexture;\n }\n\n /**\n * Get a Phaser texture by index (for previews/demos)\n * Creates compressed texture directly in Phaser's GL context\n */\n async getPhaserTexture(index: number, scene: any): Promise<any> {\n const key = `texture_${index}`;\n \n // Check if already exists in Phaser's texture manager\n if (scene.textures.exists(key)) {\n return scene.textures.get(key);\n }\n \n // Get Phaser's GL context\n const gl = scene.sys.game.renderer.gl;\n \n // Read and transcode the KTX2 data\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read texture data for index ${index}`);\n }\n\n // Transcode to compressed format (don't create the WebGL texture yet - let Phaser do it)\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n \n // Format the data exactly like Phaser's KTX parser output\n const compressedTextureData = {\n mipmaps: [{\n data: transcoded.data,\n width: transcoded.width,\n height: transcoded.height\n }],\n width: transcoded.width,\n height: transcoded.height,\n internalFormat: transcoded.internalFormat,\n compressed: transcoded.compressed,\n generateMipmap: false,\n format: transcoded.internalFormat // Phaser uses this for compressionAlgorithm\n };\n \n // Add to Phaser's texture manager as a compressed texture\n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\n \n // Cache it\n this.textureCache.set(key, phaserTexture);\n \n return phaserTexture;\n }\n \n /**\n * Load texture by index into a specific GL context\n */\n private async loadTextureInContext(index: number, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\n // Read texture data\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read texture data for index ${index}`);\n }\n\n // Get metadata - all textures in .stow files are KTX2 format\n const metadata = this.reader.parseTextureMetadata(index);\n const isKtx2 = metadata?.channelFormat !== undefined;\n\n if (isKtx2) {\n // Transcode KTX2 to WebGL texture using the provided context\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n \n // Create WebGL texture in the provided context\n const texture = gl.createTexture();\n if (!texture) {\n throw new Error('Failed to create WebGL texture');\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n if (transcoded.compressed) {\n gl.compressedTexImage2D(\n gl.TEXTURE_2D,\n 0,\n transcoded.internalFormat!,\n transcoded.width,\n transcoded.height,\n 0,\n transcoded.data\n );\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n transcoded.internalFormat!,\n transcoded.width,\n transcoded.height,\n 0,\n transcoded.format,\n gl.UNSIGNED_BYTE,\n transcoded.data\n );\n }\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // Apply nearest filtering if metadata specifies it (filtering === 1)\n const useNearest = metadata?.filtering === 1;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useNearest ? gl.NEAREST : gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, useNearest ? gl.NEAREST : gl.LINEAR);\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texture,\n width: transcoded.width,\n height: transcoded.height\n };\n } else {\n // Handle uncompressed image data\n return await this.loadUncompressedTextureInContext(data, gl);\n }\n }\n\n /**\n * Load uncompressed image (PNG, JPEG) as WebGL texture in a specific context\n */\n private async loadUncompressedTextureInContext(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\n return new Promise((resolve, reject) => {\n const blob = new Blob([data.buffer as ArrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const img = new Image();\n img.onload = () => {\n const texture = gl.createTexture();\n if (!texture) {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to create WebGL texture'));\n return;\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n img\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n URL.revokeObjectURL(url);\n\n resolve({\n texture,\n width: img.width,\n height: img.height\n });\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to load image'));\n };\n\n img.src = url;\n });\n }\n\n /**\n * Load audio by its canonical path/name\n * Returns an AudioBuffer\n */\n async loadAudio(assetPath: string, audioContext?: AudioContext): Promise<AudioBuffer> {\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Audio not found: ${assetPath}`);\n }\n\n // Verify it's audio\n const info = this.reader.getAssetInfo(assetIndex);\n if (!info || info.type !== AssetType.AUDIO) {\n throw new Error(`Asset is not audio: ${assetPath}`);\n }\n\n return await this.loadAudioByIndex(assetIndex, audioContext);\n }\n\n /**\n * Load audio by index\n */\n async loadAudioByIndex(index: number, audioContext?: AudioContext): Promise<AudioBuffer> {\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read audio data for index ${index}`);\n }\n\n // Use provided context or create a new one\n const ctx = audioContext || new AudioContext();\n\n // Decode audio data\n const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const audioBuffer = await ctx.decodeAudioData(arrayBuffer);\n\n return audioBuffer;\n }\n\n /**\n * Create an HTML audio element for preview\n */\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read audio for index ${index}`);\n }\n\n const blob = new Blob([data.buffer as ArrayBuffer], { type: 'audio/mp4' });\n const url = URL.createObjectURL(blob);\n\n const audio = document.createElement('audio');\n audio.controls = true;\n audio.src = url;\n\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\n\n return audio;\n }\n\n\n /**\n * Get list of all assets in pack\n */\n listAssets() {\n return this.reader.listAssets();\n }\n\n /**\n * Get asset count\n */\n getAssetCount(): number {\n return this.reader.getAssetCount();\n }\n\n /**\n * Get asset info by index\n */\n getAssetInfo(index: number) {\n return this.reader.getAssetInfo(index);\n }\n\n /**\n * Get texture metadata\n */\n getTextureMetadata(index: number) {\n return this.reader.parseTextureMetadata(index);\n }\n\n /**\n * Get audio metadata\n */\n getAudioMetadata(index: number) {\n return this.reader.parseAudioMetadata(index);\n }\n\n /**\n * Close the pack and free resources\n */\n dispose(): void {\n // Clear texture cache (Phaser manages texture disposal)\n this.textureCache.clear();\n this.transcodedDataCache.clear();\n\n // Close reader\n this.reader.close();\n }\n}\n\n\n","import { StowKitReader } from '@series-inc/stowkit-reader';\nimport { BasisTranscoder } from './BasisTranscoder';\nimport { StowKitPhaserPack } from './StowKitPhaserPack';\n\nexport interface StowKitPhaserLoaderOptions {\n /**\n * Path to basis transcoder for KTX2 texture loading\n * @default '/basis/'\n */\n basisPath?: string;\n\n /**\n * Path to WASM reader module\n * @default '/stowkit/stowkit_reader.wasm'\n */\n wasmPath?: string;\n\n /**\n * WebGL context to use for texture loading\n * If not provided, a temporary canvas will be created\n */\n gl?: WebGLRenderingContext | WebGL2RenderingContext;\n}\n\n/**\n * Phaser loader for StowKit asset packs\n * Supports images and audio only (no 3D models)\n * \n * Usage:\n * ```typescript\n * const pack = await StowKitPhaserLoader.load('assets.stow');\n * const texture = await pack.loadTexture('textures/player');\n * const audio = await pack.loadAudio('sounds/bgm');\n * ```\n */\nexport class StowKitPhaserLoader {\n private static transcoder: BasisTranscoder | null = null;\n private static initialized = false;\n private static gl: WebGLRenderingContext | WebGL2RenderingContext | null = null;\n private static ownGl = false;\n private static wasmPath: string = '/stowkit/stowkit_reader.wasm';\n\n /**\n * Load a .stow pack file from a URL\n */\n static async load(url: string, options?: StowKitPhaserLoaderOptions): Promise<StowKitPhaserPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Fetch the pack file\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\n }\n\n /**\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\n */\n static async loadFromMemory(\n data: ArrayBuffer | Blob | File,\n options?: StowKitPhaserLoaderOptions\n ): Promise<StowKitPhaserPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Convert to ArrayBuffer if needed\n let arrayBuffer: ArrayBuffer;\n if (data instanceof ArrayBuffer) {\n arrayBuffer = data;\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n arrayBuffer = await data.arrayBuffer();\n } else if ('arrayBuffer' in data && typeof (data as any).arrayBuffer === 'function') {\n arrayBuffer = await (data as any).arrayBuffer();\n } else {\n throw new Error('Data must be ArrayBuffer, Blob, or File');\n }\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\n }\n\n /**\n * Initialize the loader (called automatically on first load)\n */\n private static async initialize(options?: StowKitPhaserLoaderOptions): Promise<void> {\n this.wasmPath = options?.wasmPath || '/stowkit/stowkit_reader.wasm';\n const basisPath = options?.basisPath || '/basis/';\n\n // Get or create WebGL context (shared across all packs)\n if (options?.gl) {\n this.gl = options.gl;\n this.ownGl = false;\n } else {\n // Create a temporary canvas for WebGL operations\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n canvas.style.display = 'none';\n document.body.appendChild(canvas);\n\n this.gl = canvas.getContext('webgl2') || canvas.getContext('webgl');\n if (!this.gl) {\n throw new Error('Failed to create WebGL context');\n }\n this.ownGl = true;\n }\n\n // Initialize basis transcoder (shared across all packs)\n this.transcoder = new BasisTranscoder(basisPath);\n await this.transcoder.init();\n\n this.initialized = true;\n }\n\n /**\n * Dispose of shared resources\n */\n static dispose(): void {\n if (this.transcoder) {\n this.transcoder.dispose();\n this.transcoder = null;\n }\n\n // Only dispose GL if we created it\n if (this.gl && this.ownGl) {\n const canvas = (this.gl as any).canvas;\n if (canvas && canvas.parentNode) {\n canvas.parentNode.removeChild(canvas);\n }\n this.gl = null;\n }\n\n this.initialized = false;\n }\n}\n\n"],"names":[],"mappings":"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"}
@@ -293,6 +293,17 @@
293
293
  format: transcoded.internalFormat
294
294
  };
295
295
  const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);
296
+ // Apply nearest filtering if metadata specifies it
297
+ const metadata = this.reader.parseTextureMetadata(assetIndex);
298
+ if (metadata?.filtering === 1) {
299
+ const glTexture = phaserTexture?.source?.[0]?.glTexture;
300
+ if (glTexture) {
301
+ gl.bindTexture(gl.TEXTURE_2D, glTexture);
302
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
303
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
304
+ gl.bindTexture(gl.TEXTURE_2D, null);
305
+ }
306
+ }
296
307
  this.textureCache.set(assetPath, phaserTexture);
297
308
  stowkitReader.PerfLogger.log(`[Perf] ===== Total Phaser texture load: ${(performance.now() - totalStart).toFixed(2)}ms =====`);
298
309
  return phaserTexture;
@@ -365,8 +376,10 @@
365
376
  }
366
377
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
367
378
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
368
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
369
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
379
+ // Apply nearest filtering if metadata specifies it (filtering === 1)
380
+ const useNearest = metadata?.filtering === 1;
381
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useNearest ? gl.NEAREST : gl.LINEAR);
382
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, useNearest ? gl.NEAREST : gl.LINEAR);
370
383
  gl.bindTexture(gl.TEXTURE_2D, null);
371
384
  return {
372
385
  texture,
@@ -1 +1 @@
1
- {"version":3,"file":"stowkit-phaser-loader.js","sources":["../src/BasisTranscoder.ts","../src/StowKitPhaserPack.ts","../src/StowKitPhaserLoader.ts"],"sourcesContent":["/**\n * BasisTranscoder - Manually decode KTX2 textures to WebGL textures\n * Used for Phaser which doesn't have built-in KTX2 support\n */\n\ninterface BasisModule {\n initializeBasis: () => void;\n BasisFile: new (data: Uint8Array) => BasisFile;\n KTX2File: new (data: Uint8Array) => KTX2File;\n}\n\ninterface BasisFile {\n getNumImages(): number;\n getNumLevels(imageIndex: number): number;\n getImageWidth(imageIndex: number, level: number): number;\n getImageHeight(imageIndex: number, level: number): number;\n startTranscoding(): boolean;\n getImageTranscodedSizeInBytes(imageIndex: number, level: number, format: number): number;\n transcodeImage(\n dst: Uint8Array,\n imageIndex: number,\n level: number,\n format: number,\n unused: number,\n getAlphaForOpaqueFormats: number\n ): number;\n close(): void;\n delete(): void;\n}\n\ninterface KTX2File {\n isValid(): boolean;\n isUASTC(): boolean;\n isETC1S(): boolean;\n isHDR(): boolean;\n getWidth(): number;\n getHeight(): number;\n getLayers(): number;\n getLevels(): number;\n getFaces(): number;\n getHasAlpha(): boolean;\n getDFDFlags(): number;\n startTranscoding(): boolean;\n getImageLevelInfo(mip: number, layer: number, face: number): any;\n getImageTranscodedSizeInBytes(mip: number, layer: number, face: number, format: number): number;\n transcodeImage(\n dst: Uint8Array,\n mip: number,\n layer: number,\n face: number,\n format: number,\n unused1: number,\n unused2: number,\n unused3: number\n ): number;\n close(): void;\n delete(): void;\n}\n\n// Basis transcoder formats (from Three.js KTX2Loader.TranscoderFormat)\nconst BASIS_FORMAT = {\n ETC1: 0,\n ETC2: 1,\n BC1: 2, // DXT1\n BC3: 3, // DXT5\n BC4: 4,\n BC5: 5,\n BC7_M6_OPAQUE_ONLY: 6,\n BC7_M5: 7, // BC7\n PVRTC1_4_RGB: 8,\n PVRTC1_4_RGBA: 9,\n ASTC_4x4: 10,\n ATC_RGB: 11,\n ATC_RGBA: 12,\n RGBA32: 13,\n RGB565: 14,\n BGR565: 15,\n RGBA4444: 16,\n BC6H: 22,\n RGB_HALF: 24,\n RGBA_HALF: 25,\n};\n\nexport interface TranscodedTexture {\n data: Uint8Array;\n width: number;\n height: number;\n format: number;\n internalFormat?: number;\n compressed: boolean;\n}\n\nexport class BasisTranscoder {\n private module: BasisModule | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n private basisPath: string;\n\n constructor(basisPath: string = '/basis/') {\n this.basisPath = basisPath;\n }\n\n /**\n * Initialize the Basis Universal transcoder\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n try {\n // Load the basis transcoder\n const scriptPath = `${this.basisPath}basis_transcoder.js`;\n \n // Import the basis module\n const BasisModule = await this.loadBasisModule(scriptPath);\n \n // Initialize\n BasisModule.initializeBasis();\n this.module = BasisModule;\n this.initialized = true;\n } catch (error) {\n console.error('[BasisTranscoder] Failed to initialize:', error);\n throw error;\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Load the basis transcoder module\n */\n private async loadBasisModule(scriptPath: string): Promise<BasisModule> {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = scriptPath;\n script.async = true;\n \n script.onload = () => {\n // The basis transcoder exposes a global BASIS function\n if (typeof (window as any).BASIS === 'function') {\n (window as any).BASIS().then((module: BasisModule) => {\n resolve(module);\n }).catch(reject);\n } else {\n reject(new Error('BASIS module not found'));\n }\n };\n \n script.onerror = () => {\n reject(new Error(`Failed to load ${scriptPath}`));\n };\n \n document.head.appendChild(script);\n });\n }\n\n /**\n * Transcode KTX2 data to a WebGL-compatible format\n */\n async transcodeKTX2(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TranscodedTexture> {\n if (!this.initialized) {\n await this.init();\n }\n\n if (!this.module) {\n throw new Error('Basis module not initialized');\n }\n\n // Create KTX2File from data\n const ktx2File = new this.module.KTX2File(data);\n \n try {\n // Validate file\n if (!ktx2File.isValid()) {\n throw new Error('Invalid or unsupported KTX2 file');\n }\n\n // Get image dimensions\n const width = ktx2File.getWidth();\n const height = ktx2File.getHeight();\n \n // Check if the texture has alpha\n const hasAlpha = ktx2File.getHasAlpha();\n \n // Check format type (UASTC or ETC1S)\n const isUASTC = ktx2File.isUASTC();\n const isETC1S = ktx2File.isETC1S();\n\n // Start transcoding\n if (!ktx2File.startTranscoding()) {\n throw new Error('Failed to start KTX2 transcoding');\n }\n\n // Use first mip level, first layer, first face\n const mip = 0;\n const layer = 0;\n const face = 0;\n\n // Detect best format for this device and file type\n const targetFormat = this.detectBestFormat(gl, hasAlpha, isETC1S);\n \n // Get transcoded size\n const transcodedSize = ktx2File.getImageTranscodedSizeInBytes(\n mip,\n layer,\n face,\n targetFormat.basisFormat\n );\n\n // Allocate output buffer\n const transcodedData = new Uint8Array(transcodedSize);\n\n // Transcode (parameters: dst, mip, layer, face, format, unused1, unused2, unused3)\n const result = ktx2File.transcodeImage(\n transcodedData,\n mip,\n layer,\n face,\n targetFormat.basisFormat,\n 0,\n -1,\n -1\n );\n\n if (result === 0) {\n throw new Error('KTX2 transcoding failed');\n }\n\n return {\n data: transcodedData,\n width,\n height,\n format: targetFormat.glFormat,\n internalFormat: targetFormat.glInternalFormat,\n compressed: targetFormat.compressed\n };\n\n } finally {\n ktx2File.close();\n ktx2File.delete();\n }\n }\n\n /**\n * Detect the best compression format supported by the device\n */\n private detectBestFormat(gl: WebGLRenderingContext | WebGL2RenderingContext, hasAlpha: boolean = true, isETC1S: boolean = false): {\n basisFormat: number;\n glFormat: number;\n glInternalFormat: number;\n compressed: boolean;\n } {\n const isWebGL2 = gl instanceof WebGL2RenderingContext;\n\n // Check for extensions\n const s3tc = gl.getExtension('WEBGL_compressed_texture_s3tc') || \n gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');\n const bptc = gl.getExtension('EXT_texture_compression_bptc');\n const etc1 = gl.getExtension('WEBGL_compressed_texture_etc1');\n const etc = gl.getExtension('WEBGL_compressed_texture_etc');\n const astc = gl.getExtension('WEBGL_compressed_texture_astc');\n const pvrtc = gl.getExtension('WEBGL_compressed_texture_pvrtc') ||\n gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');\n\n // For ETC1S: Use BC1 (no alpha support in ETC1S)\n // For UASTC with alpha: Use BC3/BC7\n // For UASTC without alpha: Use BC1\n \n // BC7 on desktop with WebGL2 (requires separate BPTC extension)\n // Only use for UASTC with alpha\n if (isWebGL2 && bptc && hasAlpha && !isETC1S) {\n return {\n basisFormat: BASIS_FORMAT.BC7_M5,\n glFormat: gl.RGBA,\n glInternalFormat: (bptc as any).COMPRESSED_RGBA_BPTC_UNORM_EXT,\n compressed: true\n };\n }\n\n // BC3 (DXT5) on desktop - only for textures with alpha (UASTC)\n if (s3tc && hasAlpha && !isETC1S) {\n return {\n basisFormat: BASIS_FORMAT.BC3,\n glFormat: gl.RGBA,\n glInternalFormat: (s3tc as any).COMPRESSED_RGBA_S3TC_DXT5_EXT,\n compressed: true\n };\n }\n \n // BC1 (DXT1) on desktop - for ETC1S or textures without alpha\n if (s3tc) {\n return {\n basisFormat: BASIS_FORMAT.BC1,\n glFormat: gl.RGB,\n glInternalFormat: (s3tc as any).COMPRESSED_RGB_S3TC_DXT1_EXT,\n compressed: true\n };\n }\n\n // ASTC on mobile (best quality)\n if (astc) {\n return {\n basisFormat: BASIS_FORMAT.ASTC_4x4,\n glFormat: gl.RGBA,\n glInternalFormat: (astc as any).COMPRESSED_RGBA_ASTC_4x4_KHR,\n compressed: true\n };\n }\n\n // ETC2 on mobile with WebGL2\n if (isWebGL2 && etc) {\n return {\n basisFormat: BASIS_FORMAT.ETC2,\n glFormat: gl.RGBA,\n glInternalFormat: (etc as any).COMPRESSED_RGBA8_ETC2_EAC || 0x9278,\n compressed: true\n };\n }\n\n // ETC1 on mobile\n if (etc1 || etc) {\n return {\n basisFormat: BASIS_FORMAT.ETC1,\n glFormat: gl.RGB,\n glInternalFormat: (etc1 as any)?.COMPRESSED_RGB_ETC1_WEBGL || 0x8D64,\n compressed: true\n };\n }\n\n // PVRTC on iOS (last resort for compressed)\n if (pvrtc) {\n return {\n basisFormat: hasAlpha ? BASIS_FORMAT.PVRTC1_4_RGBA : BASIS_FORMAT.PVRTC1_4_RGB,\n glFormat: gl.RGBA,\n glInternalFormat: (pvrtc as any).COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n compressed: true\n };\n }\n\n // Fallback to uncompressed RGBA\n return {\n basisFormat: BASIS_FORMAT.RGBA32,\n glFormat: gl.RGBA,\n glInternalFormat: gl.RGBA,\n compressed: false\n };\n }\n\n /**\n * Dispose resources\n */\n dispose(): void {\n this.module = null;\n this.initialized = false;\n this.initPromise = null;\n }\n}\n\n","import { StowKitReader, AssetType, PerfLogger } from '@series-inc/stowkit-reader';\nimport { BasisTranscoder } from './BasisTranscoder';\n\nexport interface TextureData {\n texture: WebGLTexture;\n width: number;\n height: number;\n}\n\n/**\n * Represents an opened StowKit pack for Phaser\n * Supports loading images and audio only (no 3D models)\n */\nexport class StowKitPhaserPack {\n public reader: StowKitReader;\n private transcoder: BasisTranscoder;\n private tempGl: WebGLRenderingContext | WebGL2RenderingContext;\n private textureCache: Map<string, any> = new Map();\n private transcodedDataCache: Map<number, { data: Uint8Array, width: number, height: number, compressed: boolean, format: number, internalFormat?: number }> = new Map();\n\n constructor(\n reader: StowKitReader,\n transcoder: BasisTranscoder,\n gl: WebGLRenderingContext | WebGL2RenderingContext\n ) {\n this.reader = reader;\n this.transcoder = transcoder;\n this.tempGl = gl;\n }\n\n /**\n * Load a texture by its canonical path/name\n * Returns a Phaser texture\n */\n async loadTexture(assetPath: string, scene: any): Promise<any> {\n const totalStart = performance.now();\n \n // Check cache first\n if (this.textureCache.has(assetPath)) {\n PerfLogger.log(`[Perf] Texture cache hit: ${assetPath}`);\n return this.textureCache.get(assetPath)!;\n }\n\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Texture not found: ${assetPath}`);\n }\n\n // Verify it's a texture\n const info = this.reader.getAssetInfo(assetIndex);\n if (!info || info.type !== AssetType.TEXTURE_2D) {\n throw new Error(`Asset is not a texture: ${assetPath}`);\n }\n\n // Use the same logic as getPhaserTexture but with custom key\n const key = assetPath;\n const gl = scene.sys.game.renderer.gl;\n \n // Read and transcode\n const data = this.reader.readAssetData(assetIndex);\n if (!data) {\n throw new Error(`Failed to read texture data for ${assetPath}`);\n }\n\n const transcodeStart = performance.now();\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n PerfLogger.log(`[Perf] Phaser Basis transcode: ${(performance.now() - transcodeStart).toFixed(2)}ms (${transcoded.width}x${transcoded.height})`);\n \n // Format like Phaser's KTX parser\n const compressedTextureData = {\n mipmaps: [{\n data: transcoded.data,\n width: transcoded.width,\n height: transcoded.height\n }],\n width: transcoded.width,\n height: transcoded.height,\n internalFormat: transcoded.internalFormat,\n compressed: transcoded.compressed,\n generateMipmap: false,\n format: transcoded.internalFormat\n };\n \n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\n this.textureCache.set(assetPath, phaserTexture);\n \n PerfLogger.log(`[Perf] ===== Total Phaser texture load: ${(performance.now() - totalStart).toFixed(2)}ms =====`);\n return phaserTexture;\n }\n\n /**\n * Get a Phaser texture by index (for previews/demos)\n * Creates compressed texture directly in Phaser's GL context\n */\n async getPhaserTexture(index: number, scene: any): Promise<any> {\n const key = `texture_${index}`;\n \n // Check if already exists in Phaser's texture manager\n if (scene.textures.exists(key)) {\n return scene.textures.get(key);\n }\n \n // Get Phaser's GL context\n const gl = scene.sys.game.renderer.gl;\n \n // Read and transcode the KTX2 data\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read texture data for index ${index}`);\n }\n\n // Transcode to compressed format (don't create the WebGL texture yet - let Phaser do it)\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n \n // Format the data exactly like Phaser's KTX parser output\n const compressedTextureData = {\n mipmaps: [{\n data: transcoded.data,\n width: transcoded.width,\n height: transcoded.height\n }],\n width: transcoded.width,\n height: transcoded.height,\n internalFormat: transcoded.internalFormat,\n compressed: transcoded.compressed,\n generateMipmap: false,\n format: transcoded.internalFormat // Phaser uses this for compressionAlgorithm\n };\n \n // Add to Phaser's texture manager as a compressed texture\n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\n \n // Cache it\n this.textureCache.set(key, phaserTexture);\n \n return phaserTexture;\n }\n \n /**\n * Load texture by index into a specific GL context\n */\n private async loadTextureInContext(index: number, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\n // Read texture data\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read texture data for index ${index}`);\n }\n\n // Get metadata - all textures in .stow files are KTX2 format\n const metadata = this.reader.parseTextureMetadata(index);\n const isKtx2 = metadata?.channelFormat !== undefined;\n\n if (isKtx2) {\n // Transcode KTX2 to WebGL texture using the provided context\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n \n // Create WebGL texture in the provided context\n const texture = gl.createTexture();\n if (!texture) {\n throw new Error('Failed to create WebGL texture');\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n if (transcoded.compressed) {\n gl.compressedTexImage2D(\n gl.TEXTURE_2D,\n 0,\n transcoded.internalFormat!,\n transcoded.width,\n transcoded.height,\n 0,\n transcoded.data\n );\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n transcoded.internalFormat!,\n transcoded.width,\n transcoded.height,\n 0,\n transcoded.format,\n gl.UNSIGNED_BYTE,\n transcoded.data\n );\n }\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texture,\n width: transcoded.width,\n height: transcoded.height\n };\n } else {\n // Handle uncompressed image data\n return await this.loadUncompressedTextureInContext(data, gl);\n }\n }\n\n /**\n * Load uncompressed image (PNG, JPEG) as WebGL texture in a specific context\n */\n private async loadUncompressedTextureInContext(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\n return new Promise((resolve, reject) => {\n const blob = new Blob([data.buffer as ArrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const img = new Image();\n img.onload = () => {\n const texture = gl.createTexture();\n if (!texture) {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to create WebGL texture'));\n return;\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n img\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n URL.revokeObjectURL(url);\n\n resolve({\n texture,\n width: img.width,\n height: img.height\n });\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to load image'));\n };\n\n img.src = url;\n });\n }\n\n /**\n * Load audio by its canonical path/name\n * Returns an AudioBuffer\n */\n async loadAudio(assetPath: string, audioContext?: AudioContext): Promise<AudioBuffer> {\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Audio not found: ${assetPath}`);\n }\n\n // Verify it's audio\n const info = this.reader.getAssetInfo(assetIndex);\n if (!info || info.type !== AssetType.AUDIO) {\n throw new Error(`Asset is not audio: ${assetPath}`);\n }\n\n return await this.loadAudioByIndex(assetIndex, audioContext);\n }\n\n /**\n * Load audio by index\n */\n async loadAudioByIndex(index: number, audioContext?: AudioContext): Promise<AudioBuffer> {\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read audio data for index ${index}`);\n }\n\n // Use provided context or create a new one\n const ctx = audioContext || new AudioContext();\n\n // Decode audio data\n const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const audioBuffer = await ctx.decodeAudioData(arrayBuffer);\n\n return audioBuffer;\n }\n\n /**\n * Create an HTML audio element for preview\n */\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read audio for index ${index}`);\n }\n\n const blob = new Blob([data.buffer as ArrayBuffer], { type: 'audio/mp4' });\n const url = URL.createObjectURL(blob);\n\n const audio = document.createElement('audio');\n audio.controls = true;\n audio.src = url;\n\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\n\n return audio;\n }\n\n\n /**\n * Get list of all assets in pack\n */\n listAssets() {\n return this.reader.listAssets();\n }\n\n /**\n * Get asset count\n */\n getAssetCount(): number {\n return this.reader.getAssetCount();\n }\n\n /**\n * Get asset info by index\n */\n getAssetInfo(index: number) {\n return this.reader.getAssetInfo(index);\n }\n\n /**\n * Get texture metadata\n */\n getTextureMetadata(index: number) {\n return this.reader.parseTextureMetadata(index);\n }\n\n /**\n * Get audio metadata\n */\n getAudioMetadata(index: number) {\n return this.reader.parseAudioMetadata(index);\n }\n\n /**\n * Close the pack and free resources\n */\n dispose(): void {\n // Clear texture cache (Phaser manages texture disposal)\n this.textureCache.clear();\n this.transcodedDataCache.clear();\n\n // Close reader\n this.reader.close();\n }\n}\n\n\n","import { StowKitReader } from '@series-inc/stowkit-reader';\nimport { BasisTranscoder } from './BasisTranscoder';\nimport { StowKitPhaserPack } from './StowKitPhaserPack';\n\nexport interface StowKitPhaserLoaderOptions {\n /**\n * Path to basis transcoder for KTX2 texture loading\n * @default '/basis/'\n */\n basisPath?: string;\n\n /**\n * Path to WASM reader module\n * @default '/stowkit/stowkit_reader.wasm'\n */\n wasmPath?: string;\n\n /**\n * WebGL context to use for texture loading\n * If not provided, a temporary canvas will be created\n */\n gl?: WebGLRenderingContext | WebGL2RenderingContext;\n}\n\n/**\n * Phaser loader for StowKit asset packs\n * Supports images and audio only (no 3D models)\n * \n * Usage:\n * ```typescript\n * const pack = await StowKitPhaserLoader.load('assets.stow');\n * const texture = await pack.loadTexture('textures/player');\n * const audio = await pack.loadAudio('sounds/bgm');\n * ```\n */\nexport class StowKitPhaserLoader {\n private static transcoder: BasisTranscoder | null = null;\n private static initialized = false;\n private static gl: WebGLRenderingContext | WebGL2RenderingContext | null = null;\n private static ownGl = false;\n private static wasmPath: string = '/stowkit/stowkit_reader.wasm';\n\n /**\n * Load a .stow pack file from a URL\n */\n static async load(url: string, options?: StowKitPhaserLoaderOptions): Promise<StowKitPhaserPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Fetch the pack file\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\n }\n\n /**\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\n */\n static async loadFromMemory(\n data: ArrayBuffer | Blob | File,\n options?: StowKitPhaserLoaderOptions\n ): Promise<StowKitPhaserPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Convert to ArrayBuffer if needed\n let arrayBuffer: ArrayBuffer;\n if (data instanceof ArrayBuffer) {\n arrayBuffer = data;\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n arrayBuffer = await data.arrayBuffer();\n } else if ('arrayBuffer' in data && typeof (data as any).arrayBuffer === 'function') {\n arrayBuffer = await (data as any).arrayBuffer();\n } else {\n throw new Error('Data must be ArrayBuffer, Blob, or File');\n }\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\n }\n\n /**\n * Initialize the loader (called automatically on first load)\n */\n private static async initialize(options?: StowKitPhaserLoaderOptions): Promise<void> {\n this.wasmPath = options?.wasmPath || '/stowkit/stowkit_reader.wasm';\n const basisPath = options?.basisPath || '/basis/';\n\n // Get or create WebGL context (shared across all packs)\n if (options?.gl) {\n this.gl = options.gl;\n this.ownGl = false;\n } else {\n // Create a temporary canvas for WebGL operations\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n canvas.style.display = 'none';\n document.body.appendChild(canvas);\n\n this.gl = canvas.getContext('webgl2') || canvas.getContext('webgl');\n if (!this.gl) {\n throw new Error('Failed to create WebGL context');\n }\n this.ownGl = true;\n }\n\n // Initialize basis transcoder (shared across all packs)\n this.transcoder = new BasisTranscoder(basisPath);\n await this.transcoder.init();\n\n this.initialized = true;\n }\n\n /**\n * Dispose of shared resources\n */\n static dispose(): void {\n if (this.transcoder) {\n this.transcoder.dispose();\n this.transcoder = null;\n }\n\n // Only dispose GL if we created it\n if (this.gl && this.ownGl) {\n const canvas = (this.gl as any).canvas;\n if (canvas && canvas.parentNode) {\n canvas.parentNode.removeChild(canvas);\n }\n this.gl = null;\n }\n\n this.initialized = false;\n }\n}\n\n"],"names":["PerfLogger","AssetType","StowKitReader"],"mappings":"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"}
1
+ {"version":3,"file":"stowkit-phaser-loader.js","sources":["../src/BasisTranscoder.ts","../src/StowKitPhaserPack.ts","../src/StowKitPhaserLoader.ts"],"sourcesContent":["/**\n * BasisTranscoder - Manually decode KTX2 textures to WebGL textures\n * Used for Phaser which doesn't have built-in KTX2 support\n */\n\ninterface BasisModule {\n initializeBasis: () => void;\n BasisFile: new (data: Uint8Array) => BasisFile;\n KTX2File: new (data: Uint8Array) => KTX2File;\n}\n\ninterface BasisFile {\n getNumImages(): number;\n getNumLevels(imageIndex: number): number;\n getImageWidth(imageIndex: number, level: number): number;\n getImageHeight(imageIndex: number, level: number): number;\n startTranscoding(): boolean;\n getImageTranscodedSizeInBytes(imageIndex: number, level: number, format: number): number;\n transcodeImage(\n dst: Uint8Array,\n imageIndex: number,\n level: number,\n format: number,\n unused: number,\n getAlphaForOpaqueFormats: number\n ): number;\n close(): void;\n delete(): void;\n}\n\ninterface KTX2File {\n isValid(): boolean;\n isUASTC(): boolean;\n isETC1S(): boolean;\n isHDR(): boolean;\n getWidth(): number;\n getHeight(): number;\n getLayers(): number;\n getLevels(): number;\n getFaces(): number;\n getHasAlpha(): boolean;\n getDFDFlags(): number;\n startTranscoding(): boolean;\n getImageLevelInfo(mip: number, layer: number, face: number): any;\n getImageTranscodedSizeInBytes(mip: number, layer: number, face: number, format: number): number;\n transcodeImage(\n dst: Uint8Array,\n mip: number,\n layer: number,\n face: number,\n format: number,\n unused1: number,\n unused2: number,\n unused3: number\n ): number;\n close(): void;\n delete(): void;\n}\n\n// Basis transcoder formats (from Three.js KTX2Loader.TranscoderFormat)\nconst BASIS_FORMAT = {\n ETC1: 0,\n ETC2: 1,\n BC1: 2, // DXT1\n BC3: 3, // DXT5\n BC4: 4,\n BC5: 5,\n BC7_M6_OPAQUE_ONLY: 6,\n BC7_M5: 7, // BC7\n PVRTC1_4_RGB: 8,\n PVRTC1_4_RGBA: 9,\n ASTC_4x4: 10,\n ATC_RGB: 11,\n ATC_RGBA: 12,\n RGBA32: 13,\n RGB565: 14,\n BGR565: 15,\n RGBA4444: 16,\n BC6H: 22,\n RGB_HALF: 24,\n RGBA_HALF: 25,\n};\n\nexport interface TranscodedTexture {\n data: Uint8Array;\n width: number;\n height: number;\n format: number;\n internalFormat?: number;\n compressed: boolean;\n}\n\nexport class BasisTranscoder {\n private module: BasisModule | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n private basisPath: string;\n\n constructor(basisPath: string = '/basis/') {\n this.basisPath = basisPath;\n }\n\n /**\n * Initialize the Basis Universal transcoder\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n try {\n // Load the basis transcoder\n const scriptPath = `${this.basisPath}basis_transcoder.js`;\n \n // Import the basis module\n const BasisModule = await this.loadBasisModule(scriptPath);\n \n // Initialize\n BasisModule.initializeBasis();\n this.module = BasisModule;\n this.initialized = true;\n } catch (error) {\n console.error('[BasisTranscoder] Failed to initialize:', error);\n throw error;\n }\n })();\n\n return this.initPromise;\n }\n\n /**\n * Load the basis transcoder module\n */\n private async loadBasisModule(scriptPath: string): Promise<BasisModule> {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = scriptPath;\n script.async = true;\n \n script.onload = () => {\n // The basis transcoder exposes a global BASIS function\n if (typeof (window as any).BASIS === 'function') {\n (window as any).BASIS().then((module: BasisModule) => {\n resolve(module);\n }).catch(reject);\n } else {\n reject(new Error('BASIS module not found'));\n }\n };\n \n script.onerror = () => {\n reject(new Error(`Failed to load ${scriptPath}`));\n };\n \n document.head.appendChild(script);\n });\n }\n\n /**\n * Transcode KTX2 data to a WebGL-compatible format\n */\n async transcodeKTX2(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TranscodedTexture> {\n if (!this.initialized) {\n await this.init();\n }\n\n if (!this.module) {\n throw new Error('Basis module not initialized');\n }\n\n // Create KTX2File from data\n const ktx2File = new this.module.KTX2File(data);\n \n try {\n // Validate file\n if (!ktx2File.isValid()) {\n throw new Error('Invalid or unsupported KTX2 file');\n }\n\n // Get image dimensions\n const width = ktx2File.getWidth();\n const height = ktx2File.getHeight();\n \n // Check if the texture has alpha\n const hasAlpha = ktx2File.getHasAlpha();\n \n // Check format type (UASTC or ETC1S)\n const isUASTC = ktx2File.isUASTC();\n const isETC1S = ktx2File.isETC1S();\n\n // Start transcoding\n if (!ktx2File.startTranscoding()) {\n throw new Error('Failed to start KTX2 transcoding');\n }\n\n // Use first mip level, first layer, first face\n const mip = 0;\n const layer = 0;\n const face = 0;\n\n // Detect best format for this device and file type\n const targetFormat = this.detectBestFormat(gl, hasAlpha, isETC1S);\n \n // Get transcoded size\n const transcodedSize = ktx2File.getImageTranscodedSizeInBytes(\n mip,\n layer,\n face,\n targetFormat.basisFormat\n );\n\n // Allocate output buffer\n const transcodedData = new Uint8Array(transcodedSize);\n\n // Transcode (parameters: dst, mip, layer, face, format, unused1, unused2, unused3)\n const result = ktx2File.transcodeImage(\n transcodedData,\n mip,\n layer,\n face,\n targetFormat.basisFormat,\n 0,\n -1,\n -1\n );\n\n if (result === 0) {\n throw new Error('KTX2 transcoding failed');\n }\n\n return {\n data: transcodedData,\n width,\n height,\n format: targetFormat.glFormat,\n internalFormat: targetFormat.glInternalFormat,\n compressed: targetFormat.compressed\n };\n\n } finally {\n ktx2File.close();\n ktx2File.delete();\n }\n }\n\n /**\n * Detect the best compression format supported by the device\n */\n private detectBestFormat(gl: WebGLRenderingContext | WebGL2RenderingContext, hasAlpha: boolean = true, isETC1S: boolean = false): {\n basisFormat: number;\n glFormat: number;\n glInternalFormat: number;\n compressed: boolean;\n } {\n const isWebGL2 = gl instanceof WebGL2RenderingContext;\n\n // Check for extensions\n const s3tc = gl.getExtension('WEBGL_compressed_texture_s3tc') || \n gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');\n const bptc = gl.getExtension('EXT_texture_compression_bptc');\n const etc1 = gl.getExtension('WEBGL_compressed_texture_etc1');\n const etc = gl.getExtension('WEBGL_compressed_texture_etc');\n const astc = gl.getExtension('WEBGL_compressed_texture_astc');\n const pvrtc = gl.getExtension('WEBGL_compressed_texture_pvrtc') ||\n gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');\n\n // For ETC1S: Use BC1 (no alpha support in ETC1S)\n // For UASTC with alpha: Use BC3/BC7\n // For UASTC without alpha: Use BC1\n \n // BC7 on desktop with WebGL2 (requires separate BPTC extension)\n // Only use for UASTC with alpha\n if (isWebGL2 && bptc && hasAlpha && !isETC1S) {\n return {\n basisFormat: BASIS_FORMAT.BC7_M5,\n glFormat: gl.RGBA,\n glInternalFormat: (bptc as any).COMPRESSED_RGBA_BPTC_UNORM_EXT,\n compressed: true\n };\n }\n\n // BC3 (DXT5) on desktop - only for textures with alpha (UASTC)\n if (s3tc && hasAlpha && !isETC1S) {\n return {\n basisFormat: BASIS_FORMAT.BC3,\n glFormat: gl.RGBA,\n glInternalFormat: (s3tc as any).COMPRESSED_RGBA_S3TC_DXT5_EXT,\n compressed: true\n };\n }\n \n // BC1 (DXT1) on desktop - for ETC1S or textures without alpha\n if (s3tc) {\n return {\n basisFormat: BASIS_FORMAT.BC1,\n glFormat: gl.RGB,\n glInternalFormat: (s3tc as any).COMPRESSED_RGB_S3TC_DXT1_EXT,\n compressed: true\n };\n }\n\n // ASTC on mobile (best quality)\n if (astc) {\n return {\n basisFormat: BASIS_FORMAT.ASTC_4x4,\n glFormat: gl.RGBA,\n glInternalFormat: (astc as any).COMPRESSED_RGBA_ASTC_4x4_KHR,\n compressed: true\n };\n }\n\n // ETC2 on mobile with WebGL2\n if (isWebGL2 && etc) {\n return {\n basisFormat: BASIS_FORMAT.ETC2,\n glFormat: gl.RGBA,\n glInternalFormat: (etc as any).COMPRESSED_RGBA8_ETC2_EAC || 0x9278,\n compressed: true\n };\n }\n\n // ETC1 on mobile\n if (etc1 || etc) {\n return {\n basisFormat: BASIS_FORMAT.ETC1,\n glFormat: gl.RGB,\n glInternalFormat: (etc1 as any)?.COMPRESSED_RGB_ETC1_WEBGL || 0x8D64,\n compressed: true\n };\n }\n\n // PVRTC on iOS (last resort for compressed)\n if (pvrtc) {\n return {\n basisFormat: hasAlpha ? BASIS_FORMAT.PVRTC1_4_RGBA : BASIS_FORMAT.PVRTC1_4_RGB,\n glFormat: gl.RGBA,\n glInternalFormat: (pvrtc as any).COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n compressed: true\n };\n }\n\n // Fallback to uncompressed RGBA\n return {\n basisFormat: BASIS_FORMAT.RGBA32,\n glFormat: gl.RGBA,\n glInternalFormat: gl.RGBA,\n compressed: false\n };\n }\n\n /**\n * Dispose resources\n */\n dispose(): void {\n this.module = null;\n this.initialized = false;\n this.initPromise = null;\n }\n}\n\n","import { StowKitReader, AssetType, PerfLogger } from '@series-inc/stowkit-reader';\nimport { BasisTranscoder } from './BasisTranscoder';\n\nexport interface TextureData {\n texture: WebGLTexture;\n width: number;\n height: number;\n}\n\n/**\n * Represents an opened StowKit pack for Phaser\n * Supports loading images and audio only (no 3D models)\n */\nexport class StowKitPhaserPack {\n public reader: StowKitReader;\n private transcoder: BasisTranscoder;\n private tempGl: WebGLRenderingContext | WebGL2RenderingContext;\n private textureCache: Map<string, any> = new Map();\n private transcodedDataCache: Map<number, { data: Uint8Array, width: number, height: number, compressed: boolean, format: number, internalFormat?: number }> = new Map();\n\n constructor(\n reader: StowKitReader,\n transcoder: BasisTranscoder,\n gl: WebGLRenderingContext | WebGL2RenderingContext\n ) {\n this.reader = reader;\n this.transcoder = transcoder;\n this.tempGl = gl;\n }\n\n /**\n * Load a texture by its canonical path/name\n * Returns a Phaser texture\n */\n async loadTexture(assetPath: string, scene: any): Promise<any> {\n const totalStart = performance.now();\n \n // Check cache first\n if (this.textureCache.has(assetPath)) {\n PerfLogger.log(`[Perf] Texture cache hit: ${assetPath}`);\n return this.textureCache.get(assetPath)!;\n }\n\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Texture not found: ${assetPath}`);\n }\n\n // Verify it's a texture\n const info = this.reader.getAssetInfo(assetIndex);\n if (!info || info.type !== AssetType.TEXTURE_2D) {\n throw new Error(`Asset is not a texture: ${assetPath}`);\n }\n\n // Use the same logic as getPhaserTexture but with custom key\n const key = assetPath;\n const gl = scene.sys.game.renderer.gl;\n \n // Read and transcode\n const data = this.reader.readAssetData(assetIndex);\n if (!data) {\n throw new Error(`Failed to read texture data for ${assetPath}`);\n }\n\n const transcodeStart = performance.now();\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n PerfLogger.log(`[Perf] Phaser Basis transcode: ${(performance.now() - transcodeStart).toFixed(2)}ms (${transcoded.width}x${transcoded.height})`);\n \n // Format like Phaser's KTX parser\n const compressedTextureData = {\n mipmaps: [{\n data: transcoded.data,\n width: transcoded.width,\n height: transcoded.height\n }],\n width: transcoded.width,\n height: transcoded.height,\n internalFormat: transcoded.internalFormat,\n compressed: transcoded.compressed,\n generateMipmap: false,\n format: transcoded.internalFormat\n };\n \n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\n\n // Apply nearest filtering if metadata specifies it\n const metadata = this.reader.parseTextureMetadata(assetIndex);\n if (metadata?.filtering === 1) {\n const glTexture = phaserTexture?.source?.[0]?.glTexture;\n if (glTexture) {\n gl.bindTexture(gl.TEXTURE_2D, glTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n }\n\n this.textureCache.set(assetPath, phaserTexture);\n\n PerfLogger.log(`[Perf] ===== Total Phaser texture load: ${(performance.now() - totalStart).toFixed(2)}ms =====`);\n return phaserTexture;\n }\n\n /**\n * Get a Phaser texture by index (for previews/demos)\n * Creates compressed texture directly in Phaser's GL context\n */\n async getPhaserTexture(index: number, scene: any): Promise<any> {\n const key = `texture_${index}`;\n \n // Check if already exists in Phaser's texture manager\n if (scene.textures.exists(key)) {\n return scene.textures.get(key);\n }\n \n // Get Phaser's GL context\n const gl = scene.sys.game.renderer.gl;\n \n // Read and transcode the KTX2 data\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read texture data for index ${index}`);\n }\n\n // Transcode to compressed format (don't create the WebGL texture yet - let Phaser do it)\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n \n // Format the data exactly like Phaser's KTX parser output\n const compressedTextureData = {\n mipmaps: [{\n data: transcoded.data,\n width: transcoded.width,\n height: transcoded.height\n }],\n width: transcoded.width,\n height: transcoded.height,\n internalFormat: transcoded.internalFormat,\n compressed: transcoded.compressed,\n generateMipmap: false,\n format: transcoded.internalFormat // Phaser uses this for compressionAlgorithm\n };\n \n // Add to Phaser's texture manager as a compressed texture\n const phaserTexture = scene.textures.addCompressedTexture(key, compressedTextureData);\n \n // Cache it\n this.textureCache.set(key, phaserTexture);\n \n return phaserTexture;\n }\n \n /**\n * Load texture by index into a specific GL context\n */\n private async loadTextureInContext(index: number, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\n // Read texture data\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read texture data for index ${index}`);\n }\n\n // Get metadata - all textures in .stow files are KTX2 format\n const metadata = this.reader.parseTextureMetadata(index);\n const isKtx2 = metadata?.channelFormat !== undefined;\n\n if (isKtx2) {\n // Transcode KTX2 to WebGL texture using the provided context\n const transcoded = await this.transcoder.transcodeKTX2(data, gl);\n \n // Create WebGL texture in the provided context\n const texture = gl.createTexture();\n if (!texture) {\n throw new Error('Failed to create WebGL texture');\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n if (transcoded.compressed) {\n gl.compressedTexImage2D(\n gl.TEXTURE_2D,\n 0,\n transcoded.internalFormat!,\n transcoded.width,\n transcoded.height,\n 0,\n transcoded.data\n );\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n transcoded.internalFormat!,\n transcoded.width,\n transcoded.height,\n 0,\n transcoded.format,\n gl.UNSIGNED_BYTE,\n transcoded.data\n );\n }\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n // Apply nearest filtering if metadata specifies it (filtering === 1)\n const useNearest = metadata?.filtering === 1;\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useNearest ? gl.NEAREST : gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, useNearest ? gl.NEAREST : gl.LINEAR);\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texture,\n width: transcoded.width,\n height: transcoded.height\n };\n } else {\n // Handle uncompressed image data\n return await this.loadUncompressedTextureInContext(data, gl);\n }\n }\n\n /**\n * Load uncompressed image (PNG, JPEG) as WebGL texture in a specific context\n */\n private async loadUncompressedTextureInContext(data: Uint8Array, gl: WebGLRenderingContext | WebGL2RenderingContext): Promise<TextureData> {\n return new Promise((resolve, reject) => {\n const blob = new Blob([data.buffer as ArrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const img = new Image();\n img.onload = () => {\n const texture = gl.createTexture();\n if (!texture) {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to create WebGL texture'));\n return;\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n img\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n URL.revokeObjectURL(url);\n\n resolve({\n texture,\n width: img.width,\n height: img.height\n });\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to load image'));\n };\n\n img.src = url;\n });\n }\n\n /**\n * Load audio by its canonical path/name\n * Returns an AudioBuffer\n */\n async loadAudio(assetPath: string, audioContext?: AudioContext): Promise<AudioBuffer> {\n // Find asset by path\n const assetIndex = this.reader.findAssetByPath(assetPath);\n if (assetIndex < 0) {\n throw new Error(`Audio not found: ${assetPath}`);\n }\n\n // Verify it's audio\n const info = this.reader.getAssetInfo(assetIndex);\n if (!info || info.type !== AssetType.AUDIO) {\n throw new Error(`Asset is not audio: ${assetPath}`);\n }\n\n return await this.loadAudioByIndex(assetIndex, audioContext);\n }\n\n /**\n * Load audio by index\n */\n async loadAudioByIndex(index: number, audioContext?: AudioContext): Promise<AudioBuffer> {\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read audio data for index ${index}`);\n }\n\n // Use provided context or create a new one\n const ctx = audioContext || new AudioContext();\n\n // Decode audio data\n const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const audioBuffer = await ctx.decodeAudioData(arrayBuffer);\n\n return audioBuffer;\n }\n\n /**\n * Create an HTML audio element for preview\n */\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\n const data = this.reader.readAssetData(index);\n if (!data) {\n throw new Error(`Failed to read audio for index ${index}`);\n }\n\n const blob = new Blob([data.buffer as ArrayBuffer], { type: 'audio/mp4' });\n const url = URL.createObjectURL(blob);\n\n const audio = document.createElement('audio');\n audio.controls = true;\n audio.src = url;\n\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\n\n return audio;\n }\n\n\n /**\n * Get list of all assets in pack\n */\n listAssets() {\n return this.reader.listAssets();\n }\n\n /**\n * Get asset count\n */\n getAssetCount(): number {\n return this.reader.getAssetCount();\n }\n\n /**\n * Get asset info by index\n */\n getAssetInfo(index: number) {\n return this.reader.getAssetInfo(index);\n }\n\n /**\n * Get texture metadata\n */\n getTextureMetadata(index: number) {\n return this.reader.parseTextureMetadata(index);\n }\n\n /**\n * Get audio metadata\n */\n getAudioMetadata(index: number) {\n return this.reader.parseAudioMetadata(index);\n }\n\n /**\n * Close the pack and free resources\n */\n dispose(): void {\n // Clear texture cache (Phaser manages texture disposal)\n this.textureCache.clear();\n this.transcodedDataCache.clear();\n\n // Close reader\n this.reader.close();\n }\n}\n\n\n","import { StowKitReader } from '@series-inc/stowkit-reader';\nimport { BasisTranscoder } from './BasisTranscoder';\nimport { StowKitPhaserPack } from './StowKitPhaserPack';\n\nexport interface StowKitPhaserLoaderOptions {\n /**\n * Path to basis transcoder for KTX2 texture loading\n * @default '/basis/'\n */\n basisPath?: string;\n\n /**\n * Path to WASM reader module\n * @default '/stowkit/stowkit_reader.wasm'\n */\n wasmPath?: string;\n\n /**\n * WebGL context to use for texture loading\n * If not provided, a temporary canvas will be created\n */\n gl?: WebGLRenderingContext | WebGL2RenderingContext;\n}\n\n/**\n * Phaser loader for StowKit asset packs\n * Supports images and audio only (no 3D models)\n * \n * Usage:\n * ```typescript\n * const pack = await StowKitPhaserLoader.load('assets.stow');\n * const texture = await pack.loadTexture('textures/player');\n * const audio = await pack.loadAudio('sounds/bgm');\n * ```\n */\nexport class StowKitPhaserLoader {\n private static transcoder: BasisTranscoder | null = null;\n private static initialized = false;\n private static gl: WebGLRenderingContext | WebGL2RenderingContext | null = null;\n private static ownGl = false;\n private static wasmPath: string = '/stowkit/stowkit_reader.wasm';\n\n /**\n * Load a .stow pack file from a URL\n */\n static async load(url: string, options?: StowKitPhaserLoaderOptions): Promise<StowKitPhaserPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Fetch the pack file\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\n }\n\n /**\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\n */\n static async loadFromMemory(\n data: ArrayBuffer | Blob | File,\n options?: StowKitPhaserLoaderOptions\n ): Promise<StowKitPhaserPack> {\n // Initialize loaders if needed\n if (!this.initialized) {\n await this.initialize(options);\n }\n\n // Convert to ArrayBuffer if needed\n let arrayBuffer: ArrayBuffer;\n if (data instanceof ArrayBuffer) {\n arrayBuffer = data;\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n arrayBuffer = await data.arrayBuffer();\n } else if ('arrayBuffer' in data && typeof (data as any).arrayBuffer === 'function') {\n arrayBuffer = await (data as any).arrayBuffer();\n } else {\n throw new Error('Data must be ArrayBuffer, Blob, or File');\n }\n\n // Create a new reader instance for this pack\n const reader = new StowKitReader(this.wasmPath);\n await reader.init();\n await reader.open(arrayBuffer);\n\n // Return pack wrapper with its own dedicated reader\n return new StowKitPhaserPack(reader, this.transcoder!, this.gl!);\n }\n\n /**\n * Initialize the loader (called automatically on first load)\n */\n private static async initialize(options?: StowKitPhaserLoaderOptions): Promise<void> {\n this.wasmPath = options?.wasmPath || '/stowkit/stowkit_reader.wasm';\n const basisPath = options?.basisPath || '/basis/';\n\n // Get or create WebGL context (shared across all packs)\n if (options?.gl) {\n this.gl = options.gl;\n this.ownGl = false;\n } else {\n // Create a temporary canvas for WebGL operations\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n canvas.style.display = 'none';\n document.body.appendChild(canvas);\n\n this.gl = canvas.getContext('webgl2') || canvas.getContext('webgl');\n if (!this.gl) {\n throw new Error('Failed to create WebGL context');\n }\n this.ownGl = true;\n }\n\n // Initialize basis transcoder (shared across all packs)\n this.transcoder = new BasisTranscoder(basisPath);\n await this.transcoder.init();\n\n this.initialized = true;\n }\n\n /**\n * Dispose of shared resources\n */\n static dispose(): void {\n if (this.transcoder) {\n this.transcoder.dispose();\n this.transcoder = null;\n }\n\n // Only dispose GL if we created it\n if (this.gl && this.ownGl) {\n const canvas = (this.gl as any).canvas;\n if (canvas && canvas.parentNode) {\n canvas.parentNode.removeChild(canvas);\n }\n this.gl = null;\n }\n\n this.initialized = false;\n }\n}\n\n"],"names":["PerfLogger","AssetType","StowKitReader"],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@series-inc/stowkit-phaser-loader",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "Phaser loader for StowKit asset packs with KTX2/Basis Universal compressed texture support",
5
5
  "main": "dist/stowkit-phaser-loader.js",
6
6
  "module": "dist/stowkit-phaser-loader.esm.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "files": [
9
9
  "dist",
10
+ "public",
10
11
  "scripts",
11
12
  "skill.md"
12
13
  ],
@@ -0,0 +1,46 @@
1
+ # Basis Universal GPU Texture Compression
2
+
3
+ Basis Universal is a "[supercompressed](http://gamma.cs.unc.edu/GST/gst.pdf)"
4
+ GPU texture and texture video compression system that outputs a highly
5
+ compressed intermediate file format (.basis) that can be quickly transcoded to
6
+ a wide variety of GPU texture compression formats.
7
+
8
+ [GitHub](https://github.com/BinomialLLC/basis_universal)
9
+
10
+ ## Transcoders
11
+
12
+ Basis Universal texture data may be used in two different file formats:
13
+ `.basis` and `.ktx2`, where `ktx2` is a standardized wrapper around basis texture data.
14
+
15
+ For further documentation about the Basis compressor and transcoder, refer to
16
+ the [Basis GitHub repository](https://github.com/BinomialLLC/basis_universal).
17
+
18
+ The folder contains two files required for transcoding `.basis` or `.ktx2` textures:
19
+
20
+ * `basis_transcoder.js` — JavaScript wrapper for the WebAssembly transcoder.
21
+ * `basis_transcoder.wasm` — WebAssembly transcoder.
22
+
23
+ Both are dependencies of `KTX2Loader`:
24
+
25
+ ```js
26
+ const ktx2Loader = new KTX2Loader();
27
+ ktx2Loader.setTranscoderPath( 'examples/jsm/libs/basis/' );
28
+ ktx2Loader.detectSupport( renderer );
29
+ ktx2Loader.load( 'diffuse.ktx2', function ( texture ) {
30
+
31
+ const material = new THREE.MeshStandardMaterial( { map: texture } );
32
+
33
+ }, function () {
34
+
35
+ console.log( 'onProgress' );
36
+
37
+ }, function ( e ) {
38
+
39
+ console.error( e );
40
+
41
+ } );
42
+ ```
43
+
44
+ ## License
45
+
46
+ [Apache License 2.0](https://github.com/BinomialLLC/basis_universal/blob/master/LICENSE)
@@ -0,0 +1,21 @@
1
+
2
+ var BASIS = (function() {
3
+ var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
4
+ if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
5
+ return (
6
+ function(BASIS) {
7
+ BASIS = BASIS || {};
8
+
9
+ var Module=typeof BASIS!=="undefined"?BASIS:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime;if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx<endPtr){var u0=heap[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heap[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heap[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heap[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="basis_transcoder.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return Promise.resolve().then(getBinary)}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["K"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["L"];removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var structRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach(function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function __embind_finalize_value_object(structType){var reg=structRegistrations[structType];delete structRegistrations[structType];var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var fieldRecords=reg.fields;var fieldTypes=fieldRecords.map(function(field){return field.getterReturnType}).concat(fieldRecords.map(function(field){return field.setterArgumentType}));whenDependentTypesAreResolved([structType],fieldTypes,function(fieldTypes){var fields={};fieldRecords.forEach(function(field,i){var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:function(ptr){return getterReturnType["fromWireType"](getter(getterContext,ptr))},write:function(ptr,o){var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,"fromWireType":function(ptr){var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},"toWireType":function(destructors,o){for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError('Missing field: "'+fieldName+'"')}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:rawDestructor}]})}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(function(cb){cb()})}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&&registeredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}return Module["dynCall_"+sig].call(null,ptr)}function dynCall(sig,ptr,args){if(sig.indexOf("j")!=-1){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){assert(sig.indexOf("j")>=0,"getDynCaller should only be called with i64 sigs");var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i<arguments.length;i++){argCache[i]=arguments[i]}return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.indexOf("j")!=-1){return getDynCaller(signature,rawFunction)}return wasmTable.get(rawFunction)}var fp=makeDynCaller();if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);var args=[rawConstructor];var destructors=[];whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}destructors.length=0;args.length=argCount;for(var i=1;i<argCount;++i){args[i]=argTypes[i]["toWireType"](destructors,arguments[i-1])}var ptr=invoker.apply(null,args);runDestructors(destructors);return argTypes[0]["fromWireType"](ptr)};return[]});return[]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!=="void";var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}function __embind_register_constant(name,type,value){name=readLatin1String(name);whenDependentTypesAreResolved([],[type],function(type){type=type[0];Module[name]=type["fromWireType"](value);return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1}case null:{return 2}case true:{return 3}case false:{return 4}default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function enumReadValueFromPointer(name,shift,signed){switch(shift){case 0:return function(pointer){var heap=signed?HEAP8:HEAPU8;return this["fromWireType"](heap[pointer])};case 1:return function(pointer){var heap=signed?HEAP16:HEAPU16;return this["fromWireType"](heap[pointer>>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":function(destructors,c){return c.value},"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<<bitshift>>>bitshift}}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}str=a.join("")}_free(value);return str},"toWireType":function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var getLength;var valueIsOfTypeString=typeof value==="string";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError("Cannot pass non-string to std::string")}if(stdStringIsUTF8&&valueIsOfTypeString){getLength=function(){return lengthBytesUTF8(value)}}else{getLength=function(){return value.length}}var length=getLength();var ptr=_malloc(4+length+1);HEAPU32[ptr>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+4+i]=value[i]}}}if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=function(){return HEAPU16};shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=function(){return HEAPU32};shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_value_object_field(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}var emval_methodCallers=[];function __emval_call_void_method(caller,handle,methodName,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);caller(handle,methodName,null,args)}function emval_get_global(){if(typeof globalThis==="object"){return globalThis}return function(){return Function}()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i<argCount;++i){a[i]=requireRegisteredType(HEAP32[(argTypes>>2)+i],"parameter "+i)}return a}function __emval_get_method_caller(argCount,argTypes){var types=__emval_lookupTypes(argCount,argTypes);var retType=types[0];var signatureName=retType.name+"_$"+types.slice(1).map(function(t){return t.name}).join("_")+"$";var params=["retType"];var args=[retType];var argsList="";for(var i=0;i<argCount-1;++i){argsList+=(i!==0?", ":"")+"arg"+i;params.push("argType"+i);args.push(types[1+i])}var functionName=makeLegalFunctionName("methodCaller_"+signatureName);var functionBody="return function "+functionName+"(handle, name, destructors, args) {\n";var offset=0;for(var i=0;i<argCount-1;++i){functionBody+=" var arg"+i+" = argType"+i+".readValueFromPointer(args"+(offset?"+"+offset:"")+");\n";offset+=types[i+1]["argPackAdvance"]}functionBody+=" var rv = handle[name]("+argsList+");\n";for(var i=0;i<argCount-1;++i){if(types[i+1]["deleteObject"]){functionBody+=" argType"+i+".deleteObject(arg"+i+");\n"}}if(!retType.isVoid){functionBody+=" return retType.toWireType(destructors, rv);\n"}functionBody+="};\n";params.push(functionBody);var invokerFunction=new_(Function,params).apply(null,args);return __emval_addMethodCaller(invokerFunction)}function __emval_get_module_property(name){name=getStringOrSymbol(name);return __emval_register(Module[name])}function __emval_get_property(handle,key){handle=requireHandle(handle);key=requireHandle(key);return __emval_register(handle[key])}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i<argCount;++i){argsList+=(i!==0?", ":"")+"arg"+i}var functionBody="return function emval_allocator_"+argCount+"(constructor, argTypes, args) {\n";for(var i=0;i<argCount;++i){functionBody+="var argType"+i+" = requireRegisteredType(Module['HEAP32'][(argTypes >>> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function __emval_new_cstring(v){return __emval_register(getStringOrSymbol(v))}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_get_heap_size(){return HEAPU8.length}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;var oldSize=_emscripten_get_heap_size();var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}var minHeapSize=16777216;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(minHeapSize,requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){SYSCALLS.printChar(fd,HEAPU8[ptr+j])}num+=len}HEAP32[pnum>>2]=num;return 0}function _setTempRet0($i){setTempRet0($i|0)}InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();__ATINIT__.push({func:function(){___wasm_call_ctors()}});var asmLibraryArg={"t":__embind_finalize_value_object,"I":__embind_register_bool,"x":__embind_register_class,"w":__embind_register_class_constructor,"d":__embind_register_class_function,"k":__embind_register_constant,"H":__embind_register_emval,"n":__embind_register_enum,"a":__embind_register_enum_value,"A":__embind_register_float,"i":__embind_register_function,"j":__embind_register_integer,"h":__embind_register_memory_view,"B":__embind_register_std_string,"v":__embind_register_std_wstring,"u":__embind_register_value_object,"c":__embind_register_value_object_field,"J":__embind_register_void,"m":__emval_as,"s":__emval_call_void_method,"b":__emval_decref,"y":__emval_get_global,"p":__emval_get_method_caller,"r":__emval_get_module_property,"e":__emval_get_property,"g":__emval_incref,"q":__emval_new,"f":__emval_new_cstring,"l":__emval_run_destructors,"o":_abort,"E":_emscripten_memcpy_big,"F":_emscripten_resize_heap,"G":_fd_close,"C":_fd_seek,"z":_fd_write,"D":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["M"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["N"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["O"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["P"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["Q"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["R"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run();
10
+
11
+
12
+ return BASIS.ready
13
+ }
14
+ );
15
+ })();
16
+ if (typeof exports === 'object' && typeof module === 'object')
17
+ module.exports = BASIS;
18
+ else if (typeof define === 'function' && define['amd'])
19
+ define([], function() { return BASIS; });
20
+ else if (typeof exports === 'object')
21
+ exports["BASIS"] = BASIS;
@@ -5,6 +5,41 @@ const isInNodeModules = __dirname.includes('node_modules');
5
5
  const projectRoot = process.env.INIT_CWD || process.cwd();
6
6
 
7
7
  if (isInNodeModules) {
8
+ console.log('Installing StowKit Phaser assets...');
9
+
10
+ // Copy basis decoders (needed for KTX2 texture transcoding)
11
+ const src = path.join(__dirname, '..', 'public');
12
+ const dest = path.join(projectRoot, 'public', 'stowkit');
13
+
14
+ // Resolve to absolute paths for comparison
15
+ const srcAbs = path.resolve(src);
16
+ const destAbs = path.resolve(dest);
17
+
18
+ // Check if destination would be inside source (recursive copy)
19
+ const isRecursive = destAbs.startsWith(srcAbs + path.sep) || destAbs === srcAbs;
20
+
21
+ if (fs.existsSync(src) && !isRecursive) {
22
+ fs.mkdirSync(dest, { recursive: true });
23
+ fs.cpSync(src, dest, { recursive: true });
24
+ console.log('✓ Copied Basis decoders to public/stowkit/');
25
+ } else if (isRecursive) {
26
+ console.log('⊘ Skipping copy (would create recursive directory structure)');
27
+ }
28
+
29
+ // Copy WASM reader from @series-inc/stowkit-reader package
30
+ try {
31
+ const wasmSrc = path.join(projectRoot, 'node_modules', '@series-inc', 'stowkit-reader', 'dist', 'stowkit_reader.wasm');
32
+ const wasmDest = path.join(projectRoot, 'public', 'stowkit', 'stowkit_reader.wasm');
33
+
34
+ if (fs.existsSync(wasmSrc)) {
35
+ fs.mkdirSync(path.dirname(wasmDest), { recursive: true });
36
+ fs.copyFileSync(wasmSrc, wasmDest);
37
+ console.log('✓ Copied stowkit_reader.wasm to public/stowkit/');
38
+ }
39
+ } catch (error) {
40
+ console.warn('Could not copy stowkit_reader.wasm (install @series-inc/stowkit-reader first if needed)');
41
+ }
42
+
8
43
  // Copy AI skill/rule files
9
44
  try {
10
45
  const skillSrc = path.join(__dirname, '..', 'skill.md');
@@ -22,7 +57,7 @@ if (isInNodeModules) {
22
57
  const skillContent = fs.readFileSync(skillSrc, 'utf-8');
23
58
  const cursorRule = [
24
59
  '---',
25
- 'description: StowKit Phaser loader — loading KTX2/Basis compressed textures and audio from .stow packs',
60
+ 'description: StowKit Phaser loader — loading KTX2/Basis compressed textures and audio from .stow packs in Phaser games',
26
61
  'alwaysApply: true',
27
62
  '---',
28
63
  '',
@@ -34,4 +69,8 @@ if (isInNodeModules) {
34
69
  } catch (error) {
35
70
  console.warn('Could not copy AI skill/rule files:', error.message);
36
71
  }
72
+
73
+ console.log('✓ StowKit Phaser installation complete!');
74
+ } else {
75
+ console.log('Skipping postinstall (development mode)');
37
76
  }
package/skill.md CHANGED
@@ -2,6 +2,43 @@
2
2
 
3
3
  Use `@series-inc/stowkit-phaser-loader` to load `.stow` asset packs in Phaser applications. Supports 2D textures and audio only — for 3D models use `@series-inc/stowkit-three-loader`.
4
4
 
5
+ ## How Assets Get Into the Game
6
+
7
+ Assets are NEVER loaded as raw files (no `this.load.image('player.png')`, no `this.load.audio('bgm.wav')`, no `fetch('assets/sprite.png')`). The workflow is:
8
+
9
+ 1. Source files (PNG, JPG, WAV) go into the project's `srcArtDir`
10
+ 2. `stowkit build` compresses and packs them into `.stow` binary files (textures become KTX2/Basis Universal)
11
+ 3. At runtime, this loader reads from the `.stow` pack using the asset's `stringId`
12
+
13
+ If you need to add an asset to the game, the pipeline step (`stowkit build`) must happen first. Then use the methods below to load from the pack.
14
+
15
+ ## Quick Reference
16
+
17
+ | I need to... | Method |
18
+ |---|---|
19
+ | Load a pack | `await StowKitPhaserLoader.load('/assets/game.stow')` |
20
+ | Add a texture to a scene | `await pack.loadTexture('characters/player', this)` |
21
+ | Use texture as a sprite | `this.add.sprite(x, y, 'characters/player')` — key matches the path passed to `loadTexture` |
22
+ | Load audio | `const buffer = await pack.loadAudio('sounds/bgm')` |
23
+ | Play audio with Phaser | Use `this.sound.context` — see Audio section below |
24
+ | See what's in a pack | `pack.listAssets()` — returns array of `{ index, name, id, type, dataSize }` |
25
+ | Clean up a pack | `pack.dispose()` |
26
+ | Clean up shared resources | `StowKitPhaserLoader.dispose()` |
27
+
28
+ ## Common Mistakes
29
+
30
+ | Mistake | Fix |
31
+ |---|---|
32
+ | Using `this.load.image()` / `this.load.audio()` to load raw source files | StowKit projects load everything from `.stow` packs — use `pack.loadTexture()` and `pack.loadAudio()` |
33
+ | Calling `loadTexture` in `preload()` | `loadTexture` must be called in or after `create()`, not in `preload()` — it needs the renderer's GL context |
34
+ | Not awaiting `StowKitPhaserLoader.load()` | All load methods are async — always `await` them |
35
+ | Forgetting to pass `this` (the scene) to `loadTexture` | `loadTexture(path, scene)` requires the Phaser scene to register the texture with the texture manager |
36
+ | Texture key mismatch | The texture key in Phaser's texture manager is the exact `assetPath` you pass to `loadTexture` — use the same string in `this.add.sprite()` |
37
+ | Using `Phaser.AUTO` renderer type | Compressed textures require WebGL — use `Phaser.WEBGL` for the game config `type` |
38
+ | Trying to load meshes / skinned meshes | This loader is 2D only (textures + audio) — use `@series-inc/stowkit-three-loader` for 3D |
39
+ | Manually decoding KTX2 / Basis | The loader handles all transcoding internally — just call `loadTexture` |
40
+ | Basis transcoder files not accessible | Ensure `basis_transcoder.js` and `.wasm` are served at the `basisPath` URL (default: `/basis/`) |
41
+
5
42
  ## Installation
6
43
 
7
44
  ```bash
@@ -10,6 +47,10 @@ npm install @series-inc/stowkit-phaser-loader phaser
10
47
 
11
48
  Requires Phaser 3.60+ for compressed texture support.
12
49
 
50
+ **Important:** The Basis Universal transcoder files (`basis_transcoder.js` and `basis_transcoder.wasm`) must be accessible at the `basisPath` URL. If you also have `@series-inc/stowkit-three-loader` installed, its postinstall copies these to `public/stowkit/basis/`. Otherwise, you must provide them yourself and set `basisPath` accordingly.
51
+
52
+ The `stowkit_reader.wasm` file must also be accessible at the `wasmPath` URL (default: `/stowkit/stowkit_reader.wasm`).
53
+
13
54
  ## Loading a Pack
14
55
 
15
56
  ```typescript
@@ -23,7 +64,7 @@ Options (all optional):
23
64
  - `wasmPath` — path to `stowkit_reader.wasm` (default: `'/stowkit/stowkit_reader.wasm'`)
24
65
  - `gl` — WebGL context to use (if not provided, a temporary canvas is created)
25
66
 
26
- Load from memory:
67
+ Load from memory (e.g. after a custom fetch):
27
68
  ```typescript
28
69
  const buffer = await fetch(url).then(r => r.arrayBuffer());
29
70
  const pack = await StowKitPhaserLoader.loadFromMemory(buffer);
@@ -36,11 +77,12 @@ const pack = await StowKitPhaserLoader.loadFromMemory(buffer);
36
77
  | Texture | `AssetType.TEXTURE_2D` (2) | `pack.loadTexture(path, scene)` / `pack.getPhaserTexture(index, scene)` |
37
78
  | Audio | `AssetType.AUDIO` (3) | `pack.loadAudio(path, ctx?)` / `pack.loadAudioByIndex(index, ctx?)` |
38
79
 
39
- Assets are referenced by their `stringId` from `.stowmeta` files.
80
+ Assets are referenced by their `stringId` from `.stowmeta` files (e.g. `"characters/player"`, `"ui/button"`).
40
81
 
41
82
  ## Textures
42
83
 
43
84
  ```typescript
85
+ // In your scene's create() method:
44
86
  await pack.loadTexture('characters/player', this);
45
87
  const player = this.add.sprite(400, 300, 'characters/player');
46
88
  ```
@@ -52,9 +94,14 @@ KTX2 textures are automatically transcoded to the best GPU-compressed format:
52
94
  - **Mobile:** ASTC 4x4, ETC2, ETC1, PVRTC
53
95
  - **Fallback:** RGBA32 uncompressed
54
96
 
97
+ Textures are cached per-pack — loading the same path twice returns the same instance.
98
+
99
+ Texture filtering is controlled by `.stowmeta` metadata: `filtering: 1` applies `NEAREST` filtering (pixel art), otherwise `LINEAR` is used.
100
+
55
101
  ## Audio
56
102
 
57
103
  ```typescript
104
+ // Decode to AudioBuffer
58
105
  const buffer = await pack.loadAudio('sounds/bgm');
59
106
 
60
107
  // Or with a specific AudioContext
@@ -62,6 +109,20 @@ const ctx = new AudioContext();
62
109
  const buffer = await pack.loadAudio('sounds/bgm', ctx);
63
110
  ```
64
111
 
112
+ Audio is AAC format (M4A container), decoded via Web Audio API.
113
+
114
+ ### Playing audio with Phaser's sound system
115
+
116
+ ```typescript
117
+ // Using Web Audio API through Phaser's context:
118
+ const buffer = await pack.loadAudio('sounds/bgm');
119
+ const source = this.sound.context.createBufferSource();
120
+ source.buffer = buffer;
121
+ source.connect(this.sound.context.destination);
122
+ source.loop = true;
123
+ source.start();
124
+ ```
125
+
65
126
  For HTML5 preview: `const el = await pack.createAudioPreview(index);`
66
127
 
67
128
  ## Pack Manifest
@@ -77,9 +138,11 @@ const info = pack.getAssetInfo(0);
77
138
  ## Metadata Helpers
78
139
 
79
140
  ```typescript
141
+ // Texture
80
142
  const tex = pack.getTextureMetadata(index);
81
- // { width, height, channels, channelFormat }
143
+ // { width, height, channels, channelFormat, filtering }
82
144
 
145
+ // Audio
83
146
  const audio = pack.getAudioMetadata(index);
84
147
  // { sampleRate, channels, durationMs }
85
148
  ```
@@ -97,7 +160,7 @@ const [uiPack, levelPack] = await Promise.all([
97
160
  ## Cleanup
98
161
 
99
162
  ```typescript
100
- pack.dispose(); // Closes WASM reader, frees resources
163
+ pack.dispose(); // Clears texture cache, closes WASM reader
101
164
  StowKitPhaserLoader.dispose(); // Frees shared Basis transcoder + temp WebGL context
102
165
  ```
103
166
 
@@ -126,22 +189,27 @@ import Phaser from 'phaser';
126
189
  import { StowKitPhaserLoader } from '@series-inc/stowkit-phaser-loader';
127
190
 
128
191
  class GameScene extends Phaser.Scene {
192
+ private pack!: Awaited<ReturnType<typeof StowKitPhaserLoader.load>>;
193
+
129
194
  constructor() {
130
195
  super('GameScene');
131
196
  }
132
197
 
133
198
  async create() {
134
- const pack = await StowKitPhaserLoader.load('/assets/game.stow');
199
+ this.pack = await StowKitPhaserLoader.load('/assets/game.stow');
135
200
 
136
- await pack.loadTexture('backgrounds/sky', this);
137
- await pack.loadTexture('characters/player', this);
138
- await pack.loadTexture('ui/button', this);
201
+ // Load textures (registers them with Phaser's texture manager)
202
+ await this.pack.loadTexture('backgrounds/sky', this);
203
+ await this.pack.loadTexture('characters/player', this);
204
+ await this.pack.loadTexture('ui/button', this);
139
205
 
206
+ // Use textures — keys match the paths above
140
207
  this.add.image(400, 300, 'backgrounds/sky');
141
208
  const player = this.add.sprite(400, 300, 'characters/player');
142
209
  this.add.image(100, 50, 'ui/button');
143
210
 
144
- const bgm = await pack.loadAudio('sounds/bgm');
211
+ // Load and play audio via Web Audio API
212
+ const bgm = await this.pack.loadAudio('sounds/bgm');
145
213
  const source = this.sound.context.createBufferSource();
146
214
  source.buffer = bgm;
147
215
  source.connect(this.sound.context.destination);
@@ -151,7 +219,7 @@ class GameScene extends Phaser.Scene {
151
219
  }
152
220
 
153
221
  const game = new Phaser.Game({
154
- type: Phaser.WEBGL,
222
+ type: Phaser.WEBGL, // Required for compressed textures
155
223
  width: 800,
156
224
  height: 600,
157
225
  scene: GameScene
@@ -160,7 +228,13 @@ const game = new Phaser.Game({
160
228
 
161
229
  ## Troubleshooting
162
230
 
163
- - **Textures not loading** Ensure Basis transcoder files are accessible at the `basisPath` URL
164
- - **"Scene required" errors** — `loadTexture` must be called in or after `create()`, not in `preload()`
165
- - **No compressed format supported** Falls back to RGBA32; check WebGL context is available
166
- - **Need 3D models?** Use `@series-inc/stowkit-three-loader` instead; this loader is 2D only
231
+ | Symptom | Likely cause | Fix |
232
+ |---|---|---|
233
+ | Textures not loading / blank | Basis transcoder files missing | Verify `basis_transcoder.js` and `.wasm` are accessible at the `basisPath` URL. If using stowkit-three-loader, they're in `public/stowkit/basis/` — set `basisPath: '/stowkit/basis/'` |
234
+ | "Scene required" / texture errors | `loadTexture` called too early | Call `loadTexture` in or after `create()`, not in `preload()` |
235
+ | WASM file not found | Wrong `wasmPath` or file not copied | Check that `stowkit_reader.wasm` exists at the expected URL. Pass custom `wasmPath` if serving from a different location |
236
+ | No compressed format supported | WebGL context unavailable | Use `Phaser.WEBGL` for game type, not `Phaser.CANVAS`. Falls back to RGBA32 if no GPU compression extensions found |
237
+ | Texture key not found in sprite | Key mismatch between `loadTexture` and `this.add.sprite` | The texture key is the exact `assetPath` string passed to `loadTexture` — use the same string |
238
+ | Pixel art looks blurry | Default linear filtering | Set `filtering: 1` in the asset's `.stowmeta` file and rebuild with `stowkit build` |
239
+ | Need 3D models? | Wrong loader | Use `@series-inc/stowkit-three-loader` instead — this loader is 2D only |
240
+ | Audio not playing | AudioContext suspended | Browsers require user interaction before audio plays — start audio in response to a click/tap event |