@loaders.gl/3d-tiles 3.3.0-alpha.3 → 3.3.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.min.js +60 -33
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js +2 -0
- package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js +47 -18
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-header.js +153 -69
- package/dist/es5/lib/parsers/parse-3d-tile-header.js.map +1 -1
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/es5/tiles-3d-loader.js +5 -26
- package/dist/es5/tiles-3d-loader.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js +2 -0
- package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js +28 -7
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-header.js +38 -20
- package/dist/esm/lib/parsers/parse-3d-tile-header.js.map +1 -1
- package/dist/esm/lib/utils/version.js +1 -1
- package/dist/esm/tiles-3d-loader.js +2 -9
- package/dist/esm/tiles-3d-loader.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.js +2 -13
- package/dist/lib/parsers/helpers/parse-3d-tile-subtree.d.ts +2 -1
- package/dist/lib/parsers/helpers/parse-3d-tile-subtree.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/parse-3d-tile-subtree.js +36 -7
- package/dist/lib/parsers/parse-3d-tile-header.d.ts +5 -4
- package/dist/lib/parsers/parse-3d-tile-header.d.ts.map +1 -1
- package/dist/lib/parsers/parse-3d-tile-header.js +37 -18
- package/dist/tiles-3d-loader.d.ts.map +1 -1
- package/dist/tiles-3d-loader.js +1 -8
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/index.ts +1 -1
- package/src/lib/parsers/helpers/parse-3d-implicit-tiles.ts +2 -14
- package/src/lib/parsers/helpers/parse-3d-tile-subtree.ts +50 -7
- package/src/lib/parsers/parse-3d-tile-header.ts +59 -21
- package/src/tiles-3d-loader.ts +2 -16
- package/src/types.ts +15 -0
package/dist/dist.min.js
CHANGED
|
@@ -11464,7 +11464,7 @@
|
|
|
11464
11464
|
metallicFactor: 1,
|
|
11465
11465
|
roughnessFactor: 1
|
|
11466
11466
|
};
|
|
11467
|
-
const textureId = material.values?.tex || material.values?.texture2d_0;
|
|
11467
|
+
const textureId = material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;
|
|
11468
11468
|
const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);
|
|
11469
11469
|
if (textureIndex !== -1) {
|
|
11470
11470
|
material.pbrMetallicRoughness.baseColorTexture = { index: textureIndex };
|
|
@@ -12007,10 +12007,13 @@
|
|
|
12007
12007
|
async function loadImage(gltf, image, index, options, context) {
|
|
12008
12008
|
const { fetch: fetch2, parse: parse5 } = context;
|
|
12009
12009
|
let arrayBuffer;
|
|
12010
|
-
if (image.uri) {
|
|
12010
|
+
if (image.uri && !image.hasOwnProperty("bufferView")) {
|
|
12011
12011
|
const uri = resolveUrl(image.uri, options);
|
|
12012
12012
|
const response = await fetch2(uri);
|
|
12013
12013
|
arrayBuffer = await response.arrayBuffer();
|
|
12014
|
+
image.bufferView = {
|
|
12015
|
+
data: arrayBuffer
|
|
12016
|
+
};
|
|
12014
12017
|
}
|
|
12015
12018
|
if (Number.isFinite(image.bufferView)) {
|
|
12016
12019
|
const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);
|
|
@@ -12408,7 +12411,7 @@
|
|
|
12408
12411
|
});
|
|
12409
12412
|
|
|
12410
12413
|
// src/lib/parsers/helpers/parse-3d-tile-subtree.ts
|
|
12411
|
-
async function parse3DTilesSubtree(data) {
|
|
12414
|
+
async function parse3DTilesSubtree(data, options, context) {
|
|
12412
12415
|
const magic = new Uint32Array(data.slice(0, 4));
|
|
12413
12416
|
if (magic[0] !== SUBTREE_FILE_MAGIC) {
|
|
12414
12417
|
throw new Error("Wrong subtree file magic number");
|
|
@@ -12428,22 +12431,39 @@
|
|
|
12428
12431
|
internalBinaryBuffer = data.slice(24 + jsonByteLength);
|
|
12429
12432
|
}
|
|
12430
12433
|
if ("bufferView" in subtree.tileAvailability) {
|
|
12431
|
-
subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(subtree, "tileAvailability", internalBinaryBuffer);
|
|
12434
|
+
subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(subtree, "tileAvailability", internalBinaryBuffer, context);
|
|
12432
12435
|
}
|
|
12433
12436
|
if ("bufferView" in subtree.contentAvailability) {
|
|
12434
|
-
subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(subtree, "contentAvailability", internalBinaryBuffer);
|
|
12437
|
+
subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(subtree, "contentAvailability", internalBinaryBuffer, context);
|
|
12435
12438
|
}
|
|
12436
12439
|
if ("bufferView" in subtree.childSubtreeAvailability) {
|
|
12437
|
-
subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(subtree, "childSubtreeAvailability", internalBinaryBuffer);
|
|
12440
|
+
subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(subtree, "childSubtreeAvailability", internalBinaryBuffer, context);
|
|
12438
12441
|
}
|
|
12439
12442
|
return subtree;
|
|
12440
12443
|
}
|
|
12441
|
-
|
|
12444
|
+
function resolveBufferUri(bitstreamRelativeUri, basePath) {
|
|
12445
|
+
const hasProtocol = basePath.startsWith("http");
|
|
12446
|
+
if (hasProtocol) {
|
|
12447
|
+
const resolvedUri2 = new URL(bitstreamRelativeUri, basePath);
|
|
12448
|
+
return decodeURI(resolvedUri2.toString());
|
|
12449
|
+
}
|
|
12450
|
+
const basePathWithProtocol = `http://${basePath}`;
|
|
12451
|
+
const resolvedUri = new URL(bitstreamRelativeUri, basePathWithProtocol);
|
|
12452
|
+
return `/${resolvedUri.host}${resolvedUri.pathname}`;
|
|
12453
|
+
}
|
|
12454
|
+
async function getExplicitBitstream(subtree, name10, internalBinaryBuffer, context) {
|
|
12442
12455
|
const bufferViewIndex = subtree[name10].bufferView;
|
|
12443
12456
|
const bufferView = subtree.bufferViews[bufferViewIndex];
|
|
12444
12457
|
const buffer = subtree.buffers[bufferView.buffer];
|
|
12458
|
+
if (!context?.url || !context.fetch) {
|
|
12459
|
+
throw new Error("Url is not provided");
|
|
12460
|
+
}
|
|
12461
|
+
if (!context.fetch) {
|
|
12462
|
+
throw new Error("fetch is not provided");
|
|
12463
|
+
}
|
|
12445
12464
|
if (buffer.uri) {
|
|
12446
|
-
const
|
|
12465
|
+
const bufferUri = resolveBufferUri(buffer.uri, context?.url);
|
|
12466
|
+
const response = await context.fetch(bufferUri);
|
|
12447
12467
|
const data = await response.arrayBuffer();
|
|
12448
12468
|
return new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength);
|
|
12449
12469
|
}
|
|
@@ -12458,7 +12478,6 @@
|
|
|
12458
12478
|
var SUBTREE_FILE_MAGIC, SUBTREE_FILE_VERSION;
|
|
12459
12479
|
var init_parse_3d_tile_subtree = __esm({
|
|
12460
12480
|
"src/lib/parsers/helpers/parse-3d-tile-subtree.ts"() {
|
|
12461
|
-
init_src3();
|
|
12462
12481
|
SUBTREE_FILE_MAGIC = 1952609651;
|
|
12463
12482
|
SUBTREE_FILE_VERSION = 1;
|
|
12464
12483
|
}
|
|
@@ -12607,6 +12626,8 @@
|
|
|
12607
12626
|
type: getTileType2(tile),
|
|
12608
12627
|
lodMetricType,
|
|
12609
12628
|
lodMetricValue,
|
|
12629
|
+
geometricError: lodMetricValue,
|
|
12630
|
+
transform: tile.transform,
|
|
12610
12631
|
boundingVolume
|
|
12611
12632
|
};
|
|
12612
12633
|
}
|
|
@@ -12722,41 +12743,48 @@
|
|
|
12722
12743
|
tile.refine = getRefine(tile.refine);
|
|
12723
12744
|
return tile;
|
|
12724
12745
|
}
|
|
12725
|
-
function normalizeTileHeaders(tileset) {
|
|
12746
|
+
async function normalizeTileHeaders(tileset, options) {
|
|
12726
12747
|
const basePath = tileset.basePath;
|
|
12727
|
-
|
|
12748
|
+
let root;
|
|
12749
|
+
const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset?.root);
|
|
12750
|
+
if (rootImplicitTilingExtension && tileset.root) {
|
|
12751
|
+
root = await normalizeImplicitTileHeaders(tileset.root, tileset, rootImplicitTilingExtension, options);
|
|
12752
|
+
} else {
|
|
12753
|
+
root = normalizeTileData(tileset.root, tileset);
|
|
12754
|
+
}
|
|
12728
12755
|
const stack2 = [];
|
|
12729
12756
|
stack2.push(root);
|
|
12730
12757
|
while (stack2.length > 0) {
|
|
12731
12758
|
const tile = stack2.pop() || {};
|
|
12732
12759
|
const children = tile.children || [];
|
|
12733
|
-
for (
|
|
12734
|
-
|
|
12760
|
+
for (let childHeader of children) {
|
|
12761
|
+
const childImplicitTilingExtension = getImplicitTilingExtensionData(childHeader);
|
|
12762
|
+
if (childImplicitTilingExtension) {
|
|
12763
|
+
childHeader = await normalizeImplicitTileHeaders(childHeader, tileset, childImplicitTilingExtension, options);
|
|
12764
|
+
} else {
|
|
12765
|
+
normalizeTileData(childHeader, { basePath });
|
|
12766
|
+
}
|
|
12735
12767
|
stack2.push(childHeader);
|
|
12736
12768
|
}
|
|
12737
12769
|
}
|
|
12738
12770
|
return root;
|
|
12739
12771
|
}
|
|
12740
|
-
async function normalizeImplicitTileHeaders(tileset) {
|
|
12741
|
-
if (!tileset.root) {
|
|
12742
|
-
return null;
|
|
12743
|
-
}
|
|
12772
|
+
async function normalizeImplicitTileHeaders(tile, tileset, implicitTilingExtension, options) {
|
|
12744
12773
|
const basePath = tileset.basePath;
|
|
12745
|
-
const implicitTilingExtension = tileset.root.extensions["3DTILES_implicit_tiling"];
|
|
12746
12774
|
const {
|
|
12747
12775
|
subdivisionScheme,
|
|
12748
12776
|
maximumLevel,
|
|
12749
12777
|
subtreeLevels,
|
|
12750
12778
|
subtrees: { uri: subtreesUriTemplate }
|
|
12751
12779
|
} = implicitTilingExtension;
|
|
12752
|
-
const
|
|
12753
|
-
const
|
|
12754
|
-
const
|
|
12755
|
-
const contentUrlTemplate = resolveUri(
|
|
12756
|
-
const refine = tileset
|
|
12757
|
-
const rootLodMetricValue =
|
|
12758
|
-
const rootBoundingVolume =
|
|
12759
|
-
const
|
|
12780
|
+
const replacedUrlTemplate = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);
|
|
12781
|
+
const subtreeUrl = resolveUri(replacedUrlTemplate, basePath);
|
|
12782
|
+
const subtree = await load(subtreeUrl, Tile3DSubtreeLoader, options);
|
|
12783
|
+
const contentUrlTemplate = resolveUri(tile.content.uri, basePath);
|
|
12784
|
+
const refine = tileset?.root?.refine;
|
|
12785
|
+
const rootLodMetricValue = tile.geometricError;
|
|
12786
|
+
const rootBoundingVolume = tile.boundingVolume;
|
|
12787
|
+
const implicitOptions = {
|
|
12760
12788
|
contentUrlTemplate,
|
|
12761
12789
|
subtreesUriTemplate,
|
|
12762
12790
|
subdivisionScheme,
|
|
@@ -12770,7 +12798,7 @@
|
|
|
12770
12798
|
getTileType,
|
|
12771
12799
|
getRefine
|
|
12772
12800
|
};
|
|
12773
|
-
return await normalizeImplicitTileData(
|
|
12801
|
+
return await normalizeImplicitTileData(tile, subtree, implicitOptions);
|
|
12774
12802
|
}
|
|
12775
12803
|
async function normalizeImplicitTileData(tile, rootSubtree, options) {
|
|
12776
12804
|
if (!tile) {
|
|
@@ -12790,6 +12818,9 @@
|
|
|
12790
12818
|
tile.id = tile.contentUrl;
|
|
12791
12819
|
return tile;
|
|
12792
12820
|
}
|
|
12821
|
+
function getImplicitTilingExtensionData(tile) {
|
|
12822
|
+
return tile?.extensions?.["3DTILES_implicit_tiling"] || tile?.implicitTiling;
|
|
12823
|
+
}
|
|
12793
12824
|
var init_parse_3d_tile_header2 = __esm({
|
|
12794
12825
|
"src/lib/parsers/parse-3d-tile-header.ts"() {
|
|
12795
12826
|
init_tile_3d_subtree_loader();
|
|
@@ -12818,7 +12849,7 @@
|
|
|
12818
12849
|
tilesetJson.loader = options.loader || Tiles3DLoader;
|
|
12819
12850
|
tilesetJson.url = context.url;
|
|
12820
12851
|
tilesetJson.basePath = getBaseUri(tilesetJson);
|
|
12821
|
-
tilesetJson.root =
|
|
12852
|
+
tilesetJson.root = await normalizeTileHeaders(tilesetJson, options);
|
|
12822
12853
|
tilesetJson.type = TILESET_TYPE.TILES3D;
|
|
12823
12854
|
tilesetJson.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;
|
|
12824
12855
|
tilesetJson.lodMetricValue = tilesetJson.root?.lodMetricValue || 0;
|
|
@@ -12839,10 +12870,7 @@
|
|
|
12839
12870
|
}
|
|
12840
12871
|
return data;
|
|
12841
12872
|
}
|
|
12842
|
-
|
|
12843
|
-
return tilesetJson?.extensionsRequired?.includes(IMPLICIT_TILING_EXTENSION_NAME) && tilesetJson?.extensionsUsed?.includes(IMPLICIT_TILING_EXTENSION_NAME);
|
|
12844
|
-
}
|
|
12845
|
-
var IMPLICIT_TILING_EXTENSION_NAME, Tiles3DLoader;
|
|
12873
|
+
var Tiles3DLoader;
|
|
12846
12874
|
var init_tiles_3d_loader = __esm({
|
|
12847
12875
|
"src/tiles-3d-loader.ts"() {
|
|
12848
12876
|
init_src2();
|
|
@@ -12850,7 +12878,6 @@
|
|
|
12850
12878
|
init_version2();
|
|
12851
12879
|
init_parse_3d_tile();
|
|
12852
12880
|
init_parse_3d_tile_header2();
|
|
12853
|
-
IMPLICIT_TILING_EXTENSION_NAME = "3DTILES_implicit_tiling";
|
|
12854
12881
|
Tiles3DLoader = {
|
|
12855
12882
|
id: "3d-tiles",
|
|
12856
12883
|
name: "3D Tiles",
|
package/dist/es5/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AAGA;;AAGA;;AACA;;AAGA;;AACA","sourcesContent":["// LOADERS\nexport {Tiles3DLoader} from './tiles-3d-loader';\nexport {CesiumIonLoader} from './cesium-ion-loader';\nexport {Tile3DSubtreeLoader} from './tile-3d-subtree-loader';\n\n// WRITERS\nexport {Tile3DWriter} from './tile-3d-writer';\n\n// CLASSES\nexport {default as Tile3DFeatureTable} from './lib/classes/tile-3d-feature-table';\nexport {default as Tile3DBatchTable} from './lib/classes/tile-3d-batch-table';\n\n// EXPERIMENTAL\nexport {TILE3D_TYPE} from './lib/constants';\nexport {getIonTilesetMetadata as _getIonTilesetMetadata} from './lib/ion/ion';\nexport type {FeatureTableJson, B3DMContent, Node3D} from './types';\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AAGA;;AAGA;;AACA;;AAGA;;AACA","sourcesContent":["// LOADERS\nexport {Tiles3DLoader} from './tiles-3d-loader';\nexport {CesiumIonLoader} from './cesium-ion-loader';\nexport {Tile3DSubtreeLoader} from './tile-3d-subtree-loader';\n\n// WRITERS\nexport {Tile3DWriter} from './tile-3d-writer';\n\n// CLASSES\nexport {default as Tile3DFeatureTable} from './lib/classes/tile-3d-feature-table';\nexport {default as Tile3DBatchTable} from './lib/classes/tile-3d-batch-table';\n\n// EXPERIMENTAL\nexport {TILE3D_TYPE} from './lib/constants';\nexport {getIonTilesetMetadata as _getIonTilesetMetadata} from './lib/ion/ion';\nexport type {FeatureTableJson, B3DMContent, Node3D, ImplicitTilingExtension} from './types';\n"],"file":"index.js"}
|
|
@@ -210,6 +210,8 @@ function formatTileData(tile, level, childCoordinates, options) {
|
|
|
210
210
|
type: getTileType(tile),
|
|
211
211
|
lodMetricType: lodMetricType,
|
|
212
212
|
lodMetricValue: lodMetricValue,
|
|
213
|
+
geometricError: lodMetricValue,
|
|
214
|
+
transform: tile.transform,
|
|
213
215
|
boundingVolume: boundingVolume
|
|
214
216
|
};
|
|
215
217
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"names":["QUADTREE_DEVISION_COUNT","OCTREE_DEVISION_COUNT","SUBDIVISION_COUNT_MAP","QUADTREE","OCTREE","parseImplicitTiles","params","options","parentData","mortonIndex","x","y","z","childIndex","globalData","level","subtree","subdivisionScheme","subtreeLevels","maximumLevel","contentUrlTemplate","subtreesUriTemplate","basePath","tile","children","lodMetricValue","contentUrl","childrenPerTile","childX","childY","childZ","levelOffset","childTileMortonIndex","concatBits","tileAvailabilityIndex","childTileX","childTileY","childTileZ","isChildSubtreeAvailable","getAvailabilityResult","childSubtreeAvailability","lev","subtreePath","childSubtreeUrl","replaceContentUrlTemplate","Tile3DSubtreeLoader","childSubtree","isTileAvailable","tileAvailability","isContentAvailable","contentAvailability","childTileLevel","pData","index","currentTile","length","globalLevel","childCoordinates","formattedTile","formatTileData","push","availabilityData","Boolean","constant","explicitBitstream","getBooleanValueFromBitstream","refine","getRefine","lodMetricType","getTileType","rootLodMetricValue","rootBoundingVolume","uri","replace","boundingVolume","calculateBoundingVolumeForChildTile","content","id","type","region","west","south","east","north","minimumHeight","maximumHeight","boundingVolumesCount","sizeX","sizeY","sizeZ","childWest","childEast","childSouth","childNorth","childMinimumHeight","childMaximumHeight","console","warn","first","second","parseInt","toString","templateUrl","mapUrl","generateMapUrl","matched","items","key","availabilityIndex","availabilityBuffer","byteIndex","Math","floor","bitIndex","bitValue"],"mappings":"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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-statements\nexport async function parseImplicitTiles(params: {\n subtree: Subtree;\n options: any;\n parentData?: {mortonIndex: number; x: number; y: number; z: number};\n childIndex?: number;\n level?: number;\n globalData?: {level: number; mortonIndex: number; x: number; y: number; z: number};\n}) {\n const {\n options,\n parentData = {\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n },\n childIndex = 0,\n globalData = {\n level: 0,\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n }\n } = params;\n let {subtree, level = 0} = params;\n const {\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n contentUrlTemplate,\n subtreesUriTemplate,\n basePath\n } = options;\n\n const tile = {children: [], lodMetricValue: 0, contentUrl: ''};\n\n const childrenPerTile = SUBDIVISION_COUNT_MAP[subdivisionScheme];\n\n const childX = childIndex & 0b01;\n const childY = (childIndex >> 1) & 0b01;\n const childZ = (childIndex >> 2) & 0b01;\n\n const levelOffset = (childrenPerTile ** level - 1) / (childrenPerTile - 1);\n let childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex);\n let tileAvailabilityIndex = levelOffset + childTileMortonIndex;\n\n // Local tile coordinates\n let childTileX = concatBits(parentData.x, childX);\n let childTileY = concatBits(parentData.y, childY);\n let childTileZ = concatBits(parentData.z, childZ);\n\n // TODO Remove after real implicit tileset will be tested.\n // Degug data\n // tile.level = level + globalData.level;\n // tile.x = concatBits(globalData.x, childTileX);\n // tile.y = concatBits(globalData.y, childTileY);\n // tile.z = concatBits(globalData.z, childTileZ);\n // tile.mortonIndex = childTileMortonIndex;\n // End of debug data\n\n let isChildSubtreeAvailable = false;\n\n if (level + 1 > subtreeLevels) {\n isChildSubtreeAvailable = getAvailabilityResult(\n subtree.childSubtreeAvailability,\n childTileMortonIndex\n );\n }\n\n const x = concatBits(globalData.x, childTileX);\n const y = concatBits(globalData.y, childTileY);\n const z = concatBits(globalData.z, childTileZ);\n const lev = level + globalData.level;\n\n if (isChildSubtreeAvailable) {\n const subtreePath = `${basePath}/${subtreesUriTemplate}`;\n const childSubtreeUrl = replaceContentUrlTemplate(subtreePath, lev, x, y, z);\n const childSubtree = await load(childSubtreeUrl, Tile3DSubtreeLoader);\n\n subtree = childSubtree;\n\n globalData.mortonIndex = childTileMortonIndex;\n globalData.x = childTileX;\n globalData.y = childTileY;\n globalData.z = childTileZ;\n globalData.level = level;\n\n childTileMortonIndex = 0;\n tileAvailabilityIndex = 0;\n childTileX = 0;\n childTileY = 0;\n childTileZ = 0;\n level = 0;\n }\n\n const isTileAvailable = getAvailabilityResult(subtree.tileAvailability, tileAvailabilityIndex);\n\n if (!isTileAvailable || level > maximumLevel) {\n return tile;\n }\n\n const isContentAvailable = getAvailabilityResult(\n subtree.contentAvailability,\n tileAvailabilityIndex\n );\n\n if (isContentAvailable) {\n tile.contentUrl = replaceContentUrlTemplate(contentUrlTemplate, lev, x, y, z);\n }\n\n const childTileLevel = level + 1;\n const pData = {mortonIndex: childTileMortonIndex, x: childTileX, y: childTileY, z: childTileZ};\n\n for (let index = 0; index < childrenPerTile; index++) {\n const currentTile = await parseImplicitTiles({\n subtree,\n options,\n parentData: pData,\n childIndex: index,\n level: childTileLevel,\n globalData\n });\n\n if (currentTile.contentUrl || currentTile.children.length) {\n const globalLevel = lev + 1;\n const childCoordinates = {childTileX, childTileY, childTileZ};\n const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);\n // @ts-ignore\n tile.children.push(formattedTile);\n }\n }\n\n return tile;\n}\n\nfunction getAvailabilityResult(availabilityData: Availability, index: number): boolean {\n if ('constant' in availabilityData) {\n return Boolean(availabilityData.constant);\n }\n\n if (availabilityData.explicitBitstream) {\n return getBooleanValueFromBitstream(index, availabilityData.explicitBitstream);\n }\n\n return false;\n}\n\n/**\n * Do formatting of implicit tile data.\n * TODO Check out do we able to use Tile3D class as type here.\n * @param tile\n * @param lodMetricValue\n * @param options\n * @returns\n */\nfunction formatTileData(\n tile,\n level: number,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number},\n options: any\n) {\n const {\n basePath,\n refine,\n getRefine,\n lodMetricType,\n getTileType,\n rootLodMetricValue,\n rootBoundingVolume\n } = options;\n const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');\n const lodMetricValue = rootLodMetricValue / 2 ** level;\n const boundingVolume = calculateBoundingVolumeForChildTile(\n level,\n rootBoundingVolume,\n childCoordinates\n );\n\n return {\n children: tile.children,\n contentUrl: tile.contentUrl,\n content: {uri},\n id: tile.contentUrl,\n refine: getRefine(refine),\n type: getTileType(tile),\n lodMetricType,\n lodMetricValue,\n boundingVolume\n // Temp debug values. Remove when real implicit tileset will be tested.\n // x: tile.x,\n // y: tile.y,\n // z: tile.z,\n // level: tile.level\n };\n}\n\n/**\n * Calculate child bounding volume.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subdivision-rules\n * @param level\n * @param rootBoundingVolume\n * @param childCoordinates\n */\nfunction calculateBoundingVolumeForChildTile(\n level: number,\n rootBoundingVolume: BoundingVolume,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}\n): BoundingVolume | null {\n if (rootBoundingVolume.region) {\n const {childTileX, childTileY, childTileZ} = childCoordinates;\n const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;\n const boundingVolumesCount = 2 ** level;\n\n const sizeX = (east - west) / boundingVolumesCount;\n const sizeY = (north - south) / boundingVolumesCount;\n const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;\n\n const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];\n const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];\n const [childMinimumHeight, childMaximumHeight] = [\n minimumHeight + sizeZ * childTileZ,\n minimumHeight + sizeZ * (childTileZ + 1)\n ];\n\n return {\n region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]\n };\n }\n\n // eslint-disable-next-line no-console\n console.warn('Unsupported bounding volume type: ', rootBoundingVolume);\n return null;\n}\n\n/**\n * Do binary concatenation\n * @param first\n * @param second\n */\nfunction concatBits(first: number, second: number): number {\n return parseInt(first.toString(2) + second.toString(2), 2);\n}\n\n/**\n * Replace implicit tile content url with real coordinates.\n * @param templateUrl\n * @param level\n * @param x\n * @param y\n * @param z\n */\nexport function replaceContentUrlTemplate(\n templateUrl: string,\n level: number,\n x: number,\n y: number,\n z: number\n): string {\n const mapUrl = generateMapUrl({level, x, y, z});\n return templateUrl.replace(/{level}|{x}|{y}|{z}/gi, (matched) => mapUrl[matched]);\n}\n\n/**\n * Get Map object for content url generation\n * @param items\n */\nfunction generateMapUrl(items: {[key: string]: number}): {[key: string]: string} {\n const mapUrl = {};\n\n for (const key in items) {\n mapUrl[`{${key}}`] = items[key];\n }\n return mapUrl;\n}\n\n/**\n * Get boolean value from bistream by index\n * A boolean value is encoded as a single bit, either 0 (false) or 1 (true).\n * Multiple boolean values are packed tightly in the same buffer.\n * These buffers of tightly-packed bits are sometimes referred to as bitstreams.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/implicit-revisions/specification/Metadata#booleans\n * @param availabilitiIndex\n */\nfunction getBooleanValueFromBitstream(\n availabilityIndex: number,\n availabilityBuffer: Uint8Array\n): boolean {\n const byteIndex = Math.floor(availabilityIndex / 8);\n const bitIndex = availabilityIndex % 8;\n const bitValue = (availabilityBuffer[byteIndex] >> bitIndex) & 1;\n\n return bitValue === 1;\n}\n"],"file":"parse-3d-implicit-tiles.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-implicit-tiles.ts"],"names":["QUADTREE_DEVISION_COUNT","OCTREE_DEVISION_COUNT","SUBDIVISION_COUNT_MAP","QUADTREE","OCTREE","parseImplicitTiles","params","options","parentData","mortonIndex","x","y","z","childIndex","globalData","level","subtree","subdivisionScheme","subtreeLevels","maximumLevel","contentUrlTemplate","subtreesUriTemplate","basePath","tile","children","lodMetricValue","contentUrl","childrenPerTile","childX","childY","childZ","levelOffset","childTileMortonIndex","concatBits","tileAvailabilityIndex","childTileX","childTileY","childTileZ","isChildSubtreeAvailable","getAvailabilityResult","childSubtreeAvailability","lev","subtreePath","childSubtreeUrl","replaceContentUrlTemplate","Tile3DSubtreeLoader","childSubtree","isTileAvailable","tileAvailability","isContentAvailable","contentAvailability","childTileLevel","pData","index","currentTile","length","globalLevel","childCoordinates","formattedTile","formatTileData","push","availabilityData","Boolean","constant","explicitBitstream","getBooleanValueFromBitstream","refine","getRefine","lodMetricType","getTileType","rootLodMetricValue","rootBoundingVolume","uri","replace","boundingVolume","calculateBoundingVolumeForChildTile","content","id","type","geometricError","transform","region","west","south","east","north","minimumHeight","maximumHeight","boundingVolumesCount","sizeX","sizeY","sizeZ","childWest","childEast","childSouth","childNorth","childMinimumHeight","childMaximumHeight","console","warn","first","second","parseInt","toString","templateUrl","mapUrl","generateMapUrl","matched","items","key","availabilityIndex","availabilityBuffer","byteIndex","Math","floor","bitIndex","bitValue"],"mappings":";;;;;;;;;;;;;;;;AACA;;AACA;;AAEA,IAAMA,uBAAuB,GAAG,CAAhC;AACA,IAAMC,qBAAqB,GAAG,CAA9B;AAEA,IAAMC,qBAAqB,GAAG;AAC5BC,EAAAA,QAAQ,EAAEH,uBADkB;AAE5BI,EAAAA,MAAM,EAAEH;AAFoB,CAA9B;;SAkBsBI,kB;;;;;kFAAf,iBAAkCC,MAAlC;AAAA;;AAAA;AAAA;AAAA;AAAA;AASHC,YAAAA,OATG,GAwBDD,MAxBC,CASHC,OATG,uBAwBDD,MAxBC,CAUHE,UAVG,EAUHA,UAVG,mCAUU;AACXC,cAAAA,WAAW,EAAE,CADF;AAEXC,cAAAA,CAAC,EAAE,CAFQ;AAGXC,cAAAA,CAAC,EAAE,CAHQ;AAIXC,cAAAA,CAAC,EAAE;AAJQ,aAVV,4CAwBDN,MAxBC,CAgBHO,UAhBG,EAgBHA,UAhBG,mCAgBU,CAhBV,4CAwBDP,MAxBC,CAiBHQ,UAjBG,EAiBHA,UAjBG,mCAiBU;AACXC,cAAAA,KAAK,EAAE,CADI;AAEXN,cAAAA,WAAW,EAAE,CAFF;AAGXC,cAAAA,CAAC,EAAE,CAHQ;AAIXC,cAAAA,CAAC,EAAE,CAJQ;AAKXC,cAAAA,CAAC,EAAE;AALQ,aAjBV;AAyBAI,YAAAA,OAzBA,GAyBsBV,MAzBtB,CAyBAU,OAzBA,kBAyBsBV,MAzBtB,CAyBSS,KAzBT,EAyBSA,KAzBT,8BAyBiB,CAzBjB;AA2BHE,YAAAA,iBA3BG,GAiCDV,OAjCC,CA2BHU,iBA3BG,EA4BHC,aA5BG,GAiCDX,OAjCC,CA4BHW,aA5BG,EA6BHC,YA7BG,GAiCDZ,OAjCC,CA6BHY,YA7BG,EA8BHC,kBA9BG,GAiCDb,OAjCC,CA8BHa,kBA9BG,EA+BHC,mBA/BG,GAiCDd,OAjCC,CA+BHc,mBA/BG,EAgCHC,QAhCG,GAiCDf,OAjCC,CAgCHe,QAhCG;AAmCCC,YAAAA,IAnCD,GAmCQ;AAACC,cAAAA,QAAQ,EAAE,EAAX;AAAeC,cAAAA,cAAc,EAAE,CAA/B;AAAkCC,cAAAA,UAAU,EAAE;AAA9C,aAnCR;AAqCCC,YAAAA,eArCD,GAqCmBzB,qBAAqB,CAACe,iBAAD,CArCxC;AAuCCW,YAAAA,MAvCD,GAuCUf,UAAU,GAAG,CAvCvB;AAwCCgB,YAAAA,MAxCD,GAwCWhB,UAAU,IAAI,CAAf,GAAoB,CAxC9B;AAyCCiB,YAAAA,MAzCD,GAyCWjB,UAAU,IAAI,CAAf,GAAoB,CAzC9B;AA2CCkB,YAAAA,WA3CD,GA2Ce,CAAC,SAAAJ,eAAe,EAAIZ,KAAJ,CAAf,GAA2B,CAA5B,KAAkCY,eAAe,GAAG,CAApD,CA3Cf;AA4CDK,YAAAA,oBA5CC,GA4CsBC,UAAU,CAACzB,UAAU,CAACC,WAAZ,EAAyBI,UAAzB,CA5ChC;AA6CDqB,YAAAA,qBA7CC,GA6CuBH,WAAW,GAAGC,oBA7CrC;AAgDDG,YAAAA,UAhDC,GAgDYF,UAAU,CAACzB,UAAU,CAACE,CAAZ,EAAekB,MAAf,CAhDtB;AAiDDQ,YAAAA,UAjDC,GAiDYH,UAAU,CAACzB,UAAU,CAACG,CAAZ,EAAekB,MAAf,CAjDtB;AAkDDQ,YAAAA,UAlDC,GAkDYJ,UAAU,CAACzB,UAAU,CAACI,CAAZ,EAAekB,MAAf,CAlDtB;AAoDDQ,YAAAA,uBApDC,GAoDyB,KApDzB;;AAsDL,gBAAIvB,KAAK,GAAG,CAAR,GAAYG,aAAhB,EAA+B;AAC7BoB,cAAAA,uBAAuB,GAAGC,qBAAqB,CAC7CvB,OAAO,CAACwB,wBADqC,EAE7CR,oBAF6C,CAA/C;AAID;;AAEKtB,YAAAA,CA7DD,GA6DKuB,UAAU,CAACnB,UAAU,CAACJ,CAAZ,EAAeyB,UAAf,CA7Df;AA8DCxB,YAAAA,CA9DD,GA8DKsB,UAAU,CAACnB,UAAU,CAACH,CAAZ,EAAeyB,UAAf,CA9Df;AA+DCxB,YAAAA,CA/DD,GA+DKqB,UAAU,CAACnB,UAAU,CAACF,CAAZ,EAAeyB,UAAf,CA/Df;AAgECI,YAAAA,GAhED,GAgEO1B,KAAK,GAAGD,UAAU,CAACC,KAhE1B;;AAAA,iBAkEDuB,uBAlEC;AAAA;AAAA;AAAA;;AAmEGI,YAAAA,WAnEH,aAmEoBpB,QAnEpB,cAmEgCD,mBAnEhC;AAoEGsB,YAAAA,eApEH,GAoEqBC,yBAAyB,CAACF,WAAD,EAAcD,GAAd,EAAmB/B,CAAnB,EAAsBC,CAAtB,EAAyBC,CAAzB,CApE9C;AAAA;AAAA,mBAqEwB,gBAAK+B,eAAL,EAAsBE,wCAAtB,CArExB;;AAAA;AAqEGC,YAAAA,YArEH;AAuEH9B,YAAAA,OAAO,GAAG8B,YAAV;AAEAhC,YAAAA,UAAU,CAACL,WAAX,GAAyBuB,oBAAzB;AACAlB,YAAAA,UAAU,CAACJ,CAAX,GAAeyB,UAAf;AACArB,YAAAA,UAAU,CAACH,CAAX,GAAeyB,UAAf;AACAtB,YAAAA,UAAU,CAACF,CAAX,GAAeyB,UAAf;AACAvB,YAAAA,UAAU,CAACC,KAAX,GAAmBA,KAAnB;AAEAiB,YAAAA,oBAAoB,GAAG,CAAvB;AACAE,YAAAA,qBAAqB,GAAG,CAAxB;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAC,YAAAA,UAAU,GAAG,CAAb;AACAtB,YAAAA,KAAK,GAAG,CAAR;;AApFG;AAuFCgC,YAAAA,eAvFD,GAuFmBR,qBAAqB,CAACvB,OAAO,CAACgC,gBAAT,EAA2Bd,qBAA3B,CAvFxC;;AAAA,kBAyFD,CAACa,eAAD,IAAoBhC,KAAK,GAAGI,YAzF3B;AAAA;AAAA;AAAA;;AAAA,6CA0FII,IA1FJ;;AAAA;AA6FC0B,YAAAA,kBA7FD,GA6FsBV,qBAAqB,CAC9CvB,OAAO,CAACkC,mBADsC,EAE9ChB,qBAF8C,CA7F3C;;AAkGL,gBAAIe,kBAAJ,EAAwB;AACtB1B,cAAAA,IAAI,CAACG,UAAL,GAAkBkB,yBAAyB,CAACxB,kBAAD,EAAqBqB,GAArB,EAA0B/B,CAA1B,EAA6BC,CAA7B,EAAgCC,CAAhC,CAA3C;AACD;;AAEKuC,YAAAA,cAtGD,GAsGkBpC,KAAK,GAAG,CAtG1B;AAuGCqC,YAAAA,KAvGD,GAuGS;AAAC3C,cAAAA,WAAW,EAAEuB,oBAAd;AAAoCtB,cAAAA,CAAC,EAAEyB,UAAvC;AAAmDxB,cAAAA,CAAC,EAAEyB,UAAtD;AAAkExB,cAAAA,CAAC,EAAEyB;AAArE,aAvGT;AAyGIgB,YAAAA,KAzGJ,GAyGY,CAzGZ;;AAAA;AAAA,kBAyGeA,KAAK,GAAG1B,eAzGvB;AAAA;AAAA;AAAA;;AAAA;AAAA,mBA0GuBtB,kBAAkB,CAAC;AAC3CW,cAAAA,OAAO,EAAPA,OAD2C;AAE3CT,cAAAA,OAAO,EAAPA,OAF2C;AAG3CC,cAAAA,UAAU,EAAE4C,KAH+B;AAI3CvC,cAAAA,UAAU,EAAEwC,KAJ+B;AAK3CtC,cAAAA,KAAK,EAAEoC,cALoC;AAM3CrC,cAAAA,UAAU,EAAVA;AAN2C,aAAD,CA1GzC;;AAAA;AA0GGwC,YAAAA,WA1GH;;AAmHH,gBAAIA,WAAW,CAAC5B,UAAZ,IAA0B4B,WAAW,CAAC9B,QAAZ,CAAqB+B,MAAnD,EAA2D;AACnDC,cAAAA,WADmD,GACrCf,GAAG,GAAG,CAD+B;AAEnDgB,cAAAA,gBAFmD,GAEhC;AAACtB,gBAAAA,UAAU,EAAVA,UAAD;AAAaC,gBAAAA,UAAU,EAAVA,UAAb;AAAyBC,gBAAAA,UAAU,EAAVA;AAAzB,eAFgC;AAGnDqB,cAAAA,aAHmD,GAGnCC,cAAc,CAACL,WAAD,EAAcE,WAAd,EAA2BC,gBAA3B,EAA6ClD,OAA7C,CAHqB;AAKzDgB,cAAAA,IAAI,CAACC,QAAL,CAAcoC,IAAd,CAAmBF,aAAnB;AACD;;AAzHE;AAyGwCL,YAAAA,KAAK,EAzG7C;AAAA;AAAA;;AAAA;AAAA,6CA4HE9B,IA5HF;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AA+HP,SAASgB,qBAAT,CAA+BsB,gBAA/B,EAA+DR,KAA/D,EAAuF;AACrF,MAAI,cAAcQ,gBAAlB,EAAoC;AAClC,WAAOC,OAAO,CAACD,gBAAgB,CAACE,QAAlB,CAAd;AACD;;AAED,MAAIF,gBAAgB,CAACG,iBAArB,EAAwC;AACtC,WAAOC,4BAA4B,CAACZ,KAAD,EAAQQ,gBAAgB,CAACG,iBAAzB,CAAnC;AACD;;AAED,SAAO,KAAP;AACD;;AAUD,SAASL,cAAT,CACEpC,IADF,EAEER,KAFF,EAGE0C,gBAHF,EAIElD,OAJF,EAKE;AACA,MACEe,QADF,GAQIf,OARJ,CACEe,QADF;AAAA,MAEE4C,MAFF,GAQI3D,OARJ,CAEE2D,MAFF;AAAA,MAGEC,SAHF,GAQI5D,OARJ,CAGE4D,SAHF;AAAA,MAIEC,aAJF,GAQI7D,OARJ,CAIE6D,aAJF;AAAA,MAKEC,WALF,GAQI9D,OARJ,CAKE8D,WALF;AAAA,MAMEC,kBANF,GAQI/D,OARJ,CAME+D,kBANF;AAAA,MAOEC,kBAPF,GAQIhE,OARJ,CAOEgE,kBAPF;AASA,MAAMC,GAAG,GAAGjD,IAAI,CAACG,UAAL,IAAmBH,IAAI,CAACG,UAAL,CAAgB+C,OAAhB,WAA2BnD,QAA3B,QAAwC,EAAxC,CAA/B;AACA,MAAMG,cAAc,GAAG6C,kBAAkB,YAAG,CAAH,EAAQvD,KAAR,CAAzC;AACA,MAAM2D,cAAc,GAAGC,mCAAmC,CACxD5D,KADwD,EAExDwD,kBAFwD,EAGxDd,gBAHwD,CAA1D;AAMA,SAAO;AACLjC,IAAAA,QAAQ,EAAED,IAAI,CAACC,QADV;AAELE,IAAAA,UAAU,EAAEH,IAAI,CAACG,UAFZ;AAGLkD,IAAAA,OAAO,EAAE;AAACJ,MAAAA,GAAG,EAAHA;AAAD,KAHJ;AAILK,IAAAA,EAAE,EAAEtD,IAAI,CAACG,UAJJ;AAKLwC,IAAAA,MAAM,EAAEC,SAAS,CAACD,MAAD,CALZ;AAMLY,IAAAA,IAAI,EAAET,WAAW,CAAC9C,IAAD,CANZ;AAOL6C,IAAAA,aAAa,EAAbA,aAPK;AAQL3C,IAAAA,cAAc,EAAdA,cARK;AASLsD,IAAAA,cAAc,EAAEtD,cATX;AAULuD,IAAAA,SAAS,EAAEzD,IAAI,CAACyD,SAVX;AAWLN,IAAAA,cAAc,EAAdA;AAXK,GAAP;AAaD;;AASD,SAASC,mCAAT,CACE5D,KADF,EAEEwD,kBAFF,EAGEd,gBAHF,EAIyB;AACvB,MAAIc,kBAAkB,CAACU,MAAvB,EAA+B;AAC7B,QAAO9C,UAAP,GAA6CsB,gBAA7C,CAAOtB,UAAP;AAAA,QAAmBC,UAAnB,GAA6CqB,gBAA7C,CAAmBrB,UAAnB;AAAA,QAA+BC,UAA/B,GAA6CoB,gBAA7C,CAA+BpB,UAA/B;;AACA,6DAAiEkC,kBAAkB,CAACU,MAApF;AAAA,QAAOC,IAAP;AAAA,QAAaC,KAAb;AAAA,QAAoBC,IAApB;AAAA,QAA0BC,KAA1B;AAAA,QAAiCC,aAAjC;AAAA,QAAgDC,aAAhD;;AACA,QAAMC,oBAAoB,YAAG,CAAH,EAAQzE,KAAR,CAA1B;AAEA,QAAM0E,KAAK,GAAG,CAACL,IAAI,GAAGF,IAAR,IAAgBM,oBAA9B;AACA,QAAME,KAAK,GAAG,CAACL,KAAK,GAAGF,KAAT,IAAkBK,oBAAhC;AACA,QAAMG,KAAK,GAAG,CAACJ,aAAa,GAAGD,aAAjB,IAAkCE,oBAAhD;AAEA,QAAOI,SAAP,GAAgCV,IAAI,GAAGO,KAAK,GAAGtD,UAA/C;AAAA,QAAkB0D,SAAlB,GAA2DX,IAAI,GAAGO,KAAK,IAAItD,UAAU,GAAG,CAAjB,CAAvE;AACA,QAAO2D,UAAP,GAAkCX,KAAK,GAAGO,KAAK,GAAGtD,UAAlD;AAAA,QAAmB2D,UAAnB,GAA8DZ,KAAK,GAAGO,KAAK,IAAItD,UAAU,GAAG,CAAjB,CAA3E;AACA,QAAO4D,kBAAP,GACEV,aAAa,GAAGK,KAAK,GAAGtD,UAD1B;AAAA,QAA2B4D,kBAA3B,GAEEX,aAAa,GAAGK,KAAK,IAAItD,UAAU,GAAG,CAAjB,CAFvB;AAKA,WAAO;AACL4C,MAAAA,MAAM,EAAE,CAACW,SAAD,EAAYE,UAAZ,EAAwBD,SAAxB,EAAmCE,UAAnC,EAA+CC,kBAA/C,EAAmEC,kBAAnE;AADH,KAAP;AAGD;;AAGDC,EAAAA,OAAO,CAACC,IAAR,CAAa,oCAAb,EAAmD5B,kBAAnD;AACA,SAAO,IAAP;AACD;;AAOD,SAAStC,UAAT,CAAoBmE,KAApB,EAAmCC,MAAnC,EAA2D;AACzD,SAAOC,QAAQ,CAACF,KAAK,CAACG,QAAN,CAAe,CAAf,IAAoBF,MAAM,CAACE,QAAP,CAAgB,CAAhB,CAArB,EAAyC,CAAzC,CAAf;AACD;;AAUM,SAAS3D,yBAAT,CACL4D,WADK,EAELzF,KAFK,EAGLL,CAHK,EAILC,CAJK,EAKLC,CALK,EAMG;AACR,MAAM6F,MAAM,GAAGC,cAAc,CAAC;AAAC3F,IAAAA,KAAK,EAALA,KAAD;AAAQL,IAAAA,CAAC,EAADA,CAAR;AAAWC,IAAAA,CAAC,EAADA,CAAX;AAAcC,IAAAA,CAAC,EAADA;AAAd,GAAD,CAA7B;AACA,SAAO4F,WAAW,CAAC/B,OAAZ,CAAoB,uBAApB,EAA6C,UAACkC,OAAD;AAAA,WAAaF,MAAM,CAACE,OAAD,CAAnB;AAAA,GAA7C,CAAP;AACD;;AAMD,SAASD,cAAT,CAAwBE,KAAxB,EAAiF;AAC/E,MAAMH,MAAM,GAAG,EAAf;;AAEA,OAAK,IAAMI,IAAX,IAAkBD,KAAlB,EAAyB;AACvBH,IAAAA,MAAM,YAAKI,IAAL,OAAN,GAAqBD,KAAK,CAACC,IAAD,CAA1B;AACD;;AACD,SAAOJ,MAAP;AACD;;AAUD,SAASxC,4BAAT,CACE6C,iBADF,EAEEC,kBAFF,EAGW;AACT,MAAMC,SAAS,GAAGC,IAAI,CAACC,KAAL,CAAWJ,iBAAiB,GAAG,CAA/B,CAAlB;AACA,MAAMK,QAAQ,GAAGL,iBAAiB,GAAG,CAArC;AACA,MAAMM,QAAQ,GAAIL,kBAAkB,CAACC,SAAD,CAAlB,IAAiCG,QAAlC,GAA8C,CAA/D;AAEA,SAAOC,QAAQ,KAAK,CAApB;AACD","sourcesContent":["import type {Availability, BoundingVolume, Subtree} from '../../../types';\nimport {Tile3DSubtreeLoader} from '../../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\n\nconst QUADTREE_DEVISION_COUNT = 4;\nconst OCTREE_DEVISION_COUNT = 8;\n\nconst SUBDIVISION_COUNT_MAP = {\n QUADTREE: QUADTREE_DEVISION_COUNT,\n OCTREE: OCTREE_DEVISION_COUNT\n};\n\n/**\n * Recursively parse implicit tiles tree\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling\n * TODO Check out do we able to use Tile3D class as return type here.\n * @param subtree\n * @param lodMetricValue\n * @param options\n * @param parentData\n * @param childIndex\n * @param level\n * @param globalData\n */\n// eslint-disable-next-line max-statements\nexport async function parseImplicitTiles(params: {\n subtree: Subtree;\n options: any;\n parentData?: {mortonIndex: number; x: number; y: number; z: number};\n childIndex?: number;\n level?: number;\n globalData?: {level: number; mortonIndex: number; x: number; y: number; z: number};\n}) {\n const {\n options,\n parentData = {\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n },\n childIndex = 0,\n globalData = {\n level: 0,\n mortonIndex: 0,\n x: 0,\n y: 0,\n z: 0\n }\n } = params;\n let {subtree, level = 0} = params;\n const {\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n contentUrlTemplate,\n subtreesUriTemplate,\n basePath\n } = options;\n\n const tile = {children: [], lodMetricValue: 0, contentUrl: ''};\n\n const childrenPerTile = SUBDIVISION_COUNT_MAP[subdivisionScheme];\n\n const childX = childIndex & 0b01;\n const childY = (childIndex >> 1) & 0b01;\n const childZ = (childIndex >> 2) & 0b01;\n\n const levelOffset = (childrenPerTile ** level - 1) / (childrenPerTile - 1);\n let childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex);\n let tileAvailabilityIndex = levelOffset + childTileMortonIndex;\n\n // Local tile coordinates\n let childTileX = concatBits(parentData.x, childX);\n let childTileY = concatBits(parentData.y, childY);\n let childTileZ = concatBits(parentData.z, childZ);\n\n let isChildSubtreeAvailable = false;\n\n if (level + 1 > subtreeLevels) {\n isChildSubtreeAvailable = getAvailabilityResult(\n subtree.childSubtreeAvailability,\n childTileMortonIndex\n );\n }\n\n const x = concatBits(globalData.x, childTileX);\n const y = concatBits(globalData.y, childTileY);\n const z = concatBits(globalData.z, childTileZ);\n const lev = level + globalData.level;\n\n if (isChildSubtreeAvailable) {\n const subtreePath = `${basePath}/${subtreesUriTemplate}`;\n const childSubtreeUrl = replaceContentUrlTemplate(subtreePath, lev, x, y, z);\n const childSubtree = await load(childSubtreeUrl, Tile3DSubtreeLoader);\n\n subtree = childSubtree;\n\n globalData.mortonIndex = childTileMortonIndex;\n globalData.x = childTileX;\n globalData.y = childTileY;\n globalData.z = childTileZ;\n globalData.level = level;\n\n childTileMortonIndex = 0;\n tileAvailabilityIndex = 0;\n childTileX = 0;\n childTileY = 0;\n childTileZ = 0;\n level = 0;\n }\n\n const isTileAvailable = getAvailabilityResult(subtree.tileAvailability, tileAvailabilityIndex);\n\n if (!isTileAvailable || level > maximumLevel) {\n return tile;\n }\n\n const isContentAvailable = getAvailabilityResult(\n subtree.contentAvailability,\n tileAvailabilityIndex\n );\n\n if (isContentAvailable) {\n tile.contentUrl = replaceContentUrlTemplate(contentUrlTemplate, lev, x, y, z);\n }\n\n const childTileLevel = level + 1;\n const pData = {mortonIndex: childTileMortonIndex, x: childTileX, y: childTileY, z: childTileZ};\n\n for (let index = 0; index < childrenPerTile; index++) {\n const currentTile = await parseImplicitTiles({\n subtree,\n options,\n parentData: pData,\n childIndex: index,\n level: childTileLevel,\n globalData\n });\n\n if (currentTile.contentUrl || currentTile.children.length) {\n const globalLevel = lev + 1;\n const childCoordinates = {childTileX, childTileY, childTileZ};\n const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);\n // @ts-ignore\n tile.children.push(formattedTile);\n }\n }\n\n return tile;\n}\n\nfunction getAvailabilityResult(availabilityData: Availability, index: number): boolean {\n if ('constant' in availabilityData) {\n return Boolean(availabilityData.constant);\n }\n\n if (availabilityData.explicitBitstream) {\n return getBooleanValueFromBitstream(index, availabilityData.explicitBitstream);\n }\n\n return false;\n}\n\n/**\n * Do formatting of implicit tile data.\n * TODO Check out do we able to use Tile3D class as type here.\n * @param tile\n * @param lodMetricValue\n * @param options\n * @returns\n */\nfunction formatTileData(\n tile,\n level: number,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number},\n options: any\n) {\n const {\n basePath,\n refine,\n getRefine,\n lodMetricType,\n getTileType,\n rootLodMetricValue,\n rootBoundingVolume\n } = options;\n const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');\n const lodMetricValue = rootLodMetricValue / 2 ** level;\n const boundingVolume = calculateBoundingVolumeForChildTile(\n level,\n rootBoundingVolume,\n childCoordinates\n );\n\n return {\n children: tile.children,\n contentUrl: tile.contentUrl,\n content: {uri},\n id: tile.contentUrl,\n refine: getRefine(refine),\n type: getTileType(tile),\n lodMetricType,\n lodMetricValue,\n geometricError: lodMetricValue,\n transform: tile.transform,\n boundingVolume\n };\n}\n\n/**\n * Calculate child bounding volume.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subdivision-rules\n * @param level\n * @param rootBoundingVolume\n * @param childCoordinates\n */\nfunction calculateBoundingVolumeForChildTile(\n level: number,\n rootBoundingVolume: BoundingVolume,\n childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}\n): BoundingVolume | null {\n if (rootBoundingVolume.region) {\n const {childTileX, childTileY, childTileZ} = childCoordinates;\n const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;\n const boundingVolumesCount = 2 ** level;\n\n const sizeX = (east - west) / boundingVolumesCount;\n const sizeY = (north - south) / boundingVolumesCount;\n const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;\n\n const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];\n const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];\n const [childMinimumHeight, childMaximumHeight] = [\n minimumHeight + sizeZ * childTileZ,\n minimumHeight + sizeZ * (childTileZ + 1)\n ];\n\n return {\n region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]\n };\n }\n\n // eslint-disable-next-line no-console\n console.warn('Unsupported bounding volume type: ', rootBoundingVolume);\n return null;\n}\n\n/**\n * Do binary concatenation\n * @param first\n * @param second\n */\nfunction concatBits(first: number, second: number): number {\n return parseInt(first.toString(2) + second.toString(2), 2);\n}\n\n/**\n * Replace implicit tile content url with real coordinates.\n * @param templateUrl\n * @param level\n * @param x\n * @param y\n * @param z\n */\nexport function replaceContentUrlTemplate(\n templateUrl: string,\n level: number,\n x: number,\n y: number,\n z: number\n): string {\n const mapUrl = generateMapUrl({level, x, y, z});\n return templateUrl.replace(/{level}|{x}|{y}|{z}/gi, (matched) => mapUrl[matched]);\n}\n\n/**\n * Get Map object for content url generation\n * @param items\n */\nfunction generateMapUrl(items: {[key: string]: number}): {[key: string]: string} {\n const mapUrl = {};\n\n for (const key in items) {\n mapUrl[`{${key}}`] = items[key];\n }\n return mapUrl;\n}\n\n/**\n * Get boolean value from bistream by index\n * A boolean value is encoded as a single bit, either 0 (false) or 1 (true).\n * Multiple boolean values are packed tightly in the same buffer.\n * These buffers of tightly-packed bits are sometimes referred to as bitstreams.\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/implicit-revisions/specification/Metadata#booleans\n * @param availabilitiIndex\n */\nfunction getBooleanValueFromBitstream(\n availabilityIndex: number,\n availabilityBuffer: Uint8Array\n): boolean {\n const byteIndex = Math.floor(availabilityIndex / 8);\n const bitIndex = availabilityIndex % 8;\n const bitValue = (availabilityBuffer[byteIndex] >> bitIndex) & 1;\n\n return bitValue === 1;\n}\n"],"file":"parse-3d-implicit-tiles.js"}
|
|
@@ -11,17 +11,15 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
|
|
|
11
11
|
|
|
12
12
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
13
13
|
|
|
14
|
-
var _core = require("@loaders.gl/core");
|
|
15
|
-
|
|
16
14
|
var SUBTREE_FILE_MAGIC = 0x74627573;
|
|
17
15
|
var SUBTREE_FILE_VERSION = 1;
|
|
18
16
|
|
|
19
|
-
function parse3DTilesSubtree(_x) {
|
|
17
|
+
function parse3DTilesSubtree(_x, _x2, _x3) {
|
|
20
18
|
return _parse3DTilesSubtree.apply(this, arguments);
|
|
21
19
|
}
|
|
22
20
|
|
|
23
21
|
function _parse3DTilesSubtree() {
|
|
24
|
-
_parse3DTilesSubtree = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(data) {
|
|
22
|
+
_parse3DTilesSubtree = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(data, options, context) {
|
|
25
23
|
var magic, version, jsonByteLength, stringAttribute, textDecoder, string, subtree, binaryByteLength, internalBinaryBuffer;
|
|
26
24
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
27
25
|
while (1) {
|
|
@@ -65,7 +63,7 @@ function _parse3DTilesSubtree() {
|
|
|
65
63
|
}
|
|
66
64
|
|
|
67
65
|
_context.next = 17;
|
|
68
|
-
return getExplicitBitstream(subtree, 'tileAvailability', internalBinaryBuffer);
|
|
66
|
+
return getExplicitBitstream(subtree, 'tileAvailability', internalBinaryBuffer, context);
|
|
69
67
|
|
|
70
68
|
case 17:
|
|
71
69
|
subtree.tileAvailability.explicitBitstream = _context.sent;
|
|
@@ -77,7 +75,7 @@ function _parse3DTilesSubtree() {
|
|
|
77
75
|
}
|
|
78
76
|
|
|
79
77
|
_context.next = 21;
|
|
80
|
-
return getExplicitBitstream(subtree, 'contentAvailability', internalBinaryBuffer);
|
|
78
|
+
return getExplicitBitstream(subtree, 'contentAvailability', internalBinaryBuffer, context);
|
|
81
79
|
|
|
82
80
|
case 21:
|
|
83
81
|
subtree.contentAvailability.explicitBitstream = _context.sent;
|
|
@@ -89,7 +87,7 @@ function _parse3DTilesSubtree() {
|
|
|
89
87
|
}
|
|
90
88
|
|
|
91
89
|
_context.next = 25;
|
|
92
|
-
return getExplicitBitstream(subtree, 'childSubtreeAvailability', internalBinaryBuffer);
|
|
90
|
+
return getExplicitBitstream(subtree, 'childSubtreeAvailability', internalBinaryBuffer, context);
|
|
93
91
|
|
|
94
92
|
case 25:
|
|
95
93
|
subtree.childSubtreeAvailability.explicitBitstream = _context.sent;
|
|
@@ -107,13 +105,27 @@ function _parse3DTilesSubtree() {
|
|
|
107
105
|
return _parse3DTilesSubtree.apply(this, arguments);
|
|
108
106
|
}
|
|
109
107
|
|
|
110
|
-
function
|
|
108
|
+
function resolveBufferUri(bitstreamRelativeUri, basePath) {
|
|
109
|
+
var hasProtocol = basePath.startsWith('http');
|
|
110
|
+
|
|
111
|
+
if (hasProtocol) {
|
|
112
|
+
var _resolvedUri = new URL(bitstreamRelativeUri, basePath);
|
|
113
|
+
|
|
114
|
+
return decodeURI(_resolvedUri.toString());
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
var basePathWithProtocol = "http://".concat(basePath);
|
|
118
|
+
var resolvedUri = new URL(bitstreamRelativeUri, basePathWithProtocol);
|
|
119
|
+
return "/".concat(resolvedUri.host).concat(resolvedUri.pathname);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function getExplicitBitstream(_x4, _x5, _x6, _x7) {
|
|
111
123
|
return _getExplicitBitstream.apply(this, arguments);
|
|
112
124
|
}
|
|
113
125
|
|
|
114
126
|
function _getExplicitBitstream() {
|
|
115
|
-
_getExplicitBitstream = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(subtree, name, internalBinaryBuffer) {
|
|
116
|
-
var bufferViewIndex, bufferView, buffer, response, data;
|
|
127
|
+
_getExplicitBitstream = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(subtree, name, internalBinaryBuffer, context) {
|
|
128
|
+
var bufferViewIndex, bufferView, buffer, bufferUri, response, data;
|
|
117
129
|
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
118
130
|
while (1) {
|
|
119
131
|
switch (_context2.prev = _context2.next) {
|
|
@@ -122,27 +134,44 @@ function _getExplicitBitstream() {
|
|
|
122
134
|
bufferView = subtree.bufferViews[bufferViewIndex];
|
|
123
135
|
buffer = subtree.buffers[bufferView.buffer];
|
|
124
136
|
|
|
137
|
+
if (!(!(context !== null && context !== void 0 && context.url) || !context.fetch)) {
|
|
138
|
+
_context2.next = 5;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
throw new Error('Url is not provided');
|
|
143
|
+
|
|
144
|
+
case 5:
|
|
145
|
+
if (context.fetch) {
|
|
146
|
+
_context2.next = 7;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
throw new Error('fetch is not provided');
|
|
151
|
+
|
|
152
|
+
case 7:
|
|
125
153
|
if (!buffer.uri) {
|
|
126
|
-
_context2.next =
|
|
154
|
+
_context2.next = 16;
|
|
127
155
|
break;
|
|
128
156
|
}
|
|
129
157
|
|
|
130
|
-
|
|
131
|
-
|
|
158
|
+
bufferUri = resolveBufferUri(buffer.uri, context === null || context === void 0 ? void 0 : context.url);
|
|
159
|
+
_context2.next = 11;
|
|
160
|
+
return context.fetch(bufferUri);
|
|
132
161
|
|
|
133
|
-
case
|
|
162
|
+
case 11:
|
|
134
163
|
response = _context2.sent;
|
|
135
|
-
_context2.next =
|
|
164
|
+
_context2.next = 14;
|
|
136
165
|
return response.arrayBuffer();
|
|
137
166
|
|
|
138
|
-
case
|
|
167
|
+
case 14:
|
|
139
168
|
data = _context2.sent;
|
|
140
169
|
return _context2.abrupt("return", new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength));
|
|
141
170
|
|
|
142
|
-
case
|
|
171
|
+
case 16:
|
|
143
172
|
return _context2.abrupt("return", new Uint8Array(internalBinaryBuffer, bufferView.byteOffset, bufferView.byteLength));
|
|
144
173
|
|
|
145
|
-
case
|
|
174
|
+
case 17:
|
|
146
175
|
case "end":
|
|
147
176
|
return _context2.stop();
|
|
148
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-tile-subtree.ts"],"names":["SUBTREE_FILE_MAGIC","SUBTREE_FILE_VERSION","parse3DTilesSubtree","data","magic","Uint32Array","slice","Error","version","jsonByteLength","parseUint64Value","stringAttribute","Uint8Array","textDecoder","TextDecoder","string","decode","subtree","JSON","parse","binaryByteLength","internalBinaryBuffer","ArrayBuffer","tileAvailability","getExplicitBitstream","explicitBitstream","contentAvailability","childSubtreeAvailability","name","bufferViewIndex","bufferView","bufferViews","buffer","buffers","uri","response","arrayBuffer","byteOffset","byteLength","dataView","DataView","left","getUint32","right"],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/parsers/helpers/parse-3d-tile-subtree.ts"],"names":["SUBTREE_FILE_MAGIC","SUBTREE_FILE_VERSION","parse3DTilesSubtree","data","options","context","magic","Uint32Array","slice","Error","version","jsonByteLength","parseUint64Value","stringAttribute","Uint8Array","textDecoder","TextDecoder","string","decode","subtree","JSON","parse","binaryByteLength","internalBinaryBuffer","ArrayBuffer","tileAvailability","getExplicitBitstream","explicitBitstream","contentAvailability","childSubtreeAvailability","resolveBufferUri","bitstreamRelativeUri","basePath","hasProtocol","startsWith","resolvedUri","URL","decodeURI","toString","basePathWithProtocol","host","pathname","name","bufferViewIndex","bufferView","bufferViews","buffer","buffers","url","fetch","uri","bufferUri","response","arrayBuffer","byteOffset","byteLength","dataView","DataView","left","getUint32","right"],"mappings":";;;;;;;;;;;;;AAGA,IAAMA,kBAAkB,GAAG,UAA3B;AACA,IAAMC,oBAAoB,GAAG,CAA7B;;SAS8BC,mB;;;;;mFAAf,iBACbC,IADa,EAEbC,OAFa,EAGbC,OAHa;AAAA;AAAA;AAAA;AAAA;AAAA;AAKPC,YAAAA,KALO,GAKC,IAAIC,WAAJ,CAAgBJ,IAAI,CAACK,KAAL,CAAW,CAAX,EAAc,CAAd,CAAhB,CALD;;AAAA,kBAOTF,KAAK,CAAC,CAAD,CAAL,KAAaN,kBAPJ;AAAA;AAAA;AAAA;;AAAA,kBAQL,IAAIS,KAAJ,CAAU,iCAAV,CARK;;AAAA;AAWPC,YAAAA,OAXO,GAWG,IAAIH,WAAJ,CAAgBJ,IAAI,CAACK,KAAL,CAAW,CAAX,EAAc,CAAd,CAAhB,CAXH;;AAAA,kBAaTE,OAAO,CAAC,CAAD,CAAP,KAAeT,oBAbN;AAAA;AAAA;AAAA;;AAAA,kBAcL,IAAIQ,KAAJ,CAAU,sCAAV,CAdK;;AAAA;AAiBPE,YAAAA,cAjBO,GAiBUC,gBAAgB,CAACT,IAAI,CAACK,KAAL,CAAW,CAAX,EAAc,EAAd,CAAD,CAjB1B;AAkBPK,YAAAA,eAlBO,GAkBW,IAAIC,UAAJ,CAAeX,IAAf,EAAqB,EAArB,EAAyBQ,cAAzB,CAlBX;AAoBPI,YAAAA,WApBO,GAoBO,IAAIC,WAAJ,CAAgB,MAAhB,CApBP;AAqBPC,YAAAA,MArBO,GAqBEF,WAAW,CAACG,MAAZ,CAAmBL,eAAnB,CArBF;AAsBPM,YAAAA,OAtBO,GAsBGC,IAAI,CAACC,KAAL,CAAWJ,MAAX,CAtBH;AAwBPK,YAAAA,gBAxBO,GAwBYV,gBAAgB,CAACT,IAAI,CAACK,KAAL,CAAW,EAAX,EAAe,EAAf,CAAD,CAxB5B;AAyBTe,YAAAA,oBAzBS,GAyBc,IAAIC,WAAJ,CAAgB,CAAhB,CAzBd;;AA2Bb,gBAAIF,gBAAJ,EAAsB;AACpBC,cAAAA,oBAAoB,GAAGpB,IAAI,CAACK,KAAL,CAAW,KAAKG,cAAhB,CAAvB;AACD;;AA7BY,kBA+BT,gBAAgBQ,OAAO,CAACM,gBA/Bf;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAgCwCC,oBAAoB,CACrEP,OADqE,EAErE,kBAFqE,EAGrEI,oBAHqE,EAIrElB,OAJqE,CAhC5D;;AAAA;AAgCXc,YAAAA,OAAO,CAACM,gBAAR,CAAyBE,iBAhCd;;AAAA;AAAA,kBAwCT,gBAAgBR,OAAO,CAACS,mBAxCf;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAyC2CF,oBAAoB,CACxEP,OADwE,EAExE,qBAFwE,EAGxEI,oBAHwE,EAIxElB,OAJwE,CAzC/D;;AAAA;AAyCXc,YAAAA,OAAO,CAACS,mBAAR,CAA4BD,iBAzCjB;;AAAA;AAAA,kBAiDT,gBAAgBR,OAAO,CAACU,wBAjDf;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAkDgDH,oBAAoB,CAC7EP,OAD6E,EAE7E,0BAF6E,EAG7EI,oBAH6E,EAI7ElB,OAJ6E,CAlDpE;;AAAA;AAkDXc,YAAAA,OAAO,CAACU,wBAAR,CAAiCF,iBAlDtB;;AAAA;AAAA,6CA0DNR,OA1DM;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AAmEf,SAASW,gBAAT,CAA0BC,oBAA1B,EAAwDC,QAAxD,EAAkF;AAChF,MAAMC,WAAW,GAAGD,QAAQ,CAACE,UAAT,CAAoB,MAApB,CAApB;;AAEA,MAAID,WAAJ,EAAiB;AACf,QAAME,YAAW,GAAG,IAAIC,GAAJ,CAAQL,oBAAR,EAA8BC,QAA9B,CAApB;;AACA,WAAOK,SAAS,CAACF,YAAW,CAACG,QAAZ,EAAD,CAAhB;AACD;;AAMD,MAAMC,oBAAoB,oBAAaP,QAAb,CAA1B;AACA,MAAMG,WAAW,GAAG,IAAIC,GAAJ,CAAQL,oBAAR,EAA8BQ,oBAA9B,CAApB;AAIA,oBAAWJ,WAAW,CAACK,IAAvB,SAA8BL,WAAW,CAACM,QAA1C;AACD;;SAQcf,oB;;;;;oFAAf,kBACEP,OADF,EAEEuB,IAFF,EAGEnB,oBAHF,EAIElB,OAJF;AAAA;AAAA;AAAA;AAAA;AAAA;AAMQsC,YAAAA,eANR,GAM0BxB,OAAO,CAACuB,IAAD,CAAP,CAAcE,UANxC;AAOQA,YAAAA,UAPR,GAOqBzB,OAAO,CAAC0B,WAAR,CAAoBF,eAApB,CAPrB;AAQQG,YAAAA,MARR,GAQiB3B,OAAO,CAAC4B,OAAR,CAAgBH,UAAU,CAACE,MAA3B,CARjB;;AAAA,kBAUM,EAACzC,OAAD,aAACA,OAAD,eAACA,OAAO,CAAE2C,GAAV,KAAiB,CAAC3C,OAAO,CAAC4C,KAVhC;AAAA;AAAA;AAAA;;AAAA,kBAWU,IAAIxC,KAAJ,CAAU,qBAAV,CAXV;;AAAA;AAAA,gBAcOJ,OAAO,CAAC4C,KAdf;AAAA;AAAA;AAAA;;AAAA,kBAeU,IAAIxC,KAAJ,CAAU,uBAAV,CAfV;;AAAA;AAAA,iBAmBMqC,MAAM,CAACI,GAnBb;AAAA;AAAA;AAAA;;AAoBUC,YAAAA,SApBV,GAoBsBrB,gBAAgB,CAACgB,MAAM,CAACI,GAAR,EAAa7C,OAAb,aAAaA,OAAb,uBAAaA,OAAO,CAAE2C,GAAtB,CApBtC;AAAA;AAAA,mBAqB2B3C,OAAO,CAAC4C,KAAR,CAAcE,SAAd,CArB3B;;AAAA;AAqBUC,YAAAA,QArBV;AAAA;AAAA,mBAsBuBA,QAAQ,CAACC,WAAT,EAtBvB;;AAAA;AAsBUlD,YAAAA,IAtBV;AAAA,8CAwBW,IAAIW,UAAJ,CAAeX,IAAf,EAAqByC,UAAU,CAACU,UAAhC,EAA4CV,UAAU,CAACW,UAAvD,CAxBX;;AAAA;AAAA,8CA2BS,IAAIzC,UAAJ,CAAeS,oBAAf,EAAqCqB,UAAU,CAACU,UAAhD,EAA4DV,UAAU,CAACW,UAAvE,CA3BT;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;AAmCA,SAAS3C,gBAAT,CAA0BkC,MAA1B,EAAuD;AACrD,MAAMU,QAAQ,GAAG,IAAIC,QAAJ,CAAaX,MAAb,CAAjB;AACA,MAAMY,IAAI,GAAGF,QAAQ,CAACG,SAAT,CAAmB,CAAnB,EAAsB,IAAtB,CAAb;AACA,MAAMC,KAAK,GAAGJ,QAAQ,CAACG,SAAT,CAAmB,CAAnB,EAAsB,IAAtB,CAAd;AAEA,SAAOD,IAAI,GAAG,YAAK,EAAL,IAAUE,KAAxB;AACD","sourcesContent":["import type {Subtree, ExplicitBitstream} from '../../../types';\nimport type {LoaderContext, LoaderOptions} from '@loaders.gl/loader-utils';\n\nconst SUBTREE_FILE_MAGIC = 0x74627573;\nconst SUBTREE_FILE_VERSION = 1;\n\n/**\n * Parse subtree file\n * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subtree-file-format\n * @param data\n * @returns\n */\n// eslint-disable-next-line max-statements\nexport default async function parse3DTilesSubtree(\n data: ArrayBuffer,\n options: LoaderOptions | undefined,\n context: LoaderContext | undefined\n): Promise<Subtree> {\n const magic = new Uint32Array(data.slice(0, 4));\n\n if (magic[0] !== SUBTREE_FILE_MAGIC) {\n throw new Error('Wrong subtree file magic number');\n }\n\n const version = new Uint32Array(data.slice(4, 8));\n\n if (version[0] !== SUBTREE_FILE_VERSION) {\n throw new Error('Wrong subtree file verson, must be 1');\n }\n\n const jsonByteLength = parseUint64Value(data.slice(8, 16));\n const stringAttribute = new Uint8Array(data, 24, jsonByteLength);\n\n const textDecoder = new TextDecoder('utf8');\n const string = textDecoder.decode(stringAttribute);\n const subtree = JSON.parse(string);\n\n const binaryByteLength = parseUint64Value(data.slice(16, 24));\n let internalBinaryBuffer = new ArrayBuffer(0);\n\n if (binaryByteLength) {\n internalBinaryBuffer = data.slice(24 + jsonByteLength);\n }\n\n if ('bufferView' in subtree.tileAvailability) {\n subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'tileAvailability',\n internalBinaryBuffer,\n context\n );\n }\n\n if ('bufferView' in subtree.contentAvailability) {\n subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'contentAvailability',\n internalBinaryBuffer,\n context\n );\n }\n\n if ('bufferView' in subtree.childSubtreeAvailability) {\n subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(\n subtree,\n 'childSubtreeAvailability',\n internalBinaryBuffer,\n context\n );\n }\n\n return subtree;\n}\n\n/**\n * Get url for bitstream downloading\n * @param bitstreamRelativeUri\n * @param baseUri\n * @returns\n */\nfunction resolveBufferUri(bitstreamRelativeUri: string, basePath: string): string {\n const hasProtocol = basePath.startsWith('http');\n\n if (hasProtocol) {\n const resolvedUri = new URL(bitstreamRelativeUri, basePath);\n return decodeURI(resolvedUri.toString());\n }\n\n /**\n * Adding http protocol only for new URL constructor usage.\n * It allows to resolve relative paths like ../../example with basePath.\n */\n const basePathWithProtocol = `http://${basePath}`;\n const resolvedUri = new URL(bitstreamRelativeUri, basePathWithProtocol);\n /**\n * Drop protocol and use just relative path.\n */\n return `/${resolvedUri.host}${resolvedUri.pathname}`;\n}\n\n/**\n * Get explicit bitstream for subtree availability data.\n * @param subtree\n * @param name\n * @param internalBinaryBuffer\n */\nasync function getExplicitBitstream(\n subtree: Subtree,\n name: string,\n internalBinaryBuffer: ArrayBuffer,\n context: LoaderContext | undefined\n): Promise<ExplicitBitstream> {\n const bufferViewIndex = subtree[name].bufferView;\n const bufferView = subtree.bufferViews[bufferViewIndex];\n const buffer = subtree.buffers[bufferView.buffer];\n\n if (!context?.url || !context.fetch) {\n throw new Error('Url is not provided');\n }\n\n if (!context.fetch) {\n throw new Error('fetch is not provided');\n }\n\n // External bitstream loading\n if (buffer.uri) {\n const bufferUri = resolveBufferUri(buffer.uri, context?.url);\n const response = await context.fetch(bufferUri);\n const data = await response.arrayBuffer();\n // Return view of bitstream.\n return new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength);\n }\n // Return view of bitstream.\n return new Uint8Array(internalBinaryBuffer, bufferView.byteOffset, bufferView.byteLength);\n}\n\n/**\n * Parse buffer to return uint64 value\n * @param buffer\n * @returns 64-bit value until precision is lost after Number.MAX_SAFE_INTEGER\n */\nfunction parseUint64Value(buffer: ArrayBuffer): number {\n const dataView = new DataView(buffer);\n const left = dataView.getUint32(0, true);\n const right = dataView.getUint32(4, true);\n // combine the two 32-bit values\n return left + 2 ** 32 * right;\n}\n"],"file":"parse-3d-tile-subtree.js"}
|