@stowkit/three-loader 0.1.25 → 0.1.26

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.
@@ -212,20 +212,25 @@ class MeshParser {
212
212
  * Create Three.js BufferGeometry from Draco compressed mesh data
213
213
  */
214
214
  static async createGeometry(geoInfo, dataBlob, dracoLoader) {
215
+ const startTime = performance.now();
215
216
  // Extract the Draco compressed buffer
216
217
  if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {
217
218
  throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);
218
219
  }
219
220
  const compressedData = dataBlob.slice(geoInfo.compressedBufferOffset, geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize);
221
+ const extractTime = performance.now();
222
+ reader.PerfLogger.log(`[Perf] Draco extract: ${(extractTime - startTime).toFixed(2)}ms (${geoInfo.compressedBufferSize} bytes)`);
220
223
  // Decode using Draco
221
224
  // Create a blob URL for the Draco data (DRACOLoader expects a URL)
222
225
  const arrayBuffer = compressedData.buffer.slice(compressedData.byteOffset, compressedData.byteOffset + compressedData.byteLength);
223
226
  const blob = new Blob([arrayBuffer]);
224
227
  const url = URL.createObjectURL(blob);
228
+ const decodeStart = performance.now();
225
229
  const geometry = await new Promise((resolve, reject) => {
226
230
  dracoLoader.load(url, (decoded) => {
227
231
  URL.revokeObjectURL(url);
228
- // UVs are pre-flipped in the packer now
232
+ const decodeEnd = performance.now();
233
+ reader.PerfLogger.log(`[Perf] Draco decode: ${(decodeEnd - decodeStart).toFixed(2)}ms (vertices: ${geoInfo.vertexCount}, indices: ${geoInfo.indexCount})`);
229
234
  resolve(decoded);
230
235
  }, undefined, (error) => {
231
236
  URL.revokeObjectURL(url);
@@ -233,8 +238,13 @@ class MeshParser {
233
238
  });
234
239
  });
235
240
  // Compute bounding volumes
241
+ const boundsStart = performance.now();
236
242
  geometry.computeBoundingSphere();
237
243
  geometry.computeBoundingBox();
244
+ const boundsEnd = performance.now();
245
+ reader.PerfLogger.log(`[Perf] Bounds computation: ${(boundsEnd - boundsStart).toFixed(2)}ms`);
246
+ const totalTime = performance.now();
247
+ reader.PerfLogger.log(`[Perf] Total geometry creation: ${(totalTime - startTime).toFixed(2)}ms`);
238
248
  return geometry;
239
249
  }
240
250
  /**
@@ -660,14 +670,19 @@ class StowKitPack {
660
670
  * Load a mesh by its canonical path/name
661
671
  */
662
672
  async loadMesh(assetPath) {
673
+ const totalStart = performance.now();
663
674
  // Find asset by path
675
+ const findStart = performance.now();
664
676
  const assetIndex = this.reader.findAssetByPath(assetPath);
665
677
  if (assetIndex < 0) {
666
678
  throw new Error(`Mesh not found: ${assetPath}`);
667
679
  }
680
+ reader.PerfLogger.log(`[Perf] Find asset: ${(performance.now() - findStart).toFixed(2)}ms`);
668
681
  // Read mesh data and metadata
682
+ const readStart = performance.now();
669
683
  const data = this.reader.readAssetData(assetIndex);
670
684
  const metadata = this.reader.readAssetMetadata(assetIndex);
685
+ reader.PerfLogger.log(`[Perf] Read mesh data: ${(performance.now() - readStart).toFixed(2)}ms (data: ${data?.byteLength || 0} bytes, metadata: ${metadata?.byteLength || 0} bytes)`);
671
686
  if (!data) {
672
687
  throw new Error(`Failed to read mesh data: ${assetPath}`);
673
688
  }
@@ -675,11 +690,18 @@ class StowKitPack {
675
690
  throw new Error(`No metadata available: ${assetPath}`);
676
691
  }
677
692
  // Parse mesh data
693
+ const parseStart = performance.now();
678
694
  const parsedData = MeshParser.parseMeshData(metadata, data);
695
+ reader.PerfLogger.log(`[Perf] Parse mesh metadata: ${(performance.now() - parseStart).toFixed(2)}ms`);
679
696
  // Load textures for materials
697
+ const textureStart = performance.now();
680
698
  await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);
699
+ reader.PerfLogger.log(`[Perf] Load textures: ${(performance.now() - textureStart).toFixed(2)}ms`);
681
700
  // Build Three.js scene with Draco decoder
701
+ const buildStart = performance.now();
682
702
  const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);
703
+ reader.PerfLogger.log(`[Perf] Build scene: ${(performance.now() - buildStart).toFixed(2)}ms`);
704
+ reader.PerfLogger.log(`[Perf] ===== Total mesh load: ${(performance.now() - totalStart).toFixed(2)}ms =====`);
683
705
  return scene;
684
706
  }
685
707
  /**
@@ -999,13 +1021,18 @@ class StowKitPack {
999
1021
  }
1000
1022
  }
1001
1023
  async loadKTX2Texture(data) {
1024
+ performance.now();
1002
1025
  const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
1003
1026
  const blob = new Blob([arrayBuffer]);
1004
1027
  const url = URL.createObjectURL(blob);
1028
+ reader.PerfLogger.log(`[Perf] KTX2/Basis texture size: ${data.byteLength} bytes`);
1005
1029
  try {
1006
1030
  return await new Promise((resolve, reject) => {
1031
+ const loadStart = performance.now();
1007
1032
  this.ktx2Loader.load(url, (texture) => {
1008
1033
  URL.revokeObjectURL(url);
1034
+ const loadEnd = performance.now();
1035
+ reader.PerfLogger.log(`[Perf] Basis transcode: ${(loadEnd - loadStart).toFixed(2)}ms (resolution: ${texture.image?.width || '?'}x${texture.image?.height || '?'})`);
1009
1036
  texture.needsUpdate = true;
1010
1037
  resolve(texture);
1011
1038
  }, undefined, (error) => {
@@ -1138,6 +1165,10 @@ Object.defineProperty(exports, 'AssetType', {
1138
1165
  enumerable: true,
1139
1166
  get: function () { return reader.AssetType; }
1140
1167
  });
1168
+ Object.defineProperty(exports, 'PerfLogger', {
1169
+ enumerable: true,
1170
+ get: function () { return reader.PerfLogger; }
1171
+ });
1141
1172
  exports.StowKitLoader = StowKitLoader;
1142
1173
  exports.StowKitPack = StowKitPack;
1143
1174
  //# sourceMappingURL=stowkit-three-loader.js.map