@loaders.gl/draco 4.2.0-alpha.4 → 4.2.0-alpha.6

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 (56) hide show
  1. package/dist/dist.dev.js +268 -79
  2. package/dist/dist.min.js +11 -0
  3. package/dist/draco-loader.d.ts +2 -2
  4. package/dist/draco-loader.d.ts.map +1 -1
  5. package/dist/draco-loader.js +23 -17
  6. package/dist/draco-worker-node.js +186 -127
  7. package/dist/draco-worker-node.js.map +3 -3
  8. package/dist/draco-worker.js +5 -3
  9. package/dist/draco-worker.js.map +2 -2
  10. package/dist/draco-writer-worker-node.js +188 -127
  11. package/dist/draco-writer-worker-node.js.map +3 -3
  12. package/dist/draco-writer-worker.js +5 -3
  13. package/dist/draco-writer-worker.js.map +2 -2
  14. package/dist/draco-writer.d.ts +2 -2
  15. package/dist/draco-writer.d.ts.map +1 -1
  16. package/dist/draco-writer.js +30 -23
  17. package/dist/draco3d/draco3d-types.js +48 -41
  18. package/dist/index.cjs +34 -71
  19. package/dist/index.cjs.map +7 -0
  20. package/dist/index.d.ts +6 -6
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +27 -21
  23. package/dist/lib/draco-builder.d.ts +2 -2
  24. package/dist/lib/draco-builder.d.ts.map +1 -1
  25. package/dist/lib/draco-builder.js +314 -243
  26. package/dist/lib/draco-module-loader.js +78 -62
  27. package/dist/lib/draco-parser.d.ts +2 -2
  28. package/dist/lib/draco-parser.d.ts.map +1 -1
  29. package/dist/lib/draco-parser.js +437 -323
  30. package/dist/lib/draco-types.js +1 -1
  31. package/dist/lib/utils/get-draco-schema.d.ts +1 -1
  32. package/dist/lib/utils/get-draco-schema.d.ts.map +1 -1
  33. package/dist/lib/utils/get-draco-schema.js +29 -32
  34. package/dist/lib/utils/version.js +4 -2
  35. package/dist/workers/draco-worker-node.js +1 -1
  36. package/dist/workers/draco-worker.js +0 -1
  37. package/dist/workers/draco-writer-worker-node.js +20 -25
  38. package/dist/workers/draco-writer-worker.js +19 -25
  39. package/package.json +10 -10
  40. package/dist/draco-loader.js.map +0 -1
  41. package/dist/draco-writer.js.map +0 -1
  42. package/dist/draco3d/draco3d-types.js.map +0 -1
  43. package/dist/index.js.map +0 -1
  44. package/dist/lib/draco-builder.js.map +0 -1
  45. package/dist/lib/draco-module-loader.js.map +0 -1
  46. package/dist/lib/draco-parser.js.map +0 -1
  47. package/dist/lib/draco-types.js.map +0 -1
  48. package/dist/lib/utils/get-draco-schema.js.map +0 -1
  49. package/dist/lib/utils/version.js.map +0 -1
  50. package/dist/libs/libs/draco_decoder.wasm +0 -0
  51. package/dist/libs/libs/draco_encoder.js +0 -52
  52. package/dist/libs/libs/draco_wasm_wrapper.js +0 -117
  53. package/dist/workers/draco-worker-node.js.map +0 -1
  54. package/dist/workers/draco-worker.js.map +0 -1
  55. package/dist/workers/draco-writer-worker-node.js.map +0 -1
  56. package/dist/workers/draco-writer-worker.js.map +0 -1
package/dist/dist.dev.js CHANGED
@@ -2,8 +2,8 @@
2
2
  if (typeof exports === 'object' && typeof module === 'object')
3
3
  module.exports = factory();
4
4
  else if (typeof define === 'function' && define.amd) define([], factory);
5
- else if (typeof exports === 'object') exports['loader'] = factory();
6
- else root['loader'] = factory();})(globalThis, function () {
5
+ else if (typeof exports === 'object') exports['loaders'] = factory();
6
+ else root['loaders'] = factory();})(globalThis, function () {
7
7
  "use strict";
8
8
  var __exports__ = (() => {
9
9
  var __create = Object.create;
@@ -27,6 +27,7 @@ var __exports__ = (() => {
27
27
  }
28
28
  return to;
29
29
  };
30
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
30
31
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
31
32
  // If the importer is in node compatibility mode or this is not an ESM
32
33
  // file that has been converted to a CommonJS file using a Babel-
@@ -37,6 +38,13 @@ var __exports__ = (() => {
37
38
  ));
38
39
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
39
40
 
41
+ // external-global-plugin:@loaders.gl/core
42
+ var require_core = __commonJS({
43
+ "external-global-plugin:@loaders.gl/core"(exports, module) {
44
+ module.exports = globalThis.loaders;
45
+ }
46
+ });
47
+
40
48
  // (disabled):../worker-utils/src/lib/node/require-utils.node
41
49
  var require_require_utils = __commonJS({
42
50
  "(disabled):../worker-utils/src/lib/node/require-utils.node"() {
@@ -44,9 +52,9 @@ var __exports__ = (() => {
44
52
  }
45
53
  });
46
54
 
47
- // src/index.ts
48
- var src_exports = {};
49
- __export(src_exports, {
55
+ // bundle.ts
56
+ var bundle_exports = {};
57
+ __export(bundle_exports, {
50
58
  DRACO_EXTERNAL_LIBRARIES: () => DRACO_EXTERNAL_LIBRARIES,
51
59
  DRACO_EXTERNAL_LIBRARY_URLS: () => DRACO_EXTERNAL_LIBRARY_URLS,
52
60
  DracoLoader: () => DracoLoader2,
@@ -54,15 +62,17 @@ var __exports__ = (() => {
54
62
  DracoWriter: () => DracoWriter,
55
63
  DracoWriterWorker: () => DracoWriterWorker
56
64
  });
65
+ __reExport(bundle_exports, __toESM(require_core(), 1));
57
66
 
58
67
  // src/lib/utils/version.ts
59
- var VERSION = true ? "4.2.0-alpha.4" : "latest";
68
+ var VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
60
69
 
61
70
  // src/draco-loader.ts
62
71
  var DracoLoader = {
63
72
  name: "Draco",
64
73
  id: "draco",
65
74
  module: "draco",
75
+ // shapes: ['mesh'],
66
76
  version: VERSION,
67
77
  worker: true,
68
78
  extensions: ["drc"],
@@ -72,6 +82,7 @@ var __exports__ = (() => {
72
82
  options: {
73
83
  draco: {
74
84
  decoderType: typeof WebAssembly === "object" ? "wasm" : "js",
85
+ // 'js' for IE11
75
86
  libraryPath: "libs/",
76
87
  extraAttributes: {},
77
88
  attributeNameEntry: void 0
@@ -125,7 +136,10 @@ var __exports__ = (() => {
125
136
  maxY = y > maxY ? y : maxY;
126
137
  maxZ = z > maxZ ? z : maxZ;
127
138
  }
128
- return [[minX, minY, minZ], [maxX, maxY, maxZ]];
139
+ return [
140
+ [minX, minY, minZ],
141
+ [maxX, maxY, maxZ]
142
+ ];
129
143
  }
130
144
 
131
145
  // ../schema/src/lib/mesh/deduce-mesh-schema.ts
@@ -134,14 +148,7 @@ var __exports__ = (() => {
134
148
  const metadata = optionalMetadata ? optionalMetadata : makeMeshAttributeMetadata(attribute);
135
149
  return {
136
150
  name,
137
- type: {
138
- type: "fixed-size-list",
139
- listSize: attribute.size,
140
- children: [{
141
- name: "value",
142
- type
143
- }]
144
- },
151
+ type: { type: "fixed-size-list", listSize: attribute.size, children: [{ name: "value", type }] },
145
152
  nullable: false,
146
153
  metadata
147
154
  };
@@ -167,17 +174,18 @@ var __exports__ = (() => {
167
174
  const namedLoaderDataAttributes = transformAttributesLoaderData(loaderData.attributes);
168
175
  for (const attributeName in attributes) {
169
176
  const attribute = attributes[attributeName];
170
- const field = getArrowFieldFromAttribute(attributeName, attribute, namedLoaderDataAttributes[attributeName]);
177
+ const field = getArrowFieldFromAttribute(
178
+ attributeName,
179
+ attribute,
180
+ namedLoaderDataAttributes[attributeName]
181
+ );
171
182
  fields.push(field);
172
183
  }
173
184
  if (indices) {
174
185
  const indicesField = getArrowFieldFromAttribute("indices", indices);
175
186
  fields.push(indicesField);
176
187
  }
177
- return {
178
- fields,
179
- metadata
180
- };
188
+ return { fields, metadata };
181
189
  }
182
190
  function transformAttributesLoaderData(loaderData) {
183
191
  const result = {};
@@ -219,15 +227,27 @@ var __exports__ = (() => {
219
227
  };
220
228
  var INDEX_ITEM_SIZE = 4;
221
229
  var DracoParser = class {
230
+ draco;
231
+ decoder;
232
+ metadataQuerier;
233
+ // draco - the draco decoder, either import `draco3d` or load dynamically
222
234
  constructor(draco) {
223
235
  this.draco = draco;
224
236
  this.decoder = new this.draco.Decoder();
225
237
  this.metadataQuerier = new this.draco.MetadataQuerier();
226
238
  }
239
+ /**
240
+ * Destroy draco resources
241
+ */
227
242
  destroy() {
228
243
  this.draco.destroy(this.decoder);
229
244
  this.draco.destroy(this.metadataQuerier);
230
245
  }
246
+ /**
247
+ * NOTE: caller must call `destroyGeometry` on the return value after using it
248
+ * @param arrayBuffer
249
+ * @param options
250
+ */
231
251
  parseSync(arrayBuffer, options = {}) {
232
252
  const buffer = new this.draco.DecoderBuffer();
233
253
  buffer.Init(new Int8Array(arrayBuffer), arrayBuffer.byteLength);
@@ -272,6 +292,14 @@ var __exports__ = (() => {
272
292
  }
273
293
  }
274
294
  }
295
+ // Draco specific "loader data"
296
+ /**
297
+ * Extract
298
+ * @param dracoGeometry
299
+ * @param geometry_type
300
+ * @param options
301
+ * @returns
302
+ */
275
303
  _getDracoLoaderData(dracoGeometry, geometry_type, options) {
276
304
  const metadata = this._getTopLevelMetadata(dracoGeometry);
277
305
  const attributes = this._getDracoAttributes(dracoGeometry, options);
@@ -284,6 +312,12 @@ var __exports__ = (() => {
284
312
  attributes
285
313
  };
286
314
  }
315
+ /**
316
+ * Extract all draco provided information and metadata for each attribute
317
+ * @param dracoGeometry
318
+ * @param options
319
+ * @returns
320
+ */
287
321
  _getDracoAttributes(dracoGeometry, options) {
288
322
  const dracoAttributes = {};
289
323
  for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {
@@ -311,6 +345,12 @@ var __exports__ = (() => {
311
345
  }
312
346
  return dracoAttributes;
313
347
  }
348
+ /**
349
+ * Get standard loaders.gl mesh category data
350
+ * Extracts the geometry from draco
351
+ * @param dracoGeometry
352
+ * @param options
353
+ */
314
354
  _getMeshData(dracoGeometry, loaderData, options) {
315
355
  const attributes = this._getMeshAttributes(loaderData, dracoGeometry, options);
316
356
  const positionAttribute = attributes.POSITION;
@@ -323,6 +363,7 @@ var __exports__ = (() => {
323
363
  return {
324
364
  topology: "triangle-strip",
325
365
  mode: 4,
366
+ // GL.TRIANGLES
326
367
  attributes,
327
368
  indices: {
328
369
  value: this._getTriangleStripIndices(dracoGeometry),
@@ -334,6 +375,7 @@ var __exports__ = (() => {
334
375
  return {
335
376
  topology: "triangle-list",
336
377
  mode: 5,
378
+ // GL.TRIANGLE_STRIP
337
379
  attributes,
338
380
  indices: {
339
381
  value: this._getTriangleListIndices(dracoGeometry),
@@ -345,6 +387,7 @@ var __exports__ = (() => {
345
387
  return {
346
388
  topology: "point-list",
347
389
  mode: 0,
390
+ // GL.POINTS
348
391
  attributes
349
392
  };
350
393
  }
@@ -353,10 +396,7 @@ var __exports__ = (() => {
353
396
  for (const loaderAttribute of Object.values(loaderData.attributes)) {
354
397
  const attributeName = this._deduceAttributeName(loaderAttribute, options);
355
398
  loaderAttribute.name = attributeName;
356
- const {
357
- value,
358
- size
359
- } = this._getAttributeValues(dracoGeometry, loaderAttribute);
399
+ const { value, size } = this._getAttributeValues(dracoGeometry, loaderAttribute);
360
400
  attributes[attributeName] = {
361
401
  value,
362
402
  size,
@@ -367,6 +407,11 @@ var __exports__ = (() => {
367
407
  }
368
408
  return attributes;
369
409
  }
410
+ // MESH INDICES EXTRACTION
411
+ /**
412
+ * For meshes, we need indices to define the faces.
413
+ * @param dracoGeometry
414
+ */
370
415
  _getTriangleListIndices(dracoGeometry) {
371
416
  const numFaces = dracoGeometry.num_faces();
372
417
  const numIndices = numFaces * 3;
@@ -379,6 +424,10 @@ var __exports__ = (() => {
379
424
  this.draco._free(ptr);
380
425
  }
381
426
  }
427
+ /**
428
+ * For meshes, we need indices to define the faces.
429
+ * @param dracoGeometry
430
+ */
382
431
  _getTriangleStripIndices(dracoGeometry) {
383
432
  const dracoArray = new this.draco.DracoInt32Array();
384
433
  try {
@@ -388,6 +437,12 @@ var __exports__ = (() => {
388
437
  this.draco.destroy(dracoArray);
389
438
  }
390
439
  }
440
+ /**
441
+ *
442
+ * @param dracoGeometry
443
+ * @param dracoAttribute
444
+ * @param attributeName
445
+ */
391
446
  _getAttributeValues(dracoGeometry, attribute) {
392
447
  const TypedArrayCtor = DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP[attribute.data_type];
393
448
  const numComponents = attribute.num_components;
@@ -399,19 +454,48 @@ var __exports__ = (() => {
399
454
  const ptr = this.draco._malloc(byteLength);
400
455
  try {
401
456
  const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attribute.attribute_index);
402
- this.decoder.GetAttributeDataArrayForAllPoints(dracoGeometry, dracoAttribute, dataType, byteLength, ptr);
457
+ this.decoder.GetAttributeDataArrayForAllPoints(
458
+ dracoGeometry,
459
+ dracoAttribute,
460
+ dataType,
461
+ byteLength,
462
+ ptr
463
+ );
403
464
  value = new TypedArrayCtor(this.draco.HEAPF32.buffer, ptr, numValues).slice();
404
465
  } finally {
405
466
  this.draco._free(ptr);
406
467
  }
407
- return {
408
- value,
409
- size: numComponents
410
- };
411
- }
468
+ return { value, size: numComponents };
469
+ }
470
+ // Attribute names
471
+ /**
472
+ * DRACO does not store attribute names - We need to deduce an attribute name
473
+ * for each attribute
474
+ _getAttributeNames(
475
+ dracoGeometry: Mesh | PointCloud,
476
+ options: DracoParseOptions
477
+ ): {[unique_id: number]: string} {
478
+ const attributeNames: {[unique_id: number]: string} = {};
479
+ for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {
480
+ const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);
481
+ const attributeName = this._deduceAttributeName(dracoAttribute, options);
482
+ attributeNames[attributeName] = attributeName;
483
+ }
484
+ return attributeNames;
485
+ }
486
+ */
487
+ /**
488
+ * Deduce an attribute name.
489
+ * @note DRACO does not save attribute names, just general type (POSITION, COLOR)
490
+ * to help optimize compression. We generate GLTF compatible names for the Draco-recognized
491
+ * types
492
+ * @param attributeData
493
+ */
412
494
  _deduceAttributeName(attribute, options) {
413
495
  const uniqueId = attribute.unique_id;
414
- for (const [attributeName, attributeUniqueId] of Object.entries(options.extraAttributes || {})) {
496
+ for (const [attributeName, attributeUniqueId] of Object.entries(
497
+ options.extraAttributes || {}
498
+ )) {
415
499
  if (attributeUniqueId === uniqueId) {
416
500
  return attributeName;
417
501
  }
@@ -429,14 +513,22 @@ var __exports__ = (() => {
429
513
  }
430
514
  return `CUSTOM_ATTRIBUTE_${uniqueId}`;
431
515
  }
516
+ // METADATA EXTRACTION
517
+ /** Get top level metadata */
432
518
  _getTopLevelMetadata(dracoGeometry) {
433
519
  const dracoMetadata = this.decoder.GetMetadata(dracoGeometry);
434
520
  return this._getDracoMetadata(dracoMetadata);
435
521
  }
522
+ /** Get per attribute metadata */
436
523
  _getAttributeMetadata(dracoGeometry, attributeId) {
437
524
  const dracoMetadata = this.decoder.GetAttributeMetadata(dracoGeometry, attributeId);
438
525
  return this._getDracoMetadata(dracoMetadata);
439
526
  }
527
+ /**
528
+ * Extract metadata field values
529
+ * @param dracoMetadata
530
+ * @returns
531
+ */
440
532
  _getDracoMetadata(dracoMetadata) {
441
533
  if (!dracoMetadata || !dracoMetadata.ptr) {
442
534
  return {};
@@ -449,6 +541,11 @@ var __exports__ = (() => {
449
541
  }
450
542
  return result;
451
543
  }
544
+ /**
545
+ * Extracts possible values for one metadata entry by name
546
+ * @param dracoMetadata
547
+ * @param entryName
548
+ */
452
549
  _getDracoMetadataField(dracoMetadata, entryName) {
453
550
  const dracoArray = new this.draco.DracoInt32Array();
454
551
  try {
@@ -464,20 +561,21 @@ var __exports__ = (() => {
464
561
  this.draco.destroy(dracoArray);
465
562
  }
466
563
  }
564
+ // QUANTIZED ATTRIBUTE SUPPORT (NO DECOMPRESSION)
565
+ /** Skip transforms for specific attribute types */
467
566
  _disableAttributeTransforms(options) {
468
- const {
469
- quantizedAttributes = [],
470
- octahedronAttributes = []
471
- } = options;
567
+ const { quantizedAttributes = [], octahedronAttributes = [] } = options;
472
568
  const skipAttributes = [...quantizedAttributes, ...octahedronAttributes];
473
569
  for (const dracoAttributeName of skipAttributes) {
474
570
  this.decoder.SkipAttributeTransform(this.draco[dracoAttributeName]);
475
571
  }
476
572
  }
573
+ /**
574
+ * Extract (and apply?) Position Transform
575
+ * @todo not used
576
+ */
477
577
  _getQuantizationTransform(dracoAttribute, options) {
478
- const {
479
- quantizedAttributes = []
480
- } = options;
578
+ const { quantizedAttributes = [] } = options;
481
579
  const attribute_type = dracoAttribute.attribute_type();
482
580
  const skip = quantizedAttributes.map((type) => this.decoder[type]).includes(attribute_type);
483
581
  if (skip) {
@@ -497,9 +595,7 @@ var __exports__ = (() => {
497
595
  return null;
498
596
  }
499
597
  _getOctahedronTransform(dracoAttribute, options) {
500
- const {
501
- octahedronAttributes = []
502
- } = options;
598
+ const { octahedronAttributes = [] } = options;
503
599
  const attribute_type = dracoAttribute.attribute_type();
504
600
  const octahedron = octahedronAttributes.map((type) => this.decoder[type]).includes(attribute_type);
505
601
  if (octahedron) {
@@ -516,6 +612,7 @@ var __exports__ = (() => {
516
612
  }
517
613
  return null;
518
614
  }
615
+ // HELPERS
519
616
  };
520
617
  function getDracoDataType(draco, attributeType) {
521
618
  switch (attributeType) {
@@ -555,14 +652,17 @@ var __exports__ = (() => {
555
652
  }
556
653
 
557
654
  // ../worker-utils/src/lib/env-utils/version.ts
655
+ var NPM_TAG = "latest";
558
656
  function getVersion() {
559
657
  if (!globalThis._loadersgl_?.version) {
560
658
  globalThis._loadersgl_ = globalThis._loadersgl_ || {};
561
- if (false) {
562
- console.warn("loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN.");
659
+ if (typeof __VERSION__ === "undefined") {
660
+ console.warn(
661
+ "loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN."
662
+ );
563
663
  globalThis._loadersgl_.version = NPM_TAG;
564
664
  } else {
565
- globalThis._loadersgl_.version = "4.2.0-alpha.4";
665
+ globalThis._loadersgl_.version = __VERSION__;
566
666
  }
567
667
  }
568
668
  return globalThis._loadersgl_.version;
@@ -587,7 +687,10 @@ var __exports__ = (() => {
587
687
  var window_ = globals.window || globals.self || globals.global || {};
588
688
  var global_ = globals.global || globals.self || globals.window || {};
589
689
  var document_ = globals.document || {};
590
- var isBrowser = typeof process !== "object" || String(process) !== "[object process]" || process.browser;
690
+ var isBrowser = (
691
+ // @ts-ignore process.browser
692
+ typeof process !== "object" || String(process) !== "[object process]" || process.browser
693
+ );
591
694
  var isWorker = typeof importScripts === "function";
592
695
  var isMobile = typeof window !== "undefined" && typeof window.orientation !== "undefined";
593
696
  var matches = typeof process !== "undefined" && process.version && /v([0-9]*)/.exec(process.version);
@@ -600,7 +703,8 @@ var __exports__ = (() => {
600
703
  if (moduleName) {
601
704
  libraryUrl = getLibraryUrl(libraryUrl, moduleName, options, libraryName);
602
705
  }
603
- loadLibraryPromises[libraryUrl] = loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);
706
+ loadLibraryPromises[libraryUrl] = // eslint-disable-next-line @typescript-eslint/no-misused-promises
707
+ loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);
604
708
  return await loadLibraryPromises[libraryUrl];
605
709
  }
606
710
  function getLibraryUrl(library, moduleName, options = {}, libraryName = null) {
@@ -680,9 +784,13 @@ var __exports__ = (() => {
680
784
  var DRACO_ENCODER_VERSION = "1.4.1";
681
785
  var STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;
682
786
  var DRACO_EXTERNAL_LIBRARIES = {
787
+ /** The primary Draco3D encoder, javascript wrapper part */
683
788
  DECODER: "draco_wasm_wrapper.js",
789
+ /** The primary draco decoder, compiled web assembly part */
684
790
  DECODER_WASM: "draco_decoder.wasm",
791
+ /** Fallback decoder for non-webassebly environments. Very big bundle, lower performance */
685
792
  FALLBACK_DECODER: "draco_decoder.js",
793
+ /** Draco encoder */
686
794
  ENCODER: "draco_encoder.js"
687
795
  };
688
796
  var DRACO_EXTERNAL_LIBRARY_URLS = {
@@ -697,9 +805,7 @@ var __exports__ = (() => {
697
805
  const modules = options.modules || {};
698
806
  if (modules.draco3d) {
699
807
  loadDecoderPromise = loadDecoderPromise || modules.draco3d.createDecoderModule({}).then((draco) => {
700
- return {
701
- draco
702
- };
808
+ return { draco };
703
809
  });
704
810
  } else {
705
811
  loadDecoderPromise = loadDecoderPromise || loadDracoDecoder(options);
@@ -710,9 +816,7 @@ var __exports__ = (() => {
710
816
  const modules = options.modules || {};
711
817
  if (modules.draco3d) {
712
818
  loadEncoderPromise = loadEncoderPromise || modules.draco3d.createEncoderModule({}).then((draco) => {
713
- return {
714
- draco
715
- };
819
+ return { draco };
716
820
  });
717
821
  } else {
718
822
  loadEncoderPromise = loadEncoderPromise || loadDracoEncoder(options);
@@ -724,11 +828,29 @@ var __exports__ = (() => {
724
828
  let wasmBinary;
725
829
  switch (options.draco && options.draco.decoderType) {
726
830
  case "js":
727
- DracoDecoderModule = await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER);
831
+ DracoDecoderModule = await loadLibrary(
832
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER],
833
+ "draco",
834
+ options,
835
+ DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER
836
+ );
728
837
  break;
729
838
  case "wasm":
730
839
  default:
731
- [DracoDecoderModule, wasmBinary] = await Promise.all([await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.DECODER), await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM], "draco", options, DRACO_EXTERNAL_LIBRARIES.DECODER_WASM)]);
840
+ [DracoDecoderModule, wasmBinary] = await Promise.all([
841
+ await loadLibrary(
842
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
843
+ "draco",
844
+ options,
845
+ DRACO_EXTERNAL_LIBRARIES.DECODER
846
+ ),
847
+ await loadLibrary(
848
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
849
+ "draco",
850
+ options,
851
+ DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
852
+ )
853
+ ]);
732
854
  }
733
855
  DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
734
856
  return await initializeDracoDecoder(DracoDecoderModule, wasmBinary);
@@ -741,20 +863,23 @@ var __exports__ = (() => {
741
863
  return new Promise((resolve) => {
742
864
  DracoDecoderModule({
743
865
  ...options,
744
- onModuleLoaded: (draco) => resolve({
745
- draco
746
- })
866
+ onModuleLoaded: (draco) => resolve({ draco })
867
+ // Module is Promise-like. Wrap in object to avoid loop.
747
868
  });
748
869
  });
749
870
  }
750
871
  async function loadDracoEncoder(options) {
751
- let DracoEncoderModule = await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.ENCODER);
872
+ let DracoEncoderModule = await loadLibrary(
873
+ DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER],
874
+ "draco",
875
+ options,
876
+ DRACO_EXTERNAL_LIBRARIES.ENCODER
877
+ );
752
878
  DracoEncoderModule = DracoEncoderModule || globalThis.DracoEncoderModule;
753
879
  return new Promise((resolve) => {
754
880
  DracoEncoderModule({
755
- onModuleLoaded: (draco) => resolve({
756
- draco
757
- })
881
+ onModuleLoaded: (draco) => resolve({ draco })
882
+ // Module is Promise-like. Wrap in object to avoid loop.
758
883
  });
759
884
  });
760
885
  }
@@ -769,6 +894,12 @@ var __exports__ = (() => {
769
894
  var noop = () => {
770
895
  };
771
896
  var DracoBuilder = class {
897
+ draco;
898
+ dracoEncoder;
899
+ dracoMeshBuilder;
900
+ dracoMetadataBuilder;
901
+ log;
902
+ // draco - the draco decoder, either import `draco3d` or load dynamically
772
903
  constructor(draco) {
773
904
  this.draco = draco;
774
905
  this.dracoEncoder = new this.draco.Encoder();
@@ -783,21 +914,25 @@ var __exports__ = (() => {
783
914
  this.dracoEncoder = null;
784
915
  this.draco = null;
785
916
  }
917
+ // TBD - when does this need to be called?
786
918
  destroyEncodedObject(object) {
787
919
  if (object) {
788
920
  this.draco.destroy(object);
789
921
  }
790
922
  }
923
+ /**
924
+ * Encode mesh or point cloud
925
+ * @param mesh =({})
926
+ * @param options
927
+ */
791
928
  encodeSync(mesh, options = {}) {
792
929
  this.log = noop;
793
930
  this._setOptions(options);
794
931
  return options.pointcloud ? this._encodePointCloud(mesh, options) : this._encodeMesh(mesh, options);
795
932
  }
933
+ // PRIVATE
796
934
  _getAttributesFromMesh(mesh) {
797
- const attributes = {
798
- ...mesh,
799
- ...mesh.attributes
800
- };
935
+ const attributes = { ...mesh, ...mesh.attributes };
801
936
  if (mesh.indices) {
802
937
  attributes.indices = mesh.indices;
803
938
  }
@@ -812,7 +947,11 @@ var __exports__ = (() => {
812
947
  this._createDracoPointCloud(dracoPointCloud, attributes, options);
813
948
  const dracoData = new this.draco.DracoInt8Array();
814
949
  try {
815
- const encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(dracoPointCloud, false, dracoData);
950
+ const encodedLen = this.dracoEncoder.EncodePointCloudToDracoBuffer(
951
+ dracoPointCloud,
952
+ false,
953
+ dracoData
954
+ );
816
955
  if (!(encodedLen > 0)) {
817
956
  throw new Error("Draco encoding failed.");
818
957
  }
@@ -845,6 +984,10 @@ var __exports__ = (() => {
845
984
  this.destroyEncodedObject(dracoMesh);
846
985
  }
847
986
  }
987
+ /**
988
+ * Set encoding options.
989
+ * @param {{speed?: any; method?: any; quantization?: any;}} options
990
+ */
848
991
  _setOptions(options) {
849
992
  if ("speed" in options) {
850
993
  this.dracoEncoder.SetSpeedOptions(...options.speed);
@@ -861,6 +1004,11 @@ var __exports__ = (() => {
861
1004
  }
862
1005
  }
863
1006
  }
1007
+ /**
1008
+ * @param {Mesh} dracoMesh
1009
+ * @param {object} attributes
1010
+ * @returns {Mesh}
1011
+ */
864
1012
  _createDracoMesh(dracoMesh, attributes, options) {
865
1013
  const optionalMetadata = options.attributesMetadata || {};
866
1014
  try {
@@ -886,6 +1034,10 @@ var __exports__ = (() => {
886
1034
  }
887
1035
  return dracoMesh;
888
1036
  }
1037
+ /**
1038
+ * @param {} dracoPointCloud
1039
+ * @param {object} attributes
1040
+ */
889
1041
  _createDracoPointCloud(dracoPointCloud, attributes, options) {
890
1042
  const optionalMetadata = options.attributesMetadata || {};
891
1043
  try {
@@ -897,7 +1049,12 @@ var __exports__ = (() => {
897
1049
  for (let attributeName in attributes) {
898
1050
  const attribute = attributes[attributeName];
899
1051
  attributeName = GLTF_TO_DRACO_ATTRIBUTE_NAME_MAP[attributeName] || attributeName;
900
- const uniqueId = this._addAttributeToMesh(dracoPointCloud, attributeName, attribute, vertexCount);
1052
+ const uniqueId = this._addAttributeToMesh(
1053
+ dracoPointCloud,
1054
+ attributeName,
1055
+ attribute,
1056
+ vertexCount
1057
+ );
901
1058
  if (uniqueId !== -1) {
902
1059
  this._addAttributeMetadata(dracoPointCloud, uniqueId, {
903
1060
  name: attributeName,
@@ -911,6 +1068,12 @@ var __exports__ = (() => {
911
1068
  }
912
1069
  return dracoPointCloud;
913
1070
  }
1071
+ /**
1072
+ * @param mesh
1073
+ * @param attributeName
1074
+ * @param attribute
1075
+ * @param vertexCount
1076
+ */
914
1077
  _addAttributeToMesh(mesh, attributeName, attribute, vertexCount) {
915
1078
  if (!ArrayBuffer.isView(attribute)) {
916
1079
  return -1;
@@ -925,9 +1088,7 @@ var __exports__ = (() => {
925
1088
  }
926
1089
  this.log(`Adding attribute ${attributeName}, size ${size}`);
927
1090
  const builder = this.dracoMeshBuilder;
928
- const {
929
- buffer
930
- } = attribute;
1091
+ const { buffer } = attribute;
931
1092
  switch (attribute.constructor) {
932
1093
  case Int8Array:
933
1094
  return builder.AddInt8Attribute(mesh, type, vertexCount, size, new Int8Array(buffer));
@@ -947,6 +1108,11 @@ var __exports__ = (() => {
947
1108
  return builder.AddFloatAttribute(mesh, type, vertexCount, size, new Float32Array(buffer));
948
1109
  }
949
1110
  }
1111
+ /**
1112
+ * DRACO can compress attributes of know type better
1113
+ * TODO - expose an attribute type map?
1114
+ * @param attributeName
1115
+ */
950
1116
  _getDracoAttributeType(attributeName) {
951
1117
  switch (attributeName.toLowerCase()) {
952
1118
  case "indices":
@@ -978,16 +1144,36 @@ var __exports__ = (() => {
978
1144
  }
979
1145
  return null;
980
1146
  }
1147
+ /**
1148
+ * Add metadata for the geometry.
1149
+ * @param dracoGeometry - WASM Draco Object
1150
+ * @param metadata
1151
+ */
981
1152
  _addGeometryMetadata(dracoGeometry, metadata) {
982
1153
  const dracoMetadata = new this.draco.Metadata();
983
1154
  this._populateDracoMetadata(dracoMetadata, metadata);
984
1155
  this.dracoMeshBuilder.AddMetadata(dracoGeometry, dracoMetadata);
985
1156
  }
1157
+ /**
1158
+ * Add metadata for an attribute to geometry.
1159
+ * @param dracoGeometry - WASM Draco Object
1160
+ * @param uniqueAttributeId
1161
+ * @param metadata
1162
+ */
986
1163
  _addAttributeMetadata(dracoGeometry, uniqueAttributeId, metadata) {
987
1164
  const dracoAttributeMetadata = new this.draco.Metadata();
988
1165
  this._populateDracoMetadata(dracoAttributeMetadata, metadata);
989
- this.dracoMeshBuilder.SetMetadataForAttribute(dracoGeometry, uniqueAttributeId, dracoAttributeMetadata);
990
- }
1166
+ this.dracoMeshBuilder.SetMetadataForAttribute(
1167
+ dracoGeometry,
1168
+ uniqueAttributeId,
1169
+ dracoAttributeMetadata
1170
+ );
1171
+ }
1172
+ /**
1173
+ * Add contents of object or map to a WASM Draco Metadata Object
1174
+ * @param dracoMetadata - WASM Draco Object
1175
+ * @param metadata
1176
+ */
991
1177
  _populateDracoMetadata(dracoMetadata, metadata) {
992
1178
  for (const [key, value] of getEntries(metadata)) {
993
1179
  switch (typeof value) {
@@ -1027,7 +1213,14 @@ var __exports__ = (() => {
1027
1213
  // src/draco-writer.ts
1028
1214
  var DEFAULT_DRACO_WRITER_OPTIONS = {
1029
1215
  pointcloud: false,
1216
+ // Set to true if pointcloud (mode: 0, no indices)
1030
1217
  attributeNameEntry: "name"
1218
+ // Draco Compression Parameters
1219
+ // method: 'MESH_EDGEBREAKER_ENCODING', // Use draco defaults
1220
+ // speed: [5, 5], // Use draco defaults
1221
+ // quantization: { // Use draco defaults
1222
+ // POSITION: 10
1223
+ // }
1031
1224
  };
1032
1225
  var DracoWriter = {
1033
1226
  name: "DRACO",
@@ -1041,9 +1234,7 @@ var __exports__ = (() => {
1041
1234
  encode
1042
1235
  };
1043
1236
  async function encode(data, options = {}) {
1044
- const {
1045
- draco
1046
- } = await loadDracoEncoderModule(options);
1237
+ const { draco } = await loadDracoEncoderModule(options);
1047
1238
  const dracoBuilder = new DracoBuilder(draco);
1048
1239
  try {
1049
1240
  return dracoBuilder.encodeSync(data, options.draco);
@@ -1069,9 +1260,7 @@ var __exports__ = (() => {
1069
1260
  parse
1070
1261
  };
1071
1262
  async function parse(arrayBuffer, options) {
1072
- const {
1073
- draco
1074
- } = await loadDracoDecoderModule(options);
1263
+ const { draco } = await loadDracoDecoderModule(options);
1075
1264
  const dracoParser = new DracoParser(draco);
1076
1265
  try {
1077
1266
  return dracoParser.parseSync(arrayBuffer, options?.draco);
@@ -1079,7 +1268,7 @@ var __exports__ = (() => {
1079
1268
  dracoParser.destroy();
1080
1269
  }
1081
1270
  }
1082
- return __toCommonJS(src_exports);
1271
+ return __toCommonJS(bundle_exports);
1083
1272
  })();
1084
1273
  return __exports__;
1085
1274
  });