@loaders.gl/3d-tiles 3.3.0-alpha.3 → 3.3.0-alpha.4

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 (42) hide show
  1. package/dist/dist.min.js +60 -33
  2. package/dist/es5/index.js.map +1 -1
  3. package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js +2 -0
  4. package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -1
  5. package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js +47 -18
  6. package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -1
  7. package/dist/es5/lib/parsers/parse-3d-tile-header.js +153 -69
  8. package/dist/es5/lib/parsers/parse-3d-tile-header.js.map +1 -1
  9. package/dist/es5/lib/utils/version.js +1 -1
  10. package/dist/es5/tiles-3d-loader.js +5 -26
  11. package/dist/es5/tiles-3d-loader.js.map +1 -1
  12. package/dist/esm/index.js.map +1 -1
  13. package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js +2 -0
  14. package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -1
  15. package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js +28 -7
  16. package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -1
  17. package/dist/esm/lib/parsers/parse-3d-tile-header.js +38 -20
  18. package/dist/esm/lib/parsers/parse-3d-tile-header.js.map +1 -1
  19. package/dist/esm/lib/utils/version.js +1 -1
  20. package/dist/esm/tiles-3d-loader.js +2 -9
  21. package/dist/esm/tiles-3d-loader.js.map +1 -1
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.d.ts.map +1 -1
  25. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.js +2 -13
  26. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.d.ts +2 -1
  27. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.d.ts.map +1 -1
  28. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.js +36 -7
  29. package/dist/lib/parsers/parse-3d-tile-header.d.ts +5 -4
  30. package/dist/lib/parsers/parse-3d-tile-header.d.ts.map +1 -1
  31. package/dist/lib/parsers/parse-3d-tile-header.js +37 -18
  32. package/dist/tiles-3d-loader.d.ts.map +1 -1
  33. package/dist/tiles-3d-loader.js +1 -8
  34. package/dist/types.d.ts +13 -0
  35. package/dist/types.d.ts.map +1 -1
  36. package/package.json +7 -7
  37. package/src/index.ts +1 -1
  38. package/src/lib/parsers/helpers/parse-3d-implicit-tiles.ts +2 -14
  39. package/src/lib/parsers/helpers/parse-3d-tile-subtree.ts +50 -7
  40. package/src/lib/parsers/parse-3d-tile-header.ts +59 -21
  41. package/src/tiles-3d-loader.ts +2 -16
  42. package/src/types.ts +15 -0
package/dist/dist.min.js CHANGED
@@ -11464,7 +11464,7 @@
11464
11464
  metallicFactor: 1,
11465
11465
  roughnessFactor: 1
11466
11466
  };
11467
- const textureId = material.values?.tex || material.values?.texture2d_0;
11467
+ const textureId = material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;
11468
11468
  const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);
11469
11469
  if (textureIndex !== -1) {
11470
11470
  material.pbrMetallicRoughness.baseColorTexture = { index: textureIndex };
@@ -12007,10 +12007,13 @@
12007
12007
  async function loadImage(gltf, image, index, options, context) {
12008
12008
  const { fetch: fetch2, parse: parse5 } = context;
12009
12009
  let arrayBuffer;
12010
- if (image.uri) {
12010
+ if (image.uri && !image.hasOwnProperty("bufferView")) {
12011
12011
  const uri = resolveUrl(image.uri, options);
12012
12012
  const response = await fetch2(uri);
12013
12013
  arrayBuffer = await response.arrayBuffer();
12014
+ image.bufferView = {
12015
+ data: arrayBuffer
12016
+ };
12014
12017
  }
12015
12018
  if (Number.isFinite(image.bufferView)) {
12016
12019
  const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);
@@ -12408,7 +12411,7 @@
12408
12411
  });
12409
12412
 
12410
12413
  // src/lib/parsers/helpers/parse-3d-tile-subtree.ts
12411
- async function parse3DTilesSubtree(data) {
12414
+ async function parse3DTilesSubtree(data, options, context) {
12412
12415
  const magic = new Uint32Array(data.slice(0, 4));
12413
12416
  if (magic[0] !== SUBTREE_FILE_MAGIC) {
12414
12417
  throw new Error("Wrong subtree file magic number");
@@ -12428,22 +12431,39 @@
12428
12431
  internalBinaryBuffer = data.slice(24 + jsonByteLength);
12429
12432
  }
12430
12433
  if ("bufferView" in subtree.tileAvailability) {
12431
- subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(subtree, "tileAvailability", internalBinaryBuffer);
12434
+ subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(subtree, "tileAvailability", internalBinaryBuffer, context);
12432
12435
  }
12433
12436
  if ("bufferView" in subtree.contentAvailability) {
12434
- subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(subtree, "contentAvailability", internalBinaryBuffer);
12437
+ subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(subtree, "contentAvailability", internalBinaryBuffer, context);
12435
12438
  }
12436
12439
  if ("bufferView" in subtree.childSubtreeAvailability) {
12437
- subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(subtree, "childSubtreeAvailability", internalBinaryBuffer);
12440
+ subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(subtree, "childSubtreeAvailability", internalBinaryBuffer, context);
12438
12441
  }
12439
12442
  return subtree;
12440
12443
  }
12441
- async function getExplicitBitstream(subtree, name10, internalBinaryBuffer) {
12444
+ function resolveBufferUri(bitstreamRelativeUri, basePath) {
12445
+ const hasProtocol = basePath.startsWith("http");
12446
+ if (hasProtocol) {
12447
+ const resolvedUri2 = new URL(bitstreamRelativeUri, basePath);
12448
+ return decodeURI(resolvedUri2.toString());
12449
+ }
12450
+ const basePathWithProtocol = `http://${basePath}`;
12451
+ const resolvedUri = new URL(bitstreamRelativeUri, basePathWithProtocol);
12452
+ return `/${resolvedUri.host}${resolvedUri.pathname}`;
12453
+ }
12454
+ async function getExplicitBitstream(subtree, name10, internalBinaryBuffer, context) {
12442
12455
  const bufferViewIndex = subtree[name10].bufferView;
12443
12456
  const bufferView = subtree.bufferViews[bufferViewIndex];
12444
12457
  const buffer = subtree.buffers[bufferView.buffer];
12458
+ if (!context?.url || !context.fetch) {
12459
+ throw new Error("Url is not provided");
12460
+ }
12461
+ if (!context.fetch) {
12462
+ throw new Error("fetch is not provided");
12463
+ }
12445
12464
  if (buffer.uri) {
12446
- const response = await fetchFile(buffer.uri);
12465
+ const bufferUri = resolveBufferUri(buffer.uri, context?.url);
12466
+ const response = await context.fetch(bufferUri);
12447
12467
  const data = await response.arrayBuffer();
12448
12468
  return new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength);
12449
12469
  }
@@ -12458,7 +12478,6 @@
12458
12478
  var SUBTREE_FILE_MAGIC, SUBTREE_FILE_VERSION;
12459
12479
  var init_parse_3d_tile_subtree = __esm({
12460
12480
  "src/lib/parsers/helpers/parse-3d-tile-subtree.ts"() {
12461
- init_src3();
12462
12481
  SUBTREE_FILE_MAGIC = 1952609651;
12463
12482
  SUBTREE_FILE_VERSION = 1;
12464
12483
  }
@@ -12607,6 +12626,8 @@
12607
12626
  type: getTileType2(tile),
12608
12627
  lodMetricType,
12609
12628
  lodMetricValue,
12629
+ geometricError: lodMetricValue,
12630
+ transform: tile.transform,
12610
12631
  boundingVolume
12611
12632
  };
12612
12633
  }
@@ -12722,41 +12743,48 @@
12722
12743
  tile.refine = getRefine(tile.refine);
12723
12744
  return tile;
12724
12745
  }
12725
- function normalizeTileHeaders(tileset) {
12746
+ async function normalizeTileHeaders(tileset, options) {
12726
12747
  const basePath = tileset.basePath;
12727
- const root = normalizeTileData(tileset.root, tileset);
12748
+ let root;
12749
+ const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset?.root);
12750
+ if (rootImplicitTilingExtension && tileset.root) {
12751
+ root = await normalizeImplicitTileHeaders(tileset.root, tileset, rootImplicitTilingExtension, options);
12752
+ } else {
12753
+ root = normalizeTileData(tileset.root, tileset);
12754
+ }
12728
12755
  const stack2 = [];
12729
12756
  stack2.push(root);
12730
12757
  while (stack2.length > 0) {
12731
12758
  const tile = stack2.pop() || {};
12732
12759
  const children = tile.children || [];
12733
- for (const childHeader of children) {
12734
- normalizeTileData(childHeader, { basePath });
12760
+ for (let childHeader of children) {
12761
+ const childImplicitTilingExtension = getImplicitTilingExtensionData(childHeader);
12762
+ if (childImplicitTilingExtension) {
12763
+ childHeader = await normalizeImplicitTileHeaders(childHeader, tileset, childImplicitTilingExtension, options);
12764
+ } else {
12765
+ normalizeTileData(childHeader, { basePath });
12766
+ }
12735
12767
  stack2.push(childHeader);
12736
12768
  }
12737
12769
  }
12738
12770
  return root;
12739
12771
  }
12740
- async function normalizeImplicitTileHeaders(tileset) {
12741
- if (!tileset.root) {
12742
- return null;
12743
- }
12772
+ async function normalizeImplicitTileHeaders(tile, tileset, implicitTilingExtension, options) {
12744
12773
  const basePath = tileset.basePath;
12745
- const implicitTilingExtension = tileset.root.extensions["3DTILES_implicit_tiling"];
12746
12774
  const {
12747
12775
  subdivisionScheme,
12748
12776
  maximumLevel,
12749
12777
  subtreeLevels,
12750
12778
  subtrees: { uri: subtreesUriTemplate }
12751
12779
  } = implicitTilingExtension;
12752
- const subtreeUrl = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);
12753
- const rootSubtreeUrl = resolveUri(subtreeUrl, basePath);
12754
- const rootSubtree = await load(rootSubtreeUrl, Tile3DSubtreeLoader);
12755
- const contentUrlTemplate = resolveUri(tileset.root.content.uri, basePath);
12756
- const refine = tileset.root.refine;
12757
- const rootLodMetricValue = tileset.root.geometricError;
12758
- const rootBoundingVolume = tileset.root.boundingVolume;
12759
- const options = {
12780
+ const replacedUrlTemplate = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);
12781
+ const subtreeUrl = resolveUri(replacedUrlTemplate, basePath);
12782
+ const subtree = await load(subtreeUrl, Tile3DSubtreeLoader, options);
12783
+ const contentUrlTemplate = resolveUri(tile.content.uri, basePath);
12784
+ const refine = tileset?.root?.refine;
12785
+ const rootLodMetricValue = tile.geometricError;
12786
+ const rootBoundingVolume = tile.boundingVolume;
12787
+ const implicitOptions = {
12760
12788
  contentUrlTemplate,
12761
12789
  subtreesUriTemplate,
12762
12790
  subdivisionScheme,
@@ -12770,7 +12798,7 @@
12770
12798
  getTileType,
12771
12799
  getRefine
12772
12800
  };
12773
- return await normalizeImplicitTileData(tileset.root, rootSubtree, options);
12801
+ return await normalizeImplicitTileData(tile, subtree, implicitOptions);
12774
12802
  }
12775
12803
  async function normalizeImplicitTileData(tile, rootSubtree, options) {
12776
12804
  if (!tile) {
@@ -12790,6 +12818,9 @@
12790
12818
  tile.id = tile.contentUrl;
12791
12819
  return tile;
12792
12820
  }
12821
+ function getImplicitTilingExtensionData(tile) {
12822
+ return tile?.extensions?.["3DTILES_implicit_tiling"] || tile?.implicitTiling;
12823
+ }
12793
12824
  var init_parse_3d_tile_header2 = __esm({
12794
12825
  "src/lib/parsers/parse-3d-tile-header.ts"() {
12795
12826
  init_tile_3d_subtree_loader();
@@ -12818,7 +12849,7 @@
12818
12849
  tilesetJson.loader = options.loader || Tiles3DLoader;
12819
12850
  tilesetJson.url = context.url;
12820
12851
  tilesetJson.basePath = getBaseUri(tilesetJson);
12821
- tilesetJson.root = hasImplicitTilingExtension(tilesetJson) ? await normalizeImplicitTileHeaders(tilesetJson) : normalizeTileHeaders(tilesetJson);
12852
+ tilesetJson.root = await normalizeTileHeaders(tilesetJson, options);
12822
12853
  tilesetJson.type = TILESET_TYPE.TILES3D;
12823
12854
  tilesetJson.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;
12824
12855
  tilesetJson.lodMetricValue = tilesetJson.root?.lodMetricValue || 0;
@@ -12839,10 +12870,7 @@
12839
12870
  }
12840
12871
  return data;
12841
12872
  }
12842
- function hasImplicitTilingExtension(tilesetJson) {
12843
- return tilesetJson?.extensionsRequired?.includes(IMPLICIT_TILING_EXTENSION_NAME) && tilesetJson?.extensionsUsed?.includes(IMPLICIT_TILING_EXTENSION_NAME);
12844
- }
12845
- var IMPLICIT_TILING_EXTENSION_NAME, Tiles3DLoader;
12873
+ var Tiles3DLoader;
12846
12874
  var init_tiles_3d_loader = __esm({
12847
12875
  "src/tiles-3d-loader.ts"() {
12848
12876
  init_src2();
@@ -12850,7 +12878,6 @@
12850
12878
  init_version2();
12851
12879
  init_parse_3d_tile();
12852
12880
  init_parse_3d_tile_header2();
12853
- IMPLICIT_TILING_EXTENSION_NAME = "3DTILES_implicit_tiling";
12854
12881
  Tiles3DLoader = {
12855
12882
  id: "3d-tiles",
12856
12883
  name: "3D Tiles",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AAGA;;AAGA;;AACA;;AAGA;;AACA","sourcesContent":["// LOADERS\nexport {Tiles3DLoader} from './tiles-3d-loader';\nexport {CesiumIonLoader} from './cesium-ion-loader';\nexport {Tile3DSubtreeLoader} from './tile-3d-subtree-loader';\n\n// WRITERS\nexport {Tile3DWriter} from './tile-3d-writer';\n\n// CLASSES\nexport {default as Tile3DFeatureTable} from './lib/classes/tile-3d-feature-table';\nexport {default as Tile3DBatchTable} from './lib/classes/tile-3d-batch-table';\n\n// EXPERIMENTAL\nexport {TILE3D_TYPE} from './lib/constants';\nexport {getIonTilesetMetadata as _getIonTilesetMetadata} from './lib/ion/ion';\nexport type {FeatureTableJson, B3DMContent, Node3D} from './types';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AAGA;;AAGA;;AACA;;AAGA;;AACA","sourcesContent":["// LOADERS\nexport {Tiles3DLoader} from './tiles-3d-loader';\nexport {CesiumIonLoader} from './cesium-ion-loader';\nexport {Tile3DSubtreeLoader} from './tile-3d-subtree-loader';\n\n// WRITERS\nexport {Tile3DWriter} from './tile-3d-writer';\n\n// CLASSES\nexport {default as Tile3DFeatureTable} from './lib/classes/tile-3d-feature-table';\nexport {default as Tile3DBatchTable} from './lib/classes/tile-3d-batch-table';\n\n// EXPERIMENTAL\nexport {TILE3D_TYPE} from './lib/constants';\nexport {getIonTilesetMetadata as _getIonTilesetMetadata} from './lib/ion/ion';\nexport type {FeatureTableJson, B3DMContent, Node3D, ImplicitTilingExtension} from './types';\n"],"file":"index.js"}
@@ -210,6 +210,8 @@ function formatTileData(tile, level, childCoordinates, options) {
210
210
  type: getTileType(tile),
211
211
  lodMetricType: lodMetricType,
212
212
  lodMetricValue: lodMetricValue,
213
+ geometricError: lodMetricValue,
214
+ transform: tile.transform,
213
215
  boundingVolume: boundingVolume
214
216
  };
215
217
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"names":["QUADTREE_DEVISION_COUNT","OCTREE_DEVISION_COUNT","SUBDIVISION_COUNT_MAP","QUADTREE","OCTREE","parseImplicitTiles","params","options","parentData","mortonIndex","x","y","z","childIndex","globalData","level","subtree","subdivisionScheme","subtreeLevels","maximumLevel","contentUrlTemplate","subtreesUriTemplate","basePath","tile","children","lodMetricValue","contentUrl","childrenPerTile","childX","childY","childZ","levelOffset","childTileMortonIndex","concatBits","tileAvailabilityIndex","childTileX","childTileY","childTileZ","isChildSubtreeAvailable","getAvailabilityResult","childSubtreeAvailability","lev","subtreePath","childSubtreeUrl","replaceContentUrlTemplate","Tile3DSubtreeLoader","childSubtree","isTileAvailable","tileAvailability","isContentAvailable","contentAvailability","childTileLevel","pData","index","currentTile","length","globalLevel","childCoordinates","formattedTile","formatTileData","push","availabilityData","Boolean","constant","explicitBitstream","getBooleanValueFromBitstream","refine","getRefine","lodMetricType","getTileType","rootLodMetricValue","rootBoundingVolume","uri","replace","boundingVolume","calculateBoundingVolumeForChildTile","content","id","type","region","west","south","east","north","minimumHeight","maximumHeight","boundingVolumesCount","sizeX","sizeY","sizeZ","childWest","childEast","childSouth","childNorth","childMinimumHeight","childMaximumHeight","console","warn","first","second","parseInt","toString","templateUrl","mapUrl","generateMapUrl","matched","items","key","availabilityIndex","availabilityBuffer","byteIndex","Math","floor","bitIndex","bitValue"],"mappings":";;;;;;;;;;;;;;;;AACA;;AACA;;AAEA,IAAMA,uBAAuB,GAAG,CAAhC;AACA,IAAMC,qBAAqB,GAAG,CAA9B;AAEA,IAAMC,qBAAqB,GAAG;AAC5BC,EAAAA,QAAQ,EAAEH,uBADkB;AAE5BI,EAAAA,MAAM,EAAEH;AAFoB,CAA9B;;SAkBsBI,kB;;;;;kFAAf,iBAAkCC,MAAlC;AAAA;;AAAA;AAAA;AAAA;AAAA;AASHC,YAAAA,OATG,GAwBDD,MAxBC,CASHC,OATG,uBAwBDD,MAxBC,CAUHE,UAVG,EAUHA,UAVG,mCAUU;AACXC,cAAAA,WAAW,EAAE,CADF;AAEXC,cAAAA,CAAC,EAAE,CAFQ;AAGXC,cAAAA,CAAC,EAAE,CAHQ;AAIXC,cAAAA,CAAC,EAAE;AAJQ,aAVV,4CAwBDN,MAxBC,CAgBHO,UAhBG,EAgBHA,UAhBG,mCAgBU,CAhBV,4CAwBDP,MAxBC,CAiBHQ,UAjBG,EAiBHA,UAjBG,mCAiBU;AACXC,cAAAA,KAAK,EAAE,CADI;AAEXN,cAAAA,WAAW,EAAE,CAFF;AAGXC,cAAAA,CAAC,EAAE,CAHQ;AAIXC,cAAAA,CAAC,EAAE,CAJQ;AAKXC,cAAAA,CAAC,EAAE;AALQ,aAjBV;AAyBAI,YAAAA,OAzBA,GAyBsBV,MAzBtB,CAyBAU,OAzBA,kBAyBsBV,MAzBtB,CAyBSS,KAzBT,EAyBSA,KAzBT,8BAyBiB,CAzBjB;AA2BHE,YAAAA,iBA3BG,GAiCDV,OAjCC,CA2BHU,iBA3BG,EA4BHC,aA5BG,GAiCDX,OAjCC,CA4BHW,aA5BG,EA6BHC,YA7BG,GAiCDZ,OAjCC,CA6BHY,YA7BG,EA8BHC,kBA9BG,GAiCDb,OAjCC,CA8BHa,kBA9BG,EA+BHC,mBA/BG,GAiCDd,OAjCC,CA+BHc,mBA/BG,EAgCHC,QAhCG,GAiCDf,OAjCC,CAgCHe,QAhCG;AAmCCC,YAAAA,IAnCD,GAmCQ;AAACC,cAAAA,QAAQ,EAAE,EAAX;AAAeC,cAAAA,cAAc,EAAE,CAA/B;AAAkCC,cAAAA,UAAU,EAAE;AAA9C,aAnCR;AAqCCC,YAAAA,eArCD,GAqCmBzB,qBAAqB,CAACe,iBAAD,CArCxC;AAuCCW,YAAAA,MAvCD,GAuCUf,UAAU,GAAG,CAvCvB;AAwCCgB,YAAAA,MAxCD,GAwCWhB,UAAU,IAAI,CAAf,GAAoB,CAxC9B;AAyCCiB,YAAAA,MAzCD,GAyCWjB,UAAU,IAAI,CAAf,GAAoB,CAzC9B;AA2CCkB,YAAAA,WA3CD,GA2Ce,CAAC,SAAAJ,eAAe,EAAIZ,KAAJ,CAAf,GAA2B,CAA5B,KAAkCY,eAAe,GAAG,CAApD,CA3Cf;AA4CDK,YAAAA,oBA5CC,GA4CsBC,UAAU,CAACzB,UAAU,CAACC,WAAZ,EAAyBI,UAAzB,CA5ChC;AA6CDqB,YAAAA,qBA7CC,GA6CuBH,WAAW,GAAGC,oBA7CrC;AAgDDG,YAAAA,UAhDC,GAgDYF,UAAU,CAACzB,UAAU,CAACE,CAAZ,EAAekB,MAAf,CAhDtB;AAiDDQ,YAAAA,UAjDC,GAiDYH,UAAU,CAACzB,UAAU,CAACG,CAAZ,EAAekB,MAAf,CAjDtB;AAkDDQ,YAAAA,UAlDC,GAkDYJ,UAAU,CAACzB,UAAU,CAACI,CAAZ,EAAekB,MAAf,CAlDtB;AA6DDQ,YAAAA,uBA7DC,GA6DyB,KA7DzB;;AA+DL,gBAAIvB,KAAK,GAAG,CAAR,GAAYG,aAAhB,EAA+B;AAC7BoB,cAAAA,uBAAuB,GAAGC,qBAAqB,CAC7CvB,OAAO,CAACwB,wBADqC,EAE7CR,oBAF6C,CAA/C;AAID;;AAEKtB,YAAAA,CAtED,GAsEKuB,UAAU,CAACnB,UAAU,CAACJ,CAAZ,EAAeyB,UAAf,CAtEf;AAuECxB,YAAAA,CAvED,GAuEKsB,UAAU,CAACnB,UAAU,CAACH,CAAZ,EAAeyB,UAAf,CAvEf;AAwECxB,YAAAA,CAxED,GAwEKqB,UAAU,CAACnB,UAAU,CAACF,CAAZ,EAAeyB,UAAf,CAxEf;AAyECI,YAAAA,GAzED,GAyEO1B,KAAK,GAAGD,UAAU,CAACC,KAzE1B;;AAAA,iBA2EDuB,uBA3EC;AAAA;AAAA;AAAA;;AA4EGI,YAAAA,WA5EH,aA4EoBpB,QA5EpB,cA4EgCD,mBA5EhC;AA6EGsB,YAAAA,eA7EH,GA6EqBC,yBAAyB,CAACF,WAAD,EAAcD,GAAd,EAAmB/B,CAAnB,EAAsBC,CAAtB,EAAyBC,CAAzB,CA7E9C;AAAA;AAAA,mBA8EwB,gBAAK+B,eAAL,EAAsBE,wCAAtB,CA9ExB;;AAAA;AA8EGC,YAAAA,YA9EH;AAgFH9B,YAAAA,OAAO,GAAG8B,YAAV;AAEAhC,YAAAA,UAAU,CAACL,WAAX,GAAyBuB,oBAAzB;AACAlB,YAAAA,UAAU,CAACJ,CAAX,GAAeyB,UAAf;AACArB,YAAAA,UAAU,CAACH,CAAX,GAAeyB,UAAf;AACAtB,YAAAA,UAAU,CAACF,CAAX,GAAeyB,UAAf;AACAvB,YAAAA,UAAU,CAACC,KAAX,GAAmBA,KAAnB;AAEAiB,YAAAA,oBAAoB,GAAG,CAAvB;AACAE,YAAAA,qBAAqB,GAAG,CAAxB;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAtB,YAAAA,KAAK,GAAG,CAAR;;AA7FG;AAgGCgC,YAAAA,eAhGD,GAgGmBR,qBAAqB,CAACvB,OAAO,CAACgC,gBAAT,EAA2Bd,qBAA3B,CAhGxC;;AAAA,kBAkGD,CAACa,eAAD,IAAoBhC,KAAK,GAAGI,YAlG3B;AAAA;AAAA;AAAA;;AAAA,6CAmGII,IAnGJ;;AAAA;AAsGC0B,YAAAA,kBAtGD,GAsGsBV,qBAAqB,CAC9CvB,OAAO,CAACkC,mBADsC,EAE9ChB,qBAF8C,CAtG3C;;AA2GL,gBAAIe,kBAAJ,EAAwB;AACtB1B,cAAAA,IAAI,CAACG,UAAL,GAAkBkB,yBAAyB,CAACxB,kBAAD,EAAqBqB,GAArB,EAA0B/B,CAA1B,EAA6BC,CAA7B,EAAgCC,CAAhC,CAA3C;AACD;;AAEKuC,YAAAA,cA/GD,GA+GkBpC,KAAK,GAAG,CA/G1B;AAgHCqC,YAAAA,KAhHD,GAgHS;AAAC3C,cAAAA,WAAW,EAAEuB,oBAAd;AAAoCtB,cAAAA,CAAC,EAAEyB,UAAvC;AAAmDxB,cAAAA,CAAC,EAAEyB,UAAtD;AAAkExB,cAAAA,CAAC,EAAEyB;AAArE,aAhHT;AAkHIgB,YAAAA,KAlHJ,GAkHY,CAlHZ;;AAAA;AAAA,kBAkHeA,KAAK,GAAG1B,eAlHvB;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAmHuBtB,kBAAkB,CAAC;AAC3CW,cAAAA,OAAO,EAAPA,OAD2C;AAE3CT,cAAAA,OAAO,EAAPA,OAF2C;AAG3CC,cAAAA,UAAU,EAAE4C,KAH+B;AAI3CvC,cAAAA,UAAU,EAAEwC,KAJ+B;AAK3CtC,cAAAA,KAAK,EAAEoC,cALoC;AAM3CrC,cAAAA,UAAU,EAAVA;AAN2C,aAAD,CAnHzC;;AAAA;AAmHGwC,YAAAA,WAnHH;;AA4HH,gBAAIA,WAAW,CAAC5B,UAAZ,IAA0B4B,WAAW,CAAC9B,QAAZ,CAAqB+B,MAAnD,EAA2D;AACnDC,cAAAA,WADmD,GACrCf,GAAG,GAAG,CAD+B;AAEnDgB,cAAAA,gBAFmD,GAEhC;AAACtB,gBAAAA,UAAU,EAAVA,UAAD;AAAaC,gBAAAA,UAAU,EAAVA,UAAb;AAAyBC,gBAAAA,UAAU,EAAVA;AAAzB,eAFgC;AAGnDqB,cAAAA,aAHmD,GAGnCC,cAAc,CAACL,WAAD,EAAcE,WAAd,EAA2BC,gBAA3B,EAA6ClD,OAA7C,CAHqB;AAKzDgB,cAAAA,IAAI,CAACC,QAAL,CAAcoC,IAAd,CAAmBF,aAAnB;AACD;;AAlIE;AAkHwCL,YAAAA,KAAK,EAlH7C;AAAA;AAAA;;AAAA;AAAA,6CAqIE9B,IArIF;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AAwIP,SAASgB,qBAAT,CAA+BsB,gBAA/B,EAA+DR,KAA/D,EAAuF;AACrF,MAAI,cAAcQ,gBAAlB,EAAoC;AAClC,WAAOC,OAAO,CAACD,gBAAgB,CAACE,QAAlB,CAAd;AACD;;AAED,MAAIF,gBAAgB,CAACG,iBAArB,EAAwC;AACtC,WAAOC,4BAA4B,CAACZ,KAAD,EAAQQ,gBAAgB,CAACG,iBAAzB,CAAnC;AACD;;AAED,SAAO,KAAP;AACD;;AAUD,SAASL,cAAT,CACEpC,IADF,EAEER,KAFF,EAGE0C,gBAHF,EAIElD,OAJF,EAKE;AACA,MACEe,QADF,GAQIf,OARJ,CACEe,QADF;AAAA,MAEE4C,MAFF,GAQI3D,OARJ,CAEE2D,MAFF;AAAA,MAGEC,SAHF,GAQI5D,OARJ,CAGE4D,SAHF;AAAA,MAIEC,aAJF,GAQI7D,OARJ,CAIE6D,aAJF;AAAA,MAKEC,WALF,GAQI9D,OARJ,CAKE8D,WALF;AAAA,MAMEC,kBANF,GAQI/D,OARJ,CAME+D,kBANF;AAAA,MAOEC,kBAPF,GAQIhE,OARJ,CAOEgE,kBAPF;AASA,MAAMC,GAAG,GAAGjD,IAAI,CAACG,UAAL,IAAmBH,IAAI,CAACG,UAAL,CAAgB+C,OAAhB,WAA2BnD,QAA3B,QAAwC,EAAxC,CAA/B;AACA,MAAMG,cAAc,GAAG6C,kBAAkB,YAAG,CAAH,EAAQvD,KAAR,CAAzC;AACA,MAAM2D,cAAc,GAAGC,mCAAmC,CACxD5D,KADwD,EAExDwD,kBAFwD,EAGxDd,gBAHwD,CAA1D;AAMA,SAAO;AACLjC,IAAAA,QAAQ,EAAED,IAAI,CAACC,QADV;AAELE,IAAAA,UAAU,EAAEH,IAAI,CAACG,UAFZ;AAGLkD,IAAAA,OAAO,EAAE;AAACJ,MAAAA,GAAG,EAAHA;AAAD,KAHJ;AAILK,IAAAA,EAAE,EAAEtD,IAAI,CAACG,UAJJ;AAKLwC,IAAAA,MAAM,EAAEC,SAAS,CAACD,MAAD,CALZ;AAMLY,IAAAA,IAAI,EAAET,WAAW,CAAC9C,IAAD,CANZ;AAOL6C,IAAAA,aAAa,EAAbA,aAPK;AAQL3C,IAAAA,cAAc,EAAdA,cARK;AASLiD,IAAAA,cAAc,EAAdA;AATK,GAAP;AAgBD;;AASD,SAASC,mCAAT,CACE5D,KADF,EAEEwD,kBAFF,EAGEd,gBAHF,EAIyB;AACvB,MAAIc,kBAAkB,CAACQ,MAAvB,EAA+B;AAC7B,QAAO5C,UAAP,GAA6CsB,gBAA7C,CAAOtB,UAAP;AAAA,QAAmBC,UAAnB,GAA6CqB,gBAA7C,CAAmBrB,UAAnB;AAAA,QAA+BC,UAA/B,GAA6CoB,gBAA7C,CAA+BpB,UAA/B;;AACA,6DAAiEkC,kBAAkB,CAACQ,MAApF;AAAA,QAAOC,IAAP;AAAA,QAAaC,KAAb;AAAA,QAAoBC,IAApB;AAAA,QAA0BC,KAA1B;AAAA,QAAiCC,aAAjC;AAAA,QAAgDC,aAAhD;;AACA,QAAMC,oBAAoB,YAAG,CAAH,EAAQvE,KAAR,CAA1B;AAEA,QAAMwE,KAAK,GAAG,CAACL,IAAI,GAAGF,IAAR,IAAgBM,oBAA9B;AACA,QAAME,KAAK,GAAG,CAACL,KAAK,GAAGF,KAAT,IAAkBK,oBAAhC;AACA,QAAMG,KAAK,GAAG,CAACJ,aAAa,GAAGD,aAAjB,IAAkCE,oBAAhD;AAEA,QAAOI,SAAP,GAAgCV,IAAI,GAAGO,KAAK,GAAGpD,UAA/C;AAAA,QAAkBwD,SAAlB,GAA2DX,IAAI,GAAGO,KAAK,IAAIpD,UAAU,GAAG,CAAjB,CAAvE;AACA,QAAOyD,UAAP,GAAkCX,KAAK,GAAGO,KAAK,GAAGpD,UAAlD;AAAA,QAAmByD,UAAnB,GAA8DZ,KAAK,GAAGO,KAAK,IAAIpD,UAAU,GAAG,CAAjB,CAA3E;AACA,QAAO0D,kBAAP,GACEV,aAAa,GAAGK,KAAK,GAAGpD,UAD1B;AAAA,QAA2B0D,kBAA3B,GAEEX,aAAa,GAAGK,KAAK,IAAIpD,UAAU,GAAG,CAAjB,CAFvB;AAKA,WAAO;AACL0C,MAAAA,MAAM,EAAE,CAACW,SAAD,EAAYE,UAAZ,EAAwBD,SAAxB,EAAmCE,UAAnC,EAA+CC,kBAA/C,EAAmEC,kBAAnE;AADH,KAAP;AAGD;;AAGDC,EAAAA,OAAO,CAACC,IAAR,CAAa,oCAAb,EAAmD1B,kBAAnD;AACA,SAAO,IAAP;AACD;;AAOD,SAAStC,UAAT,CAAoBiE,KAApB,EAAmCC,MAAnC,EAA2D;AACzD,SAAOC,QAAQ,CAACF,KAAK,CAACG,QAAN,CAAe,CAAf,IAAoBF,MAAM,CAACE,QAAP,CAAgB,CAAhB,CAArB,EAAyC,CAAzC,CAAf;AACD;;AAUM,SAASzD,yBAAT,CACL0D,WADK,EAELvF,KAFK,EAGLL,CAHK,EAILC,CAJK,EAKLC,CALK,EAMG;AACR,MAAM2F,MAAM,GAAGC,cAAc,CAAC;AAACzF,IAAAA,KAAK,EAALA,KAAD;AAAQL,IAAAA,CAAC,EAADA,CAAR;AAAWC,IAAAA,CAAC,EAADA,CAAX;AAAcC,IAAAA,CAAC,EAADA;AAAd,GAAD,CAA7B;AACA,SAAO0F,WAAW,CAAC7B,OAAZ,CAAoB,uBAApB,EAA6C,UAACgC,OAAD;AAAA,WAAaF,MAAM,CAACE,OAAD,CAAnB;AAAA,GAA7C,CAAP;AACD;;AAMD,SAASD,cAAT,CAAwBE,KAAxB,EAAiF;AAC/E,MAAMH,MAAM,GAAG,EAAf;;AAEA,OAAK,IAAMI,IAAX,IAAkBD,KAAlB,EAAyB;AACvBH,IAAAA,MAAM,YAAKI,IAAL,OAAN,GAAqBD,KAAK,CAACC,IAAD,CAA1B;AACD;;AACD,SAAOJ,MAAP;AACD;;AAUD,SAAStC,4BAAT,CACE2C,iBADF,EAEEC,kBAFF,EAGW;AACT,MAAMC,SAAS,GAAGC,IAAI,CAACC,KAAL,CAAWJ,iBAAiB,GAAG,CAA/B,CAAlB;AACA,MAAMK,QAAQ,GAAGL,iBAAiB,GAAG,CAArC;AACA,MAAMM,QAAQ,GAAIL,kBAAkB,CAACC,SAAD,CAAlB,IAAiCG,QAAlC,GAA8C,CAA/D;AAEA,SAAOC,QAAQ,KAAK,CAApB;AACD","sourcesContent":["import type {Availability, BoundingVolume, Subtree} from '../../../types';\nimport {Tile3DSubtreeLoader} from '../../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\n\nconst QUADTREE_DEVISION_COUNT = 4;\nconst OCTREE_DEVISION_COUNT = 8;\n\nconst SUBDIVISION_COUNT_MAP = {\n QUADTREE: QUADTREE_DEVISION_COUNT,\n OCTREE: OCTREE_DEVISION_COUNT\n};\n\n/**\n * Recursively parse implicit tiles tree\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling\n * TODO Check out do we able to use Tile3D class as return type here.\n * @param subtree\n * @param lodMetricValue\n * @param options\n * @param parentData\n * @param childIndex\n * @param level\n * @param globalData\n */\n// eslint-disable-next-line max-statements\nexport async function parseImplicitTiles(params: {\n subtree: Subtree;\n options: any;\n parentData?: {mortonIndex: number; x: number; y: number; z: number};\n childIndex?: number;\n level?: number;\n globalData?: {level: number; mortonIndex: number; x: number; y: number; z: number};\n}) {\n const {\n options,\n parentData = {\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n },\n childIndex = 0,\n globalData = {\n level: 0,\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n }\n } = params;\n let {subtree, level = 0} = params;\n const {\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n contentUrlTemplate,\n subtreesUriTemplate,\n basePath\n } = options;\n\n const tile = {children: [], lodMetricValue: 0, contentUrl: ''};\n\n const childrenPerTile = SUBDIVISION_COUNT_MAP[subdivisionScheme];\n\n const childX = childIndex & 0b01;\n const childY = (childIndex >> 1) & 0b01;\n const childZ = (childIndex >> 2) & 0b01;\n\n const levelOffset = (childrenPerTile ** level - 1) / (childrenPerTile - 1);\n let childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex);\n let tileAvailabilityIndex = levelOffset + childTileMortonIndex;\n\n // Local tile coordinates\n let childTileX = concatBits(parentData.x, childX);\n let childTileY = concatBits(parentData.y, childY);\n let childTileZ = concatBits(parentData.z, childZ);\n\n // TODO Remove after real implicit tileset will be tested.\n // Degug data\n // tile.level = level + globalData.level;\n // tile.x = concatBits(globalData.x, childTileX);\n // tile.y = concatBits(globalData.y, childTileY);\n // tile.z = concatBits(globalData.z, childTileZ);\n // tile.mortonIndex = childTileMortonIndex;\n // End of debug data\n\n let isChildSubtreeAvailable = false;\n\n if (level + 1 > subtreeLevels) {\n isChildSubtreeAvailable = getAvailabilityResult(\n subtree.childSubtreeAvailability,\n childTileMortonIndex\n );\n }\n\n const x = concatBits(globalData.x, childTileX);\n const y = concatBits(globalData.y, childTileY);\n const z = concatBits(globalData.z, childTileZ);\n const lev = level + globalData.level;\n\n if (isChildSubtreeAvailable) {\n const subtreePath = `${basePath}/${subtreesUriTemplate}`;\n const childSubtreeUrl = replaceContentUrlTemplate(subtreePath, lev, x, y, z);\n const childSubtree = await load(childSubtreeUrl, Tile3DSubtreeLoader);\n\n subtree = childSubtree;\n\n globalData.mortonIndex = childTileMortonIndex;\n globalData.x = childTileX;\n globalData.y = childTileY;\n globalData.z = childTileZ;\n globalData.level = level;\n\n childTileMortonIndex = 0;\n tileAvailabilityIndex = 0;\n childTileX = 0;\n childTileY = 0;\n childTileZ = 0;\n level = 0;\n }\n\n const isTileAvailable = getAvailabilityResult(subtree.tileAvailability, tileAvailabilityIndex);\n\n if (!isTileAvailable || level > maximumLevel) {\n return tile;\n }\n\n const isContentAvailable = getAvailabilityResult(\n subtree.contentAvailability,\n tileAvailabilityIndex\n );\n\n if (isContentAvailable) {\n tile.contentUrl = replaceContentUrlTemplate(contentUrlTemplate, lev, x, y, z);\n }\n\n const childTileLevel = level + 1;\n const pData = {mortonIndex: childTileMortonIndex, x: childTileX, y: childTileY, z: childTileZ};\n\n for (let index = 0; index < childrenPerTile; index++) {\n const currentTile = await parseImplicitTiles({\n subtree,\n options,\n parentData: pData,\n childIndex: index,\n level: childTileLevel,\n globalData\n });\n\n if (currentTile.contentUrl || currentTile.children.length) {\n const globalLevel = lev + 1;\n const childCoordinates = {childTileX, childTileY, childTileZ};\n const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);\n // @ts-ignore\n tile.children.push(formattedTile);\n }\n }\n\n return tile;\n}\n\nfunction getAvailabilityResult(availabilityData: Availability, index: number): boolean {\n if ('constant' in availabilityData) {\n return Boolean(availabilityData.constant);\n }\n\n if (availabilityData.explicitBitstream) {\n return getBooleanValueFromBitstream(index, availabilityData.explicitBitstream);\n }\n\n return false;\n}\n\n/**\n * Do formatting of implicit tile data.\n * TODO Check out do we able to use Tile3D class as type here.\n * @param tile\n * @param lodMetricValue\n * @param options\n * @returns\n */\nfunction formatTileData(\n tile,\n level: number,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number},\n options: any\n) {\n const {\n basePath,\n refine,\n getRefine,\n lodMetricType,\n getTileType,\n rootLodMetricValue,\n rootBoundingVolume\n } = options;\n const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');\n const lodMetricValue = rootLodMetricValue / 2 ** level;\n const boundingVolume = calculateBoundingVolumeForChildTile(\n level,\n rootBoundingVolume,\n childCoordinates\n );\n\n return {\n children: tile.children,\n contentUrl: tile.contentUrl,\n content: {uri},\n id: tile.contentUrl,\n refine: getRefine(refine),\n type: getTileType(tile),\n lodMetricType,\n lodMetricValue,\n boundingVolume\n // Temp debug values. Remove when real implicit tileset will be tested.\n // x: tile.x,\n // y: tile.y,\n // z: tile.z,\n // level: tile.level\n };\n}\n\n/**\n * Calculate child bounding volume.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subdivision-rules\n * @param level\n * @param rootBoundingVolume\n * @param childCoordinates\n */\nfunction calculateBoundingVolumeForChildTile(\n level: number,\n rootBoundingVolume: BoundingVolume,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}\n): BoundingVolume | null {\n if (rootBoundingVolume.region) {\n const {childTileX, childTileY, childTileZ} = childCoordinates;\n const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;\n const boundingVolumesCount = 2 ** level;\n\n const sizeX = (east - west) / boundingVolumesCount;\n const sizeY = (north - south) / boundingVolumesCount;\n const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;\n\n const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];\n const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];\n const [childMinimumHeight, childMaximumHeight] = [\n minimumHeight + sizeZ * childTileZ,\n minimumHeight + sizeZ * (childTileZ + 1)\n ];\n\n return {\n region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]\n };\n }\n\n // eslint-disable-next-line no-console\n console.warn('Unsupported bounding volume type: ', rootBoundingVolume);\n return null;\n}\n\n/**\n * Do binary concatenation\n * @param first\n * @param second\n */\nfunction concatBits(first: number, second: number): number {\n return parseInt(first.toString(2) + second.toString(2), 2);\n}\n\n/**\n * Replace implicit tile content url with real coordinates.\n * @param templateUrl\n * @param level\n * @param x\n * @param y\n * @param z\n */\nexport function replaceContentUrlTemplate(\n templateUrl: string,\n level: number,\n x: number,\n y: number,\n z: number\n): string {\n const mapUrl = generateMapUrl({level, x, y, z});\n return templateUrl.replace(/{level}|{x}|{y}|{z}/gi, (matched) => mapUrl[matched]);\n}\n\n/**\n * Get Map object for content url generation\n * @param items\n */\nfunction generateMapUrl(items: {[key: string]: number}): {[key: string]: string} {\n const mapUrl = {};\n\n for (const key in items) {\n mapUrl[`{${key}}`] = items[key];\n }\n return mapUrl;\n}\n\n/**\n * Get boolean value from bistream by index\n * A boolean value is encoded as a single bit, either 0 (false) or 1 (true).\n * Multiple boolean values are packed tightly in the same buffer.\n * These buffers of tightly-packed bits are sometimes referred to as bitstreams.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/implicit-revisions/specification/Metadata#booleans\n * @param availabilitiIndex\n */\nfunction getBooleanValueFromBitstream(\n availabilityIndex: number,\n availabilityBuffer: Uint8Array\n): boolean {\n const byteIndex = Math.floor(availabilityIndex / 8);\n const bitIndex = availabilityIndex % 8;\n const bitValue = (availabilityBuffer[byteIndex] >> bitIndex) & 1;\n\n return bitValue === 1;\n}\n"],"file":"parse-3d-implicit-tiles.js"}
1
+ {"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"names":["QUADTREE_DEVISION_COUNT","OCTREE_DEVISION_COUNT","SUBDIVISION_COUNT_MAP","QUADTREE","OCTREE","parseImplicitTiles","params","options","parentData","mortonIndex","x","y","z","childIndex","globalData","level","subtree","subdivisionScheme","subtreeLevels","maximumLevel","contentUrlTemplate","subtreesUriTemplate","basePath","tile","children","lodMetricValue","contentUrl","childrenPerTile","childX","childY","childZ","levelOffset","childTileMortonIndex","concatBits","tileAvailabilityIndex","childTileX","childTileY","childTileZ","isChildSubtreeAvailable","getAvailabilityResult","childSubtreeAvailability","lev","subtreePath","childSubtreeUrl","replaceContentUrlTemplate","Tile3DSubtreeLoader","childSubtree","isTileAvailable","tileAvailability","isContentAvailable","contentAvailability","childTileLevel","pData","index","currentTile","length","globalLevel","childCoordinates","formattedTile","formatTileData","push","availabilityData","Boolean","constant","explicitBitstream","getBooleanValueFromBitstream","refine","getRefine","lodMetricType","getTileType","rootLodMetricValue","rootBoundingVolume","uri","replace","boundingVolume","calculateBoundingVolumeForChildTile","content","id","type","geometricError","transform","region","west","south","east","north","minimumHeight","maximumHeight","boundingVolumesCount","sizeX","sizeY","sizeZ","childWest","childEast","childSouth","childNorth","childMinimumHeight","childMaximumHeight","console","warn","first","second","parseInt","toString","templateUrl","mapUrl","generateMapUrl","matched","items","key","availabilityIndex","availabilityBuffer","byteIndex","Math","floor","bitIndex","bitValue"],"mappings":";;;;;;;;;;;;;;;;AACA;;AACA;;AAEA,IAAMA,uBAAuB,GAAG,CAAhC;AACA,IAAMC,qBAAqB,GAAG,CAA9B;AAEA,IAAMC,qBAAqB,GAAG;AAC5BC,EAAAA,QAAQ,EAAEH,uBADkB;AAE5BI,EAAAA,MAAM,EAAEH;AAFoB,CAA9B;;SAkBsBI,kB;;;;;kFAAf,iBAAkCC,MAAlC;AAAA;;AAAA;AAAA;AAAA;AAAA;AASHC,YAAAA,OATG,GAwBDD,MAxBC,CASHC,OATG,uBAwBDD,MAxBC,CAUHE,UAVG,EAUHA,UAVG,mCAUU;AACXC,cAAAA,WAAW,EAAE,CADF;AAEXC,cAAAA,CAAC,EAAE,CAFQ;AAGXC,cAAAA,CAAC,EAAE,CAHQ;AAIXC,cAAAA,CAAC,EAAE;AAJQ,aAVV,4CAwBDN,MAxBC,CAgBHO,UAhBG,EAgBHA,UAhBG,mCAgBU,CAhBV,4CAwBDP,MAxBC,CAiBHQ,UAjBG,EAiBHA,UAjBG,mCAiBU;AACXC,cAAAA,KAAK,EAAE,CADI;AAEXN,cAAAA,WAAW,EAAE,CAFF;AAGXC,cAAAA,CAAC,EAAE,CAHQ;AAIXC,cAAAA,CAAC,EAAE,CAJQ;AAKXC,cAAAA,CAAC,EAAE;AALQ,aAjBV;AAyBAI,YAAAA,OAzBA,GAyBsBV,MAzBtB,CAyBAU,OAzBA,kBAyBsBV,MAzBtB,CAyBSS,KAzBT,EAyBSA,KAzBT,8BAyBiB,CAzBjB;AA2BHE,YAAAA,iBA3BG,GAiCDV,OAjCC,CA2BHU,iBA3BG,EA4BHC,aA5BG,GAiCDX,OAjCC,CA4BHW,aA5BG,EA6BHC,YA7BG,GAiCDZ,OAjCC,CA6BHY,YA7BG,EA8BHC,kBA9BG,GAiCDb,OAjCC,CA8BHa,kBA9BG,EA+BHC,mBA/BG,GAiCDd,OAjCC,CA+BHc,mBA/BG,EAgCHC,QAhCG,GAiCDf,OAjCC,CAgCHe,QAhCG;AAmCCC,YAAAA,IAnCD,GAmCQ;AAACC,cAAAA,QAAQ,EAAE,EAAX;AAAeC,cAAAA,cAAc,EAAE,CAA/B;AAAkCC,cAAAA,UAAU,EAAE;AAA9C,aAnCR;AAqCCC,YAAAA,eArCD,GAqCmBzB,qBAAqB,CAACe,iBAAD,CArCxC;AAuCCW,YAAAA,MAvCD,GAuCUf,UAAU,GAAG,CAvCvB;AAwCCgB,YAAAA,MAxCD,GAwCWhB,UAAU,IAAI,CAAf,GAAoB,CAxC9B;AAyCCiB,YAAAA,MAzCD,GAyCWjB,UAAU,IAAI,CAAf,GAAoB,CAzC9B;AA2CCkB,YAAAA,WA3CD,GA2Ce,CAAC,SAAAJ,eAAe,EAAIZ,KAAJ,CAAf,GAA2B,CAA5B,KAAkCY,eAAe,GAAG,CAApD,CA3Cf;AA4CDK,YAAAA,oBA5CC,GA4CsBC,UAAU,CAACzB,UAAU,CAACC,WAAZ,EAAyBI,UAAzB,CA5ChC;AA6CDqB,YAAAA,qBA7CC,GA6CuBH,WAAW,GAAGC,oBA7CrC;AAgDDG,YAAAA,UAhDC,GAgDYF,UAAU,CAACzB,UAAU,CAACE,CAAZ,EAAekB,MAAf,CAhDtB;AAiDDQ,YAAAA,UAjDC,GAiDYH,UAAU,CAACzB,UAAU,CAACG,CAAZ,EAAekB,MAAf,CAjDtB;AAkDDQ,YAAAA,UAlDC,GAkDYJ,UAAU,CAACzB,UAAU,CAACI,CAAZ,EAAekB,MAAf,CAlDtB;AAoDDQ,YAAAA,uBApDC,GAoDyB,KApDzB;;AAsDL,gBAAIvB,KAAK,GAAG,CAAR,GAAYG,aAAhB,EAA+B;AAC7BoB,cAAAA,uBAAuB,GAAGC,qBAAqB,CAC7CvB,OAAO,CAACwB,wBADqC,EAE7CR,oBAF6C,CAA/C;AAID;;AAEKtB,YAAAA,CA7DD,GA6DKuB,UAAU,CAACnB,UAAU,CAACJ,CAAZ,EAAeyB,UAAf,CA7Df;AA8DCxB,YAAAA,CA9DD,GA8DKsB,UAAU,CAACnB,UAAU,CAACH,CAAZ,EAAeyB,UAAf,CA9Df;AA+DCxB,YAAAA,CA/DD,GA+DKqB,UAAU,CAACnB,UAAU,CAACF,CAAZ,EAAeyB,UAAf,CA/Df;AAgECI,YAAAA,GAhED,GAgEO1B,KAAK,GAAGD,UAAU,CAACC,KAhE1B;;AAAA,iBAkEDuB,uBAlEC;AAAA;AAAA;AAAA;;AAmEGI,YAAAA,WAnEH,aAmEoBpB,QAnEpB,cAmEgCD,mBAnEhC;AAoEGsB,YAAAA,eApEH,GAoEqBC,yBAAyB,CAACF,WAAD,EAAcD,GAAd,EAAmB/B,CAAnB,EAAsBC,CAAtB,EAAyBC,CAAzB,CApE9C;AAAA;AAAA,mBAqEwB,gBAAK+B,eAAL,EAAsBE,wCAAtB,CArExB;;AAAA;AAqEGC,YAAAA,YArEH;AAuEH9B,YAAAA,OAAO,GAAG8B,YAAV;AAEAhC,YAAAA,UAAU,CAACL,WAAX,GAAyBuB,oBAAzB;AACAlB,YAAAA,UAAU,CAACJ,CAAX,GAAeyB,UAAf;AACArB,YAAAA,UAAU,CAACH,CAAX,GAAeyB,UAAf;AACAtB,YAAAA,UAAU,CAACF,CAAX,GAAeyB,UAAf;AACAvB,YAAAA,UAAU,CAACC,KAAX,GAAmBA,KAAnB;AAEAiB,YAAAA,oBAAoB,GAAG,CAAvB;AACAE,YAAAA,qBAAqB,GAAG,CAAxB;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAtB,YAAAA,KAAK,GAAG,CAAR;;AApFG;AAuFCgC,YAAAA,eAvFD,GAuFmBR,qBAAqB,CAACvB,OAAO,CAACgC,gBAAT,EAA2Bd,qBAA3B,CAvFxC;;AAAA,kBAyFD,CAACa,eAAD,IAAoBhC,KAAK,GAAGI,YAzF3B;AAAA;AAAA;AAAA;;AAAA,6CA0FII,IA1FJ;;AAAA;AA6FC0B,YAAAA,kBA7FD,GA6FsBV,qBAAqB,CAC9CvB,OAAO,CAACkC,mBADsC,EAE9ChB,qBAF8C,CA7F3C;;AAkGL,gBAAIe,kBAAJ,EAAwB;AACtB1B,cAAAA,IAAI,CAACG,UAAL,GAAkBkB,yBAAyB,CAACxB,kBAAD,EAAqBqB,GAArB,EAA0B/B,CAA1B,EAA6BC,CAA7B,EAAgCC,CAAhC,CAA3C;AACD;;AAEKuC,YAAAA,cAtGD,GAsGkBpC,KAAK,GAAG,CAtG1B;AAuGCqC,YAAAA,KAvGD,GAuGS;AAAC3C,cAAAA,WAAW,EAAEuB,oBAAd;AAAoCtB,cAAAA,CAAC,EAAEyB,UAAvC;AAAmDxB,cAAAA,CAAC,EAAEyB,UAAtD;AAAkExB,cAAAA,CAAC,EAAEyB;AAArE,aAvGT;AAyGIgB,YAAAA,KAzGJ,GAyGY,CAzGZ;;AAAA;AAAA,kBAyGeA,KAAK,GAAG1B,eAzGvB;AAAA;AAAA;AAAA;;AAAA;AAAA,mBA0GuBtB,kBAAkB,CAAC;AAC3CW,cAAAA,OAAO,EAAPA,OAD2C;AAE3CT,cAAAA,OAAO,EAAPA,OAF2C;AAG3CC,cAAAA,UAAU,EAAE4C,KAH+B;AAI3CvC,cAAAA,UAAU,EAAEwC,KAJ+B;AAK3CtC,cAAAA,KAAK,EAAEoC,cALoC;AAM3CrC,cAAAA,UAAU,EAAVA;AAN2C,aAAD,CA1GzC;;AAAA;AA0GGwC,YAAAA,WA1GH;;AAmHH,gBAAIA,WAAW,CAAC5B,UAAZ,IAA0B4B,WAAW,CAAC9B,QAAZ,CAAqB+B,MAAnD,EAA2D;AACnDC,cAAAA,WADmD,GACrCf,GAAG,GAAG,CAD+B;AAEnDgB,cAAAA,gBAFmD,GAEhC;AAACtB,gBAAAA,UAAU,EAAVA,UAAD;AAAaC,gBAAAA,UAAU,EAAVA,UAAb;AAAyBC,gBAAAA,UAAU,EAAVA;AAAzB,eAFgC;AAGnDqB,cAAAA,aAHmD,GAGnCC,cAAc,CAACL,WAAD,EAAcE,WAAd,EAA2BC,gBAA3B,EAA6ClD,OAA7C,CAHqB;AAKzDgB,cAAAA,IAAI,CAACC,QAAL,CAAcoC,IAAd,CAAmBF,aAAnB;AACD;;AAzHE;AAyGwCL,YAAAA,KAAK,EAzG7C;AAAA;AAAA;;AAAA;AAAA,6CA4HE9B,IA5HF;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AA+HP,SAASgB,qBAAT,CAA+BsB,gBAA/B,EAA+DR,KAA/D,EAAuF;AACrF,MAAI,cAAcQ,gBAAlB,EAAoC;AAClC,WAAOC,OAAO,CAACD,gBAAgB,CAACE,QAAlB,CAAd;AACD;;AAED,MAAIF,gBAAgB,CAACG,iBAArB,EAAwC;AACtC,WAAOC,4BAA4B,CAACZ,KAAD,EAAQQ,gBAAgB,CAACG,iBAAzB,CAAnC;AACD;;AAED,SAAO,KAAP;AACD;;AAUD,SAASL,cAAT,CACEpC,IADF,EAEER,KAFF,EAGE0C,gBAHF,EAIElD,OAJF,EAKE;AACA,MACEe,QADF,GAQIf,OARJ,CACEe,QADF;AAAA,MAEE4C,MAFF,GAQI3D,OARJ,CAEE2D,MAFF;AAAA,MAGEC,SAHF,GAQI5D,OARJ,CAGE4D,SAHF;AAAA,MAIEC,aAJF,GAQI7D,OARJ,CAIE6D,aAJF;AAAA,MAKEC,WALF,GAQI9D,OARJ,CAKE8D,WALF;AAAA,MAMEC,kBANF,GAQI/D,OARJ,CAME+D,kBANF;AAAA,MAOEC,kBAPF,GAQIhE,OARJ,CAOEgE,kBAPF;AASA,MAAMC,GAAG,GAAGjD,IAAI,CAACG,UAAL,IAAmBH,IAAI,CAACG,UAAL,CAAgB+C,OAAhB,WAA2BnD,QAA3B,QAAwC,EAAxC,CAA/B;AACA,MAAMG,cAAc,GAAG6C,kBAAkB,YAAG,CAAH,EAAQvD,KAAR,CAAzC;AACA,MAAM2D,cAAc,GAAGC,mCAAmC,CACxD5D,KADwD,EAExDwD,kBAFwD,EAGxDd,gBAHwD,CAA1D;AAMA,SAAO;AACLjC,IAAAA,QAAQ,EAAED,IAAI,CAACC,QADV;AAELE,IAAAA,UAAU,EAAEH,IAAI,CAACG,UAFZ;AAGLkD,IAAAA,OAAO,EAAE;AAACJ,MAAAA,GAAG,EAAHA;AAAD,KAHJ;AAILK,IAAAA,EAAE,EAAEtD,IAAI,CAACG,UAJJ;AAKLwC,IAAAA,MAAM,EAAEC,SAAS,CAACD,MAAD,CALZ;AAMLY,IAAAA,IAAI,EAAET,WAAW,CAAC9C,IAAD,CANZ;AAOL6C,IAAAA,aAAa,EAAbA,aAPK;AAQL3C,IAAAA,cAAc,EAAdA,cARK;AASLsD,IAAAA,cAAc,EAAEtD,cATX;AAULuD,IAAAA,SAAS,EAAEzD,IAAI,CAACyD,SAVX;AAWLN,IAAAA,cAAc,EAAdA;AAXK,GAAP;AAaD;;AASD,SAASC,mCAAT,CACE5D,KADF,EAEEwD,kBAFF,EAGEd,gBAHF,EAIyB;AACvB,MAAIc,kBAAkB,CAACU,MAAvB,EAA+B;AAC7B,QAAO9C,UAAP,GAA6CsB,gBAA7C,CAAOtB,UAAP;AAAA,QAAmBC,UAAnB,GAA6CqB,gBAA7C,CAAmBrB,UAAnB;AAAA,QAA+BC,UAA/B,GAA6CoB,gBAA7C,CAA+BpB,UAA/B;;AACA,6DAAiEkC,kBAAkB,CAACU,MAApF;AAAA,QAAOC,IAAP;AAAA,QAAaC,KAAb;AAAA,QAAoBC,IAApB;AAAA,QAA0BC,KAA1B;AAAA,QAAiCC,aAAjC;AAAA,QAAgDC,aAAhD;;AACA,QAAMC,oBAAoB,YAAG,CAAH,EAAQzE,KAAR,CAA1B;AAEA,QAAM0E,KAAK,GAAG,CAACL,IAAI,GAAGF,IAAR,IAAgBM,oBAA9B;AACA,QAAME,KAAK,GAAG,CAACL,KAAK,GAAGF,KAAT,IAAkBK,oBAAhC;AACA,QAAMG,KAAK,GAAG,CAACJ,aAAa,GAAGD,aAAjB,IAAkCE,oBAAhD;AAEA,QAAOI,SAAP,GAAgCV,IAAI,GAAGO,KAAK,GAAGtD,UAA/C;AAAA,QAAkB0D,SAAlB,GAA2DX,IAAI,GAAGO,KAAK,IAAItD,UAAU,GAAG,CAAjB,CAAvE;AACA,QAAO2D,UAAP,GAAkCX,KAAK,GAAGO,KAAK,GAAGtD,UAAlD;AAAA,QAAmB2D,UAAnB,GAA8DZ,KAAK,GAAGO,KAAK,IAAItD,UAAU,GAAG,CAAjB,CAA3E;AACA,QAAO4D,kBAAP,GACEV,aAAa,GAAGK,KAAK,GAAGtD,UAD1B;AAAA,QAA2B4D,kBAA3B,GAEEX,aAAa,GAAGK,KAAK,IAAItD,UAAU,GAAG,CAAjB,CAFvB;AAKA,WAAO;AACL4C,MAAAA,MAAM,EAAE,CAACW,SAAD,EAAYE,UAAZ,EAAwBD,SAAxB,EAAmCE,UAAnC,EAA+CC,kBAA/C,EAAmEC,kBAAnE;AADH,KAAP;AAGD;;AAGDC,EAAAA,OAAO,CAACC,IAAR,CAAa,oCAAb,EAAmD5B,kBAAnD;AACA,SAAO,IAAP;AACD;;AAOD,SAAStC,UAAT,CAAoBmE,KAApB,EAAmCC,MAAnC,EAA2D;AACzD,SAAOC,QAAQ,CAACF,KAAK,CAACG,QAAN,CAAe,CAAf,IAAoBF,MAAM,CAACE,QAAP,CAAgB,CAAhB,CAArB,EAAyC,CAAzC,CAAf;AACD;;AAUM,SAAS3D,yBAAT,CACL4D,WADK,EAELzF,KAFK,EAGLL,CAHK,EAILC,CAJK,EAKLC,CALK,EAMG;AACR,MAAM6F,MAAM,GAAGC,cAAc,CAAC;AAAC3F,IAAAA,KAAK,EAALA,KAAD;AAAQL,IAAAA,CAAC,EAADA,CAAR;AAAWC,IAAAA,CAAC,EAADA,CAAX;AAAcC,IAAAA,CAAC,EAADA;AAAd,GAAD,CAA7B;AACA,SAAO4F,WAAW,CAAC/B,OAAZ,CAAoB,uBAApB,EAA6C,UAACkC,OAAD;AAAA,WAAaF,MAAM,CAACE,OAAD,CAAnB;AAAA,GAA7C,CAAP;AACD;;AAMD,SAASD,cAAT,CAAwBE,KAAxB,EAAiF;AAC/E,MAAMH,MAAM,GAAG,EAAf;;AAEA,OAAK,IAAMI,IAAX,IAAkBD,KAAlB,EAAyB;AACvBH,IAAAA,MAAM,YAAKI,IAAL,OAAN,GAAqBD,KAAK,CAACC,IAAD,CAA1B;AACD;;AACD,SAAOJ,MAAP;AACD;;AAUD,SAASxC,4BAAT,CACE6C,iBADF,EAEEC,kBAFF,EAGW;AACT,MAAMC,SAAS,GAAGC,IAAI,CAACC,KAAL,CAAWJ,iBAAiB,GAAG,CAA/B,CAAlB;AACA,MAAMK,QAAQ,GAAGL,iBAAiB,GAAG,CAArC;AACA,MAAMM,QAAQ,GAAIL,kBAAkB,CAACC,SAAD,CAAlB,IAAiCG,QAAlC,GAA8C,CAA/D;AAEA,SAAOC,QAAQ,KAAK,CAApB;AACD","sourcesContent":["import type {Availability, BoundingVolume, Subtree} from '../../../types';\nimport {Tile3DSubtreeLoader} from '../../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\n\nconst QUADTREE_DEVISION_COUNT = 4;\nconst OCTREE_DEVISION_COUNT = 8;\n\nconst SUBDIVISION_COUNT_MAP = {\n QUADTREE: QUADTREE_DEVISION_COUNT,\n OCTREE: OCTREE_DEVISION_COUNT\n};\n\n/**\n * Recursively parse implicit tiles tree\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling\n * TODO Check out do we able to use Tile3D class as return type here.\n * @param subtree\n * @param lodMetricValue\n * @param options\n * @param parentData\n * @param childIndex\n * @param level\n * @param globalData\n */\n// eslint-disable-next-line max-statements\nexport async function parseImplicitTiles(params: {\n subtree: Subtree;\n options: any;\n parentData?: {mortonIndex: number; x: number; y: number; z: number};\n childIndex?: number;\n level?: number;\n globalData?: {level: number; mortonIndex: number; x: number; y: number; z: number};\n}) {\n const {\n options,\n parentData = {\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n },\n childIndex = 0,\n globalData = {\n level: 0,\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n }\n } = params;\n let {subtree, level = 0} = params;\n const {\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n contentUrlTemplate,\n subtreesUriTemplate,\n basePath\n } = options;\n\n const tile = {children: [], lodMetricValue: 0, contentUrl: ''};\n\n const childrenPerTile = SUBDIVISION_COUNT_MAP[subdivisionScheme];\n\n const childX = childIndex & 0b01;\n const childY = (childIndex >> 1) & 0b01;\n const childZ = (childIndex >> 2) & 0b01;\n\n const levelOffset = (childrenPerTile ** level - 1) / (childrenPerTile - 1);\n let childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex);\n let tileAvailabilityIndex = levelOffset + childTileMortonIndex;\n\n // Local tile coordinates\n let childTileX = concatBits(parentData.x, childX);\n let childTileY = concatBits(parentData.y, childY);\n let childTileZ = concatBits(parentData.z, childZ);\n\n let isChildSubtreeAvailable = false;\n\n if (level + 1 > subtreeLevels) {\n isChildSubtreeAvailable = getAvailabilityResult(\n subtree.childSubtreeAvailability,\n childTileMortonIndex\n );\n }\n\n const x = concatBits(globalData.x, childTileX);\n const y = concatBits(globalData.y, childTileY);\n const z = concatBits(globalData.z, childTileZ);\n const lev = level + globalData.level;\n\n if (isChildSubtreeAvailable) {\n const subtreePath = `${basePath}/${subtreesUriTemplate}`;\n const childSubtreeUrl = replaceContentUrlTemplate(subtreePath, lev, x, y, z);\n const childSubtree = await load(childSubtreeUrl, Tile3DSubtreeLoader);\n\n subtree = childSubtree;\n\n globalData.mortonIndex = childTileMortonIndex;\n globalData.x = childTileX;\n globalData.y = childTileY;\n globalData.z = childTileZ;\n globalData.level = level;\n\n childTileMortonIndex = 0;\n tileAvailabilityIndex = 0;\n childTileX = 0;\n childTileY = 0;\n childTileZ = 0;\n level = 0;\n }\n\n const isTileAvailable = getAvailabilityResult(subtree.tileAvailability, tileAvailabilityIndex);\n\n if (!isTileAvailable || level > maximumLevel) {\n return tile;\n }\n\n const isContentAvailable = getAvailabilityResult(\n subtree.contentAvailability,\n tileAvailabilityIndex\n );\n\n if (isContentAvailable) {\n tile.contentUrl = replaceContentUrlTemplate(contentUrlTemplate, lev, x, y, z);\n }\n\n const childTileLevel = level + 1;\n const pData = {mortonIndex: childTileMortonIndex, x: childTileX, y: childTileY, z: childTileZ};\n\n for (let index = 0; index < childrenPerTile; index++) {\n const currentTile = await parseImplicitTiles({\n subtree,\n options,\n parentData: pData,\n childIndex: index,\n level: childTileLevel,\n globalData\n });\n\n if (currentTile.contentUrl || currentTile.children.length) {\n const globalLevel = lev + 1;\n const childCoordinates = {childTileX, childTileY, childTileZ};\n const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);\n // @ts-ignore\n tile.children.push(formattedTile);\n }\n }\n\n return tile;\n}\n\nfunction getAvailabilityResult(availabilityData: Availability, index: number): boolean {\n if ('constant' in availabilityData) {\n return Boolean(availabilityData.constant);\n }\n\n if (availabilityData.explicitBitstream) {\n return getBooleanValueFromBitstream(index, availabilityData.explicitBitstream);\n }\n\n return false;\n}\n\n/**\n * Do formatting of implicit tile data.\n * TODO Check out do we able to use Tile3D class as type here.\n * @param tile\n * @param lodMetricValue\n * @param options\n * @returns\n */\nfunction formatTileData(\n tile,\n level: number,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number},\n options: any\n) {\n const {\n basePath,\n refine,\n getRefine,\n lodMetricType,\n getTileType,\n rootLodMetricValue,\n rootBoundingVolume\n } = options;\n const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');\n const lodMetricValue = rootLodMetricValue / 2 ** level;\n const boundingVolume = calculateBoundingVolumeForChildTile(\n level,\n rootBoundingVolume,\n childCoordinates\n );\n\n return {\n children: tile.children,\n contentUrl: tile.contentUrl,\n content: {uri},\n id: tile.contentUrl,\n refine: getRefine(refine),\n type: getTileType(tile),\n lodMetricType,\n lodMetricValue,\n geometricError: lodMetricValue,\n transform: tile.transform,\n boundingVolume\n };\n}\n\n/**\n * Calculate child bounding volume.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subdivision-rules\n * @param level\n * @param rootBoundingVolume\n * @param childCoordinates\n */\nfunction calculateBoundingVolumeForChildTile(\n level: number,\n rootBoundingVolume: BoundingVolume,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}\n): BoundingVolume | null {\n if (rootBoundingVolume.region) {\n const {childTileX, childTileY, childTileZ} = childCoordinates;\n const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;\n const boundingVolumesCount = 2 ** level;\n\n const sizeX = (east - west) / boundingVolumesCount;\n const sizeY = (north - south) / boundingVolumesCount;\n const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;\n\n const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];\n const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];\n const [childMinimumHeight, childMaximumHeight] = [\n minimumHeight + sizeZ * childTileZ,\n minimumHeight + sizeZ * (childTileZ + 1)\n ];\n\n return {\n region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]\n };\n }\n\n // eslint-disable-next-line no-console\n console.warn('Unsupported bounding volume type: ', rootBoundingVolume);\n return null;\n}\n\n/**\n * Do binary concatenation\n * @param first\n * @param second\n */\nfunction concatBits(first: number, second: number): number {\n return parseInt(first.toString(2) + second.toString(2), 2);\n}\n\n/**\n * Replace implicit tile content url with real coordinates.\n * @param templateUrl\n * @param level\n * @param x\n * @param y\n * @param z\n */\nexport function replaceContentUrlTemplate(\n templateUrl: string,\n level: number,\n x: number,\n y: number,\n z: number\n): string {\n const mapUrl = generateMapUrl({level, x, y, z});\n return templateUrl.replace(/{level}|{x}|{y}|{z}/gi, (matched) => mapUrl[matched]);\n}\n\n/**\n * Get Map object for content url generation\n * @param items\n */\nfunction generateMapUrl(items: {[key: string]: number}): {[key: string]: string} {\n const mapUrl = {};\n\n for (const key in items) {\n mapUrl[`{${key}}`] = items[key];\n }\n return mapUrl;\n}\n\n/**\n * Get boolean value from bistream by index\n * A boolean value is encoded as a single bit, either 0 (false) or 1 (true).\n * Multiple boolean values are packed tightly in the same buffer.\n * These buffers of tightly-packed bits are sometimes referred to as bitstreams.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/implicit-revisions/specification/Metadata#booleans\n * @param availabilitiIndex\n */\nfunction getBooleanValueFromBitstream(\n availabilityIndex: number,\n availabilityBuffer: Uint8Array\n): boolean {\n const byteIndex = Math.floor(availabilityIndex / 8);\n const bitIndex = availabilityIndex % 8;\n const bitValue = (availabilityBuffer[byteIndex] >> bitIndex) & 1;\n\n return bitValue === 1;\n}\n"],"file":"parse-3d-implicit-tiles.js"}
@@ -11,17 +11,15 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
11
11
 
12
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
13
 
14
- var _core = require("@loaders.gl/core");
15
-
16
14
  var SUBTREE_FILE_MAGIC = 0x74627573;
17
15
  var SUBTREE_FILE_VERSION = 1;
18
16
 
19
- function parse3DTilesSubtree(_x) {
17
+ function parse3DTilesSubtree(_x, _x2, _x3) {
20
18
  return _parse3DTilesSubtree.apply(this, arguments);
21
19
  }
22
20
 
23
21
  function _parse3DTilesSubtree() {
24
- _parse3DTilesSubtree = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(data) {
22
+ _parse3DTilesSubtree = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(data, options, context) {
25
23
  var magic, version, jsonByteLength, stringAttribute, textDecoder, string, subtree, binaryByteLength, internalBinaryBuffer;
26
24
  return _regenerator.default.wrap(function _callee$(_context) {
27
25
  while (1) {
@@ -65,7 +63,7 @@ function _parse3DTilesSubtree() {
65
63
  }
66
64
 
67
65
  _context.next = 17;
68
- return getExplicitBitstream(subtree, 'tileAvailability', internalBinaryBuffer);
66
+ return getExplicitBitstream(subtree, 'tileAvailability', internalBinaryBuffer, context);
69
67
 
70
68
  case 17:
71
69
  subtree.tileAvailability.explicitBitstream = _context.sent;
@@ -77,7 +75,7 @@ function _parse3DTilesSubtree() {
77
75
  }
78
76
 
79
77
  _context.next = 21;
80
- return getExplicitBitstream(subtree, 'contentAvailability', internalBinaryBuffer);
78
+ return getExplicitBitstream(subtree, 'contentAvailability', internalBinaryBuffer, context);
81
79
 
82
80
  case 21:
83
81
  subtree.contentAvailability.explicitBitstream = _context.sent;
@@ -89,7 +87,7 @@ function _parse3DTilesSubtree() {
89
87
  }
90
88
 
91
89
  _context.next = 25;
92
- return getExplicitBitstream(subtree, 'childSubtreeAvailability', internalBinaryBuffer);
90
+ return getExplicitBitstream(subtree, 'childSubtreeAvailability', internalBinaryBuffer, context);
93
91
 
94
92
  case 25:
95
93
  subtree.childSubtreeAvailability.explicitBitstream = _context.sent;
@@ -107,13 +105,27 @@ function _parse3DTilesSubtree() {
107
105
  return _parse3DTilesSubtree.apply(this, arguments);
108
106
  }
109
107
 
110
- function getExplicitBitstream(_x2, _x3, _x4) {
108
+ function resolveBufferUri(bitstreamRelativeUri, basePath) {
109
+ var hasProtocol = basePath.startsWith('http');
110
+
111
+ if (hasProtocol) {
112
+ var _resolvedUri = new URL(bitstreamRelativeUri, basePath);
113
+
114
+ return decodeURI(_resolvedUri.toString());
115
+ }
116
+
117
+ var basePathWithProtocol = "http://".concat(basePath);
118
+ var resolvedUri = new URL(bitstreamRelativeUri, basePathWithProtocol);
119
+ return "/".concat(resolvedUri.host).concat(resolvedUri.pathname);
120
+ }
121
+
122
+ function getExplicitBitstream(_x4, _x5, _x6, _x7) {
111
123
  return _getExplicitBitstream.apply(this, arguments);
112
124
  }
113
125
 
114
126
  function _getExplicitBitstream() {
115
- _getExplicitBitstream = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(subtree, name, internalBinaryBuffer) {
116
- var bufferViewIndex, bufferView, buffer, response, data;
127
+ _getExplicitBitstream = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(subtree, name, internalBinaryBuffer, context) {
128
+ var bufferViewIndex, bufferView, buffer, bufferUri, response, data;
117
129
  return _regenerator.default.wrap(function _callee2$(_context2) {
118
130
  while (1) {
119
131
  switch (_context2.prev = _context2.next) {
@@ -122,27 +134,44 @@ function _getExplicitBitstream() {
122
134
  bufferView = subtree.bufferViews[bufferViewIndex];
123
135
  buffer = subtree.buffers[bufferView.buffer];
124
136
 
137
+ if (!(!(context !== null && context !== void 0 && context.url) || !context.fetch)) {
138
+ _context2.next = 5;
139
+ break;
140
+ }
141
+
142
+ throw new Error('Url is not provided');
143
+
144
+ case 5:
145
+ if (context.fetch) {
146
+ _context2.next = 7;
147
+ break;
148
+ }
149
+
150
+ throw new Error('fetch is not provided');
151
+
152
+ case 7:
125
153
  if (!buffer.uri) {
126
- _context2.next = 11;
154
+ _context2.next = 16;
127
155
  break;
128
156
  }
129
157
 
130
- _context2.next = 6;
131
- return (0, _core.fetchFile)(buffer.uri);
158
+ bufferUri = resolveBufferUri(buffer.uri, context === null || context === void 0 ? void 0 : context.url);
159
+ _context2.next = 11;
160
+ return context.fetch(bufferUri);
132
161
 
133
- case 6:
162
+ case 11:
134
163
  response = _context2.sent;
135
- _context2.next = 9;
164
+ _context2.next = 14;
136
165
  return response.arrayBuffer();
137
166
 
138
- case 9:
167
+ case 14:
139
168
  data = _context2.sent;
140
169
  return _context2.abrupt("return", new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength));
141
170
 
142
- case 11:
171
+ case 16:
143
172
  return _context2.abrupt("return", new Uint8Array(internalBinaryBuffer, bufferView.byteOffset, bufferView.byteLength));
144
173
 
145
- case 12:
174
+ case 17:
146
175
  case "end":
147
176
  return _context2.stop();
148
177
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-tile-subtree.ts"],"names":["SUBTREE_FILE_MAGIC","SUBTREE_FILE_VERSION","parse3DTilesSubtree","data","magic","Uint32Array","slice","Error","version","jsonByteLength","parseUint64Value","stringAttribute","Uint8Array","textDecoder","TextDecoder","string","decode","subtree","JSON","parse","binaryByteLength","internalBinaryBuffer","ArrayBuffer","tileAvailability","getExplicitBitstream","explicitBitstream","contentAvailability","childSubtreeAvailability","name","bufferViewIndex","bufferView","bufferViews","buffer","buffers","uri","response","arrayBuffer","byteOffset","byteLength","dataView","DataView","left","getUint32","right"],"mappings":";;;;;;;;;;;;;AACA;;AAEA,IAAMA,kBAAkB,GAAG,UAA3B;AACA,IAAMC,oBAAoB,GAAG,CAA7B;;SAS8BC,mB;;;;;mFAAf,iBAAmCC,IAAnC;AAAA;AAAA;AAAA;AAAA;AAAA;AACPC,YAAAA,KADO,GACC,IAAIC,WAAJ,CAAgBF,IAAI,CAACG,KAAL,CAAW,CAAX,EAAc,CAAd,CAAhB,CADD;;AAAA,kBAGTF,KAAK,CAAC,CAAD,CAAL,KAAaJ,kBAHJ;AAAA;AAAA;AAAA;;AAAA,kBAIL,IAAIO,KAAJ,CAAU,iCAAV,CAJK;;AAAA;AAOPC,YAAAA,OAPO,GAOG,IAAIH,WAAJ,CAAgBF,IAAI,CAACG,KAAL,CAAW,CAAX,EAAc,CAAd,CAAhB,CAPH;;AAAA,kBASTE,OAAO,CAAC,CAAD,CAAP,KAAeP,oBATN;AAAA;AAAA;AAAA;;AAAA,kBAUL,IAAIM,KAAJ,CAAU,sCAAV,CAVK;;AAAA;AAaPE,YAAAA,cAbO,GAaUC,gBAAgB,CAACP,IAAI,CAACG,KAAL,CAAW,CAAX,EAAc,EAAd,CAAD,CAb1B;AAcPK,YAAAA,eAdO,GAcW,IAAIC,UAAJ,CAAeT,IAAf,EAAqB,EAArB,EAAyBM,cAAzB,CAdX;AAgBPI,YAAAA,WAhBO,GAgBO,IAAIC,WAAJ,CAAgB,MAAhB,CAhBP;AAiBPC,YAAAA,MAjBO,GAiBEF,WAAW,CAACG,MAAZ,CAAmBL,eAAnB,CAjBF;AAkBPM,YAAAA,OAlBO,GAkBGC,IAAI,CAACC,KAAL,CAAWJ,MAAX,CAlBH;AAoBPK,YAAAA,gBApBO,GAoBYV,gBAAgB,CAACP,IAAI,CAACG,KAAL,CAAW,EAAX,EAAe,EAAf,CAAD,CApB5B;AAqBTe,YAAAA,oBArBS,GAqBc,IAAIC,WAAJ,CAAgB,CAAhB,CArBd;;AAuBb,gBAAIF,gBAAJ,EAAsB;AACpBC,cAAAA,oBAAoB,GAAGlB,IAAI,CAACG,KAAL,CAAW,KAAKG,cAAhB,CAAvB;AACD;;AAzBY,kBA2BT,gBAAgBQ,OAAO,CAACM,gBA3Bf;AAAA;AAAA;AAAA;;AAAA;AAAA,mBA4BwCC,oBAAoB,CACrEP,OADqE,EAErE,kBAFqE,EAGrEI,oBAHqE,CA5B5D;;AAAA;AA4BXJ,YAAAA,OAAO,CAACM,gBAAR,CAAyBE,iBA5Bd;;AAAA;AAAA,kBAmCT,gBAAgBR,OAAO,CAACS,mBAnCf;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAoC2CF,oBAAoB,CACxEP,OADwE,EAExE,qBAFwE,EAGxEI,oBAHwE,CApC/D;;AAAA;AAoCXJ,YAAAA,OAAO,CAACS,mBAAR,CAA4BD,iBApCjB;;AAAA;AAAA,kBA2CT,gBAAgBR,OAAO,CAACU,wBA3Cf;AAAA;AAAA;AAAA;;AAAA;AAAA,mBA4CgDH,oBAAoB,CAC7EP,OAD6E,EAE7E,0BAF6E,EAG7EI,oBAH6E,CA5CpE;;AAAA;AA4CXJ,YAAAA,OAAO,CAACU,wBAAR,CAAiCF,iBA5CtB;;AAAA;AAAA,6CAmDNR,OAnDM;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;SA4DAO,oB;;;;;oFAAf,kBACEP,OADF,EAEEW,IAFF,EAGEP,oBAHF;AAAA;AAAA;AAAA;AAAA;AAAA;AAKQQ,YAAAA,eALR,GAK0BZ,OAAO,CAACW,IAAD,CAAP,CAAcE,UALxC;AAMQA,YAAAA,UANR,GAMqBb,OAAO,CAACc,WAAR,CAAoBF,eAApB,CANrB;AAOQG,YAAAA,MAPR,GAOiBf,OAAO,CAACgB,OAAR,CAAgBH,UAAU,CAACE,MAA3B,CAPjB;;AAAA,iBAUMA,MAAM,CAACE,GAVb;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAW2B,qBAAUF,MAAM,CAACE,GAAjB,CAX3B;;AAAA;AAWUC,YAAAA,QAXV;AAAA;AAAA,mBAYuBA,QAAQ,CAACC,WAAT,EAZvB;;AAAA;AAYUjC,YAAAA,IAZV;AAAA,8CAcW,IAAIS,UAAJ,CAAeT,IAAf,EAAqB2B,UAAU,CAACO,UAAhC,EAA4CP,UAAU,CAACQ,UAAvD,CAdX;;AAAA;AAAA,8CAiBS,IAAI1B,UAAJ,CAAeS,oBAAf,EAAqCS,UAAU,CAACO,UAAhD,EAA4DP,UAAU,CAACQ,UAAvE,CAjBT;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AAyBA,SAAS5B,gBAAT,CAA0BsB,MAA1B,EAAuD;AACrD,MAAMO,QAAQ,GAAG,IAAIC,QAAJ,CAAaR,MAAb,CAAjB;AACA,MAAMS,IAAI,GAAGF,QAAQ,CAACG,SAAT,CAAmB,CAAnB,EAAsB,IAAtB,CAAb;AACA,MAAMC,KAAK,GAAGJ,QAAQ,CAACG,SAAT,CAAmB,CAAnB,EAAsB,IAAtB,CAAd;AAEA,SAAOD,IAAI,GAAG,YAAK,EAAL,IAAUE,KAAxB;AACD","sourcesContent":["import type {Subtree, ExplicitBitstream} from '../../../types';\nimport {fetchFile} from '@loaders.gl/core';\n\nconst SUBTREE_FILE_MAGIC = 0x74627573;\nconst SUBTREE_FILE_VERSION = 1;\n\n/**\n * Parse subtree file\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subtree-file-format\n * @param data\n * @returns\n */\n// eslint-disable-next-line max-statements\nexport default async function parse3DTilesSubtree(data: ArrayBuffer): Promise<Subtree> {\n const magic = new Uint32Array(data.slice(0, 4));\n\n if (magic[0] !== SUBTREE_FILE_MAGIC) {\n throw new Error('Wrong subtree file magic number');\n }\n\n const version = new Uint32Array(data.slice(4, 8));\n\n if (version[0] !== SUBTREE_FILE_VERSION) {\n throw new Error('Wrong subtree file verson, must be 1');\n }\n\n const jsonByteLength = parseUint64Value(data.slice(8, 16));\n const stringAttribute = new Uint8Array(data, 24, jsonByteLength);\n\n const textDecoder = new TextDecoder('utf8');\n const string = textDecoder.decode(stringAttribute);\n const subtree = JSON.parse(string);\n\n const binaryByteLength = parseUint64Value(data.slice(16, 24));\n let internalBinaryBuffer = new ArrayBuffer(0);\n\n if (binaryByteLength) {\n internalBinaryBuffer = data.slice(24 + jsonByteLength);\n }\n\n if ('bufferView' in subtree.tileAvailability) {\n subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'tileAvailability',\n internalBinaryBuffer\n );\n }\n\n if ('bufferView' in subtree.contentAvailability) {\n subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'contentAvailability',\n internalBinaryBuffer\n );\n }\n\n if ('bufferView' in subtree.childSubtreeAvailability) {\n subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'childSubtreeAvailability',\n internalBinaryBuffer\n );\n }\n\n return subtree;\n}\n\n/**\n * Get explicit bitstream for subtree availability data.\n * @param subtree\n * @param name\n * @param internalBinaryBuffer\n */\nasync function getExplicitBitstream(\n subtree: Subtree,\n name: string,\n internalBinaryBuffer: ArrayBuffer\n): Promise<ExplicitBitstream> {\n const bufferViewIndex = subtree[name].bufferView;\n const bufferView = subtree.bufferViews[bufferViewIndex];\n const buffer = subtree.buffers[bufferView.buffer];\n\n // External bitstream loading\n if (buffer.uri) {\n const response = await fetchFile(buffer.uri);\n const data = await response.arrayBuffer();\n // Return view of bitstream.\n return new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength);\n }\n // Return view of bitstream.\n return new Uint8Array(internalBinaryBuffer, bufferView.byteOffset, bufferView.byteLength);\n}\n\n/**\n * Parse buffer to return uint64 value\n * @param buffer\n * @returns 64-bit value until precision is lost after Number.MAX_SAFE_INTEGER\n */\nfunction parseUint64Value(buffer: ArrayBuffer): number {\n const dataView = new DataView(buffer);\n const left = dataView.getUint32(0, true);\n const right = dataView.getUint32(4, true);\n // combine the two 32-bit values\n return left + 2 ** 32 * right;\n}\n"],"file":"parse-3d-tile-subtree.js"}
1
+ {"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-tile-subtree.ts"],"names":["SUBTREE_FILE_MAGIC","SUBTREE_FILE_VERSION","parse3DTilesSubtree","data","options","context","magic","Uint32Array","slice","Error","version","jsonByteLength","parseUint64Value","stringAttribute","Uint8Array","textDecoder","TextDecoder","string","decode","subtree","JSON","parse","binaryByteLength","internalBinaryBuffer","ArrayBuffer","tileAvailability","getExplicitBitstream","explicitBitstream","contentAvailability","childSubtreeAvailability","resolveBufferUri","bitstreamRelativeUri","basePath","hasProtocol","startsWith","resolvedUri","URL","decodeURI","toString","basePathWithProtocol","host","pathname","name","bufferViewIndex","bufferView","bufferViews","buffer","buffers","url","fetch","uri","bufferUri","response","arrayBuffer","byteOffset","byteLength","dataView","DataView","left","getUint32","right"],"mappings":"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","sourcesContent":["import type {Subtree, ExplicitBitstream} from '../../../types';\nimport type {LoaderContext, LoaderOptions} from '@loaders.gl/loader-utils';\n\nconst SUBTREE_FILE_MAGIC = 0x74627573;\nconst SUBTREE_FILE_VERSION = 1;\n\n/**\n * Parse subtree file\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subtree-file-format\n * @param data\n * @returns\n */\n// eslint-disable-next-line max-statements\nexport default async function parse3DTilesSubtree(\n data: ArrayBuffer,\n options: LoaderOptions | undefined,\n context: LoaderContext | undefined\n): Promise<Subtree> {\n const magic = new Uint32Array(data.slice(0, 4));\n\n if (magic[0] !== SUBTREE_FILE_MAGIC) {\n throw new Error('Wrong subtree file magic number');\n }\n\n const version = new Uint32Array(data.slice(4, 8));\n\n if (version[0] !== SUBTREE_FILE_VERSION) {\n throw new Error('Wrong subtree file verson, must be 1');\n }\n\n const jsonByteLength = parseUint64Value(data.slice(8, 16));\n const stringAttribute = new Uint8Array(data, 24, jsonByteLength);\n\n const textDecoder = new TextDecoder('utf8');\n const string = textDecoder.decode(stringAttribute);\n const subtree = JSON.parse(string);\n\n const binaryByteLength = parseUint64Value(data.slice(16, 24));\n let internalBinaryBuffer = new ArrayBuffer(0);\n\n if (binaryByteLength) {\n internalBinaryBuffer = data.slice(24 + jsonByteLength);\n }\n\n if ('bufferView' in subtree.tileAvailability) {\n subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'tileAvailability',\n internalBinaryBuffer,\n context\n );\n }\n\n if ('bufferView' in subtree.contentAvailability) {\n subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'contentAvailability',\n internalBinaryBuffer,\n context\n );\n }\n\n if ('bufferView' in subtree.childSubtreeAvailability) {\n subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'childSubtreeAvailability',\n internalBinaryBuffer,\n context\n );\n }\n\n return subtree;\n}\n\n/**\n * Get url for bitstream downloading\n * @param bitstreamRelativeUri\n * @param baseUri\n * @returns\n */\nfunction resolveBufferUri(bitstreamRelativeUri: string, basePath: string): string {\n const hasProtocol = basePath.startsWith('http');\n\n if (hasProtocol) {\n const resolvedUri = new URL(bitstreamRelativeUri, basePath);\n return decodeURI(resolvedUri.toString());\n }\n\n /**\n * Adding http protocol only for new URL constructor usage.\n * It allows to resolve relative paths like ../../example with basePath.\n */\n const basePathWithProtocol = `http://${basePath}`;\n const resolvedUri = new URL(bitstreamRelativeUri, basePathWithProtocol);\n /**\n * Drop protocol and use just relative path.\n */\n return `/${resolvedUri.host}${resolvedUri.pathname}`;\n}\n\n/**\n * Get explicit bitstream for subtree availability data.\n * @param subtree\n * @param name\n * @param internalBinaryBuffer\n */\nasync function getExplicitBitstream(\n subtree: Subtree,\n name: string,\n internalBinaryBuffer: ArrayBuffer,\n context: LoaderContext | undefined\n): Promise<ExplicitBitstream> {\n const bufferViewIndex = subtree[name].bufferView;\n const bufferView = subtree.bufferViews[bufferViewIndex];\n const buffer = subtree.buffers[bufferView.buffer];\n\n if (!context?.url || !context.fetch) {\n throw new Error('Url is not provided');\n }\n\n if (!context.fetch) {\n throw new Error('fetch is not provided');\n }\n\n // External bitstream loading\n if (buffer.uri) {\n const bufferUri = resolveBufferUri(buffer.uri, context?.url);\n const response = await context.fetch(bufferUri);\n const data = await response.arrayBuffer();\n // Return view of bitstream.\n return new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength);\n }\n // Return view of bitstream.\n return new Uint8Array(internalBinaryBuffer, bufferView.byteOffset, bufferView.byteLength);\n}\n\n/**\n * Parse buffer to return uint64 value\n * @param buffer\n * @returns 64-bit value until precision is lost after Number.MAX_SAFE_INTEGER\n */\nfunction parseUint64Value(buffer: ArrayBuffer): number {\n const dataView = new DataView(buffer);\n const left = dataView.getUint32(0, true);\n const right = dataView.getUint32(4, true);\n // combine the two 32-bit values\n return left + 2 ** 32 * right;\n}\n"],"file":"parse-3d-tile-subtree.js"}