@stowkit/three-loader 0.1.28 → 0.1.30
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;IAkCrI;;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;IAkGtJ;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;CAK5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StowKitPack.d.ts","sourceRoot":"","sources":["../src/StowKitPack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAG5D;;GAEG;AACH,qBAAa,WAAW;IACb,MAAM,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAA4D;gBAEpE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW;IAMnF;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAe7D;;OAEG;YACW,gBAAgB;IAkY9B;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"StowKitPack.d.ts","sourceRoot":"","sources":["../src/StowKitPack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAG5D;;GAEG;AACH,qBAAa,WAAW;IACb,MAAM,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAA4D;gBAEpE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW;IAMnF;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAe7D;;OAEG;YACW,gBAAgB;IAkY9B;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAwCvD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;IA4BtE;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IA0BvF;;OAEG;IACH,UAAU;IAIV;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG;IAIhC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI/C;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAKnD;;OAEG;IACG,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAUjE;;OAEG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAY1D;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAMzE;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiBlE;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM;IAMlC;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM;IAIlC;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAKhC;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;IAQvE;;OAEG;IACG,aAAa,CACf,gBAAgB,EAAE,KAAK,CAAC,KAAK,EAC7B,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAA;KAAE,CAAC;IAUrG;;OAEG;IACG,oBAAoB,CACtB,gBAAgB,EAAE,KAAK,CAAC,KAAK,EAC7B,cAAc,EAAE,MAAM,GACvB,OAAO,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAA;KAAE,CAAC;IAUrG;;OAEG;IACG,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;IAW3E;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+H1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,IAAI,IAAI;YAMD,oBAAoB;YA0DpB,eAAe;IA4B7B,OAAO,CAAC,sBAAsB;IAwB9B,OAAO,CAAC,iBAAiB;CAM5B"}
|
|
@@ -192,39 +192,24 @@ class MeshParser {
|
|
|
192
192
|
* Create Three.js BufferGeometry from Draco compressed mesh data
|
|
193
193
|
*/
|
|
194
194
|
static async createGeometry(geoInfo, dataBlob, dracoLoader) {
|
|
195
|
-
const startTime = performance.now();
|
|
196
195
|
// Extract the Draco compressed buffer
|
|
197
196
|
if (geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize > dataBlob.length) {
|
|
198
197
|
throw new Error(`Compressed buffer out of bounds: offset=${geoInfo.compressedBufferOffset}, size=${geoInfo.compressedBufferSize}, dataLength=${dataBlob.length}`);
|
|
199
198
|
}
|
|
200
199
|
const compressedData = dataBlob.slice(geoInfo.compressedBufferOffset, geoInfo.compressedBufferOffset + geoInfo.compressedBufferSize);
|
|
201
|
-
const extractTime = performance.now();
|
|
202
|
-
PerfLogger.log(`[Perf] Draco extract: ${(extractTime - startTime).toFixed(2)}ms (${geoInfo.compressedBufferSize} bytes)`);
|
|
203
200
|
// Decode using Draco
|
|
204
|
-
// Create a blob URL for the Draco data (DRACOLoader expects a URL)
|
|
205
201
|
const arrayBuffer = compressedData.buffer.slice(compressedData.byteOffset, compressedData.byteOffset + compressedData.byteLength);
|
|
206
202
|
const blob = new Blob([arrayBuffer]);
|
|
207
203
|
const url = URL.createObjectURL(blob);
|
|
208
|
-
const decodeStart = performance.now();
|
|
209
204
|
const geometry = await new Promise((resolve, reject) => {
|
|
210
205
|
dracoLoader.load(url, (decoded) => {
|
|
211
206
|
URL.revokeObjectURL(url);
|
|
212
|
-
const decodeEnd = performance.now();
|
|
213
|
-
PerfLogger.log(`[Perf] Draco decode: ${(decodeEnd - decodeStart).toFixed(2)}ms (vertices: ${geoInfo.vertexCount}, indices: ${geoInfo.indexCount})`);
|
|
214
207
|
resolve(decoded);
|
|
215
208
|
}, undefined, (error) => {
|
|
216
209
|
URL.revokeObjectURL(url);
|
|
217
210
|
reject(new Error(`Failed to decode Draco geometry: ${error}`));
|
|
218
211
|
});
|
|
219
212
|
});
|
|
220
|
-
// Compute bounding volumes
|
|
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`);
|
|
226
|
-
const totalTime = performance.now();
|
|
227
|
-
PerfLogger.log(`[Perf] Total geometry creation: ${(totalTime - startTime).toFixed(2)}ms`);
|
|
228
213
|
return geometry;
|
|
229
214
|
}
|
|
230
215
|
/**
|
|
@@ -234,6 +219,13 @@ class MeshParser {
|
|
|
234
219
|
const root = new THREE.Group();
|
|
235
220
|
root.name = 'StowKitMesh';
|
|
236
221
|
const { geometries, materials, nodes, meshIndices } = parsedData;
|
|
222
|
+
// Pre-load ALL geometries in parallel for maximum speed
|
|
223
|
+
const dracoStart = performance.now();
|
|
224
|
+
const geometryPromises = geometries.map(geoInfo => this.createGeometry(geoInfo, dataBlob, dracoLoader));
|
|
225
|
+
const loadedGeometries = await Promise.all(geometryPromises);
|
|
226
|
+
const dracoTime = performance.now() - dracoStart;
|
|
227
|
+
const totalVerts = geometries.reduce((sum, g) => sum + g.vertexCount, 0);
|
|
228
|
+
PerfLogger.log(`[Perf] Draco decode: ${dracoTime.toFixed(2)}ms (${geometries.length} meshes, ${totalVerts} total vertices)`);
|
|
237
229
|
// Create all Three.js objects for nodes
|
|
238
230
|
const nodeObjects = [];
|
|
239
231
|
for (const node of nodes) {
|
|
@@ -249,7 +241,7 @@ class MeshParser {
|
|
|
249
241
|
const meshIndex = meshIndices[meshIndexArrayPos];
|
|
250
242
|
if (meshIndex < geometries.length) {
|
|
251
243
|
const geoInfo = geometries[meshIndex];
|
|
252
|
-
const geometry =
|
|
244
|
+
const geometry = loadedGeometries[meshIndex];
|
|
253
245
|
// Use assigned material if valid, otherwise create default
|
|
254
246
|
let material;
|
|
255
247
|
if (geoInfo.materialIndex < materials.length) {
|
|
@@ -280,11 +272,11 @@ class MeshParser {
|
|
|
280
272
|
root.add(obj);
|
|
281
273
|
}
|
|
282
274
|
}
|
|
283
|
-
// If no nodes, create
|
|
275
|
+
// If no nodes, create meshes from all geometries
|
|
284
276
|
if (nodes.length === 0 && geometries.length > 0) {
|
|
285
277
|
for (let index = 0; index < geometries.length; index++) {
|
|
286
278
|
const geoInfo = geometries[index];
|
|
287
|
-
const geometry =
|
|
279
|
+
const geometry = loadedGeometries[index];
|
|
288
280
|
// Use assigned material if valid, otherwise create default
|
|
289
281
|
let material;
|
|
290
282
|
if (geoInfo.materialIndex < materials.length) {
|
|
@@ -653,17 +645,13 @@ class StowKitPack {
|
|
|
653
645
|
async loadMesh(assetPath) {
|
|
654
646
|
const totalStart = performance.now();
|
|
655
647
|
// Find asset by path
|
|
656
|
-
const findStart = performance.now();
|
|
657
648
|
const assetIndex = this.reader.findAssetByPath(assetPath);
|
|
658
649
|
if (assetIndex < 0) {
|
|
659
650
|
throw new Error(`Mesh not found: ${assetPath}`);
|
|
660
651
|
}
|
|
661
|
-
PerfLogger.log(`[Perf] Find asset: ${(performance.now() - findStart).toFixed(2)}ms`);
|
|
662
652
|
// Read mesh data and metadata
|
|
663
|
-
const readStart = performance.now();
|
|
664
653
|
const data = this.reader.readAssetData(assetIndex);
|
|
665
654
|
const metadata = this.reader.readAssetMetadata(assetIndex);
|
|
666
|
-
PerfLogger.log(`[Perf] Read mesh data: ${(performance.now() - readStart).toFixed(2)}ms (data: ${data?.byteLength || 0} bytes, metadata: ${metadata?.byteLength || 0} bytes)`);
|
|
667
655
|
if (!data) {
|
|
668
656
|
throw new Error(`Failed to read mesh data: ${assetPath}`);
|
|
669
657
|
}
|
|
@@ -671,18 +659,18 @@ class StowKitPack {
|
|
|
671
659
|
throw new Error(`No metadata available: ${assetPath}`);
|
|
672
660
|
}
|
|
673
661
|
// Parse mesh data
|
|
674
|
-
const parseStart = performance.now();
|
|
675
662
|
const parsedData = MeshParser.parseMeshData(metadata, data);
|
|
676
|
-
PerfLogger.log(`[Perf] Parse mesh metadata: ${(performance.now() - parseStart).toFixed(2)}ms`);
|
|
677
663
|
// Load textures for materials
|
|
678
664
|
const textureStart = performance.now();
|
|
679
665
|
const textureNames = await this.loadMaterialTextures(parsedData.materialData, parsedData.materials);
|
|
680
|
-
|
|
666
|
+
const textureTime = performance.now() - textureStart;
|
|
667
|
+
if (textureNames.length > 0) {
|
|
668
|
+
PerfLogger.log(`[Perf] Textures: ${textureTime.toFixed(2)}ms (${textureNames.join(', ')})`);
|
|
669
|
+
}
|
|
681
670
|
// Build Three.js scene with Draco decoder
|
|
682
|
-
const buildStart = performance.now();
|
|
683
671
|
const scene = await MeshParser.buildScene(parsedData, data, this.dracoLoader);
|
|
684
|
-
|
|
685
|
-
PerfLogger.log(`[Perf]
|
|
672
|
+
const totalTime = performance.now() - totalStart;
|
|
673
|
+
PerfLogger.log(`[Perf] === Mesh "${assetPath}": ${totalTime.toFixed(2)}ms total ===`);
|
|
686
674
|
return scene;
|
|
687
675
|
}
|
|
688
676
|
/**
|
|
@@ -691,7 +679,6 @@ class StowKitPack {
|
|
|
691
679
|
async loadTexture(assetPath) {
|
|
692
680
|
// Check cache first
|
|
693
681
|
if (this.textureCache.has(assetPath)) {
|
|
694
|
-
PerfLogger.log(`[Perf] Texture cache hit: ${assetPath}`);
|
|
695
682
|
return this.textureCache.get(assetPath);
|
|
696
683
|
}
|
|
697
684
|
// Cache the promise to avoid duplicate loads
|
|
@@ -707,7 +694,7 @@ class StowKitPack {
|
|
|
707
694
|
throw new Error(`Failed to read texture data: ${assetPath}`);
|
|
708
695
|
}
|
|
709
696
|
// Load as KTX2
|
|
710
|
-
return await this.loadKTX2Texture(data);
|
|
697
|
+
return await this.loadKTX2Texture(data, assetPath);
|
|
711
698
|
})();
|
|
712
699
|
this.textureCache.set(assetPath, loadPromise);
|
|
713
700
|
return loadPromise;
|
|
@@ -1028,19 +1015,15 @@ class StowKitPack {
|
|
|
1028
1015
|
}
|
|
1029
1016
|
return Array.from(uniqueTextures);
|
|
1030
1017
|
}
|
|
1031
|
-
async loadKTX2Texture(data) {
|
|
1032
|
-
|
|
1018
|
+
async loadKTX2Texture(data, textureName) {
|
|
1019
|
+
// Create blob URL - KTX2Loader requires a URL, can't use ArrayBuffer directly
|
|
1033
1020
|
const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
1034
1021
|
const blob = new Blob([arrayBuffer]);
|
|
1035
1022
|
const url = URL.createObjectURL(blob);
|
|
1036
|
-
PerfLogger.log(`[Perf] KTX2/Basis texture size: ${data.byteLength} bytes`);
|
|
1037
1023
|
try {
|
|
1038
1024
|
return await new Promise((resolve, reject) => {
|
|
1039
|
-
const loadStart = performance.now();
|
|
1040
1025
|
this.ktx2Loader.load(url, (texture) => {
|
|
1041
1026
|
URL.revokeObjectURL(url);
|
|
1042
|
-
const loadEnd = performance.now();
|
|
1043
|
-
PerfLogger.log(`[Perf] Basis transcode: ${(loadEnd - loadStart).toFixed(2)}ms (resolution: ${texture.image?.width || '?'}x${texture.image?.height || '?'})`);
|
|
1044
1027
|
texture.needsUpdate = true;
|
|
1045
1028
|
resolve(texture);
|
|
1046
1029
|
}, undefined, (error) => {
|