@loaders.gl/3d-tiles 4.0.0-alpha.13 → 4.0.0-alpha.15

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.
package/dist/dist.min.js CHANGED
@@ -14601,7 +14601,7 @@
14601
14601
  }
14602
14602
  async function parseImplicitTiles(params) {
14603
14603
  const {
14604
- options,
14604
+ implicitOptions,
14605
14605
  parentData = {
14606
14606
  mortonIndex: 0,
14607
14607
  x: 0,
@@ -14616,7 +14616,8 @@
14616
14616
  y: 0,
14617
14617
  z: 0
14618
14618
  },
14619
- s2VolumeBox
14619
+ s2VolumeBox,
14620
+ loaderOptions
14620
14621
  } = params;
14621
14622
  let { subtree, level = 0 } = params;
14622
14623
  const {
@@ -14626,30 +14627,38 @@
14626
14627
  contentUrlTemplate,
14627
14628
  subtreesUriTemplate,
14628
14629
  basePath
14629
- } = options;
14630
+ } = implicitOptions;
14630
14631
  const tile = { children: [], lodMetricValue: 0, contentUrl: "" };
14632
+ if (!maximumLevel) {
14633
+ dist_default2.once(`Missing 'maximumLevel' or 'availableLevels' property. The subtree ${contentUrlTemplate} won't be loaded...`);
14634
+ return tile;
14635
+ }
14636
+ const lev = level + globalData.level;
14637
+ if (lev > maximumLevel) {
14638
+ return tile;
14639
+ }
14631
14640
  const childrenPerTile = SUBDIVISION_COUNT_MAP[subdivisionScheme];
14641
+ const bitsPerTile = Math.log2(childrenPerTile);
14632
14642
  const childX = childIndex & 1;
14633
14643
  const childY = childIndex >> 1 & 1;
14634
14644
  const childZ = childIndex >> 2 & 1;
14635
14645
  const levelOffset = (childrenPerTile ** level - 1) / (childrenPerTile - 1);
14636
- let childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex);
14646
+ let childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex, bitsPerTile);
14637
14647
  let tileAvailabilityIndex = levelOffset + childTileMortonIndex;
14638
- let childTileX = concatBits(parentData.x, childX);
14639
- let childTileY = concatBits(parentData.y, childY);
14640
- let childTileZ = concatBits(parentData.z, childZ);
14648
+ let childTileX = concatBits(parentData.x, childX, 1);
14649
+ let childTileY = concatBits(parentData.y, childY, 1);
14650
+ let childTileZ = concatBits(parentData.z, childZ, 1);
14641
14651
  let isChildSubtreeAvailable = false;
14642
- if (level + 1 > subtreeLevels) {
14652
+ if (level >= subtreeLevels) {
14643
14653
  isChildSubtreeAvailable = getAvailabilityResult(subtree.childSubtreeAvailability, childTileMortonIndex);
14644
14654
  }
14645
- const x = concatBits(globalData.x, childTileX);
14646
- const y = concatBits(globalData.y, childTileY);
14647
- const z = concatBits(globalData.z, childTileZ);
14648
- const lev = level + globalData.level;
14655
+ const x = concatBits(globalData.x, childTileX, level * bitsPerTile);
14656
+ const y = concatBits(globalData.y, childTileY, level * bitsPerTile);
14657
+ const z = concatBits(globalData.z, childTileZ, level * bitsPerTile);
14649
14658
  if (isChildSubtreeAvailable) {
14650
14659
  const subtreePath = `${basePath}/${subtreesUriTemplate}`;
14651
14660
  const childSubtreeUrl = replaceContentUrlTemplate(subtreePath, lev, x, y, z);
14652
- const childSubtree = await load(childSubtreeUrl, Tile3DSubtreeLoader);
14661
+ const childSubtree = await load(childSubtreeUrl, Tile3DSubtreeLoader, loaderOptions);
14653
14662
  subtree = childSubtree;
14654
14663
  globalData.mortonIndex = childTileMortonIndex;
14655
14664
  globalData.x = childTileX;
@@ -14664,7 +14673,7 @@
14664
14673
  level = 0;
14665
14674
  }
14666
14675
  const isTileAvailable = getAvailabilityResult(subtree.tileAvailability, tileAvailabilityIndex);
14667
- if (!isTileAvailable || level > maximumLevel) {
14676
+ if (!isTileAvailable) {
14668
14677
  return tile;
14669
14678
  }
14670
14679
  const isContentAvailable = getAvailabilityResult(subtree.contentAvailability, tileAvailabilityIndex);
@@ -14677,17 +14686,18 @@
14677
14686
  const childS2VolumeBox = getChildS2VolumeBox(s2VolumeBox, index, subdivisionScheme);
14678
14687
  const childTileParsed = await parseImplicitTiles({
14679
14688
  subtree,
14680
- options,
14689
+ implicitOptions,
14690
+ loaderOptions,
14681
14691
  parentData: pData,
14682
14692
  childIndex: index,
14683
14693
  level: childTileLevel,
14684
- globalData,
14694
+ globalData: { ...globalData },
14685
14695
  s2VolumeBox: childS2VolumeBox
14686
14696
  });
14687
14697
  if (childTileParsed.contentUrl || childTileParsed.children.length) {
14688
14698
  const globalLevel = lev + 1;
14689
14699
  const childCoordinates = { childTileX, childTileY, childTileZ };
14690
- const formattedTile = formatTileData(childTileParsed, globalLevel, childCoordinates, options, s2VolumeBox);
14700
+ const formattedTile = formatTileData(childTileParsed, globalLevel, childCoordinates, implicitOptions, s2VolumeBox);
14691
14701
  tile.children.push(formattedTile);
14692
14702
  }
14693
14703
  }
@@ -14762,8 +14772,8 @@
14762
14772
  }
14763
14773
  throw new Error(`Unsupported bounding volume type ${rootBoundingVolume}`);
14764
14774
  }
14765
- function concatBits(first, second) {
14766
- return parseInt(first.toString(2) + second.toString(2), 2);
14775
+ function concatBits(higher, lower, shift) {
14776
+ return (higher << shift) + lower;
14767
14777
  }
14768
14778
  function replaceContentUrlTemplate(templateUrl, level, x, y, z) {
14769
14779
  const mapUrl = generateMapUrl({ level, x, y, z });
@@ -14896,6 +14906,7 @@
14896
14906
  const {
14897
14907
  subdivisionScheme,
14898
14908
  maximumLevel,
14909
+ availableLevels,
14899
14910
  subtreeLevels,
14900
14911
  subtrees: { uri: subtreesUriTemplate }
14901
14912
  } = implicitTilingExtension;
@@ -14917,7 +14928,7 @@
14917
14928
  subtreesUriTemplate,
14918
14929
  subdivisionScheme,
14919
14930
  subtreeLevels,
14920
- maximumLevel,
14931
+ maximumLevel: Number.isFinite(availableLevels) ? availableLevels - 1 : maximumLevel,
14921
14932
  refine,
14922
14933
  basePath,
14923
14934
  lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,
@@ -14926,15 +14937,16 @@
14926
14937
  getTileType,
14927
14938
  getRefine
14928
14939
  };
14929
- return await normalizeImplicitTileData(tile, basePath, subtree, implicitOptions);
14940
+ return await normalizeImplicitTileData(tile, basePath, subtree, implicitOptions, options);
14930
14941
  }
14931
- async function normalizeImplicitTileData(tile, basePath, rootSubtree, options) {
14942
+ async function normalizeImplicitTileData(tile, basePath, rootSubtree, implicitOptions, loaderOptions) {
14932
14943
  if (!tile) {
14933
14944
  return null;
14934
14945
  }
14935
14946
  const { children, contentUrl } = await parseImplicitTiles({
14936
14947
  subtree: rootSubtree,
14937
- options
14948
+ implicitOptions,
14949
+ loaderOptions
14938
14950
  });
14939
14951
  let tileContentUrl;
14940
14952
  let tileContent = null;
@@ -56,11 +56,11 @@ function parseImplicitTiles(_x) {
56
56
  }
57
57
  function _parseImplicitTiles() {
58
58
  _parseImplicitTiles = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(params) {
59
- var options, _params$parentData, parentData, _params$childIndex, childIndex, _params$globalData, globalData, s2VolumeBox, subtree, _params$level, level, subdivisionScheme, subtreeLevels, maximumLevel, contentUrlTemplate, subtreesUriTemplate, basePath, tile, childrenPerTile, childX, childY, childZ, levelOffset, childTileMortonIndex, tileAvailabilityIndex, childTileX, childTileY, childTileZ, isChildSubtreeAvailable, x, y, z, lev, subtreePath, childSubtreeUrl, childSubtree, isTileAvailable, isContentAvailable, childTileLevel, pData, index, childS2VolumeBox, childTileParsed, globalLevel, childCoordinates, formattedTile;
59
+ var implicitOptions, _params$parentData, parentData, _params$childIndex, childIndex, _params$globalData, globalData, s2VolumeBox, loaderOptions, subtree, _params$level, level, subdivisionScheme, subtreeLevels, maximumLevel, contentUrlTemplate, subtreesUriTemplate, basePath, tile, lev, childrenPerTile, bitsPerTile, childX, childY, childZ, levelOffset, childTileMortonIndex, tileAvailabilityIndex, childTileX, childTileY, childTileZ, isChildSubtreeAvailable, x, y, z, subtreePath, childSubtreeUrl, childSubtree, isTileAvailable, isContentAvailable, childTileLevel, pData, index, childS2VolumeBox, childTileParsed, globalLevel, childCoordinates, formattedTile;
60
60
  return _regenerator.default.wrap(function _callee$(_context) {
61
61
  while (1) switch (_context.prev = _context.next) {
62
62
  case 0:
63
- options = params.options, _params$parentData = params.parentData, parentData = _params$parentData === void 0 ? {
63
+ implicitOptions = params.implicitOptions, _params$parentData = params.parentData, parentData = _params$parentData === void 0 ? {
64
64
  mortonIndex: 0,
65
65
  x: 0,
66
66
  y: 0,
@@ -71,41 +71,55 @@ function _parseImplicitTiles() {
71
71
  x: 0,
72
72
  y: 0,
73
73
  z: 0
74
- } : _params$globalData, s2VolumeBox = params.s2VolumeBox;
74
+ } : _params$globalData, s2VolumeBox = params.s2VolumeBox, loaderOptions = params.loaderOptions;
75
75
  subtree = params.subtree, _params$level = params.level, level = _params$level === void 0 ? 0 : _params$level;
76
- subdivisionScheme = options.subdivisionScheme, subtreeLevels = options.subtreeLevels, maximumLevel = options.maximumLevel, contentUrlTemplate = options.contentUrlTemplate, subtreesUriTemplate = options.subtreesUriTemplate, basePath = options.basePath;
76
+ subdivisionScheme = implicitOptions.subdivisionScheme, subtreeLevels = implicitOptions.subtreeLevels, maximumLevel = implicitOptions.maximumLevel, contentUrlTemplate = implicitOptions.contentUrlTemplate, subtreesUriTemplate = implicitOptions.subtreesUriTemplate, basePath = implicitOptions.basePath;
77
77
  tile = {
78
78
  children: [],
79
79
  lodMetricValue: 0,
80
80
  contentUrl: ''
81
81
  };
82
+ if (maximumLevel) {
83
+ _context.next = 7;
84
+ break;
85
+ }
86
+ _log.default.once("Missing 'maximumLevel' or 'availableLevels' property. The subtree ".concat(contentUrlTemplate, " won't be loaded..."));
87
+ return _context.abrupt("return", tile);
88
+ case 7:
89
+ lev = level + globalData.level;
90
+ if (!(lev > maximumLevel)) {
91
+ _context.next = 10;
92
+ break;
93
+ }
94
+ return _context.abrupt("return", tile);
95
+ case 10:
82
96
  childrenPerTile = SUBDIVISION_COUNT_MAP[subdivisionScheme];
97
+ bitsPerTile = Math.log2(childrenPerTile);
83
98
  childX = childIndex & 1;
84
99
  childY = childIndex >> 1 & 1;
85
100
  childZ = childIndex >> 2 & 1;
86
101
  levelOffset = (Math.pow(childrenPerTile, level) - 1) / (childrenPerTile - 1);
87
- childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex);
102
+ childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex, bitsPerTile);
88
103
  tileAvailabilityIndex = levelOffset + childTileMortonIndex;
89
- childTileX = concatBits(parentData.x, childX);
90
- childTileY = concatBits(parentData.y, childY);
91
- childTileZ = concatBits(parentData.z, childZ);
104
+ childTileX = concatBits(parentData.x, childX, 1);
105
+ childTileY = concatBits(parentData.y, childY, 1);
106
+ childTileZ = concatBits(parentData.z, childZ, 1);
92
107
  isChildSubtreeAvailable = false;
93
- if (level + 1 > subtreeLevels) {
108
+ if (level >= subtreeLevels) {
94
109
  isChildSubtreeAvailable = getAvailabilityResult(subtree.childSubtreeAvailability, childTileMortonIndex);
95
110
  }
96
- x = concatBits(globalData.x, childTileX);
97
- y = concatBits(globalData.y, childTileY);
98
- z = concatBits(globalData.z, childTileZ);
99
- lev = level + globalData.level;
111
+ x = concatBits(globalData.x, childTileX, level * bitsPerTile);
112
+ y = concatBits(globalData.y, childTileY, level * bitsPerTile);
113
+ z = concatBits(globalData.z, childTileZ, level * bitsPerTile);
100
114
  if (!isChildSubtreeAvailable) {
101
- _context.next = 38;
115
+ _context.next = 44;
102
116
  break;
103
117
  }
104
118
  subtreePath = "".concat(basePath, "/").concat(subtreesUriTemplate);
105
119
  childSubtreeUrl = replaceContentUrlTemplate(subtreePath, lev, x, y, z);
106
- _context.next = 25;
107
- return (0, _core.load)(childSubtreeUrl, _tile3dSubtreeLoader.Tile3DSubtreeLoader);
108
- case 25:
120
+ _context.next = 31;
121
+ return (0, _core.load)(childSubtreeUrl, _tile3dSubtreeLoader.Tile3DSubtreeLoader, loaderOptions);
122
+ case 31:
109
123
  childSubtree = _context.sent;
110
124
  subtree = childSubtree;
111
125
  globalData.mortonIndex = childTileMortonIndex;
@@ -119,14 +133,14 @@ function _parseImplicitTiles() {
119
133
  childTileY = 0;
120
134
  childTileZ = 0;
121
135
  level = 0;
122
- case 38:
136
+ case 44:
123
137
  isTileAvailable = getAvailabilityResult(subtree.tileAvailability, tileAvailabilityIndex);
124
- if (!(!isTileAvailable || level > maximumLevel)) {
125
- _context.next = 41;
138
+ if (isTileAvailable) {
139
+ _context.next = 47;
126
140
  break;
127
141
  }
128
142
  return _context.abrupt("return", tile);
129
- case 41:
143
+ case 47:
130
144
  isContentAvailable = getAvailabilityResult(subtree.contentAvailability, tileAvailabilityIndex);
131
145
  if (isContentAvailable) {
132
146
  tile.contentUrl = replaceContentUrlTemplate(contentUrlTemplate, lev, x, y, z);
@@ -139,23 +153,24 @@ function _parseImplicitTiles() {
139
153
  z: childTileZ
140
154
  };
141
155
  index = 0;
142
- case 46:
156
+ case 52:
143
157
  if (!(index < childrenPerTile)) {
144
- _context.next = 55;
158
+ _context.next = 61;
145
159
  break;
146
160
  }
147
161
  childS2VolumeBox = getChildS2VolumeBox(s2VolumeBox, index, subdivisionScheme);
148
- _context.next = 50;
162
+ _context.next = 56;
149
163
  return parseImplicitTiles({
150
164
  subtree: subtree,
151
- options: options,
165
+ implicitOptions: implicitOptions,
166
+ loaderOptions: loaderOptions,
152
167
  parentData: pData,
153
168
  childIndex: index,
154
169
  level: childTileLevel,
155
- globalData: globalData,
170
+ globalData: _objectSpread({}, globalData),
156
171
  s2VolumeBox: childS2VolumeBox
157
172
  });
158
- case 50:
173
+ case 56:
159
174
  childTileParsed = _context.sent;
160
175
  if (childTileParsed.contentUrl || childTileParsed.children.length) {
161
176
  globalLevel = lev + 1;
@@ -164,16 +179,16 @@ function _parseImplicitTiles() {
164
179
  childTileY: childTileY,
165
180
  childTileZ: childTileZ
166
181
  };
167
- formattedTile = formatTileData(childTileParsed, globalLevel, childCoordinates, options, s2VolumeBox);
182
+ formattedTile = formatTileData(childTileParsed, globalLevel, childCoordinates, implicitOptions, s2VolumeBox);
168
183
  tile.children.push(formattedTile);
169
184
  }
170
- case 52:
185
+ case 58:
171
186
  index++;
172
- _context.next = 46;
187
+ _context.next = 52;
173
188
  break;
174
- case 55:
189
+ case 61:
175
190
  return _context.abrupt("return", tile);
176
- case 56:
191
+ case 62:
177
192
  case "end":
178
193
  return _context.stop();
179
194
  }
@@ -260,8 +275,8 @@ function calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoo
260
275
  }
261
276
  throw new Error("Unsupported bounding volume type ".concat(rootBoundingVolume));
262
277
  }
263
- function concatBits(first, second) {
264
- return parseInt(first.toString(2) + second.toString(2), 2);
278
+ function concatBits(higher, lower, shift) {
279
+ return (higher << shift) + lower;
265
280
  }
266
281
  function replaceContentUrlTemplate(templateUrl, level, x, y, z) {
267
282
  var mapUrl = generateMapUrl({
@@ -1 +1 @@
1
- {"version":3,"file":"parse-3d-implicit-tiles.js","names":["_tile3dSubtreeLoader","require","_core","_log","_interopRequireDefault","_index","_s2CornersToObb","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","QUADTREE_DEVISION_COUNT","OCTREE_DEVISION_COUNT","SUBDIVISION_COUNT_MAP","QUADTREE","OCTREE","getChildS2VolumeBox","s2VolumeBox","index","subdivisionScheme","box","cellId","getS2CellIdFromToken","s2VolumeInfo","token","childCellId","getS2ChildCellId","childToken","getS2TokenFromCellId","s2ChildVolumeInfo","delta","maximumHeight","minimumHeight","sizeZ","midZ","convertS2BoundingVolumetoOBB","childS2VolumeBox","undefined","parseImplicitTiles","_x","_parseImplicitTiles","_asyncToGenerator2","_regenerator","mark","_callee","params","options","_params$parentData","parentData","_params$childIndex","childIndex","_params$globalData","globalData","subtree","_params$level","level","subtreeLevels","maximumLevel","contentUrlTemplate","subtreesUriTemplate","basePath","tile","childrenPerTile","childX","childY","childZ","levelOffset","childTileMortonIndex","tileAvailabilityIndex","childTileX","childTileY","childTileZ","isChildSubtreeAvailable","x","y","z","lev","subtreePath","childSubtreeUrl","childSubtree","isTileAvailable","isContentAvailable","childTileLevel","pData","childTileParsed","globalLevel","childCoordinates","formattedTile","wrap","_callee$","_context","prev","next","mortonIndex","children","lodMetricValue","contentUrl","Math","pow","concatBits","getAvailabilityResult","childSubtreeAvailability","concat","replaceContentUrlTemplate","load","Tile3DSubtreeLoader","sent","tileAvailability","abrupt","contentAvailability","formatTileData","stop","availabilityData","availabilityObject","Array","isArray","log","once","Boolean","constant","explicitBitstream","getBooleanValueFromBitstream","refine","getRefine","lodMetricType","getTileType","rootLodMetricValue","rootBoundingVolume","uri","replace","boundingVolume","boundingVolumeForChildTile","calculateBoundingVolumeForChildTile","content","id","type","geometricError","transform","region","_rootBoundingVolume$r","_slicedToArray2","west","south","east","north","boundingVolumesCount","sizeX","sizeY","childWest","childEast","childSouth","childNorth","childMinimumHeight","childMaximumHeight","Error","first","second","parseInt","toString","templateUrl","mapUrl","generateMapUrl","matched","items","availabilityIndex","availabilityBuffer","byteIndex","floor","bitIndex","bitValue"],"sources":["../../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"sourcesContent":["import type {Availability, Tile3DBoundingVolume, Subtree} from '../../../types';\nimport {Tile3DSubtreeLoader} from '../../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\nimport {default as log} from '@probe.gl/log';\n\nimport {getS2CellIdFromToken, getS2ChildCellId, getS2TokenFromCellId} from '../../utils/s2/index';\nimport type {S2VolumeInfo} from '../../utils/obb/s2-corners-to-obb';\nimport {convertS2BoundingVolumetoOBB} from '../../utils/obb/s2-corners-to-obb';\nimport Long from 'long';\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 * S2VolumeBox is an extention of BoundingVolume of type \"box\"\n */\nexport type S2VolumeBox = {\n /** BoundingVolume of type \"box\" has the \"box\" field. S2VolumeBox contains it as well. */\n box: number[];\n /** s2VolumeInfo provides additional info about the box - specifically the token, min and max height */\n s2VolumeInfo: S2VolumeInfo;\n};\n\nfunction getChildS2VolumeBox(\n s2VolumeBox: S2VolumeBox | undefined,\n index: number,\n subdivisionScheme: string\n): S2VolumeBox | undefined {\n if (s2VolumeBox?.box) {\n // Check if the BoundingVolume is of type \"box\"\n const cellId: Long = getS2CellIdFromToken(s2VolumeBox.s2VolumeInfo.token);\n const childCellId = getS2ChildCellId(cellId, index);\n const childToken = getS2TokenFromCellId(childCellId);\n\n // Clone object. Note, s2VolumeInfo is a plain object that doesn't contain any nested object.\n // So, we can use the Spread Operator to make a shallow copy of the object.\n const s2ChildVolumeInfo: S2VolumeInfo = {...s2VolumeBox.s2VolumeInfo};\n s2ChildVolumeInfo.token = childToken; // replace the token with the child's one\n\n // In case of QUADTREE the sizeZ should NOT be changed!\n // https://portal.ogc.org/files/102132\n // A quadtree divides space only on the x and y dimensions.\n // It divides each tile into 4 smaller tiles where the x and y dimensions are halved.\n // The quadtree z minimum and maximum remain unchanged.\n switch (subdivisionScheme) {\n case 'OCTREE':\n const s2VolumeInfo: S2VolumeInfo = s2VolumeBox.s2VolumeInfo;\n const delta = s2VolumeInfo.maximumHeight - s2VolumeInfo.minimumHeight;\n const sizeZ: number = delta / 2.0; // It's a next level (a child)\n const midZ: number = s2VolumeInfo.minimumHeight + delta / 2.0;\n s2VolumeInfo.minimumHeight = midZ - sizeZ;\n s2VolumeInfo.maximumHeight = midZ + sizeZ;\n break;\n default:\n break;\n }\n const box = convertS2BoundingVolumetoOBB(s2ChildVolumeInfo);\n const childS2VolumeBox: S2VolumeBox = {\n box,\n s2VolumeInfo: s2ChildVolumeInfo\n };\n return childS2VolumeBox;\n }\n return undefined;\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 s2VolumeBox?: S2VolumeBox;\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 s2VolumeBox\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 // childIndex is in range [0, 7]\n const childX = childIndex & 0b01; // Get first bit for X\n const childY = (childIndex >> 1) & 0b01; // Get second bit for Y\n const childZ = (childIndex >> 2) & 0b01; // Get third bit for Z\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 childS2VolumeBox: S2VolumeBox | undefined = getChildS2VolumeBox(\n s2VolumeBox,\n index,\n subdivisionScheme\n );\n\n // Recursive calling...\n const childTileParsed = await parseImplicitTiles({\n subtree,\n options,\n parentData: pData,\n childIndex: index,\n level: childTileLevel,\n globalData,\n s2VolumeBox: childS2VolumeBox\n });\n\n if (childTileParsed.contentUrl || childTileParsed.children.length) {\n const globalLevel = lev + 1;\n const childCoordinates = {childTileX, childTileY, childTileZ};\n const formattedTile = formatTileData(\n childTileParsed,\n globalLevel,\n childCoordinates,\n options,\n s2VolumeBox\n );\n // @ts-ignore\n tile.children.push(formattedTile);\n }\n }\n\n return tile;\n}\n\n/**\n * Check tile availability in the bitstream array\n * @param availabilityData - tileAvailability / contentAvailability / childSubtreeAvailability object\n * @param index - index in the bitstream array\n * @returns\n */\nfunction getAvailabilityResult(\n availabilityData: Availability | Availability[],\n index: number\n): boolean {\n let availabilityObject: Availability;\n if (Array.isArray(availabilityData)) {\n /** TODO: we don't support `3DTILES_multiple_contents` extension at the moment.\n * https://github.com/CesiumGS/3d-tiles/blob/main/extensions/3DTILES_implicit_tiling/README.md#multiple-contents\n * Take first item in the array\n */\n availabilityObject = availabilityData[0];\n if (availabilityData.length > 1) {\n // eslint-disable-next-line no-console\n log.once('Not supported extension \"3DTILES_multiple_contents\" has been detected');\n }\n } else {\n availabilityObject = availabilityData;\n }\n\n if ('constant' in availabilityObject) {\n return Boolean(availabilityObject.constant);\n }\n\n if (availabilityObject.explicitBitstream) {\n return getBooleanValueFromBitstream(index, availabilityObject.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 s2VolumeBox?: S2VolumeBox\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\n const boundingVolume: Tile3DBoundingVolume = s2VolumeBox?.box\n ? {box: s2VolumeBox.box}\n : rootBoundingVolume;\n\n const boundingVolumeForChildTile = calculateBoundingVolumeForChildTile(\n level,\n boundingVolume,\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: boundingVolumeForChildTile\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: Tile3DBoundingVolume,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}\n): Tile3DBoundingVolume {\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\n // TODO : Why is the subdivisionScheme not being checked here?\n\n // In case of QUADTREE the sizeZ should NOT be changed!\n // https://portal.ogc.org/files/102132\n // A quadtree divides space only on the x and y dimensions. It divides each tile into 4 smaller tiles where the x and y dimensions are halved. The quadtree z minimum and maximum remain unchanged.\n\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 if (rootBoundingVolume.box) {\n return rootBoundingVolume;\n }\n\n throw new Error(`Unsupported bounding volume type ${rootBoundingVolume}`);\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"],"mappings":"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"}
1
+ {"version":3,"file":"parse-3d-implicit-tiles.js","names":["_tile3dSubtreeLoader","require","_core","_log","_interopRequireDefault","_index","_s2CornersToObb","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","QUADTREE_DEVISION_COUNT","OCTREE_DEVISION_COUNT","SUBDIVISION_COUNT_MAP","QUADTREE","OCTREE","getChildS2VolumeBox","s2VolumeBox","index","subdivisionScheme","box","cellId","getS2CellIdFromToken","s2VolumeInfo","token","childCellId","getS2ChildCellId","childToken","getS2TokenFromCellId","s2ChildVolumeInfo","delta","maximumHeight","minimumHeight","sizeZ","midZ","convertS2BoundingVolumetoOBB","childS2VolumeBox","undefined","parseImplicitTiles","_x","_parseImplicitTiles","_asyncToGenerator2","_regenerator","mark","_callee","params","implicitOptions","_params$parentData","parentData","_params$childIndex","childIndex","_params$globalData","globalData","loaderOptions","subtree","_params$level","level","subtreeLevels","maximumLevel","contentUrlTemplate","subtreesUriTemplate","basePath","tile","lev","childrenPerTile","bitsPerTile","childX","childY","childZ","levelOffset","childTileMortonIndex","tileAvailabilityIndex","childTileX","childTileY","childTileZ","isChildSubtreeAvailable","x","y","z","subtreePath","childSubtreeUrl","childSubtree","isTileAvailable","isContentAvailable","childTileLevel","pData","childTileParsed","globalLevel","childCoordinates","formattedTile","wrap","_callee$","_context","prev","next","mortonIndex","children","lodMetricValue","contentUrl","log","once","concat","abrupt","Math","log2","pow","concatBits","getAvailabilityResult","childSubtreeAvailability","replaceContentUrlTemplate","load","Tile3DSubtreeLoader","sent","tileAvailability","contentAvailability","formatTileData","stop","availabilityData","availabilityObject","Array","isArray","Boolean","constant","explicitBitstream","getBooleanValueFromBitstream","options","refine","getRefine","lodMetricType","getTileType","rootLodMetricValue","rootBoundingVolume","uri","replace","boundingVolume","boundingVolumeForChildTile","calculateBoundingVolumeForChildTile","content","id","type","geometricError","transform","region","_rootBoundingVolume$r","_slicedToArray2","west","south","east","north","boundingVolumesCount","sizeX","sizeY","childWest","childEast","childSouth","childNorth","childMinimumHeight","childMaximumHeight","Error","higher","lower","shift","templateUrl","mapUrl","generateMapUrl","matched","items","availabilityIndex","availabilityBuffer","byteIndex","floor","bitIndex","bitValue"],"sources":["../../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"sourcesContent":["import type {Availability, Tile3DBoundingVolume, Subtree} from '../../../types';\nimport {Tile3DSubtreeLoader} from '../../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\nimport {default as log} from '@probe.gl/log';\n\nimport {getS2CellIdFromToken, getS2ChildCellId, getS2TokenFromCellId} from '../../utils/s2/index';\nimport type {S2VolumeInfo} from '../../utils/obb/s2-corners-to-obb';\nimport {convertS2BoundingVolumetoOBB} from '../../utils/obb/s2-corners-to-obb';\nimport Long from 'long';\nimport {Tiles3DLoaderOptions} from '../../../tiles-3d-loader';\nimport {ImplicitOptions} from '../parse-3d-tile-header';\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 * S2VolumeBox is an extention of BoundingVolume of type \"box\"\n */\nexport type S2VolumeBox = {\n /** BoundingVolume of type \"box\" has the \"box\" field. S2VolumeBox contains it as well. */\n box: number[];\n /** s2VolumeInfo provides additional info about the box - specifically the token, min and max height */\n s2VolumeInfo: S2VolumeInfo;\n};\n\nfunction getChildS2VolumeBox(\n s2VolumeBox: S2VolumeBox | undefined,\n index: number,\n subdivisionScheme: string\n): S2VolumeBox | undefined {\n if (s2VolumeBox?.box) {\n // Check if the BoundingVolume is of type \"box\"\n const cellId: Long = getS2CellIdFromToken(s2VolumeBox.s2VolumeInfo.token);\n const childCellId = getS2ChildCellId(cellId, index);\n const childToken = getS2TokenFromCellId(childCellId);\n\n // Clone object. Note, s2VolumeInfo is a plain object that doesn't contain any nested object.\n // So, we can use the Spread Operator to make a shallow copy of the object.\n const s2ChildVolumeInfo: S2VolumeInfo = {...s2VolumeBox.s2VolumeInfo};\n s2ChildVolumeInfo.token = childToken; // replace the token with the child's one\n\n // In case of QUADTREE the sizeZ should NOT be changed!\n // https://portal.ogc.org/files/102132\n // A quadtree divides space only on the x and y dimensions.\n // It divides each tile into 4 smaller tiles where the x and y dimensions are halved.\n // The quadtree z minimum and maximum remain unchanged.\n switch (subdivisionScheme) {\n case 'OCTREE':\n const s2VolumeInfo: S2VolumeInfo = s2VolumeBox.s2VolumeInfo;\n const delta = s2VolumeInfo.maximumHeight - s2VolumeInfo.minimumHeight;\n const sizeZ: number = delta / 2.0; // It's a next level (a child)\n const midZ: number = s2VolumeInfo.minimumHeight + delta / 2.0;\n s2VolumeInfo.minimumHeight = midZ - sizeZ;\n s2VolumeInfo.maximumHeight = midZ + sizeZ;\n break;\n default:\n break;\n }\n const box = convertS2BoundingVolumetoOBB(s2ChildVolumeInfo);\n const childS2VolumeBox: S2VolumeBox = {\n box,\n s2VolumeInfo: s2ChildVolumeInfo\n };\n return childS2VolumeBox;\n }\n return undefined;\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 implicitOptions: ImplicitOptions;\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 s2VolumeBox?: S2VolumeBox;\n loaderOptions: Tiles3DLoaderOptions;\n}) {\n const {\n implicitOptions,\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 s2VolumeBox,\n loaderOptions\n } = params;\n let {subtree, level = 0} = params;\n const {\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n contentUrlTemplate,\n subtreesUriTemplate,\n basePath\n } = implicitOptions;\n const tile = {children: [], lodMetricValue: 0, contentUrl: ''};\n\n if (!maximumLevel) {\n // eslint-disable-next-line no-console\n log.once(\n `Missing 'maximumLevel' or 'availableLevels' property. The subtree ${contentUrlTemplate} won't be loaded...`\n );\n return tile;\n }\n\n const lev = level + globalData.level;\n if (lev > maximumLevel) {\n return tile;\n }\n\n const childrenPerTile = SUBDIVISION_COUNT_MAP[subdivisionScheme];\n const bitsPerTile = Math.log2(childrenPerTile);\n\n // childIndex is in range [0,4] for quadtrees and [0, 7] for octrees\n const childX = childIndex & 0b01; // Get first bit for X\n const childY = (childIndex >> 1) & 0b01; // Get second bit for Y\n const childZ = (childIndex >> 2) & 0b01; // Get third bit for Z\n\n const levelOffset = (childrenPerTile ** level - 1) / (childrenPerTile - 1);\n let childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex, bitsPerTile);\n let tileAvailabilityIndex = levelOffset + childTileMortonIndex;\n\n // Local tile coordinates\n let childTileX = concatBits(parentData.x, childX, 1);\n let childTileY = concatBits(parentData.y, childY, 1);\n let childTileZ = concatBits(parentData.z, childZ, 1);\n\n let isChildSubtreeAvailable = false;\n\n if (level >= subtreeLevels) {\n isChildSubtreeAvailable = getAvailabilityResult(\n subtree.childSubtreeAvailability,\n childTileMortonIndex\n );\n }\n\n const x = concatBits(globalData.x, childTileX, level * bitsPerTile);\n const y = concatBits(globalData.y, childTileY, level * bitsPerTile);\n const z = concatBits(globalData.z, childTileZ, level * bitsPerTile);\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, loaderOptions);\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) {\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 childS2VolumeBox: S2VolumeBox | undefined = getChildS2VolumeBox(\n s2VolumeBox,\n index,\n subdivisionScheme\n );\n\n // Recursive calling...\n const childTileParsed = await parseImplicitTiles({\n subtree,\n implicitOptions,\n loaderOptions,\n parentData: pData,\n childIndex: index,\n level: childTileLevel,\n globalData: {...globalData},\n s2VolumeBox: childS2VolumeBox\n });\n\n if (childTileParsed.contentUrl || childTileParsed.children.length) {\n const globalLevel = lev + 1;\n const childCoordinates = {childTileX, childTileY, childTileZ};\n const formattedTile = formatTileData(\n childTileParsed,\n globalLevel,\n childCoordinates,\n implicitOptions,\n s2VolumeBox\n );\n // @ts-ignore\n tile.children.push(formattedTile);\n }\n }\n\n return tile;\n}\n\n/**\n * Check tile availability in the bitstream array\n * @param availabilityData - tileAvailability / contentAvailability / childSubtreeAvailability object\n * @param index - index in the bitstream array\n * @returns\n */\nfunction getAvailabilityResult(\n availabilityData: Availability | Availability[],\n index: number\n): boolean {\n let availabilityObject: Availability;\n if (Array.isArray(availabilityData)) {\n /** TODO: we don't support `3DTILES_multiple_contents` extension at the moment.\n * https://github.com/CesiumGS/3d-tiles/blob/main/extensions/3DTILES_implicit_tiling/README.md#multiple-contents\n * Take first item in the array\n */\n availabilityObject = availabilityData[0];\n if (availabilityData.length > 1) {\n // eslint-disable-next-line no-console\n log.once('Not supported extension \"3DTILES_multiple_contents\" has been detected');\n }\n } else {\n availabilityObject = availabilityData;\n }\n\n if ('constant' in availabilityObject) {\n return Boolean(availabilityObject.constant);\n }\n\n if (availabilityObject.explicitBitstream) {\n return getBooleanValueFromBitstream(index, availabilityObject.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: ImplicitOptions,\n s2VolumeBox?: S2VolumeBox\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\n const boundingVolume: Tile3DBoundingVolume = s2VolumeBox?.box\n ? {box: s2VolumeBox.box}\n : rootBoundingVolume;\n\n const boundingVolumeForChildTile = calculateBoundingVolumeForChildTile(\n level,\n boundingVolume,\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: boundingVolumeForChildTile\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: Tile3DBoundingVolume,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}\n): Tile3DBoundingVolume {\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\n // TODO : Why is the subdivisionScheme not being checked here?\n\n // In case of QUADTREE the sizeZ should NOT be changed!\n // https://portal.ogc.org/files/102132\n // A quadtree divides space only on the x and y dimensions. It divides each tile into 4 smaller tiles where the x and y dimensions are halved. The quadtree z minimum and maximum remain unchanged.\n\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 if (rootBoundingVolume.box) {\n return rootBoundingVolume;\n }\n\n throw new Error(`Unsupported bounding volume type ${rootBoundingVolume}`);\n}\n\n/**\n * Do binary concatenation\n * @param higher - number to put to higher part of result\n * @param lower - number to put to lower part of result\n * @param shift - number of bits to shift lower number\n */\nfunction concatBits(higher: number, lower: number, shift: number): number {\n return (higher << shift) + lower;\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"],"mappings":"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"}
@@ -90,7 +90,7 @@ function normalizeTileHeaders(_x, _x2, _x3) {
90
90
  }
91
91
  function _normalizeTileHeaders() {
92
92
  _normalizeTileHeaders = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(tileset, basePath, options) {
93
- var root, rootImplicitTilingExtension, stack, tile, children, childrenPostprocessed, _iterator, _step, childHeader, childImplicitTilingExtension, childHeaderPostprocessed;
93
+ var root, rootImplicitTilingExtension, stack, _tile, children, childrenPostprocessed, _iterator, _step, childHeader, childImplicitTilingExtension, childHeaderPostprocessed;
94
94
  return _regenerator.default.wrap(function _callee$(_context) {
95
95
  while (1) switch (_context.prev = _context.next) {
96
96
  case 0:
@@ -116,8 +116,8 @@ function _normalizeTileHeaders() {
116
116
  _context.next = 43;
117
117
  break;
118
118
  }
119
- tile = stack.pop() || {};
120
- children = tile.children || [];
119
+ _tile = stack.pop() || {};
120
+ children = _tile.children || [];
121
121
  childrenPostprocessed = [];
122
122
  _iterator = _createForOfIteratorHelper(children);
123
123
  _context.prev = 16;
@@ -162,7 +162,7 @@ function _normalizeTileHeaders() {
162
162
  _iterator.f();
163
163
  return _context.finish(37);
164
164
  case 40:
165
- tile.children = childrenPostprocessed;
165
+ _tile.children = childrenPostprocessed;
166
166
  _context.next = 11;
167
167
  break;
168
168
  case 43:
@@ -181,11 +181,11 @@ function normalizeImplicitTileHeaders(_x4, _x5, _x6, _x7, _x8) {
181
181
  function _normalizeImplicitTileHeaders() {
182
182
  _normalizeImplicitTileHeaders = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(tile, tileset, basePath, implicitTilingExtension, options) {
183
183
  var _tile$content2, _tileset$root, _tile$boundingVolume$;
184
- var subdivisionScheme, maximumLevel, subtreeLevels, subtreesUriTemplate, replacedUrlTemplate, subtreeUrl, subtree, contentUrlTemplate, refine, rootLodMetricValue, s2VolumeInfo, box, s2VolumeBox, rootBoundingVolume, implicitOptions;
184
+ var subdivisionScheme, maximumLevel, availableLevels, subtreeLevels, subtreesUriTemplate, replacedUrlTemplate, subtreeUrl, subtree, contentUrlTemplate, refine, rootLodMetricValue, s2VolumeInfo, box, s2VolumeBox, rootBoundingVolume, implicitOptions;
185
185
  return _regenerator.default.wrap(function _callee2$(_context2) {
186
186
  while (1) switch (_context2.prev = _context2.next) {
187
187
  case 0:
188
- subdivisionScheme = implicitTilingExtension.subdivisionScheme, maximumLevel = implicitTilingExtension.maximumLevel, subtreeLevels = implicitTilingExtension.subtreeLevels, subtreesUriTemplate = implicitTilingExtension.subtrees.uri;
188
+ subdivisionScheme = implicitTilingExtension.subdivisionScheme, maximumLevel = implicitTilingExtension.maximumLevel, availableLevels = implicitTilingExtension.availableLevels, subtreeLevels = implicitTilingExtension.subtreeLevels, subtreesUriTemplate = implicitTilingExtension.subtrees.uri;
189
189
  replacedUrlTemplate = (0, _parse3dImplicitTiles.replaceContentUrlTemplate)(subtreesUriTemplate, 0, 0, 0, 0);
190
190
  subtreeUrl = resolveUri(replacedUrlTemplate, basePath);
191
191
  _context2.next = 5;
@@ -210,7 +210,7 @@ function _normalizeImplicitTileHeaders() {
210
210
  subtreesUriTemplate: subtreesUriTemplate,
211
211
  subdivisionScheme: subdivisionScheme,
212
212
  subtreeLevels: subtreeLevels,
213
- maximumLevel: maximumLevel,
213
+ maximumLevel: Number.isFinite(availableLevels) ? availableLevels - 1 : maximumLevel,
214
214
  refine: refine,
215
215
  basePath: basePath,
216
216
  lodMetricType: _tiles.LOD_METRIC_TYPE.GEOMETRIC_ERROR,
@@ -220,7 +220,7 @@ function _normalizeImplicitTileHeaders() {
220
220
  getRefine: getRefine
221
221
  };
222
222
  _context2.next = 15;
223
- return normalizeImplicitTileData(tile, basePath, subtree, implicitOptions);
223
+ return normalizeImplicitTileData(tile, basePath, subtree, implicitOptions, options);
224
224
  case 15:
225
225
  return _context2.abrupt("return", _context2.sent);
226
226
  case 16:
@@ -231,11 +231,11 @@ function _normalizeImplicitTileHeaders() {
231
231
  }));
232
232
  return _normalizeImplicitTileHeaders.apply(this, arguments);
233
233
  }
234
- function normalizeImplicitTileData(_x9, _x10, _x11, _x12) {
234
+ function normalizeImplicitTileData(_x9, _x10, _x11, _x12, _x13) {
235
235
  return _normalizeImplicitTileData.apply(this, arguments);
236
236
  }
237
237
  function _normalizeImplicitTileData() {
238
- _normalizeImplicitTileData = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee3(tile, basePath, rootSubtree, options) {
238
+ _normalizeImplicitTileData = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee3(tile, basePath, rootSubtree, implicitOptions, loaderOptions) {
239
239
  var _yield$parseImplicitT, children, contentUrl, tileContentUrl, tileContent, tilePostprocessed;
240
240
  return _regenerator.default.wrap(function _callee3$(_context3) {
241
241
  while (1) switch (_context3.prev = _context3.next) {
@@ -249,7 +249,8 @@ function _normalizeImplicitTileData() {
249
249
  _context3.next = 4;
250
250
  return (0, _parse3dImplicitTiles.parseImplicitTiles)({
251
251
  subtree: rootSubtree,
252
- options: options
252
+ implicitOptions: implicitOptions,
253
+ loaderOptions: loaderOptions
253
254
  });
254
255
  case 4:
255
256
  _yield$parseImplicitT = _context3.sent;