@loaders.gl/3d-tiles 3.1.2 → 3.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dist.min.js CHANGED
@@ -11568,7 +11568,8 @@
11568
11568
  const currentTile = await parseImplicitTiles(subtree, options, pData, index, childTileLevel, globalData);
11569
11569
  if (currentTile.contentUrl || currentTile.children.length) {
11570
11570
  const globalLevel = lev + 1;
11571
- const formattedTile = formatTileData(currentTile, globalLevel, options);
11571
+ const childCoordinates = { childTileX, childTileY, childTileZ };
11572
+ const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);
11572
11573
  tile.children.push(formattedTile);
11573
11574
  }
11574
11575
  }
@@ -11583,10 +11584,19 @@
11583
11584
  }
11584
11585
  return false;
11585
11586
  }
11586
- function formatTileData(tile, level, options) {
11587
- const { basePath, refine, getRefine: getRefine2, lodMetricType, getTileType: getTileType2, rootLodMetricValue } = options;
11587
+ function formatTileData(tile, level, childCoordinates, options) {
11588
+ const {
11589
+ basePath,
11590
+ refine,
11591
+ getRefine: getRefine2,
11592
+ lodMetricType,
11593
+ getTileType: getTileType2,
11594
+ rootLodMetricValue,
11595
+ rootBoundingVolume
11596
+ } = options;
11588
11597
  const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, "");
11589
11598
  const lodMetricValue = rootLodMetricValue / 2 ** level;
11599
+ const boundingVolume = calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoordinates);
11590
11600
  return {
11591
11601
  children: tile.children,
11592
11602
  contentUrl: tile.contentUrl,
@@ -11595,9 +11605,31 @@
11595
11605
  refine: getRefine2(refine),
11596
11606
  type: getTileType2(tile),
11597
11607
  lodMetricType,
11598
- lodMetricValue
11608
+ lodMetricValue,
11609
+ boundingVolume
11599
11610
  };
11600
11611
  }
11612
+ function calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoordinates) {
11613
+ if (rootBoundingVolume.region) {
11614
+ const { childTileX, childTileY, childTileZ } = childCoordinates;
11615
+ const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;
11616
+ const boundingVolumesCount = 2 ** level;
11617
+ const sizeX = (east - west) / boundingVolumesCount;
11618
+ const sizeY = (north - south) / boundingVolumesCount;
11619
+ const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;
11620
+ const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];
11621
+ const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];
11622
+ const [childMinimumHeight, childMaximumHeight] = [
11623
+ minimumHeight + sizeZ * childTileZ,
11624
+ minimumHeight + sizeZ * (childTileZ + 1)
11625
+ ];
11626
+ return {
11627
+ region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]
11628
+ };
11629
+ }
11630
+ console.warn("Unsupported bounding volume type: ", rootBoundingVolume);
11631
+ return null;
11632
+ }
11601
11633
  function concatBits(first, second) {
11602
11634
  return parseInt(first.toString(2) + second.toString(2), 2);
11603
11635
  }
@@ -11712,6 +11744,7 @@
11712
11744
  const contentUrlTemplate = `${basePath}/${tileset.root.content.uri}`;
11713
11745
  const refine = tileset.root.refine;
11714
11746
  const rootLodMetricValue = tileset.root.geometricError;
11747
+ const rootBoundingVolume = tileset.root.boundingVolume;
11715
11748
  const options = {
11716
11749
  contentUrlTemplate,
11717
11750
  subtreesUriTemplate,
@@ -11722,6 +11755,7 @@
11722
11755
  basePath,
11723
11756
  lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,
11724
11757
  rootLodMetricValue,
11758
+ rootBoundingVolume,
11725
11759
  getTileType,
11726
11760
  getRefine
11727
11761
  };
@@ -10,6 +10,8 @@ exports.replaceContentUrlTemplate = replaceContentUrlTemplate;
10
10
 
11
11
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
12
 
13
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
14
+
13
15
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
16
 
15
17
  var _tile3dSubtreeLoader = require("../../../tile-3d-subtree-loader");
@@ -65,6 +67,7 @@ function _parseImplicitTiles() {
65
67
  index,
66
68
  currentTile,
67
69
  globalLevel,
70
+ childCoordinates,
68
71
  formattedTile,
69
72
  _args = arguments;
70
73
  return _regenerator.default.wrap(function _callee$(_context) {
@@ -178,7 +181,12 @@ function _parseImplicitTiles() {
178
181
 
179
182
  if (currentTile.contentUrl || currentTile.children.length) {
180
183
  globalLevel = lev + 1;
181
- formattedTile = formatTileData(currentTile, globalLevel, options);
184
+ childCoordinates = {
185
+ childTileX: childTileX,
186
+ childTileY: childTileY,
187
+ childTileZ: childTileZ
188
+ };
189
+ formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);
182
190
  tile.children.push(formattedTile);
183
191
  }
184
192
 
@@ -212,15 +220,17 @@ function getAvailabilityResult(availabilityData, index) {
212
220
  return false;
213
221
  }
214
222
 
215
- function formatTileData(tile, level, options) {
223
+ function formatTileData(tile, level, childCoordinates, options) {
216
224
  var basePath = options.basePath,
217
225
  refine = options.refine,
218
226
  getRefine = options.getRefine,
219
227
  lodMetricType = options.lodMetricType,
220
228
  getTileType = options.getTileType,
221
- rootLodMetricValue = options.rootLodMetricValue;
229
+ rootLodMetricValue = options.rootLodMetricValue,
230
+ rootBoundingVolume = options.rootBoundingVolume;
222
231
  var uri = tile.contentUrl && tile.contentUrl.replace("".concat(basePath, "/"), '');
223
232
  var lodMetricValue = rootLodMetricValue / Math.pow(2, level);
233
+ var boundingVolume = calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoordinates);
224
234
  return {
225
235
  children: tile.children,
226
236
  contentUrl: tile.contentUrl,
@@ -231,10 +241,44 @@ function formatTileData(tile, level, options) {
231
241
  refine: getRefine(refine),
232
242
  type: getTileType(tile),
233
243
  lodMetricType: lodMetricType,
234
- lodMetricValue: lodMetricValue
244
+ lodMetricValue: lodMetricValue,
245
+ boundingVolume: boundingVolume
235
246
  };
236
247
  }
237
248
 
249
+ function calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoordinates) {
250
+ if (rootBoundingVolume.region) {
251
+ var childTileX = childCoordinates.childTileX,
252
+ childTileY = childCoordinates.childTileY,
253
+ childTileZ = childCoordinates.childTileZ;
254
+
255
+ var _rootBoundingVolume$r = (0, _slicedToArray2.default)(rootBoundingVolume.region, 6),
256
+ west = _rootBoundingVolume$r[0],
257
+ south = _rootBoundingVolume$r[1],
258
+ east = _rootBoundingVolume$r[2],
259
+ north = _rootBoundingVolume$r[3],
260
+ minimumHeight = _rootBoundingVolume$r[4],
261
+ maximumHeight = _rootBoundingVolume$r[5];
262
+
263
+ var boundingVolumesCount = Math.pow(2, level);
264
+ var sizeX = (east - west) / boundingVolumesCount;
265
+ var sizeY = (north - south) / boundingVolumesCount;
266
+ var sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;
267
+ var childWest = west + sizeX * childTileX,
268
+ childEast = west + sizeX * (childTileX + 1);
269
+ var childSouth = south + sizeY * childTileY,
270
+ childNorth = south + sizeY * (childTileY + 1);
271
+ var childMinimumHeight = minimumHeight + sizeZ * childTileZ,
272
+ childMaximumHeight = minimumHeight + sizeZ * (childTileZ + 1);
273
+ return {
274
+ region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]
275
+ };
276
+ }
277
+
278
+ console.warn('Unsupported bounding volume type: ', rootBoundingVolume);
279
+ return null;
280
+ }
281
+
238
282
  function concatBits(first, second) {
239
283
  return parseInt(first.toString(2) + second.toString(2), 2);
240
284
  }
@@ -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","subtree","options","parentData","mortonIndex","x","y","z","childIndex","level","globalData","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","formattedTile","formatTileData","push","availabilityData","Boolean","constant","explicitBitstream","getBooleanValueFromBitstream","refine","getRefine","lodMetricType","getTileType","rootLodMetricValue","uri","replace","content","id","type","first","second","parseInt","toString","templateUrl","mapUrl","generateMapUrl","matched","items","key","availabilityIndex","availabilityBuffer","byteIndex","Math","floor","bitIndex","bitValue"],"mappings":"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","sourcesContent":["import type {Availability, 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-params\n// eslint-disable-next-line max-statements\nexport async function parseImplicitTiles(\n subtree: Subtree,\n options: any,\n parentData: {mortonIndex: number; x: number; y: number; z: number} = {\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n },\n childIndex: number = 0,\n level: number = 0,\n globalData: {level: number; mortonIndex: number; x: number; y: number; z: number} = {\n level: 0,\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n }\n) {\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 pData,\n index,\n childTileLevel,\n globalData\n );\n\n if (currentTile.contentUrl || currentTile.children.length) {\n const globalLevel = lev + 1;\n const formattedTile = formatTileData(currentTile, globalLevel, 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(tile, level: number, options: any) {\n const {basePath, refine, getRefine, lodMetricType, getTileType, rootLodMetricValue} = options;\n const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');\n const lodMetricValue = rootLodMetricValue / 2 ** level;\n // TODO handle bounding volume\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 // 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 * 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","subtree","options","parentData","mortonIndex","x","y","z","childIndex","level","globalData","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;;SAmBsBI,kB;;;;;kFAAf,iBACLC,OADK,EAELC,OAFK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGLC,YAAAA,UAHK,2DAGgE;AACnEC,cAAAA,WAAW,EAAE,CADsD;AAEnEC,cAAAA,CAAC,EAAE,CAFgE;AAGnEC,cAAAA,CAAC,EAAE,CAHgE;AAInEC,cAAAA,CAAC,EAAE;AAJgE,aAHhE;AASLC,YAAAA,UATK,2DASgB,CAThB;AAULC,YAAAA,KAVK,2DAUW,CAVX;AAWLC,YAAAA,UAXK,2DAW+E;AAClFD,cAAAA,KAAK,EAAE,CAD2E;AAElFL,cAAAA,WAAW,EAAE,CAFqE;AAGlFC,cAAAA,CAAC,EAAE,CAH+E;AAIlFC,cAAAA,CAAC,EAAE,CAJ+E;AAKlFC,cAAAA,CAAC,EAAE;AAL+E,aAX/E;AAoBHI,YAAAA,iBApBG,GA0BDT,OA1BC,CAoBHS,iBApBG,EAqBHC,aArBG,GA0BDV,OA1BC,CAqBHU,aArBG,EAsBHC,YAtBG,GA0BDX,OA1BC,CAsBHW,YAtBG,EAuBHC,kBAvBG,GA0BDZ,OA1BC,CAuBHY,kBAvBG,EAwBHC,mBAxBG,GA0BDb,OA1BC,CAwBHa,mBAxBG,EAyBHC,QAzBG,GA0BDd,OA1BC,CAyBHc,QAzBG;AA4BCC,YAAAA,IA5BD,GA4BQ;AAACC,cAAAA,QAAQ,EAAE,EAAX;AAAeC,cAAAA,cAAc,EAAE,CAA/B;AAAkCC,cAAAA,UAAU,EAAE;AAA9C,aA5BR;AA8BCC,YAAAA,eA9BD,GA8BmBxB,qBAAqB,CAACc,iBAAD,CA9BxC;AAgCCW,YAAAA,MAhCD,GAgCUd,UAAU,GAAG,CAhCvB;AAiCCe,YAAAA,MAjCD,GAiCWf,UAAU,IAAI,CAAf,GAAoB,CAjC9B;AAkCCgB,YAAAA,MAlCD,GAkCWhB,UAAU,IAAI,CAAf,GAAoB,CAlC9B;AAoCCiB,YAAAA,WApCD,GAoCe,CAAC,SAAAJ,eAAe,EAAIZ,KAAJ,CAAf,GAA2B,CAA5B,KAAkCY,eAAe,GAAG,CAApD,CApCf;AAqCDK,YAAAA,oBArCC,GAqCsBC,UAAU,CAACxB,UAAU,CAACC,WAAZ,EAAyBI,UAAzB,CArChC;AAsCDoB,YAAAA,qBAtCC,GAsCuBH,WAAW,GAAGC,oBAtCrC;AAyCDG,YAAAA,UAzCC,GAyCYF,UAAU,CAACxB,UAAU,CAACE,CAAZ,EAAeiB,MAAf,CAzCtB;AA0CDQ,YAAAA,UA1CC,GA0CYH,UAAU,CAACxB,UAAU,CAACG,CAAZ,EAAeiB,MAAf,CA1CtB;AA2CDQ,YAAAA,UA3CC,GA2CYJ,UAAU,CAACxB,UAAU,CAACI,CAAZ,EAAeiB,MAAf,CA3CtB;AAsDDQ,YAAAA,uBAtDC,GAsDyB,KAtDzB;;AAwDL,gBAAIvB,KAAK,GAAG,CAAR,GAAYG,aAAhB,EAA+B;AAC7BoB,cAAAA,uBAAuB,GAAGC,qBAAqB,CAC7ChC,OAAO,CAACiC,wBADqC,EAE7CR,oBAF6C,CAA/C;AAID;;AAEKrB,YAAAA,CA/DD,GA+DKsB,UAAU,CAACjB,UAAU,CAACL,CAAZ,EAAewB,UAAf,CA/Df;AAgECvB,YAAAA,CAhED,GAgEKqB,UAAU,CAACjB,UAAU,CAACJ,CAAZ,EAAewB,UAAf,CAhEf;AAiECvB,YAAAA,CAjED,GAiEKoB,UAAU,CAACjB,UAAU,CAACH,CAAZ,EAAewB,UAAf,CAjEf;AAkECI,YAAAA,GAlED,GAkEO1B,KAAK,GAAGC,UAAU,CAACD,KAlE1B;;AAAA,iBAoEDuB,uBApEC;AAAA;AAAA;AAAA;;AAqEGI,YAAAA,WArEH,aAqEoBpB,QArEpB,cAqEgCD,mBArEhC;AAsEGsB,YAAAA,eAtEH,GAsEqBC,yBAAyB,CAACF,WAAD,EAAcD,GAAd,EAAmB9B,CAAnB,EAAsBC,CAAtB,EAAyBC,CAAzB,CAtE9C;AAAA;AAAA,mBAuEwB,gBAAK8B,eAAL,EAAsBE,wCAAtB,CAvExB;;AAAA;AAuEGC,YAAAA,YAvEH;AAyEHvC,YAAAA,OAAO,GAAGuC,YAAV;AAEA9B,YAAAA,UAAU,CAACN,WAAX,GAAyBsB,oBAAzB;AACAhB,YAAAA,UAAU,CAACL,CAAX,GAAewB,UAAf;AACAnB,YAAAA,UAAU,CAACJ,CAAX,GAAewB,UAAf;AACApB,YAAAA,UAAU,CAACH,CAAX,GAAewB,UAAf;AACArB,YAAAA,UAAU,CAACD,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;;AAtFG;AAyFCgC,YAAAA,eAzFD,GAyFmBR,qBAAqB,CAAChC,OAAO,CAACyC,gBAAT,EAA2Bd,qBAA3B,CAzFxC;;AAAA,kBA2FD,CAACa,eAAD,IAAoBhC,KAAK,GAAGI,YA3F3B;AAAA;AAAA;AAAA;;AAAA,6CA4FII,IA5FJ;;AAAA;AA+FC0B,YAAAA,kBA/FD,GA+FsBV,qBAAqB,CAC9ChC,OAAO,CAAC2C,mBADsC,EAE9ChB,qBAF8C,CA/F3C;;AAoGL,gBAAIe,kBAAJ,EAAwB;AACtB1B,cAAAA,IAAI,CAACG,UAAL,GAAkBkB,yBAAyB,CAACxB,kBAAD,EAAqBqB,GAArB,EAA0B9B,CAA1B,EAA6BC,CAA7B,EAAgCC,CAAhC,CAA3C;AACD;;AAEKsC,YAAAA,cAxGD,GAwGkBpC,KAAK,GAAG,CAxG1B;AAyGCqC,YAAAA,KAzGD,GAyGS;AAAC1C,cAAAA,WAAW,EAAEsB,oBAAd;AAAoCrB,cAAAA,CAAC,EAAEwB,UAAvC;AAAmDvB,cAAAA,CAAC,EAAEwB,UAAtD;AAAkEvB,cAAAA,CAAC,EAAEwB;AAArE,aAzGT;AA2GIgB,YAAAA,KA3GJ,GA2GY,CA3GZ;;AAAA;AAAA,kBA2GeA,KAAK,GAAG1B,eA3GvB;AAAA;AAAA;AAAA;;AAAA;AAAA,mBA4GuBrB,kBAAkB,CAC1CC,OAD0C,EAE1CC,OAF0C,EAG1C4C,KAH0C,EAI1CC,KAJ0C,EAK1CF,cAL0C,EAM1CnC,UAN0C,CA5GzC;;AAAA;AA4GGsC,YAAAA,WA5GH;;AAqHH,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,EAA6CjD,OAA7C,CAHqB;AAKzDe,cAAAA,IAAI,CAACC,QAAL,CAAcoC,IAAd,CAAmBF,aAAnB;AACD;;AA3HE;AA2GwCL,YAAAA,KAAK,EA3G7C;AAAA;AAAA;;AAAA;AAAA,6CA8HE9B,IA9HF;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AAiIP,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,EAIEjD,OAJF,EAKE;AACA,MACEc,QADF,GAQId,OARJ,CACEc,QADF;AAAA,MAEE4C,MAFF,GAQI1D,OARJ,CAEE0D,MAFF;AAAA,MAGEC,SAHF,GAQI3D,OARJ,CAGE2D,SAHF;AAAA,MAIEC,aAJF,GAQI5D,OARJ,CAIE4D,aAJF;AAAA,MAKEC,WALF,GAQI7D,OARJ,CAKE6D,WALF;AAAA,MAMEC,kBANF,GAQI9D,OARJ,CAME8D,kBANF;AAAA,MAOEC,kBAPF,GAQI/D,OARJ,CAOE+D,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,EAGLJ,CAHK,EAILC,CAJK,EAKLC,CALK,EAMG;AACR,MAAM0F,MAAM,GAAGC,cAAc,CAAC;AAACzF,IAAAA,KAAK,EAALA,KAAD;AAAQJ,IAAAA,CAAC,EAADA,CAAR;AAAWC,IAAAA,CAAC,EAADA,CAAX;AAAcC,IAAAA,CAAC,EAADA;AAAd,GAAD,CAA7B;AACA,SAAOyF,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-params\n// eslint-disable-next-line max-statements\nexport async function parseImplicitTiles(\n subtree: Subtree,\n options: any,\n parentData: {mortonIndex: number; x: number; y: number; z: number} = {\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n },\n childIndex: number = 0,\n level: number = 0,\n globalData: {level: number; mortonIndex: number; x: number; y: number; z: number} = {\n level: 0,\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n }\n) {\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 pData,\n index,\n 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"}
@@ -122,7 +122,7 @@ function normalizeImplicitTileHeaders(_x) {
122
122
 
123
123
  function _normalizeImplicitTileHeaders() {
124
124
  _normalizeImplicitTileHeaders = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(tileset) {
125
- var basePath, implicitTilingExtension, subdivisionScheme, maximumLevel, subtreeLevels, subtreesUriTemplate, subtreeUrl, rootSubtreeUrl, rootSubtree, contentUrlTemplate, refine, rootLodMetricValue, options;
125
+ var basePath, implicitTilingExtension, subdivisionScheme, maximumLevel, subtreeLevels, subtreesUriTemplate, subtreeUrl, rootSubtreeUrl, rootSubtree, contentUrlTemplate, refine, rootLodMetricValue, rootBoundingVolume, options;
126
126
  return _regenerator.default.wrap(function _callee$(_context) {
127
127
  while (1) {
128
128
  switch (_context.prev = _context.next) {
@@ -148,6 +148,7 @@ function _normalizeImplicitTileHeaders() {
148
148
  contentUrlTemplate = "".concat(basePath, "/").concat(tileset.root.content.uri);
149
149
  refine = tileset.root.refine;
150
150
  rootLodMetricValue = tileset.root.geometricError;
151
+ rootBoundingVolume = tileset.root.boundingVolume;
151
152
  options = {
152
153
  contentUrlTemplate: contentUrlTemplate,
153
154
  subtreesUriTemplate: subtreesUriTemplate,
@@ -158,16 +159,17 @@ function _normalizeImplicitTileHeaders() {
158
159
  basePath: basePath,
159
160
  lodMetricType: _tiles.LOD_METRIC_TYPE.GEOMETRIC_ERROR,
160
161
  rootLodMetricValue: rootLodMetricValue,
162
+ rootBoundingVolume: rootBoundingVolume,
161
163
  getTileType: getTileType,
162
164
  getRefine: getRefine
163
165
  };
164
- _context.next = 16;
166
+ _context.next = 17;
165
167
  return normalizeImplicitTileData(tileset.root, rootSubtree, options);
166
168
 
167
- case 16:
169
+ case 17:
168
170
  return _context.abrupt("return", _context.sent);
169
171
 
170
- case 17:
172
+ case 18:
171
173
  case "end":
172
174
  return _context.stop();
173
175
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/parsers/parse-3d-tile-header.ts"],"names":["getTileType","tile","contentUrl","TILE_TYPE","EMPTY","fileExtension","split","pop","POINTCLOUD","SCENEGRAPH","getRefine","refine","TILE_REFINEMENT","REPLACE","ADD","normalizeTileData","options","content","contentUri","uri","url","basePath","id","lodMetricType","LOD_METRIC_TYPE","GEOMETRIC_ERROR","lodMetricValue","geometricError","transformMatrix","transform","type","normalizeTileHeaders","tileset","root","stack","push","length","children","childHeader","normalizeImplicitTileHeaders","implicitTilingExtension","extensions","subdivisionScheme","maximumLevel","subtreeLevels","subtreesUriTemplate","subtrees","subtreeUrl","rootSubtreeUrl","Tile3DSubtreeLoader","rootSubtree","contentUrlTemplate","rootLodMetricValue","normalizeImplicitTileData","replace"],"mappings":"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","sourcesContent":["import {Tile3DSubtreeLoader} from '../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\nimport {Tileset3D, LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE} from '@loaders.gl/tiles';\nimport {Subtree} from '../../types';\nimport {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';\n\nfunction getTileType(tile) {\n if (!tile.contentUrl) {\n return TILE_TYPE.EMPTY;\n }\n\n const contentUrl = tile.contentUrl;\n const fileExtension = contentUrl.split('.').pop();\n switch (fileExtension) {\n case 'pnts':\n return TILE_TYPE.POINTCLOUD;\n case 'i3dm':\n case 'b3dm':\n case 'glb':\n case 'gltf':\n return TILE_TYPE.SCENEGRAPH;\n default:\n return fileExtension;\n }\n}\n\nfunction getRefine(refine) {\n switch (refine) {\n case 'REPLACE':\n case 'replace':\n return TILE_REFINEMENT.REPLACE;\n case 'ADD':\n case 'add':\n return TILE_REFINEMENT.ADD;\n default:\n return refine;\n }\n}\n\nexport function normalizeTileData(tile, options) {\n if (!tile) {\n return null;\n }\n if (tile.content) {\n const contentUri = tile.content.uri || tile.content.url;\n tile.contentUrl = `${options.basePath}/${contentUri}`;\n }\n tile.id = tile.contentUrl;\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n tile.type = getTileType(tile);\n tile.refine = getRefine(tile.refine);\n\n return tile;\n}\n\n// normalize tile headers\nexport function normalizeTileHeaders(tileset) {\n const basePath = tileset.basePath;\n const root = normalizeTileData(tileset.root, tileset);\n\n const stack: any[] = [];\n stack.push(root);\n\n while (stack.length > 0) {\n const tile = stack.pop() || {};\n const children = tile.children || [];\n for (const childHeader of children) {\n normalizeTileData(childHeader, {basePath});\n stack.push(childHeader);\n }\n }\n\n return root;\n}\n\n/**\n * Do normalisation of implicit tile headers\n * TODO Check if Tile3D class can be a return type here.\n * @param tileset\n */\nexport async function normalizeImplicitTileHeaders(tileset: Tileset3D) {\n if (!tileset.root) {\n return null;\n }\n\n const basePath = tileset.basePath;\n const implicitTilingExtension = tileset.root.extensions['3DTILES_implicit_tiling'];\n const {\n subdivisionScheme,\n maximumLevel,\n subtreeLevels,\n subtrees: {uri: subtreesUriTemplate}\n } = implicitTilingExtension;\n const subtreeUrl = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);\n const rootSubtreeUrl = `${basePath}/${subtreeUrl}`;\n const rootSubtree = await load(rootSubtreeUrl, Tile3DSubtreeLoader);\n const contentUrlTemplate = `${basePath}/${tileset.root.content.uri}`;\n const refine = tileset.root.refine;\n // @ts-ignore\n const rootLodMetricValue = tileset.root.geometricError;\n\n const options = {\n contentUrlTemplate,\n subtreesUriTemplate,\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n refine,\n basePath,\n lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,\n rootLodMetricValue,\n getTileType,\n getRefine\n };\n\n return await normalizeImplicitTileData(tileset.root, rootSubtree, options);\n}\n\n/**\n * Do implicit data normalisation to create hierarchical tile structure\n * @param tile\n * @param rootSubtree\n * @param options\n * @returns\n */\nexport async function normalizeImplicitTileData(tile, rootSubtree: Subtree, options: any) {\n if (!tile) {\n return null;\n }\n\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n\n const {children, contentUrl} = await parseImplicitTiles(rootSubtree, options);\n\n if (contentUrl) {\n tile.contentUrl = contentUrl;\n tile.content = {uri: contentUrl.replace(`${options.basePath}/`, '')};\n }\n\n tile.refine = getRefine(tile.refine);\n tile.type = getTileType(tile);\n tile.children = children;\n tile.id = tile.contentUrl;\n\n return tile;\n}\n"],"file":"parse-3d-tile-header.js"}
1
+ {"version":3,"sources":["../../../../src/lib/parsers/parse-3d-tile-header.ts"],"names":["getTileType","tile","contentUrl","TILE_TYPE","EMPTY","fileExtension","split","pop","POINTCLOUD","SCENEGRAPH","getRefine","refine","TILE_REFINEMENT","REPLACE","ADD","normalizeTileData","options","content","contentUri","uri","url","basePath","id","lodMetricType","LOD_METRIC_TYPE","GEOMETRIC_ERROR","lodMetricValue","geometricError","transformMatrix","transform","type","normalizeTileHeaders","tileset","root","stack","push","length","children","childHeader","normalizeImplicitTileHeaders","implicitTilingExtension","extensions","subdivisionScheme","maximumLevel","subtreeLevels","subtreesUriTemplate","subtrees","subtreeUrl","rootSubtreeUrl","Tile3DSubtreeLoader","rootSubtree","contentUrlTemplate","rootLodMetricValue","rootBoundingVolume","boundingVolume","normalizeImplicitTileData","replace"],"mappings":"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","sourcesContent":["import {Tile3DSubtreeLoader} from '../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\nimport {Tileset3D, LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE} from '@loaders.gl/tiles';\nimport {Subtree} from '../../types';\nimport {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';\n\nfunction getTileType(tile) {\n if (!tile.contentUrl) {\n return TILE_TYPE.EMPTY;\n }\n\n const contentUrl = tile.contentUrl;\n const fileExtension = contentUrl.split('.').pop();\n switch (fileExtension) {\n case 'pnts':\n return TILE_TYPE.POINTCLOUD;\n case 'i3dm':\n case 'b3dm':\n case 'glb':\n case 'gltf':\n return TILE_TYPE.SCENEGRAPH;\n default:\n return fileExtension;\n }\n}\n\nfunction getRefine(refine) {\n switch (refine) {\n case 'REPLACE':\n case 'replace':\n return TILE_REFINEMENT.REPLACE;\n case 'ADD':\n case 'add':\n return TILE_REFINEMENT.ADD;\n default:\n return refine;\n }\n}\n\nexport function normalizeTileData(tile, options) {\n if (!tile) {\n return null;\n }\n if (tile.content) {\n const contentUri = tile.content.uri || tile.content.url;\n tile.contentUrl = `${options.basePath}/${contentUri}`;\n }\n tile.id = tile.contentUrl;\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n tile.type = getTileType(tile);\n tile.refine = getRefine(tile.refine);\n\n return tile;\n}\n\n// normalize tile headers\nexport function normalizeTileHeaders(tileset) {\n const basePath = tileset.basePath;\n const root = normalizeTileData(tileset.root, tileset);\n\n const stack: any[] = [];\n stack.push(root);\n\n while (stack.length > 0) {\n const tile = stack.pop() || {};\n const children = tile.children || [];\n for (const childHeader of children) {\n normalizeTileData(childHeader, {basePath});\n stack.push(childHeader);\n }\n }\n\n return root;\n}\n\n/**\n * Do normalisation of implicit tile headers\n * TODO Check if Tile3D class can be a return type here.\n * @param tileset\n */\nexport async function normalizeImplicitTileHeaders(tileset: Tileset3D) {\n if (!tileset.root) {\n return null;\n }\n\n const basePath = tileset.basePath;\n const implicitTilingExtension = tileset.root.extensions['3DTILES_implicit_tiling'];\n const {\n subdivisionScheme,\n maximumLevel,\n subtreeLevels,\n subtrees: {uri: subtreesUriTemplate}\n } = implicitTilingExtension;\n const subtreeUrl = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);\n const rootSubtreeUrl = `${basePath}/${subtreeUrl}`;\n const rootSubtree = await load(rootSubtreeUrl, Tile3DSubtreeLoader);\n const contentUrlTemplate = `${basePath}/${tileset.root.content.uri}`;\n const refine = tileset.root.refine;\n // @ts-ignore\n const rootLodMetricValue = tileset.root.geometricError;\n const rootBoundingVolume = tileset.root.boundingVolume;\n\n const options = {\n contentUrlTemplate,\n subtreesUriTemplate,\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n refine,\n basePath,\n lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,\n rootLodMetricValue,\n rootBoundingVolume,\n getTileType,\n getRefine\n };\n\n return await normalizeImplicitTileData(tileset.root, rootSubtree, options);\n}\n\n/**\n * Do implicit data normalisation to create hierarchical tile structure\n * @param tile\n * @param rootSubtree\n * @param options\n * @returns\n */\nexport async function normalizeImplicitTileData(tile, rootSubtree: Subtree, options: any) {\n if (!tile) {\n return null;\n }\n\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n\n const {children, contentUrl} = await parseImplicitTiles(rootSubtree, options);\n\n if (contentUrl) {\n tile.contentUrl = contentUrl;\n tile.content = {uri: contentUrl.replace(`${options.basePath}/`, '')};\n }\n\n tile.refine = getRefine(tile.refine);\n tile.type = getTileType(tile);\n tile.children = children;\n tile.id = tile.contentUrl;\n\n return tile;\n}\n"],"file":"parse-3d-tile-header.js"}
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.VERSION = void 0;
7
- var VERSION = typeof "3.1.2" !== 'undefined' ? "3.1.2" : 'latest';
7
+ var VERSION = typeof "3.1.6" !== 'undefined' ? "3.1.6" : 'latest';
8
8
  exports.VERSION = VERSION;
9
9
  //# sourceMappingURL=version.js.map
@@ -95,7 +95,12 @@ export async function parseImplicitTiles(subtree, options, parentData = {
95
95
 
96
96
  if (currentTile.contentUrl || currentTile.children.length) {
97
97
  const globalLevel = lev + 1;
98
- const formattedTile = formatTileData(currentTile, globalLevel, options);
98
+ const childCoordinates = {
99
+ childTileX,
100
+ childTileY,
101
+ childTileZ
102
+ };
103
+ const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);
99
104
  tile.children.push(formattedTile);
100
105
  }
101
106
  }
@@ -115,17 +120,19 @@ function getAvailabilityResult(availabilityData, index) {
115
120
  return false;
116
121
  }
117
122
 
118
- function formatTileData(tile, level, options) {
123
+ function formatTileData(tile, level, childCoordinates, options) {
119
124
  const {
120
125
  basePath,
121
126
  refine,
122
127
  getRefine,
123
128
  lodMetricType,
124
129
  getTileType,
125
- rootLodMetricValue
130
+ rootLodMetricValue,
131
+ rootBoundingVolume
126
132
  } = options;
127
133
  const uri = tile.contentUrl && tile.contentUrl.replace("".concat(basePath, "/"), '');
128
134
  const lodMetricValue = rootLodMetricValue / 2 ** level;
135
+ const boundingVolume = calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoordinates);
129
136
  return {
130
137
  children: tile.children,
131
138
  contentUrl: tile.contentUrl,
@@ -136,10 +143,35 @@ function formatTileData(tile, level, options) {
136
143
  refine: getRefine(refine),
137
144
  type: getTileType(tile),
138
145
  lodMetricType,
139
- lodMetricValue
146
+ lodMetricValue,
147
+ boundingVolume
140
148
  };
141
149
  }
142
150
 
151
+ function calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoordinates) {
152
+ if (rootBoundingVolume.region) {
153
+ const {
154
+ childTileX,
155
+ childTileY,
156
+ childTileZ
157
+ } = childCoordinates;
158
+ const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;
159
+ const boundingVolumesCount = 2 ** level;
160
+ const sizeX = (east - west) / boundingVolumesCount;
161
+ const sizeY = (north - south) / boundingVolumesCount;
162
+ const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;
163
+ const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];
164
+ const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];
165
+ const [childMinimumHeight, childMaximumHeight] = [minimumHeight + sizeZ * childTileZ, minimumHeight + sizeZ * (childTileZ + 1)];
166
+ return {
167
+ region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]
168
+ };
169
+ }
170
+
171
+ console.warn('Unsupported bounding volume type: ', rootBoundingVolume);
172
+ return null;
173
+ }
174
+
143
175
  function concatBits(first, second) {
144
176
  return parseInt(first.toString(2) + second.toString(2), 2);
145
177
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"names":["Tile3DSubtreeLoader","load","QUADTREE_DEVISION_COUNT","OCTREE_DEVISION_COUNT","SUBDIVISION_COUNT_MAP","QUADTREE","OCTREE","parseImplicitTiles","subtree","options","parentData","mortonIndex","x","y","z","childIndex","level","globalData","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","childSubtree","isTileAvailable","tileAvailability","isContentAvailable","contentAvailability","childTileLevel","pData","index","currentTile","length","globalLevel","formattedTile","formatTileData","push","availabilityData","Boolean","constant","explicitBitstream","getBooleanValueFromBitstream","refine","getRefine","lodMetricType","getTileType","rootLodMetricValue","uri","replace","content","id","type","first","second","parseInt","toString","templateUrl","mapUrl","generateMapUrl","matched","items","key","availabilityIndex","availabilityBuffer","byteIndex","Math","floor","bitIndex","bitValue"],"mappings":"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","sourcesContent":["import type {Availability, 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-params\n// eslint-disable-next-line max-statements\nexport async function parseImplicitTiles(\n subtree: Subtree,\n options: any,\n parentData: {mortonIndex: number; x: number; y: number; z: number} = {\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n },\n childIndex: number = 0,\n level: number = 0,\n globalData: {level: number; mortonIndex: number; x: number; y: number; z: number} = {\n level: 0,\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n }\n) {\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 pData,\n index,\n childTileLevel,\n globalData\n );\n\n if (currentTile.contentUrl || currentTile.children.length) {\n const globalLevel = lev + 1;\n const formattedTile = formatTileData(currentTile, globalLevel, 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(tile, level: number, options: any) {\n const {basePath, refine, getRefine, lodMetricType, getTileType, rootLodMetricValue} = options;\n const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');\n const lodMetricValue = rootLodMetricValue / 2 ** level;\n // TODO handle bounding volume\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 // 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 * 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":["Tile3DSubtreeLoader","load","QUADTREE_DEVISION_COUNT","OCTREE_DEVISION_COUNT","SUBDIVISION_COUNT_MAP","QUADTREE","OCTREE","parseImplicitTiles","subtree","options","parentData","mortonIndex","x","y","z","childIndex","level","globalData","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","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":"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","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-params\n// eslint-disable-next-line max-statements\nexport async function parseImplicitTiles(\n subtree: Subtree,\n options: any,\n parentData: {mortonIndex: number; x: number; y: number; z: number} = {\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n },\n childIndex: number = 0,\n level: number = 0,\n globalData: {level: number; mortonIndex: number; x: number; y: number; z: number} = {\n level: 0,\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n }\n) {\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 pData,\n index,\n 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"}
@@ -100,6 +100,7 @@ export async function normalizeImplicitTileHeaders(tileset) {
100
100
  const contentUrlTemplate = "".concat(basePath, "/").concat(tileset.root.content.uri);
101
101
  const refine = tileset.root.refine;
102
102
  const rootLodMetricValue = tileset.root.geometricError;
103
+ const rootBoundingVolume = tileset.root.boundingVolume;
103
104
  const options = {
104
105
  contentUrlTemplate,
105
106
  subtreesUriTemplate,
@@ -110,6 +111,7 @@ export async function normalizeImplicitTileHeaders(tileset) {
110
111
  basePath,
111
112
  lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,
112
113
  rootLodMetricValue,
114
+ rootBoundingVolume,
113
115
  getTileType,
114
116
  getRefine
115
117
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/parsers/parse-3d-tile-header.ts"],"names":["Tile3DSubtreeLoader","load","LOD_METRIC_TYPE","TILE_REFINEMENT","TILE_TYPE","parseImplicitTiles","replaceContentUrlTemplate","getTileType","tile","contentUrl","EMPTY","fileExtension","split","pop","POINTCLOUD","SCENEGRAPH","getRefine","refine","REPLACE","ADD","normalizeTileData","options","content","contentUri","uri","url","basePath","id","lodMetricType","GEOMETRIC_ERROR","lodMetricValue","geometricError","transformMatrix","transform","type","normalizeTileHeaders","tileset","root","stack","push","length","children","childHeader","normalizeImplicitTileHeaders","implicitTilingExtension","extensions","subdivisionScheme","maximumLevel","subtreeLevels","subtrees","subtreesUriTemplate","subtreeUrl","rootSubtreeUrl","rootSubtree","contentUrlTemplate","rootLodMetricValue","normalizeImplicitTileData","replace"],"mappings":"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","sourcesContent":["import {Tile3DSubtreeLoader} from '../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\nimport {Tileset3D, LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE} from '@loaders.gl/tiles';\nimport {Subtree} from '../../types';\nimport {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';\n\nfunction getTileType(tile) {\n if (!tile.contentUrl) {\n return TILE_TYPE.EMPTY;\n }\n\n const contentUrl = tile.contentUrl;\n const fileExtension = contentUrl.split('.').pop();\n switch (fileExtension) {\n case 'pnts':\n return TILE_TYPE.POINTCLOUD;\n case 'i3dm':\n case 'b3dm':\n case 'glb':\n case 'gltf':\n return TILE_TYPE.SCENEGRAPH;\n default:\n return fileExtension;\n }\n}\n\nfunction getRefine(refine) {\n switch (refine) {\n case 'REPLACE':\n case 'replace':\n return TILE_REFINEMENT.REPLACE;\n case 'ADD':\n case 'add':\n return TILE_REFINEMENT.ADD;\n default:\n return refine;\n }\n}\n\nexport function normalizeTileData(tile, options) {\n if (!tile) {\n return null;\n }\n if (tile.content) {\n const contentUri = tile.content.uri || tile.content.url;\n tile.contentUrl = `${options.basePath}/${contentUri}`;\n }\n tile.id = tile.contentUrl;\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n tile.type = getTileType(tile);\n tile.refine = getRefine(tile.refine);\n\n return tile;\n}\n\n// normalize tile headers\nexport function normalizeTileHeaders(tileset) {\n const basePath = tileset.basePath;\n const root = normalizeTileData(tileset.root, tileset);\n\n const stack: any[] = [];\n stack.push(root);\n\n while (stack.length > 0) {\n const tile = stack.pop() || {};\n const children = tile.children || [];\n for (const childHeader of children) {\n normalizeTileData(childHeader, {basePath});\n stack.push(childHeader);\n }\n }\n\n return root;\n}\n\n/**\n * Do normalisation of implicit tile headers\n * TODO Check if Tile3D class can be a return type here.\n * @param tileset\n */\nexport async function normalizeImplicitTileHeaders(tileset: Tileset3D) {\n if (!tileset.root) {\n return null;\n }\n\n const basePath = tileset.basePath;\n const implicitTilingExtension = tileset.root.extensions['3DTILES_implicit_tiling'];\n const {\n subdivisionScheme,\n maximumLevel,\n subtreeLevels,\n subtrees: {uri: subtreesUriTemplate}\n } = implicitTilingExtension;\n const subtreeUrl = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);\n const rootSubtreeUrl = `${basePath}/${subtreeUrl}`;\n const rootSubtree = await load(rootSubtreeUrl, Tile3DSubtreeLoader);\n const contentUrlTemplate = `${basePath}/${tileset.root.content.uri}`;\n const refine = tileset.root.refine;\n // @ts-ignore\n const rootLodMetricValue = tileset.root.geometricError;\n\n const options = {\n contentUrlTemplate,\n subtreesUriTemplate,\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n refine,\n basePath,\n lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,\n rootLodMetricValue,\n getTileType,\n getRefine\n };\n\n return await normalizeImplicitTileData(tileset.root, rootSubtree, options);\n}\n\n/**\n * Do implicit data normalisation to create hierarchical tile structure\n * @param tile\n * @param rootSubtree\n * @param options\n * @returns\n */\nexport async function normalizeImplicitTileData(tile, rootSubtree: Subtree, options: any) {\n if (!tile) {\n return null;\n }\n\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n\n const {children, contentUrl} = await parseImplicitTiles(rootSubtree, options);\n\n if (contentUrl) {\n tile.contentUrl = contentUrl;\n tile.content = {uri: contentUrl.replace(`${options.basePath}/`, '')};\n }\n\n tile.refine = getRefine(tile.refine);\n tile.type = getTileType(tile);\n tile.children = children;\n tile.id = tile.contentUrl;\n\n return tile;\n}\n"],"file":"parse-3d-tile-header.js"}
1
+ {"version":3,"sources":["../../../../src/lib/parsers/parse-3d-tile-header.ts"],"names":["Tile3DSubtreeLoader","load","LOD_METRIC_TYPE","TILE_REFINEMENT","TILE_TYPE","parseImplicitTiles","replaceContentUrlTemplate","getTileType","tile","contentUrl","EMPTY","fileExtension","split","pop","POINTCLOUD","SCENEGRAPH","getRefine","refine","REPLACE","ADD","normalizeTileData","options","content","contentUri","uri","url","basePath","id","lodMetricType","GEOMETRIC_ERROR","lodMetricValue","geometricError","transformMatrix","transform","type","normalizeTileHeaders","tileset","root","stack","push","length","children","childHeader","normalizeImplicitTileHeaders","implicitTilingExtension","extensions","subdivisionScheme","maximumLevel","subtreeLevels","subtrees","subtreesUriTemplate","subtreeUrl","rootSubtreeUrl","rootSubtree","contentUrlTemplate","rootLodMetricValue","rootBoundingVolume","boundingVolume","normalizeImplicitTileData","replace"],"mappings":"AAAA,SAAQA,mBAAR,QAAkC,8BAAlC;AACA,SAAQC,IAAR,QAAmB,kBAAnB;AACA,SAAmBC,eAAnB,EAAoCC,eAApC,EAAqDC,SAArD,QAAqE,mBAArE;AAEA,SAAQC,kBAAR,EAA4BC,yBAA5B,QAA4D,mCAA5D;;AAEA,SAASC,WAAT,CAAqBC,IAArB,EAA2B;AACzB,MAAI,CAACA,IAAI,CAACC,UAAV,EAAsB;AACpB,WAAOL,SAAS,CAACM,KAAjB;AACD;;AAED,QAAMD,UAAU,GAAGD,IAAI,CAACC,UAAxB;AACA,QAAME,aAAa,GAAGF,UAAU,CAACG,KAAX,CAAiB,GAAjB,EAAsBC,GAAtB,EAAtB;;AACA,UAAQF,aAAR;AACE,SAAK,MAAL;AACE,aAAOP,SAAS,CAACU,UAAjB;;AACF,SAAK,MAAL;AACA,SAAK,MAAL;AACA,SAAK,KAAL;AACA,SAAK,MAAL;AACE,aAAOV,SAAS,CAACW,UAAjB;;AACF;AACE,aAAOJ,aAAP;AATJ;AAWD;;AAED,SAASK,SAAT,CAAmBC,MAAnB,EAA2B;AACzB,UAAQA,MAAR;AACE,SAAK,SAAL;AACA,SAAK,SAAL;AACE,aAAOd,eAAe,CAACe,OAAvB;;AACF,SAAK,KAAL;AACA,SAAK,KAAL;AACE,aAAOf,eAAe,CAACgB,GAAvB;;AACF;AACE,aAAOF,MAAP;AARJ;AAUD;;AAED,OAAO,SAASG,iBAAT,CAA2BZ,IAA3B,EAAiCa,OAAjC,EAA0C;AAC/C,MAAI,CAACb,IAAL,EAAW;AACT,WAAO,IAAP;AACD;;AACD,MAAIA,IAAI,CAACc,OAAT,EAAkB;AAChB,UAAMC,UAAU,GAAGf,IAAI,CAACc,OAAL,CAAaE,GAAb,IAAoBhB,IAAI,CAACc,OAAL,CAAaG,GAApD;AACAjB,IAAAA,IAAI,CAACC,UAAL,aAAqBY,OAAO,CAACK,QAA7B,cAAyCH,UAAzC;AACD;;AACDf,EAAAA,IAAI,CAACmB,EAAL,GAAUnB,IAAI,CAACC,UAAf;AACAD,EAAAA,IAAI,CAACoB,aAAL,GAAqB1B,eAAe,CAAC2B,eAArC;AACArB,EAAAA,IAAI,CAACsB,cAAL,GAAsBtB,IAAI,CAACuB,cAA3B;AACAvB,EAAAA,IAAI,CAACwB,eAAL,GAAuBxB,IAAI,CAACyB,SAA5B;AACAzB,EAAAA,IAAI,CAAC0B,IAAL,GAAY3B,WAAW,CAACC,IAAD,CAAvB;AACAA,EAAAA,IAAI,CAACS,MAAL,GAAcD,SAAS,CAACR,IAAI,CAACS,MAAN,CAAvB;AAEA,SAAOT,IAAP;AACD;AAGD,OAAO,SAAS2B,oBAAT,CAA8BC,OAA9B,EAAuC;AAC5C,QAAMV,QAAQ,GAAGU,OAAO,CAACV,QAAzB;AACA,QAAMW,IAAI,GAAGjB,iBAAiB,CAACgB,OAAO,CAACC,IAAT,EAAeD,OAAf,CAA9B;AAEA,QAAME,KAAY,GAAG,EAArB;AACAA,EAAAA,KAAK,CAACC,IAAN,CAAWF,IAAX;;AAEA,SAAOC,KAAK,CAACE,MAAN,GAAe,CAAtB,EAAyB;AACvB,UAAMhC,IAAI,GAAG8B,KAAK,CAACzB,GAAN,MAAe,EAA5B;AACA,UAAM4B,QAAQ,GAAGjC,IAAI,CAACiC,QAAL,IAAiB,EAAlC;;AACA,SAAK,MAAMC,WAAX,IAA0BD,QAA1B,EAAoC;AAClCrB,MAAAA,iBAAiB,CAACsB,WAAD,EAAc;AAAChB,QAAAA;AAAD,OAAd,CAAjB;AACAY,MAAAA,KAAK,CAACC,IAAN,CAAWG,WAAX;AACD;AACF;;AAED,SAAOL,IAAP;AACD;AAOD,OAAO,eAAeM,4BAAf,CAA4CP,OAA5C,EAAgE;AACrE,MAAI,CAACA,OAAO,CAACC,IAAb,EAAmB;AACjB,WAAO,IAAP;AACD;;AAED,QAAMX,QAAQ,GAAGU,OAAO,CAACV,QAAzB;AACA,QAAMkB,uBAAuB,GAAGR,OAAO,CAACC,IAAR,CAAaQ,UAAb,CAAwB,yBAAxB,CAAhC;AACA,QAAM;AACJC,IAAAA,iBADI;AAEJC,IAAAA,YAFI;AAGJC,IAAAA,aAHI;AAIJC,IAAAA,QAAQ,EAAE;AAACzB,MAAAA,GAAG,EAAE0B;AAAN;AAJN,MAKFN,uBALJ;AAMA,QAAMO,UAAU,GAAG7C,yBAAyB,CAAC4C,mBAAD,EAAsB,CAAtB,EAAyB,CAAzB,EAA4B,CAA5B,EAA+B,CAA/B,CAA5C;AACA,QAAME,cAAc,aAAM1B,QAAN,cAAkByB,UAAlB,CAApB;AACA,QAAME,WAAW,GAAG,MAAMpD,IAAI,CAACmD,cAAD,EAAiBpD,mBAAjB,CAA9B;AACA,QAAMsD,kBAAkB,aAAM5B,QAAN,cAAkBU,OAAO,CAACC,IAAR,CAAaf,OAAb,CAAqBE,GAAvC,CAAxB;AACA,QAAMP,MAAM,GAAGmB,OAAO,CAACC,IAAR,CAAapB,MAA5B;AAEA,QAAMsC,kBAAkB,GAAGnB,OAAO,CAACC,IAAR,CAAaN,cAAxC;AACA,QAAMyB,kBAAkB,GAAGpB,OAAO,CAACC,IAAR,CAAaoB,cAAxC;AAEA,QAAMpC,OAAO,GAAG;AACdiC,IAAAA,kBADc;AAEdJ,IAAAA,mBAFc;AAGdJ,IAAAA,iBAHc;AAIdE,IAAAA,aAJc;AAKdD,IAAAA,YALc;AAMd9B,IAAAA,MANc;AAOdS,IAAAA,QAPc;AAQdE,IAAAA,aAAa,EAAE1B,eAAe,CAAC2B,eARjB;AASd0B,IAAAA,kBATc;AAUdC,IAAAA,kBAVc;AAWdjD,IAAAA,WAXc;AAYdS,IAAAA;AAZc,GAAhB;AAeA,SAAO,MAAM0C,yBAAyB,CAACtB,OAAO,CAACC,IAAT,EAAegB,WAAf,EAA4BhC,OAA5B,CAAtC;AACD;AASD,OAAO,eAAeqC,yBAAf,CAAyClD,IAAzC,EAA+C6C,WAA/C,EAAqEhC,OAArE,EAAmF;AACxF,MAAI,CAACb,IAAL,EAAW;AACT,WAAO,IAAP;AACD;;AAEDA,EAAAA,IAAI,CAACoB,aAAL,GAAqB1B,eAAe,CAAC2B,eAArC;AACArB,EAAAA,IAAI,CAACsB,cAAL,GAAsBtB,IAAI,CAACuB,cAA3B;AACAvB,EAAAA,IAAI,CAACwB,eAAL,GAAuBxB,IAAI,CAACyB,SAA5B;AAEA,QAAM;AAACQ,IAAAA,QAAD;AAAWhC,IAAAA;AAAX,MAAyB,MAAMJ,kBAAkB,CAACgD,WAAD,EAAchC,OAAd,CAAvD;;AAEA,MAAIZ,UAAJ,EAAgB;AACdD,IAAAA,IAAI,CAACC,UAAL,GAAkBA,UAAlB;AACAD,IAAAA,IAAI,CAACc,OAAL,GAAe;AAACE,MAAAA,GAAG,EAAEf,UAAU,CAACkD,OAAX,WAAsBtC,OAAO,CAACK,QAA9B,QAA2C,EAA3C;AAAN,KAAf;AACD;;AAEDlB,EAAAA,IAAI,CAACS,MAAL,GAAcD,SAAS,CAACR,IAAI,CAACS,MAAN,CAAvB;AACAT,EAAAA,IAAI,CAAC0B,IAAL,GAAY3B,WAAW,CAACC,IAAD,CAAvB;AACAA,EAAAA,IAAI,CAACiC,QAAL,GAAgBA,QAAhB;AACAjC,EAAAA,IAAI,CAACmB,EAAL,GAAUnB,IAAI,CAACC,UAAf;AAEA,SAAOD,IAAP;AACD","sourcesContent":["import {Tile3DSubtreeLoader} from '../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\nimport {Tileset3D, LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE} from '@loaders.gl/tiles';\nimport {Subtree} from '../../types';\nimport {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';\n\nfunction getTileType(tile) {\n if (!tile.contentUrl) {\n return TILE_TYPE.EMPTY;\n }\n\n const contentUrl = tile.contentUrl;\n const fileExtension = contentUrl.split('.').pop();\n switch (fileExtension) {\n case 'pnts':\n return TILE_TYPE.POINTCLOUD;\n case 'i3dm':\n case 'b3dm':\n case 'glb':\n case 'gltf':\n return TILE_TYPE.SCENEGRAPH;\n default:\n return fileExtension;\n }\n}\n\nfunction getRefine(refine) {\n switch (refine) {\n case 'REPLACE':\n case 'replace':\n return TILE_REFINEMENT.REPLACE;\n case 'ADD':\n case 'add':\n return TILE_REFINEMENT.ADD;\n default:\n return refine;\n }\n}\n\nexport function normalizeTileData(tile, options) {\n if (!tile) {\n return null;\n }\n if (tile.content) {\n const contentUri = tile.content.uri || tile.content.url;\n tile.contentUrl = `${options.basePath}/${contentUri}`;\n }\n tile.id = tile.contentUrl;\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n tile.type = getTileType(tile);\n tile.refine = getRefine(tile.refine);\n\n return tile;\n}\n\n// normalize tile headers\nexport function normalizeTileHeaders(tileset) {\n const basePath = tileset.basePath;\n const root = normalizeTileData(tileset.root, tileset);\n\n const stack: any[] = [];\n stack.push(root);\n\n while (stack.length > 0) {\n const tile = stack.pop() || {};\n const children = tile.children || [];\n for (const childHeader of children) {\n normalizeTileData(childHeader, {basePath});\n stack.push(childHeader);\n }\n }\n\n return root;\n}\n\n/**\n * Do normalisation of implicit tile headers\n * TODO Check if Tile3D class can be a return type here.\n * @param tileset\n */\nexport async function normalizeImplicitTileHeaders(tileset: Tileset3D) {\n if (!tileset.root) {\n return null;\n }\n\n const basePath = tileset.basePath;\n const implicitTilingExtension = tileset.root.extensions['3DTILES_implicit_tiling'];\n const {\n subdivisionScheme,\n maximumLevel,\n subtreeLevels,\n subtrees: {uri: subtreesUriTemplate}\n } = implicitTilingExtension;\n const subtreeUrl = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);\n const rootSubtreeUrl = `${basePath}/${subtreeUrl}`;\n const rootSubtree = await load(rootSubtreeUrl, Tile3DSubtreeLoader);\n const contentUrlTemplate = `${basePath}/${tileset.root.content.uri}`;\n const refine = tileset.root.refine;\n // @ts-ignore\n const rootLodMetricValue = tileset.root.geometricError;\n const rootBoundingVolume = tileset.root.boundingVolume;\n\n const options = {\n contentUrlTemplate,\n subtreesUriTemplate,\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n refine,\n basePath,\n lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,\n rootLodMetricValue,\n rootBoundingVolume,\n getTileType,\n getRefine\n };\n\n return await normalizeImplicitTileData(tileset.root, rootSubtree, options);\n}\n\n/**\n * Do implicit data normalisation to create hierarchical tile structure\n * @param tile\n * @param rootSubtree\n * @param options\n * @returns\n */\nexport async function normalizeImplicitTileData(tile, rootSubtree: Subtree, options: any) {\n if (!tile) {\n return null;\n }\n\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n\n const {children, contentUrl} = await parseImplicitTiles(rootSubtree, options);\n\n if (contentUrl) {\n tile.contentUrl = contentUrl;\n tile.content = {uri: contentUrl.replace(`${options.basePath}/`, '')};\n }\n\n tile.refine = getRefine(tile.refine);\n tile.type = getTileType(tile);\n tile.children = children;\n tile.id = tile.contentUrl;\n\n return tile;\n}\n"],"file":"parse-3d-tile-header.js"}
@@ -1,2 +1,2 @@
1
- export const VERSION = typeof "3.1.2" !== 'undefined' ? "3.1.2" : 'latest';
1
+ export const VERSION = typeof "3.1.6" !== 'undefined' ? "3.1.6" : 'latest';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-3d-implicit-tiles.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,OAAO,EAAC,MAAM,gBAAgB,CAAC;AAY1D;;;;;;;;;;;GAWG;AAGH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,GAAG,EACZ,UAAU,GAAE;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAKhE,EACD,UAAU,GAAE,MAAU,EACtB,KAAK,GAAE,MAAU,EACjB,UAAU,GAAE;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAM/E;;;;GA6GF;AAqDD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,MAAM,CAGR"}
1
+ {"version":3,"file":"parse-3d-implicit-tiles.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA+B,OAAO,EAAC,MAAM,gBAAgB,CAAC;AAY1E;;;;;;;;;;;GAWG;AAGH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,GAAG,EACZ,UAAU,GAAE;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAKhE,EACD,UAAU,GAAE,MAAU,EACtB,KAAK,GAAE,MAAU,EACjB,UAAU,GAAE;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAM/E;;;;GA8GF;AA8GD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,MAAM,CAGR"}
@@ -95,7 +95,8 @@ async function parseImplicitTiles(subtree, options, parentData = {
95
95
  const currentTile = await parseImplicitTiles(subtree, options, pData, index, childTileLevel, globalData);
96
96
  if (currentTile.contentUrl || currentTile.children.length) {
97
97
  const globalLevel = lev + 1;
98
- const formattedTile = formatTileData(currentTile, globalLevel, options);
98
+ const childCoordinates = { childTileX, childTileY, childTileZ };
99
+ const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);
99
100
  // @ts-ignore
100
101
  tile.children.push(formattedTile);
101
102
  }
@@ -120,11 +121,11 @@ function getAvailabilityResult(availabilityData, index) {
120
121
  * @param options
121
122
  * @returns
122
123
  */
123
- function formatTileData(tile, level, options) {
124
- const { basePath, refine, getRefine, lodMetricType, getTileType, rootLodMetricValue } = options;
124
+ function formatTileData(tile, level, childCoordinates, options) {
125
+ const { basePath, refine, getRefine, lodMetricType, getTileType, rootLodMetricValue, rootBoundingVolume } = options;
125
126
  const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');
126
127
  const lodMetricValue = rootLodMetricValue / 2 ** level;
127
- // TODO handle bounding volume
128
+ const boundingVolume = calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoordinates);
128
129
  return {
129
130
  children: tile.children,
130
131
  contentUrl: tile.contentUrl,
@@ -133,7 +134,8 @@ function formatTileData(tile, level, options) {
133
134
  refine: getRefine(refine),
134
135
  type: getTileType(tile),
135
136
  lodMetricType,
136
- lodMetricValue
137
+ lodMetricValue,
138
+ boundingVolume
137
139
  // Temp debug values. Remove when real implicit tileset will be tested.
138
140
  // x: tile.x,
139
141
  // y: tile.y,
@@ -141,6 +143,35 @@ function formatTileData(tile, level, options) {
141
143
  // level: tile.level
142
144
  };
143
145
  }
146
+ /**
147
+ * Calculate child bounding volume.
148
+ * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subdivision-rules
149
+ * @param level
150
+ * @param rootBoundingVolume
151
+ * @param childCoordinates
152
+ */
153
+ function calculateBoundingVolumeForChildTile(level, rootBoundingVolume, childCoordinates) {
154
+ if (rootBoundingVolume.region) {
155
+ const { childTileX, childTileY, childTileZ } = childCoordinates;
156
+ const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;
157
+ const boundingVolumesCount = 2 ** level;
158
+ const sizeX = (east - west) / boundingVolumesCount;
159
+ const sizeY = (north - south) / boundingVolumesCount;
160
+ const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;
161
+ const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];
162
+ const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];
163
+ const [childMinimumHeight, childMaximumHeight] = [
164
+ minimumHeight + sizeZ * childTileZ,
165
+ minimumHeight + sizeZ * (childTileZ + 1)
166
+ ];
167
+ return {
168
+ region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]
169
+ };
170
+ }
171
+ // eslint-disable-next-line no-console
172
+ console.warn('Unsupported bounding volume type: ', rootBoundingVolume);
173
+ return null;
174
+ }
144
175
  /**
145
176
  * Do binary concatenation
146
177
  * @param first
@@ -1 +1 @@
1
- {"version":3,"file":"parse-3d-tile-header.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-3d-tile-header.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,SAAS,EAA8C,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAC,OAAO,EAAC,MAAM,aAAa,CAAC;AAoCpC,wBAAgB,iBAAiB,CAAC,IAAI,KAAA,EAAE,OAAO,KAAA,OAgB9C;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,KAAA,OAiB3C;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,SAAS,gBAoCpE;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,KAAA,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,gBAsBvF"}
1
+ {"version":3,"file":"parse-3d-tile-header.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-3d-tile-header.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,SAAS,EAA8C,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAC,OAAO,EAAC,MAAM,aAAa,CAAC;AAoCpC,wBAAgB,iBAAiB,CAAC,IAAI,KAAA,EAAE,OAAO,KAAA,OAgB9C;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,KAAA,OAiB3C;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,SAAS,gBAsCpE;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,KAAA,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,gBAsBvF"}
@@ -88,6 +88,7 @@ async function normalizeImplicitTileHeaders(tileset) {
88
88
  const refine = tileset.root.refine;
89
89
  // @ts-ignore
90
90
  const rootLodMetricValue = tileset.root.geometricError;
91
+ const rootBoundingVolume = tileset.root.boundingVolume;
91
92
  const options = {
92
93
  contentUrlTemplate,
93
94
  subtreesUriTemplate,
@@ -98,6 +99,7 @@ async function normalizeImplicitTileHeaders(tileset) {
98
99
  basePath,
99
100
  lodMetricType: tiles_1.LOD_METRIC_TYPE.GEOMETRIC_ERROR,
100
101
  rootLodMetricValue,
102
+ rootBoundingVolume,
101
103
  getTileType,
102
104
  getRefine
103
105
  };
package/dist/types.d.ts CHANGED
@@ -40,9 +40,10 @@ export declare type Node3D = {
40
40
  boundingVolume: BoundingVolume;
41
41
  };
42
42
  };
43
- declare type BoundingVolume = {
43
+ export declare type BoundingVolume = {
44
44
  box?: number[];
45
45
  sphere?: number[];
46
+ region?: number[];
46
47
  };
47
48
  /**
48
49
  * 3DTILES_implicit_tiling types
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAE/C,oBAAY,cAAc,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;CACtB,CAAC;AAEF,oBAAY,WAAW,GAAG;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,uBAAuB,EAAE,OAAO,CAAC;IACjC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAChC,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,oBAAY,UAAU,GAAG;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B,EAAE,MAAM,CAAC;IACnC,wBAAwB,EAAE,MAAM,CAAC;IACjC,4BAA4B,EAAE,MAAM,CAAC;IACrC,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,oBAAY,MAAM,GAAG;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,GAAG,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,cAAc,CAAC;KAChC,CAAC;CACH,CAAC;AAEF,aAAK,cAAc,GAAG;IACpB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,oBAAY,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,gBAAgB,EAAE,YAAY,CAAC;IAC/B,mBAAmB,EAAE,YAAY,CAAC;IAClC,wBAAwB,EAAE,YAAY,CAAC;CACxC,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,CAAC;AAEF,oBAAY,iBAAiB,GAAG,UAAU,CAAC;AAE3C;;GAEG;AACH,oBAAY,iBAAiB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEtD,aAAK,MAAM,GAAG;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,aAAK,UAAU,GAAG;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAE/C,oBAAY,cAAc,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;CACtB,CAAC;AAEF,oBAAY,WAAW,GAAG;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,uBAAuB,EAAE,OAAO,CAAC;IACjC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAChC,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,oBAAY,UAAU,GAAG;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B,EAAE,MAAM,CAAC;IACnC,wBAAwB,EAAE,MAAM,CAAC;IACjC,4BAA4B,EAAE,MAAM,CAAC;IACrC,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,oBAAY,MAAM,GAAG;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,GAAG,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,cAAc,CAAC;KAChC,CAAC;CACH,CAAC;AAEF,oBAAY,cAAc,GAAG;IAC3B,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,oBAAY,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,gBAAgB,EAAE,YAAY,CAAC;IAC/B,mBAAmB,EAAE,YAAY,CAAC;IAClC,wBAAwB,EAAE,YAAY,CAAC;CACxC,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,CAAC;AAEF,oBAAY,iBAAiB,GAAG,UAAU,CAAC;AAE3C;;GAEG;AACH,oBAAY,iBAAiB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEtD,aAAK,MAAM,GAAG;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,aAAK,UAAU,GAAG;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/3d-tiles",
3
- "version": "3.1.2",
3
+ "version": "3.1.6",
4
4
  "description": "3D Tiles, an open standard for streaming massive heterogeneous 3D geospatial datasets.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -34,16 +34,16 @@
34
34
  "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/dist.min.js"
35
35
  },
36
36
  "dependencies": {
37
- "@loaders.gl/draco": "3.1.2",
38
- "@loaders.gl/gltf": "3.1.2",
39
- "@loaders.gl/loader-utils": "3.1.2",
40
- "@loaders.gl/math": "3.1.2",
41
- "@loaders.gl/tiles": "3.1.2",
37
+ "@loaders.gl/draco": "3.1.6",
38
+ "@loaders.gl/gltf": "3.1.6",
39
+ "@loaders.gl/loader-utils": "3.1.6",
40
+ "@loaders.gl/math": "3.1.6",
41
+ "@loaders.gl/tiles": "3.1.6",
42
42
  "@math.gl/core": "^3.5.1",
43
43
  "@math.gl/geospatial": "^3.5.1"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@loaders.gl/core": "3.1.0"
47
47
  },
48
- "gitHead": "5c25bb71a2ac8558ecedf2256cc925427b2a0506"
48
+ "gitHead": "4fe0724b942697a95ff3eb3af47b7a7c18556c52"
49
49
  }
@@ -1,4 +1,4 @@
1
- import type {Availability, Subtree} from '../../../types';
1
+ import type {Availability, BoundingVolume, Subtree} from '../../../types';
2
2
  import {Tile3DSubtreeLoader} from '../../../tile-3d-subtree-loader';
3
3
  import {load} from '@loaders.gl/core';
4
4
 
@@ -143,7 +143,8 @@ export async function parseImplicitTiles(
143
143
 
144
144
  if (currentTile.contentUrl || currentTile.children.length) {
145
145
  const globalLevel = lev + 1;
146
- const formattedTile = formatTileData(currentTile, globalLevel, options);
146
+ const childCoordinates = {childTileX, childTileY, childTileZ};
147
+ const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);
147
148
  // @ts-ignore
148
149
  tile.children.push(formattedTile);
149
150
  }
@@ -172,11 +173,29 @@ function getAvailabilityResult(availabilityData: Availability, index: number): b
172
173
  * @param options
173
174
  * @returns
174
175
  */
175
- function formatTileData(tile, level: number, options: any) {
176
- const {basePath, refine, getRefine, lodMetricType, getTileType, rootLodMetricValue} = options;
176
+ function formatTileData(
177
+ tile,
178
+ level: number,
179
+ childCoordinates: {childTileX: number; childTileY: number; childTileZ: number},
180
+ options: any
181
+ ) {
182
+ const {
183
+ basePath,
184
+ refine,
185
+ getRefine,
186
+ lodMetricType,
187
+ getTileType,
188
+ rootLodMetricValue,
189
+ rootBoundingVolume
190
+ } = options;
177
191
  const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');
178
192
  const lodMetricValue = rootLodMetricValue / 2 ** level;
179
- // TODO handle bounding volume
193
+ const boundingVolume = calculateBoundingVolumeForChildTile(
194
+ level,
195
+ rootBoundingVolume,
196
+ childCoordinates
197
+ );
198
+
180
199
  return {
181
200
  children: tile.children,
182
201
  contentUrl: tile.contentUrl,
@@ -185,7 +204,8 @@ function formatTileData(tile, level: number, options: any) {
185
204
  refine: getRefine(refine),
186
205
  type: getTileType(tile),
187
206
  lodMetricType,
188
- lodMetricValue
207
+ lodMetricValue,
208
+ boundingVolume
189
209
  // Temp debug values. Remove when real implicit tileset will be tested.
190
210
  // x: tile.x,
191
211
  // y: tile.y,
@@ -194,6 +214,44 @@ function formatTileData(tile, level: number, options: any) {
194
214
  };
195
215
  }
196
216
 
217
+ /**
218
+ * Calculate child bounding volume.
219
+ * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subdivision-rules
220
+ * @param level
221
+ * @param rootBoundingVolume
222
+ * @param childCoordinates
223
+ */
224
+ function calculateBoundingVolumeForChildTile(
225
+ level: number,
226
+ rootBoundingVolume: BoundingVolume,
227
+ childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}
228
+ ): BoundingVolume | null {
229
+ if (rootBoundingVolume.region) {
230
+ const {childTileX, childTileY, childTileZ} = childCoordinates;
231
+ const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;
232
+ const boundingVolumesCount = 2 ** level;
233
+
234
+ const sizeX = (east - west) / boundingVolumesCount;
235
+ const sizeY = (north - south) / boundingVolumesCount;
236
+ const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;
237
+
238
+ const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];
239
+ const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];
240
+ const [childMinimumHeight, childMaximumHeight] = [
241
+ minimumHeight + sizeZ * childTileZ,
242
+ minimumHeight + sizeZ * (childTileZ + 1)
243
+ ];
244
+
245
+ return {
246
+ region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]
247
+ };
248
+ }
249
+
250
+ // eslint-disable-next-line no-console
251
+ console.warn('Unsupported bounding volume type: ', rootBoundingVolume);
252
+ return null;
253
+ }
254
+
197
255
  /**
198
256
  * Do binary concatenation
199
257
  * @param first
@@ -100,6 +100,7 @@ export async function normalizeImplicitTileHeaders(tileset: Tileset3D) {
100
100
  const refine = tileset.root.refine;
101
101
  // @ts-ignore
102
102
  const rootLodMetricValue = tileset.root.geometricError;
103
+ const rootBoundingVolume = tileset.root.boundingVolume;
103
104
 
104
105
  const options = {
105
106
  contentUrlTemplate,
@@ -111,6 +112,7 @@ export async function normalizeImplicitTileHeaders(tileset: Tileset3D) {
111
112
  basePath,
112
113
  lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,
113
114
  rootLodMetricValue,
115
+ rootBoundingVolume,
114
116
  getTileType,
115
117
  getRefine
116
118
  };
package/src/types.ts CHANGED
@@ -45,9 +45,10 @@ export type Node3D = {
45
45
  };
46
46
  };
47
47
 
48
- type BoundingVolume = {
48
+ export type BoundingVolume = {
49
49
  box?: number[];
50
50
  sphere?: number[];
51
+ region?: number[];
51
52
  };
52
53
 
53
54
  /**