@stowkit/three-loader 0.1.28 → 0.1.29
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
CHANGED
|
@@ -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;AAGxE,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;IAyBxD;;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;IAwLD;;OAEG;WACU,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;
|
|
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;AAGxE,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;IAyBxD;;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;IAwLD;;OAEG;WACU,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IAgDrI;;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;IA+FtJ;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;CAK5B"}
|
|
@@ -217,12 +217,7 @@ class MeshParser {
|
|
|
217
217
|
reject(new Error(`Failed to decode Draco geometry: ${error}`));
|
|
218
218
|
});
|
|
219
219
|
});
|
|
220
|
-
//
|
|
221
|
-
const boundsStart = performance.now();
|
|
222
|
-
geometry.computeBoundingSphere();
|
|
223
|
-
geometry.computeBoundingBox();
|
|
224
|
-
const boundsEnd = performance.now();
|
|
225
|
-
PerfLogger.log(`[Perf] Bounds computation: ${(boundsEnd - boundsStart).toFixed(2)}ms`);
|
|
220
|
+
// Bounds will be computed automatically by Three.js when needed
|
|
226
221
|
const totalTime = performance.now();
|
|
227
222
|
PerfLogger.log(`[Perf] Total geometry creation: ${(totalTime - startTime).toFixed(2)}ms`);
|
|
228
223
|
return geometry;
|
|
@@ -234,6 +229,11 @@ class MeshParser {
|
|
|
234
229
|
const root = new THREE.Group();
|
|
235
230
|
root.name = 'StowKitMesh';
|
|
236
231
|
const { geometries, materials, nodes, meshIndices } = parsedData;
|
|
232
|
+
// Pre-load ALL geometries in parallel for maximum speed
|
|
233
|
+
PerfLogger.log(`[Perf] Starting parallel Draco decode of ${geometries.length} geometries...`);
|
|
234
|
+
const geometryPromises = geometries.map(geoInfo => this.createGeometry(geoInfo, dataBlob, dracoLoader));
|
|
235
|
+
const loadedGeometries = await Promise.all(geometryPromises);
|
|
236
|
+
PerfLogger.log(`[Perf] All Draco decodes complete`);
|
|
237
237
|
// Create all Three.js objects for nodes
|
|
238
238
|
const nodeObjects = [];
|
|
239
239
|
for (const node of nodes) {
|
|
@@ -249,7 +249,7 @@ class MeshParser {
|
|
|
249
249
|
const meshIndex = meshIndices[meshIndexArrayPos];
|
|
250
250
|
if (meshIndex < geometries.length) {
|
|
251
251
|
const geoInfo = geometries[meshIndex];
|
|
252
|
-
const geometry =
|
|
252
|
+
const geometry = loadedGeometries[meshIndex];
|
|
253
253
|
// Use assigned material if valid, otherwise create default
|
|
254
254
|
let material;
|
|
255
255
|
if (geoInfo.materialIndex < materials.length) {
|
|
@@ -280,11 +280,11 @@ class MeshParser {
|
|
|
280
280
|
root.add(obj);
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
|
-
// If no nodes, create
|
|
283
|
+
// If no nodes, create meshes from all geometries
|
|
284
284
|
if (nodes.length === 0 && geometries.length > 0) {
|
|
285
285
|
for (let index = 0; index < geometries.length; index++) {
|
|
286
286
|
const geoInfo = geometries[index];
|
|
287
|
-
const geometry =
|
|
287
|
+
const geometry = loadedGeometries[index];
|
|
288
288
|
// Use assigned material if valid, otherwise create default
|
|
289
289
|
let material;
|
|
290
290
|
if (geoInfo.materialIndex < materials.length) {
|
|
@@ -707,7 +707,7 @@ class StowKitPack {
|
|
|
707
707
|
throw new Error(`Failed to read texture data: ${assetPath}`);
|
|
708
708
|
}
|
|
709
709
|
// Load as KTX2
|
|
710
|
-
return await this.loadKTX2Texture(data);
|
|
710
|
+
return await this.loadKTX2Texture(data, assetPath);
|
|
711
711
|
})();
|
|
712
712
|
this.textureCache.set(assetPath, loadPromise);
|
|
713
713
|
return loadPromise;
|
|
@@ -1028,19 +1028,19 @@ class StowKitPack {
|
|
|
1028
1028
|
}
|
|
1029
1029
|
return Array.from(uniqueTextures);
|
|
1030
1030
|
}
|
|
1031
|
-
async loadKTX2Texture(data) {
|
|
1032
|
-
|
|
1031
|
+
async loadKTX2Texture(data, textureName) {
|
|
1032
|
+
PerfLogger.log(`[Perf] KTX2/Basis texture size: ${data.byteLength} bytes${textureName ? ` (${textureName})` : ''}`);
|
|
1033
|
+
// Create blob URL - KTX2Loader requires a URL, can't use ArrayBuffer directly
|
|
1033
1034
|
const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
1034
1035
|
const blob = new Blob([arrayBuffer]);
|
|
1035
1036
|
const url = URL.createObjectURL(blob);
|
|
1036
|
-
PerfLogger.log(`[Perf] KTX2/Basis texture size: ${data.byteLength} bytes`);
|
|
1037
1037
|
try {
|
|
1038
1038
|
return await new Promise((resolve, reject) => {
|
|
1039
1039
|
const loadStart = performance.now();
|
|
1040
1040
|
this.ktx2Loader.load(url, (texture) => {
|
|
1041
1041
|
URL.revokeObjectURL(url);
|
|
1042
1042
|
const loadEnd = performance.now();
|
|
1043
|
-
PerfLogger.log(`[Perf] Basis transcode: ${(loadEnd - loadStart).toFixed(2)}ms (resolution: ${texture.image?.width || '?'}x${texture.image?.height || '?'})`);
|
|
1043
|
+
PerfLogger.log(`[Perf] Basis transcode: ${(loadEnd - loadStart).toFixed(2)}ms (${textureName || 'unknown'}, resolution: ${texture.image?.width || '?'}x${texture.image?.height || '?'})`);
|
|
1044
1044
|
texture.needsUpdate = true;
|
|
1045
1045
|
resolve(texture);
|
|
1046
1046
|
}, undefined, (error) => {
|