@loaders.gl/gltf 4.4.0-alpha.1 → 4.4.0-alpha.11

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.
Files changed (106) hide show
  1. package/dist/dist.dev.js +185 -68
  2. package/dist/dist.min.js +1 -1
  3. package/dist/glb-loader.d.ts +9 -6
  4. package/dist/glb-loader.d.ts.map +1 -1
  5. package/dist/glb-loader.js +2 -2
  6. package/dist/glb-loader.js.map +1 -0
  7. package/dist/glb-writer.js +1 -0
  8. package/dist/glb-writer.js.map +1 -0
  9. package/dist/gltf-loader.d.ts +2 -3
  10. package/dist/gltf-loader.d.ts.map +1 -1
  11. package/dist/gltf-loader.js +6 -8
  12. package/dist/gltf-loader.js.map +1 -0
  13. package/dist/gltf-writer.js +1 -0
  14. package/dist/gltf-writer.js.map +1 -0
  15. package/dist/index.cjs +78 -51
  16. package/dist/index.cjs.map +4 -4
  17. package/dist/index.js +1 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lib/api/gltf-extensions.js +1 -0
  20. package/dist/lib/api/gltf-extensions.js.map +1 -0
  21. package/dist/lib/api/gltf-scenegraph.js +1 -0
  22. package/dist/lib/api/gltf-scenegraph.js.map +1 -0
  23. package/dist/lib/api/normalize-gltf-v1.js +1 -0
  24. package/dist/lib/api/normalize-gltf-v1.js.map +1 -0
  25. package/dist/lib/api/post-process-gltf.d.ts.map +1 -1
  26. package/dist/lib/api/post-process-gltf.js +3 -1
  27. package/dist/lib/api/post-process-gltf.js.map +1 -0
  28. package/dist/lib/encoders/encode-glb.js +1 -0
  29. package/dist/lib/encoders/encode-glb.js.map +1 -0
  30. package/dist/lib/encoders/encode-gltf.js +1 -0
  31. package/dist/lib/encoders/encode-gltf.js.map +1 -0
  32. package/dist/lib/extensions/EXT_mesh_features.js +1 -0
  33. package/dist/lib/extensions/EXT_mesh_features.js.map +1 -0
  34. package/dist/lib/extensions/EXT_meshopt_compression.js +1 -0
  35. package/dist/lib/extensions/EXT_meshopt_compression.js.map +1 -0
  36. package/dist/lib/extensions/EXT_structural_metadata.d.ts.map +1 -1
  37. package/dist/lib/extensions/EXT_structural_metadata.js +3 -1
  38. package/dist/lib/extensions/EXT_structural_metadata.js.map +1 -0
  39. package/dist/lib/extensions/EXT_texture_webp.js +1 -0
  40. package/dist/lib/extensions/EXT_texture_webp.js.map +1 -0
  41. package/dist/lib/extensions/KHR_binary_gltf.js +1 -0
  42. package/dist/lib/extensions/KHR_binary_gltf.js.map +1 -0
  43. package/dist/lib/extensions/KHR_draco_mesh_compression.js +1 -0
  44. package/dist/lib/extensions/KHR_draco_mesh_compression.js.map +1 -0
  45. package/dist/lib/extensions/KHR_texture_basisu.js +1 -0
  46. package/dist/lib/extensions/KHR_texture_basisu.js.map +1 -0
  47. package/dist/lib/extensions/KHR_texture_transform.d.ts.map +1 -1
  48. package/dist/lib/extensions/KHR_texture_transform.js +36 -14
  49. package/dist/lib/extensions/KHR_texture_transform.js.map +1 -0
  50. package/dist/lib/extensions/deprecated/EXT_feature_metadata.js +1 -0
  51. package/dist/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
  52. package/dist/lib/extensions/deprecated/KHR_lights_punctual.js +1 -0
  53. package/dist/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -0
  54. package/dist/lib/extensions/deprecated/KHR_materials_unlit.js +1 -0
  55. package/dist/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -0
  56. package/dist/lib/extensions/deprecated/KHR_techniques_webgl.js +1 -0
  57. package/dist/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -0
  58. package/dist/lib/extensions/utils/3d-tiles-utils.d.ts.map +1 -1
  59. package/dist/lib/extensions/utils/3d-tiles-utils.js +3 -1
  60. package/dist/lib/extensions/utils/3d-tiles-utils.js.map +1 -0
  61. package/dist/lib/gltf-utils/get-typed-array.js +1 -0
  62. package/dist/lib/gltf-utils/get-typed-array.js.map +1 -0
  63. package/dist/lib/gltf-utils/gltf-attribute-utils.js +1 -0
  64. package/dist/lib/gltf-utils/gltf-attribute-utils.js.map +1 -0
  65. package/dist/lib/gltf-utils/gltf-constants.js +1 -0
  66. package/dist/lib/gltf-utils/gltf-constants.js.map +1 -0
  67. package/dist/lib/gltf-utils/gltf-utils.js +1 -0
  68. package/dist/lib/gltf-utils/gltf-utils.js.map +1 -0
  69. package/dist/lib/gltf-utils/resolve-url.js +2 -1
  70. package/dist/lib/gltf-utils/resolve-url.js.map +1 -0
  71. package/dist/lib/parsers/parse-glb.js +1 -0
  72. package/dist/lib/parsers/parse-glb.js.map +1 -0
  73. package/dist/lib/parsers/parse-gltf.d.ts.map +1 -1
  74. package/dist/lib/parsers/parse-gltf.js +11 -8
  75. package/dist/lib/parsers/parse-gltf.js.map +1 -0
  76. package/dist/lib/types/glb-types.js +1 -0
  77. package/dist/lib/types/glb-types.js.map +1 -0
  78. package/dist/lib/types/gltf-ext-feature-metadata-schema.js +1 -0
  79. package/dist/lib/types/gltf-ext-feature-metadata-schema.js.map +1 -0
  80. package/dist/lib/types/gltf-ext-mesh-features-schema.js +1 -0
  81. package/dist/lib/types/gltf-ext-mesh-features-schema.js.map +1 -0
  82. package/dist/lib/types/gltf-ext-structural-metadata-schema.js +1 -0
  83. package/dist/lib/types/gltf-ext-structural-metadata-schema.js.map +1 -0
  84. package/dist/lib/types/gltf-json-schema.js +1 -0
  85. package/dist/lib/types/gltf-json-schema.js.map +1 -0
  86. package/dist/lib/types/gltf-postprocessed-schema.js +1 -0
  87. package/dist/lib/types/gltf-postprocessed-schema.js.map +1 -0
  88. package/dist/lib/types/gltf-types.js +1 -0
  89. package/dist/lib/types/gltf-types.js.map +1 -0
  90. package/dist/lib/utils/assert.js +1 -0
  91. package/dist/lib/utils/assert.js.map +1 -0
  92. package/dist/lib/utils/version.js +2 -1
  93. package/dist/lib/utils/version.js.map +1 -0
  94. package/dist/meshopt/meshopt-decoder.js +1 -0
  95. package/dist/meshopt/meshopt-decoder.js.map +1 -0
  96. package/dist/webp/webp.js +1 -0
  97. package/dist/webp/webp.js.map +1 -0
  98. package/package.json +8 -8
  99. package/src/glb-loader.ts +10 -8
  100. package/src/gltf-loader.ts +8 -12
  101. package/src/lib/api/post-process-gltf.ts +3 -2
  102. package/src/lib/extensions/EXT_structural_metadata.ts +2 -1
  103. package/src/lib/extensions/KHR_texture_transform.ts +41 -17
  104. package/src/lib/extensions/utils/3d-tiles-utils.ts +2 -1
  105. package/src/lib/gltf-utils/resolve-url.ts +1 -1
  106. package/src/lib/parsers/parse-gltf.ts +14 -10
package/dist/dist.dev.js CHANGED
@@ -105,6 +105,9 @@ var __exports__ = (() => {
105
105
  var matches = typeof process !== "undefined" && process.version && /v([0-9]*)/.exec(process.version);
106
106
  var nodeVersion = matches && parseFloat(matches[1]) || 0;
107
107
 
108
+ // ../loader-utils/src/lib/javascript-utils/is-type.ts
109
+ var isSharedArrayBuffer = (value) => typeof SharedArrayBuffer !== "undefined" && value instanceof SharedArrayBuffer;
110
+
108
111
  // ../loader-utils/src/lib/module-utils/js-module-utils.ts
109
112
  function registerJSModules(modules) {
110
113
  globalThis.loaders ||= {};
@@ -120,14 +123,16 @@ var __exports__ = (() => {
120
123
  var NPM_TAG = "beta";
121
124
 
122
125
  // ../worker-utils/src/lib/env-utils/version.ts
126
+ var warningIssued = false;
123
127
  function getVersion() {
124
128
  if (!globalThis._loadersgl_?.version) {
125
129
  globalThis._loadersgl_ = globalThis._loadersgl_ || {};
126
- if (typeof __VERSION__ === "undefined") {
130
+ if (typeof __VERSION__ === "undefined" && !warningIssued) {
127
131
  console.warn(
128
132
  "loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN."
129
133
  );
130
134
  globalThis._loadersgl_.version = NPM_TAG;
135
+ warningIssued = true;
131
136
  } else {
132
137
  globalThis._loadersgl_.version = __VERSION__;
133
138
  }
@@ -174,6 +179,9 @@ var __exports__ = (() => {
174
179
  return await loadLibraryPromises[libraryUrl];
175
180
  }
176
181
  function getLibraryUrl(library, moduleName, options = {}, libraryName = null) {
182
+ if (options?.core) {
183
+ throw new Error("loadLibrary: options.core must be pre-normalized");
184
+ }
177
185
  if (!options.useLocalLibraries && library.startsWith("http")) {
178
186
  return library;
179
187
  }
@@ -199,10 +207,20 @@ var __exports__ = (() => {
199
207
  return await loadAsArrayBuffer(libraryUrl);
200
208
  }
201
209
  if (!isBrowser2) {
210
+ const { requireFromFile } = globalThis.loaders || {};
202
211
  try {
203
- const { requireFromFile } = globalThis.loaders || {};
204
- return await requireFromFile?.(libraryUrl);
212
+ const result = await requireFromFile?.(libraryUrl);
213
+ if (result || !libraryUrl.includes("/dist/libs/")) {
214
+ return result;
215
+ }
216
+ return await requireFromFile?.(libraryUrl.replace("/dist/libs/", "/src/libs/"));
205
217
  } catch (error) {
218
+ if (libraryUrl.includes("/dist/libs/")) {
219
+ try {
220
+ return await requireFromFile?.(libraryUrl.replace("/dist/libs/", "/src/libs/"));
221
+ } catch {
222
+ }
223
+ }
206
224
  console.error(error);
207
225
  return null;
208
226
  }
@@ -238,7 +256,14 @@ var __exports__ = (() => {
238
256
  const response = await fetch(url);
239
257
  return await response.arrayBuffer();
240
258
  }
241
- return await readFileAsArrayBuffer(url);
259
+ try {
260
+ return await readFileAsArrayBuffer(url);
261
+ } catch {
262
+ if (url.includes("/dist/libs/")) {
263
+ return await readFileAsArrayBuffer(url.replace("/dist/libs/", "/src/libs/"));
264
+ }
265
+ throw new Error(`Failed to load ArrayBuffer from ${url}`);
266
+ }
242
267
  }
243
268
  async function loadAsText(url) {
244
269
  const { readFileAsText } = globalThis.loaders || {};
@@ -246,7 +271,14 @@ var __exports__ = (() => {
246
271
  const response = await fetch(url);
247
272
  return await response.text();
248
273
  }
249
- return await readFileAsText(url);
274
+ try {
275
+ return await readFileAsText(url);
276
+ } catch {
277
+ if (url.includes("/dist/libs/")) {
278
+ return await readFileAsText(url.replace("/dist/libs/", "/src/libs/"));
279
+ }
280
+ throw new Error(`Failed to load text from ${url}`);
281
+ }
250
282
  }
251
283
 
252
284
  // ../loader-utils/src/lib/binary-utils/get-first-characters.ts
@@ -334,6 +366,27 @@ var __exports__ = (() => {
334
366
  return byteOffset;
335
367
  }
336
368
 
369
+ // ../loader-utils/src/lib/binary-utils/memory-conversion-utils.ts
370
+ function ensureArrayBuffer(bufferSource) {
371
+ if (bufferSource instanceof ArrayBuffer) {
372
+ return bufferSource;
373
+ }
374
+ if (isSharedArrayBuffer(bufferSource)) {
375
+ return copyToArrayBuffer(bufferSource);
376
+ }
377
+ const { buffer, byteOffset, byteLength } = bufferSource;
378
+ if (buffer instanceof ArrayBuffer && byteOffset === 0 && byteLength === buffer.byteLength) {
379
+ return buffer;
380
+ }
381
+ return copyToArrayBuffer(buffer, byteOffset, byteLength);
382
+ }
383
+ function copyToArrayBuffer(buffer, byteOffset = 0, byteLength = buffer.byteLength - byteOffset) {
384
+ const view = new Uint8Array(buffer, byteOffset, byteLength);
385
+ const copy = new Uint8Array(view.length);
386
+ copy.set(view);
387
+ return copy.buffer;
388
+ }
389
+
337
390
  // ../images/src/lib/category-api/image-type.ts
338
391
  var parseImageNode = globalThis.loaders?.parseImageNode;
339
392
  var IMAGE_SUPPORTED = typeof Image !== "undefined";
@@ -470,7 +523,6 @@ var __exports__ = (() => {
470
523
  }
471
524
 
472
525
  // ../images/src/lib/parsers/parse-to-image-bitmap.ts
473
- var EMPTY_OBJECT = {};
474
526
  var imagebitmapOptionsSupported = true;
475
527
  async function parseToImageBitmap(arrayBuffer, options, url) {
476
528
  let blob;
@@ -498,8 +550,13 @@ var __exports__ = (() => {
498
550
  return await createImageBitmap(blob);
499
551
  }
500
552
  function isEmptyObject(object) {
501
- for (const key in object || EMPTY_OBJECT) {
502
- return false;
553
+ if (!object) {
554
+ return true;
555
+ }
556
+ for (const key in object) {
557
+ if (Object.prototype.hasOwnProperty.call(object, key)) {
558
+ return false;
559
+ }
503
560
  }
504
561
  return true;
505
562
  }
@@ -1520,7 +1577,7 @@ var __exports__ = (() => {
1520
1577
  buffer = bufferArray.slice(offset, offset + byteLength).buffer;
1521
1578
  offset = 0;
1522
1579
  }
1523
- return new ArrayType(buffer, offset, length);
1580
+ return new ArrayType(ensureArrayBuffer(buffer), offset, length);
1524
1581
  }
1525
1582
  function getPrimitiveTextureData(scenegraph, textureInfo, primitive) {
1526
1583
  const texCoordAccessorKey = `TEXCOORD_${textureInfo.texCoord || 0}`;
@@ -2278,7 +2335,7 @@ var __exports__ = (() => {
2278
2335
  }
2279
2336
  function createBufferView(typedArray, scenegraph) {
2280
2337
  scenegraph.gltf.buffers.push({
2281
- arrayBuffer: typedArray.buffer,
2338
+ arrayBuffer: ensureArrayBuffer(typedArray.buffer),
2282
2339
  byteOffset: typedArray.byteOffset,
2283
2340
  byteLength: typedArray.byteLength
2284
2341
  });
@@ -2801,18 +2858,18 @@ var __exports__ = (() => {
2801
2858
  bgr565: { basisFormat: 15, compressed: false },
2802
2859
  rgba4444: { basisFormat: 16, compressed: false }
2803
2860
  };
2804
- async function parseBasis(data, options) {
2805
- if (options.basis.containerFormat === "auto") {
2861
+ async function parseBasis(data, options = {}) {
2862
+ if (!options.basis?.containerFormat || options.basis.containerFormat === "auto") {
2806
2863
  if (isKTX(data)) {
2807
- const fileConstructors = await loadBasisEncoderModule(options);
2864
+ const fileConstructors = await loadBasisEncoderModule(options?.core || {});
2808
2865
  return parseKTX2File(fileConstructors.KTX2File, data, options);
2809
2866
  }
2810
- const { BasisFile } = await loadBasisTranscoderModule(options);
2867
+ const { BasisFile } = await loadBasisTranscoderModule(options?.core || {});
2811
2868
  return parseBasisFile(BasisFile, data, options);
2812
2869
  }
2813
2870
  switch (options.basis.module) {
2814
2871
  case "encoder":
2815
- const fileConstructors = await loadBasisEncoderModule(options);
2872
+ const fileConstructors = await loadBasisEncoderModule(options?.core || {});
2816
2873
  switch (options.basis.containerFormat) {
2817
2874
  case "ktx2":
2818
2875
  return parseKTX2File(fileConstructors.KTX2File, data, options);
@@ -2822,7 +2879,7 @@ var __exports__ = (() => {
2822
2879
  }
2823
2880
  case "transcoder":
2824
2881
  default:
2825
- const { BasisFile } = await loadBasisTranscoderModule(options);
2882
+ const { BasisFile } = await loadBasisTranscoderModule(options.core || {});
2826
2883
  return parseBasisFile(BasisFile, data, options);
2827
2884
  }
2828
2885
  }
@@ -2925,7 +2982,7 @@ var __exports__ = (() => {
2925
2982
  };
2926
2983
  }
2927
2984
  function getBasisOptions(options, hasAlpha) {
2928
- let format = options && options.basis && options.basis.format;
2985
+ let format = options.basis?.format;
2929
2986
  if (format === "auto") {
2930
2987
  format = selectSupportedBasisFormat();
2931
2988
  }
@@ -3100,7 +3157,7 @@ var __exports__ = (() => {
3100
3157
  if (absolute) {
3101
3158
  return url;
3102
3159
  }
3103
- const baseUrl = options.baseUri || options.uri;
3160
+ const baseUrl = options?.core?.baseUri || options.baseUri || options.uri;
3104
3161
  if (!baseUrl) {
3105
3162
  throw new Error(`'baseUri' must be provided to resolve relative url ${url}`);
3106
3163
  }
@@ -3439,21 +3496,32 @@ var __exports__ = (() => {
3439
3496
  [DRACO_EXTERNAL_LIBRARIES.ENCODER]: `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/${DRACO_EXTERNAL_LIBRARIES.ENCODER}`
3440
3497
  };
3441
3498
  var loadDecoderPromise;
3442
- async function loadDracoDecoderModule(options) {
3499
+ async function loadDracoDecoderModule(options = {}, type) {
3443
3500
  const modules = options.modules || {};
3444
3501
  if (modules.draco3d) {
3445
3502
  loadDecoderPromise ||= modules.draco3d.createDecoderModule({}).then((draco) => {
3446
3503
  return { draco };
3447
3504
  });
3448
3505
  } else {
3449
- loadDecoderPromise ||= loadDracoDecoder(options);
3506
+ loadDecoderPromise ||= loadDracoDecoder(options, type);
3450
3507
  }
3451
3508
  return await loadDecoderPromise;
3452
3509
  }
3453
- async function loadDracoDecoder(options) {
3510
+ function getLibraryExport(library, exportName) {
3511
+ if (library && typeof library === "object") {
3512
+ if (library.default) {
3513
+ return library.default;
3514
+ }
3515
+ if (library[exportName]) {
3516
+ return library[exportName];
3517
+ }
3518
+ }
3519
+ return library;
3520
+ }
3521
+ async function loadDracoDecoder(options, type) {
3454
3522
  let DracoDecoderModule;
3455
3523
  let wasmBinary;
3456
- switch (options.draco && options.draco.decoderType) {
3524
+ switch (type) {
3457
3525
  case "js":
3458
3526
  DracoDecoderModule = await loadLibrary(
3459
3527
  DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER],
@@ -3464,25 +3532,52 @@ var __exports__ = (() => {
3464
3532
  break;
3465
3533
  case "wasm":
3466
3534
  default:
3467
- [DracoDecoderModule, wasmBinary] = await Promise.all([
3468
- await loadLibrary(
3469
- DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
3470
- "draco",
3471
- options,
3472
- DRACO_EXTERNAL_LIBRARIES.DECODER
3473
- ),
3474
- await loadLibrary(
3475
- DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
3476
- "draco",
3477
- options,
3478
- DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
3479
- )
3480
- ]);
3535
+ try {
3536
+ [DracoDecoderModule, wasmBinary] = await Promise.all([
3537
+ await loadLibrary(
3538
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
3539
+ "draco",
3540
+ options,
3541
+ DRACO_EXTERNAL_LIBRARIES.DECODER
3542
+ ),
3543
+ await loadLibrary(
3544
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
3545
+ "draco",
3546
+ options,
3547
+ DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
3548
+ )
3549
+ ]);
3550
+ } catch {
3551
+ DracoDecoderModule = null;
3552
+ wasmBinary = null;
3553
+ }
3481
3554
  }
3555
+ DracoDecoderModule = getLibraryExport(DracoDecoderModule, "DracoDecoderModule");
3482
3556
  DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
3557
+ if (!DracoDecoderModule && !isBrowser2) {
3558
+ [DracoDecoderModule, wasmBinary] = await Promise.all([
3559
+ await loadLibrary(
3560
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
3561
+ "draco",
3562
+ { ...options, useLocalLibraries: true },
3563
+ DRACO_EXTERNAL_LIBRARIES.DECODER
3564
+ ),
3565
+ await loadLibrary(
3566
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
3567
+ "draco",
3568
+ { ...options, useLocalLibraries: true },
3569
+ DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
3570
+ )
3571
+ ]);
3572
+ DracoDecoderModule = getLibraryExport(DracoDecoderModule, "DracoDecoderModule");
3573
+ DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
3574
+ }
3483
3575
  return await initializeDracoDecoder(DracoDecoderModule, wasmBinary);
3484
3576
  }
3485
3577
  function initializeDracoDecoder(DracoDecoderModule, wasmBinary) {
3578
+ if (typeof DracoDecoderModule !== "function") {
3579
+ throw new Error("DracoDecoderModule could not be loaded");
3580
+ }
3486
3581
  const options = {};
3487
3582
  if (wasmBinary) {
3488
3583
  options.wasmBinary = wasmBinary;
@@ -4102,7 +4197,10 @@ var __exports__ = (() => {
4102
4197
  parse
4103
4198
  };
4104
4199
  async function parse(arrayBuffer, options) {
4105
- const { draco } = await loadDracoDecoderModule(options);
4200
+ const { draco } = await loadDracoDecoderModule(
4201
+ options?.core,
4202
+ options?.draco?.decoderType || "wasm"
4203
+ );
4106
4204
  const dracoParser = new DracoParser(draco);
4107
4205
  try {
4108
4206
  return dracoParser.parseSync(arrayBuffer, options?.draco);
@@ -5566,7 +5664,7 @@ var __exports__ = (() => {
5566
5664
  const texCoordAccessor = primitive.attributes[`TEXCOORD_${originalTexCoord}`];
5567
5665
  if (Number.isFinite(texCoordAccessor)) {
5568
5666
  const accessor = gltfData.json.accessors?.[texCoordAccessor];
5569
- if (accessor && accessor.bufferView) {
5667
+ if (accessor && accessor.bufferView !== void 0) {
5570
5668
  const bufferView = gltfData.json.bufferViews?.[accessor.bufferView];
5571
5669
  if (bufferView) {
5572
5670
  const { arrayBuffer, byteOffset: bufferByteOffset } = gltfData.buffers[bufferView.buffer];
@@ -5583,7 +5681,7 @@ var __exports__ = (() => {
5583
5681
  result.set([scratchVector[0], scratchVector[1]], i * components);
5584
5682
  }
5585
5683
  if (originalTexCoord === texCoord) {
5586
- updateGltf(accessor, bufferView, gltfData.buffers, result);
5684
+ updateGltf(accessor, gltfData, result, accessor.bufferView);
5587
5685
  } else {
5588
5686
  createAttribute(texCoord, accessor, primitive, gltfData, result);
5589
5687
  }
@@ -5591,28 +5689,49 @@ var __exports__ = (() => {
5591
5689
  }
5592
5690
  }
5593
5691
  }
5594
- function updateGltf(accessor, bufferView, buffers, newTexCoordArray) {
5692
+ function updateGltf(accessor, gltfData, newTexCoordArray, originalBufferViewIndex) {
5595
5693
  accessor.componentType = 5126;
5596
- buffers.push({
5597
- arrayBuffer: newTexCoordArray.buffer,
5694
+ accessor.byteOffset = 0;
5695
+ const accessors = gltfData.json.accessors || [];
5696
+ const bufferViewReferenceCount = accessors.reduce((count, currentAccessor) => {
5697
+ return currentAccessor.bufferView === originalBufferViewIndex ? count + 1 : count;
5698
+ }, 0);
5699
+ const shouldCreateNewBufferView = bufferViewReferenceCount > 1;
5700
+ gltfData.buffers.push({
5701
+ arrayBuffer: ensureArrayBuffer(newTexCoordArray.buffer),
5598
5702
  byteOffset: 0,
5599
5703
  byteLength: newTexCoordArray.buffer.byteLength
5600
5704
  });
5601
- bufferView.buffer = buffers.length - 1;
5602
- bufferView.byteLength = newTexCoordArray.buffer.byteLength;
5705
+ const newBufferIndex = gltfData.buffers.length - 1;
5706
+ gltfData.json.bufferViews = gltfData.json.bufferViews || [];
5707
+ if (shouldCreateNewBufferView) {
5708
+ gltfData.json.bufferViews.push({
5709
+ buffer: newBufferIndex,
5710
+ byteLength: newTexCoordArray.buffer.byteLength,
5711
+ byteOffset: 0
5712
+ });
5713
+ accessor.bufferView = gltfData.json.bufferViews.length - 1;
5714
+ return;
5715
+ }
5716
+ const bufferView = gltfData.json.bufferViews[originalBufferViewIndex];
5717
+ if (!bufferView) {
5718
+ return;
5719
+ }
5720
+ bufferView.buffer = newBufferIndex;
5603
5721
  bufferView.byteOffset = 0;
5604
- delete bufferView.byteStride;
5722
+ bufferView.byteLength = newTexCoordArray.buffer.byteLength;
5723
+ if (bufferView.byteStride !== void 0) {
5724
+ delete bufferView.byteStride;
5725
+ }
5605
5726
  }
5606
5727
  function createAttribute(newTexCoord, originalAccessor, primitive, gltfData, newTexCoordArray) {
5607
5728
  gltfData.buffers.push({
5608
- arrayBuffer: newTexCoordArray.buffer,
5729
+ arrayBuffer: ensureArrayBuffer(newTexCoordArray.buffer),
5609
5730
  byteOffset: 0,
5610
5731
  byteLength: newTexCoordArray.buffer.byteLength
5611
5732
  });
5733
+ gltfData.json.bufferViews = gltfData.json.bufferViews || [];
5612
5734
  const bufferViews = gltfData.json.bufferViews;
5613
- if (!bufferViews) {
5614
- return;
5615
- }
5616
5735
  bufferViews.push({
5617
5736
  buffer: gltfData.buffers.length - 1,
5618
5737
  byteLength: newTexCoordArray.buffer.byteLength,
@@ -6088,10 +6207,10 @@ var __exports__ = (() => {
6088
6207
  return gltf;
6089
6208
  }
6090
6209
  function parseGLTFContainerSync(gltf, data, byteOffset, options) {
6091
- if (options.uri) {
6092
- gltf.baseUri = options.uri;
6210
+ if (options.core?.baseUri) {
6211
+ gltf.baseUri = options.core?.baseUri;
6093
6212
  }
6094
- if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options)) {
6213
+ if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options.glb)) {
6095
6214
  const textDecoder = new TextDecoder();
6096
6215
  data = textDecoder.decode(data);
6097
6216
  }
@@ -6179,14 +6298,16 @@ var __exports__ = (() => {
6179
6298
  arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);
6180
6299
  }
6181
6300
  assert3(arrayBuffer, "glTF image has no data");
6301
+ const strictOptions = options;
6302
+ const gltfOptions = {
6303
+ ...strictOptions,
6304
+ core: { ...strictOptions?.core, mimeType: image.mimeType },
6305
+ basis: strictOptions.basis || { format: selectSupportedBasisFormat() }
6306
+ };
6182
6307
  let parsedImage = await parseFromContext(
6183
6308
  arrayBuffer,
6184
6309
  [ImageLoader, BasisLoader],
6185
- {
6186
- ...options,
6187
- mimeType: image.mimeType,
6188
- basis: options.basis || { format: selectSupportedBasisFormat() }
6189
- },
6310
+ gltfOptions,
6190
6311
  context
6191
6312
  );
6192
6313
  if (parsedImage && parsedImage[0]) {
@@ -6227,18 +6348,15 @@ var __exports__ = (() => {
6227
6348
  // Create image objects
6228
6349
  decompressMeshes: true
6229
6350
  // Decompress Draco encoded meshes
6230
- },
6231
- // common?
6232
- log: console
6233
- // eslint-disable-line
6351
+ }
6234
6352
  }
6235
6353
  };
6236
6354
  async function parse2(arrayBuffer, options = {}, context) {
6237
- options = { ...GLTFLoader.options, ...options };
6238
- options.gltf = { ...GLTFLoader.options.gltf, ...options.gltf };
6239
- const { byteOffset = 0 } = options;
6355
+ const mergedOptions = { ...GLTFLoader.options, ...options };
6356
+ mergedOptions.gltf = { ...GLTFLoader.options.gltf, ...mergedOptions.gltf };
6357
+ const byteOffset = options?.glb?.byteOffset || 0;
6240
6358
  const gltf = {};
6241
- return await parseGLTF(gltf, arrayBuffer, byteOffset, options, context);
6359
+ return await parseGLTF(gltf, arrayBuffer, byteOffset, mergedOptions, context);
6242
6360
  }
6243
6361
 
6244
6362
  // src/lib/encoders/encode-glb.ts
@@ -6352,9 +6470,8 @@ var __exports__ = (() => {
6352
6470
  return parseSync(arrayBuffer, options);
6353
6471
  }
6354
6472
  function parseSync(arrayBuffer, options) {
6355
- const { byteOffset = 0 } = options || {};
6356
6473
  const glb = {};
6357
- parseGLBSync(glb, arrayBuffer, byteOffset, options?.glb);
6474
+ parseGLBSync(glb, arrayBuffer, options?.glb?.byteOffset || 0, options?.glb);
6358
6475
  return glb;
6359
6476
  }
6360
6477
 
@@ -6685,7 +6802,7 @@ var __exports__ = (() => {
6685
6802
  const buffer = accessor.bufferView.buffer;
6686
6803
  const { ArrayType, byteLength } = getAccessorArrayTypeAndLength(accessor, accessor.bufferView);
6687
6804
  const byteOffset = (accessor.bufferView.byteOffset || 0) + (accessor.byteOffset || 0) + buffer.byteOffset;
6688
- let cutBuffer = buffer.arrayBuffer.slice(byteOffset, byteOffset + byteLength);
6805
+ let cutBuffer = copyToArrayBuffer(buffer.arrayBuffer, byteOffset, byteLength);
6689
6806
  if (accessor.bufferView.byteStride) {
6690
6807
  cutBuffer = this._getValueFromInterleavedBuffer(
6691
6808
  buffer,