@loaders.gl/gltf 4.3.4 → 4.4.0-alpha.10

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 +279 -160
  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 ||= {};
@@ -116,16 +119,20 @@ var __exports__ = (() => {
116
119
  return module || null;
117
120
  }
118
121
 
122
+ // ../worker-utils/src/lib/npm-tag.ts
123
+ var NPM_TAG = "beta";
124
+
119
125
  // ../worker-utils/src/lib/env-utils/version.ts
120
- var NPM_TAG = "latest";
126
+ var warningIssued = false;
121
127
  function getVersion() {
122
128
  if (!globalThis._loadersgl_?.version) {
123
129
  globalThis._loadersgl_ = globalThis._loadersgl_ || {};
124
- if (typeof __VERSION__ === "undefined") {
130
+ if (typeof __VERSION__ === "undefined" && !warningIssued) {
125
131
  console.warn(
126
132
  "loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN."
127
133
  );
128
134
  globalThis._loadersgl_.version = NPM_TAG;
135
+ warningIssued = true;
129
136
  } else {
130
137
  globalThis._loadersgl_.version = __VERSION__;
131
138
  }
@@ -172,6 +179,9 @@ var __exports__ = (() => {
172
179
  return await loadLibraryPromises[libraryUrl];
173
180
  }
174
181
  function getLibraryUrl(library, moduleName, options = {}, libraryName = null) {
182
+ if (options?.core) {
183
+ throw new Error("loadLibrary: options.core must be pre-normalized");
184
+ }
175
185
  if (!options.useLocalLibraries && library.startsWith("http")) {
176
186
  return library;
177
187
  }
@@ -197,10 +207,20 @@ var __exports__ = (() => {
197
207
  return await loadAsArrayBuffer(libraryUrl);
198
208
  }
199
209
  if (!isBrowser2) {
210
+ const { requireFromFile } = globalThis.loaders || {};
200
211
  try {
201
- const { requireFromFile } = globalThis.loaders || {};
202
- 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/"));
203
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
+ }
204
224
  console.error(error);
205
225
  return null;
206
226
  }
@@ -236,7 +256,14 @@ var __exports__ = (() => {
236
256
  const response = await fetch(url);
237
257
  return await response.arrayBuffer();
238
258
  }
239
- 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
+ }
240
267
  }
241
268
  async function loadAsText(url) {
242
269
  const { readFileAsText } = globalThis.loaders || {};
@@ -244,7 +271,14 @@ var __exports__ = (() => {
244
271
  const response = await fetch(url);
245
272
  return await response.text();
246
273
  }
247
- 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
+ }
248
282
  }
249
283
 
250
284
  // ../loader-utils/src/lib/binary-utils/get-first-characters.ts
@@ -332,6 +366,27 @@ var __exports__ = (() => {
332
366
  return byteOffset;
333
367
  }
334
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
+
335
390
  // ../images/src/lib/category-api/image-type.ts
336
391
  var parseImageNode = globalThis.loaders?.parseImageNode;
337
392
  var IMAGE_SUPPORTED = typeof Image !== "undefined";
@@ -468,7 +523,6 @@ var __exports__ = (() => {
468
523
  }
469
524
 
470
525
  // ../images/src/lib/parsers/parse-to-image-bitmap.ts
471
- var EMPTY_OBJECT = {};
472
526
  var imagebitmapOptionsSupported = true;
473
527
  async function parseToImageBitmap(arrayBuffer, options, url) {
474
528
  let blob;
@@ -496,8 +550,13 @@ var __exports__ = (() => {
496
550
  return await createImageBitmap(blob);
497
551
  }
498
552
  function isEmptyObject(object) {
499
- for (const key in object || EMPTY_OBJECT) {
500
- 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
+ }
501
560
  }
502
561
  return true;
503
562
  }
@@ -1518,7 +1577,7 @@ var __exports__ = (() => {
1518
1577
  buffer = bufferArray.slice(offset, offset + byteLength).buffer;
1519
1578
  offset = 0;
1520
1579
  }
1521
- return new ArrayType(buffer, offset, length);
1580
+ return new ArrayType(ensureArrayBuffer(buffer), offset, length);
1522
1581
  }
1523
1582
  function getPrimitiveTextureData(scenegraph, textureInfo, primitive) {
1524
1583
  const texCoordAccessorKey = `TEXCOORD_${textureInfo.texCoord || 0}`;
@@ -2276,7 +2335,7 @@ var __exports__ = (() => {
2276
2335
  }
2277
2336
  function createBufferView(typedArray, scenegraph) {
2278
2337
  scenegraph.gltf.buffers.push({
2279
- arrayBuffer: typedArray.buffer,
2338
+ arrayBuffer: ensureArrayBuffer(typedArray.buffer),
2280
2339
  byteOffset: typedArray.byteOffset,
2281
2340
  byteLength: typedArray.byteLength
2282
2341
  });
@@ -2799,18 +2858,18 @@ var __exports__ = (() => {
2799
2858
  bgr565: { basisFormat: 15, compressed: false },
2800
2859
  rgba4444: { basisFormat: 16, compressed: false }
2801
2860
  };
2802
- async function parseBasis(data, options) {
2803
- if (options.basis.containerFormat === "auto") {
2861
+ async function parseBasis(data, options = {}) {
2862
+ if (!options.basis?.containerFormat || options.basis.containerFormat === "auto") {
2804
2863
  if (isKTX(data)) {
2805
- const fileConstructors = await loadBasisEncoderModule(options);
2864
+ const fileConstructors = await loadBasisEncoderModule(options?.core || {});
2806
2865
  return parseKTX2File(fileConstructors.KTX2File, data, options);
2807
2866
  }
2808
- const { BasisFile } = await loadBasisTranscoderModule(options);
2867
+ const { BasisFile } = await loadBasisTranscoderModule(options?.core || {});
2809
2868
  return parseBasisFile(BasisFile, data, options);
2810
2869
  }
2811
2870
  switch (options.basis.module) {
2812
2871
  case "encoder":
2813
- const fileConstructors = await loadBasisEncoderModule(options);
2872
+ const fileConstructors = await loadBasisEncoderModule(options?.core || {});
2814
2873
  switch (options.basis.containerFormat) {
2815
2874
  case "ktx2":
2816
2875
  return parseKTX2File(fileConstructors.KTX2File, data, options);
@@ -2820,7 +2879,7 @@ var __exports__ = (() => {
2820
2879
  }
2821
2880
  case "transcoder":
2822
2881
  default:
2823
- const { BasisFile } = await loadBasisTranscoderModule(options);
2882
+ const { BasisFile } = await loadBasisTranscoderModule(options.core || {});
2824
2883
  return parseBasisFile(BasisFile, data, options);
2825
2884
  }
2826
2885
  }
@@ -2923,7 +2982,7 @@ var __exports__ = (() => {
2923
2982
  };
2924
2983
  }
2925
2984
  function getBasisOptions(options, hasAlpha) {
2926
- let format = options && options.basis && options.basis.format;
2985
+ let format = options.basis?.format;
2927
2986
  if (format === "auto") {
2928
2987
  format = selectSupportedBasisFormat();
2929
2988
  }
@@ -3098,7 +3157,7 @@ var __exports__ = (() => {
3098
3157
  if (absolute) {
3099
3158
  return url;
3100
3159
  }
3101
- const baseUrl = options.baseUri || options.uri;
3160
+ const baseUrl = options?.core?.baseUri || options.baseUri || options.uri;
3102
3161
  if (!baseUrl) {
3103
3162
  throw new Error(`'baseUri' must be provided to resolve relative url ${url}`);
3104
3163
  }
@@ -3416,35 +3475,126 @@ var __exports__ = (() => {
3416
3475
  preprocess: () => preprocess3
3417
3476
  });
3418
3477
 
3419
- // ../draco/src/lib/utils/version.ts
3420
- var VERSION5 = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
3421
-
3422
- // ../draco/src/draco-loader.ts
3423
- var DracoLoader = {
3424
- dataType: null,
3425
- batchType: null,
3426
- name: "Draco",
3427
- id: "draco",
3428
- module: "draco",
3429
- // shapes: ['mesh'],
3430
- version: VERSION5,
3431
- worker: true,
3432
- extensions: ["drc"],
3433
- mimeTypes: ["application/octet-stream"],
3434
- binary: true,
3435
- tests: ["DRACO"],
3436
- options: {
3437
- draco: {
3438
- decoderType: typeof WebAssembly === "object" ? "wasm" : "js",
3439
- // 'js' for IE11
3440
- libraryPath: "libs/",
3441
- extraAttributes: {},
3442
- attributeNameEntry: void 0
3478
+ // ../draco/src/lib/draco-module-loader.ts
3479
+ var DRACO_DECODER_VERSION = "1.5.6";
3480
+ var DRACO_ENCODER_VERSION = "1.4.1";
3481
+ var STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;
3482
+ var DRACO_EXTERNAL_LIBRARIES = {
3483
+ /** The primary Draco3D encoder, javascript wrapper part */
3484
+ DECODER: "draco_wasm_wrapper.js",
3485
+ /** The primary draco decoder, compiled web assembly part */
3486
+ DECODER_WASM: "draco_decoder.wasm",
3487
+ /** Fallback decoder for non-webassebly environments. Very big bundle, lower performance */
3488
+ FALLBACK_DECODER: "draco_decoder.js",
3489
+ /** Draco encoder */
3490
+ ENCODER: "draco_encoder.js"
3491
+ };
3492
+ var DRACO_EXTERNAL_LIBRARY_URLS = {
3493
+ [DRACO_EXTERNAL_LIBRARIES.DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER}`,
3494
+ [DRACO_EXTERNAL_LIBRARIES.DECODER_WASM]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER_WASM}`,
3495
+ [DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER}`,
3496
+ [DRACO_EXTERNAL_LIBRARIES.ENCODER]: `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/${DRACO_EXTERNAL_LIBRARIES.ENCODER}`
3497
+ };
3498
+ var loadDecoderPromise;
3499
+ async function loadDracoDecoderModule(options = {}, type) {
3500
+ const modules = options.modules || {};
3501
+ if (modules.draco3d) {
3502
+ loadDecoderPromise ||= modules.draco3d.createDecoderModule({}).then((draco) => {
3503
+ return { draco };
3504
+ });
3505
+ } else {
3506
+ loadDecoderPromise ||= loadDracoDecoder(options, type);
3507
+ }
3508
+ return await loadDecoderPromise;
3509
+ }
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];
3443
3517
  }
3444
3518
  }
3445
- };
3519
+ return library;
3520
+ }
3521
+ async function loadDracoDecoder(options, type) {
3522
+ let DracoDecoderModule;
3523
+ let wasmBinary;
3524
+ switch (type) {
3525
+ case "js":
3526
+ DracoDecoderModule = await loadLibrary(
3527
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER],
3528
+ "draco",
3529
+ options,
3530
+ DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER
3531
+ );
3532
+ break;
3533
+ case "wasm":
3534
+ default:
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
+ }
3554
+ }
3555
+ DracoDecoderModule = getLibraryExport(DracoDecoderModule, "DracoDecoderModule");
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
+ }
3575
+ return await initializeDracoDecoder(DracoDecoderModule, wasmBinary);
3576
+ }
3577
+ function initializeDracoDecoder(DracoDecoderModule, wasmBinary) {
3578
+ if (typeof DracoDecoderModule !== "function") {
3579
+ throw new Error("DracoDecoderModule could not be loaded");
3580
+ }
3581
+ const options = {};
3582
+ if (wasmBinary) {
3583
+ options.wasmBinary = wasmBinary;
3584
+ }
3585
+ return new Promise((resolve) => {
3586
+ DracoDecoderModule({
3587
+ ...options,
3588
+ onModuleLoaded: (draco) => resolve({ draco })
3589
+ // Module is Promise-like. Wrap in object to avoid loop.
3590
+ });
3591
+ });
3592
+ }
3446
3593
 
3447
- // ../schema/src/lib/table/simple-table/data-type.ts
3594
+ // ../draco/src/lib/utils/version.ts
3595
+ var VERSION5 = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
3596
+
3597
+ // ../schema-utils/src/lib/schema/data-type.ts
3448
3598
  function getDataTypeFromTypedArray(array) {
3449
3599
  switch (array.constructor) {
3450
3600
  case Int8Array:
@@ -3469,7 +3619,7 @@ var __exports__ = (() => {
3469
3619
  }
3470
3620
  }
3471
3621
 
3472
- // ../schema/src/lib/mesh/mesh-utils.ts
3622
+ // ../schema-utils/src/lib/mesh/mesh-utils.ts
3473
3623
  function getMeshBoundingBox(attributes) {
3474
3624
  let minX = Infinity;
3475
3625
  let minY = Infinity;
@@ -3496,7 +3646,7 @@ var __exports__ = (() => {
3496
3646
  ];
3497
3647
  }
3498
3648
 
3499
- // ../schema/src/lib/mesh/deduce-mesh-schema.ts
3649
+ // ../schema-utils/src/lib/mesh/deduce-mesh-schema.ts
3500
3650
  function deduceMeshField(name12, attribute, optionalMetadata) {
3501
3651
  const type = getDataTypeFromTypedArray(attribute.value);
3502
3652
  const metadata = optionalMetadata ? optionalMetadata : makeMeshAttributeMetadata(attribute);
@@ -3720,6 +3870,7 @@ var __exports__ = (() => {
3720
3870
  case "triangle-strip":
3721
3871
  return {
3722
3872
  topology: "triangle-strip",
3873
+ // TODO - mode is wrong?
3723
3874
  mode: 4,
3724
3875
  // GL.TRIANGLES
3725
3876
  attributes,
@@ -3732,6 +3883,7 @@ var __exports__ = (() => {
3732
3883
  default:
3733
3884
  return {
3734
3885
  topology: "triangle-list",
3886
+ // TODO - mode is wrong?
3735
3887
  mode: 5,
3736
3888
  // GL.TRIANGLE_STRIP
3737
3889
  attributes,
@@ -4016,91 +4168,39 @@ var __exports__ = (() => {
4016
4168
  return intArray;
4017
4169
  }
4018
4170
 
4019
- // ../draco/src/lib/draco-module-loader.ts
4020
- var DRACO_DECODER_VERSION = "1.5.6";
4021
- var DRACO_ENCODER_VERSION = "1.4.1";
4022
- var STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;
4023
- var DRACO_EXTERNAL_LIBRARIES = {
4024
- /** The primary Draco3D encoder, javascript wrapper part */
4025
- DECODER: "draco_wasm_wrapper.js",
4026
- /** The primary draco decoder, compiled web assembly part */
4027
- DECODER_WASM: "draco_decoder.wasm",
4028
- /** Fallback decoder for non-webassebly environments. Very big bundle, lower performance */
4029
- FALLBACK_DECODER: "draco_decoder.js",
4030
- /** Draco encoder */
4031
- ENCODER: "draco_encoder.js"
4032
- };
4033
- var DRACO_EXTERNAL_LIBRARY_URLS = {
4034
- [DRACO_EXTERNAL_LIBRARIES.DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER}`,
4035
- [DRACO_EXTERNAL_LIBRARIES.DECODER_WASM]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER_WASM}`,
4036
- [DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER}`,
4037
- [DRACO_EXTERNAL_LIBRARIES.ENCODER]: `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/${DRACO_EXTERNAL_LIBRARIES.ENCODER}`
4038
- };
4039
- var loadDecoderPromise;
4040
- async function loadDracoDecoderModule(options) {
4041
- const modules = options.modules || {};
4042
- if (modules.draco3d) {
4043
- loadDecoderPromise ||= modules.draco3d.createDecoderModule({}).then((draco) => {
4044
- return { draco };
4045
- });
4046
- } else {
4047
- loadDecoderPromise ||= loadDracoDecoder(options);
4048
- }
4049
- return await loadDecoderPromise;
4050
- }
4051
- async function loadDracoDecoder(options) {
4052
- let DracoDecoderModule;
4053
- let wasmBinary;
4054
- switch (options.draco && options.draco.decoderType) {
4055
- case "js":
4056
- DracoDecoderModule = await loadLibrary(
4057
- DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER],
4058
- "draco",
4059
- options,
4060
- DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER
4061
- );
4062
- break;
4063
- case "wasm":
4064
- default:
4065
- [DracoDecoderModule, wasmBinary] = await Promise.all([
4066
- await loadLibrary(
4067
- DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
4068
- "draco",
4069
- options,
4070
- DRACO_EXTERNAL_LIBRARIES.DECODER
4071
- ),
4072
- await loadLibrary(
4073
- DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
4074
- "draco",
4075
- options,
4076
- DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
4077
- )
4078
- ]);
4079
- }
4080
- DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
4081
- return await initializeDracoDecoder(DracoDecoderModule, wasmBinary);
4082
- }
4083
- function initializeDracoDecoder(DracoDecoderModule, wasmBinary) {
4084
- const options = {};
4085
- if (wasmBinary) {
4086
- options.wasmBinary = wasmBinary;
4171
+ // ../draco/src/draco-loader.ts
4172
+ var DracoWorkerLoader = {
4173
+ dataType: null,
4174
+ batchType: null,
4175
+ name: "Draco",
4176
+ id: "draco",
4177
+ module: "draco",
4178
+ // shapes: ['mesh'],
4179
+ version: VERSION5,
4180
+ worker: true,
4181
+ extensions: ["drc"],
4182
+ mimeTypes: ["application/octet-stream"],
4183
+ binary: true,
4184
+ tests: ["DRACO"],
4185
+ options: {
4186
+ draco: {
4187
+ decoderType: typeof WebAssembly === "object" ? "wasm" : "js",
4188
+ // 'js' for IE11
4189
+ libraryPath: "libs/",
4190
+ extraAttributes: {},
4191
+ attributeNameEntry: void 0
4192
+ }
4087
4193
  }
4088
- return new Promise((resolve) => {
4089
- DracoDecoderModule({
4090
- ...options,
4091
- onModuleLoaded: (draco) => resolve({ draco })
4092
- // Module is Promise-like. Wrap in object to avoid loop.
4093
- });
4094
- });
4095
- }
4096
-
4097
- // ../draco/src/index.ts
4098
- var DracoLoader2 = {
4099
- ...DracoLoader,
4194
+ };
4195
+ var DracoLoader = {
4196
+ ...DracoWorkerLoader,
4100
4197
  parse
4101
4198
  };
4102
4199
  async function parse(arrayBuffer, options) {
4103
- const { draco } = await loadDracoDecoderModule(options);
4200
+ const { draco } = await loadDracoDecoderModule(
4201
+ options?.core,
4202
+ options?.draco?.decoderType || "wasm"
4203
+ );
4104
4204
  const dracoParser = new DracoParser(draco);
4105
4205
  try {
4106
4206
  return dracoParser.parseSync(arrayBuffer, options?.draco);
@@ -4211,7 +4311,7 @@ var __exports__ = (() => {
4211
4311
  const bufferCopy = sliceArrayBuffer(buffer.buffer, buffer.byteOffset);
4212
4312
  const dracoOptions = { ...options };
4213
4313
  delete dracoOptions["3d-tiles"];
4214
- const decodedData = await parseFromContext(bufferCopy, DracoLoader2, dracoOptions, context);
4314
+ const decodedData = await parseFromContext(bufferCopy, DracoLoader, dracoOptions, context);
4215
4315
  const decodedAttributes = getGLTFAccessors(decodedData.attributes);
4216
4316
  for (const [attributeName, decodedAttribute] of Object.entries(decodedAttributes)) {
4217
4317
  if (attributeName in primitive.attributes) {
@@ -5564,7 +5664,7 @@ var __exports__ = (() => {
5564
5664
  const texCoordAccessor = primitive.attributes[`TEXCOORD_${originalTexCoord}`];
5565
5665
  if (Number.isFinite(texCoordAccessor)) {
5566
5666
  const accessor = gltfData.json.accessors?.[texCoordAccessor];
5567
- if (accessor && accessor.bufferView) {
5667
+ if (accessor && accessor.bufferView !== void 0) {
5568
5668
  const bufferView = gltfData.json.bufferViews?.[accessor.bufferView];
5569
5669
  if (bufferView) {
5570
5670
  const { arrayBuffer, byteOffset: bufferByteOffset } = gltfData.buffers[bufferView.buffer];
@@ -5581,7 +5681,7 @@ var __exports__ = (() => {
5581
5681
  result.set([scratchVector[0], scratchVector[1]], i * components);
5582
5682
  }
5583
5683
  if (originalTexCoord === texCoord) {
5584
- updateGltf(accessor, bufferView, gltfData.buffers, result);
5684
+ updateGltf(accessor, gltfData, result, accessor.bufferView);
5585
5685
  } else {
5586
5686
  createAttribute(texCoord, accessor, primitive, gltfData, result);
5587
5687
  }
@@ -5589,28 +5689,49 @@ var __exports__ = (() => {
5589
5689
  }
5590
5690
  }
5591
5691
  }
5592
- function updateGltf(accessor, bufferView, buffers, newTexCoordArray) {
5692
+ function updateGltf(accessor, gltfData, newTexCoordArray, originalBufferViewIndex) {
5593
5693
  accessor.componentType = 5126;
5594
- buffers.push({
5595
- 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),
5596
5702
  byteOffset: 0,
5597
5703
  byteLength: newTexCoordArray.buffer.byteLength
5598
5704
  });
5599
- bufferView.buffer = buffers.length - 1;
5600
- 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;
5601
5721
  bufferView.byteOffset = 0;
5602
- delete bufferView.byteStride;
5722
+ bufferView.byteLength = newTexCoordArray.buffer.byteLength;
5723
+ if (bufferView.byteStride !== void 0) {
5724
+ delete bufferView.byteStride;
5725
+ }
5603
5726
  }
5604
5727
  function createAttribute(newTexCoord, originalAccessor, primitive, gltfData, newTexCoordArray) {
5605
5728
  gltfData.buffers.push({
5606
- arrayBuffer: newTexCoordArray.buffer,
5729
+ arrayBuffer: ensureArrayBuffer(newTexCoordArray.buffer),
5607
5730
  byteOffset: 0,
5608
5731
  byteLength: newTexCoordArray.buffer.byteLength
5609
5732
  });
5733
+ gltfData.json.bufferViews = gltfData.json.bufferViews || [];
5610
5734
  const bufferViews = gltfData.json.bufferViews;
5611
- if (!bufferViews) {
5612
- return;
5613
- }
5614
5735
  bufferViews.push({
5615
5736
  buffer: gltfData.buffers.length - 1,
5616
5737
  byteLength: newTexCoordArray.buffer.byteLength,
@@ -6086,10 +6207,10 @@ var __exports__ = (() => {
6086
6207
  return gltf;
6087
6208
  }
6088
6209
  function parseGLTFContainerSync(gltf, data, byteOffset, options) {
6089
- if (options.uri) {
6090
- gltf.baseUri = options.uri;
6210
+ if (options.core?.baseUri) {
6211
+ gltf.baseUri = options.core?.baseUri;
6091
6212
  }
6092
- if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options)) {
6213
+ if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options.glb)) {
6093
6214
  const textDecoder = new TextDecoder();
6094
6215
  data = textDecoder.decode(data);
6095
6216
  }
@@ -6177,14 +6298,16 @@ var __exports__ = (() => {
6177
6298
  arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);
6178
6299
  }
6179
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
+ };
6180
6307
  let parsedImage = await parseFromContext(
6181
6308
  arrayBuffer,
6182
6309
  [ImageLoader, BasisLoader],
6183
- {
6184
- ...options,
6185
- mimeType: image.mimeType,
6186
- basis: options.basis || { format: selectSupportedBasisFormat() }
6187
- },
6310
+ gltfOptions,
6188
6311
  context
6189
6312
  );
6190
6313
  if (parsedImage && parsedImage[0]) {
@@ -6225,18 +6348,15 @@ var __exports__ = (() => {
6225
6348
  // Create image objects
6226
6349
  decompressMeshes: true
6227
6350
  // Decompress Draco encoded meshes
6228
- },
6229
- // common?
6230
- log: console
6231
- // eslint-disable-line
6351
+ }
6232
6352
  }
6233
6353
  };
6234
6354
  async function parse2(arrayBuffer, options = {}, context) {
6235
- options = { ...GLTFLoader.options, ...options };
6236
- options.gltf = { ...GLTFLoader.options.gltf, ...options.gltf };
6237
- 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;
6238
6358
  const gltf = {};
6239
- return await parseGLTF(gltf, arrayBuffer, byteOffset, options, context);
6359
+ return await parseGLTF(gltf, arrayBuffer, byteOffset, mergedOptions, context);
6240
6360
  }
6241
6361
 
6242
6362
  // src/lib/encoders/encode-glb.ts
@@ -6350,9 +6470,8 @@ var __exports__ = (() => {
6350
6470
  return parseSync(arrayBuffer, options);
6351
6471
  }
6352
6472
  function parseSync(arrayBuffer, options) {
6353
- const { byteOffset = 0 } = options || {};
6354
6473
  const glb = {};
6355
- parseGLBSync(glb, arrayBuffer, byteOffset, options?.glb);
6474
+ parseGLBSync(glb, arrayBuffer, options?.glb?.byteOffset || 0, options?.glb);
6356
6475
  return glb;
6357
6476
  }
6358
6477
 
@@ -6683,7 +6802,7 @@ var __exports__ = (() => {
6683
6802
  const buffer = accessor.bufferView.buffer;
6684
6803
  const { ArrayType, byteLength } = getAccessorArrayTypeAndLength(accessor, accessor.bufferView);
6685
6804
  const byteOffset = (accessor.bufferView.byteOffset || 0) + (accessor.byteOffset || 0) + buffer.byteOffset;
6686
- let cutBuffer = buffer.arrayBuffer.slice(byteOffset, byteOffset + byteLength);
6805
+ let cutBuffer = copyToArrayBuffer(buffer.arrayBuffer, byteOffset, byteLength);
6687
6806
  if (accessor.bufferView.byteStride) {
6688
6807
  cutBuffer = this._getValueFromInterleavedBuffer(
6689
6808
  buffer,