@stowkit/three-loader 0.1.24 → 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.
- package/dist/MeshParser.d.ts.map +1 -1
- package/dist/StowKitPack.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/stowkit-three-loader.esm.js +30 -3
- package/dist/stowkit-three-loader.esm.js.map +1 -1
- package/dist/stowkit-three-loader.js +32 -1
- package/dist/stowkit-three-loader.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +10 -1
|
@@ -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
|
-
|
|
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
|