@stowkit/three-loader 0.1.14 → 0.1.15

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.
@@ -1 +1 @@
1
- {"version":3,"file":"MeshParser.d.ts","sourceRoot":"","sources":["../src/MeshParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,UAAU;IAEnB;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY;IAcxD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG;QAClE,QAAQ,EAAE,YAAY,CAAC;QACvB,UAAU,EAAE,gBAAgB,EAAE,CAAC;QAC/B,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5B,YAAY,EAAE,YAAY,EAAE,CAAC;QAC7B,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,WAAW,EAAE,WAAW,CAAC;KAC5B;IAiMD;;OAEG;WACU,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IA4DrI;;OAEG;WACU,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAuItJ;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;CAK5B"}
1
+ {"version":3,"file":"MeshParser.d.ts","sourceRoot":"","sources":["../src/MeshParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,UAAU;IAEnB;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY;IAcxD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG;QAClE,QAAQ,EAAE,YAAY,CAAC;QACvB,UAAU,EAAE,gBAAgB,EAAE,CAAC;QAC/B,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5B,YAAY,EAAE,YAAY,EAAE,CAAC;QAC7B,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,WAAW,EAAE,WAAW,CAAC;KAC5B;IAoLD;;OAEG;WACU,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IAyCrI;;OAEG;WACU,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IA2FtJ;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;CAK5B"}
@@ -26,16 +26,13 @@ class MeshParser {
26
26
  if (metadataBlob.length < 140) {
27
27
  throw new Error(`Metadata blob too small: ${metadataBlob.length} bytes (expected at least 140)`);
28
28
  }
29
- console.log(`Parsing mesh metadata: ${metadataBlob.length} bytes metadata, ${dataBlob.length} bytes data`);
30
29
  const metadata = this.parseMeshMetadata(metadataBlob);
31
- console.log(`Mesh counts: ${metadata.meshGeometryCount} geometries, ${metadata.materialCount} materials, ${metadata.nodeCount} nodes`);
32
30
  // Check if the metadata blob contains just the header or all the mesh info
33
31
  const expectedMetadataSize = 140 +
34
32
  (metadata.meshGeometryCount * 40) + // Draco compressed (40 bytes each)
35
33
  (metadata.materialCount * 196) + // MaterialData header
36
34
  (metadata.nodeCount * 116);
37
35
  let hasExtendedMetadata = metadataBlob.length >= expectedMetadataSize;
38
- console.log(`Expected metadata size: ${expectedMetadataSize}, actual: ${metadataBlob.length}, has extended: ${hasExtendedMetadata}`);
39
36
  // If metadata only has the header, the mesh info might be at the start of the data blob
40
37
  const sourceBlob = hasExtendedMetadata ? metadataBlob : dataBlob;
41
38
  const metaView = new DataView(sourceBlob.buffer, sourceBlob.byteOffset, sourceBlob.byteLength);
@@ -81,7 +78,6 @@ class MeshParser {
81
78
  }
82
79
  // Parse nodes first (they come before material properties in the blob)
83
80
  const nodes = [];
84
- console.log(`\n=== Nodes from StowKit file (${metadata.nodeCount} total) ===`);
85
81
  for (let i = 0; i < metadata.nodeCount; i++) {
86
82
  if (offset + 116 > sourceBlob.length) {
87
83
  console.warn(`Data truncated at node ${i}/${metadata.nodeCount}`);
@@ -109,11 +105,9 @@ class MeshParser {
109
105
  meshCount: metaView.getUint32(offset + 108, true),
110
106
  firstMeshIndex: metaView.getUint32(offset + 112, true)
111
107
  };
112
- console.log(`Node ${i}: "${node.name}" (parent=${node.parentIndex}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex})`);
113
108
  nodes.push(node);
114
109
  offset += 116; // Size of Node struct
115
110
  }
116
- console.log(`=== End of nodes from file ===\n`);
117
111
  // Parse mesh indices
118
112
  const totalMeshRefs = nodes.reduce((sum, node) => sum + node.meshCount, 0);
119
113
  console.log(`Parsing ${totalMeshRefs} mesh indices at offset ${offset}`);
@@ -132,7 +126,6 @@ class MeshParser {
132
126
  // MaterialPropertyValue: field_name[64] + value[4*4=16] + texture_id[64] = 144 bytes
133
127
  for (let i = 0; i < materialData.length; i++) {
134
128
  const matData = materialData[i];
135
- console.log(`Material "${matData.name}": schema="${matData.schemaId}", ${matData.propertyCount} properties`);
136
129
  for (let j = 0; j < matData.propertyCount; j++) {
137
130
  if (offset + 144 > sourceBlob.length) {
138
131
  console.warn(`Data truncated at property ${j}/${matData.propertyCount} of material ${i}`);
@@ -151,7 +144,6 @@ class MeshParser {
151
144
  value,
152
145
  textureId
153
146
  });
154
- console.log(` Property "${fieldName}": value=[${value.join(', ')}], textureId="${textureId}"`);
155
147
  offset += 144; // Size of MaterialPropertyValue
156
148
  }
157
149
  // Create Three.js material based on properties
@@ -161,16 +153,13 @@ class MeshParser {
161
153
  // Start with default gray color
162
154
  color: new THREE.Color(0.8, 0.8, 0.8)
163
155
  });
164
- console.log(`Creating material ${i}: "${matData.name}", ${matData.propertyCount} properties`);
165
156
  // Apply properties
166
157
  for (const prop of matData.properties) {
167
158
  if (prop.fieldName.toLowerCase() === 'tint' || prop.fieldName.toLowerCase().includes('color')) {
168
159
  // Apply color/tint
169
160
  mat.color = new THREE.Color(prop.value[0], prop.value[1], prop.value[2]);
170
- console.log(` Applied tint color: rgb(${prop.value[0]}, ${prop.value[1]}, ${prop.value[2]})`);
171
161
  }
172
162
  }
173
- console.log(` Material ${i} final color: rgb(${mat.color.r}, ${mat.color.g}, ${mat.color.b})`);
174
163
  materials.push(mat);
175
164
  }
176
165
  // Default material if none exist
@@ -188,14 +177,6 @@ class MeshParser {
188
177
  * Create Three.js BufferGeometry from Draco compressed mesh data
189
178
  */
190
179
  static async createGeometry(geoInfo, dataBlob, dracoLoader) {
191
- console.log('Decoding Draco geometry:', {
192
- vertexCount: geoInfo.vertexCount,
193
- indexCount: geoInfo.indexCount,
194
- hasNormals: geoInfo.hasNormals,
195
- hasUVs: geoInfo.hasUVs,
196
- compressedOffset: geoInfo.compressedBufferOffset,
197
- compressedSize: geoInfo.compressedBufferSize
198
- });
199
180
  // Extract the Draco compressed buffer
200
181
  if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {
201
182
  throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);
@@ -209,8 +190,7 @@ class MeshParser {
209
190
  const geometry = await new Promise((resolve, reject) => {
210
191
  dracoLoader.load(url, (decoded) => {
211
192
  URL.revokeObjectURL(url);
212
- console.log('Draco decoded successfully:', decoded);
213
- // UVs are pre-flipped in the packer now, no need to flip here
193
+ // UVs are pre-flipped in the packer now
214
194
  resolve(decoded);
215
195
  }, undefined, (error) => {
216
196
  URL.revokeObjectURL(url);
@@ -221,13 +201,6 @@ class MeshParser {
221
201
  // Compute bounding volumes
222
202
  geometry.computeBoundingSphere();
223
203
  geometry.computeBoundingBox();
224
- console.log('Final geometry:', {
225
- hasPositions: !!geometry.attributes.position,
226
- hasNormals: !!geometry.attributes.normal,
227
- hasUVs: !!geometry.attributes.uv,
228
- hasIndices: !!geometry.index,
229
- vertexCount: geometry.attributes.position?.count || 0
230
- });
231
204
  return geometry;
232
205
  }
233
206
  /**
@@ -237,18 +210,11 @@ class MeshParser {
237
210
  const root = new THREE.Group();
238
211
  root.name = 'StowKitMesh';
239
212
  const { geometries, materials, nodes, meshIndices } = parsedData;
240
- console.log('Building scene with:', {
241
- geometries: geometries.length,
242
- materials: materials.length,
243
- nodes: nodes.length,
244
- meshIndices: meshIndices.length
245
- });
246
213
  // Create all Three.js objects for nodes
247
214
  const nodeObjects = [];
248
215
  for (const node of nodes) {
249
216
  const obj = new THREE.Group();
250
217
  obj.name = node.name;
251
- console.log(`Node ${node.name}: position=${node.position}, rotation=${node.rotation}, scale=${node.scale}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex}`);
252
218
  // Apply transform
253
219
  obj.position.set(...node.position);
254
220
  obj.quaternion.set(...node.rotation);
@@ -257,10 +223,8 @@ class MeshParser {
257
223
  for (let i = 0; i < node.meshCount; i++) {
258
224
  const meshIndexArrayPos = node.firstMeshIndex + i;
259
225
  const meshIndex = meshIndices[meshIndexArrayPos];
260
- console.log(` meshIndices[${meshIndexArrayPos}] = ${meshIndex} (adding to node ${node.name})`);
261
226
  if (meshIndex < geometries.length) {
262
227
  const geoInfo = geometries[meshIndex];
263
- console.log(` Creating geometry from geoInfo: vertices=${geoInfo.vertexCount}, indices=${geoInfo.indexCount}, material=${geoInfo.materialIndex}`);
264
228
  const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);
265
229
  // Use assigned material if valid, otherwise create default
266
230
  let material;
@@ -278,35 +242,28 @@ class MeshParser {
278
242
  }
279
243
  const mesh = new THREE.Mesh(geometry, material);
280
244
  obj.add(mesh);
281
- console.log(` ✓ Added mesh to node ${node.name} (${geometry.attributes.position?.count || 0} vertices, material: ${material.name || 'default'})`);
282
245
  }
283
246
  else {
284
- console.error(`Mesh index ${meshIndex} out of bounds (have ${geometries.length} geometries)`);
247
+ console.error(`Mesh index ${meshIndex} out of bounds (${geometries.length} geometries available)`);
285
248
  }
286
249
  }
287
- console.log(` Node ${node.name} now has ${obj.children.length} children`);
288
250
  nodeObjects.push(obj);
289
251
  }
290
252
  // Build hierarchy
291
- console.log('Building node hierarchy...');
292
253
  for (let i = 0; i < nodes.length; i++) {
293
254
  const node = nodes[i];
294
255
  const obj = nodeObjects[i];
295
256
  if (node.parentIndex >= 0 && node.parentIndex < nodeObjects.length) {
296
- console.log(` Adding node "${node.name}" (index ${i}) as child of node "${nodes[node.parentIndex].name}" (index ${node.parentIndex})`);
297
257
  nodeObjects[node.parentIndex].add(obj);
298
258
  }
299
259
  else {
300
- console.log(` Adding node "${node.name}" (index ${i}) as direct child of root (parentIndex=${node.parentIndex})`);
301
260
  root.add(obj);
302
261
  }
303
262
  }
304
263
  // If no nodes, create a single mesh from all geometries
305
264
  if (nodes.length === 0 && geometries.length > 0) {
306
- console.log('No nodes found, creating meshes directly from geometries');
307
265
  for (let index = 0; index < geometries.length; index++) {
308
266
  const geoInfo = geometries[index];
309
- console.log(`Creating direct mesh ${index}: materialIndex=${geoInfo.materialIndex}, vertices=${geoInfo.vertexCount}`);
310
267
  const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);
311
268
  // Use assigned material if valid, otherwise create default
312
269
  let material;
@@ -325,33 +282,8 @@ class MeshParser {
325
282
  const mesh = new THREE.Mesh(geometry, material);
326
283
  mesh.name = `Mesh_${index}`;
327
284
  root.add(mesh);
328
- console.log(`Added mesh ${index} to root`);
329
285
  }
330
286
  }
331
- console.log(`Final scene has ${root.children.length} direct children`);
332
- // Debug: traverse and count all meshes, showing full hierarchy
333
- let totalMeshCount = 0;
334
- let hierarchyLog = 'Scene hierarchy:\n';
335
- root.traverse((obj) => {
336
- // Calculate depth by counting parents
337
- let depth = 0;
338
- let parent = obj.parent;
339
- while (parent && parent !== root) {
340
- depth++;
341
- parent = parent.parent;
342
- }
343
- const indent = ' '.repeat(depth);
344
- if (obj instanceof THREE.Mesh) {
345
- totalMeshCount++;
346
- const mat = obj.material;
347
- hierarchyLog += `${indent}[Mesh] vertices=${obj.geometry.attributes.position?.count || 0}, material=${mat.name}, hasTexture=${!!mat.map}\n`;
348
- }
349
- else if (obj instanceof THREE.Group && obj !== root) {
350
- hierarchyLog += `${indent}[Group] ${obj.name} (${obj.children.length} children)\n`;
351
- }
352
- });
353
- console.log(hierarchyLog);
354
- console.log(`Total meshes in scene: ${totalMeshCount}`);
355
287
  return root;
356
288
  }
357
289
  /**
@@ -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 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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"}
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 const metadata = this.parseMeshMetadata(metadataBlob);\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 \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 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 nodes.push(node);\n offset += 116; // Size of Node struct\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 \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 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 // 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 }\n }\n \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 // 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 // UVs are pre-flipped in the packer now\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 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 \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 // 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 if (meshIndex < geometries.length) {\n const geoInfo = geometries[meshIndex];\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 } else {\n console.error(`Mesh index ${meshIndex} out of bounds (${geometries.length} geometries available)`);\n }\n }\n \n nodeObjects.push(obj);\n }\n \n // Build 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 nodeObjects[node.parentIndex].add(obj);\n } else {\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 for (let index = 0; index < geometries.length; index++) {\n const geoInfo = geometries[index];\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 }\n }\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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"}
@@ -47,16 +47,13 @@ class MeshParser {
47
47
  if (metadataBlob.length < 140) {
48
48
  throw new Error(`Metadata blob too small: ${metadataBlob.length} bytes (expected at least 140)`);
49
49
  }
50
- console.log(`Parsing mesh metadata: ${metadataBlob.length} bytes metadata, ${dataBlob.length} bytes data`);
51
50
  const metadata = this.parseMeshMetadata(metadataBlob);
52
- console.log(`Mesh counts: ${metadata.meshGeometryCount} geometries, ${metadata.materialCount} materials, ${metadata.nodeCount} nodes`);
53
51
  // Check if the metadata blob contains just the header or all the mesh info
54
52
  const expectedMetadataSize = 140 +
55
53
  (metadata.meshGeometryCount * 40) + // Draco compressed (40 bytes each)
56
54
  (metadata.materialCount * 196) + // MaterialData header
57
55
  (metadata.nodeCount * 116);
58
56
  let hasExtendedMetadata = metadataBlob.length >= expectedMetadataSize;
59
- console.log(`Expected metadata size: ${expectedMetadataSize}, actual: ${metadataBlob.length}, has extended: ${hasExtendedMetadata}`);
60
57
  // If metadata only has the header, the mesh info might be at the start of the data blob
61
58
  const sourceBlob = hasExtendedMetadata ? metadataBlob : dataBlob;
62
59
  const metaView = new DataView(sourceBlob.buffer, sourceBlob.byteOffset, sourceBlob.byteLength);
@@ -102,7 +99,6 @@ class MeshParser {
102
99
  }
103
100
  // Parse nodes first (they come before material properties in the blob)
104
101
  const nodes = [];
105
- console.log(`\n=== Nodes from StowKit file (${metadata.nodeCount} total) ===`);
106
102
  for (let i = 0; i < metadata.nodeCount; i++) {
107
103
  if (offset + 116 > sourceBlob.length) {
108
104
  console.warn(`Data truncated at node ${i}/${metadata.nodeCount}`);
@@ -130,11 +126,9 @@ class MeshParser {
130
126
  meshCount: metaView.getUint32(offset + 108, true),
131
127
  firstMeshIndex: metaView.getUint32(offset + 112, true)
132
128
  };
133
- console.log(`Node ${i}: "${node.name}" (parent=${node.parentIndex}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex})`);
134
129
  nodes.push(node);
135
130
  offset += 116; // Size of Node struct
136
131
  }
137
- console.log(`=== End of nodes from file ===\n`);
138
132
  // Parse mesh indices
139
133
  const totalMeshRefs = nodes.reduce((sum, node) => sum + node.meshCount, 0);
140
134
  console.log(`Parsing ${totalMeshRefs} mesh indices at offset ${offset}`);
@@ -153,7 +147,6 @@ class MeshParser {
153
147
  // MaterialPropertyValue: field_name[64] + value[4*4=16] + texture_id[64] = 144 bytes
154
148
  for (let i = 0; i < materialData.length; i++) {
155
149
  const matData = materialData[i];
156
- console.log(`Material "${matData.name}": schema="${matData.schemaId}", ${matData.propertyCount} properties`);
157
150
  for (let j = 0; j < matData.propertyCount; j++) {
158
151
  if (offset + 144 > sourceBlob.length) {
159
152
  console.warn(`Data truncated at property ${j}/${matData.propertyCount} of material ${i}`);
@@ -172,7 +165,6 @@ class MeshParser {
172
165
  value,
173
166
  textureId
174
167
  });
175
- console.log(` Property "${fieldName}": value=[${value.join(', ')}], textureId="${textureId}"`);
176
168
  offset += 144; // Size of MaterialPropertyValue
177
169
  }
178
170
  // Create Three.js material based on properties
@@ -182,16 +174,13 @@ class MeshParser {
182
174
  // Start with default gray color
183
175
  color: new THREE__namespace.Color(0.8, 0.8, 0.8)
184
176
  });
185
- console.log(`Creating material ${i}: "${matData.name}", ${matData.propertyCount} properties`);
186
177
  // Apply properties
187
178
  for (const prop of matData.properties) {
188
179
  if (prop.fieldName.toLowerCase() === 'tint' || prop.fieldName.toLowerCase().includes('color')) {
189
180
  // Apply color/tint
190
181
  mat.color = new THREE__namespace.Color(prop.value[0], prop.value[1], prop.value[2]);
191
- console.log(` Applied tint color: rgb(${prop.value[0]}, ${prop.value[1]}, ${prop.value[2]})`);
192
182
  }
193
183
  }
194
- console.log(` Material ${i} final color: rgb(${mat.color.r}, ${mat.color.g}, ${mat.color.b})`);
195
184
  materials.push(mat);
196
185
  }
197
186
  // Default material if none exist
@@ -209,14 +198,6 @@ class MeshParser {
209
198
  * Create Three.js BufferGeometry from Draco compressed mesh data
210
199
  */
211
200
  static async createGeometry(geoInfo, dataBlob, dracoLoader) {
212
- console.log('Decoding Draco geometry:', {
213
- vertexCount: geoInfo.vertexCount,
214
- indexCount: geoInfo.indexCount,
215
- hasNormals: geoInfo.hasNormals,
216
- hasUVs: geoInfo.hasUVs,
217
- compressedOffset: geoInfo.compressedBufferOffset,
218
- compressedSize: geoInfo.compressedBufferSize
219
- });
220
201
  // Extract the Draco compressed buffer
221
202
  if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {
222
203
  throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);
@@ -230,8 +211,7 @@ class MeshParser {
230
211
  const geometry = await new Promise((resolve, reject) => {
231
212
  dracoLoader.load(url, (decoded) => {
232
213
  URL.revokeObjectURL(url);
233
- console.log('Draco decoded successfully:', decoded);
234
- // UVs are pre-flipped in the packer now, no need to flip here
214
+ // UVs are pre-flipped in the packer now
235
215
  resolve(decoded);
236
216
  }, undefined, (error) => {
237
217
  URL.revokeObjectURL(url);
@@ -242,13 +222,6 @@ class MeshParser {
242
222
  // Compute bounding volumes
243
223
  geometry.computeBoundingSphere();
244
224
  geometry.computeBoundingBox();
245
- console.log('Final geometry:', {
246
- hasPositions: !!geometry.attributes.position,
247
- hasNormals: !!geometry.attributes.normal,
248
- hasUVs: !!geometry.attributes.uv,
249
- hasIndices: !!geometry.index,
250
- vertexCount: geometry.attributes.position?.count || 0
251
- });
252
225
  return geometry;
253
226
  }
254
227
  /**
@@ -258,18 +231,11 @@ class MeshParser {
258
231
  const root = new THREE__namespace.Group();
259
232
  root.name = 'StowKitMesh';
260
233
  const { geometries, materials, nodes, meshIndices } = parsedData;
261
- console.log('Building scene with:', {
262
- geometries: geometries.length,
263
- materials: materials.length,
264
- nodes: nodes.length,
265
- meshIndices: meshIndices.length
266
- });
267
234
  // Create all Three.js objects for nodes
268
235
  const nodeObjects = [];
269
236
  for (const node of nodes) {
270
237
  const obj = new THREE__namespace.Group();
271
238
  obj.name = node.name;
272
- console.log(`Node ${node.name}: position=${node.position}, rotation=${node.rotation}, scale=${node.scale}, meshCount=${node.meshCount}, firstMeshIndex=${node.firstMeshIndex}`);
273
239
  // Apply transform
274
240
  obj.position.set(...node.position);
275
241
  obj.quaternion.set(...node.rotation);
@@ -278,10 +244,8 @@ class MeshParser {
278
244
  for (let i = 0; i < node.meshCount; i++) {
279
245
  const meshIndexArrayPos = node.firstMeshIndex + i;
280
246
  const meshIndex = meshIndices[meshIndexArrayPos];
281
- console.log(` meshIndices[${meshIndexArrayPos}] = ${meshIndex} (adding to node ${node.name})`);
282
247
  if (meshIndex < geometries.length) {
283
248
  const geoInfo = geometries[meshIndex];
284
- console.log(` Creating geometry from geoInfo: vertices=${geoInfo.vertexCount}, indices=${geoInfo.indexCount}, material=${geoInfo.materialIndex}`);
285
249
  const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);
286
250
  // Use assigned material if valid, otherwise create default
287
251
  let material;
@@ -299,35 +263,28 @@ class MeshParser {
299
263
  }
300
264
  const mesh = new THREE__namespace.Mesh(geometry, material);
301
265
  obj.add(mesh);
302
- console.log(` ✓ Added mesh to node ${node.name} (${geometry.attributes.position?.count || 0} vertices, material: ${material.name || 'default'})`);
303
266
  }
304
267
  else {
305
- console.error(`Mesh index ${meshIndex} out of bounds (have ${geometries.length} geometries)`);
268
+ console.error(`Mesh index ${meshIndex} out of bounds (${geometries.length} geometries available)`);
306
269
  }
307
270
  }
308
- console.log(` Node ${node.name} now has ${obj.children.length} children`);
309
271
  nodeObjects.push(obj);
310
272
  }
311
273
  // Build hierarchy
312
- console.log('Building node hierarchy...');
313
274
  for (let i = 0; i < nodes.length; i++) {
314
275
  const node = nodes[i];
315
276
  const obj = nodeObjects[i];
316
277
  if (node.parentIndex >= 0 && node.parentIndex < nodeObjects.length) {
317
- console.log(` Adding node "${node.name}" (index ${i}) as child of node "${nodes[node.parentIndex].name}" (index ${node.parentIndex})`);
318
278
  nodeObjects[node.parentIndex].add(obj);
319
279
  }
320
280
  else {
321
- console.log(` Adding node "${node.name}" (index ${i}) as direct child of root (parentIndex=${node.parentIndex})`);
322
281
  root.add(obj);
323
282
  }
324
283
  }
325
284
  // If no nodes, create a single mesh from all geometries
326
285
  if (nodes.length === 0 && geometries.length > 0) {
327
- console.log('No nodes found, creating meshes directly from geometries');
328
286
  for (let index = 0; index < geometries.length; index++) {
329
287
  const geoInfo = geometries[index];
330
- console.log(`Creating direct mesh ${index}: materialIndex=${geoInfo.materialIndex}, vertices=${geoInfo.vertexCount}`);
331
288
  const geometry = await this.createGeometry(geoInfo, dataBlob, dracoLoader);
332
289
  // Use assigned material if valid, otherwise create default
333
290
  let material;
@@ -346,33 +303,8 @@ class MeshParser {
346
303
  const mesh = new THREE__namespace.Mesh(geometry, material);
347
304
  mesh.name = `Mesh_${index}`;
348
305
  root.add(mesh);
349
- console.log(`Added mesh ${index} to root`);
350
306
  }
351
307
  }
352
- console.log(`Final scene has ${root.children.length} direct children`);
353
- // Debug: traverse and count all meshes, showing full hierarchy
354
- let totalMeshCount = 0;
355
- let hierarchyLog = 'Scene hierarchy:\n';
356
- root.traverse((obj) => {
357
- // Calculate depth by counting parents
358
- let depth = 0;
359
- let parent = obj.parent;
360
- while (parent && parent !== root) {
361
- depth++;
362
- parent = parent.parent;
363
- }
364
- const indent = ' '.repeat(depth);
365
- if (obj instanceof THREE__namespace.Mesh) {
366
- totalMeshCount++;
367
- const mat = obj.material;
368
- hierarchyLog += `${indent}[Mesh] vertices=${obj.geometry.attributes.position?.count || 0}, material=${mat.name}, hasTexture=${!!mat.map}\n`;
369
- }
370
- else if (obj instanceof THREE__namespace.Group && obj !== root) {
371
- hierarchyLog += `${indent}[Group] ${obj.name} (${obj.children.length} children)\n`;
372
- }
373
- });
374
- console.log(hierarchyLog);
375
- console.log(`Total meshes in scene: ${totalMeshCount}`);
376
308
  return root;
377
309
  }
378
310
  /**
@@ -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 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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"}
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 const metadata = this.parseMeshMetadata(metadataBlob);\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 \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 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 nodes.push(node);\n offset += 116; // Size of Node struct\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 \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 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 // 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 }\n }\n \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 // 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 // UVs are pre-flipped in the packer now\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 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 \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 // 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 if (meshIndex < geometries.length) {\n const geoInfo = geometries[meshIndex];\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 } else {\n console.error(`Mesh index ${meshIndex} out of bounds (${geometries.length} geometries available)`);\n }\n }\n \n nodeObjects.push(obj);\n }\n \n // Build 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 nodeObjects[node.parentIndex].add(obj);\n } else {\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 for (let index = 0; index < geometries.length; index++) {\n const geoInfo = geometries[index];\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 }\n }\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.14",
3
+ "version": "0.1.15",
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",