@stowkit/three-loader 0.1.5 → 0.1.6

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.
package/README.md CHANGED
@@ -15,12 +15,13 @@ import * as THREE from 'three';
15
15
  import { StowKitLoader } from '@stowkit/three-loader';
16
16
 
17
17
  // Create loader (auto-configured with defaults)
18
- // Draco decoder is auto-configured to /stowkit/draco/
18
+ // Basis transcoder: /stowkit/basis/ (auto-included)
19
+ // Draco decoder: /stowkit/draco/ (auto-included)
19
20
  const loader = new StowKitLoader();
20
21
 
21
- // Optional: Override default paths if needed
22
- // loader.setDracoDecoderPath('/custom-draco-path/');
22
+ // Optional: Override paths only if you have custom locations
23
23
  // loader.setTranscoderPath('/custom-basis-path/');
24
+ // loader.setDracoDecoderPath('/custom-draco-path/');
24
25
 
25
26
  // Open a .stow pack file
26
27
  await loader.openPack('assets.stow');
@@ -491,11 +492,11 @@ Place these files in your public folder:
491
492
 
492
493
  ```
493
494
  public/
494
- ├── stowkit_reader.wasm # WASM reader module
495
- ├── basis/ # Basis Universal transcoder (for textures)
496
- ├── basis_transcoder.js
497
- └── basis_transcoder.wasm
498
- └── stowkit/ # Auto-copied by @stowkit/three-loader
495
+ ├── stowkit_reader.wasm # WASM reader module (copy from node_modules/@stowkit/reader/dist/)
496
+ └── stowkit/ # Auto-copied by @stowkit/three-loader on install
497
+ ├── basis/ # Basis Universal transcoder (for textures) - included!
498
+ ├── basis_transcoder.js
499
+ └── basis_transcoder.wasm
499
500
  └── draco/ # Draco decoder (for meshes) - included!
500
501
  ├── draco_decoder.js
501
502
  ├── draco_decoder.wasm
@@ -504,11 +505,11 @@ public/
504
505
 
505
506
  **Setup:**
506
507
 
507
- The package automatically copies Draco decoder files to `public/stowkit/draco/` when you install `@stowkit/three-loader`.
508
+ The package automatically includes and copies all decoder files on install!
508
509
 
509
- You only need to manually add:
510
- - `stowkit_reader.wasm` - Copy from `node_modules/@stowkit/reader/dist/`
511
- - Basis transcoder - Download from [three.js examples](https://github.com/mrdoob/three.js/tree/dev/examples/jsm/libs/basis)
510
+ You only need to:
511
+ 1. Copy `stowkit_reader.wasm` from `node_modules/@stowkit/reader/dist/` to `public/`
512
+ 2. That's it! Basis and Draco decoders are included automatically.
512
513
 
513
514
  ### Three.js Version
514
515
 
@@ -393,8 +393,8 @@ class StowKitLoader extends THREE.Loader {
393
393
  this.reader = new StowKitReader(wasmPath);
394
394
  this.ownedReader = true;
395
395
  }
396
- // Setup KTX2 loader for textures with default path (user must provide basis files)
397
- const transcoderPath = parameters?.transcoderPath || '/basis/'; // Users still need to provide this
396
+ // Setup KTX2 loader for textures with default path (bundled with package)
397
+ const transcoderPath = parameters?.transcoderPath || '/stowkit/basis/'; // Auto-copied on install
398
398
  this.ktx2Loader = new KTX2Loader(manager);
399
399
  this.ktx2Loader.setTranscoderPath(transcoderPath);
400
400
  // Setup Draco loader for mesh decompression
@@ -1 +1 @@
1
- {"version":3,"file":"stowkit-three-loader.esm.js","sources":["../src/MeshParser.ts","../src/StowKitLoader.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\n\nexport interface MeshGeometryInfo {\n vertexCount: number;\n indexCount: number;\n hasNormals: number;\n hasUVs: number;\n compressedBufferOffset: number;\n compressedBufferSize: number;\n materialIndex: number;\n padding: number;\n}\n\nexport interface Node {\n name: string;\n parentIndex: number;\n position: [number, number, number];\n rotation: [number, number, number, number]; // Quaternion\n scale: [number, number, number];\n meshCount: number;\n firstMeshIndex: number;\n}\n\nexport interface MaterialPropertyValue {\n fieldName: string;\n value: [number, number, number, number]; // Vec4 for colors, floats, etc.\n textureId: string; // For texture references\n}\n\nexport interface MaterialData {\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: MaterialPropertyValue[];\n}\n\nexport interface MeshMetadata {\n meshGeometryCount: number;\n materialCount: number;\n nodeCount: number;\n stringId: string;\n}\n\nexport class MeshParser {\n \n /**\n * Parse mesh metadata from binary data\n */\n static parseMeshMetadata(data: Uint8Array): MeshMetadata {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n \n // MeshMetadata structure (140 bytes total when packed)\n const metadata: MeshMetadata = {\n meshGeometryCount: view.getUint32(0, true),\n materialCount: view.getUint32(4, true),\n nodeCount: view.getUint32(8, true),\n stringId: this.readString(data.slice(12, 140)) // 128 bytes for string\n };\n \n return metadata;\n }\n \n /**\n * Parse complete mesh data including geometry, materials, and nodes\n */\n static parseMeshData(metadataBlob: Uint8Array, dataBlob: Uint8Array): {\n metadata: MeshMetadata;\n geometries: MeshGeometryInfo[];\n materials: THREE.Material[];\n materialData: MaterialData[];\n nodes: Node[];\n meshIndices: Uint32Array;\n } {\n // Ensure we have at least the minimum metadata size\n if (metadataBlob.length < 140) {\n throw new Error(`Metadata blob too small: ${metadataBlob.length} bytes (expected at least 140)`);\n }\n \n console.log(`Parsing mesh metadata: ${metadataBlob.length} bytes metadata, ${dataBlob.length} bytes data`);\n const metadata = this.parseMeshMetadata(metadataBlob);\n console.log(`Mesh counts: ${metadata.meshGeometryCount} geometries, ${metadata.materialCount} materials, ${metadata.nodeCount} nodes`);\n \n // Check if the metadata blob contains just the header or all the mesh info\n const expectedMetadataSize = 140 + \n (metadata.meshGeometryCount * 40) + // Draco compressed (40 bytes each)\n (metadata.materialCount * 196) + // MaterialData header\n (metadata.nodeCount * 116);\n \n let hasExtendedMetadata = metadataBlob.length >= expectedMetadataSize;\n console.log(`Expected metadata size: ${expectedMetadataSize}, actual: ${metadataBlob.length}, has extended: ${hasExtendedMetadata}`);\n \n // If metadata only has the header, the mesh info might be at the start of the data blob\n const sourceBlob = hasExtendedMetadata ? metadataBlob : dataBlob;\n const metaView = new DataView(sourceBlob.buffer, sourceBlob.byteOffset, sourceBlob.byteLength);\n \n let offset = hasExtendedMetadata ? 140 : 0; // Start after MeshMetadata if in metadata blob, or at beginning of data blob\n \n // Parse geometry infos (now Draco compressed!)\n const geometries: MeshGeometryInfo[] = [];\n for (let i = 0; i < metadata.meshGeometryCount; i++) {\n if (offset + 40 > sourceBlob.length) {\n console.warn(`Data truncated at geometry ${i}/${metadata.meshGeometryCount}`);\n break;\n }\n const geo: MeshGeometryInfo = {\n vertexCount: metaView.getUint32(offset, true),\n indexCount: metaView.getUint32(offset + 4, true),\n hasNormals: metaView.getUint32(offset + 8, true),\n hasUVs: metaView.getUint32(offset + 12, true),\n compressedBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n compressedBufferSize: Number(metaView.getBigUint64(offset + 24, true)),\n materialIndex: metaView.getUint32(offset + 32, true),\n padding: metaView.getUint32(offset + 36, true)\n };\n geometries.push(geo);\n offset += 40; // Size of MeshGeometryInfo (Draco compressed)\n }\n \n // Parse materials - MaterialData structure: name[64] + schema_id[128] + property_count(4) = 196 bytes\n const materialData: MaterialData[] = [];\n const materials: THREE.Material[] = [];\n \n // First pass: read all MaterialData headers (without properties)\n const materialOffsets: number[] = [];\n for (let i = 0; i < metadata.materialCount; i++) {\n if (offset + 196 > sourceBlob.length) {\n console.warn(`Data truncated at material ${i}/${metadata.materialCount}`);\n break;\n }\n \n materialOffsets.push(offset);\n \n const name = this.readString(sourceBlob.slice(offset, offset + 64));\n const schemaId = this.readString(sourceBlob.slice(offset + 64, offset + 192));\n const propertyCount = metaView.getUint32(offset + 192, true);\n \n materialData.push({\n name,\n schemaId,\n propertyCount,\n properties: []\n });\n \n offset += 196; // Size of MaterialData header\n }\n \n // Parse nodes first (they come before material properties in the blob)\n const nodes: Node[] = [];\n console.log(`\\n=== Nodes from StowKit file (${metadata.nodeCount} total) ===`);\n for (let i = 0; i < metadata.nodeCount; i++) {\n if (offset + 116 > sourceBlob.length) {\n console.warn(`Data truncated at node ${i}/${metadata.nodeCount}`);\n break;\n }\n const node: Node = {\n name: this.readString(sourceBlob.slice(offset, offset + 64)),\n parentIndex: metaView.getInt32(offset + 64, true),\n position: [\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ],\n rotation: [\n metaView.getFloat32(offset + 80, true),\n metaView.getFloat32(offset + 84, true),\n metaView.getFloat32(offset + 88, true),\n metaView.getFloat32(offset + 92, true)\n ],\n scale: [\n metaView.getFloat32(offset + 96, true),\n metaView.getFloat32(offset + 100, true),\n metaView.getFloat32(offset + 104, true)\n ],\n meshCount: metaView.getUint32(offset + 108, true),\n firstMeshIndex: metaView.getUint32(offset + 112, true)\n };\n console.log(`Node ${i}: \"${node.name}\" (parent=${node.parentIndex}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex})`);\n nodes.push(node);\n offset += 116; // Size of Node struct\n }\n console.log(`=== End of nodes from file ===\\n`);\n \n // Parse mesh indices\n const totalMeshRefs = nodes.reduce((sum, node) => sum + node.meshCount, 0);\n console.log(`Parsing ${totalMeshRefs} mesh indices at offset ${offset}`);\n const meshIndices = new Uint32Array(totalMeshRefs);\n for (let i = 0; i < totalMeshRefs; i++) {\n if (offset + (i + 1) * 4 > sourceBlob.length) {\n console.warn(`Data truncated at mesh index ${i}/${totalMeshRefs}`);\n break;\n }\n meshIndices[i] = metaView.getUint32(offset + i * 4, true);\n console.log(` meshIndices[${i}] = ${meshIndices[i]}`);\n }\n offset += totalMeshRefs * 4;\n console.log(`After mesh indices, offset = ${offset}`);\n \n // Second pass: read material properties\n // MaterialPropertyValue: field_name[64] + value[4*4=16] + texture_id[64] = 144 bytes\n for (let i = 0; i < materialData.length; i++) {\n const matData = materialData[i];\n console.log(`Material \"${matData.name}\": schema=\"${matData.schemaId}\", ${matData.propertyCount} properties`);\n \n for (let j = 0; j < matData.propertyCount; j++) {\n if (offset + 144 > sourceBlob.length) {\n console.warn(`Data truncated at property ${j}/${matData.propertyCount} of material ${i}`);\n break;\n }\n \n const fieldName = this.readString(sourceBlob.slice(offset, offset + 64));\n const value: [number, number, number, number] = [\n metaView.getFloat32(offset + 64, true),\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ];\n const textureId = this.readString(sourceBlob.slice(offset + 80, offset + 144));\n \n matData.properties.push({\n fieldName,\n value,\n textureId\n });\n \n console.log(` Property \"${fieldName}\": value=[${value.join(', ')}], textureId=\"${textureId}\"`);\n \n offset += 144; // Size of MaterialPropertyValue\n }\n \n // Create Three.js material based on properties\n const mat = new THREE.MeshStandardMaterial({\n name: matData.name,\n side: THREE.DoubleSide,\n // Start with default gray color\n color: new THREE.Color(0.8, 0.8, 0.8)\n });\n \n console.log(`Creating material ${i}: \"${matData.name}\", ${matData.propertyCount} properties`);\n \n // Apply properties\n for (const prop of matData.properties) {\n if (prop.fieldName.toLowerCase() === 'tint' || prop.fieldName.toLowerCase().includes('color')) {\n // Apply color/tint\n mat.color = new THREE.Color(prop.value[0], prop.value[1], prop.value[2]);\n console.log(` Applied tint color: rgb(${prop.value[0]}, ${prop.value[1]}, ${prop.value[2]})`);\n }\n }\n \n console.log(` Material ${i} final color: rgb(${mat.color.r}, ${mat.color.g}, ${mat.color.b})`);\n materials.push(mat);\n }\n \n // Default material if none exist\n if (materials.length === 0) {\n materials.push(new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8), // Light gray\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n }));\n }\n \n return { metadata, geometries, materials, materialData, nodes, meshIndices };\n }\n \n /**\n * Create Three.js BufferGeometry from Draco compressed mesh data\n */\n static async createGeometry(geoInfo: MeshGeometryInfo, dataBlob: Uint8Array, dracoLoader: DRACOLoader): Promise<THREE.BufferGeometry> {\n console.log('Decoding Draco geometry:', {\n vertexCount: geoInfo.vertexCount,\n indexCount: geoInfo.indexCount,\n hasNormals: geoInfo.hasNormals,\n hasUVs: geoInfo.hasUVs,\n compressedOffset: geoInfo.compressedBufferOffset,\n compressedSize: geoInfo.compressedBufferSize\n });\n \n // Extract the Draco compressed buffer\n if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {\n throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);\n }\n \n const compressedData = dataBlob.slice(\n geoInfo.compressedBufferOffset,\n geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize\n );\n \n // Decode using Draco\n // Create a blob URL for the Draco data (DRACOLoader expects a URL)\n const arrayBuffer = compressedData.buffer.slice(compressedData.byteOffset, compressedData.byteOffset + compressedData.byteLength);\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const geometry = await new Promise<THREE.BufferGeometry>((resolve, reject) => {\n dracoLoader.load(\n url,\n (decoded: THREE.BufferGeometry) => {\n URL.revokeObjectURL(url);\n console.log('Draco decoded successfully:', decoded);\n \n // UVs are pre-flipped in the packer now, no need to flip here\n resolve(decoded);\n },\n undefined,\n (error: any) => {\n URL.revokeObjectURL(url);\n console.error('Draco decode failed:', error);\n reject(new Error(`Failed to decode Draco geometry: ${error}`));\n }\n );\n });\n \n // Compute bounding volumes\n geometry.computeBoundingSphere();\n geometry.computeBoundingBox();\n \n console.log('Final geometry:', {\n hasPositions: !!geometry.attributes.position,\n hasNormals: !!geometry.attributes.normal,\n hasUVs: !!geometry.attributes.uv,\n hasIndices: !!geometry.index,\n vertexCount: geometry.attributes.position?.count || 0\n });\n \n return geometry;\n }\n \n /**\n * Build Three.js scene from parsed mesh data\n */\n static async buildScene(parsedData: ReturnType<typeof MeshParser.parseMeshData>, dataBlob: Uint8Array, dracoLoader: DRACOLoader): Promise<THREE.Group> {\n const root = new THREE.Group();\n root.name = 'StowKitMesh';\n \n const { geometries, materials, nodes, meshIndices } = parsedData;\n console.log('Building scene with:', {\n geometries: geometries.length,\n materials: materials.length,\n nodes: nodes.length,\n meshIndices: meshIndices.length\n });\n \n // Create all Three.js objects for nodes\n const nodeObjects: THREE.Object3D[] = [];\n \n for (const node of nodes) {\n const obj = new THREE.Group();\n obj.name = node.name;\n \n console.log(`Node ${node.name}: position=${node.position}, rotation=${node.rotation}, scale=${node.scale}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex}`);\n \n // Apply transform\n obj.position.set(...node.position);\n obj.quaternion.set(...node.rotation);\n obj.scale.set(...node.scale);\n \n // Add meshes to this node\n for (let i = 0; i < node.meshCount; i++) {\n const meshIndexArrayPos = node.firstMeshIndex + i;\n const meshIndex = meshIndices[meshIndexArrayPos];\n console.log(` meshIndices[${meshIndexArrayPos}] = ${meshIndex} (adding to node ${node.name})`);\n if (meshIndex < geometries.length) {\n const geoInfo = geometries[meshIndex];\n console.log(` Creating geometry from geoInfo: vertices=${geoInfo.vertexCount}, indices=${geoInfo.indexCount}, material=${geoInfo.materialIndex}`);\n const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n console.warn(` Material index ${geoInfo.materialIndex} out of bounds, using default`);\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n obj.add(mesh);\n console.log(` ✓ Added mesh to node ${node.name} (${geometry.attributes.position?.count || 0} vertices, material: ${material.name || 'default'})`);\n } else {\n console.error(` ✗ Mesh index ${meshIndex} out of bounds (have ${geometries.length} geometries)`);\n }\n }\n \n console.log(` Node ${node.name} now has ${obj.children.length} children`);\n nodeObjects.push(obj);\n }\n \n // Build hierarchy\n console.log('Building node hierarchy...');\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const obj = nodeObjects[i];\n \n if (node.parentIndex >= 0 && node.parentIndex < nodeObjects.length) {\n console.log(` Adding node \"${node.name}\" (index ${i}) as child of node \"${nodes[node.parentIndex].name}\" (index ${node.parentIndex})`);\n nodeObjects[node.parentIndex].add(obj);\n } else {\n console.log(` Adding node \"${node.name}\" (index ${i}) as direct child of root (parentIndex=${node.parentIndex})`);\n root.add(obj);\n }\n }\n \n // If no nodes, create a single mesh from all geometries\n if (nodes.length === 0 && geometries.length > 0) {\n console.log('No nodes found, creating meshes directly from geometries');\n for (let index = 0; index < geometries.length; index++) {\n const geoInfo = geometries[index];\n console.log(`Creating direct mesh ${index}: materialIndex=${geoInfo.materialIndex}, vertices=${geoInfo.vertexCount}`);\n const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n console.warn(` Material index ${geoInfo.materialIndex} out of bounds, using default`);\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = `Mesh_${index}`;\n root.add(mesh);\n console.log(`Added mesh ${index} to root`);\n }\n }\n \n console.log(`Final scene has ${root.children.length} direct children`);\n \n // Debug: traverse and count all meshes, showing full hierarchy\n let totalMeshCount = 0;\n let hierarchyLog = 'Scene hierarchy:\\n';\n root.traverse((obj) => {\n // Calculate depth by counting parents\n let depth = 0;\n let parent = obj.parent;\n while (parent && parent !== root) {\n depth++;\n parent = parent.parent;\n }\n const indent = ' '.repeat(depth);\n \n if (obj instanceof THREE.Mesh) {\n totalMeshCount++;\n const mat = obj.material as THREE.MeshStandardMaterial;\n hierarchyLog += `${indent}[Mesh] vertices=${obj.geometry.attributes.position?.count || 0}, material=${mat.name}, hasTexture=${!!mat.map}\\n`;\n } else if (obj instanceof THREE.Group && obj !== root) {\n hierarchyLog += `${indent}[Group] ${obj.name} (${obj.children.length} children)\\n`;\n }\n });\n console.log(hierarchyLog);\n console.log(`Total meshes in scene: ${totalMeshCount}`);\n \n return root;\n }\n \n /**\n * Read null-terminated string from buffer\n */\n private static readString(buffer: Uint8Array): string {\n let end = buffer.indexOf(0);\n if (end === -1) end = buffer.length;\n return new TextDecoder().decode(buffer.slice(0, end));\n }\n}\n","import * as THREE from 'three';\r\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\r\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\r\nimport { StowKitReader } from '@stowkit/reader';\r\nimport { MeshParser } from './MeshParser';\r\n\r\nexport interface StowKitLoaderParameters {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/basis/'\r\n */\r\n transcoderPath?: string;\r\n \r\n /**\r\n * Path to WASM reader module\r\n * @default '/stowkit_reader.wasm'\r\n */\r\n wasmPath?: string;\r\n \r\n /**\r\n * Custom StowKitReader instance (optional)\r\n */\r\n reader?: StowKitReader;\r\n}\r\n\r\n/**\r\n * Three.js loader for StowKit asset packs (.stow files)\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const loader = new StowKitLoader();\r\n * loader.setTranscoderPath('/basis/');\r\n * \r\n * // Load a mesh asset\r\n * loader.loadMesh('assets.stow', 'path/to/mesh', (scene) => {\r\n * threeScene.add(scene);\r\n * });\r\n * ```\r\n */\r\nexport class StowKitLoader extends THREE.Loader {\r\n private reader: StowKitReader;\r\n private ktx2Loader: KTX2Loader;\r\n private dracoLoader: DRACOLoader;\r\n private ownedReader: boolean = false;\r\n\r\n constructor(manager?: THREE.LoadingManager, parameters?: StowKitLoaderParameters) {\r\n super(manager);\r\n \r\n // Use provided reader or create new one\r\n if (parameters?.reader) {\r\n this.reader = parameters.reader;\r\n this.ownedReader = false;\r\n } else {\r\n const wasmPath = parameters?.wasmPath || '/stowkit_reader.wasm';\r\n this.reader = new StowKitReader(wasmPath);\r\n this.ownedReader = true;\r\n }\r\n \r\n // Setup KTX2 loader for textures with default path (user must provide basis files)\r\n const transcoderPath = parameters?.transcoderPath || '/basis/'; // Users still need to provide this\r\n this.ktx2Loader = new KTX2Loader(manager);\r\n this.ktx2Loader.setTranscoderPath(transcoderPath);\r\n \r\n // Setup Draco loader for mesh decompression\r\n this.dracoLoader = new DRACOLoader(manager);\r\n this.dracoLoader.setDecoderPath('/stowkit/draco/'); // Draco files copied by postinstall\r\n \r\n // Detect support with a temporary renderer\r\n // This is required for KTX2Loader to work\r\n const tempRenderer = new THREE.WebGLRenderer();\r\n this.ktx2Loader.detectSupport(tempRenderer);\r\n tempRenderer.dispose();\r\n }\r\n \r\n /**\r\n * Set the path to the Draco decoder\r\n */\r\n setDracoDecoderPath(path: string): this {\r\n this.dracoLoader.setDecoderPath(path);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the path to the Basis Universal transcoder\r\n */\r\n setTranscoderPath(path: string): this {\r\n this.ktx2Loader.setTranscoderPath(path);\r\n return this;\r\n }\r\n\r\n /**\r\n * Detect WebGL support for compressed textures\r\n */\r\n detectSupport(renderer: THREE.WebGLRenderer): this {\r\n this.ktx2Loader.detectSupport(renderer);\r\n return this;\r\n }\r\n\r\n /**\r\n * Open a .stow pack file (call this first if loading multiple assets)\r\n * @param url - URL to the .stow file\r\n */\r\n async openPack(url: string): Promise<void> {\r\n if (this.ownedReader) {\r\n await this.reader.init();\r\n }\r\n\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n await this.reader.open(arrayBuffer);\r\n }\r\n\r\n /**\r\n * Load and parse a mesh asset by its index\r\n * @param index - Asset index\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadMeshByIndex(\r\n index: number,\r\n onLoad?: (scene: THREE.Group) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Group> {\r\n try {\r\n // Read mesh data and metadata\r\n const data = this.reader.readAssetData(index);\r\n const metadata = this.reader.readAssetMetadata(index);\r\n\r\n if (!data) {\r\n throw new Error(`Failed to read mesh data for index ${index}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available for index ${index}`);\r\n }\r\n\r\n // Parse mesh data\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n\r\n // Load textures for materials\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n\r\n // Build Three.js scene with Draco decoder\r\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n\r\n if (onLoad) {\r\n onLoad(scene);\r\n }\r\n\r\n return scene;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load and parse a mesh asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the mesh asset within the pack\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadMesh(\r\n url: string,\r\n assetPath: string,\r\n onLoad?: (scene: THREE.Group) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Group> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the mesh asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n // Read mesh data and metadata\r\n const data = this.reader.readAssetData(assetIndex);\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n\r\n if (!data) {\r\n throw new Error(`Failed to read mesh data for ${assetPath}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available for ${assetPath}`);\r\n }\r\n\r\n // Parse mesh data\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n\r\n // Load textures for materials\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n\r\n // Build Three.js scene with Draco decoder\r\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n\r\n if (onLoad) {\r\n onLoad(scene);\r\n }\r\n\r\n return scene;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load textures for materials\r\n */\r\n private async loadMaterialTextures(\r\n materialData: Array<{\r\n name: string;\r\n schemaId: string;\r\n propertyCount: number;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }>,\r\n materials: THREE.Material[]\r\n ): Promise<void> {\r\n for (let i = 0; i < materialData.length; i++) {\r\n const matData = materialData[i];\r\n const material = materials[i] as THREE.MeshStandardMaterial;\r\n\r\n for (const prop of matData.properties) {\r\n if (prop.textureId && prop.textureId.length > 0) {\r\n try {\r\n // Find texture asset\r\n const textureIndex = this.reader.findAssetByPath(prop.textureId);\r\n if (textureIndex < 0) {\r\n console.warn(`Texture not found: ${prop.textureId}`);\r\n continue;\r\n }\r\n\r\n // Read texture data\r\n const textureData = this.reader.readAssetData(textureIndex);\r\n if (!textureData) {\r\n console.warn(`Failed to read texture: ${prop.textureId}`);\r\n continue;\r\n }\r\n\r\n // Load as KTX2\r\n const texture = await this.loadKTX2Texture(textureData);\r\n\r\n // Apply to material based on property name\r\n this.applyTextureToMaterial(material, prop.fieldName, texture);\r\n\r\n } catch (error) {\r\n console.error(`Failed to load texture \"${prop.textureId}\":`, error);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load a KTX2 texture from binary data\r\n */\r\n private async loadKTX2Texture(data: Uint8Array): Promise<THREE.CompressedTexture> {\r\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const blob = new Blob([arrayBuffer]);\r\n const url = URL.createObjectURL(blob);\r\n\r\n try {\r\n return await new Promise<THREE.CompressedTexture>((resolve, reject) => {\r\n this.ktx2Loader.load(\r\n url,\r\n (texture) => {\r\n URL.revokeObjectURL(url);\r\n // Compressed textures don't support flipY, we flip UVs in MeshParser instead\r\n texture.needsUpdate = true;\r\n resolve(texture);\r\n },\r\n undefined,\r\n (error) => {\r\n URL.revokeObjectURL(url);\r\n reject(error);\r\n }\r\n );\r\n });\r\n } catch (error) {\r\n URL.revokeObjectURL(url);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Apply texture to appropriate material property\r\n */\r\n private applyTextureToMaterial(\r\n material: THREE.MeshStandardMaterial,\r\n propertyName: string,\r\n texture: THREE.CompressedTexture\r\n ): void {\r\n const propNameLower = propertyName.toLowerCase();\r\n\r\n if (propNameLower === 'maintex' || propNameLower.includes('diffuse') || \r\n propNameLower.includes('albedo') || propNameLower.includes('base')) {\r\n material.map = texture;\r\n } else if (propNameLower.includes('normal')) {\r\n material.normalMap = texture;\r\n } else if (propNameLower.includes('metallic')) {\r\n material.metalnessMap = texture;\r\n } else if (propNameLower.includes('roughness')) {\r\n material.roughnessMap = texture;\r\n } else {\r\n // Default to main texture\r\n material.map = texture;\r\n }\r\n\r\n material.needsUpdate = true;\r\n }\r\n\r\n /**\r\n * Load a texture asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the texture asset within the pack\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadTexture(\r\n url: string,\r\n assetPath: string,\r\n onLoad?: (texture: THREE.CompressedTexture) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.CompressedTexture> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the texture asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n return await this.loadTextureByIndex(assetIndex, onLoad, onProgress, onError);\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load a texture asset by its index in the pack\r\n * @param index - Asset index\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadTextureByIndex(\r\n index: number,\r\n onLoad?: (texture: THREE.CompressedTexture) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.CompressedTexture> {\r\n try {\r\n // Read texture data\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data for index ${index}`);\r\n }\r\n\r\n // Load as KTX2\r\n const texture = await this.loadKTX2Texture(data);\r\n\r\n if (onLoad) {\r\n onLoad(texture);\r\n }\r\n\r\n return texture;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load an audio asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the audio asset within the pack\r\n * @param listener - THREE.AudioListener to attach to\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadAudio(\r\n url: string,\r\n assetPath: string,\r\n listener: THREE.AudioListener,\r\n onLoad?: (audio: THREE.Audio) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Audio> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the audio asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n // Read audio data\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for ${assetPath}`);\r\n }\r\n\r\n // Create audio object\r\n const audio = new THREE.Audio(listener);\r\n\r\n // Decode audio data\r\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const audioContext = listener.context;\r\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\r\n\r\n audio.setBuffer(audioBuffer);\r\n\r\n if (onLoad) {\r\n onLoad(audio);\r\n }\r\n\r\n return audio;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get metadata for an audio asset\r\n * @param assetPath - Path to the audio asset within the pack\r\n */\r\n getAudioMetadata(assetPath: string): {\r\n stringId: string;\r\n sampleRate: number;\r\n channels: number;\r\n durationMs: number;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 140) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse AudioMetadata structure\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const nullIdx = stringIdBytes.indexOf(0);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, nullIdx >= 0 ? nullIdx : 128));\r\n\r\n return {\r\n stringId,\r\n sampleRate: view.getUint32(128, true),\r\n channels: view.getUint32(132, true),\r\n durationMs: view.getUint32(136, true)\r\n };\r\n } catch (error) {\r\n console.error('Failed to read audio metadata:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get metadata for a texture asset\r\n * @param assetPath - Path to the texture asset within the pack\r\n */\r\n getTextureMetadata(assetPath: string): {\r\n width: number;\r\n height: number;\r\n channels: number;\r\n isKtx2: boolean;\r\n channelFormat: number;\r\n stringId: string;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 144) return null; // TextureMetadata is now 144 bytes\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse TextureMetadata structure (width, height, channels, channel_format, string_id[128])\r\n const stringIdBytes = metadata.slice(16, 144); // After 4 uint32s (16 bytes)\r\n const nullIdx = stringIdBytes.indexOf(0);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, nullIdx >= 0 ? nullIdx : 128));\r\n\r\n return {\r\n width: view.getUint32(0, true),\r\n height: view.getUint32(4, true),\r\n channels: view.getUint32(8, true),\r\n isKtx2: true, // All textures are KTX2 now\r\n channelFormat: view.getUint32(12, true),\r\n stringId\r\n };\r\n } catch (error) {\r\n console.error('Failed to read texture metadata:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load material schema information by index\r\n * @param index - Asset index\r\n */\r\n loadMaterialSchemaByIndex(index: number): {\r\n stringId: string;\r\n schemaName: string;\r\n fields: Array<{\r\n name: string;\r\n type: 'Texture' | 'Color' | 'Float' | 'Vec2' | 'Vec3' | 'Vec4' | 'Int';\r\n previewFlag: 'None' | 'MainTex' | 'Tint';\r\n defaultValue: [number, number, number, number];\r\n }>;\r\n } | null {\r\n try {\r\n const metadata = this.reader.readAssetMetadata(index);\r\n if (!metadata || metadata.length < 196) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const schemaNameBytes = metadata.slice(128, 192);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdBytes.indexOf(0) || 128));\r\n const schemaName = decoder.decode(schemaNameBytes.slice(0, schemaNameBytes.indexOf(0) || 64));\r\n const fieldCount = view.getUint32(192, true);\r\n\r\n const fields = [];\r\n let offset = 196;\r\n\r\n for (let i = 0; i < fieldCount; i++) {\r\n if (offset + 88 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const fieldType = view.getUint32(offset + 64, true);\r\n const previewFlags = view.getUint32(offset + 68, true);\r\n const defaultValue: [number, number, number, number] = [\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true),\r\n view.getFloat32(offset + 80, true),\r\n view.getFloat32(offset + 84, true)\r\n ];\r\n\r\n const typeNames = ['Texture', 'Color', 'Float', 'Vec2', 'Vec3', 'Vec4', 'Int'] as const;\r\n const previewFlagNames = ['None', 'MainTex', 'Tint'] as const;\r\n\r\n fields.push({\r\n name: fieldName,\r\n type: typeNames[fieldType] || 'Float',\r\n previewFlag: previewFlagNames[previewFlags] || 'None',\r\n defaultValue\r\n });\r\n\r\n offset += 88;\r\n }\r\n\r\n return { stringId, schemaName, fields };\r\n } catch (error) {\r\n console.error('Failed to read material schema:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load material schema information by path\r\n * @param assetPath - Path to the material schema asset\r\n */\r\n loadMaterialSchema(assetPath: string): {\r\n stringId: string;\r\n schemaName: string;\r\n fields: Array<{\r\n name: string;\r\n type: 'Texture' | 'Color' | 'Float' | 'Vec2' | 'Vec3' | 'Vec4' | 'Int';\r\n previewFlag: 'None' | 'MainTex' | 'Tint';\r\n defaultValue: [number, number, number, number];\r\n }>;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 196) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse MaterialSchemaMetadata: string_id[128] + schema_name[64] + field_count(4) = 196 bytes\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const schemaNameBytes = metadata.slice(128, 192);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdBytes.indexOf(0) || 128));\r\n const schemaName = decoder.decode(schemaNameBytes.slice(0, schemaNameBytes.indexOf(0) || 64));\r\n const fieldCount = view.getUint32(192, true);\r\n\r\n const fields = [];\r\n let offset = 196;\r\n\r\n // Parse fields: name[64] + field_type(4) + preview_flags(4) + default_value[4*4=16] = 88 bytes\r\n for (let i = 0; i < fieldCount; i++) {\r\n if (offset + 88 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const fieldType = view.getUint32(offset + 64, true);\r\n const previewFlags = view.getUint32(offset + 68, true);\r\n const defaultValue: [number, number, number, number] = [\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true),\r\n view.getFloat32(offset + 80, true),\r\n view.getFloat32(offset + 84, true)\r\n ];\r\n\r\n const typeNames = ['Texture', 'Color', 'Float', 'Vec2', 'Vec3', 'Vec4', 'Int'] as const;\r\n const previewFlagNames = ['None', 'MainTex', 'Tint'] as const;\r\n\r\n fields.push({\r\n name: fieldName,\r\n type: typeNames[fieldType] || 'Float',\r\n previewFlag: previewFlagNames[previewFlags] || 'None',\r\n defaultValue\r\n });\r\n\r\n offset += 88; // MaterialSchemaField is 88 bytes total\r\n }\r\n\r\n return { stringId, schemaName, fields };\r\n } catch (error) {\r\n console.error('Failed to read material schema:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get material information from a loaded mesh\r\n * Returns material data including properties and texture references\r\n */\r\n getMeshMaterials(assetPath: string): Array<{\r\n name: string;\r\n schemaId: string;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }> | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 140) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse MeshMetadata\r\n const meshGeometryCount = view.getUint32(0, true);\r\n const materialCount = view.getUint32(4, true);\r\n const nodeCount = view.getUint32(8, true);\r\n\r\n let offset = 140;\r\n\r\n // Skip geometries (40 bytes each - Draco compressed)\r\n offset += meshGeometryCount * 40;\r\n\r\n // Parse materials\r\n const materials: Array<{\r\n name: string;\r\n schemaId: string;\r\n propertyCount: number;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }> = [];\r\n \r\n for (let i = 0; i < materialCount; i++) {\r\n if (offset + 196 > metadata.length) break;\r\n\r\n const nameBytes = metadata.slice(offset, offset + 64);\r\n const schemaIdBytes = metadata.slice(offset + 64, offset + 192);\r\n const name = decoder.decode(nameBytes.slice(0, nameBytes.indexOf(0) || 64));\r\n const schemaId = decoder.decode(schemaIdBytes.slice(0, schemaIdBytes.indexOf(0) || 128));\r\n const propertyCount = view.getUint32(offset + 192, true);\r\n\r\n materials.push({ name, schemaId, propertyCount, properties: [] });\r\n offset += 196;\r\n }\r\n\r\n // Skip nodes (116 bytes each)\r\n offset += nodeCount * 116;\r\n\r\n // Skip mesh indices (4 bytes each)\r\n const totalMeshRefs = materials.reduce((sum: number, mat: any) => {\r\n // This is a simplification - we'd need to parse nodes to get exact count\r\n return sum;\r\n }, 0);\r\n // For now, skip based on nodeCount assumption\r\n offset += nodeCount * 4;\r\n\r\n // Parse material properties\r\n for (const mat of materials) {\r\n for (let j = 0; j < (mat as any).propertyCount; j++) {\r\n if (offset + 144 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const value: [number, number, number, number] = [\r\n view.getFloat32(offset + 64, true),\r\n view.getFloat32(offset + 68, true),\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true)\r\n ];\r\n const textureIdBytes = metadata.slice(offset + 80, offset + 144);\r\n const textureId = decoder.decode(textureIdBytes.slice(0, textureIdBytes.indexOf(0) || 64));\r\n\r\n mat.properties.push({ fieldName, value, textureId });\r\n offset += 144;\r\n }\r\n }\r\n\r\n return materials;\r\n } catch (error) {\r\n console.error('Failed to read mesh materials:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Open a .stow file from a File or ArrayBuffer\r\n */\r\n async open(fileOrBuffer: ArrayBuffer | File): Promise<boolean> {\r\n // Initialize reader if needed\r\n if (this.ownedReader) {\r\n await this.reader.init();\r\n }\r\n return await this.reader.open(fileOrBuffer);\r\n }\r\n\r\n /**\r\n * Get the total number of assets\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get info about a specific asset\r\n */\r\n getAssetInfo(index: number): any {\r\n return this.reader.getAssetInfo(index);\r\n }\r\n\r\n /**\r\n * Read asset data by index\r\n */\r\n readAssetData(index: number): Uint8Array | null {\r\n return this.reader.readAssetData(index);\r\n }\r\n\r\n /**\r\n * Read asset metadata by index\r\n */\r\n readAssetMetadata(index: number): Uint8Array | null {\r\n return this.reader.readAssetMetadata(index);\r\n }\r\n\r\n /**\r\n * Parse texture metadata\r\n */\r\n parseTextureMetadata(metadataBytes: Uint8Array): any {\r\n return this.reader.parseTextureMetadata(metadataBytes);\r\n }\r\n\r\n /**\r\n * Create an HTML audio element for preview\r\n * @param index - Asset index\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for index ${index}`);\r\n }\r\n\r\n // Create blob URL for HTML5 audio\r\n const blob = new Blob([data as any], { type: 'audio/ogg' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n // Create and configure audio element\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n // Clean up URL when audio ends or on error\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n /**\r\n * List all assets in the opened pack\r\n */\r\n listAssets(): Array<{\r\n index: number;\r\n name?: string;\r\n type: number;\r\n dataSize: number;\r\n metadataSize: number;\r\n }> {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Dispose of resources\r\n */\r\n dispose(): void {\r\n this.ktx2Loader.dispose();\r\n this.dracoLoader.dispose();\r\n if (this.ownedReader) {\r\n this.reader.close();\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stowkit-three-loader.esm.js","sources":["../src/MeshParser.ts","../src/StowKitLoader.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\n\nexport interface MeshGeometryInfo {\n vertexCount: number;\n indexCount: number;\n hasNormals: number;\n hasUVs: number;\n compressedBufferOffset: number;\n compressedBufferSize: number;\n materialIndex: number;\n padding: number;\n}\n\nexport interface Node {\n name: string;\n parentIndex: number;\n position: [number, number, number];\n rotation: [number, number, number, number]; // Quaternion\n scale: [number, number, number];\n meshCount: number;\n firstMeshIndex: number;\n}\n\nexport interface MaterialPropertyValue {\n fieldName: string;\n value: [number, number, number, number]; // Vec4 for colors, floats, etc.\n textureId: string; // For texture references\n}\n\nexport interface MaterialData {\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: MaterialPropertyValue[];\n}\n\nexport interface MeshMetadata {\n meshGeometryCount: number;\n materialCount: number;\n nodeCount: number;\n stringId: string;\n}\n\nexport class MeshParser {\n \n /**\n * Parse mesh metadata from binary data\n */\n static parseMeshMetadata(data: Uint8Array): MeshMetadata {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n \n // MeshMetadata structure (140 bytes total when packed)\n const metadata: MeshMetadata = {\n meshGeometryCount: view.getUint32(0, true),\n materialCount: view.getUint32(4, true),\n nodeCount: view.getUint32(8, true),\n stringId: this.readString(data.slice(12, 140)) // 128 bytes for string\n };\n \n return metadata;\n }\n \n /**\n * Parse complete mesh data including geometry, materials, and nodes\n */\n static parseMeshData(metadataBlob: Uint8Array, dataBlob: Uint8Array): {\n metadata: MeshMetadata;\n geometries: MeshGeometryInfo[];\n materials: THREE.Material[];\n materialData: MaterialData[];\n nodes: Node[];\n meshIndices: Uint32Array;\n } {\n // Ensure we have at least the minimum metadata size\n if (metadataBlob.length < 140) {\n throw new Error(`Metadata blob too small: ${metadataBlob.length} bytes (expected at least 140)`);\n }\n \n console.log(`Parsing mesh metadata: ${metadataBlob.length} bytes metadata, ${dataBlob.length} bytes data`);\n const metadata = this.parseMeshMetadata(metadataBlob);\n console.log(`Mesh counts: ${metadata.meshGeometryCount} geometries, ${metadata.materialCount} materials, ${metadata.nodeCount} nodes`);\n \n // Check if the metadata blob contains just the header or all the mesh info\n const expectedMetadataSize = 140 + \n (metadata.meshGeometryCount * 40) + // Draco compressed (40 bytes each)\n (metadata.materialCount * 196) + // MaterialData header\n (metadata.nodeCount * 116);\n \n let hasExtendedMetadata = metadataBlob.length >= expectedMetadataSize;\n console.log(`Expected metadata size: ${expectedMetadataSize}, actual: ${metadataBlob.length}, has extended: ${hasExtendedMetadata}`);\n \n // If metadata only has the header, the mesh info might be at the start of the data blob\n const sourceBlob = hasExtendedMetadata ? metadataBlob : dataBlob;\n const metaView = new DataView(sourceBlob.buffer, sourceBlob.byteOffset, sourceBlob.byteLength);\n \n let offset = hasExtendedMetadata ? 140 : 0; // Start after MeshMetadata if in metadata blob, or at beginning of data blob\n \n // Parse geometry infos (now Draco compressed!)\n const geometries: MeshGeometryInfo[] = [];\n for (let i = 0; i < metadata.meshGeometryCount; i++) {\n if (offset + 40 > sourceBlob.length) {\n console.warn(`Data truncated at geometry ${i}/${metadata.meshGeometryCount}`);\n break;\n }\n const geo: MeshGeometryInfo = {\n vertexCount: metaView.getUint32(offset, true),\n indexCount: metaView.getUint32(offset + 4, true),\n hasNormals: metaView.getUint32(offset + 8, true),\n hasUVs: metaView.getUint32(offset + 12, true),\n compressedBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n compressedBufferSize: Number(metaView.getBigUint64(offset + 24, true)),\n materialIndex: metaView.getUint32(offset + 32, true),\n padding: metaView.getUint32(offset + 36, true)\n };\n geometries.push(geo);\n offset += 40; // Size of MeshGeometryInfo (Draco compressed)\n }\n \n // Parse materials - MaterialData structure: name[64] + schema_id[128] + property_count(4) = 196 bytes\n const materialData: MaterialData[] = [];\n const materials: THREE.Material[] = [];\n \n // First pass: read all MaterialData headers (without properties)\n const materialOffsets: number[] = [];\n for (let i = 0; i < metadata.materialCount; i++) {\n if (offset + 196 > sourceBlob.length) {\n console.warn(`Data truncated at material ${i}/${metadata.materialCount}`);\n break;\n }\n \n materialOffsets.push(offset);\n \n const name = this.readString(sourceBlob.slice(offset, offset + 64));\n const schemaId = this.readString(sourceBlob.slice(offset + 64, offset + 192));\n const propertyCount = metaView.getUint32(offset + 192, true);\n \n materialData.push({\n name,\n schemaId,\n propertyCount,\n properties: []\n });\n \n offset += 196; // Size of MaterialData header\n }\n \n // Parse nodes first (they come before material properties in the blob)\n const nodes: Node[] = [];\n console.log(`\\n=== Nodes from StowKit file (${metadata.nodeCount} total) ===`);\n for (let i = 0; i < metadata.nodeCount; i++) {\n if (offset + 116 > sourceBlob.length) {\n console.warn(`Data truncated at node ${i}/${metadata.nodeCount}`);\n break;\n }\n const node: Node = {\n name: this.readString(sourceBlob.slice(offset, offset + 64)),\n parentIndex: metaView.getInt32(offset + 64, true),\n position: [\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ],\n rotation: [\n metaView.getFloat32(offset + 80, true),\n metaView.getFloat32(offset + 84, true),\n metaView.getFloat32(offset + 88, true),\n metaView.getFloat32(offset + 92, true)\n ],\n scale: [\n metaView.getFloat32(offset + 96, true),\n metaView.getFloat32(offset + 100, true),\n metaView.getFloat32(offset + 104, true)\n ],\n meshCount: metaView.getUint32(offset + 108, true),\n firstMeshIndex: metaView.getUint32(offset + 112, true)\n };\n console.log(`Node ${i}: \"${node.name}\" (parent=${node.parentIndex}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex})`);\n nodes.push(node);\n offset += 116; // Size of Node struct\n }\n console.log(`=== End of nodes from file ===\\n`);\n \n // Parse mesh indices\n const totalMeshRefs = nodes.reduce((sum, node) => sum + node.meshCount, 0);\n console.log(`Parsing ${totalMeshRefs} mesh indices at offset ${offset}`);\n const meshIndices = new Uint32Array(totalMeshRefs);\n for (let i = 0; i < totalMeshRefs; i++) {\n if (offset + (i + 1) * 4 > sourceBlob.length) {\n console.warn(`Data truncated at mesh index ${i}/${totalMeshRefs}`);\n break;\n }\n meshIndices[i] = metaView.getUint32(offset + i * 4, true);\n console.log(` meshIndices[${i}] = ${meshIndices[i]}`);\n }\n offset += totalMeshRefs * 4;\n console.log(`After mesh indices, offset = ${offset}`);\n \n // Second pass: read material properties\n // MaterialPropertyValue: field_name[64] + value[4*4=16] + texture_id[64] = 144 bytes\n for (let i = 0; i < materialData.length; i++) {\n const matData = materialData[i];\n console.log(`Material \"${matData.name}\": schema=\"${matData.schemaId}\", ${matData.propertyCount} properties`);\n \n for (let j = 0; j < matData.propertyCount; j++) {\n if (offset + 144 > sourceBlob.length) {\n console.warn(`Data truncated at property ${j}/${matData.propertyCount} of material ${i}`);\n break;\n }\n \n const fieldName = this.readString(sourceBlob.slice(offset, offset + 64));\n const value: [number, number, number, number] = [\n metaView.getFloat32(offset + 64, true),\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ];\n const textureId = this.readString(sourceBlob.slice(offset + 80, offset + 144));\n \n matData.properties.push({\n fieldName,\n value,\n textureId\n });\n \n console.log(` Property \"${fieldName}\": value=[${value.join(', ')}], textureId=\"${textureId}\"`);\n \n offset += 144; // Size of MaterialPropertyValue\n }\n \n // Create Three.js material based on properties\n const mat = new THREE.MeshStandardMaterial({\n name: matData.name,\n side: THREE.DoubleSide,\n // Start with default gray color\n color: new THREE.Color(0.8, 0.8, 0.8)\n });\n \n console.log(`Creating material ${i}: \"${matData.name}\", ${matData.propertyCount} properties`);\n \n // Apply properties\n for (const prop of matData.properties) {\n if (prop.fieldName.toLowerCase() === 'tint' || prop.fieldName.toLowerCase().includes('color')) {\n // Apply color/tint\n mat.color = new THREE.Color(prop.value[0], prop.value[1], prop.value[2]);\n console.log(` Applied tint color: rgb(${prop.value[0]}, ${prop.value[1]}, ${prop.value[2]})`);\n }\n }\n \n console.log(` Material ${i} final color: rgb(${mat.color.r}, ${mat.color.g}, ${mat.color.b})`);\n materials.push(mat);\n }\n \n // Default material if none exist\n if (materials.length === 0) {\n materials.push(new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8), // Light gray\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n }));\n }\n \n return { metadata, geometries, materials, materialData, nodes, meshIndices };\n }\n \n /**\n * Create Three.js BufferGeometry from Draco compressed mesh data\n */\n static async createGeometry(geoInfo: MeshGeometryInfo, dataBlob: Uint8Array, dracoLoader: DRACOLoader): Promise<THREE.BufferGeometry> {\n console.log('Decoding Draco geometry:', {\n vertexCount: geoInfo.vertexCount,\n indexCount: geoInfo.indexCount,\n hasNormals: geoInfo.hasNormals,\n hasUVs: geoInfo.hasUVs,\n compressedOffset: geoInfo.compressedBufferOffset,\n compressedSize: geoInfo.compressedBufferSize\n });\n \n // Extract the Draco compressed buffer\n if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {\n throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);\n }\n \n const compressedData = dataBlob.slice(\n geoInfo.compressedBufferOffset,\n geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize\n );\n \n // Decode using Draco\n // Create a blob URL for the Draco data (DRACOLoader expects a URL)\n const arrayBuffer = compressedData.buffer.slice(compressedData.byteOffset, compressedData.byteOffset + compressedData.byteLength);\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const geometry = await new Promise<THREE.BufferGeometry>((resolve, reject) => {\n dracoLoader.load(\n url,\n (decoded: THREE.BufferGeometry) => {\n URL.revokeObjectURL(url);\n console.log('Draco decoded successfully:', decoded);\n \n // UVs are pre-flipped in the packer now, no need to flip here\n resolve(decoded);\n },\n undefined,\n (error: any) => {\n URL.revokeObjectURL(url);\n console.error('Draco decode failed:', error);\n reject(new Error(`Failed to decode Draco geometry: ${error}`));\n }\n );\n });\n \n // Compute bounding volumes\n geometry.computeBoundingSphere();\n geometry.computeBoundingBox();\n \n console.log('Final geometry:', {\n hasPositions: !!geometry.attributes.position,\n hasNormals: !!geometry.attributes.normal,\n hasUVs: !!geometry.attributes.uv,\n hasIndices: !!geometry.index,\n vertexCount: geometry.attributes.position?.count || 0\n });\n \n return geometry;\n }\n \n /**\n * Build Three.js scene from parsed mesh data\n */\n static async buildScene(parsedData: ReturnType<typeof MeshParser.parseMeshData>, dataBlob: Uint8Array, dracoLoader: DRACOLoader): Promise<THREE.Group> {\n const root = new THREE.Group();\n root.name = 'StowKitMesh';\n \n const { geometries, materials, nodes, meshIndices } = parsedData;\n console.log('Building scene with:', {\n geometries: geometries.length,\n materials: materials.length,\n nodes: nodes.length,\n meshIndices: meshIndices.length\n });\n \n // Create all Three.js objects for nodes\n const nodeObjects: THREE.Object3D[] = [];\n \n for (const node of nodes) {\n const obj = new THREE.Group();\n obj.name = node.name;\n \n console.log(`Node ${node.name}: position=${node.position}, rotation=${node.rotation}, scale=${node.scale}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex}`);\n \n // Apply transform\n obj.position.set(...node.position);\n obj.quaternion.set(...node.rotation);\n obj.scale.set(...node.scale);\n \n // Add meshes to this node\n for (let i = 0; i < node.meshCount; i++) {\n const meshIndexArrayPos = node.firstMeshIndex + i;\n const meshIndex = meshIndices[meshIndexArrayPos];\n console.log(` meshIndices[${meshIndexArrayPos}] = ${meshIndex} (adding to node ${node.name})`);\n if (meshIndex < geometries.length) {\n const geoInfo = geometries[meshIndex];\n console.log(` Creating geometry from geoInfo: vertices=${geoInfo.vertexCount}, indices=${geoInfo.indexCount}, material=${geoInfo.materialIndex}`);\n const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n console.warn(` Material index ${geoInfo.materialIndex} out of bounds, using default`);\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n obj.add(mesh);\n console.log(` ✓ Added mesh to node ${node.name} (${geometry.attributes.position?.count || 0} vertices, material: ${material.name || 'default'})`);\n } else {\n console.error(` ✗ Mesh index ${meshIndex} out of bounds (have ${geometries.length} geometries)`);\n }\n }\n \n console.log(` Node ${node.name} now has ${obj.children.length} children`);\n nodeObjects.push(obj);\n }\n \n // Build hierarchy\n console.log('Building node hierarchy...');\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const obj = nodeObjects[i];\n \n if (node.parentIndex >= 0 && node.parentIndex < nodeObjects.length) {\n console.log(` Adding node \"${node.name}\" (index ${i}) as child of node \"${nodes[node.parentIndex].name}\" (index ${node.parentIndex})`);\n nodeObjects[node.parentIndex].add(obj);\n } else {\n console.log(` Adding node \"${node.name}\" (index ${i}) as direct child of root (parentIndex=${node.parentIndex})`);\n root.add(obj);\n }\n }\n \n // If no nodes, create a single mesh from all geometries\n if (nodes.length === 0 && geometries.length > 0) {\n console.log('No nodes found, creating meshes directly from geometries');\n for (let index = 0; index < geometries.length; index++) {\n const geoInfo = geometries[index];\n console.log(`Creating direct mesh ${index}: materialIndex=${geoInfo.materialIndex}, vertices=${geoInfo.vertexCount}`);\n const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n console.warn(` Material index ${geoInfo.materialIndex} out of bounds, using default`);\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = `Mesh_${index}`;\n root.add(mesh);\n console.log(`Added mesh ${index} to root`);\n }\n }\n \n console.log(`Final scene has ${root.children.length} direct children`);\n \n // Debug: traverse and count all meshes, showing full hierarchy\n let totalMeshCount = 0;\n let hierarchyLog = 'Scene hierarchy:\\n';\n root.traverse((obj) => {\n // Calculate depth by counting parents\n let depth = 0;\n let parent = obj.parent;\n while (parent && parent !== root) {\n depth++;\n parent = parent.parent;\n }\n const indent = ' '.repeat(depth);\n \n if (obj instanceof THREE.Mesh) {\n totalMeshCount++;\n const mat = obj.material as THREE.MeshStandardMaterial;\n hierarchyLog += `${indent}[Mesh] vertices=${obj.geometry.attributes.position?.count || 0}, material=${mat.name}, hasTexture=${!!mat.map}\\n`;\n } else if (obj instanceof THREE.Group && obj !== root) {\n hierarchyLog += `${indent}[Group] ${obj.name} (${obj.children.length} children)\\n`;\n }\n });\n console.log(hierarchyLog);\n console.log(`Total meshes in scene: ${totalMeshCount}`);\n \n return root;\n }\n \n /**\n * Read null-terminated string from buffer\n */\n private static readString(buffer: Uint8Array): string {\n let end = buffer.indexOf(0);\n if (end === -1) end = buffer.length;\n return new TextDecoder().decode(buffer.slice(0, end));\n }\n}\n","import * as THREE from 'three';\r\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\r\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\r\nimport { StowKitReader } from '@stowkit/reader';\r\nimport { MeshParser } from './MeshParser';\r\n\r\nexport interface StowKitLoaderParameters {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/basis/'\r\n */\r\n transcoderPath?: string;\r\n \r\n /**\r\n * Path to WASM reader module\r\n * @default '/stowkit_reader.wasm'\r\n */\r\n wasmPath?: string;\r\n \r\n /**\r\n * Custom StowKitReader instance (optional)\r\n */\r\n reader?: StowKitReader;\r\n}\r\n\r\n/**\r\n * Three.js loader for StowKit asset packs (.stow files)\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const loader = new StowKitLoader();\r\n * loader.setTranscoderPath('/basis/');\r\n * \r\n * // Load a mesh asset\r\n * loader.loadMesh('assets.stow', 'path/to/mesh', (scene) => {\r\n * threeScene.add(scene);\r\n * });\r\n * ```\r\n */\r\nexport class StowKitLoader extends THREE.Loader {\r\n private reader: StowKitReader;\r\n private ktx2Loader: KTX2Loader;\r\n private dracoLoader: DRACOLoader;\r\n private ownedReader: boolean = false;\r\n\r\n constructor(manager?: THREE.LoadingManager, parameters?: StowKitLoaderParameters) {\r\n super(manager);\r\n \r\n // Use provided reader or create new one\r\n if (parameters?.reader) {\r\n this.reader = parameters.reader;\r\n this.ownedReader = false;\r\n } else {\r\n const wasmPath = parameters?.wasmPath || '/stowkit_reader.wasm';\r\n this.reader = new StowKitReader(wasmPath);\r\n this.ownedReader = true;\r\n }\r\n \r\n // Setup KTX2 loader for textures with default path (bundled with package)\r\n const transcoderPath = parameters?.transcoderPath || '/stowkit/basis/'; // Auto-copied on install\r\n this.ktx2Loader = new KTX2Loader(manager);\r\n this.ktx2Loader.setTranscoderPath(transcoderPath);\r\n \r\n // Setup Draco loader for mesh decompression\r\n this.dracoLoader = new DRACOLoader(manager);\r\n this.dracoLoader.setDecoderPath('/stowkit/draco/'); // Draco files copied by postinstall\r\n \r\n // Detect support with a temporary renderer\r\n // This is required for KTX2Loader to work\r\n const tempRenderer = new THREE.WebGLRenderer();\r\n this.ktx2Loader.detectSupport(tempRenderer);\r\n tempRenderer.dispose();\r\n }\r\n \r\n /**\r\n * Set the path to the Draco decoder\r\n */\r\n setDracoDecoderPath(path: string): this {\r\n this.dracoLoader.setDecoderPath(path);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the path to the Basis Universal transcoder\r\n */\r\n setTranscoderPath(path: string): this {\r\n this.ktx2Loader.setTranscoderPath(path);\r\n return this;\r\n }\r\n\r\n /**\r\n * Detect WebGL support for compressed textures\r\n */\r\n detectSupport(renderer: THREE.WebGLRenderer): this {\r\n this.ktx2Loader.detectSupport(renderer);\r\n return this;\r\n }\r\n\r\n /**\r\n * Open a .stow pack file (call this first if loading multiple assets)\r\n * @param url - URL to the .stow file\r\n */\r\n async openPack(url: string): Promise<void> {\r\n if (this.ownedReader) {\r\n await this.reader.init();\r\n }\r\n\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n await this.reader.open(arrayBuffer);\r\n }\r\n\r\n /**\r\n * Load and parse a mesh asset by its index\r\n * @param index - Asset index\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadMeshByIndex(\r\n index: number,\r\n onLoad?: (scene: THREE.Group) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Group> {\r\n try {\r\n // Read mesh data and metadata\r\n const data = this.reader.readAssetData(index);\r\n const metadata = this.reader.readAssetMetadata(index);\r\n\r\n if (!data) {\r\n throw new Error(`Failed to read mesh data for index ${index}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available for index ${index}`);\r\n }\r\n\r\n // Parse mesh data\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n\r\n // Load textures for materials\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n\r\n // Build Three.js scene with Draco decoder\r\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n\r\n if (onLoad) {\r\n onLoad(scene);\r\n }\r\n\r\n return scene;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load and parse a mesh asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the mesh asset within the pack\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadMesh(\r\n url: string,\r\n assetPath: string,\r\n onLoad?: (scene: THREE.Group) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Group> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the mesh asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n // Read mesh data and metadata\r\n const data = this.reader.readAssetData(assetIndex);\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n\r\n if (!data) {\r\n throw new Error(`Failed to read mesh data for ${assetPath}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available for ${assetPath}`);\r\n }\r\n\r\n // Parse mesh data\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n\r\n // Load textures for materials\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n\r\n // Build Three.js scene with Draco decoder\r\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n\r\n if (onLoad) {\r\n onLoad(scene);\r\n }\r\n\r\n return scene;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load textures for materials\r\n */\r\n private async loadMaterialTextures(\r\n materialData: Array<{\r\n name: string;\r\n schemaId: string;\r\n propertyCount: number;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }>,\r\n materials: THREE.Material[]\r\n ): Promise<void> {\r\n for (let i = 0; i < materialData.length; i++) {\r\n const matData = materialData[i];\r\n const material = materials[i] as THREE.MeshStandardMaterial;\r\n\r\n for (const prop of matData.properties) {\r\n if (prop.textureId && prop.textureId.length > 0) {\r\n try {\r\n // Find texture asset\r\n const textureIndex = this.reader.findAssetByPath(prop.textureId);\r\n if (textureIndex < 0) {\r\n console.warn(`Texture not found: ${prop.textureId}`);\r\n continue;\r\n }\r\n\r\n // Read texture data\r\n const textureData = this.reader.readAssetData(textureIndex);\r\n if (!textureData) {\r\n console.warn(`Failed to read texture: ${prop.textureId}`);\r\n continue;\r\n }\r\n\r\n // Load as KTX2\r\n const texture = await this.loadKTX2Texture(textureData);\r\n\r\n // Apply to material based on property name\r\n this.applyTextureToMaterial(material, prop.fieldName, texture);\r\n\r\n } catch (error) {\r\n console.error(`Failed to load texture \"${prop.textureId}\":`, error);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load a KTX2 texture from binary data\r\n */\r\n private async loadKTX2Texture(data: Uint8Array): Promise<THREE.CompressedTexture> {\r\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const blob = new Blob([arrayBuffer]);\r\n const url = URL.createObjectURL(blob);\r\n\r\n try {\r\n return await new Promise<THREE.CompressedTexture>((resolve, reject) => {\r\n this.ktx2Loader.load(\r\n url,\r\n (texture) => {\r\n URL.revokeObjectURL(url);\r\n // Compressed textures don't support flipY, we flip UVs in MeshParser instead\r\n texture.needsUpdate = true;\r\n resolve(texture);\r\n },\r\n undefined,\r\n (error) => {\r\n URL.revokeObjectURL(url);\r\n reject(error);\r\n }\r\n );\r\n });\r\n } catch (error) {\r\n URL.revokeObjectURL(url);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Apply texture to appropriate material property\r\n */\r\n private applyTextureToMaterial(\r\n material: THREE.MeshStandardMaterial,\r\n propertyName: string,\r\n texture: THREE.CompressedTexture\r\n ): void {\r\n const propNameLower = propertyName.toLowerCase();\r\n\r\n if (propNameLower === 'maintex' || propNameLower.includes('diffuse') || \r\n propNameLower.includes('albedo') || propNameLower.includes('base')) {\r\n material.map = texture;\r\n } else if (propNameLower.includes('normal')) {\r\n material.normalMap = texture;\r\n } else if (propNameLower.includes('metallic')) {\r\n material.metalnessMap = texture;\r\n } else if (propNameLower.includes('roughness')) {\r\n material.roughnessMap = texture;\r\n } else {\r\n // Default to main texture\r\n material.map = texture;\r\n }\r\n\r\n material.needsUpdate = true;\r\n }\r\n\r\n /**\r\n * Load a texture asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the texture asset within the pack\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadTexture(\r\n url: string,\r\n assetPath: string,\r\n onLoad?: (texture: THREE.CompressedTexture) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.CompressedTexture> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the texture asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n return await this.loadTextureByIndex(assetIndex, onLoad, onProgress, onError);\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load a texture asset by its index in the pack\r\n * @param index - Asset index\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadTextureByIndex(\r\n index: number,\r\n onLoad?: (texture: THREE.CompressedTexture) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.CompressedTexture> {\r\n try {\r\n // Read texture data\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data for index ${index}`);\r\n }\r\n\r\n // Load as KTX2\r\n const texture = await this.loadKTX2Texture(data);\r\n\r\n if (onLoad) {\r\n onLoad(texture);\r\n }\r\n\r\n return texture;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load an audio asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the audio asset within the pack\r\n * @param listener - THREE.AudioListener to attach to\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadAudio(\r\n url: string,\r\n assetPath: string,\r\n listener: THREE.AudioListener,\r\n onLoad?: (audio: THREE.Audio) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Audio> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the audio asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n // Read audio data\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for ${assetPath}`);\r\n }\r\n\r\n // Create audio object\r\n const audio = new THREE.Audio(listener);\r\n\r\n // Decode audio data\r\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const audioContext = listener.context;\r\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\r\n\r\n audio.setBuffer(audioBuffer);\r\n\r\n if (onLoad) {\r\n onLoad(audio);\r\n }\r\n\r\n return audio;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get metadata for an audio asset\r\n * @param assetPath - Path to the audio asset within the pack\r\n */\r\n getAudioMetadata(assetPath: string): {\r\n stringId: string;\r\n sampleRate: number;\r\n channels: number;\r\n durationMs: number;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 140) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse AudioMetadata structure\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const nullIdx = stringIdBytes.indexOf(0);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, nullIdx >= 0 ? nullIdx : 128));\r\n\r\n return {\r\n stringId,\r\n sampleRate: view.getUint32(128, true),\r\n channels: view.getUint32(132, true),\r\n durationMs: view.getUint32(136, true)\r\n };\r\n } catch (error) {\r\n console.error('Failed to read audio metadata:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get metadata for a texture asset\r\n * @param assetPath - Path to the texture asset within the pack\r\n */\r\n getTextureMetadata(assetPath: string): {\r\n width: number;\r\n height: number;\r\n channels: number;\r\n isKtx2: boolean;\r\n channelFormat: number;\r\n stringId: string;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 144) return null; // TextureMetadata is now 144 bytes\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse TextureMetadata structure (width, height, channels, channel_format, string_id[128])\r\n const stringIdBytes = metadata.slice(16, 144); // After 4 uint32s (16 bytes)\r\n const nullIdx = stringIdBytes.indexOf(0);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, nullIdx >= 0 ? nullIdx : 128));\r\n\r\n return {\r\n width: view.getUint32(0, true),\r\n height: view.getUint32(4, true),\r\n channels: view.getUint32(8, true),\r\n isKtx2: true, // All textures are KTX2 now\r\n channelFormat: view.getUint32(12, true),\r\n stringId\r\n };\r\n } catch (error) {\r\n console.error('Failed to read texture metadata:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load material schema information by index\r\n * @param index - Asset index\r\n */\r\n loadMaterialSchemaByIndex(index: number): {\r\n stringId: string;\r\n schemaName: string;\r\n fields: Array<{\r\n name: string;\r\n type: 'Texture' | 'Color' | 'Float' | 'Vec2' | 'Vec3' | 'Vec4' | 'Int';\r\n previewFlag: 'None' | 'MainTex' | 'Tint';\r\n defaultValue: [number, number, number, number];\r\n }>;\r\n } | null {\r\n try {\r\n const metadata = this.reader.readAssetMetadata(index);\r\n if (!metadata || metadata.length < 196) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const schemaNameBytes = metadata.slice(128, 192);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdBytes.indexOf(0) || 128));\r\n const schemaName = decoder.decode(schemaNameBytes.slice(0, schemaNameBytes.indexOf(0) || 64));\r\n const fieldCount = view.getUint32(192, true);\r\n\r\n const fields = [];\r\n let offset = 196;\r\n\r\n for (let i = 0; i < fieldCount; i++) {\r\n if (offset + 88 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const fieldType = view.getUint32(offset + 64, true);\r\n const previewFlags = view.getUint32(offset + 68, true);\r\n const defaultValue: [number, number, number, number] = [\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true),\r\n view.getFloat32(offset + 80, true),\r\n view.getFloat32(offset + 84, true)\r\n ];\r\n\r\n const typeNames = ['Texture', 'Color', 'Float', 'Vec2', 'Vec3', 'Vec4', 'Int'] as const;\r\n const previewFlagNames = ['None', 'MainTex', 'Tint'] as const;\r\n\r\n fields.push({\r\n name: fieldName,\r\n type: typeNames[fieldType] || 'Float',\r\n previewFlag: previewFlagNames[previewFlags] || 'None',\r\n defaultValue\r\n });\r\n\r\n offset += 88;\r\n }\r\n\r\n return { stringId, schemaName, fields };\r\n } catch (error) {\r\n console.error('Failed to read material schema:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load material schema information by path\r\n * @param assetPath - Path to the material schema asset\r\n */\r\n loadMaterialSchema(assetPath: string): {\r\n stringId: string;\r\n schemaName: string;\r\n fields: Array<{\r\n name: string;\r\n type: 'Texture' | 'Color' | 'Float' | 'Vec2' | 'Vec3' | 'Vec4' | 'Int';\r\n previewFlag: 'None' | 'MainTex' | 'Tint';\r\n defaultValue: [number, number, number, number];\r\n }>;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 196) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse MaterialSchemaMetadata: string_id[128] + schema_name[64] + field_count(4) = 196 bytes\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const schemaNameBytes = metadata.slice(128, 192);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdBytes.indexOf(0) || 128));\r\n const schemaName = decoder.decode(schemaNameBytes.slice(0, schemaNameBytes.indexOf(0) || 64));\r\n const fieldCount = view.getUint32(192, true);\r\n\r\n const fields = [];\r\n let offset = 196;\r\n\r\n // Parse fields: name[64] + field_type(4) + preview_flags(4) + default_value[4*4=16] = 88 bytes\r\n for (let i = 0; i < fieldCount; i++) {\r\n if (offset + 88 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const fieldType = view.getUint32(offset + 64, true);\r\n const previewFlags = view.getUint32(offset + 68, true);\r\n const defaultValue: [number, number, number, number] = [\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true),\r\n view.getFloat32(offset + 80, true),\r\n view.getFloat32(offset + 84, true)\r\n ];\r\n\r\n const typeNames = ['Texture', 'Color', 'Float', 'Vec2', 'Vec3', 'Vec4', 'Int'] as const;\r\n const previewFlagNames = ['None', 'MainTex', 'Tint'] as const;\r\n\r\n fields.push({\r\n name: fieldName,\r\n type: typeNames[fieldType] || 'Float',\r\n previewFlag: previewFlagNames[previewFlags] || 'None',\r\n defaultValue\r\n });\r\n\r\n offset += 88; // MaterialSchemaField is 88 bytes total\r\n }\r\n\r\n return { stringId, schemaName, fields };\r\n } catch (error) {\r\n console.error('Failed to read material schema:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get material information from a loaded mesh\r\n * Returns material data including properties and texture references\r\n */\r\n getMeshMaterials(assetPath: string): Array<{\r\n name: string;\r\n schemaId: string;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }> | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 140) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse MeshMetadata\r\n const meshGeometryCount = view.getUint32(0, true);\r\n const materialCount = view.getUint32(4, true);\r\n const nodeCount = view.getUint32(8, true);\r\n\r\n let offset = 140;\r\n\r\n // Skip geometries (40 bytes each - Draco compressed)\r\n offset += meshGeometryCount * 40;\r\n\r\n // Parse materials\r\n const materials: Array<{\r\n name: string;\r\n schemaId: string;\r\n propertyCount: number;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }> = [];\r\n \r\n for (let i = 0; i < materialCount; i++) {\r\n if (offset + 196 > metadata.length) break;\r\n\r\n const nameBytes = metadata.slice(offset, offset + 64);\r\n const schemaIdBytes = metadata.slice(offset + 64, offset + 192);\r\n const name = decoder.decode(nameBytes.slice(0, nameBytes.indexOf(0) || 64));\r\n const schemaId = decoder.decode(schemaIdBytes.slice(0, schemaIdBytes.indexOf(0) || 128));\r\n const propertyCount = view.getUint32(offset + 192, true);\r\n\r\n materials.push({ name, schemaId, propertyCount, properties: [] });\r\n offset += 196;\r\n }\r\n\r\n // Skip nodes (116 bytes each)\r\n offset += nodeCount * 116;\r\n\r\n // Skip mesh indices (4 bytes each)\r\n const totalMeshRefs = materials.reduce((sum: number, mat: any) => {\r\n // This is a simplification - we'd need to parse nodes to get exact count\r\n return sum;\r\n }, 0);\r\n // For now, skip based on nodeCount assumption\r\n offset += nodeCount * 4;\r\n\r\n // Parse material properties\r\n for (const mat of materials) {\r\n for (let j = 0; j < (mat as any).propertyCount; j++) {\r\n if (offset + 144 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const value: [number, number, number, number] = [\r\n view.getFloat32(offset + 64, true),\r\n view.getFloat32(offset + 68, true),\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true)\r\n ];\r\n const textureIdBytes = metadata.slice(offset + 80, offset + 144);\r\n const textureId = decoder.decode(textureIdBytes.slice(0, textureIdBytes.indexOf(0) || 64));\r\n\r\n mat.properties.push({ fieldName, value, textureId });\r\n offset += 144;\r\n }\r\n }\r\n\r\n return materials;\r\n } catch (error) {\r\n console.error('Failed to read mesh materials:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Open a .stow file from a File or ArrayBuffer\r\n */\r\n async open(fileOrBuffer: ArrayBuffer | File): Promise<boolean> {\r\n // Initialize reader if needed\r\n if (this.ownedReader) {\r\n await this.reader.init();\r\n }\r\n return await this.reader.open(fileOrBuffer);\r\n }\r\n\r\n /**\r\n * Get the total number of assets\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get info about a specific asset\r\n */\r\n getAssetInfo(index: number): any {\r\n return this.reader.getAssetInfo(index);\r\n }\r\n\r\n /**\r\n * Read asset data by index\r\n */\r\n readAssetData(index: number): Uint8Array | null {\r\n return this.reader.readAssetData(index);\r\n }\r\n\r\n /**\r\n * Read asset metadata by index\r\n */\r\n readAssetMetadata(index: number): Uint8Array | null {\r\n return this.reader.readAssetMetadata(index);\r\n }\r\n\r\n /**\r\n * Parse texture metadata\r\n */\r\n parseTextureMetadata(metadataBytes: Uint8Array): any {\r\n return this.reader.parseTextureMetadata(metadataBytes);\r\n }\r\n\r\n /**\r\n * Create an HTML audio element for preview\r\n * @param index - Asset index\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for index ${index}`);\r\n }\r\n\r\n // Create blob URL for HTML5 audio\r\n const blob = new Blob([data as any], { type: 'audio/ogg' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n // Create and configure audio element\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n // Clean up URL when audio ends or on error\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n /**\r\n * List all assets in the opened pack\r\n */\r\n listAssets(): Array<{\r\n index: number;\r\n name?: string;\r\n type: number;\r\n dataSize: number;\r\n metadataSize: number;\r\n }> {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Dispose of resources\r\n */\r\n dispose(): void {\r\n this.ktx2Loader.dispose();\r\n this.dracoLoader.dispose();\r\n if (this.ownedReader) {\r\n this.reader.close();\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -414,8 +414,8 @@ class StowKitLoader extends THREE__namespace.Loader {
414
414
  this.reader = new reader.StowKitReader(wasmPath);
415
415
  this.ownedReader = true;
416
416
  }
417
- // Setup KTX2 loader for textures with default path (user must provide basis files)
418
- const transcoderPath = parameters?.transcoderPath || '/basis/'; // Users still need to provide this
417
+ // Setup KTX2 loader for textures with default path (bundled with package)
418
+ const transcoderPath = parameters?.transcoderPath || '/stowkit/basis/'; // Auto-copied on install
419
419
  this.ktx2Loader = new KTX2Loader_js.KTX2Loader(manager);
420
420
  this.ktx2Loader.setTranscoderPath(transcoderPath);
421
421
  // Setup Draco loader for mesh decompression
@@ -1 +1 @@
1
- {"version":3,"file":"stowkit-three-loader.js","sources":["../src/MeshParser.ts","../src/StowKitLoader.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\n\nexport interface MeshGeometryInfo {\n vertexCount: number;\n indexCount: number;\n hasNormals: number;\n hasUVs: number;\n compressedBufferOffset: number;\n compressedBufferSize: number;\n materialIndex: number;\n padding: number;\n}\n\nexport interface Node {\n name: string;\n parentIndex: number;\n position: [number, number, number];\n rotation: [number, number, number, number]; // Quaternion\n scale: [number, number, number];\n meshCount: number;\n firstMeshIndex: number;\n}\n\nexport interface MaterialPropertyValue {\n fieldName: string;\n value: [number, number, number, number]; // Vec4 for colors, floats, etc.\n textureId: string; // For texture references\n}\n\nexport interface MaterialData {\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: MaterialPropertyValue[];\n}\n\nexport interface MeshMetadata {\n meshGeometryCount: number;\n materialCount: number;\n nodeCount: number;\n stringId: string;\n}\n\nexport class MeshParser {\n \n /**\n * Parse mesh metadata from binary data\n */\n static parseMeshMetadata(data: Uint8Array): MeshMetadata {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n \n // MeshMetadata structure (140 bytes total when packed)\n const metadata: MeshMetadata = {\n meshGeometryCount: view.getUint32(0, true),\n materialCount: view.getUint32(4, true),\n nodeCount: view.getUint32(8, true),\n stringId: this.readString(data.slice(12, 140)) // 128 bytes for string\n };\n \n return metadata;\n }\n \n /**\n * Parse complete mesh data including geometry, materials, and nodes\n */\n static parseMeshData(metadataBlob: Uint8Array, dataBlob: Uint8Array): {\n metadata: MeshMetadata;\n geometries: MeshGeometryInfo[];\n materials: THREE.Material[];\n materialData: MaterialData[];\n nodes: Node[];\n meshIndices: Uint32Array;\n } {\n // Ensure we have at least the minimum metadata size\n if (metadataBlob.length < 140) {\n throw new Error(`Metadata blob too small: ${metadataBlob.length} bytes (expected at least 140)`);\n }\n \n console.log(`Parsing mesh metadata: ${metadataBlob.length} bytes metadata, ${dataBlob.length} bytes data`);\n const metadata = this.parseMeshMetadata(metadataBlob);\n console.log(`Mesh counts: ${metadata.meshGeometryCount} geometries, ${metadata.materialCount} materials, ${metadata.nodeCount} nodes`);\n \n // Check if the metadata blob contains just the header or all the mesh info\n const expectedMetadataSize = 140 + \n (metadata.meshGeometryCount * 40) + // Draco compressed (40 bytes each)\n (metadata.materialCount * 196) + // MaterialData header\n (metadata.nodeCount * 116);\n \n let hasExtendedMetadata = metadataBlob.length >= expectedMetadataSize;\n console.log(`Expected metadata size: ${expectedMetadataSize}, actual: ${metadataBlob.length}, has extended: ${hasExtendedMetadata}`);\n \n // If metadata only has the header, the mesh info might be at the start of the data blob\n const sourceBlob = hasExtendedMetadata ? metadataBlob : dataBlob;\n const metaView = new DataView(sourceBlob.buffer, sourceBlob.byteOffset, sourceBlob.byteLength);\n \n let offset = hasExtendedMetadata ? 140 : 0; // Start after MeshMetadata if in metadata blob, or at beginning of data blob\n \n // Parse geometry infos (now Draco compressed!)\n const geometries: MeshGeometryInfo[] = [];\n for (let i = 0; i < metadata.meshGeometryCount; i++) {\n if (offset + 40 > sourceBlob.length) {\n console.warn(`Data truncated at geometry ${i}/${metadata.meshGeometryCount}`);\n break;\n }\n const geo: MeshGeometryInfo = {\n vertexCount: metaView.getUint32(offset, true),\n indexCount: metaView.getUint32(offset + 4, true),\n hasNormals: metaView.getUint32(offset + 8, true),\n hasUVs: metaView.getUint32(offset + 12, true),\n compressedBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n compressedBufferSize: Number(metaView.getBigUint64(offset + 24, true)),\n materialIndex: metaView.getUint32(offset + 32, true),\n padding: metaView.getUint32(offset + 36, true)\n };\n geometries.push(geo);\n offset += 40; // Size of MeshGeometryInfo (Draco compressed)\n }\n \n // Parse materials - MaterialData structure: name[64] + schema_id[128] + property_count(4) = 196 bytes\n const materialData: MaterialData[] = [];\n const materials: THREE.Material[] = [];\n \n // First pass: read all MaterialData headers (without properties)\n const materialOffsets: number[] = [];\n for (let i = 0; i < metadata.materialCount; i++) {\n if (offset + 196 > sourceBlob.length) {\n console.warn(`Data truncated at material ${i}/${metadata.materialCount}`);\n break;\n }\n \n materialOffsets.push(offset);\n \n const name = this.readString(sourceBlob.slice(offset, offset + 64));\n const schemaId = this.readString(sourceBlob.slice(offset + 64, offset + 192));\n const propertyCount = metaView.getUint32(offset + 192, true);\n \n materialData.push({\n name,\n schemaId,\n propertyCount,\n properties: []\n });\n \n offset += 196; // Size of MaterialData header\n }\n \n // Parse nodes first (they come before material properties in the blob)\n const nodes: Node[] = [];\n console.log(`\\n=== Nodes from StowKit file (${metadata.nodeCount} total) ===`);\n for (let i = 0; i < metadata.nodeCount; i++) {\n if (offset + 116 > sourceBlob.length) {\n console.warn(`Data truncated at node ${i}/${metadata.nodeCount}`);\n break;\n }\n const node: Node = {\n name: this.readString(sourceBlob.slice(offset, offset + 64)),\n parentIndex: metaView.getInt32(offset + 64, true),\n position: [\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ],\n rotation: [\n metaView.getFloat32(offset + 80, true),\n metaView.getFloat32(offset + 84, true),\n metaView.getFloat32(offset + 88, true),\n metaView.getFloat32(offset + 92, true)\n ],\n scale: [\n metaView.getFloat32(offset + 96, true),\n metaView.getFloat32(offset + 100, true),\n metaView.getFloat32(offset + 104, true)\n ],\n meshCount: metaView.getUint32(offset + 108, true),\n firstMeshIndex: metaView.getUint32(offset + 112, true)\n };\n console.log(`Node ${i}: \"${node.name}\" (parent=${node.parentIndex}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex})`);\n nodes.push(node);\n offset += 116; // Size of Node struct\n }\n console.log(`=== End of nodes from file ===\\n`);\n \n // Parse mesh indices\n const totalMeshRefs = nodes.reduce((sum, node) => sum + node.meshCount, 0);\n console.log(`Parsing ${totalMeshRefs} mesh indices at offset ${offset}`);\n const meshIndices = new Uint32Array(totalMeshRefs);\n for (let i = 0; i < totalMeshRefs; i++) {\n if (offset + (i + 1) * 4 > sourceBlob.length) {\n console.warn(`Data truncated at mesh index ${i}/${totalMeshRefs}`);\n break;\n }\n meshIndices[i] = metaView.getUint32(offset + i * 4, true);\n console.log(` meshIndices[${i}] = ${meshIndices[i]}`);\n }\n offset += totalMeshRefs * 4;\n console.log(`After mesh indices, offset = ${offset}`);\n \n // Second pass: read material properties\n // MaterialPropertyValue: field_name[64] + value[4*4=16] + texture_id[64] = 144 bytes\n for (let i = 0; i < materialData.length; i++) {\n const matData = materialData[i];\n console.log(`Material \"${matData.name}\": schema=\"${matData.schemaId}\", ${matData.propertyCount} properties`);\n \n for (let j = 0; j < matData.propertyCount; j++) {\n if (offset + 144 > sourceBlob.length) {\n console.warn(`Data truncated at property ${j}/${matData.propertyCount} of material ${i}`);\n break;\n }\n \n const fieldName = this.readString(sourceBlob.slice(offset, offset + 64));\n const value: [number, number, number, number] = [\n metaView.getFloat32(offset + 64, true),\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ];\n const textureId = this.readString(sourceBlob.slice(offset + 80, offset + 144));\n \n matData.properties.push({\n fieldName,\n value,\n textureId\n });\n \n console.log(` Property \"${fieldName}\": value=[${value.join(', ')}], textureId=\"${textureId}\"`);\n \n offset += 144; // Size of MaterialPropertyValue\n }\n \n // Create Three.js material based on properties\n const mat = new THREE.MeshStandardMaterial({\n name: matData.name,\n side: THREE.DoubleSide,\n // Start with default gray color\n color: new THREE.Color(0.8, 0.8, 0.8)\n });\n \n console.log(`Creating material ${i}: \"${matData.name}\", ${matData.propertyCount} properties`);\n \n // Apply properties\n for (const prop of matData.properties) {\n if (prop.fieldName.toLowerCase() === 'tint' || prop.fieldName.toLowerCase().includes('color')) {\n // Apply color/tint\n mat.color = new THREE.Color(prop.value[0], prop.value[1], prop.value[2]);\n console.log(` Applied tint color: rgb(${prop.value[0]}, ${prop.value[1]}, ${prop.value[2]})`);\n }\n }\n \n console.log(` Material ${i} final color: rgb(${mat.color.r}, ${mat.color.g}, ${mat.color.b})`);\n materials.push(mat);\n }\n \n // Default material if none exist\n if (materials.length === 0) {\n materials.push(new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8), // Light gray\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n }));\n }\n \n return { metadata, geometries, materials, materialData, nodes, meshIndices };\n }\n \n /**\n * Create Three.js BufferGeometry from Draco compressed mesh data\n */\n static async createGeometry(geoInfo: MeshGeometryInfo, dataBlob: Uint8Array, dracoLoader: DRACOLoader): Promise<THREE.BufferGeometry> {\n console.log('Decoding Draco geometry:', {\n vertexCount: geoInfo.vertexCount,\n indexCount: geoInfo.indexCount,\n hasNormals: geoInfo.hasNormals,\n hasUVs: geoInfo.hasUVs,\n compressedOffset: geoInfo.compressedBufferOffset,\n compressedSize: geoInfo.compressedBufferSize\n });\n \n // Extract the Draco compressed buffer\n if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {\n throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);\n }\n \n const compressedData = dataBlob.slice(\n geoInfo.compressedBufferOffset,\n geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize\n );\n \n // Decode using Draco\n // Create a blob URL for the Draco data (DRACOLoader expects a URL)\n const arrayBuffer = compressedData.buffer.slice(compressedData.byteOffset, compressedData.byteOffset + compressedData.byteLength);\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const geometry = await new Promise<THREE.BufferGeometry>((resolve, reject) => {\n dracoLoader.load(\n url,\n (decoded: THREE.BufferGeometry) => {\n URL.revokeObjectURL(url);\n console.log('Draco decoded successfully:', decoded);\n \n // UVs are pre-flipped in the packer now, no need to flip here\n resolve(decoded);\n },\n undefined,\n (error: any) => {\n URL.revokeObjectURL(url);\n console.error('Draco decode failed:', error);\n reject(new Error(`Failed to decode Draco geometry: ${error}`));\n }\n );\n });\n \n // Compute bounding volumes\n geometry.computeBoundingSphere();\n geometry.computeBoundingBox();\n \n console.log('Final geometry:', {\n hasPositions: !!geometry.attributes.position,\n hasNormals: !!geometry.attributes.normal,\n hasUVs: !!geometry.attributes.uv,\n hasIndices: !!geometry.index,\n vertexCount: geometry.attributes.position?.count || 0\n });\n \n return geometry;\n }\n \n /**\n * Build Three.js scene from parsed mesh data\n */\n static async buildScene(parsedData: ReturnType<typeof MeshParser.parseMeshData>, dataBlob: Uint8Array, dracoLoader: DRACOLoader): Promise<THREE.Group> {\n const root = new THREE.Group();\n root.name = 'StowKitMesh';\n \n const { geometries, materials, nodes, meshIndices } = parsedData;\n console.log('Building scene with:', {\n geometries: geometries.length,\n materials: materials.length,\n nodes: nodes.length,\n meshIndices: meshIndices.length\n });\n \n // Create all Three.js objects for nodes\n const nodeObjects: THREE.Object3D[] = [];\n \n for (const node of nodes) {\n const obj = new THREE.Group();\n obj.name = node.name;\n \n console.log(`Node ${node.name}: position=${node.position}, rotation=${node.rotation}, scale=${node.scale}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex}`);\n \n // Apply transform\n obj.position.set(...node.position);\n obj.quaternion.set(...node.rotation);\n obj.scale.set(...node.scale);\n \n // Add meshes to this node\n for (let i = 0; i < node.meshCount; i++) {\n const meshIndexArrayPos = node.firstMeshIndex + i;\n const meshIndex = meshIndices[meshIndexArrayPos];\n console.log(` meshIndices[${meshIndexArrayPos}] = ${meshIndex} (adding to node ${node.name})`);\n if (meshIndex < geometries.length) {\n const geoInfo = geometries[meshIndex];\n console.log(` Creating geometry from geoInfo: vertices=${geoInfo.vertexCount}, indices=${geoInfo.indexCount}, material=${geoInfo.materialIndex}`);\n const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n console.warn(` Material index ${geoInfo.materialIndex} out of bounds, using default`);\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n obj.add(mesh);\n console.log(` ✓ Added mesh to node ${node.name} (${geometry.attributes.position?.count || 0} vertices, material: ${material.name || 'default'})`);\n } else {\n console.error(` ✗ Mesh index ${meshIndex} out of bounds (have ${geometries.length} geometries)`);\n }\n }\n \n console.log(` Node ${node.name} now has ${obj.children.length} children`);\n nodeObjects.push(obj);\n }\n \n // Build hierarchy\n console.log('Building node hierarchy...');\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const obj = nodeObjects[i];\n \n if (node.parentIndex >= 0 && node.parentIndex < nodeObjects.length) {\n console.log(` Adding node \"${node.name}\" (index ${i}) as child of node \"${nodes[node.parentIndex].name}\" (index ${node.parentIndex})`);\n nodeObjects[node.parentIndex].add(obj);\n } else {\n console.log(` Adding node \"${node.name}\" (index ${i}) as direct child of root (parentIndex=${node.parentIndex})`);\n root.add(obj);\n }\n }\n \n // If no nodes, create a single mesh from all geometries\n if (nodes.length === 0 && geometries.length > 0) {\n console.log('No nodes found, creating meshes directly from geometries');\n for (let index = 0; index < geometries.length; index++) {\n const geoInfo = geometries[index];\n console.log(`Creating direct mesh ${index}: materialIndex=${geoInfo.materialIndex}, vertices=${geoInfo.vertexCount}`);\n const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n console.warn(` Material index ${geoInfo.materialIndex} out of bounds, using default`);\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = `Mesh_${index}`;\n root.add(mesh);\n console.log(`Added mesh ${index} to root`);\n }\n }\n \n console.log(`Final scene has ${root.children.length} direct children`);\n \n // Debug: traverse and count all meshes, showing full hierarchy\n let totalMeshCount = 0;\n let hierarchyLog = 'Scene hierarchy:\\n';\n root.traverse((obj) => {\n // Calculate depth by counting parents\n let depth = 0;\n let parent = obj.parent;\n while (parent && parent !== root) {\n depth++;\n parent = parent.parent;\n }\n const indent = ' '.repeat(depth);\n \n if (obj instanceof THREE.Mesh) {\n totalMeshCount++;\n const mat = obj.material as THREE.MeshStandardMaterial;\n hierarchyLog += `${indent}[Mesh] vertices=${obj.geometry.attributes.position?.count || 0}, material=${mat.name}, hasTexture=${!!mat.map}\\n`;\n } else if (obj instanceof THREE.Group && obj !== root) {\n hierarchyLog += `${indent}[Group] ${obj.name} (${obj.children.length} children)\\n`;\n }\n });\n console.log(hierarchyLog);\n console.log(`Total meshes in scene: ${totalMeshCount}`);\n \n return root;\n }\n \n /**\n * Read null-terminated string from buffer\n */\n private static readString(buffer: Uint8Array): string {\n let end = buffer.indexOf(0);\n if (end === -1) end = buffer.length;\n return new TextDecoder().decode(buffer.slice(0, end));\n }\n}\n","import * as THREE from 'three';\r\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\r\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\r\nimport { StowKitReader } from '@stowkit/reader';\r\nimport { MeshParser } from './MeshParser';\r\n\r\nexport interface StowKitLoaderParameters {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/basis/'\r\n */\r\n transcoderPath?: string;\r\n \r\n /**\r\n * Path to WASM reader module\r\n * @default '/stowkit_reader.wasm'\r\n */\r\n wasmPath?: string;\r\n \r\n /**\r\n * Custom StowKitReader instance (optional)\r\n */\r\n reader?: StowKitReader;\r\n}\r\n\r\n/**\r\n * Three.js loader for StowKit asset packs (.stow files)\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const loader = new StowKitLoader();\r\n * loader.setTranscoderPath('/basis/');\r\n * \r\n * // Load a mesh asset\r\n * loader.loadMesh('assets.stow', 'path/to/mesh', (scene) => {\r\n * threeScene.add(scene);\r\n * });\r\n * ```\r\n */\r\nexport class StowKitLoader extends THREE.Loader {\r\n private reader: StowKitReader;\r\n private ktx2Loader: KTX2Loader;\r\n private dracoLoader: DRACOLoader;\r\n private ownedReader: boolean = false;\r\n\r\n constructor(manager?: THREE.LoadingManager, parameters?: StowKitLoaderParameters) {\r\n super(manager);\r\n \r\n // Use provided reader or create new one\r\n if (parameters?.reader) {\r\n this.reader = parameters.reader;\r\n this.ownedReader = false;\r\n } else {\r\n const wasmPath = parameters?.wasmPath || '/stowkit_reader.wasm';\r\n this.reader = new StowKitReader(wasmPath);\r\n this.ownedReader = true;\r\n }\r\n \r\n // Setup KTX2 loader for textures with default path (user must provide basis files)\r\n const transcoderPath = parameters?.transcoderPath || '/basis/'; // Users still need to provide this\r\n this.ktx2Loader = new KTX2Loader(manager);\r\n this.ktx2Loader.setTranscoderPath(transcoderPath);\r\n \r\n // Setup Draco loader for mesh decompression\r\n this.dracoLoader = new DRACOLoader(manager);\r\n this.dracoLoader.setDecoderPath('/stowkit/draco/'); // Draco files copied by postinstall\r\n \r\n // Detect support with a temporary renderer\r\n // This is required for KTX2Loader to work\r\n const tempRenderer = new THREE.WebGLRenderer();\r\n this.ktx2Loader.detectSupport(tempRenderer);\r\n tempRenderer.dispose();\r\n }\r\n \r\n /**\r\n * Set the path to the Draco decoder\r\n */\r\n setDracoDecoderPath(path: string): this {\r\n this.dracoLoader.setDecoderPath(path);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the path to the Basis Universal transcoder\r\n */\r\n setTranscoderPath(path: string): this {\r\n this.ktx2Loader.setTranscoderPath(path);\r\n return this;\r\n }\r\n\r\n /**\r\n * Detect WebGL support for compressed textures\r\n */\r\n detectSupport(renderer: THREE.WebGLRenderer): this {\r\n this.ktx2Loader.detectSupport(renderer);\r\n return this;\r\n }\r\n\r\n /**\r\n * Open a .stow pack file (call this first if loading multiple assets)\r\n * @param url - URL to the .stow file\r\n */\r\n async openPack(url: string): Promise<void> {\r\n if (this.ownedReader) {\r\n await this.reader.init();\r\n }\r\n\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n await this.reader.open(arrayBuffer);\r\n }\r\n\r\n /**\r\n * Load and parse a mesh asset by its index\r\n * @param index - Asset index\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadMeshByIndex(\r\n index: number,\r\n onLoad?: (scene: THREE.Group) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Group> {\r\n try {\r\n // Read mesh data and metadata\r\n const data = this.reader.readAssetData(index);\r\n const metadata = this.reader.readAssetMetadata(index);\r\n\r\n if (!data) {\r\n throw new Error(`Failed to read mesh data for index ${index}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available for index ${index}`);\r\n }\r\n\r\n // Parse mesh data\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n\r\n // Load textures for materials\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n\r\n // Build Three.js scene with Draco decoder\r\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n\r\n if (onLoad) {\r\n onLoad(scene);\r\n }\r\n\r\n return scene;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load and parse a mesh asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the mesh asset within the pack\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadMesh(\r\n url: string,\r\n assetPath: string,\r\n onLoad?: (scene: THREE.Group) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Group> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the mesh asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n // Read mesh data and metadata\r\n const data = this.reader.readAssetData(assetIndex);\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n\r\n if (!data) {\r\n throw new Error(`Failed to read mesh data for ${assetPath}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available for ${assetPath}`);\r\n }\r\n\r\n // Parse mesh data\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n\r\n // Load textures for materials\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n\r\n // Build Three.js scene with Draco decoder\r\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n\r\n if (onLoad) {\r\n onLoad(scene);\r\n }\r\n\r\n return scene;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load textures for materials\r\n */\r\n private async loadMaterialTextures(\r\n materialData: Array<{\r\n name: string;\r\n schemaId: string;\r\n propertyCount: number;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }>,\r\n materials: THREE.Material[]\r\n ): Promise<void> {\r\n for (let i = 0; i < materialData.length; i++) {\r\n const matData = materialData[i];\r\n const material = materials[i] as THREE.MeshStandardMaterial;\r\n\r\n for (const prop of matData.properties) {\r\n if (prop.textureId && prop.textureId.length > 0) {\r\n try {\r\n // Find texture asset\r\n const textureIndex = this.reader.findAssetByPath(prop.textureId);\r\n if (textureIndex < 0) {\r\n console.warn(`Texture not found: ${prop.textureId}`);\r\n continue;\r\n }\r\n\r\n // Read texture data\r\n const textureData = this.reader.readAssetData(textureIndex);\r\n if (!textureData) {\r\n console.warn(`Failed to read texture: ${prop.textureId}`);\r\n continue;\r\n }\r\n\r\n // Load as KTX2\r\n const texture = await this.loadKTX2Texture(textureData);\r\n\r\n // Apply to material based on property name\r\n this.applyTextureToMaterial(material, prop.fieldName, texture);\r\n\r\n } catch (error) {\r\n console.error(`Failed to load texture \"${prop.textureId}\":`, error);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load a KTX2 texture from binary data\r\n */\r\n private async loadKTX2Texture(data: Uint8Array): Promise<THREE.CompressedTexture> {\r\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const blob = new Blob([arrayBuffer]);\r\n const url = URL.createObjectURL(blob);\r\n\r\n try {\r\n return await new Promise<THREE.CompressedTexture>((resolve, reject) => {\r\n this.ktx2Loader.load(\r\n url,\r\n (texture) => {\r\n URL.revokeObjectURL(url);\r\n // Compressed textures don't support flipY, we flip UVs in MeshParser instead\r\n texture.needsUpdate = true;\r\n resolve(texture);\r\n },\r\n undefined,\r\n (error) => {\r\n URL.revokeObjectURL(url);\r\n reject(error);\r\n }\r\n );\r\n });\r\n } catch (error) {\r\n URL.revokeObjectURL(url);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Apply texture to appropriate material property\r\n */\r\n private applyTextureToMaterial(\r\n material: THREE.MeshStandardMaterial,\r\n propertyName: string,\r\n texture: THREE.CompressedTexture\r\n ): void {\r\n const propNameLower = propertyName.toLowerCase();\r\n\r\n if (propNameLower === 'maintex' || propNameLower.includes('diffuse') || \r\n propNameLower.includes('albedo') || propNameLower.includes('base')) {\r\n material.map = texture;\r\n } else if (propNameLower.includes('normal')) {\r\n material.normalMap = texture;\r\n } else if (propNameLower.includes('metallic')) {\r\n material.metalnessMap = texture;\r\n } else if (propNameLower.includes('roughness')) {\r\n material.roughnessMap = texture;\r\n } else {\r\n // Default to main texture\r\n material.map = texture;\r\n }\r\n\r\n material.needsUpdate = true;\r\n }\r\n\r\n /**\r\n * Load a texture asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the texture asset within the pack\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadTexture(\r\n url: string,\r\n assetPath: string,\r\n onLoad?: (texture: THREE.CompressedTexture) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.CompressedTexture> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the texture asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n return await this.loadTextureByIndex(assetIndex, onLoad, onProgress, onError);\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load a texture asset by its index in the pack\r\n * @param index - Asset index\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadTextureByIndex(\r\n index: number,\r\n onLoad?: (texture: THREE.CompressedTexture) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.CompressedTexture> {\r\n try {\r\n // Read texture data\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data for index ${index}`);\r\n }\r\n\r\n // Load as KTX2\r\n const texture = await this.loadKTX2Texture(data);\r\n\r\n if (onLoad) {\r\n onLoad(texture);\r\n }\r\n\r\n return texture;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load an audio asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the audio asset within the pack\r\n * @param listener - THREE.AudioListener to attach to\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadAudio(\r\n url: string,\r\n assetPath: string,\r\n listener: THREE.AudioListener,\r\n onLoad?: (audio: THREE.Audio) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Audio> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the audio asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n // Read audio data\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for ${assetPath}`);\r\n }\r\n\r\n // Create audio object\r\n const audio = new THREE.Audio(listener);\r\n\r\n // Decode audio data\r\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const audioContext = listener.context;\r\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\r\n\r\n audio.setBuffer(audioBuffer);\r\n\r\n if (onLoad) {\r\n onLoad(audio);\r\n }\r\n\r\n return audio;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get metadata for an audio asset\r\n * @param assetPath - Path to the audio asset within the pack\r\n */\r\n getAudioMetadata(assetPath: string): {\r\n stringId: string;\r\n sampleRate: number;\r\n channels: number;\r\n durationMs: number;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 140) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse AudioMetadata structure\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const nullIdx = stringIdBytes.indexOf(0);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, nullIdx >= 0 ? nullIdx : 128));\r\n\r\n return {\r\n stringId,\r\n sampleRate: view.getUint32(128, true),\r\n channels: view.getUint32(132, true),\r\n durationMs: view.getUint32(136, true)\r\n };\r\n } catch (error) {\r\n console.error('Failed to read audio metadata:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get metadata for a texture asset\r\n * @param assetPath - Path to the texture asset within the pack\r\n */\r\n getTextureMetadata(assetPath: string): {\r\n width: number;\r\n height: number;\r\n channels: number;\r\n isKtx2: boolean;\r\n channelFormat: number;\r\n stringId: string;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 144) return null; // TextureMetadata is now 144 bytes\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse TextureMetadata structure (width, height, channels, channel_format, string_id[128])\r\n const stringIdBytes = metadata.slice(16, 144); // After 4 uint32s (16 bytes)\r\n const nullIdx = stringIdBytes.indexOf(0);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, nullIdx >= 0 ? nullIdx : 128));\r\n\r\n return {\r\n width: view.getUint32(0, true),\r\n height: view.getUint32(4, true),\r\n channels: view.getUint32(8, true),\r\n isKtx2: true, // All textures are KTX2 now\r\n channelFormat: view.getUint32(12, true),\r\n stringId\r\n };\r\n } catch (error) {\r\n console.error('Failed to read texture metadata:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load material schema information by index\r\n * @param index - Asset index\r\n */\r\n loadMaterialSchemaByIndex(index: number): {\r\n stringId: string;\r\n schemaName: string;\r\n fields: Array<{\r\n name: string;\r\n type: 'Texture' | 'Color' | 'Float' | 'Vec2' | 'Vec3' | 'Vec4' | 'Int';\r\n previewFlag: 'None' | 'MainTex' | 'Tint';\r\n defaultValue: [number, number, number, number];\r\n }>;\r\n } | null {\r\n try {\r\n const metadata = this.reader.readAssetMetadata(index);\r\n if (!metadata || metadata.length < 196) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const schemaNameBytes = metadata.slice(128, 192);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdBytes.indexOf(0) || 128));\r\n const schemaName = decoder.decode(schemaNameBytes.slice(0, schemaNameBytes.indexOf(0) || 64));\r\n const fieldCount = view.getUint32(192, true);\r\n\r\n const fields = [];\r\n let offset = 196;\r\n\r\n for (let i = 0; i < fieldCount; i++) {\r\n if (offset + 88 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const fieldType = view.getUint32(offset + 64, true);\r\n const previewFlags = view.getUint32(offset + 68, true);\r\n const defaultValue: [number, number, number, number] = [\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true),\r\n view.getFloat32(offset + 80, true),\r\n view.getFloat32(offset + 84, true)\r\n ];\r\n\r\n const typeNames = ['Texture', 'Color', 'Float', 'Vec2', 'Vec3', 'Vec4', 'Int'] as const;\r\n const previewFlagNames = ['None', 'MainTex', 'Tint'] as const;\r\n\r\n fields.push({\r\n name: fieldName,\r\n type: typeNames[fieldType] || 'Float',\r\n previewFlag: previewFlagNames[previewFlags] || 'None',\r\n defaultValue\r\n });\r\n\r\n offset += 88;\r\n }\r\n\r\n return { stringId, schemaName, fields };\r\n } catch (error) {\r\n console.error('Failed to read material schema:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load material schema information by path\r\n * @param assetPath - Path to the material schema asset\r\n */\r\n loadMaterialSchema(assetPath: string): {\r\n stringId: string;\r\n schemaName: string;\r\n fields: Array<{\r\n name: string;\r\n type: 'Texture' | 'Color' | 'Float' | 'Vec2' | 'Vec3' | 'Vec4' | 'Int';\r\n previewFlag: 'None' | 'MainTex' | 'Tint';\r\n defaultValue: [number, number, number, number];\r\n }>;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 196) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse MaterialSchemaMetadata: string_id[128] + schema_name[64] + field_count(4) = 196 bytes\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const schemaNameBytes = metadata.slice(128, 192);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdBytes.indexOf(0) || 128));\r\n const schemaName = decoder.decode(schemaNameBytes.slice(0, schemaNameBytes.indexOf(0) || 64));\r\n const fieldCount = view.getUint32(192, true);\r\n\r\n const fields = [];\r\n let offset = 196;\r\n\r\n // Parse fields: name[64] + field_type(4) + preview_flags(4) + default_value[4*4=16] = 88 bytes\r\n for (let i = 0; i < fieldCount; i++) {\r\n if (offset + 88 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const fieldType = view.getUint32(offset + 64, true);\r\n const previewFlags = view.getUint32(offset + 68, true);\r\n const defaultValue: [number, number, number, number] = [\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true),\r\n view.getFloat32(offset + 80, true),\r\n view.getFloat32(offset + 84, true)\r\n ];\r\n\r\n const typeNames = ['Texture', 'Color', 'Float', 'Vec2', 'Vec3', 'Vec4', 'Int'] as const;\r\n const previewFlagNames = ['None', 'MainTex', 'Tint'] as const;\r\n\r\n fields.push({\r\n name: fieldName,\r\n type: typeNames[fieldType] || 'Float',\r\n previewFlag: previewFlagNames[previewFlags] || 'None',\r\n defaultValue\r\n });\r\n\r\n offset += 88; // MaterialSchemaField is 88 bytes total\r\n }\r\n\r\n return { stringId, schemaName, fields };\r\n } catch (error) {\r\n console.error('Failed to read material schema:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get material information from a loaded mesh\r\n * Returns material data including properties and texture references\r\n */\r\n getMeshMaterials(assetPath: string): Array<{\r\n name: string;\r\n schemaId: string;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }> | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 140) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse MeshMetadata\r\n const meshGeometryCount = view.getUint32(0, true);\r\n const materialCount = view.getUint32(4, true);\r\n const nodeCount = view.getUint32(8, true);\r\n\r\n let offset = 140;\r\n\r\n // Skip geometries (40 bytes each - Draco compressed)\r\n offset += meshGeometryCount * 40;\r\n\r\n // Parse materials\r\n const materials: Array<{\r\n name: string;\r\n schemaId: string;\r\n propertyCount: number;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }> = [];\r\n \r\n for (let i = 0; i < materialCount; i++) {\r\n if (offset + 196 > metadata.length) break;\r\n\r\n const nameBytes = metadata.slice(offset, offset + 64);\r\n const schemaIdBytes = metadata.slice(offset + 64, offset + 192);\r\n const name = decoder.decode(nameBytes.slice(0, nameBytes.indexOf(0) || 64));\r\n const schemaId = decoder.decode(schemaIdBytes.slice(0, schemaIdBytes.indexOf(0) || 128));\r\n const propertyCount = view.getUint32(offset + 192, true);\r\n\r\n materials.push({ name, schemaId, propertyCount, properties: [] });\r\n offset += 196;\r\n }\r\n\r\n // Skip nodes (116 bytes each)\r\n offset += nodeCount * 116;\r\n\r\n // Skip mesh indices (4 bytes each)\r\n const totalMeshRefs = materials.reduce((sum: number, mat: any) => {\r\n // This is a simplification - we'd need to parse nodes to get exact count\r\n return sum;\r\n }, 0);\r\n // For now, skip based on nodeCount assumption\r\n offset += nodeCount * 4;\r\n\r\n // Parse material properties\r\n for (const mat of materials) {\r\n for (let j = 0; j < (mat as any).propertyCount; j++) {\r\n if (offset + 144 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const value: [number, number, number, number] = [\r\n view.getFloat32(offset + 64, true),\r\n view.getFloat32(offset + 68, true),\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true)\r\n ];\r\n const textureIdBytes = metadata.slice(offset + 80, offset + 144);\r\n const textureId = decoder.decode(textureIdBytes.slice(0, textureIdBytes.indexOf(0) || 64));\r\n\r\n mat.properties.push({ fieldName, value, textureId });\r\n offset += 144;\r\n }\r\n }\r\n\r\n return materials;\r\n } catch (error) {\r\n console.error('Failed to read mesh materials:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Open a .stow file from a File or ArrayBuffer\r\n */\r\n async open(fileOrBuffer: ArrayBuffer | File): Promise<boolean> {\r\n // Initialize reader if needed\r\n if (this.ownedReader) {\r\n await this.reader.init();\r\n }\r\n return await this.reader.open(fileOrBuffer);\r\n }\r\n\r\n /**\r\n * Get the total number of assets\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get info about a specific asset\r\n */\r\n getAssetInfo(index: number): any {\r\n return this.reader.getAssetInfo(index);\r\n }\r\n\r\n /**\r\n * Read asset data by index\r\n */\r\n readAssetData(index: number): Uint8Array | null {\r\n return this.reader.readAssetData(index);\r\n }\r\n\r\n /**\r\n * Read asset metadata by index\r\n */\r\n readAssetMetadata(index: number): Uint8Array | null {\r\n return this.reader.readAssetMetadata(index);\r\n }\r\n\r\n /**\r\n * Parse texture metadata\r\n */\r\n parseTextureMetadata(metadataBytes: Uint8Array): any {\r\n return this.reader.parseTextureMetadata(metadataBytes);\r\n }\r\n\r\n /**\r\n * Create an HTML audio element for preview\r\n * @param index - Asset index\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for index ${index}`);\r\n }\r\n\r\n // Create blob URL for HTML5 audio\r\n const blob = new Blob([data as any], { type: 'audio/ogg' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n // Create and configure audio element\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n // Clean up URL when audio ends or on error\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n /**\r\n * List all assets in the opened pack\r\n */\r\n listAssets(): Array<{\r\n index: number;\r\n name?: string;\r\n type: number;\r\n dataSize: number;\r\n metadataSize: number;\r\n }> {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Dispose of resources\r\n */\r\n dispose(): void {\r\n this.ktx2Loader.dispose();\r\n this.dracoLoader.dispose();\r\n if (this.ownedReader) {\r\n this.reader.close();\r\n }\r\n }\r\n}\r\n"],"names":["THREE","StowKitReader","KTX2Loader","DRACOLoader"],"mappings":"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"}
1
+ {"version":3,"file":"stowkit-three-loader.js","sources":["../src/MeshParser.ts","../src/StowKitLoader.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\n\nexport interface MeshGeometryInfo {\n vertexCount: number;\n indexCount: number;\n hasNormals: number;\n hasUVs: number;\n compressedBufferOffset: number;\n compressedBufferSize: number;\n materialIndex: number;\n padding: number;\n}\n\nexport interface Node {\n name: string;\n parentIndex: number;\n position: [number, number, number];\n rotation: [number, number, number, number]; // Quaternion\n scale: [number, number, number];\n meshCount: number;\n firstMeshIndex: number;\n}\n\nexport interface MaterialPropertyValue {\n fieldName: string;\n value: [number, number, number, number]; // Vec4 for colors, floats, etc.\n textureId: string; // For texture references\n}\n\nexport interface MaterialData {\n name: string;\n schemaId: string;\n propertyCount: number;\n properties: MaterialPropertyValue[];\n}\n\nexport interface MeshMetadata {\n meshGeometryCount: number;\n materialCount: number;\n nodeCount: number;\n stringId: string;\n}\n\nexport class MeshParser {\n \n /**\n * Parse mesh metadata from binary data\n */\n static parseMeshMetadata(data: Uint8Array): MeshMetadata {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n \n // MeshMetadata structure (140 bytes total when packed)\n const metadata: MeshMetadata = {\n meshGeometryCount: view.getUint32(0, true),\n materialCount: view.getUint32(4, true),\n nodeCount: view.getUint32(8, true),\n stringId: this.readString(data.slice(12, 140)) // 128 bytes for string\n };\n \n return metadata;\n }\n \n /**\n * Parse complete mesh data including geometry, materials, and nodes\n */\n static parseMeshData(metadataBlob: Uint8Array, dataBlob: Uint8Array): {\n metadata: MeshMetadata;\n geometries: MeshGeometryInfo[];\n materials: THREE.Material[];\n materialData: MaterialData[];\n nodes: Node[];\n meshIndices: Uint32Array;\n } {\n // Ensure we have at least the minimum metadata size\n if (metadataBlob.length < 140) {\n throw new Error(`Metadata blob too small: ${metadataBlob.length} bytes (expected at least 140)`);\n }\n \n console.log(`Parsing mesh metadata: ${metadataBlob.length} bytes metadata, ${dataBlob.length} bytes data`);\n const metadata = this.parseMeshMetadata(metadataBlob);\n console.log(`Mesh counts: ${metadata.meshGeometryCount} geometries, ${metadata.materialCount} materials, ${metadata.nodeCount} nodes`);\n \n // Check if the metadata blob contains just the header or all the mesh info\n const expectedMetadataSize = 140 + \n (metadata.meshGeometryCount * 40) + // Draco compressed (40 bytes each)\n (metadata.materialCount * 196) + // MaterialData header\n (metadata.nodeCount * 116);\n \n let hasExtendedMetadata = metadataBlob.length >= expectedMetadataSize;\n console.log(`Expected metadata size: ${expectedMetadataSize}, actual: ${metadataBlob.length}, has extended: ${hasExtendedMetadata}`);\n \n // If metadata only has the header, the mesh info might be at the start of the data blob\n const sourceBlob = hasExtendedMetadata ? metadataBlob : dataBlob;\n const metaView = new DataView(sourceBlob.buffer, sourceBlob.byteOffset, sourceBlob.byteLength);\n \n let offset = hasExtendedMetadata ? 140 : 0; // Start after MeshMetadata if in metadata blob, or at beginning of data blob\n \n // Parse geometry infos (now Draco compressed!)\n const geometries: MeshGeometryInfo[] = [];\n for (let i = 0; i < metadata.meshGeometryCount; i++) {\n if (offset + 40 > sourceBlob.length) {\n console.warn(`Data truncated at geometry ${i}/${metadata.meshGeometryCount}`);\n break;\n }\n const geo: MeshGeometryInfo = {\n vertexCount: metaView.getUint32(offset, true),\n indexCount: metaView.getUint32(offset + 4, true),\n hasNormals: metaView.getUint32(offset + 8, true),\n hasUVs: metaView.getUint32(offset + 12, true),\n compressedBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n compressedBufferSize: Number(metaView.getBigUint64(offset + 24, true)),\n materialIndex: metaView.getUint32(offset + 32, true),\n padding: metaView.getUint32(offset + 36, true)\n };\n geometries.push(geo);\n offset += 40; // Size of MeshGeometryInfo (Draco compressed)\n }\n \n // Parse materials - MaterialData structure: name[64] + schema_id[128] + property_count(4) = 196 bytes\n const materialData: MaterialData[] = [];\n const materials: THREE.Material[] = [];\n \n // First pass: read all MaterialData headers (without properties)\n const materialOffsets: number[] = [];\n for (let i = 0; i < metadata.materialCount; i++) {\n if (offset + 196 > sourceBlob.length) {\n console.warn(`Data truncated at material ${i}/${metadata.materialCount}`);\n break;\n }\n \n materialOffsets.push(offset);\n \n const name = this.readString(sourceBlob.slice(offset, offset + 64));\n const schemaId = this.readString(sourceBlob.slice(offset + 64, offset + 192));\n const propertyCount = metaView.getUint32(offset + 192, true);\n \n materialData.push({\n name,\n schemaId,\n propertyCount,\n properties: []\n });\n \n offset += 196; // Size of MaterialData header\n }\n \n // Parse nodes first (they come before material properties in the blob)\n const nodes: Node[] = [];\n console.log(`\\n=== Nodes from StowKit file (${metadata.nodeCount} total) ===`);\n for (let i = 0; i < metadata.nodeCount; i++) {\n if (offset + 116 > sourceBlob.length) {\n console.warn(`Data truncated at node ${i}/${metadata.nodeCount}`);\n break;\n }\n const node: Node = {\n name: this.readString(sourceBlob.slice(offset, offset + 64)),\n parentIndex: metaView.getInt32(offset + 64, true),\n position: [\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ],\n rotation: [\n metaView.getFloat32(offset + 80, true),\n metaView.getFloat32(offset + 84, true),\n metaView.getFloat32(offset + 88, true),\n metaView.getFloat32(offset + 92, true)\n ],\n scale: [\n metaView.getFloat32(offset + 96, true),\n metaView.getFloat32(offset + 100, true),\n metaView.getFloat32(offset + 104, true)\n ],\n meshCount: metaView.getUint32(offset + 108, true),\n firstMeshIndex: metaView.getUint32(offset + 112, true)\n };\n console.log(`Node ${i}: \"${node.name}\" (parent=${node.parentIndex}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex})`);\n nodes.push(node);\n offset += 116; // Size of Node struct\n }\n console.log(`=== End of nodes from file ===\\n`);\n \n // Parse mesh indices\n const totalMeshRefs = nodes.reduce((sum, node) => sum + node.meshCount, 0);\n console.log(`Parsing ${totalMeshRefs} mesh indices at offset ${offset}`);\n const meshIndices = new Uint32Array(totalMeshRefs);\n for (let i = 0; i < totalMeshRefs; i++) {\n if (offset + (i + 1) * 4 > sourceBlob.length) {\n console.warn(`Data truncated at mesh index ${i}/${totalMeshRefs}`);\n break;\n }\n meshIndices[i] = metaView.getUint32(offset + i * 4, true);\n console.log(` meshIndices[${i}] = ${meshIndices[i]}`);\n }\n offset += totalMeshRefs * 4;\n console.log(`After mesh indices, offset = ${offset}`);\n \n // Second pass: read material properties\n // MaterialPropertyValue: field_name[64] + value[4*4=16] + texture_id[64] = 144 bytes\n for (let i = 0; i < materialData.length; i++) {\n const matData = materialData[i];\n console.log(`Material \"${matData.name}\": schema=\"${matData.schemaId}\", ${matData.propertyCount} properties`);\n \n for (let j = 0; j < matData.propertyCount; j++) {\n if (offset + 144 > sourceBlob.length) {\n console.warn(`Data truncated at property ${j}/${matData.propertyCount} of material ${i}`);\n break;\n }\n \n const fieldName = this.readString(sourceBlob.slice(offset, offset + 64));\n const value: [number, number, number, number] = [\n metaView.getFloat32(offset + 64, true),\n metaView.getFloat32(offset + 68, true),\n metaView.getFloat32(offset + 72, true),\n metaView.getFloat32(offset + 76, true)\n ];\n const textureId = this.readString(sourceBlob.slice(offset + 80, offset + 144));\n \n matData.properties.push({\n fieldName,\n value,\n textureId\n });\n \n console.log(` Property \"${fieldName}\": value=[${value.join(', ')}], textureId=\"${textureId}\"`);\n \n offset += 144; // Size of MaterialPropertyValue\n }\n \n // Create Three.js material based on properties\n const mat = new THREE.MeshStandardMaterial({\n name: matData.name,\n side: THREE.DoubleSide,\n // Start with default gray color\n color: new THREE.Color(0.8, 0.8, 0.8)\n });\n \n console.log(`Creating material ${i}: \"${matData.name}\", ${matData.propertyCount} properties`);\n \n // Apply properties\n for (const prop of matData.properties) {\n if (prop.fieldName.toLowerCase() === 'tint' || prop.fieldName.toLowerCase().includes('color')) {\n // Apply color/tint\n mat.color = new THREE.Color(prop.value[0], prop.value[1], prop.value[2]);\n console.log(` Applied tint color: rgb(${prop.value[0]}, ${prop.value[1]}, ${prop.value[2]})`);\n }\n }\n \n console.log(` Material ${i} final color: rgb(${mat.color.r}, ${mat.color.g}, ${mat.color.b})`);\n materials.push(mat);\n }\n \n // Default material if none exist\n if (materials.length === 0) {\n materials.push(new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8), // Light gray\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n }));\n }\n \n return { metadata, geometries, materials, materialData, nodes, meshIndices };\n }\n \n /**\n * Create Three.js BufferGeometry from Draco compressed mesh data\n */\n static async createGeometry(geoInfo: MeshGeometryInfo, dataBlob: Uint8Array, dracoLoader: DRACOLoader): Promise<THREE.BufferGeometry> {\n console.log('Decoding Draco geometry:', {\n vertexCount: geoInfo.vertexCount,\n indexCount: geoInfo.indexCount,\n hasNormals: geoInfo.hasNormals,\n hasUVs: geoInfo.hasUVs,\n compressedOffset: geoInfo.compressedBufferOffset,\n compressedSize: geoInfo.compressedBufferSize\n });\n \n // Extract the Draco compressed buffer\n if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {\n throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);\n }\n \n const compressedData = dataBlob.slice(\n geoInfo.compressedBufferOffset,\n geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize\n );\n \n // Decode using Draco\n // Create a blob URL for the Draco data (DRACOLoader expects a URL)\n const arrayBuffer = compressedData.buffer.slice(compressedData.byteOffset, compressedData.byteOffset + compressedData.byteLength);\n const blob = new Blob([arrayBuffer]);\n const url = URL.createObjectURL(blob);\n \n const geometry = await new Promise<THREE.BufferGeometry>((resolve, reject) => {\n dracoLoader.load(\n url,\n (decoded: THREE.BufferGeometry) => {\n URL.revokeObjectURL(url);\n console.log('Draco decoded successfully:', decoded);\n \n // UVs are pre-flipped in the packer now, no need to flip here\n resolve(decoded);\n },\n undefined,\n (error: any) => {\n URL.revokeObjectURL(url);\n console.error('Draco decode failed:', error);\n reject(new Error(`Failed to decode Draco geometry: ${error}`));\n }\n );\n });\n \n // Compute bounding volumes\n geometry.computeBoundingSphere();\n geometry.computeBoundingBox();\n \n console.log('Final geometry:', {\n hasPositions: !!geometry.attributes.position,\n hasNormals: !!geometry.attributes.normal,\n hasUVs: !!geometry.attributes.uv,\n hasIndices: !!geometry.index,\n vertexCount: geometry.attributes.position?.count || 0\n });\n \n return geometry;\n }\n \n /**\n * Build Three.js scene from parsed mesh data\n */\n static async buildScene(parsedData: ReturnType<typeof MeshParser.parseMeshData>, dataBlob: Uint8Array, dracoLoader: DRACOLoader): Promise<THREE.Group> {\n const root = new THREE.Group();\n root.name = 'StowKitMesh';\n \n const { geometries, materials, nodes, meshIndices } = parsedData;\n console.log('Building scene with:', {\n geometries: geometries.length,\n materials: materials.length,\n nodes: nodes.length,\n meshIndices: meshIndices.length\n });\n \n // Create all Three.js objects for nodes\n const nodeObjects: THREE.Object3D[] = [];\n \n for (const node of nodes) {\n const obj = new THREE.Group();\n obj.name = node.name;\n \n console.log(`Node ${node.name}: position=${node.position}, rotation=${node.rotation}, scale=${node.scale}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex}`);\n \n // Apply transform\n obj.position.set(...node.position);\n obj.quaternion.set(...node.rotation);\n obj.scale.set(...node.scale);\n \n // Add meshes to this node\n for (let i = 0; i < node.meshCount; i++) {\n const meshIndexArrayPos = node.firstMeshIndex + i;\n const meshIndex = meshIndices[meshIndexArrayPos];\n console.log(` meshIndices[${meshIndexArrayPos}] = ${meshIndex} (adding to node ${node.name})`);\n if (meshIndex < geometries.length) {\n const geoInfo = geometries[meshIndex];\n console.log(` Creating geometry from geoInfo: vertices=${geoInfo.vertexCount}, indices=${geoInfo.indexCount}, material=${geoInfo.materialIndex}`);\n const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n console.warn(` Material index ${geoInfo.materialIndex} out of bounds, using default`);\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n obj.add(mesh);\n console.log(` ✓ Added mesh to node ${node.name} (${geometry.attributes.position?.count || 0} vertices, material: ${material.name || 'default'})`);\n } else {\n console.error(` ✗ Mesh index ${meshIndex} out of bounds (have ${geometries.length} geometries)`);\n }\n }\n \n console.log(` Node ${node.name} now has ${obj.children.length} children`);\n nodeObjects.push(obj);\n }\n \n // Build hierarchy\n console.log('Building node hierarchy...');\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const obj = nodeObjects[i];\n \n if (node.parentIndex >= 0 && node.parentIndex < nodeObjects.length) {\n console.log(` Adding node \"${node.name}\" (index ${i}) as child of node \"${nodes[node.parentIndex].name}\" (index ${node.parentIndex})`);\n nodeObjects[node.parentIndex].add(obj);\n } else {\n console.log(` Adding node \"${node.name}\" (index ${i}) as direct child of root (parentIndex=${node.parentIndex})`);\n root.add(obj);\n }\n }\n \n // If no nodes, create a single mesh from all geometries\n if (nodes.length === 0 && geometries.length > 0) {\n console.log('No nodes found, creating meshes directly from geometries');\n for (let index = 0; index < geometries.length; index++) {\n const geoInfo = geometries[index];\n console.log(`Creating direct mesh ${index}: materialIndex=${geoInfo.materialIndex}, vertices=${geoInfo.vertexCount}`);\n const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);\n \n // Use assigned material if valid, otherwise create default\n let material: THREE.Material;\n if (geoInfo.materialIndex < materials.length) {\n material = materials[geoInfo.materialIndex];\n } else {\n console.warn(` Material index ${geoInfo.materialIndex} out of bounds, using default`);\n material = new THREE.MeshStandardMaterial({\n color: new THREE.Color(0.8, 0.8, 0.8),\n roughness: 0.5,\n metalness: 0.0,\n side: THREE.DoubleSide\n });\n }\n \n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = `Mesh_${index}`;\n root.add(mesh);\n console.log(`Added mesh ${index} to root`);\n }\n }\n \n console.log(`Final scene has ${root.children.length} direct children`);\n \n // Debug: traverse and count all meshes, showing full hierarchy\n let totalMeshCount = 0;\n let hierarchyLog = 'Scene hierarchy:\\n';\n root.traverse((obj) => {\n // Calculate depth by counting parents\n let depth = 0;\n let parent = obj.parent;\n while (parent && parent !== root) {\n depth++;\n parent = parent.parent;\n }\n const indent = ' '.repeat(depth);\n \n if (obj instanceof THREE.Mesh) {\n totalMeshCount++;\n const mat = obj.material as THREE.MeshStandardMaterial;\n hierarchyLog += `${indent}[Mesh] vertices=${obj.geometry.attributes.position?.count || 0}, material=${mat.name}, hasTexture=${!!mat.map}\\n`;\n } else if (obj instanceof THREE.Group && obj !== root) {\n hierarchyLog += `${indent}[Group] ${obj.name} (${obj.children.length} children)\\n`;\n }\n });\n console.log(hierarchyLog);\n console.log(`Total meshes in scene: ${totalMeshCount}`);\n \n return root;\n }\n \n /**\n * Read null-terminated string from buffer\n */\n private static readString(buffer: Uint8Array): string {\n let end = buffer.indexOf(0);\n if (end === -1) end = buffer.length;\n return new TextDecoder().decode(buffer.slice(0, end));\n }\n}\n","import * as THREE from 'three';\r\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\r\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\r\nimport { StowKitReader } from '@stowkit/reader';\r\nimport { MeshParser } from './MeshParser';\r\n\r\nexport interface StowKitLoaderParameters {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/basis/'\r\n */\r\n transcoderPath?: string;\r\n \r\n /**\r\n * Path to WASM reader module\r\n * @default '/stowkit_reader.wasm'\r\n */\r\n wasmPath?: string;\r\n \r\n /**\r\n * Custom StowKitReader instance (optional)\r\n */\r\n reader?: StowKitReader;\r\n}\r\n\r\n/**\r\n * Three.js loader for StowKit asset packs (.stow files)\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const loader = new StowKitLoader();\r\n * loader.setTranscoderPath('/basis/');\r\n * \r\n * // Load a mesh asset\r\n * loader.loadMesh('assets.stow', 'path/to/mesh', (scene) => {\r\n * threeScene.add(scene);\r\n * });\r\n * ```\r\n */\r\nexport class StowKitLoader extends THREE.Loader {\r\n private reader: StowKitReader;\r\n private ktx2Loader: KTX2Loader;\r\n private dracoLoader: DRACOLoader;\r\n private ownedReader: boolean = false;\r\n\r\n constructor(manager?: THREE.LoadingManager, parameters?: StowKitLoaderParameters) {\r\n super(manager);\r\n \r\n // Use provided reader or create new one\r\n if (parameters?.reader) {\r\n this.reader = parameters.reader;\r\n this.ownedReader = false;\r\n } else {\r\n const wasmPath = parameters?.wasmPath || '/stowkit_reader.wasm';\r\n this.reader = new StowKitReader(wasmPath);\r\n this.ownedReader = true;\r\n }\r\n \r\n // Setup KTX2 loader for textures with default path (bundled with package)\r\n const transcoderPath = parameters?.transcoderPath || '/stowkit/basis/'; // Auto-copied on install\r\n this.ktx2Loader = new KTX2Loader(manager);\r\n this.ktx2Loader.setTranscoderPath(transcoderPath);\r\n \r\n // Setup Draco loader for mesh decompression\r\n this.dracoLoader = new DRACOLoader(manager);\r\n this.dracoLoader.setDecoderPath('/stowkit/draco/'); // Draco files copied by postinstall\r\n \r\n // Detect support with a temporary renderer\r\n // This is required for KTX2Loader to work\r\n const tempRenderer = new THREE.WebGLRenderer();\r\n this.ktx2Loader.detectSupport(tempRenderer);\r\n tempRenderer.dispose();\r\n }\r\n \r\n /**\r\n * Set the path to the Draco decoder\r\n */\r\n setDracoDecoderPath(path: string): this {\r\n this.dracoLoader.setDecoderPath(path);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the path to the Basis Universal transcoder\r\n */\r\n setTranscoderPath(path: string): this {\r\n this.ktx2Loader.setTranscoderPath(path);\r\n return this;\r\n }\r\n\r\n /**\r\n * Detect WebGL support for compressed textures\r\n */\r\n detectSupport(renderer: THREE.WebGLRenderer): this {\r\n this.ktx2Loader.detectSupport(renderer);\r\n return this;\r\n }\r\n\r\n /**\r\n * Open a .stow pack file (call this first if loading multiple assets)\r\n * @param url - URL to the .stow file\r\n */\r\n async openPack(url: string): Promise<void> {\r\n if (this.ownedReader) {\r\n await this.reader.init();\r\n }\r\n\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n await this.reader.open(arrayBuffer);\r\n }\r\n\r\n /**\r\n * Load and parse a mesh asset by its index\r\n * @param index - Asset index\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadMeshByIndex(\r\n index: number,\r\n onLoad?: (scene: THREE.Group) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Group> {\r\n try {\r\n // Read mesh data and metadata\r\n const data = this.reader.readAssetData(index);\r\n const metadata = this.reader.readAssetMetadata(index);\r\n\r\n if (!data) {\r\n throw new Error(`Failed to read mesh data for index ${index}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available for index ${index}`);\r\n }\r\n\r\n // Parse mesh data\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n\r\n // Load textures for materials\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n\r\n // Build Three.js scene with Draco decoder\r\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n\r\n if (onLoad) {\r\n onLoad(scene);\r\n }\r\n\r\n return scene;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load and parse a mesh asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the mesh asset within the pack\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadMesh(\r\n url: string,\r\n assetPath: string,\r\n onLoad?: (scene: THREE.Group) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Group> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the mesh asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n // Read mesh data and metadata\r\n const data = this.reader.readAssetData(assetIndex);\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n\r\n if (!data) {\r\n throw new Error(`Failed to read mesh data for ${assetPath}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available for ${assetPath}`);\r\n }\r\n\r\n // Parse mesh data\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n\r\n // Load textures for materials\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n\r\n // Build Three.js scene with Draco decoder\r\n const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n\r\n if (onLoad) {\r\n onLoad(scene);\r\n }\r\n\r\n return scene;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load textures for materials\r\n */\r\n private async loadMaterialTextures(\r\n materialData: Array<{\r\n name: string;\r\n schemaId: string;\r\n propertyCount: number;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }>,\r\n materials: THREE.Material[]\r\n ): Promise<void> {\r\n for (let i = 0; i < materialData.length; i++) {\r\n const matData = materialData[i];\r\n const material = materials[i] as THREE.MeshStandardMaterial;\r\n\r\n for (const prop of matData.properties) {\r\n if (prop.textureId && prop.textureId.length > 0) {\r\n try {\r\n // Find texture asset\r\n const textureIndex = this.reader.findAssetByPath(prop.textureId);\r\n if (textureIndex < 0) {\r\n console.warn(`Texture not found: ${prop.textureId}`);\r\n continue;\r\n }\r\n\r\n // Read texture data\r\n const textureData = this.reader.readAssetData(textureIndex);\r\n if (!textureData) {\r\n console.warn(`Failed to read texture: ${prop.textureId}`);\r\n continue;\r\n }\r\n\r\n // Load as KTX2\r\n const texture = await this.loadKTX2Texture(textureData);\r\n\r\n // Apply to material based on property name\r\n this.applyTextureToMaterial(material, prop.fieldName, texture);\r\n\r\n } catch (error) {\r\n console.error(`Failed to load texture \"${prop.textureId}\":`, error);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load a KTX2 texture from binary data\r\n */\r\n private async loadKTX2Texture(data: Uint8Array): Promise<THREE.CompressedTexture> {\r\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const blob = new Blob([arrayBuffer]);\r\n const url = URL.createObjectURL(blob);\r\n\r\n try {\r\n return await new Promise<THREE.CompressedTexture>((resolve, reject) => {\r\n this.ktx2Loader.load(\r\n url,\r\n (texture) => {\r\n URL.revokeObjectURL(url);\r\n // Compressed textures don't support flipY, we flip UVs in MeshParser instead\r\n texture.needsUpdate = true;\r\n resolve(texture);\r\n },\r\n undefined,\r\n (error) => {\r\n URL.revokeObjectURL(url);\r\n reject(error);\r\n }\r\n );\r\n });\r\n } catch (error) {\r\n URL.revokeObjectURL(url);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Apply texture to appropriate material property\r\n */\r\n private applyTextureToMaterial(\r\n material: THREE.MeshStandardMaterial,\r\n propertyName: string,\r\n texture: THREE.CompressedTexture\r\n ): void {\r\n const propNameLower = propertyName.toLowerCase();\r\n\r\n if (propNameLower === 'maintex' || propNameLower.includes('diffuse') || \r\n propNameLower.includes('albedo') || propNameLower.includes('base')) {\r\n material.map = texture;\r\n } else if (propNameLower.includes('normal')) {\r\n material.normalMap = texture;\r\n } else if (propNameLower.includes('metallic')) {\r\n material.metalnessMap = texture;\r\n } else if (propNameLower.includes('roughness')) {\r\n material.roughnessMap = texture;\r\n } else {\r\n // Default to main texture\r\n material.map = texture;\r\n }\r\n\r\n material.needsUpdate = true;\r\n }\r\n\r\n /**\r\n * Load a texture asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the texture asset within the pack\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadTexture(\r\n url: string,\r\n assetPath: string,\r\n onLoad?: (texture: THREE.CompressedTexture) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.CompressedTexture> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the texture asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n return await this.loadTextureByIndex(assetIndex, onLoad, onProgress, onError);\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load a texture asset by its index in the pack\r\n * @param index - Asset index\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadTextureByIndex(\r\n index: number,\r\n onLoad?: (texture: THREE.CompressedTexture) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.CompressedTexture> {\r\n try {\r\n // Read texture data\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data for index ${index}`);\r\n }\r\n\r\n // Load as KTX2\r\n const texture = await this.loadKTX2Texture(data);\r\n\r\n if (onLoad) {\r\n onLoad(texture);\r\n }\r\n\r\n return texture;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load an audio asset from a StowKit pack\r\n * @param url - URL to the .stow file (or omit if already opened with openPack)\r\n * @param assetPath - Path to the audio asset within the pack\r\n * @param listener - THREE.AudioListener to attach to\r\n * @param onLoad - Callback when loading completes\r\n * @param onProgress - Progress callback\r\n * @param onError - Error callback\r\n */\r\n async loadAudio(\r\n url: string,\r\n assetPath: string,\r\n listener: THREE.AudioListener,\r\n onLoad?: (audio: THREE.Audio) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n onError?: (error: Error) => void\r\n ): Promise<THREE.Audio> {\r\n try {\r\n // Open pack if URL provided\r\n if (url) {\r\n await this.openPack(url);\r\n }\r\n\r\n // Find the audio asset\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Asset not found: ${assetPath}`);\r\n }\r\n\r\n // Read audio data\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for ${assetPath}`);\r\n }\r\n\r\n // Create audio object\r\n const audio = new THREE.Audio(listener);\r\n\r\n // Decode audio data\r\n const arrayBuffer: ArrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\r\n const audioContext = listener.context;\r\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\r\n\r\n audio.setBuffer(audioBuffer);\r\n\r\n if (onLoad) {\r\n onLoad(audio);\r\n }\r\n\r\n return audio;\r\n\r\n } catch (error) {\r\n if (onError) {\r\n onError(error as Error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get metadata for an audio asset\r\n * @param assetPath - Path to the audio asset within the pack\r\n */\r\n getAudioMetadata(assetPath: string): {\r\n stringId: string;\r\n sampleRate: number;\r\n channels: number;\r\n durationMs: number;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 140) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse AudioMetadata structure\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const nullIdx = stringIdBytes.indexOf(0);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, nullIdx >= 0 ? nullIdx : 128));\r\n\r\n return {\r\n stringId,\r\n sampleRate: view.getUint32(128, true),\r\n channels: view.getUint32(132, true),\r\n durationMs: view.getUint32(136, true)\r\n };\r\n } catch (error) {\r\n console.error('Failed to read audio metadata:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get metadata for a texture asset\r\n * @param assetPath - Path to the texture asset within the pack\r\n */\r\n getTextureMetadata(assetPath: string): {\r\n width: number;\r\n height: number;\r\n channels: number;\r\n isKtx2: boolean;\r\n channelFormat: number;\r\n stringId: string;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 144) return null; // TextureMetadata is now 144 bytes\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse TextureMetadata structure (width, height, channels, channel_format, string_id[128])\r\n const stringIdBytes = metadata.slice(16, 144); // After 4 uint32s (16 bytes)\r\n const nullIdx = stringIdBytes.indexOf(0);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, nullIdx >= 0 ? nullIdx : 128));\r\n\r\n return {\r\n width: view.getUint32(0, true),\r\n height: view.getUint32(4, true),\r\n channels: view.getUint32(8, true),\r\n isKtx2: true, // All textures are KTX2 now\r\n channelFormat: view.getUint32(12, true),\r\n stringId\r\n };\r\n } catch (error) {\r\n console.error('Failed to read texture metadata:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load material schema information by index\r\n * @param index - Asset index\r\n */\r\n loadMaterialSchemaByIndex(index: number): {\r\n stringId: string;\r\n schemaName: string;\r\n fields: Array<{\r\n name: string;\r\n type: 'Texture' | 'Color' | 'Float' | 'Vec2' | 'Vec3' | 'Vec4' | 'Int';\r\n previewFlag: 'None' | 'MainTex' | 'Tint';\r\n defaultValue: [number, number, number, number];\r\n }>;\r\n } | null {\r\n try {\r\n const metadata = this.reader.readAssetMetadata(index);\r\n if (!metadata || metadata.length < 196) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const schemaNameBytes = metadata.slice(128, 192);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdBytes.indexOf(0) || 128));\r\n const schemaName = decoder.decode(schemaNameBytes.slice(0, schemaNameBytes.indexOf(0) || 64));\r\n const fieldCount = view.getUint32(192, true);\r\n\r\n const fields = [];\r\n let offset = 196;\r\n\r\n for (let i = 0; i < fieldCount; i++) {\r\n if (offset + 88 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const fieldType = view.getUint32(offset + 64, true);\r\n const previewFlags = view.getUint32(offset + 68, true);\r\n const defaultValue: [number, number, number, number] = [\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true),\r\n view.getFloat32(offset + 80, true),\r\n view.getFloat32(offset + 84, true)\r\n ];\r\n\r\n const typeNames = ['Texture', 'Color', 'Float', 'Vec2', 'Vec3', 'Vec4', 'Int'] as const;\r\n const previewFlagNames = ['None', 'MainTex', 'Tint'] as const;\r\n\r\n fields.push({\r\n name: fieldName,\r\n type: typeNames[fieldType] || 'Float',\r\n previewFlag: previewFlagNames[previewFlags] || 'None',\r\n defaultValue\r\n });\r\n\r\n offset += 88;\r\n }\r\n\r\n return { stringId, schemaName, fields };\r\n } catch (error) {\r\n console.error('Failed to read material schema:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load material schema information by path\r\n * @param assetPath - Path to the material schema asset\r\n */\r\n loadMaterialSchema(assetPath: string): {\r\n stringId: string;\r\n schemaName: string;\r\n fields: Array<{\r\n name: string;\r\n type: 'Texture' | 'Color' | 'Float' | 'Vec2' | 'Vec3' | 'Vec4' | 'Int';\r\n previewFlag: 'None' | 'MainTex' | 'Tint';\r\n defaultValue: [number, number, number, number];\r\n }>;\r\n } | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 196) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse MaterialSchemaMetadata: string_id[128] + schema_name[64] + field_count(4) = 196 bytes\r\n const stringIdBytes = metadata.slice(0, 128);\r\n const schemaNameBytes = metadata.slice(128, 192);\r\n const stringId = decoder.decode(stringIdBytes.slice(0, stringIdBytes.indexOf(0) || 128));\r\n const schemaName = decoder.decode(schemaNameBytes.slice(0, schemaNameBytes.indexOf(0) || 64));\r\n const fieldCount = view.getUint32(192, true);\r\n\r\n const fields = [];\r\n let offset = 196;\r\n\r\n // Parse fields: name[64] + field_type(4) + preview_flags(4) + default_value[4*4=16] = 88 bytes\r\n for (let i = 0; i < fieldCount; i++) {\r\n if (offset + 88 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const fieldType = view.getUint32(offset + 64, true);\r\n const previewFlags = view.getUint32(offset + 68, true);\r\n const defaultValue: [number, number, number, number] = [\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true),\r\n view.getFloat32(offset + 80, true),\r\n view.getFloat32(offset + 84, true)\r\n ];\r\n\r\n const typeNames = ['Texture', 'Color', 'Float', 'Vec2', 'Vec3', 'Vec4', 'Int'] as const;\r\n const previewFlagNames = ['None', 'MainTex', 'Tint'] as const;\r\n\r\n fields.push({\r\n name: fieldName,\r\n type: typeNames[fieldType] || 'Float',\r\n previewFlag: previewFlagNames[previewFlags] || 'None',\r\n defaultValue\r\n });\r\n\r\n offset += 88; // MaterialSchemaField is 88 bytes total\r\n }\r\n\r\n return { stringId, schemaName, fields };\r\n } catch (error) {\r\n console.error('Failed to read material schema:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get material information from a loaded mesh\r\n * Returns material data including properties and texture references\r\n */\r\n getMeshMaterials(assetPath: string): Array<{\r\n name: string;\r\n schemaId: string;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }> | null {\r\n try {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n const metadata = this.reader.readAssetMetadata(assetIndex);\r\n if (!metadata || metadata.length < 140) return null;\r\n\r\n const view = new DataView(metadata.buffer, metadata.byteOffset, metadata.byteLength);\r\n const decoder = new TextDecoder();\r\n\r\n // Parse MeshMetadata\r\n const meshGeometryCount = view.getUint32(0, true);\r\n const materialCount = view.getUint32(4, true);\r\n const nodeCount = view.getUint32(8, true);\r\n\r\n let offset = 140;\r\n\r\n // Skip geometries (40 bytes each - Draco compressed)\r\n offset += meshGeometryCount * 40;\r\n\r\n // Parse materials\r\n const materials: Array<{\r\n name: string;\r\n schemaId: string;\r\n propertyCount: number;\r\n properties: Array<{\r\n fieldName: string;\r\n value: [number, number, number, number];\r\n textureId: string;\r\n }>;\r\n }> = [];\r\n \r\n for (let i = 0; i < materialCount; i++) {\r\n if (offset + 196 > metadata.length) break;\r\n\r\n const nameBytes = metadata.slice(offset, offset + 64);\r\n const schemaIdBytes = metadata.slice(offset + 64, offset + 192);\r\n const name = decoder.decode(nameBytes.slice(0, nameBytes.indexOf(0) || 64));\r\n const schemaId = decoder.decode(schemaIdBytes.slice(0, schemaIdBytes.indexOf(0) || 128));\r\n const propertyCount = view.getUint32(offset + 192, true);\r\n\r\n materials.push({ name, schemaId, propertyCount, properties: [] });\r\n offset += 196;\r\n }\r\n\r\n // Skip nodes (116 bytes each)\r\n offset += nodeCount * 116;\r\n\r\n // Skip mesh indices (4 bytes each)\r\n const totalMeshRefs = materials.reduce((sum: number, mat: any) => {\r\n // This is a simplification - we'd need to parse nodes to get exact count\r\n return sum;\r\n }, 0);\r\n // For now, skip based on nodeCount assumption\r\n offset += nodeCount * 4;\r\n\r\n // Parse material properties\r\n for (const mat of materials) {\r\n for (let j = 0; j < (mat as any).propertyCount; j++) {\r\n if (offset + 144 > metadata.length) break;\r\n\r\n const fieldNameBytes = metadata.slice(offset, offset + 64);\r\n const fieldName = decoder.decode(fieldNameBytes.slice(0, fieldNameBytes.indexOf(0) || 64));\r\n const value: [number, number, number, number] = [\r\n view.getFloat32(offset + 64, true),\r\n view.getFloat32(offset + 68, true),\r\n view.getFloat32(offset + 72, true),\r\n view.getFloat32(offset + 76, true)\r\n ];\r\n const textureIdBytes = metadata.slice(offset + 80, offset + 144);\r\n const textureId = decoder.decode(textureIdBytes.slice(0, textureIdBytes.indexOf(0) || 64));\r\n\r\n mat.properties.push({ fieldName, value, textureId });\r\n offset += 144;\r\n }\r\n }\r\n\r\n return materials;\r\n } catch (error) {\r\n console.error('Failed to read mesh materials:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Open a .stow file from a File or ArrayBuffer\r\n */\r\n async open(fileOrBuffer: ArrayBuffer | File): Promise<boolean> {\r\n // Initialize reader if needed\r\n if (this.ownedReader) {\r\n await this.reader.init();\r\n }\r\n return await this.reader.open(fileOrBuffer);\r\n }\r\n\r\n /**\r\n * Get the total number of assets\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get info about a specific asset\r\n */\r\n getAssetInfo(index: number): any {\r\n return this.reader.getAssetInfo(index);\r\n }\r\n\r\n /**\r\n * Read asset data by index\r\n */\r\n readAssetData(index: number): Uint8Array | null {\r\n return this.reader.readAssetData(index);\r\n }\r\n\r\n /**\r\n * Read asset metadata by index\r\n */\r\n readAssetMetadata(index: number): Uint8Array | null {\r\n return this.reader.readAssetMetadata(index);\r\n }\r\n\r\n /**\r\n * Parse texture metadata\r\n */\r\n parseTextureMetadata(metadataBytes: Uint8Array): any {\r\n return this.reader.parseTextureMetadata(metadataBytes);\r\n }\r\n\r\n /**\r\n * Create an HTML audio element for preview\r\n * @param index - Asset index\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) {\r\n throw new Error(`Failed to read audio data for index ${index}`);\r\n }\r\n\r\n // Create blob URL for HTML5 audio\r\n const blob = new Blob([data as any], { type: 'audio/ogg' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n // Create and configure audio element\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n // Clean up URL when audio ends or on error\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n /**\r\n * List all assets in the opened pack\r\n */\r\n listAssets(): Array<{\r\n index: number;\r\n name?: string;\r\n type: number;\r\n dataSize: number;\r\n metadataSize: number;\r\n }> {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Dispose of resources\r\n */\r\n dispose(): void {\r\n this.ktx2Loader.dispose();\r\n this.dracoLoader.dispose();\r\n if (this.ownedReader) {\r\n this.reader.close();\r\n }\r\n }\r\n}\r\n"],"names":["THREE","StowKitReader","KTX2Loader","DRACOLoader"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;MA4Ca,UAAU,CAAA;AAEnB;;AAEG;IACH,OAAO,iBAAiB,CAAC,IAAgB,EAAA;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;;AAGzE,QAAA,MAAM,QAAQ,GAAiB;YAC3B,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1C,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;YACtC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;AAClC,YAAA,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;SACjD,CAAC;AAEF,QAAA,OAAO,QAAQ,CAAC;KACnB;AAED;;AAEG;AACH,IAAA,OAAO,aAAa,CAAC,YAAwB,EAAE,QAAoB,EAAA;;AAS/D,QAAA,IAAI,YAAY,CAAC,MAAM,GAAG,GAAG,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,CAAA,yBAAA,EAA4B,YAAY,CAAC,MAAM,CAAgC,8BAAA,CAAA,CAAC,CAAC;SACpG;AAED,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,uBAAA,EAA0B,YAAY,CAAC,MAAM,CAAA,iBAAA,EAAoB,QAAQ,CAAC,MAAM,CAAA,WAAA,CAAa,CAAC,CAAC;QAC3G,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACtD,QAAA,OAAO,CAAC,GAAG,CAAC,CAAgB,aAAA,EAAA,QAAQ,CAAC,iBAAiB,CAAA,aAAA,EAAgB,QAAQ,CAAC,aAAa,CAAe,YAAA,EAAA,QAAQ,CAAC,SAAS,CAAA,MAAA,CAAQ,CAAC,CAAC;;QAGvI,MAAM,oBAAoB,GAAG,GAAG;AAC5B,aAAC,QAAQ,CAAC,iBAAiB,GAAG,EAAE,CAAC;AACjC,aAAC,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC;AAC9B,aAAC,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;AAE/B,QAAA,IAAI,mBAAmB,GAAG,YAAY,CAAC,MAAM,IAAI,oBAAoB,CAAC;AACtE,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,wBAAA,EAA2B,oBAAoB,CAAA,UAAA,EAAa,YAAY,CAAC,MAAM,CAAA,gBAAA,EAAmB,mBAAmB,CAAA,CAAE,CAAC,CAAC;;QAGrI,MAAM,UAAU,GAAG,mBAAmB,GAAG,YAAY,GAAG,QAAQ,CAAC;AACjE,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;AAE/F,QAAA,IAAI,MAAM,GAAG,mBAAmB,GAAG,GAAG,GAAG,CAAC,CAAC;;QAG3C,MAAM,UAAU,GAAuB,EAAE,CAAC;AAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE;YACjD,IAAI,MAAM,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE;gBACjC,OAAO,CAAC,IAAI,CAAC,CAA8B,2BAAA,EAAA,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAC,iBAAiB,CAAE,CAAA,CAAC,CAAC;gBAC9E,MAAM;aACT;AACD,YAAA,MAAM,GAAG,GAAqB;gBAC1B,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;gBAC7C,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC;gBAChD,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC;gBAChD,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AAC7C,gBAAA,sBAAsB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACxE,gBAAA,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;gBACtE,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;gBACpD,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;aACjD,CAAC;AACF,YAAA,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrB,YAAA,MAAM,IAAI,EAAE,CAAC;SAChB;;QAGD,MAAM,YAAY,GAAmB,EAAE,CAAC;QACxC,MAAM,SAAS,GAAqB,EAAE,CAAC;AAIvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE;YAC7C,IAAI,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,CAA8B,2BAAA,EAAA,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAC,aAAa,CAAE,CAAA,CAAC,CAAC;gBAC1E,MAAM;aACT;AAID,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACpE,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9E,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;YAE7D,YAAY,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,QAAQ;gBACR,aAAa;AACb,gBAAA,UAAU,EAAE,EAAE;AACjB,aAAA,CAAC,CAAC;AAEH,YAAA,MAAM,IAAI,GAAG,CAAC;SACjB;;QAGD,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,CAAA,+BAAA,EAAkC,QAAQ,CAAC,SAAS,CAAa,WAAA,CAAA,CAAC,CAAC;AAC/E,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;YACzC,IAAI,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,CAA0B,uBAAA,EAAA,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAC,SAAS,CAAE,CAAA,CAAC,CAAC;gBAClE,MAAM;aACT;AACD,YAAA,MAAM,IAAI,GAAS;AACf,gBAAA,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC5D,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AACjD,gBAAA,QAAQ,EAAE;oBACN,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AACzC,iBAAA;AACD,gBAAA,QAAQ,EAAE;oBACN,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;AACzC,iBAAA;AACD,gBAAA,KAAK,EAAE;oBACH,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;oBACvC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;AAC1C,iBAAA;gBACD,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;gBACjD,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC;aACzD,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAM,GAAA,EAAA,IAAI,CAAC,IAAI,CAAa,UAAA,EAAA,IAAI,CAAC,WAAW,CAAA,YAAA,EAAe,IAAI,CAAC,SAAS,CAAA,iBAAA,EAAoB,IAAI,CAAC,cAAc,CAAG,CAAA,CAAA,CAAC,CAAC;AAC1I,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,YAAA,MAAM,IAAI,GAAG,CAAC;SACjB;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,gCAAA,CAAkC,CAAC,CAAC;;QAGhD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,CAAA,QAAA,EAAW,aAAa,CAA2B,wBAAA,EAAA,MAAM,CAAE,CAAA,CAAC,CAAC;AACzE,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC;AACnD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE;gBAC1C,OAAO,CAAC,IAAI,CAAC,CAAA,6BAAA,EAAgC,CAAC,CAAI,CAAA,EAAA,aAAa,CAAE,CAAA,CAAC,CAAC;gBACnE,MAAM;aACT;AACD,YAAA,WAAW,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC1D,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,cAAA,EAAiB,CAAC,CAAA,IAAA,EAAO,WAAW,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC;SAC1D;AACD,QAAA,MAAM,IAAI,aAAa,GAAG,CAAC,CAAC;AAC5B,QAAA,OAAO,CAAC,GAAG,CAAC,gCAAgC,MAAM,CAAA,CAAE,CAAC,CAAC;;;AAItD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAChC,YAAA,OAAO,CAAC,GAAG,CAAC,CAAa,UAAA,EAAA,OAAO,CAAC,IAAI,CAAA,WAAA,EAAc,OAAO,CAAC,QAAQ,CAAM,GAAA,EAAA,OAAO,CAAC,aAAa,CAAA,WAAA,CAAa,CAAC,CAAC;AAE7G,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE;gBAC5C,IAAI,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE;AAClC,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,2BAAA,EAA8B,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,aAAa,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAE,CAAC,CAAC;oBAC1F,MAAM;iBACT;AAED,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACzE,gBAAA,MAAM,KAAK,GAAqC;oBAC5C,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBACtC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;iBACzC,CAAC;AACF,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;AAE/E,gBAAA,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBACpB,SAAS;oBACT,KAAK;oBACL,SAAS;AACZ,iBAAA,CAAC,CAAC;AAEH,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAe,YAAA,EAAA,SAAS,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAA,CAAG,CAAC,CAAC;AAEhG,gBAAA,MAAM,IAAI,GAAG,CAAC;aACjB;;AAGD,YAAA,MAAM,GAAG,GAAG,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;gBACvC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAEA,gBAAK,CAAC,UAAU;;gBAEtB,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxC,aAAA,CAAC,CAAC;AAEH,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,kBAAA,EAAqB,CAAC,CAAM,GAAA,EAAA,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,aAAa,CAAA,WAAA,CAAa,CAAC,CAAC;;AAG9F,YAAA,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE;gBACnC,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;;AAE3F,oBAAA,GAAG,CAAC,KAAK,GAAG,IAAIA,gBAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzE,OAAO,CAAC,GAAG,CAAC,CAA6B,0BAAA,EAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;iBAClG;aACJ;YAED,OAAO,CAAC,GAAG,CAAC,CAAc,WAAA,EAAA,CAAC,qBAAqB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA,EAAA,EAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAK,EAAA,EAAA,GAAG,CAAC,KAAK,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;AAChG,YAAA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB;;AAGD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,SAAS,CAAC,IAAI,CAAC,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;AAC1C,gBAAA,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACrC,gBAAA,SAAS,EAAE,GAAG;AACd,gBAAA,SAAS,EAAE,GAAG;gBACd,IAAI,EAAEA,gBAAK,CAAC,UAAU;AACzB,aAAA,CAAC,CAAC,CAAC;SACP;AAED,QAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;KAChF;AAED;;AAEG;IACH,aAAa,cAAc,CAAC,OAAyB,EAAE,QAAoB,EAAE,WAAwB,EAAA;AACjG,QAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE;YACpC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,gBAAgB,EAAE,OAAO,CAAC,sBAAsB;YAChD,cAAc,EAAE,OAAO,CAAC,oBAAoB;AAC/C,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,EAAE;AACjF,YAAA,MAAM,IAAI,KAAK,CAAC,CAA2C,wCAAA,EAAA,OAAO,CAAC,sBAAsB,CAAA,OAAA,EAAU,OAAO,CAAC,oBAAoB,CAAgB,aAAA,EAAA,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC,CAAC;SACrK;AAED,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CACjC,OAAO,CAAC,sBAAsB,EAC9B,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAChE,CAAC;;;QAIF,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAClI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAuB,CAAC,OAAO,EAAE,MAAM,KAAI;YACzE,WAAW,CAAC,IAAI,CACZ,GAAG,EACH,CAAC,OAA6B,KAAI;AAC9B,gBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACzB,gBAAA,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;;gBAGpD,OAAO,CAAC,OAAO,CAAC,CAAC;AACrB,aAAC,EACD,SAAS,EACT,CAAC,KAAU,KAAI;AACX,gBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACzB,gBAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;gBAC7C,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAA,CAAE,CAAC,CAAC,CAAC;AACnE,aAAC,CACJ,CAAC;AACN,SAAC,CAAC,CAAC;;QAGH,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACjC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;AAE9B,QAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;AAC3B,YAAA,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ;AAC5C,YAAA,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;AACxC,YAAA,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAChC,YAAA,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK;YAC5B,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC;AACxD,SAAA,CAAC,CAAC;AAEH,QAAA,OAAO,QAAQ,CAAC;KACnB;AAED;;AAEG;IACH,aAAa,UAAU,CAAC,UAAuD,EAAE,QAAoB,EAAE,WAAwB,EAAA;AAC3H,QAAA,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,KAAK,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAE1B,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC;AACjE,QAAA,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE;YAChC,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,WAAW,EAAE,WAAW,CAAC,MAAM;AAClC,SAAA,CAAC,CAAC;;QAGH,MAAM,WAAW,GAAqB,EAAE,CAAC;AAEzC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,IAAIA,gBAAK,CAAC,KAAK,EAAE,CAAC;AAC9B,YAAA,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AAErB,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAC,IAAI,CAAA,WAAA,EAAc,IAAI,CAAC,QAAQ,CAAA,WAAA,EAAc,IAAI,CAAC,QAAQ,CAAA,QAAA,EAAW,IAAI,CAAC,KAAK,CAAA,YAAA,EAAe,IAAI,CAAC,SAAS,CAAA,iBAAA,EAAoB,IAAI,CAAC,cAAc,CAAA,CAAE,CAAC,CAAC;;YAGhL,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;;AAG7B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;AAClD,gBAAA,MAAM,SAAS,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;AACjD,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,cAAA,EAAiB,iBAAiB,CAAA,IAAA,EAAO,SAAS,CAAA,iBAAA,EAAoB,IAAI,CAAC,IAAI,CAAA,CAAA,CAAG,CAAC,CAAC;AAChG,gBAAA,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE;AAC/B,oBAAA,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;AACtC,oBAAA,OAAO,CAAC,GAAG,CAAC,CAA8C,2CAAA,EAAA,OAAO,CAAC,WAAW,CAAA,UAAA,EAAa,OAAO,CAAC,UAAU,CAAc,WAAA,EAAA,OAAO,CAAC,aAAa,CAAA,CAAE,CAAC,CAAC;AACnJ,oBAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;;AAG3E,oBAAA,IAAI,QAAwB,CAAC;oBAC7B,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE;AAC1C,wBAAA,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;qBAC/C;yBAAM;wBACH,OAAO,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,OAAO,CAAC,aAAa,CAA+B,6BAAA,CAAA,CAAC,CAAC;AACvF,wBAAA,QAAQ,GAAG,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;4BACtC,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACrC,4BAAA,SAAS,EAAE,GAAG;AACd,4BAAA,SAAS,EAAE,GAAG;4BACd,IAAI,EAAEA,gBAAK,CAAC,UAAU;AACzB,yBAAA,CAAC,CAAC;qBACN;oBAED,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAChD,oBAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,CAA0B,uBAAA,EAAA,IAAI,CAAC,IAAI,CAAA,EAAA,EAAK,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAwB,qBAAA,EAAA,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAG,CAAA,CAAA,CAAC,CAAC;iBACtJ;qBAAM;oBACH,OAAO,CAAC,KAAK,CAAC,CAAkB,eAAA,EAAA,SAAS,CAAwB,qBAAA,EAAA,UAAU,CAAC,MAAM,CAAc,YAAA,CAAA,CAAC,CAAC;iBACrG;aACJ;AAED,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,IAAI,CAAY,SAAA,EAAA,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAA,SAAA,CAAW,CAAC,CAAC;AAC3E,YAAA,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACzB;;AAGD,QAAA,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACtB,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAE3B,YAAA,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE;gBAChE,OAAO,CAAC,GAAG,CAAC,CAAkB,eAAA,EAAA,IAAI,CAAC,IAAI,CAAA,SAAA,EAAY,CAAC,CAAA,oBAAA,EAAuB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAA,SAAA,EAAY,IAAI,CAAC,WAAW,CAAG,CAAA,CAAA,CAAC,CAAC;gBACxI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAC1C;iBAAM;AACH,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAC,IAAI,CAAY,SAAA,EAAA,CAAC,0CAA0C,IAAI,CAAC,WAAW,CAAA,CAAA,CAAG,CAAC,CAAC;AACnH,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aACjB;SACJ;;AAGD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAA,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;AACxE,YAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACpD,gBAAA,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAClC,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,qBAAA,EAAwB,KAAK,CAAmB,gBAAA,EAAA,OAAO,CAAC,aAAa,cAAc,OAAO,CAAC,WAAW,CAAA,CAAE,CAAC,CAAC;AACtH,gBAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;;AAG3E,gBAAA,IAAI,QAAwB,CAAC;gBAC7B,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE;AAC1C,oBAAA,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;iBAC/C;qBAAM;oBACH,OAAO,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,OAAO,CAAC,aAAa,CAA+B,6BAAA,CAAA,CAAC,CAAC;AACvF,oBAAA,QAAQ,GAAG,IAAIA,gBAAK,CAAC,oBAAoB,CAAC;wBACtC,KAAK,EAAE,IAAIA,gBAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACrC,wBAAA,SAAS,EAAE,GAAG;AACd,wBAAA,SAAS,EAAE,GAAG;wBACd,IAAI,EAAEA,gBAAK,CAAC,UAAU;AACzB,qBAAA,CAAC,CAAC;iBACN;gBAED,MAAM,IAAI,GAAG,IAAIA,gBAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAChD,gBAAA,IAAI,CAAC,IAAI,GAAG,CAAQ,KAAA,EAAA,KAAK,EAAE,CAAC;AAC5B,gBAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACf,gBAAA,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAA,QAAA,CAAU,CAAC,CAAC;aAC9C;SACJ;QAED,OAAO,CAAC,GAAG,CAAC,CAAmB,gBAAA,EAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAkB,gBAAA,CAAA,CAAC,CAAC;;QAGvE,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,YAAY,GAAG,oBAAoB,CAAC;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAI;;YAElB,IAAI,KAAK,GAAG,CAAC,CAAC;AACd,YAAA,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;AACxB,YAAA,OAAO,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE;AAC9B,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;aAC1B;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAElC,YAAA,IAAI,GAAG,YAAYA,gBAAK,CAAC,IAAI,EAAE;AAC3B,gBAAA,cAAc,EAAE,CAAC;AACjB,gBAAA,MAAM,GAAG,GAAG,GAAG,CAAC,QAAsC,CAAC;gBACvD,YAAY,IAAI,CAAG,EAAA,MAAM,CAAmB,gBAAA,EAAA,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAA,WAAA,EAAc,GAAG,CAAC,IAAI,CAAA,aAAA,EAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAA,EAAA,CAAI,CAAC;aAC/I;iBAAM,IAAI,GAAG,YAAYA,gBAAK,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE;AACnD,gBAAA,YAAY,IAAI,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,GAAG,CAAC,IAAI,CAAK,EAAA,EAAA,GAAG,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC;aACtF;AACL,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC1B,QAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,cAAc,CAAA,CAAE,CAAC,CAAC;AAExD,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;AAEG;IACK,OAAO,UAAU,CAAC,MAAkB,EAAA;QACxC,IAAI,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,CAAC,CAAC;AAAE,YAAA,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;AACpC,QAAA,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;KACzD;AACJ;;AClcD;;;;;;;;;;;;;AAaG;AACU,MAAA,aAAc,SAAQA,gBAAK,CAAC,MAAM,CAAA;IAM3C,WAAY,CAAA,OAA8B,EAAE,UAAoC,EAAA;QAC5E,KAAK,CAAC,OAAO,CAAC,CAAC;QAHX,IAAW,CAAA,WAAA,GAAY,KAAK,CAAC;;AAMjC,QAAA,IAAI,UAAU,EAAE,MAAM,EAAE;AACpB,YAAA,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;AAChC,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC5B;aAAM;AACH,YAAA,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ,IAAI,sBAAsB,CAAC;YAChE,IAAI,CAAC,MAAM,GAAG,IAAIC,oBAAa,CAAC,QAAQ,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SAC3B;;QAGD,MAAM,cAAc,GAAG,UAAU,EAAE,cAAc,IAAI,iBAAiB,CAAC;QACvE,IAAI,CAAC,UAAU,GAAG,IAAIC,wBAAU,CAAC,OAAO,CAAC,CAAC;AAC1C,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;;QAGlD,IAAI,CAAC,WAAW,GAAG,IAAIC,0BAAW,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;;;AAInD,QAAA,MAAM,YAAY,GAAG,IAAIH,gBAAK,CAAC,aAAa,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC5C,YAAY,CAAC,OAAO,EAAE,CAAC;KAC1B;AAED;;AAEG;AACH,IAAA,mBAAmB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACtC,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;AAEG;AACH,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACxC,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;AAEG;AACH,IAAA,aAAa,CAAC,QAA6B,EAAA;AACvC,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACxC,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;;AAGG;IACH,MAAM,QAAQ,CAAC,GAAW,EAAA;AACtB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC5B;AAED,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,CAAmB,gBAAA,EAAA,GAAG,CAAK,EAAA,EAAA,QAAQ,CAAC,UAAU,CAAE,CAAA,CAAC,CAAC;SACrE;AAED,QAAA,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KACvC;AAED;;;;;;AAMG;IACH,MAAM,eAAe,CACjB,KAAa,EACb,MAAqC,EACrC,UAA2C,EAC3C,OAAgC,EAAA;AAEhC,QAAA,IAAI;;YAEA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEtD,IAAI,CAAC,IAAI,EAAE;AACP,gBAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAA,CAAE,CAAC,CAAC;aAClE;YAED,IAAI,CAAC,QAAQ,EAAE;AACX,gBAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAA,CAAE,CAAC,CAAC;aAC/D;;YAGD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;AAG5D,YAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;;AAG/E,YAAA,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAE9E,IAAI,MAAM,EAAE;gBACR,MAAM,CAAC,KAAK,CAAC,CAAC;aACjB;AAED,YAAA,OAAO,KAAK,CAAC;SAEhB;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,OAAO,EAAE;gBACT,OAAO,CAAC,KAAc,CAAC,CAAC;aAC3B;AACD,YAAA,MAAM,KAAK,CAAC;SACf;KACJ;AAED;;;;;;;AAOG;IACH,MAAM,QAAQ,CACV,GAAW,EACX,SAAiB,EACjB,MAAqC,EACrC,UAA2C,EAC3C,OAAgC,EAAA;AAEhC,QAAA,IAAI;;YAEA,IAAI,GAAG,EAAE;AACL,gBAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC5B;;YAGD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AAC1D,YAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,CAAA,CAAE,CAAC,CAAC;aACpD;;YAGD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAE3D,IAAI,CAAC,IAAI,EAAE;AACP,gBAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,CAAA,CAAE,CAAC,CAAC;aAChE;YAED,IAAI,CAAC,QAAQ,EAAE;AACX,gBAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,SAAS,CAAA,CAAE,CAAC,CAAC;aAC7D;;YAGD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;AAG5D,YAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;;AAG/E,YAAA,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAE9E,IAAI,MAAM,EAAE;gBACR,MAAM,CAAC,KAAK,CAAC,CAAC;aACjB;AAED,YAAA,OAAO,KAAK,CAAC;SAEhB;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,OAAO,EAAE;gBACT,OAAO,CAAC,KAAc,CAAC,CAAC;aAC3B;AACD,YAAA,MAAM,KAAK,CAAC;SACf;KACJ;AAED;;AAEG;AACK,IAAA,MAAM,oBAAoB,CAC9B,YASE,EACF,SAA2B,EAAA;AAE3B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAChC,YAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAA+B,CAAC;AAE5D,YAAA,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE;AACnC,gBAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,oBAAA,IAAI;;AAEA,wBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACjE,wBAAA,IAAI,YAAY,GAAG,CAAC,EAAE;4BAClB,OAAO,CAAC,IAAI,CAAC,CAAA,mBAAA,EAAsB,IAAI,CAAC,SAAS,CAAE,CAAA,CAAC,CAAC;4BACrD,SAAS;yBACZ;;wBAGD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;wBAC5D,IAAI,CAAC,WAAW,EAAE;4BACd,OAAO,CAAC,IAAI,CAAC,CAAA,wBAAA,EAA2B,IAAI,CAAC,SAAS,CAAE,CAAA,CAAC,CAAC;4BAC1D,SAAS;yBACZ;;wBAGD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;;wBAGxD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;qBAElE;oBAAC,OAAO,KAAK,EAAE;wBACZ,OAAO,CAAC,KAAK,CAAC,CAA2B,wBAAA,EAAA,IAAI,CAAC,SAAS,CAAI,EAAA,CAAA,EAAE,KAAK,CAAC,CAAC;qBACvE;iBACJ;aACJ;SACJ;KACJ;AAED;;AAEG;IACK,MAAM,eAAe,CAAC,IAAgB,EAAA;QAC1C,MAAM,WAAW,GAAgB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAgB,CAAC;QACtH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAEtC,QAAA,IAAI;YACA,OAAO,MAAM,IAAI,OAAO,CAA0B,CAAC,OAAO,EAAE,MAAM,KAAI;gBAClE,IAAI,CAAC,UAAU,CAAC,IAAI,CAChB,GAAG,EACH,CAAC,OAAO,KAAI;AACR,oBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;;AAEzB,oBAAA,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;oBAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AACrB,iBAAC,EACD,SAAS,EACT,CAAC,KAAK,KAAI;AACN,oBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;oBACzB,MAAM,CAAC,KAAK,CAAC,CAAC;AAClB,iBAAC,CACJ,CAAC;AACN,aAAC,CAAC,CAAC;SACN;QAAC,OAAO,KAAK,EAAE;AACZ,YAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACzB,YAAA,MAAM,KAAK,CAAC;SACf;KACJ;AAED;;AAEG;AACK,IAAA,sBAAsB,CAC1B,QAAoC,EACpC,YAAoB,EACpB,OAAgC,EAAA;AAEhC,QAAA,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;QAEjD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;AAChE,YAAA,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpE,YAAA,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC;SAC1B;AAAM,aAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACzC,YAAA,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC;SAChC;AAAM,aAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAC3C,YAAA,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC;SACnC;AAAM,aAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AAC5C,YAAA,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC;SACnC;aAAM;;AAEH,YAAA,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC;SAC1B;AAED,QAAA,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;KAC/B;AAED;;;;;;;AAOG;IACH,MAAM,WAAW,CACb,GAAW,EACX,SAAiB,EACjB,MAAmD,EACnD,UAA2C,EAC3C,OAAgC,EAAA;AAEhC,QAAA,IAAI;;YAEA,IAAI,GAAG,EAAE;AACL,gBAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC5B;;YAGD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AAC1D,YAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,CAAA,CAAE,CAAC,CAAC;aACpD;AAED,YAAA,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;SAEjF;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,OAAO,EAAE;gBACT,OAAO,CAAC,KAAc,CAAC,CAAC;aAC3B;AACD,YAAA,MAAM,KAAK,CAAC;SACf;KACJ;AAED;;;;;;AAMG;IACH,MAAM,kBAAkB,CACpB,KAAa,EACb,MAAmD,EACnD,UAA2C,EAC3C,OAAgC,EAAA;AAEhC,QAAA,IAAI;;YAEA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,EAAE;AACP,gBAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,CAAA,CAAE,CAAC,CAAC;aACrE;;YAGD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEjD,IAAI,MAAM,EAAE;gBACR,MAAM,CAAC,OAAO,CAAC,CAAC;aACnB;AAED,YAAA,OAAO,OAAO,CAAC;SAElB;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,OAAO,EAAE;gBACT,OAAO,CAAC,KAAc,CAAC,CAAC;aAC3B;AACD,YAAA,MAAM,KAAK,CAAC;SACf;KACJ;AAED;;;;;;;;AAQG;AACH,IAAA,MAAM,SAAS,CACX,GAAW,EACX,SAAiB,EACjB,QAA6B,EAC7B,MAAqC,EACrC,UAA2C,EAC3C,OAAgC,EAAA;AAEhC,QAAA,IAAI;;YAEA,IAAI,GAAG,EAAE;AACL,gBAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC5B;;YAGD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AAC1D,YAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,CAAA,CAAE,CAAC,CAAC;aACpD;;YAGD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,EAAE;AACP,gBAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,CAAA,CAAE,CAAC,CAAC;aACjE;;YAGD,MAAM,KAAK,GAAG,IAAIA,gBAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;;YAGxC,MAAM,WAAW,GAAgB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAgB,CAAC;AACtH,YAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;YACtC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;AAEpE,YAAA,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAE7B,IAAI,MAAM,EAAE;gBACR,MAAM,CAAC,KAAK,CAAC,CAAC;aACjB;AAED,YAAA,OAAO,KAAK,CAAC;SAEhB;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,OAAO,EAAE;gBACT,OAAO,CAAC,KAAc,CAAC,CAAC;aAC3B;AACD,YAAA,MAAM,KAAK,CAAC;SACf;KACJ;AAED;;;AAGG;AACH,IAAA,gBAAgB,CAAC,SAAiB,EAAA;AAM9B,QAAA,IAAI;YACA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,UAAU,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC;YAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;AAAE,gBAAA,OAAO,IAAI,CAAC;AAEpD,YAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AACrF,YAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;;YAGlC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;YAEtF,OAAO;gBACH,QAAQ;gBACR,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC;gBACrC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC;gBACnC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC;aACxC,CAAC;SACL;QAAC,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;AACvD,YAAA,OAAO,IAAI,CAAC;SACf;KACJ;AAED;;;AAGG;AACH,IAAA,kBAAkB,CAAC,SAAiB,EAAA;AAQhC,QAAA,IAAI;YACA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,UAAU,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC;YAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;gBAAE,OAAO,IAAI,CAAC;AAEpD,YAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AACrF,YAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;;AAGlC,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;YAEtF,OAAO;gBACH,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;gBAC9B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;gBAC/B,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;gBACjC,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC;gBACvC,QAAQ;aACX,CAAC;SACL;QAAC,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;AACzD,YAAA,OAAO,IAAI,CAAC;SACf;KACJ;AAED;;;AAGG;AACH,IAAA,yBAAyB,CAAC,KAAa,EAAA;AAUnC,QAAA,IAAI;YACA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACtD,YAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;AAAE,gBAAA,OAAO,IAAI,CAAC;AAEpD,YAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AACrF,YAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAElC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACzF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,EAAE,CAAC;YAClB,IAAI,MAAM,GAAG,GAAG,CAAC;AAEjB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;AACjC,gBAAA,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM;oBAAE,MAAM;AAEzC,gBAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3F,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACpD,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACvD,gBAAA,MAAM,YAAY,GAAqC;oBACnD,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;iBACrC,CAAC;AAEF,gBAAA,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;gBACxF,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAU,CAAC;gBAE9D,MAAM,CAAC,IAAI,CAAC;AACR,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,OAAO;AACrC,oBAAA,WAAW,EAAE,gBAAgB,CAAC,YAAY,CAAC,IAAI,MAAM;oBACrD,YAAY;AACf,iBAAA,CAAC,CAAC;gBAEH,MAAM,IAAI,EAAE,CAAC;aAChB;AAED,YAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;SAC3C;QAAC,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;AACxD,YAAA,OAAO,IAAI,CAAC;SACf;KACJ;AAED;;;AAGG;AACH,IAAA,kBAAkB,CAAC,SAAiB,EAAA;AAUhC,QAAA,IAAI;YACA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,UAAU,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC;YAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;AAAE,gBAAA,OAAO,IAAI,CAAC;AAEpD,YAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AACrF,YAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;;YAGlC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACzF,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,EAAE,CAAC;YAClB,IAAI,MAAM,GAAG,GAAG,CAAC;;AAGjB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;AACjC,gBAAA,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM;oBAAE,MAAM;AAEzC,gBAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3F,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACpD,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACvD,gBAAA,MAAM,YAAY,GAAqC;oBACnD,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;iBACrC,CAAC;AAEF,gBAAA,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;gBACxF,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAU,CAAC;gBAE9D,MAAM,CAAC,IAAI,CAAC;AACR,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,OAAO;AACrC,oBAAA,WAAW,EAAE,gBAAgB,CAAC,YAAY,CAAC,IAAI,MAAM;oBACrD,YAAY;AACf,iBAAA,CAAC,CAAC;AAEH,gBAAA,MAAM,IAAI,EAAE,CAAC;aAChB;AAED,YAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;SAC3C;QAAC,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;AACxD,YAAA,OAAO,IAAI,CAAC;SACf;KACJ;AAED;;;AAGG;AACH,IAAA,gBAAgB,CAAC,SAAiB,EAAA;AAS9B,QAAA,IAAI;YACA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,UAAU,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC;YAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;AAAE,gBAAA,OAAO,IAAI,CAAC;AAEpD,YAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AACrF,YAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;;YAGlC,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAClD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAE1C,IAAI,MAAM,GAAG,GAAG,CAAC;;AAGjB,YAAA,MAAM,IAAI,iBAAiB,GAAG,EAAE,CAAC;;YAGjC,MAAM,SAAS,GASV,EAAE,CAAC;AAER,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACpC,gBAAA,IAAI,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM;oBAAE,MAAM;AAE1C,gBAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACtD,gBAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;gBAChE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACzF,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;AAEzD,gBAAA,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;gBAClE,MAAM,IAAI,GAAG,CAAC;aACjB;;AAGD,YAAA,MAAM,IAAI,SAAS,GAAG,GAAG,CAAC;;YAG1B,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,GAAQ,KAAI;;AAE7D,gBAAA,OAAO,GAAG,CAAC;aACd,EAAE,CAAC,CAAC,CAAC;;AAEN,YAAA,MAAM,IAAI,SAAS,GAAG,CAAC,CAAC;;AAGxB,YAAA,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;AACzB,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAI,GAAW,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE;AACjD,oBAAA,IAAI,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM;wBAAE,MAAM;AAE1C,oBAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;oBAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3F,oBAAA,MAAM,KAAK,GAAqC;wBAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;wBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;wBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;wBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC;qBACrC,CAAC;AACF,oBAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;oBACjE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAE3F,oBAAA,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBACrD,MAAM,IAAI,GAAG,CAAC;iBACjB;aACJ;AAED,YAAA,OAAO,SAAS,CAAC;SACpB;QAAC,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;AACvD,YAAA,OAAO,IAAI,CAAC;SACf;KACJ;AAED;;AAEG;IACH,MAAM,IAAI,CAAC,YAAgC,EAAA;;AAEvC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC5B;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KAC/C;AAED;;AAEG;IACH,aAAa,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;KACtC;AAED;;AAEG;AACH,IAAA,YAAY,CAAC,KAAa,EAAA;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;KAC1C;AAED;;AAEG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAC3C;AAED;;AAEG;AACH,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC/C;AAED;;AAEG;AACH,IAAA,oBAAoB,CAAC,aAAyB,EAAA;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;KAC1D;AAED;;;AAGG;IACH,MAAM,kBAAkB,CAAC,KAAa,EAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAA,CAAE,CAAC,CAAC;SACnE;;AAGD,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAW,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;;QAGtC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC9C,QAAA,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AACtB,QAAA,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;;AAGhB,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,QAAA,OAAO,KAAK,CAAC;KAChB;AAED;;AAEG;IACH,UAAU,GAAA;AAON,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;KACnC;AAED;;AAEG;IACH,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;AAC3B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;SACvB;KACJ;AACJ;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stowkit/three-loader",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Three.js loader for StowKit asset packs",
5
5
  "main": "dist/stowkit-three-loader.js",
6
6
  "module": "dist/stowkit-three-loader.esm.js",
@@ -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;