@stowkit/three-loader 0.1.11 → 0.1.13

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
@@ -58,10 +58,10 @@ interface StowKitLoaderOptions {
58
58
 
59
59
  **Examples:**
60
60
  ```typescript
61
- // Default paths (recommended)
61
+ // Load from URL
62
62
  const pack = await StowKitLoader.load('assets.stow');
63
63
 
64
- // Custom paths
64
+ // Load with custom paths
65
65
  const pack = await StowKitLoader.load('game.stow', {
66
66
  basisPath: '/custom/basis/',
67
67
  dracoPath: '/custom/draco/',
@@ -69,87 +69,65 @@ const pack = await StowKitLoader.load('game.stow', {
69
69
  });
70
70
  ```
71
71
 
72
- ### Opening Packs
72
+ #### `StowKitLoader.loadFromMemory(data: ArrayBuffer | Blob | File, options?: StowKitLoaderOptions): Promise<StowKitPack>`
73
73
 
74
- #### `openPack(url: string): Promise<void>`
75
-
76
- Open a .stow pack file from a URL. Call this once, then load multiple assets.
74
+ Load a .stow pack from memory. Useful for cached data or file inputs.
77
75
 
76
+ **Examples:**
78
77
  ```typescript
79
- await loader.openPack('assets.stow');
80
- ```
78
+ // From cached blob storage
79
+ const cachedBlob = await cache.get('assets.stow');
80
+ const pack = await StowKitLoader.loadFromMemory(cachedBlob);
81
81
 
82
- #### `open(fileOrBuffer: ArrayBuffer | File): Promise<boolean>`
83
-
84
- Open a pack from a File or ArrayBuffer.
85
-
86
- ```typescript
87
82
  // From file input
88
83
  const file = input.files[0];
89
- await loader.open(file);
84
+ const pack = await StowKitLoader.loadFromMemory(file);
90
85
 
91
- // From fetch
92
- const response = await fetch('assets.stow');
93
- const buffer = await response.arrayBuffer();
94
- await loader.open(buffer);
86
+ // From ArrayBuffer
87
+ const buffer = new ArrayBuffer(...);
88
+ const pack = await StowKitLoader.loadFromMemory(buffer);
95
89
  ```
96
90
 
97
- ### Loading Meshes
91
+ ### StowKitPack Methods
98
92
 
99
- #### `loadMesh(url: string, assetPath: string, onLoad?, onProgress?, onError?): Promise<THREE.Group>`
93
+ Once you have a pack loaded, use these methods to load assets:
100
94
 
101
- Load a mesh asset with automatic texture and material loading.
95
+ ### Loading Meshes
102
96
 
103
- **Parameters:**
104
- - `url` - URL to .stow file (empty string if already opened)
105
- - `assetPath` - Canonical path to mesh within pack
106
- - `onLoad` - Optional callback when loading completes
107
- - `onProgress` - Optional progress callback
108
- - `onError` - Optional error callback
97
+ #### `pack.loadMesh(assetPath: string): Promise<THREE.Group>`
109
98
 
110
- **Returns:** `THREE.Group` containing the mesh hierarchy
99
+ Load a mesh by its canonical path/name. Automatically loads and applies textures and materials.
111
100
 
112
- **Example:**
113
101
  ```typescript
114
- // Simple async/await
115
- const mesh = await loader.loadMesh('', 'models/character.mesh');
116
- scene.add(mesh);
102
+ const character = await pack.loadMesh('models/character');
103
+ const tree = await pack.loadMesh('models/tree');
104
+ const building = await pack.loadMesh('models/building');
117
105
 
118
- // With callbacks (Three.js style)
119
- loader.loadMesh('assets.stow', 'models/tree.mesh',
120
- (scene) => {
121
- threeScene.add(scene);
122
- },
123
- (progress) => console.log('Loading...', progress),
124
- (error) => console.error('Failed:', error)
125
- );
106
+ scene.add(character);
107
+ scene.add(tree);
108
+ scene.add(building);
126
109
  ```
127
110
 
128
111
  **What you get:**
129
- - Complete scene hierarchy with nodes
130
- - All geometries (vertices, normals, UVs, indices)
131
- - Materials with properties applied (colors, etc.)
132
- - Textures automatically loaded and applied to materials
133
- - Transforms (position, rotation, scale) preserved
112
+ - Complete scene hierarchy with nodes
113
+ - Draco-decompressed geometry (vertices, normals, UVs, indices)
114
+ - Materials with colors, properties applied
115
+ - Textures automatically loaded and applied
116
+ - Transforms (position, rotation, scale) preserved
134
117
 
135
118
  ### Loading Textures
136
119
 
137
- #### `loadTexture(url: string, assetPath: string, onLoad?, onProgress?, onError?): Promise<THREE.CompressedTexture>`
120
+ #### `pack.loadTexture(assetPath: string): Promise<THREE.CompressedTexture>`
138
121
 
139
- Load a texture asset (KTX2 format).
122
+ Load a KTX2 texture by its canonical path/name.
140
123
 
141
124
  ```typescript
142
- const texture = await loader.loadTexture('', 'textures/wood.ktx2');
143
- material.map = texture;
144
- material.needsUpdate = true;
145
- ```
125
+ const wood = await pack.loadTexture('textures/wood');
126
+ const metal = await pack.loadTexture('textures/metal');
146
127
 
147
- #### `loadTextureByIndex(index: number, onLoad?, onProgress?, onError?): Promise<THREE.CompressedTexture>`
148
-
149
- Load a texture by its asset index (when you don't have the path).
150
-
151
- ```typescript
152
- const texture = await loader.loadTextureByIndex(5);
128
+ material.map = wood;
129
+ material.roughnessMap = metal;
130
+ material.needsUpdate = true;
153
131
  ```
154
132
 
155
133
  ### Loading Audio
@@ -404,64 +382,73 @@ const mesh = await loader.loadMesh('', 'models/character.mesh');
404
382
 
405
383
  ## Advanced Usage
406
384
 
407
- ### Multiple Assets from Same Pack
385
+ ### Loading Multiple Assets from Same Pack
408
386
 
409
387
  ```typescript
410
- // Open once
411
- await loader.openPack('assets.stow');
388
+ // Load pack once
389
+ const pack = await StowKitLoader.load('assets.stow');
390
+
391
+ // Load many assets by name
392
+ const char1 = await pack.loadMesh('models/char1');
393
+ const char2 = await pack.loadMesh('models/char2');
394
+ const tex1 = await pack.loadTexture('textures/diffuse');
395
+ const tex2 = await pack.loadTexture('textures/normal');
396
+ const bgm = await pack.loadAudio('sounds/bgm', listener);
412
397
 
413
- // Load many (no URL needed)
414
- const mesh1 = await loader.loadMesh('', 'models/char1.mesh');
415
- const mesh2 = await loader.loadMesh('', 'models/char2.mesh');
416
- const tex1 = await loader.loadTexture('', 'textures/t1.ktx2');
417
- const tex2 = await loader.loadTexture('', 'textures/t2.ktx2');
398
+ scene.add(char1);
399
+ scene.add(char2);
418
400
  ```
419
401
 
420
402
  ### Inspect Before Loading
421
403
 
422
404
  ```typescript
423
- await loader.openPack('assets.stow');
405
+ const pack = await StowKitLoader.load('assets.stow');
424
406
 
425
407
  // List all assets
426
- const assets = loader.listAssets();
408
+ const assets = pack.listAssets();
427
409
  const meshes = assets.filter(a => a.type === 1); // Type 1 = Static Mesh
428
410
  const textures = assets.filter(a => a.type === 2); // Type 2 = Texture
429
411
 
412
+ console.log(`Pack contains ${assets.length} assets`);
413
+ meshes.forEach(m => console.log(`Mesh: ${m.name}`));
414
+
430
415
  // Get material info before loading
431
- const materials = loader.getMeshMaterials('models/character.mesh');
432
- materials.forEach(mat => {
433
- console.log(`Material "${mat.name}" needs:`, mat.properties.map(p => p.textureId).filter(Boolean));
416
+ const materials = pack.getMeshMaterials('models/character');
417
+ materials?.forEach(mat => {
418
+ console.log(`Material "${mat.name}" schema: ${mat.schemaId}`);
419
+ mat.properties.forEach(p => {
420
+ if (p.textureId) console.log(` Needs texture: ${p.textureId}`);
421
+ });
434
422
  });
435
-
436
- // Preload textures
437
- for (const mat of materials) {
438
- for (const prop of mat.properties) {
439
- if (prop.textureId) {
440
- await loader.loadTexture('', prop.textureId);
441
- }
442
- }
443
- }
444
-
445
- // Now load the mesh (textures already cached)
446
- const mesh = await loader.loadMesh('', 'models/character.mesh');
447
423
  ```
448
424
 
449
425
  ### Error Handling
450
426
 
451
427
  ```typescript
452
428
  try {
453
- const mesh = await loader.loadMesh('assets.stow', 'models/character.mesh');
429
+ const pack = await StowKitLoader.load('assets.stow');
430
+ const mesh = await pack.loadMesh('models/character');
454
431
  scene.add(mesh);
455
432
  } catch (error) {
456
- console.error('Failed to load mesh:', error.message);
433
+ console.error('Failed to load:', error.message);
434
+ }
435
+ ```
436
+
437
+ ### Using Cached Data
438
+
439
+ ```typescript
440
+ // Example with IndexedDB or cache storage
441
+ const cachedData = await caches.match('assets.stow');
442
+ if (cachedData) {
443
+ const blob = await cachedData.blob();
444
+ const pack = await StowKitLoader.loadFromMemory(blob);
445
+ } else {
446
+ const pack = await StowKitLoader.load('assets.stow');
447
+ // Cache for next time...
457
448
  }
458
449
 
459
- // Or with callbacks
460
- loader.loadMesh('assets.stow', 'models/tree.mesh',
461
- (scene) => threeScene.add(scene),
462
- undefined,
463
- (error) => console.error('Error:', error)
464
- );
450
+ // Load assets
451
+ const mesh = await pack.loadMesh('models/character');
465
452
  ```
466
453
 
467
454
  ## Asset Types
@@ -489,12 +476,12 @@ Place these files in your public folder:
489
476
 
490
477
  ```
491
478
  public/
492
- ├── stowkit_reader.wasm # WASM reader module (copy from node_modules/@stowkit/reader/dist/)
493
- └── stowkit/ # Auto-copied by @stowkit/three-loader on install
494
- ├── basis/ # Basis Universal transcoder (for textures) - included!
479
+ ├── stowkit_reader.wasm # WASM reader (auto-copied!)
480
+ └── stowkit/ # Auto-copied on install
481
+ ├── basis/ # Basis Universal transcoder
495
482
  │ ├── basis_transcoder.js
496
483
  │ └── basis_transcoder.wasm
497
- └── draco/ # Draco decoder (for meshes) - included!
484
+ └── draco/ # Draco decoder
498
485
  ├── draco_decoder.js
499
486
  ├── draco_decoder.wasm
500
487
  └── draco_wasm_wrapper.js
@@ -502,11 +489,15 @@ public/
502
489
 
503
490
  **Setup:**
504
491
 
505
- The package automatically includes and copies all decoder files on install!
492
+ Everything is automatically copied on install! Just:
493
+
494
+ ```bash
495
+ npm install @stowkit/three-loader
496
+ ```
497
+
498
+ All required files (WASM, Basis, Draco) are copied to your `public/` folder automatically.
506
499
 
507
- You only need to:
508
- 1. Copy `stowkit_reader.wasm` from `node_modules/@stowkit/reader/dist/` to `public/`
509
- 2. That's it! Basis and Draco decoders are included automatically.
500
+ **That's it!** No manual file copying needed.
510
501
 
511
502
  ### Three.js Version
512
503
 
@@ -33,9 +33,13 @@ export declare class StowKitLoader {
33
33
  private static dracoLoader;
34
34
  private static initialized;
35
35
  /**
36
- * Load a .stow pack file
36
+ * Load a .stow pack file from a URL
37
37
  */
38
38
  static load(url: string, options?: StowKitLoaderOptions): Promise<StowKitPack>;
39
+ /**
40
+ * Load a .stow pack from memory (ArrayBuffer, Blob, or File)
41
+ */
42
+ static loadFromMemory(data: ArrayBuffer | Blob | File, options?: StowKitLoaderOptions): Promise<StowKitPack>;
39
43
  /**
40
44
  * Initialize the loader (called automatically on first load)
41
45
  */
@@ -1 +1 @@
1
- {"version":3,"file":"StowKitLoader.d.ts","sourceRoot":"","sources":["../src/StowKitLoader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAC,MAAM,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAC,UAAU,CAA2B;IACpD,OAAO,CAAC,MAAM,CAAC,WAAW,CAA4B;IACtD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAS;IAEnC;;OAEG;WACU,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBpF;;OAEG;mBACkB,UAAU;CAwBlC"}
1
+ {"version":3,"file":"StowKitLoader.d.ts","sourceRoot":"","sources":["../src/StowKitLoader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAC,MAAM,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAC,UAAU,CAA2B;IACpD,OAAO,CAAC,MAAM,CAAC,WAAW,CAA4B;IACtD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAS;IAEnC;;OAEG;WACU,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBpF;;OAEG;WACU,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBlH;;OAEG;mBACkB,UAAU;CAwBlC"}
@@ -730,7 +730,7 @@ class StowKitPack {
730
730
  */
731
731
  class StowKitLoader {
732
732
  /**
733
- * Load a .stow pack file
733
+ * Load a .stow pack file from a URL
734
734
  */
735
735
  static async load(url, options) {
736
736
  // Initialize loaders if needed
@@ -748,6 +748,30 @@ class StowKitLoader {
748
748
  // Return pack wrapper
749
749
  return new StowKitPack(this.reader, this.ktx2Loader, this.dracoLoader);
750
750
  }
751
+ /**
752
+ * Load a .stow pack from memory (ArrayBuffer, Blob, or File)
753
+ */
754
+ static async loadFromMemory(data, options) {
755
+ // Initialize loaders if needed
756
+ if (!this.initialized) {
757
+ await this.initialize(options);
758
+ }
759
+ // Convert to ArrayBuffer if needed
760
+ let arrayBuffer;
761
+ if (data instanceof ArrayBuffer) {
762
+ arrayBuffer = data;
763
+ }
764
+ else if (data instanceof Blob || data instanceof File) {
765
+ arrayBuffer = await data.arrayBuffer();
766
+ }
767
+ else {
768
+ throw new Error('Data must be ArrayBuffer, Blob, or File');
769
+ }
770
+ // Open pack
771
+ await this.reader.open(arrayBuffer);
772
+ // Return pack wrapper
773
+ return new StowKitPack(this.reader, this.ktx2Loader, this.dracoLoader);
774
+ }
751
775
  /**
752
776
  * Initialize the loader (called automatically on first load)
753
777
  */
@@ -1 +1 @@
1
- {"version":3,"file":"stowkit-three-loader.esm.js","sources":["../src/MeshParser.ts","../src/StowKitPack.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\n/**\r\n * Represents an opened StowKit pack with methods to load assets by name\r\n */\r\nexport class StowKitPack {\r\n private reader: StowKitReader;\r\n private ktx2Loader: KTX2Loader;\r\n private dracoLoader: DRACOLoader;\r\n\r\n constructor(reader: StowKitReader, ktx2Loader: KTX2Loader, dracoLoader: DRACOLoader) {\r\n this.reader = reader;\r\n this.ktx2Loader = ktx2Loader;\r\n this.dracoLoader = dracoLoader;\r\n }\r\n\r\n /**\r\n * Load a mesh by its canonical path/name\r\n */\r\n async loadMesh(assetPath: string): Promise<THREE.Group> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Mesh 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: ${assetPath}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available: ${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 return scene;\r\n }\r\n\r\n /**\r\n * Load a texture by its canonical path/name\r\n */\r\n async loadTexture(assetPath: string): Promise<THREE.CompressedTexture> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Texture not found: ${assetPath}`);\r\n }\r\n\r\n // Read texture data\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data: ${assetPath}`);\r\n }\r\n\r\n // Load as KTX2\r\n return await this.loadKTX2Texture(data);\r\n }\r\n\r\n /**\r\n * Load audio by its canonical path/name\r\n */\r\n async loadAudio(assetPath: string, listener: THREE.AudioListener): Promise<THREE.Audio> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Audio not found: ${assetPath}`);\r\n }\r\n\r\n // 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: ${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 return audio;\r\n }\r\n\r\n /**\r\n * Get list of all assets in pack\r\n */\r\n listAssets() {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Get asset count\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get asset info by index\r\n */\r\n getAssetInfo(index: number): 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 * Load mesh by index\r\n */\r\n async loadMeshByIndex(index: number): Promise<THREE.Group> {\r\n const data = this.reader.readAssetData(index);\r\n const metadata = this.reader.readAssetMetadata(index);\r\n\r\n if (!data) throw new Error(`Failed to read mesh data for index ${index}`);\r\n if (!metadata) throw new Error(`No metadata for index ${index}`);\r\n\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n return await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n }\r\n\r\n /**\r\n * Load texture by index\r\n */\r\n async loadTextureByIndex(index: number): Promise<THREE.CompressedTexture> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) throw new Error(`Failed to read texture for index ${index}`);\r\n return await this.loadKTX2Texture(data);\r\n }\r\n\r\n /**\r\n * Create HTML audio preview element\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) throw new Error(`Failed to read audio for index ${index}`);\r\n\r\n const blob = new Blob([data as any], { type: 'audio/ogg' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n /**\r\n * Get audio metadata by path\r\n */\r\n getAudioMetadata(assetPath: string) {\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 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 }\r\n\r\n /**\r\n * Load material schema by index\r\n */\r\n loadMaterialSchemaByIndex(index: number) {\r\n return this.loadMaterialSchemaByIndex_internal(index);\r\n }\r\n\r\n /**\r\n * Get mesh materials by index\r\n */\r\n getMeshMaterialsByIndex(index: number) {\r\n return this.getMeshMaterialsByIndex_internal(index);\r\n }\r\n\r\n /**\r\n * Get material schema information\r\n */\r\n getMaterialSchema(assetPath: string) {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n return this.loadMaterialSchemaByIndex_internal(assetIndex);\r\n }\r\n\r\n /**\r\n * Get mesh materials information\r\n */\r\n getMeshMaterials(assetPath: string) {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n return this.getMeshMaterialsByIndex_internal(assetIndex);\r\n }\r\n\r\n /**\r\n * Close the pack and free resources\r\n */\r\n dispose(): void {\r\n this.reader.close();\r\n }\r\n\r\n // Private methods moved from StowKitLoader\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 const texture = await this.loadTexture(prop.textureId);\r\n this.applyTextureToMaterial(material, prop.fieldName, texture);\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 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 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 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 material.map = texture;\r\n }\r\n\r\n material.needsUpdate = true;\r\n }\r\n\r\n private loadMaterialSchemaByIndex_internal(index: number) {\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 }\r\n\r\n private getMeshMaterialsByIndex_internal(index: number) {\r\n const metadata = this.reader.readAssetMetadata(index);\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 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 offset += meshGeometryCount * 40;\r\n\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 offset += nodeCount * 116;\r\n offset += nodeCount * 4;\r\n\r\n for (const mat of materials) {\r\n for (let j = 0; j < mat.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 }\r\n}\r\n\r\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 { StowKitPack } from './StowKitPack';\r\n\r\nexport interface StowKitLoaderOptions {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/stowkit/basis/'\r\n */\r\n basisPath?: string;\r\n \r\n /**\r\n * Path to Draco decoder for mesh decompression\r\n * @default '/stowkit/draco/'\r\n */\r\n dracoPath?: 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/**\r\n * Three.js loader for StowKit asset packs\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const pack = await StowKitLoader.load('assets.stow');\r\n * const mesh = await pack.loadMesh('models/character');\r\n * const texture = await pack.loadTexture('textures/diffuse');\r\n * const audio = await pack.loadAudio('sounds/bgm', listener);\r\n * ```\r\n */\r\nexport class StowKitLoader {\r\n private static reader: StowKitReader | null = null;\r\n private static ktx2Loader: KTX2Loader | null = null;\r\n private static dracoLoader: DRACOLoader | null = null;\r\n private static initialized = false;\r\n\r\n /**\r\n * Load a .stow pack file\r\n */\r\n static async load(url: string, options?: StowKitLoaderOptions): Promise<StowKitPack> {\r\n // Initialize loaders if needed\r\n if (!this.initialized) {\r\n await this.initialize(options);\r\n }\r\n\r\n // Fetch the pack file\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n \r\n // Open pack\r\n await this.reader!.open(arrayBuffer);\r\n\r\n // Return pack wrapper\r\n return new StowKitPack(this.reader!, this.ktx2Loader!, this.dracoLoader!);\r\n }\r\n\r\n /**\r\n * Initialize the loader (called automatically on first load)\r\n */\r\n private static async initialize(options?: StowKitLoaderOptions): Promise<void> {\r\n const wasmPath = options?.wasmPath || '/stowkit_reader.wasm';\r\n const basisPath = options?.basisPath || '/stowkit/basis/';\r\n const dracoPath = options?.dracoPath || '/stowkit/draco/';\r\n\r\n // Initialize reader\r\n this.reader = new StowKitReader(wasmPath);\r\n await this.reader.init();\r\n\r\n // Setup KTX2 loader\r\n this.ktx2Loader = new KTX2Loader();\r\n this.ktx2Loader.setTranscoderPath(basisPath);\r\n\r\n // Setup Draco loader\r\n this.dracoLoader = new DRACOLoader();\r\n this.dracoLoader.setDecoderPath(dracoPath);\r\n\r\n // Detect support\r\n const tempRenderer = new THREE.WebGLRenderer();\r\n this.ktx2Loader.detectSupport(tempRenderer);\r\n tempRenderer.dispose();\r\n\r\n this.initialized = true;\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/StowKitPack.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\n/**\r\n * Represents an opened StowKit pack with methods to load assets by name\r\n */\r\nexport class StowKitPack {\r\n private reader: StowKitReader;\r\n private ktx2Loader: KTX2Loader;\r\n private dracoLoader: DRACOLoader;\r\n\r\n constructor(reader: StowKitReader, ktx2Loader: KTX2Loader, dracoLoader: DRACOLoader) {\r\n this.reader = reader;\r\n this.ktx2Loader = ktx2Loader;\r\n this.dracoLoader = dracoLoader;\r\n }\r\n\r\n /**\r\n * Load a mesh by its canonical path/name\r\n */\r\n async loadMesh(assetPath: string): Promise<THREE.Group> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Mesh 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: ${assetPath}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available: ${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 return scene;\r\n }\r\n\r\n /**\r\n * Load a texture by its canonical path/name\r\n */\r\n async loadTexture(assetPath: string): Promise<THREE.CompressedTexture> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Texture not found: ${assetPath}`);\r\n }\r\n\r\n // Read texture data\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data: ${assetPath}`);\r\n }\r\n\r\n // Load as KTX2\r\n return await this.loadKTX2Texture(data);\r\n }\r\n\r\n /**\r\n * Load audio by its canonical path/name\r\n */\r\n async loadAudio(assetPath: string, listener: THREE.AudioListener): Promise<THREE.Audio> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Audio not found: ${assetPath}`);\r\n }\r\n\r\n // 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: ${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 return audio;\r\n }\r\n\r\n /**\r\n * Get list of all assets in pack\r\n */\r\n listAssets() {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Get asset count\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get asset info by index\r\n */\r\n getAssetInfo(index: number): 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 * Load mesh by index\r\n */\r\n async loadMeshByIndex(index: number): Promise<THREE.Group> {\r\n const data = this.reader.readAssetData(index);\r\n const metadata = this.reader.readAssetMetadata(index);\r\n\r\n if (!data) throw new Error(`Failed to read mesh data for index ${index}`);\r\n if (!metadata) throw new Error(`No metadata for index ${index}`);\r\n\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n return await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n }\r\n\r\n /**\r\n * Load texture by index\r\n */\r\n async loadTextureByIndex(index: number): Promise<THREE.CompressedTexture> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) throw new Error(`Failed to read texture for index ${index}`);\r\n return await this.loadKTX2Texture(data);\r\n }\r\n\r\n /**\r\n * Create HTML audio preview element\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) throw new Error(`Failed to read audio for index ${index}`);\r\n\r\n const blob = new Blob([data as any], { type: 'audio/ogg' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n /**\r\n * Get audio metadata by path\r\n */\r\n getAudioMetadata(assetPath: string) {\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 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 }\r\n\r\n /**\r\n * Load material schema by index\r\n */\r\n loadMaterialSchemaByIndex(index: number) {\r\n return this.loadMaterialSchemaByIndex_internal(index);\r\n }\r\n\r\n /**\r\n * Get mesh materials by index\r\n */\r\n getMeshMaterialsByIndex(index: number) {\r\n return this.getMeshMaterialsByIndex_internal(index);\r\n }\r\n\r\n /**\r\n * Get material schema information\r\n */\r\n getMaterialSchema(assetPath: string) {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n return this.loadMaterialSchemaByIndex_internal(assetIndex);\r\n }\r\n\r\n /**\r\n * Get mesh materials information\r\n */\r\n getMeshMaterials(assetPath: string) {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n return this.getMeshMaterialsByIndex_internal(assetIndex);\r\n }\r\n\r\n /**\r\n * Close the pack and free resources\r\n */\r\n dispose(): void {\r\n this.reader.close();\r\n }\r\n\r\n // Private methods moved from StowKitLoader\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 const texture = await this.loadTexture(prop.textureId);\r\n this.applyTextureToMaterial(material, prop.fieldName, texture);\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 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 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 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 material.map = texture;\r\n }\r\n\r\n material.needsUpdate = true;\r\n }\r\n\r\n private loadMaterialSchemaByIndex_internal(index: number) {\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 }\r\n\r\n private getMeshMaterialsByIndex_internal(index: number) {\r\n const metadata = this.reader.readAssetMetadata(index);\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 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 offset += meshGeometryCount * 40;\r\n\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 offset += nodeCount * 116;\r\n offset += nodeCount * 4;\r\n\r\n for (const mat of materials) {\r\n for (let j = 0; j < mat.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 }\r\n}\r\n\r\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 { StowKitPack } from './StowKitPack';\r\n\r\nexport interface StowKitLoaderOptions {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/stowkit/basis/'\r\n */\r\n basisPath?: string;\r\n \r\n /**\r\n * Path to Draco decoder for mesh decompression\r\n * @default '/stowkit/draco/'\r\n */\r\n dracoPath?: 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/**\r\n * Three.js loader for StowKit asset packs\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const pack = await StowKitLoader.load('assets.stow');\r\n * const mesh = await pack.loadMesh('models/character');\r\n * const texture = await pack.loadTexture('textures/diffuse');\r\n * const audio = await pack.loadAudio('sounds/bgm', listener);\r\n * ```\r\n */\r\nexport class StowKitLoader {\r\n private static reader: StowKitReader | null = null;\r\n private static ktx2Loader: KTX2Loader | null = null;\r\n private static dracoLoader: DRACOLoader | null = null;\r\n private static initialized = false;\r\n\r\n /**\r\n * Load a .stow pack file from a URL\r\n */\r\n static async load(url: string, options?: StowKitLoaderOptions): Promise<StowKitPack> {\r\n // Initialize loaders if needed\r\n if (!this.initialized) {\r\n await this.initialize(options);\r\n }\r\n\r\n // Fetch the pack file\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n \r\n // Open pack\r\n await this.reader!.open(arrayBuffer);\r\n\r\n // Return pack wrapper\r\n return new StowKitPack(this.reader!, this.ktx2Loader!, this.dracoLoader!);\r\n }\r\n\r\n /**\r\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\r\n */\r\n static async loadFromMemory(data: ArrayBuffer | Blob | File, options?: StowKitLoaderOptions): Promise<StowKitPack> {\r\n // Initialize loaders if needed\r\n if (!this.initialized) {\r\n await this.initialize(options);\r\n }\r\n\r\n // Convert to ArrayBuffer if needed\r\n let arrayBuffer: ArrayBuffer;\r\n if (data instanceof ArrayBuffer) {\r\n arrayBuffer = data;\r\n } else if (data instanceof Blob || data instanceof File) {\r\n arrayBuffer = await data.arrayBuffer();\r\n } else {\r\n throw new Error('Data must be ArrayBuffer, Blob, or File');\r\n }\r\n\r\n // Open pack\r\n await this.reader!.open(arrayBuffer);\r\n\r\n // Return pack wrapper\r\n return new StowKitPack(this.reader!, this.ktx2Loader!, this.dracoLoader!);\r\n }\r\n\r\n /**\r\n * Initialize the loader (called automatically on first load)\r\n */\r\n private static async initialize(options?: StowKitLoaderOptions): Promise<void> {\r\n const wasmPath = options?.wasmPath || '/stowkit_reader.wasm';\r\n const basisPath = options?.basisPath || '/stowkit/basis/';\r\n const dracoPath = options?.dracoPath || '/stowkit/draco/';\r\n\r\n // Initialize reader\r\n this.reader = new StowKitReader(wasmPath);\r\n await this.reader.init();\r\n\r\n // Setup KTX2 loader\r\n this.ktx2Loader = new KTX2Loader();\r\n this.ktx2Loader.setTranscoderPath(basisPath);\r\n\r\n // Setup Draco loader\r\n this.dracoLoader = new DRACOLoader();\r\n this.dracoLoader.setDecoderPath(dracoPath);\r\n\r\n // Detect support\r\n const tempRenderer = new THREE.WebGLRenderer();\r\n this.ktx2Loader.detectSupport(tempRenderer);\r\n tempRenderer.dispose();\r\n\r\n this.initialized = true;\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -751,7 +751,7 @@ class StowKitPack {
751
751
  */
752
752
  class StowKitLoader {
753
753
  /**
754
- * Load a .stow pack file
754
+ * Load a .stow pack file from a URL
755
755
  */
756
756
  static async load(url, options) {
757
757
  // Initialize loaders if needed
@@ -769,6 +769,30 @@ class StowKitLoader {
769
769
  // Return pack wrapper
770
770
  return new StowKitPack(this.reader, this.ktx2Loader, this.dracoLoader);
771
771
  }
772
+ /**
773
+ * Load a .stow pack from memory (ArrayBuffer, Blob, or File)
774
+ */
775
+ static async loadFromMemory(data, options) {
776
+ // Initialize loaders if needed
777
+ if (!this.initialized) {
778
+ await this.initialize(options);
779
+ }
780
+ // Convert to ArrayBuffer if needed
781
+ let arrayBuffer;
782
+ if (data instanceof ArrayBuffer) {
783
+ arrayBuffer = data;
784
+ }
785
+ else if (data instanceof Blob || data instanceof File) {
786
+ arrayBuffer = await data.arrayBuffer();
787
+ }
788
+ else {
789
+ throw new Error('Data must be ArrayBuffer, Blob, or File');
790
+ }
791
+ // Open pack
792
+ await this.reader.open(arrayBuffer);
793
+ // Return pack wrapper
794
+ return new StowKitPack(this.reader, this.ktx2Loader, this.dracoLoader);
795
+ }
772
796
  /**
773
797
  * Initialize the loader (called automatically on first load)
774
798
  */
@@ -1 +1 @@
1
- {"version":3,"file":"stowkit-three-loader.js","sources":["../src/MeshParser.ts","../src/StowKitPack.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\n/**\r\n * Represents an opened StowKit pack with methods to load assets by name\r\n */\r\nexport class StowKitPack {\r\n private reader: StowKitReader;\r\n private ktx2Loader: KTX2Loader;\r\n private dracoLoader: DRACOLoader;\r\n\r\n constructor(reader: StowKitReader, ktx2Loader: KTX2Loader, dracoLoader: DRACOLoader) {\r\n this.reader = reader;\r\n this.ktx2Loader = ktx2Loader;\r\n this.dracoLoader = dracoLoader;\r\n }\r\n\r\n /**\r\n * Load a mesh by its canonical path/name\r\n */\r\n async loadMesh(assetPath: string): Promise<THREE.Group> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Mesh 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: ${assetPath}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available: ${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 return scene;\r\n }\r\n\r\n /**\r\n * Load a texture by its canonical path/name\r\n */\r\n async loadTexture(assetPath: string): Promise<THREE.CompressedTexture> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Texture not found: ${assetPath}`);\r\n }\r\n\r\n // Read texture data\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data: ${assetPath}`);\r\n }\r\n\r\n // Load as KTX2\r\n return await this.loadKTX2Texture(data);\r\n }\r\n\r\n /**\r\n * Load audio by its canonical path/name\r\n */\r\n async loadAudio(assetPath: string, listener: THREE.AudioListener): Promise<THREE.Audio> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Audio not found: ${assetPath}`);\r\n }\r\n\r\n // 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: ${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 return audio;\r\n }\r\n\r\n /**\r\n * Get list of all assets in pack\r\n */\r\n listAssets() {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Get asset count\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get asset info by index\r\n */\r\n getAssetInfo(index: number): 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 * Load mesh by index\r\n */\r\n async loadMeshByIndex(index: number): Promise<THREE.Group> {\r\n const data = this.reader.readAssetData(index);\r\n const metadata = this.reader.readAssetMetadata(index);\r\n\r\n if (!data) throw new Error(`Failed to read mesh data for index ${index}`);\r\n if (!metadata) throw new Error(`No metadata for index ${index}`);\r\n\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n return await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n }\r\n\r\n /**\r\n * Load texture by index\r\n */\r\n async loadTextureByIndex(index: number): Promise<THREE.CompressedTexture> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) throw new Error(`Failed to read texture for index ${index}`);\r\n return await this.loadKTX2Texture(data);\r\n }\r\n\r\n /**\r\n * Create HTML audio preview element\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) throw new Error(`Failed to read audio for index ${index}`);\r\n\r\n const blob = new Blob([data as any], { type: 'audio/ogg' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n /**\r\n * Get audio metadata by path\r\n */\r\n getAudioMetadata(assetPath: string) {\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 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 }\r\n\r\n /**\r\n * Load material schema by index\r\n */\r\n loadMaterialSchemaByIndex(index: number) {\r\n return this.loadMaterialSchemaByIndex_internal(index);\r\n }\r\n\r\n /**\r\n * Get mesh materials by index\r\n */\r\n getMeshMaterialsByIndex(index: number) {\r\n return this.getMeshMaterialsByIndex_internal(index);\r\n }\r\n\r\n /**\r\n * Get material schema information\r\n */\r\n getMaterialSchema(assetPath: string) {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n return this.loadMaterialSchemaByIndex_internal(assetIndex);\r\n }\r\n\r\n /**\r\n * Get mesh materials information\r\n */\r\n getMeshMaterials(assetPath: string) {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n return this.getMeshMaterialsByIndex_internal(assetIndex);\r\n }\r\n\r\n /**\r\n * Close the pack and free resources\r\n */\r\n dispose(): void {\r\n this.reader.close();\r\n }\r\n\r\n // Private methods moved from StowKitLoader\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 const texture = await this.loadTexture(prop.textureId);\r\n this.applyTextureToMaterial(material, prop.fieldName, texture);\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 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 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 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 material.map = texture;\r\n }\r\n\r\n material.needsUpdate = true;\r\n }\r\n\r\n private loadMaterialSchemaByIndex_internal(index: number) {\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 }\r\n\r\n private getMeshMaterialsByIndex_internal(index: number) {\r\n const metadata = this.reader.readAssetMetadata(index);\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 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 offset += meshGeometryCount * 40;\r\n\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 offset += nodeCount * 116;\r\n offset += nodeCount * 4;\r\n\r\n for (const mat of materials) {\r\n for (let j = 0; j < mat.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 }\r\n}\r\n\r\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 { StowKitPack } from './StowKitPack';\r\n\r\nexport interface StowKitLoaderOptions {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/stowkit/basis/'\r\n */\r\n basisPath?: string;\r\n \r\n /**\r\n * Path to Draco decoder for mesh decompression\r\n * @default '/stowkit/draco/'\r\n */\r\n dracoPath?: 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/**\r\n * Three.js loader for StowKit asset packs\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const pack = await StowKitLoader.load('assets.stow');\r\n * const mesh = await pack.loadMesh('models/character');\r\n * const texture = await pack.loadTexture('textures/diffuse');\r\n * const audio = await pack.loadAudio('sounds/bgm', listener);\r\n * ```\r\n */\r\nexport class StowKitLoader {\r\n private static reader: StowKitReader | null = null;\r\n private static ktx2Loader: KTX2Loader | null = null;\r\n private static dracoLoader: DRACOLoader | null = null;\r\n private static initialized = false;\r\n\r\n /**\r\n * Load a .stow pack file\r\n */\r\n static async load(url: string, options?: StowKitLoaderOptions): Promise<StowKitPack> {\r\n // Initialize loaders if needed\r\n if (!this.initialized) {\r\n await this.initialize(options);\r\n }\r\n\r\n // Fetch the pack file\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n \r\n // Open pack\r\n await this.reader!.open(arrayBuffer);\r\n\r\n // Return pack wrapper\r\n return new StowKitPack(this.reader!, this.ktx2Loader!, this.dracoLoader!);\r\n }\r\n\r\n /**\r\n * Initialize the loader (called automatically on first load)\r\n */\r\n private static async initialize(options?: StowKitLoaderOptions): Promise<void> {\r\n const wasmPath = options?.wasmPath || '/stowkit_reader.wasm';\r\n const basisPath = options?.basisPath || '/stowkit/basis/';\r\n const dracoPath = options?.dracoPath || '/stowkit/draco/';\r\n\r\n // Initialize reader\r\n this.reader = new StowKitReader(wasmPath);\r\n await this.reader.init();\r\n\r\n // Setup KTX2 loader\r\n this.ktx2Loader = new KTX2Loader();\r\n this.ktx2Loader.setTranscoderPath(basisPath);\r\n\r\n // Setup Draco loader\r\n this.dracoLoader = new DRACOLoader();\r\n this.dracoLoader.setDecoderPath(dracoPath);\r\n\r\n // Detect support\r\n const tempRenderer = new THREE.WebGLRenderer();\r\n this.ktx2Loader.detectSupport(tempRenderer);\r\n tempRenderer.dispose();\r\n\r\n this.initialized = true;\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/StowKitPack.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\n/**\r\n * Represents an opened StowKit pack with methods to load assets by name\r\n */\r\nexport class StowKitPack {\r\n private reader: StowKitReader;\r\n private ktx2Loader: KTX2Loader;\r\n private dracoLoader: DRACOLoader;\r\n\r\n constructor(reader: StowKitReader, ktx2Loader: KTX2Loader, dracoLoader: DRACOLoader) {\r\n this.reader = reader;\r\n this.ktx2Loader = ktx2Loader;\r\n this.dracoLoader = dracoLoader;\r\n }\r\n\r\n /**\r\n * Load a mesh by its canonical path/name\r\n */\r\n async loadMesh(assetPath: string): Promise<THREE.Group> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Mesh 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: ${assetPath}`);\r\n }\r\n\r\n if (!metadata) {\r\n throw new Error(`No metadata available: ${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 return scene;\r\n }\r\n\r\n /**\r\n * Load a texture by its canonical path/name\r\n */\r\n async loadTexture(assetPath: string): Promise<THREE.CompressedTexture> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Texture not found: ${assetPath}`);\r\n }\r\n\r\n // Read texture data\r\n const data = this.reader.readAssetData(assetIndex);\r\n if (!data) {\r\n throw new Error(`Failed to read texture data: ${assetPath}`);\r\n }\r\n\r\n // Load as KTX2\r\n return await this.loadKTX2Texture(data);\r\n }\r\n\r\n /**\r\n * Load audio by its canonical path/name\r\n */\r\n async loadAudio(assetPath: string, listener: THREE.AudioListener): Promise<THREE.Audio> {\r\n // Find asset by path\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) {\r\n throw new Error(`Audio not found: ${assetPath}`);\r\n }\r\n\r\n // 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: ${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 return audio;\r\n }\r\n\r\n /**\r\n * Get list of all assets in pack\r\n */\r\n listAssets() {\r\n return this.reader.listAssets();\r\n }\r\n\r\n /**\r\n * Get asset count\r\n */\r\n getAssetCount(): number {\r\n return this.reader.getAssetCount();\r\n }\r\n\r\n /**\r\n * Get asset info by index\r\n */\r\n getAssetInfo(index: number): 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 * Load mesh by index\r\n */\r\n async loadMeshByIndex(index: number): Promise<THREE.Group> {\r\n const data = this.reader.readAssetData(index);\r\n const metadata = this.reader.readAssetMetadata(index);\r\n\r\n if (!data) throw new Error(`Failed to read mesh data for index ${index}`);\r\n if (!metadata) throw new Error(`No metadata for index ${index}`);\r\n\r\n const parsedData = MeshParser.parseMeshData(metadata, data);\r\n await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);\r\n return await MeshParser.buildScene(parsedData, data, this.dracoLoader);\r\n }\r\n\r\n /**\r\n * Load texture by index\r\n */\r\n async loadTextureByIndex(index: number): Promise<THREE.CompressedTexture> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) throw new Error(`Failed to read texture for index ${index}`);\r\n return await this.loadKTX2Texture(data);\r\n }\r\n\r\n /**\r\n * Create HTML audio preview element\r\n */\r\n async createAudioPreview(index: number): Promise<HTMLAudioElement> {\r\n const data = this.reader.readAssetData(index);\r\n if (!data) throw new Error(`Failed to read audio for index ${index}`);\r\n\r\n const blob = new Blob([data as any], { type: 'audio/ogg' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const audio = document.createElement('audio');\r\n audio.controls = true;\r\n audio.src = url;\r\n\r\n audio.addEventListener('ended', () => URL.revokeObjectURL(url));\r\n audio.addEventListener('error', () => URL.revokeObjectURL(url));\r\n\r\n return audio;\r\n }\r\n\r\n /**\r\n * Get audio metadata by path\r\n */\r\n getAudioMetadata(assetPath: string) {\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 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 }\r\n\r\n /**\r\n * Load material schema by index\r\n */\r\n loadMaterialSchemaByIndex(index: number) {\r\n return this.loadMaterialSchemaByIndex_internal(index);\r\n }\r\n\r\n /**\r\n * Get mesh materials by index\r\n */\r\n getMeshMaterialsByIndex(index: number) {\r\n return this.getMeshMaterialsByIndex_internal(index);\r\n }\r\n\r\n /**\r\n * Get material schema information\r\n */\r\n getMaterialSchema(assetPath: string) {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n return this.loadMaterialSchemaByIndex_internal(assetIndex);\r\n }\r\n\r\n /**\r\n * Get mesh materials information\r\n */\r\n getMeshMaterials(assetPath: string) {\r\n const assetIndex = this.reader.findAssetByPath(assetPath);\r\n if (assetIndex < 0) return null;\r\n\r\n return this.getMeshMaterialsByIndex_internal(assetIndex);\r\n }\r\n\r\n /**\r\n * Close the pack and free resources\r\n */\r\n dispose(): void {\r\n this.reader.close();\r\n }\r\n\r\n // Private methods moved from StowKitLoader\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 const texture = await this.loadTexture(prop.textureId);\r\n this.applyTextureToMaterial(material, prop.fieldName, texture);\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 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 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 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 material.map = texture;\r\n }\r\n\r\n material.needsUpdate = true;\r\n }\r\n\r\n private loadMaterialSchemaByIndex_internal(index: number) {\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 }\r\n\r\n private getMeshMaterialsByIndex_internal(index: number) {\r\n const metadata = this.reader.readAssetMetadata(index);\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 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 offset += meshGeometryCount * 40;\r\n\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 offset += nodeCount * 116;\r\n offset += nodeCount * 4;\r\n\r\n for (const mat of materials) {\r\n for (let j = 0; j < mat.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 }\r\n}\r\n\r\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 { StowKitPack } from './StowKitPack';\r\n\r\nexport interface StowKitLoaderOptions {\r\n /**\r\n * Path to basis transcoder for KTX2 texture loading\r\n * @default '/stowkit/basis/'\r\n */\r\n basisPath?: string;\r\n \r\n /**\r\n * Path to Draco decoder for mesh decompression\r\n * @default '/stowkit/draco/'\r\n */\r\n dracoPath?: 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/**\r\n * Three.js loader for StowKit asset packs\r\n * \r\n * Usage:\r\n * ```typescript\r\n * const pack = await StowKitLoader.load('assets.stow');\r\n * const mesh = await pack.loadMesh('models/character');\r\n * const texture = await pack.loadTexture('textures/diffuse');\r\n * const audio = await pack.loadAudio('sounds/bgm', listener);\r\n * ```\r\n */\r\nexport class StowKitLoader {\r\n private static reader: StowKitReader | null = null;\r\n private static ktx2Loader: KTX2Loader | null = null;\r\n private static dracoLoader: DRACOLoader | null = null;\r\n private static initialized = false;\r\n\r\n /**\r\n * Load a .stow pack file from a URL\r\n */\r\n static async load(url: string, options?: StowKitLoaderOptions): Promise<StowKitPack> {\r\n // Initialize loaders if needed\r\n if (!this.initialized) {\r\n await this.initialize(options);\r\n }\r\n\r\n // Fetch the pack file\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n \r\n // Open pack\r\n await this.reader!.open(arrayBuffer);\r\n\r\n // Return pack wrapper\r\n return new StowKitPack(this.reader!, this.ktx2Loader!, this.dracoLoader!);\r\n }\r\n\r\n /**\r\n * Load a .stow pack from memory (ArrayBuffer, Blob, or File)\r\n */\r\n static async loadFromMemory(data: ArrayBuffer | Blob | File, options?: StowKitLoaderOptions): Promise<StowKitPack> {\r\n // Initialize loaders if needed\r\n if (!this.initialized) {\r\n await this.initialize(options);\r\n }\r\n\r\n // Convert to ArrayBuffer if needed\r\n let arrayBuffer: ArrayBuffer;\r\n if (data instanceof ArrayBuffer) {\r\n arrayBuffer = data;\r\n } else if (data instanceof Blob || data instanceof File) {\r\n arrayBuffer = await data.arrayBuffer();\r\n } else {\r\n throw new Error('Data must be ArrayBuffer, Blob, or File');\r\n }\r\n\r\n // Open pack\r\n await this.reader!.open(arrayBuffer);\r\n\r\n // Return pack wrapper\r\n return new StowKitPack(this.reader!, this.ktx2Loader!, this.dracoLoader!);\r\n }\r\n\r\n /**\r\n * Initialize the loader (called automatically on first load)\r\n */\r\n private static async initialize(options?: StowKitLoaderOptions): Promise<void> {\r\n const wasmPath = options?.wasmPath || '/stowkit_reader.wasm';\r\n const basisPath = options?.basisPath || '/stowkit/basis/';\r\n const dracoPath = options?.dracoPath || '/stowkit/draco/';\r\n\r\n // Initialize reader\r\n this.reader = new StowKitReader(wasmPath);\r\n await this.reader.init();\r\n\r\n // Setup KTX2 loader\r\n this.ktx2Loader = new KTX2Loader();\r\n this.ktx2Loader.setTranscoderPath(basisPath);\r\n\r\n // Setup Draco loader\r\n this.dracoLoader = new DRACOLoader();\r\n this.dracoLoader.setDecoderPath(dracoPath);\r\n\r\n // Detect support\r\n const tempRenderer = new THREE.WebGLRenderer();\r\n this.ktx2Loader.detectSupport(tempRenderer);\r\n tempRenderer.dispose();\r\n\r\n this.initialized = true;\r\n }\r\n}\r\n"],"names":["THREE","StowKitReader","KTX2Loader","DRACOLoader"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stowkit/three-loader",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
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",
@@ -5,14 +5,33 @@ const path = require('path');
5
5
  const isInNodeModules = __dirname.includes('node_modules');
6
6
 
7
7
  if (isInNodeModules) {
8
+ console.log('Installing StowKit assets...');
9
+
10
+ // Copy basis and draco decoders
8
11
  const src = path.join(__dirname, '..', 'public');
9
12
  const dest = path.join(process.cwd(), 'public', 'stowkit');
10
13
 
11
14
  if (fs.existsSync(src)) {
12
15
  fs.mkdirSync(dest, { recursive: true });
13
16
  fs.cpSync(src, dest, { recursive: true });
14
- console.log('✓ Copied StowKit Draco decoder to public/stowkit/');
17
+ console.log('✓ Copied Basis and Draco decoders to public/stowkit/');
18
+ }
19
+
20
+ // Copy WASM reader from @stowkit/reader package
21
+ try {
22
+ const wasmSrc = path.join(process.cwd(), 'node_modules', '@stowkit', 'reader', 'dist', 'stowkit_reader.wasm');
23
+ const wasmDest = path.join(process.cwd(), 'public', 'stowkit_reader.wasm');
24
+
25
+ if (fs.existsSync(wasmSrc)) {
26
+ fs.mkdirSync(path.dirname(wasmDest), { recursive: true });
27
+ fs.copyFileSync(wasmSrc, wasmDest);
28
+ console.log('✓ Copied stowkit_reader.wasm to public/');
29
+ }
30
+ } catch (error) {
31
+ console.warn('Could not copy stowkit_reader.wasm (install @stowkit/reader first if needed)');
15
32
  }
33
+
34
+ console.log('✓ StowKit installation complete!');
16
35
  } else {
17
36
  console.log('Skipping postinstall (development mode)');
18
37
  }