@stowkit/three-loader 0.1.3 → 0.1.5
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 +23 -7
- package/dist/MeshParser.d.ts +9 -11
- package/dist/MeshParser.d.ts.map +1 -1
- package/dist/StowKitLoader.d.ts +13 -0
- package/dist/StowKitLoader.d.ts.map +1 -1
- package/dist/stowkit-three-loader.esm.js +107 -97
- package/dist/stowkit-three-loader.esm.js.map +1 -1
- package/dist/stowkit-three-loader.js +106 -96
- package/dist/stowkit-three-loader.js.map +1 -1
- package/package.json +5 -3
- package/public/draco/draco_decoder.js +33 -0
- package/public/draco/draco_decoder.wasm +0 -0
- package/public/draco/draco_wasm_wrapper.js +116 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stowkit-three-loader.esm.js","sources":["../src/MeshParser.ts","../src/StowKitLoader.ts"],"sourcesContent":["import * as THREE from 'three';\n\nexport interface MeshGeometryInfo {\n vertexCount: number;\n indexCount: number;\n vertexBufferOffset: number;\n indexBufferOffset: number;\n normalBufferOffset: number;\n uvBufferOffset: number;\n vertexBufferSize: number;\n indexBufferSize: number;\n normalBufferSize: number;\n uvBufferSize: number;\n materialIndex: 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 * 76) + \n (metadata.materialCount * 64) + \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\n const geometries: MeshGeometryInfo[] = [];\n for (let i = 0; i < metadata.meshGeometryCount; i++) {\n if (offset + 76 > 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 vertexBufferOffset: Number(metaView.getBigUint64(offset + 8, true)),\n indexBufferOffset: Number(metaView.getBigUint64(offset + 16, true)),\n normalBufferOffset: Number(metaView.getBigUint64(offset + 24, true)),\n uvBufferOffset: Number(metaView.getBigUint64(offset + 32, true)),\n vertexBufferSize: Number(metaView.getBigUint64(offset + 40, true)),\n indexBufferSize: Number(metaView.getBigUint64(offset + 48, true)),\n normalBufferSize: Number(metaView.getBigUint64(offset + 56, true)),\n uvBufferSize: Number(metaView.getBigUint64(offset + 64, true)),\n materialIndex: metaView.getUint32(offset + 72, true)\n };\n geometries.push(geo);\n offset += 76; // Size of MeshGeometryInfo\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 mesh data\n */\n static createGeometry(geoInfo: MeshGeometryInfo, dataBlob: Uint8Array): THREE.BufferGeometry {\n console.log('Creating geometry:', {\n vertexCount: geoInfo.vertexCount,\n indexCount: geoInfo.indexCount,\n vertexOffset: geoInfo.vertexBufferOffset,\n vertexSize: geoInfo.vertexBufferSize,\n dataBlobSize: dataBlob.length\n });\n \n const geometry = new THREE.BufferGeometry();\n const dataView = new DataView(dataBlob.buffer, dataBlob.byteOffset, dataBlob.byteLength);\n \n // Extract vertex positions (3 floats per vertex)\n if (geoInfo.vertexBufferSize > 0 && geoInfo.vertexBufferOffset + geoInfo.vertexBufferSize <= dataBlob.length) {\n const positions = new Float32Array(geoInfo.vertexCount * 3);\n for (let i = 0; i < geoInfo.vertexCount * 3; i++) {\n positions[i] = dataView.getFloat32(geoInfo.vertexBufferOffset + i * 4, true);\n }\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n console.log('Added positions:', positions.slice(0, 9)); // First 3 vertices\n } else {\n console.warn('No vertex data or out of bounds');\n }\n \n // Extract normals\n if (geoInfo.normalBufferSize > 0 && geoInfo.normalBufferOffset + geoInfo.normalBufferSize <= dataBlob.length) {\n const normals = new Float32Array(geoInfo.vertexCount * 3);\n for (let i = 0; i < geoInfo.vertexCount * 3; i++) {\n normals[i] = dataView.getFloat32(geoInfo.normalBufferOffset + i * 4, true);\n }\n geometry.setAttribute('normal', new THREE.BufferAttribute(normals, 3));\n } else {\n // Compute normals if not provided\n geometry.computeVertexNormals();\n }\n \n // Extract UVs\n if (geoInfo.uvBufferSize > 0 && geoInfo.uvBufferOffset + geoInfo.uvBufferSize <= dataBlob.length) {\n const uvs = new Float32Array(geoInfo.vertexCount * 2);\n for (let i = 0; i < geoInfo.vertexCount * 2; i += 2) {\n uvs[i] = dataView.getFloat32(geoInfo.uvBufferOffset + i * 4, true); // U\n uvs[i + 1] = 1.0 - dataView.getFloat32(geoInfo.uvBufferOffset + (i + 1) * 4, true); // V (flipped)\n }\n geometry.setAttribute('uv', new THREE.BufferAttribute(uvs, 2));\n }\n \n // Extract indices\n if (geoInfo.indexCount > 0 && geoInfo.indexBufferOffset + geoInfo.indexBufferSize <= dataBlob.length) {\n const indices = new Uint32Array(geoInfo.indexCount);\n \n // Read the first index to determine the base offset\n let minIndex = Number.MAX_SAFE_INTEGER;\n for (let i = 0; i < geoInfo.indexCount; i++) {\n const index = dataView.getUint32(geoInfo.indexBufferOffset + i * 4, true);\n if (index < minIndex) minIndex = index;\n }\n \n // Read indices again and offset them to start from 0\n for (let i = 0; i < geoInfo.indexCount; i++) {\n const absoluteIndex = dataView.getUint32(geoInfo.indexBufferOffset + i * 4, true);\n indices[i] = absoluteIndex - minIndex;\n }\n \n geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n console.log(`Added indices (offset by ${minIndex}):`, indices.slice(0, 12)); // First 4 triangles\n } else if (geoInfo.indexCount > 0) {\n console.warn('Index data out of bounds');\n }\n \n // Ensure we have normals (compute if missing)\n if (!geometry.attributes.normal) {\n geometry.computeVertexNormals();\n }\n \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 buildScene(parsedData: ReturnType<typeof MeshParser.parseMeshData>, dataBlob: Uint8Array): 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 = this.createGeometry(geoInfo, dataBlob);\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 geometries.forEach((geoInfo, index) => {\n console.log(`Creating direct mesh ${index}: materialIndex=${geoInfo.materialIndex}, vertices=${geoInfo.vertexCount}`);\n const geometry = this.createGeometry(geoInfo, dataBlob);\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 { 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 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\r\n const transcoderPath = parameters?.transcoderPath || '/basis/';\r\n this.ktx2Loader = new KTX2Loader(manager);\r\n this.ktx2Loader.setTranscoderPath(transcoderPath);\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 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 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\r\n const scene = MeshParser.buildScene(parsedData, data);\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 < 148) 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 TextureMetadata structure\r\n const stringIdBytes = metadata.slice(20, 148);\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: view.getUint32(12, true) === 1,\r\n channelFormat: view.getUint32(16, 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 (76 bytes each)\r\n offset += meshGeometryCount * 76;\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 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 (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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"}
|