@loaders.gl/i3s 4.0.0-alpha.17 → 4.0.0-alpha.19

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 (57) hide show
  1. package/dist/dist.min.js +155 -98
  2. package/dist/es5/arcgis-webscene-loader.js +1 -1
  3. package/dist/es5/i3s-attribute-loader.js +1 -1
  4. package/dist/es5/i3s-building-scene-layer-loader.js +1 -1
  5. package/dist/es5/i3s-content-loader.js +1 -1
  6. package/dist/es5/i3s-loader.js +6 -6
  7. package/dist/es5/i3s-loader.js.map +1 -1
  8. package/dist/es5/i3s-node-page-loader.js +1 -1
  9. package/dist/es5/i3s-slpk-loader.js +1 -1
  10. package/dist/es5/index.js.map +1 -1
  11. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +9 -5
  12. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  13. package/dist/es5/lib/parsers/parse-i3s.js +30 -19
  14. package/dist/es5/lib/parsers/parse-i3s.js.map +1 -1
  15. package/dist/es5/lib/utils/url-utils.js +3 -3
  16. package/dist/es5/lib/utils/url-utils.js.map +1 -1
  17. package/dist/es5/types.js.map +1 -1
  18. package/dist/esm/arcgis-webscene-loader.js +1 -1
  19. package/dist/esm/i3s-attribute-loader.js +1 -1
  20. package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
  21. package/dist/esm/i3s-content-loader.js +1 -1
  22. package/dist/esm/i3s-loader.js +3 -4
  23. package/dist/esm/i3s-loader.js.map +1 -1
  24. package/dist/esm/i3s-node-page-loader.js +1 -1
  25. package/dist/esm/i3s-slpk-loader.js +1 -1
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +9 -5
  28. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  29. package/dist/esm/lib/parsers/parse-i3s.js +21 -10
  30. package/dist/esm/lib/parsers/parse-i3s.js.map +1 -1
  31. package/dist/esm/lib/utils/url-utils.js +2 -3
  32. package/dist/esm/lib/utils/url-utils.js.map +1 -1
  33. package/dist/esm/types.js.map +1 -1
  34. package/dist/i3s-content-worker-node.js +47 -47
  35. package/dist/i3s-content-worker-node.js.map +3 -3
  36. package/dist/i3s-content-worker.js +88 -44
  37. package/dist/i3s-loader.js +2 -4
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/lib/helpers/i3s-nodepages-tiles.d.ts +5 -3
  41. package/dist/lib/helpers/i3s-nodepages-tiles.d.ts.map +1 -1
  42. package/dist/lib/helpers/i3s-nodepages-tiles.js +7 -5
  43. package/dist/lib/parsers/parse-i3s.d.ts +2 -2
  44. package/dist/lib/parsers/parse-i3s.d.ts.map +1 -1
  45. package/dist/lib/parsers/parse-i3s.js +22 -12
  46. package/dist/lib/utils/url-utils.d.ts +5 -4
  47. package/dist/lib/utils/url-utils.d.ts.map +1 -1
  48. package/dist/lib/utils/url-utils.js +5 -4
  49. package/dist/types.d.ts +105 -34
  50. package/dist/types.d.ts.map +1 -1
  51. package/package.json +9 -9
  52. package/src/i3s-loader.ts +2 -4
  53. package/src/index.ts +4 -0
  54. package/src/lib/helpers/i3s-nodepages-tiles.ts +16 -9
  55. package/src/lib/parsers/parse-i3s.ts +26 -16
  56. package/src/lib/utils/url-utils.ts +6 -5
  57. package/src/types.ts +102 -35
@@ -32,6 +32,12 @@
32
32
  }
33
33
  });
34
34
 
35
+ // (disabled):../core/src/lib/fetch/fetch-file.node
36
+ var require_fetch_file = __commonJS({
37
+ "(disabled):../core/src/lib/fetch/fetch-file.node"() {
38
+ }
39
+ });
40
+
35
41
  // ../loader-utils/src/lib/env-utils/assert.ts
36
42
  function assert(condition, message) {
37
43
  if (!condition) {
@@ -55,7 +61,7 @@
55
61
  var nodeVersion = matches && parseFloat(matches[1]) || 0;
56
62
 
57
63
  // ../worker-utils/src/lib/env-utils/version.ts
58
- var VERSION = true ? "4.0.0-alpha.17" : DEFAULT_VERSION;
64
+ var VERSION = true ? "4.0.0-alpha.19" : DEFAULT_VERSION;
59
65
  if (false) {
60
66
  console.error("loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN.");
61
67
  }
@@ -558,37 +564,37 @@
558
564
  var LATEST = "beta";
559
565
  var VERSION2 = typeof VERSION !== "undefined" ? VERSION : LATEST;
560
566
  var loadLibraryPromises = {};
561
- async function loadLibrary(libraryUrl, moduleName = null, options = {}) {
567
+ async function loadLibrary(libraryUrl, moduleName = null, options = {}, libraryName = null) {
562
568
  if (moduleName) {
563
- libraryUrl = getLibraryUrl(libraryUrl, moduleName, options);
569
+ libraryUrl = getLibraryUrl(libraryUrl, moduleName, options, libraryName);
564
570
  }
565
571
  loadLibraryPromises[libraryUrl] = loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);
566
572
  return await loadLibraryPromises[libraryUrl];
567
573
  }
568
- function getLibraryUrl(library, moduleName, options) {
569
- if (library.startsWith("http")) {
574
+ function getLibraryUrl(library, moduleName, options = {}, libraryName = null) {
575
+ if (!options.useLocalLibraries && library.startsWith("http")) {
570
576
  return library;
571
577
  }
578
+ libraryName = libraryName || library;
572
579
  const modules = options.modules || {};
573
- if (modules[library]) {
574
- return modules[library];
580
+ if (modules[libraryName]) {
581
+ return modules[libraryName];
575
582
  }
576
583
  if (!isBrowser2) {
577
- return `modules/${moduleName}/dist/libs/${library}`;
584
+ return `modules/${moduleName}/dist/libs/${libraryName}`;
578
585
  }
579
586
  if (options.CDN) {
580
587
  assert2(options.CDN.startsWith("http"));
581
- return `${options.CDN}/${moduleName}@${VERSION2}/dist/libs/${library}`;
588
+ return `${options.CDN}/${moduleName}@${VERSION2}/dist/libs/${libraryName}`;
582
589
  }
583
590
  if (isWorker) {
584
- return `../src/libs/${library}`;
591
+ return `../src/libs/${libraryName}`;
585
592
  }
586
- return `modules/${moduleName}/src/libs/${library}`;
593
+ return `modules/${moduleName}/src/libs/${libraryName}`;
587
594
  }
588
595
  async function loadLibraryFromFile(libraryUrl) {
589
596
  if (libraryUrl.endsWith("wasm")) {
590
- const response2 = await fetch(libraryUrl);
591
- return await response2.arrayBuffer();
597
+ return await loadAsArrayBuffer(libraryUrl);
592
598
  }
593
599
  if (!isBrowser2) {
594
600
  try {
@@ -600,8 +606,7 @@
600
606
  if (isWorker) {
601
607
  return importScripts(libraryUrl);
602
608
  }
603
- const response = await fetch(libraryUrl);
604
- const scriptSource = await response.text();
609
+ const scriptSource = await loadAsText(libraryUrl);
605
610
  return loadLibraryFromString(scriptSource, libraryUrl);
606
611
  }
607
612
  function loadLibraryFromString(scriptSource, id) {
@@ -622,6 +627,20 @@
622
627
  document.body.appendChild(script);
623
628
  return null;
624
629
  }
630
+ async function loadAsArrayBuffer(url) {
631
+ if (!node.readFileAsArrayBuffer || url.startsWith("http")) {
632
+ const response = await fetch(url);
633
+ return await response.arrayBuffer();
634
+ }
635
+ return await node.readFileAsArrayBuffer(url);
636
+ }
637
+ async function loadAsText(url) {
638
+ if (!node.readFileAsText || url.startsWith("http")) {
639
+ const response = await fetch(url);
640
+ return await response.text();
641
+ }
642
+ return await node.readFileAsText(url);
643
+ }
625
644
 
626
645
  // ../loader-utils/src/lib/worker-loader-utils/create-loader-worker.ts
627
646
  var requestId = 0;
@@ -1191,9 +1210,22 @@
1191
1210
  }
1192
1211
 
1193
1212
  // ../core/src/lib/fetch/fetch-file.ts
1213
+ var node3 = __toModule(require_fetch_file());
1214
+ function isNodePath(url) {
1215
+ return !isRequestURL(url) && !isDataURL(url);
1216
+ }
1217
+ function isRequestURL(url) {
1218
+ return url.startsWith("http:") || url.startsWith("https:");
1219
+ }
1220
+ function isDataURL(url) {
1221
+ return url.startsWith("data:");
1222
+ }
1194
1223
  async function fetchFile(urlOrData, fetchOptions) {
1195
1224
  if (typeof urlOrData === "string") {
1196
1225
  const url = resolvePath(urlOrData);
1226
+ if (isNodePath(url) && node3?.fetchFileNode) {
1227
+ return node3.fetchFileNode(url, fetchOptions);
1228
+ }
1197
1229
  return await fetch(url, fetchOptions);
1198
1230
  }
1199
1231
  return await makeResponse(urlOrData);
@@ -1230,7 +1262,7 @@
1230
1262
  var navigator_ = globalThis.navigator || {};
1231
1263
 
1232
1264
  // ../../node_modules/@probe.gl/log/node_modules/@probe.gl/env/dist/utils/globals.js
1233
- var VERSION3 = true ? "4.0.0-alpha.17" : "untranspiled source";
1265
+ var VERSION3 = true ? "4.0.0-alpha.19" : "untranspiled source";
1234
1266
  var isBrowser4 = isBrowser3();
1235
1267
 
1236
1268
  // ../../node_modules/@probe.gl/log/dist/utils/local-storage.js
@@ -1771,6 +1803,7 @@
1771
1803
  mimeType: void 0,
1772
1804
  nothrow: false,
1773
1805
  log: new ConsoleLog(),
1806
+ useLocalLibraries: false,
1774
1807
  CDN: "https://unpkg.com/@loaders.gl",
1775
1808
  worker: true,
1776
1809
  maxConcurrency: 3,
@@ -4578,7 +4611,7 @@
4578
4611
  _defineProperty(Ellipsoid, "WGS84", new Ellipsoid(WGS84_RADIUS_X, WGS84_RADIUS_Y, WGS84_RADIUS_Z));
4579
4612
 
4580
4613
  // ../images/src/lib/utils/version.ts
4581
- var VERSION4 = true ? "4.0.0-alpha.17" : "latest";
4614
+ var VERSION4 = true ? "4.0.0-alpha.19" : "latest";
4582
4615
 
4583
4616
  // ../images/src/lib/category-api/image-type.ts
4584
4617
  var { _parseImageNode } = globalThis;
@@ -4975,7 +5008,7 @@
4975
5008
  };
4976
5009
 
4977
5010
  // ../draco/src/lib/utils/version.ts
4978
- var VERSION5 = true ? "4.0.0-alpha.17" : "latest";
5011
+ var VERSION5 = true ? "4.0.0-alpha.19" : "latest";
4979
5012
 
4980
5013
  // ../draco/src/draco-loader.ts
4981
5014
  var DEFAULT_DRACO_OPTIONS = {
@@ -5458,10 +5491,18 @@
5458
5491
  var DRACO_DECODER_VERSION = "1.5.5";
5459
5492
  var DRACO_ENCODER_VERSION = "1.4.1";
5460
5493
  var STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;
5461
- var DRACO_JS_DECODER_URL = `${STATIC_DECODER_URL}/draco_decoder.js`;
5462
- var DRACO_WASM_WRAPPER_URL = `${STATIC_DECODER_URL}/draco_wasm_wrapper.js`;
5463
- var DRACO_WASM_DECODER_URL = `${STATIC_DECODER_URL}/draco_decoder.wasm`;
5464
- var DRACO_ENCODER_URL = `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/draco_encoder.js`;
5494
+ var DRACO_EXTERNAL_LIBRARIES = {
5495
+ DECODER: "draco_wasm_wrapper.js",
5496
+ DECODER_WASM: "draco_decoder.wasm",
5497
+ FALLBACK_DECODER: "draco_decoder.js",
5498
+ ENCODER: "draco_encoder.js"
5499
+ };
5500
+ var DRACO_EXTERNAL_LIBRARY_URLS = {
5501
+ [DRACO_EXTERNAL_LIBRARIES.DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER}`,
5502
+ [DRACO_EXTERNAL_LIBRARIES.DECODER_WASM]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER_WASM}`,
5503
+ [DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER}`,
5504
+ [DRACO_EXTERNAL_LIBRARIES.ENCODER]: `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/${DRACO_EXTERNAL_LIBRARIES.ENCODER}`
5505
+ };
5465
5506
  var loadDecoderPromise;
5466
5507
  async function loadDracoDecoderModule(options) {
5467
5508
  const modules = options.modules || {};
@@ -5479,13 +5520,13 @@
5479
5520
  let wasmBinary;
5480
5521
  switch (options.draco && options.draco.decoderType) {
5481
5522
  case "js":
5482
- DracoDecoderModule = await loadLibrary(DRACO_JS_DECODER_URL, "draco", options);
5523
+ DracoDecoderModule = await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER);
5483
5524
  break;
5484
5525
  case "wasm":
5485
5526
  default:
5486
5527
  [DracoDecoderModule, wasmBinary] = await Promise.all([
5487
- await loadLibrary(DRACO_WASM_WRAPPER_URL, "draco", options),
5488
- await loadLibrary(DRACO_WASM_DECODER_URL, "draco", options)
5528
+ await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.DECODER),
5529
+ await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM], "draco", options, DRACO_EXTERNAL_LIBRARIES.DECODER_WASM)
5489
5530
  ]);
5490
5531
  }
5491
5532
  DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
@@ -5520,32 +5561,35 @@
5520
5561
  }
5521
5562
 
5522
5563
  // ../textures/src/lib/utils/version.ts
5523
- var VERSION6 = true ? "4.0.0-alpha.17" : "beta";
5564
+ var VERSION6 = true ? "4.0.0-alpha.19" : "beta";
5524
5565
 
5525
5566
  // ../textures/src/lib/parsers/basis-module-loader.ts
5526
- var VERSION7 = true ? "4.0.0-alpha.17" : "beta";
5527
- var BASIS_CDN_ENCODER_WASM = `https://unpkg.com/@loaders.gl/textures@${VERSION7}/dist/libs/basis_encoder.wasm`;
5528
- var BASIS_CDN_ENCODER_JS = `https://unpkg.com/@loaders.gl/textures@${VERSION7}/dist/libs/basis_encoder.js`;
5567
+ var BASIS_EXTERNAL_LIBRARIES = {
5568
+ TRANSCODER: "basis_transcoder.js",
5569
+ TRANSCODER_WASM: "basis_transcoder.wasm",
5570
+ ENCODER: "basis_encoder.js",
5571
+ ENCODER_WASM: "basis_encoder.wasm"
5572
+ };
5529
5573
  var loadBasisTranscoderPromise;
5530
- async function loadBasisTrascoderModule(options) {
5574
+ async function loadBasisTranscoderModule(options) {
5531
5575
  const modules = options.modules || {};
5532
5576
  if (modules.basis) {
5533
5577
  return modules.basis;
5534
5578
  }
5535
- loadBasisTranscoderPromise = loadBasisTranscoderPromise || loadBasisTrascoder(options);
5579
+ loadBasisTranscoderPromise = loadBasisTranscoderPromise || loadBasisTranscoder(options);
5536
5580
  return await loadBasisTranscoderPromise;
5537
5581
  }
5538
- async function loadBasisTrascoder(options) {
5582
+ async function loadBasisTranscoder(options) {
5539
5583
  let BASIS = null;
5540
5584
  let wasmBinary = null;
5541
5585
  [BASIS, wasmBinary] = await Promise.all([
5542
- await loadLibrary("basis_transcoder.js", "textures", options),
5543
- await loadLibrary("basis_transcoder.wasm", "textures", options)
5586
+ await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER, "textures", options),
5587
+ await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER_WASM, "textures", options)
5544
5588
  ]);
5545
5589
  BASIS = BASIS || globalThis.BASIS;
5546
- return await initializeBasisTrascoderModule(BASIS, wasmBinary);
5590
+ return await initializeBasisTranscoderModule(BASIS, wasmBinary);
5547
5591
  }
5548
- function initializeBasisTrascoderModule(BasisModule, wasmBinary) {
5592
+ function initializeBasisTranscoderModule(BasisModule, wasmBinary) {
5549
5593
  const options = {};
5550
5594
  if (wasmBinary) {
5551
5595
  options.wasmBinary = wasmBinary;
@@ -5571,8 +5615,8 @@
5571
5615
  let BASIS_ENCODER = null;
5572
5616
  let wasmBinary = null;
5573
5617
  [BASIS_ENCODER, wasmBinary] = await Promise.all([
5574
- await loadLibrary(BASIS_CDN_ENCODER_JS, "textures", options),
5575
- await loadLibrary(BASIS_CDN_ENCODER_WASM, "textures", options)
5618
+ await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER, "textures", options),
5619
+ await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER_WASM, "textures", options)
5576
5620
  ]);
5577
5621
  BASIS_ENCODER = BASIS_ENCODER || globalThis.BASIS;
5578
5622
  return await initializeBasisEncoderModule(BASIS_ENCODER, wasmBinary);
@@ -5981,7 +6025,7 @@
5981
6025
  const fileConstructors = await loadBasisEncoderModule(options);
5982
6026
  return parseKTX2File(fileConstructors.KTX2File, data, options);
5983
6027
  }
5984
- const { BasisFile } = await loadBasisTrascoderModule(options);
6028
+ const { BasisFile } = await loadBasisTranscoderModule(options);
5985
6029
  return parseBasisFile(BasisFile, data, options);
5986
6030
  }
5987
6031
  switch (options.basis.module) {
@@ -5996,7 +6040,7 @@
5996
6040
  }
5997
6041
  case "transcoder":
5998
6042
  default:
5999
- const { BasisFile } = await loadBasisTrascoderModule(options);
6043
+ const { BasisFile } = await loadBasisTranscoderModule(options);
6000
6044
  return parseBasisFile(BasisFile, data, options);
6001
6045
  }
6002
6046
  }
@@ -7209,12 +7253,12 @@
7209
7253
  }
7210
7254
 
7211
7255
  // src/i3s-attribute-loader.ts
7212
- var VERSION8 = true ? "4.0.0-alpha.17" : "latest";
7256
+ var VERSION7 = true ? "4.0.0-alpha.19" : "latest";
7213
7257
  var I3SAttributeLoader = {
7214
7258
  name: "I3S Attribute",
7215
7259
  id: "i3s-attribute",
7216
7260
  module: "i3s",
7217
- version: VERSION8,
7261
+ version: VERSION7,
7218
7262
  mimeTypes: ["application/binary"],
7219
7263
  parse: async (arrayBuffer, options) => parseI3STileAttribute(arrayBuffer, options),
7220
7264
  extensions: ["bin"],
@@ -7672,13 +7716,13 @@
7672
7716
  }
7673
7717
 
7674
7718
  // src/i3s-content-loader.ts
7675
- var VERSION9 = true ? "4.0.0-alpha.17" : "beta";
7719
+ var VERSION8 = true ? "4.0.0-alpha.19" : "beta";
7676
7720
  var I3SContentLoader = {
7677
7721
  name: "I3S Content (Indexed Scene Layers)",
7678
7722
  id: "i3s-content",
7679
7723
  module: "i3s",
7680
7724
  worker: true,
7681
- version: VERSION9,
7725
+ version: VERSION8,
7682
7726
  mimeTypes: ["application/octet-stream"],
7683
7727
  parse: parse3,
7684
7728
  extensions: ["bin"],
@@ -82,10 +82,8 @@ async function parseTileset(data, options, context) {
82
82
  if (tilesetJson?.layerType === POINT_CLOUD) {
83
83
  throw new Error('Point Cloud layers currently are not supported by I3SLoader');
84
84
  }
85
- // eslint-disable-next-line no-use-before-define
86
- tilesetJson.loader = exports.I3SLoader;
87
- await (0, parse_i3s_1.normalizeTilesetData)(tilesetJson, options, context);
88
- return tilesetJson;
85
+ const tilesetPostprocessed = await (0, parse_i3s_1.normalizeTilesetData)(tilesetJson, options, context);
86
+ return tilesetPostprocessed;
89
87
  }
90
88
  async function parseTile(data, context) {
91
89
  data = JSON.parse(new TextDecoder().decode(data));
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- export type { BoundingVolumes, Mbs, Obb, SceneLayer3D, AttributeStorageInfo, Field, ESRIField, PopupInfo, Node3DIndexDocument, LodSelection, NodeReference, Resource, MaxScreenThresholdSQ, NodeInPage, SharedResources, Attribute, Extent, FeatureAttribute, FieldInfo, I3SMaterialDefinition, TextureDefinitionInfo, MaterialDefinitionInfo, FullExtent, StatisticsInfo, StatsInfo, Histogram, ValueCount, BuildingSceneSublayer, OperationalLayer, TextureSetDefinitionFormats } from './types';
1
+ export type { BoundingVolumes, Mbs, Obb, I3STilesetHeader, I3STileContent, I3STileHeader, SceneLayer3D, AttributeStorageInfo, Field, ESRIField, PopupInfo, Node3DIndexDocument, LodSelection, NodeReference, Resource, MaxScreenThresholdSQ, NodeInPage, SharedResources, Attribute, Extent, FeatureAttribute, FieldInfo, I3SMaterialDefinition, TextureDefinitionInfo, MaterialDefinitionInfo, FullExtent, StatisticsInfo, StatsInfo, Histogram, ValueCount, BuildingSceneSublayer, OperationalLayer, TextureSetDefinitionFormats } from './types';
2
2
  export type { FileProvider } from './lib/parsers/parse-zip/file-provider';
3
+ export type { I3SLoaderOptions } from './i3s-loader';
3
4
  export { COORDINATE_SYSTEM } from './lib/parsers/constants';
4
5
  export { I3SLoader } from './i3s-loader';
5
6
  export { SLPKLoader } from './i3s-slpk-loader';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,eAAe,EACf,GAAG,EACH,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AACjB,YAAY,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;AAExE,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAC,uBAAuB,EAAC,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAC,SAAS,EAAC,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,eAAe,EACf,GAAG,EACH,GAAG,EACH,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AACjB,YAAY,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;AACxE,YAAY,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAC,uBAAuB,EAAC,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAC,SAAS,EAAC,MAAM,qCAAqC,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import type { LoaderOptions } from '@loaders.gl/loader-utils';
2
- import { I3STilesetHeader, NodePage, NodeInPage, I3STextureFormat, I3STileHeader } from '../../types';
2
+ import { NodePage, NodeInPage, I3STextureFormat, I3STileHeader, SceneLayer3D } from '../../types';
3
3
  /**
4
4
  * class I3SNodePagesTiles - loads nodePages and form i3s tiles from them
5
5
  */
6
6
  export default class I3SNodePagesTiles {
7
- tileset: I3STilesetHeader;
7
+ tileset: SceneLayer3D;
8
8
  nodePages: NodePage[];
9
9
  pendingNodePages: {
10
10
  promise: Promise<NodePage>;
@@ -18,14 +18,16 @@ export default class I3SNodePagesTiles {
18
18
  name: string;
19
19
  } | null)[];
20
20
  nodesInNodePages: number;
21
+ url: string;
21
22
  private textureLoaderOptions;
22
23
  /**
23
24
  * @constructs
24
25
  * Create a I3SNodePagesTiles instance.
25
26
  * @param tileset - i3s tileset header ('layers/0')
27
+ * @param url - tileset url
26
28
  * @param options - i3s loader options
27
29
  */
28
- constructor(tileset: I3STilesetHeader, options: LoaderOptions);
30
+ constructor(tileset: SceneLayer3D, url: string | undefined, options: LoaderOptions);
29
31
  /**
30
32
  * Loads some nodePage and return a particular node from it
31
33
  * @param id - id of node through all node pages
@@ -1 +1 @@
1
- {"version":3,"file":"i3s-nodepages-tiles.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers/i3s-nodepages-tiles.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EACL,gBAAgB,EAEhB,QAAQ,EACR,UAAU,EAIV,gBAAgB,EAEhB,aAAa,EACd,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,gBAAgB,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAA;KAAC,EAAE,CAAM;IAClF,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iCAAiC,EAAE,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,EAAE,CAAM;IAC5F,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,oBAAoB,CAA4B;IAExD;;;;;OAKG;gBACS,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa;IAU7D;;;OAGG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBlD;;;OAGG;IAEG,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA4D/D;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA8BrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAuBlC;;;;OAIG;IACH,OAAO,CAAC,wCAAwC;IA2BhD;;;OAGG;IACH,OAAO,CAAC,0BAA0B;CAwBnC"}
1
+ {"version":3,"file":"i3s-nodepages-tiles.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers/i3s-nodepages-tiles.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAEL,QAAQ,EACR,UAAU,EAIV,gBAAgB,EAEhB,aAAa,EACb,YAAY,EACb,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,gBAAgB,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAA;KAAC,EAAE,CAAM;IAClF,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iCAAiC,EAAE,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,EAAE,CAAM;IAC5F,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,oBAAoB,CAA4B;IAExD;;;;;;OAMG;gBACS,OAAO,EAAE,YAAY,EAAE,GAAG,oBAAa,EAAE,OAAO,EAAE,aAAa;IAW3E;;;OAGG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBlD;;;OAGG;IAEG,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAgE/D;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA8BrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAuBlC;;;;OAIG;IACH,OAAO,CAAC,wCAAwC;IA2BhD;;;OAGG;IACH,OAAO,CAAC,0BAA0B;CAwBnC"}
@@ -13,14 +13,16 @@ class I3SNodePagesTiles {
13
13
  * @constructs
14
14
  * Create a I3SNodePagesTiles instance.
15
15
  * @param tileset - i3s tileset header ('layers/0')
16
+ * @param url - tileset url
16
17
  * @param options - i3s loader options
17
18
  */
18
- constructor(tileset, options) {
19
+ constructor(tileset, url = '', options) {
19
20
  this.nodePages = [];
20
21
  this.pendingNodePages = [];
21
22
  this.textureDefinitionsSelectedFormats = [];
22
23
  this.textureLoaderOptions = {};
23
24
  this.tileset = { ...tileset }; // spread the tileset to avoid circular reference
25
+ this.url = url;
24
26
  this.nodesPerPage = tileset.nodePages?.nodesPerPage || 64;
25
27
  this.lodSelectionMetricType = tileset.nodePages?.lodSelectionMetricType;
26
28
  this.options = options;
@@ -34,7 +36,7 @@ class I3SNodePagesTiles {
34
36
  async getNodeById(id) {
35
37
  const pageIndex = Math.floor(id / this.nodesPerPage);
36
38
  if (!this.nodePages[pageIndex] && !this.pendingNodePages[pageIndex]) {
37
- const nodePageUrl = (0, url_utils_1.getUrlWithToken)(`${this.tileset.url}/nodepages/${pageIndex}`,
39
+ const nodePageUrl = (0, url_utils_1.getUrlWithToken)(`${this.url}/nodepages/${pageIndex}`,
38
40
  // @ts-expect-error this.options is not properly typed
39
41
  this.options.i3s?.token);
40
42
  this.pendingNodePages[pageIndex] = {
@@ -86,10 +88,10 @@ class I3SNodePagesTiles {
86
88
  materialDefinition = nodeMaterialDefinition;
87
89
  textureFormat = textureData.format || textureFormat;
88
90
  if (textureData.name) {
89
- textureUrl = `${this.tileset.url}/nodes/${node.mesh.material.resource}/textures/${textureData.name}`;
91
+ textureUrl = `${this.url}/nodes/${node.mesh.material.resource}/textures/${textureData.name}`;
90
92
  }
91
93
  if (this.tileset.attributeStorageInfo) {
92
- attributeUrls = (0, url_utils_1.generateTilesetAttributeUrls)(this.tileset, node.mesh.attribute.resource);
94
+ attributeUrls = (0, url_utils_1.generateTilesetAttributeUrls)(this.tileset, this.url, node.mesh.attribute.resource);
93
95
  }
94
96
  }
95
97
  const lodSelection = this.getLodSelection(node);
@@ -131,7 +133,7 @@ class I3SNodePagesTiles {
131
133
  if (geometryIndex !== -1) {
132
134
  const isDracoGeometry = Boolean(geometryDefinition.geometryBuffers[geometryIndex].compressedAttributes);
133
135
  result = {
134
- url: `${this.tileset.url}/nodes/${meshGeometryData.resource}/geometries/${geometryIndex}`,
136
+ url: `${this.url}/nodes/${meshGeometryData.resource}/geometries/${geometryIndex}`,
135
137
  isDracoGeometry
136
138
  };
137
139
  }
@@ -1,6 +1,6 @@
1
- import { I3STilesetHeader, I3STileHeader, I3SMinimalNodeData, Node3DIndexDocument } from '../../types';
1
+ import { I3STilesetHeader, I3STileHeader, I3SMinimalNodeData, Node3DIndexDocument, SceneLayer3D } from '../../types';
2
2
  import type { LoaderOptions, LoaderContext } from '@loaders.gl/loader-utils';
3
3
  export declare function normalizeTileData(tile: Node3DIndexDocument, context: LoaderContext): I3STileHeader;
4
4
  export declare function normalizeTileNonUrlData(tile: I3SMinimalNodeData): I3STileHeader;
5
- export declare function normalizeTilesetData(tileset: I3STilesetHeader, options: LoaderOptions, context: LoaderContext): Promise<void>;
5
+ export declare function normalizeTilesetData(tileset: SceneLayer3D, options: LoaderOptions, context: LoaderContext): Promise<I3STilesetHeader>;
6
6
  //# sourceMappingURL=parse-i3s.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-i3s.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-i3s.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,aAAa,EAEb,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAE3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAG,mBAAmB,EAAE,OAAO,EAAE,aAAa,GAAG,aAAa,CAyBnG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAG,kBAAkB,GAAG,aAAa,CAmChF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAG,gBAAgB,EAAE,OAAO,EAAG,aAAa,EAAE,OAAO,EAAE,aAAa,iBA0BrH"}
1
+ {"version":3,"file":"parse-i3s.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-i3s.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,aAAa,EAEb,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAG3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAG,mBAAmB,EAAE,OAAO,EAAE,aAAa,GAAG,aAAa,CA6BnG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAG,kBAAkB,GAAG,aAAa,CAkChF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAG,YAAY,EAAE,OAAO,EAAG,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+B7I"}
@@ -10,6 +10,7 @@ const core_1 = require("@loaders.gl/core");
10
10
  const tiles_1 = require("@loaders.gl/tiles");
11
11
  const i3s_nodepages_tiles_1 = __importDefault(require("../helpers/i3s-nodepages-tiles"));
12
12
  const url_utils_1 = require("../utils/url-utils");
13
+ const i3s_loader_1 = require("../../i3s-loader");
13
14
  function normalizeTileData(tile, context) {
14
15
  const url = context.url || '';
15
16
  let contentUrl;
@@ -24,11 +25,14 @@ function normalizeTileData(tile, context) {
24
25
  if (tile.attributeData) {
25
26
  attributeUrls = (0, url_utils_1.generateTileAttributeUrls)(url, tile);
26
27
  }
28
+ const children = tile.children || [];
27
29
  return normalizeTileNonUrlData({
28
30
  ...tile,
31
+ children,
29
32
  url,
30
33
  contentUrl,
31
34
  textureUrl,
35
+ textureFormat: 'jpg',
32
36
  attributeUrls,
33
37
  isDracoGeometry: false
34
38
  });
@@ -57,26 +61,27 @@ function normalizeTileNonUrlData(tile) {
57
61
  }
58
62
  const lodMetricType = tile.lodSelection?.[0].metricType;
59
63
  const lodMetricValue = tile.lodSelection?.[0].maxError;
60
- const transformMatrix = tile.transform;
61
64
  const type = tiles_1.TILE_TYPE.MESH;
62
65
  /**
63
66
  * I3S specification supports only REPLACE
64
67
  */
65
68
  const refine = tiles_1.TILE_REFINEMENT.REPLACE;
66
- return { ...tile, mbs, boundingVolume, lodMetricType, lodMetricValue, transformMatrix, type, refine };
69
+ return { ...tile, mbs, boundingVolume, lodMetricType, lodMetricValue, type, refine };
67
70
  }
68
71
  exports.normalizeTileNonUrlData = normalizeTileNonUrlData;
69
72
  async function normalizeTilesetData(tileset, options, context) {
70
- tileset.url = context.url;
73
+ const url = context.url;
74
+ let nodePagesTile;
75
+ let root;
71
76
  if (tileset.nodePages) {
72
- tileset.nodePagesTile = new i3s_nodepages_tiles_1.default(tileset, options);
73
- tileset.root = tileset.nodePagesTile.formTileFromNodePages(0);
77
+ nodePagesTile = new i3s_nodepages_tiles_1.default(tileset, url, options);
78
+ root = await nodePagesTile.formTileFromNodePages(0);
74
79
  }
75
80
  else {
76
81
  // @ts-expect-error options is not properly typed
77
82
  const rootNodeUrl = (0, url_utils_1.getUrlWithToken)(`${tileset.url}/nodes/root`, options.i3s?.token);
78
83
  // eslint-disable-next-line no-use-before-define
79
- tileset.root = await (0, core_1.load)(rootNodeUrl, tileset.loader, {
84
+ root = await (0, core_1.load)(rootNodeUrl, i3s_loader_1.I3SLoader, {
80
85
  ...options,
81
86
  i3s: {
82
87
  // @ts-expect-error options is not properly typed
@@ -85,11 +90,16 @@ async function normalizeTilesetData(tileset, options, context) {
85
90
  }
86
91
  });
87
92
  }
88
- // base path that non-absolute paths in tileset are relative to.
89
- tileset.basePath = tileset.url;
90
- tileset.type = tiles_1.TILESET_TYPE.I3S;
91
- // populate from root node
92
- tileset.lodMetricType = tileset.root.lodMetricType;
93
- tileset.lodMetricValue = tileset.root.lodMetricValue;
93
+ return {
94
+ ...tileset,
95
+ loader: i3s_loader_1.I3SLoader,
96
+ url,
97
+ basePath: url,
98
+ type: tiles_1.TILESET_TYPE.I3S,
99
+ nodePagesTile,
100
+ root,
101
+ lodMetricType: root.lodMetricType,
102
+ lodMetricValue: root.lodMetricValue
103
+ };
94
104
  }
95
105
  exports.normalizeTilesetData = normalizeTilesetData;
@@ -1,4 +1,4 @@
1
- import { Node3DIndexDocument } from '../../types';
1
+ import { Node3DIndexDocument, SceneLayer3D } from '../../types';
2
2
  /**
3
3
  * Generates url with token if it is exists.
4
4
  * @param url
@@ -14,9 +14,10 @@ export declare function getUrlWithToken(url: string, token?: string | null): str
14
14
  export declare function generateTileAttributeUrls(url: string, tile: Node3DIndexDocument): string[];
15
15
  /**
16
16
  * Generates attribute urls for tileset based on tileset and resource
17
- * @param {Object} tileset
18
- * @param {number} resource
17
+ * @param tileset - tileset metadata
18
+ * @param url - tileset base url
19
+ * @param resource - resource id per I3S spec
19
20
  * @returns {Array}
20
21
  */
21
- export declare function generateTilesetAttributeUrls(tileset: any, resource: any): string[];
22
+ export declare function generateTilesetAttributeUrls(tileset: SceneLayer3D, url: string, resource: number): string[];
22
23
  //# sourceMappingURL=url-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/url-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAEhD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAU1F;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,KAAA,EAAE,QAAQ,KAAA,YAU7D"}
1
+ {"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/url-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AAE9D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAU1F;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAUhG"}
@@ -28,13 +28,14 @@ function generateTileAttributeUrls(url, tile) {
28
28
  exports.generateTileAttributeUrls = generateTileAttributeUrls;
29
29
  /**
30
30
  * Generates attribute urls for tileset based on tileset and resource
31
- * @param {Object} tileset
32
- * @param {number} resource
31
+ * @param tileset - tileset metadata
32
+ * @param url - tileset base url
33
+ * @param resource - resource id per I3S spec
33
34
  * @returns {Array}
34
35
  */
35
- function generateTilesetAttributeUrls(tileset, resource) {
36
+ function generateTilesetAttributeUrls(tileset, url, resource) {
36
37
  const attributeUrls = [];
37
- const { attributeStorageInfo, url } = tileset;
38
+ const { attributeStorageInfo = [] } = tileset;
38
39
  for (let index = 0; index < attributeStorageInfo.length; index++) {
39
40
  const fileName = attributeStorageInfo[index].key;
40
41
  attributeUrls.push(`${url}/nodes/${resource}/attributes/${fileName}/0`);