@loaders.gl/tile-converter 3.3.0-alpha.6 → 3.3.0-alpha.8
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/3d-tiles-attributes-worker.d.ts +2 -2
- package/dist/3d-tiles-attributes-worker.d.ts.map +1 -1
- package/dist/3d-tiles-attributes-worker.js +2 -2
- package/dist/3d-tiles-attributes-worker.js.map +2 -2
- package/dist/converter-cli.js +15 -2
- package/dist/converter.min.js +20 -20
- package/dist/dist.min.js +263 -415
- package/dist/es5/3d-tiles-attributes-worker.js +1 -1
- package/dist/es5/converter-cli.js +9 -3
- package/dist/es5/converter-cli.js.map +1 -1
- package/dist/es5/deps-installer/deps-installer.js +1 -1
- package/dist/es5/i3s-attributes-worker.js +1 -1
- package/dist/es5/i3s-converter/helpers/coordinate-converter.js +7 -6
- package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +1 -1
- package/dist/es5/i3s-converter/i3s-converter.js +27 -25
- package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/es5/pgm-loader.js +1 -1
- package/dist/esm/3d-tiles-attributes-worker.js +1 -1
- package/dist/esm/converter-cli.js +9 -3
- package/dist/esm/converter-cli.js.map +1 -1
- package/dist/esm/deps-installer/deps-installer.js +1 -1
- package/dist/esm/i3s-attributes-worker.js +1 -1
- package/dist/esm/i3s-converter/helpers/coordinate-converter.js +7 -6
- package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +1 -1
- package/dist/esm/i3s-converter/i3s-converter.js +10 -7
- package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/esm/pgm-loader.js +1 -1
- package/dist/i3s-attributes-worker.d.ts +2 -2
- package/dist/i3s-attributes-worker.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/coordinate-converter.js +8 -6
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
- package/dist/i3s-converter/i3s-converter.js +9 -7
- package/dist/i3s-converter/types.d.ts +6 -6
- package/dist/i3s-converter/types.d.ts.map +1 -1
- package/dist/lib/utils/write-queue.d.ts +1 -1
- package/dist/lib/utils/write-queue.d.ts.map +1 -1
- package/package.json +15 -15
- package/src/converter-cli.ts +16 -2
- package/src/i3s-converter/helpers/coordinate-converter.ts +8 -6
- package/src/i3s-converter/i3s-converter.ts +17 -7
|
@@ -65,13 +65,14 @@ export function convertBoundingVolumeToI3SFullExtent(boundingVolume) {
|
|
|
65
65
|
const radius = sphere.radius;
|
|
66
66
|
const vertexMax = Ellipsoid.WGS84.cartesianToCartographic(new Vector3(center[0] + radius, center[1] + radius, center[2] + radius), new Vector3());
|
|
67
67
|
const vertexMin = Ellipsoid.WGS84.cartesianToCartographic(new Vector3(center[0] - radius, center[1] - radius, center[2] - radius), new Vector3());
|
|
68
|
+
|
|
68
69
|
return {
|
|
69
|
-
xmin: vertexMin[0],
|
|
70
|
-
xmax: vertexMax[0],
|
|
71
|
-
ymin: vertexMin[1],
|
|
72
|
-
ymax: vertexMax[1],
|
|
73
|
-
zmin: vertexMin[2],
|
|
74
|
-
zmax: vertexMax[2]
|
|
70
|
+
xmin: Math.min(vertexMin[0], vertexMax[0]),
|
|
71
|
+
xmax: Math.max(vertexMin[0], vertexMax[0]),
|
|
72
|
+
ymin: Math.min(vertexMin[1], vertexMax[1]),
|
|
73
|
+
ymax: Math.max(vertexMin[1], vertexMax[1]),
|
|
74
|
+
zmin: Math.min(vertexMin[2], vertexMax[2]),
|
|
75
|
+
zmax: Math.max(vertexMin[2], vertexMax[2])
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
78
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinate-converter.js","names":["Matrix3","Quaternion","Vector3","Ellipsoid","OrientedBoundingBox","makeOrientedBoundingBoxFromPoints","makeBoundingSphereFromPoints","BoundingSphere","createBoundingVolumes","tile","geoidHeightModel","radius","halfSize","quaternion","boundingVolume","cartographicCenter","WGS84","cartesianToCartographic","center","getHeight","len","fromMatrix3","normalize","mbs","obb","createBoundingVolumesFromGeometry","cartesianPositions","positionVectors","convertPositionsToVectors","geometryObb","geometryMbs","mbsCenter","obbCenter","positions","result","i","length","positionVector","push","convertBoundingVolumeToI3SFullExtent","sphere","getBoundingSphere","vertexMax","vertexMin","xmin","xmax","ymin","ymax","zmin","zmax","createObbFromMbs","halfAxex"],"sources":["../../../../src/i3s-converter/helpers/coordinate-converter.ts"],"sourcesContent":["import type {BoundingVolumes, FullExtent, Mbs, Obb} from '@loaders.gl/i3s';\n\nimport {Matrix3, Quaternion, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {\n OrientedBoundingBox,\n makeOrientedBoundingBoxFromPoints,\n makeBoundingSphereFromPoints,\n BoundingSphere\n} from '@math.gl/culling';\nimport {Tile3D} from '@loaders.gl/tiles';\nimport {Geoid} from '@math.gl/geoid';\n\n/**\n * Create bounding volumes object from tile and geoid height model.\n * @param tile\n * @param geoidHeightModel\n * @returns - Bounding volumes object\n */\nexport function createBoundingVolumes(tile: Tile3D, geoidHeightModel: Geoid): BoundingVolumes {\n let radius;\n let halfSize;\n let quaternion;\n\n const boundingVolume = tile.boundingVolume;\n const cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(\n boundingVolume.center,\n new Vector3()\n );\n cartographicCenter[2] =\n cartographicCenter[2] -\n geoidHeightModel.getHeight(cartographicCenter[1], cartographicCenter[0]);\n if (boundingVolume instanceof OrientedBoundingBox) {\n halfSize = boundingVolume.halfSize;\n radius = new Vector3(halfSize[0], halfSize[1], halfSize[2]).len();\n quaternion = boundingVolume.quaternion;\n } else {\n radius = tile.boundingVolume.radius;\n halfSize = [radius, radius, radius];\n quaternion = new Quaternion()\n .fromMatrix3(new Matrix3([halfSize[0], 0, 0, 0, halfSize[1], 0, 0, 0, halfSize[2]]))\n .normalize();\n }\n\n return {\n mbs: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2], radius],\n obb: {\n center: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2]],\n halfSize,\n quaternion\n }\n };\n}\n\n/**\n * Generates bounding volumes from geometry positions\n * @param cartesianPositions\n * @param geoidHeightModel\n */\nexport function createBoundingVolumesFromGeometry(\n cartesianPositions: Float32Array,\n geoidHeightModel: Geoid\n): {mbs: Mbs; obb: Obb} {\n const positionVectors = convertPositionsToVectors(cartesianPositions);\n\n const geometryObb = makeOrientedBoundingBoxFromPoints(positionVectors);\n const geometryMbs = makeBoundingSphereFromPoints(positionVectors);\n\n let mbsCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryMbs.center, new Vector3());\n let obbCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryObb.center, new Vector3());\n\n mbsCenter[2] = mbsCenter[2] - geoidHeightModel.getHeight(mbsCenter[1], mbsCenter[0]);\n obbCenter[2] = obbCenter[2] - geoidHeightModel.getHeight(obbCenter[1], obbCenter[0]);\n\n return {\n mbs: [mbsCenter[0], mbsCenter[1], mbsCenter[2], geometryMbs.radius],\n obb: {\n center: obbCenter,\n halfSize: geometryObb.halfSize,\n quaternion: geometryObb.quaternion\n }\n };\n}\n\n/**\n * Create array of posisitons where each vertex is vector\n * @param {array} positions\n * @returns {Vector3[]}\n */\nexport function convertPositionsToVectors(positions: Float32Array): Vector3[] {\n const result: Vector3[] = [];\n\n for (let i = 0; i < positions.length; i += 3) {\n // TODO: (perf) new Vector3 is not optimal but required in `makeOrientedBoundingBoxFromPoints`.\n // modify `makeOrientedBoundingBoxFromPoints` to use scratch vectors\n const positionVector = new Vector3([positions[i], positions[i + 1], positions[i + 2]]);\n result.push(positionVector);\n }\n\n return result;\n}\n\n/**\n * Convert common coordinate to fullExtent https://github.com/Esri/i3s-spec/blob/master/docs/1.8/fullExtent.cmn.md\n * @param\n * @param boundingVolume\n * @returns - fullExtent object\n */\nexport function convertBoundingVolumeToI3SFullExtent(\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): FullExtent {\n let sphere: BoundingSphere;\n if (boundingVolume instanceof BoundingSphere) {\n sphere = boundingVolume;\n } else {\n sphere = boundingVolume.getBoundingSphere();\n }\n const center: Vector3 = sphere.center;\n const radius: number = sphere.radius;\n const vertexMax = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] + radius, center[1] + radius, center[2] + radius),\n new Vector3()\n );\n const vertexMin = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] - radius, center[1] - radius, center[2] - radius),\n new Vector3()\n );\n\n return {\n xmin: vertexMin[0],\n xmax: vertexMax[0],\n ymin: vertexMin[1],\n ymax: vertexMax[1],\n zmin: vertexMin[2],\n zmax: vertexMax[2]\n };\n}\n\n/**\n * Creates oriented boundinb box from mbs.\n * @param mbs - Minimum Bounding Sphere\n * @returns - Oriented BOunding Box\n */\nexport function createObbFromMbs(mbs: Mbs): Obb {\n const radius = mbs[3];\n const center = new Vector3(mbs[0], mbs[1], mbs[2]);\n const halfAxex = new Matrix3([radius, 0, 0, 0, radius, 0, 0, 0, radius]);\n return new OrientedBoundingBox(center, halfAxex);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"coordinate-converter.js","names":["Matrix3","Quaternion","Vector3","Ellipsoid","OrientedBoundingBox","makeOrientedBoundingBoxFromPoints","makeBoundingSphereFromPoints","BoundingSphere","createBoundingVolumes","tile","geoidHeightModel","radius","halfSize","quaternion","boundingVolume","cartographicCenter","WGS84","cartesianToCartographic","center","getHeight","len","fromMatrix3","normalize","mbs","obb","createBoundingVolumesFromGeometry","cartesianPositions","positionVectors","convertPositionsToVectors","geometryObb","geometryMbs","mbsCenter","obbCenter","positions","result","i","length","positionVector","push","convertBoundingVolumeToI3SFullExtent","sphere","getBoundingSphere","vertexMax","vertexMin","xmin","Math","min","xmax","max","ymin","ymax","zmin","zmax","createObbFromMbs","halfAxex"],"sources":["../../../../src/i3s-converter/helpers/coordinate-converter.ts"],"sourcesContent":["import type {BoundingVolumes, FullExtent, Mbs, Obb} from '@loaders.gl/i3s';\n\nimport {Matrix3, Quaternion, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {\n OrientedBoundingBox,\n makeOrientedBoundingBoxFromPoints,\n makeBoundingSphereFromPoints,\n BoundingSphere\n} from '@math.gl/culling';\nimport {Tile3D} from '@loaders.gl/tiles';\nimport {Geoid} from '@math.gl/geoid';\n\n/**\n * Create bounding volumes object from tile and geoid height model.\n * @param tile\n * @param geoidHeightModel\n * @returns - Bounding volumes object\n */\nexport function createBoundingVolumes(tile: Tile3D, geoidHeightModel: Geoid): BoundingVolumes {\n let radius;\n let halfSize;\n let quaternion;\n\n const boundingVolume = tile.boundingVolume;\n const cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(\n boundingVolume.center,\n new Vector3()\n );\n cartographicCenter[2] =\n cartographicCenter[2] -\n geoidHeightModel.getHeight(cartographicCenter[1], cartographicCenter[0]);\n if (boundingVolume instanceof OrientedBoundingBox) {\n halfSize = boundingVolume.halfSize;\n radius = new Vector3(halfSize[0], halfSize[1], halfSize[2]).len();\n quaternion = boundingVolume.quaternion;\n } else {\n radius = tile.boundingVolume.radius;\n halfSize = [radius, radius, radius];\n quaternion = new Quaternion()\n .fromMatrix3(new Matrix3([halfSize[0], 0, 0, 0, halfSize[1], 0, 0, 0, halfSize[2]]))\n .normalize();\n }\n\n return {\n mbs: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2], radius],\n obb: {\n center: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2]],\n halfSize,\n quaternion\n }\n };\n}\n\n/**\n * Generates bounding volumes from geometry positions\n * @param cartesianPositions\n * @param geoidHeightModel\n */\nexport function createBoundingVolumesFromGeometry(\n cartesianPositions: Float32Array,\n geoidHeightModel: Geoid\n): {mbs: Mbs; obb: Obb} {\n const positionVectors = convertPositionsToVectors(cartesianPositions);\n\n const geometryObb = makeOrientedBoundingBoxFromPoints(positionVectors);\n const geometryMbs = makeBoundingSphereFromPoints(positionVectors);\n\n let mbsCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryMbs.center, new Vector3());\n let obbCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryObb.center, new Vector3());\n\n mbsCenter[2] = mbsCenter[2] - geoidHeightModel.getHeight(mbsCenter[1], mbsCenter[0]);\n obbCenter[2] = obbCenter[2] - geoidHeightModel.getHeight(obbCenter[1], obbCenter[0]);\n\n return {\n mbs: [mbsCenter[0], mbsCenter[1], mbsCenter[2], geometryMbs.radius],\n obb: {\n center: obbCenter,\n halfSize: geometryObb.halfSize,\n quaternion: geometryObb.quaternion\n }\n };\n}\n\n/**\n * Create array of posisitons where each vertex is vector\n * @param {array} positions\n * @returns {Vector3[]}\n */\nexport function convertPositionsToVectors(positions: Float32Array): Vector3[] {\n const result: Vector3[] = [];\n\n for (let i = 0; i < positions.length; i += 3) {\n // TODO: (perf) new Vector3 is not optimal but required in `makeOrientedBoundingBoxFromPoints`.\n // modify `makeOrientedBoundingBoxFromPoints` to use scratch vectors\n const positionVector = new Vector3([positions[i], positions[i + 1], positions[i + 2]]);\n result.push(positionVector);\n }\n\n return result;\n}\n\n/**\n * Convert common coordinate to fullExtent https://github.com/Esri/i3s-spec/blob/master/docs/1.8/fullExtent.cmn.md\n * @param\n * @param boundingVolume\n * @returns - fullExtent object\n */\nexport function convertBoundingVolumeToI3SFullExtent(\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): FullExtent {\n let sphere: BoundingSphere;\n if (boundingVolume instanceof BoundingSphere) {\n sphere = boundingVolume;\n } else {\n sphere = boundingVolume.getBoundingSphere();\n }\n const center: Vector3 = sphere.center;\n const radius: number = sphere.radius;\n const vertexMax = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] + radius, center[1] + radius, center[2] + radius),\n new Vector3()\n );\n const vertexMin = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] - radius, center[1] - radius, center[2] - radius),\n new Vector3()\n );\n\n // Converter sometimes returns min values that are bigger then max,\n // so we should check and take bigger value from max and smaller for nim\n return {\n xmin: Math.min(vertexMin[0], vertexMax[0]),\n xmax: Math.max(vertexMin[0], vertexMax[0]),\n ymin: Math.min(vertexMin[1], vertexMax[1]),\n ymax: Math.max(vertexMin[1], vertexMax[1]),\n zmin: Math.min(vertexMin[2], vertexMax[2]),\n zmax: Math.max(vertexMin[2], vertexMax[2])\n };\n}\n\n/**\n * Creates oriented boundinb box from mbs.\n * @param mbs - Minimum Bounding Sphere\n * @returns - Oriented BOunding Box\n */\nexport function createObbFromMbs(mbs: Mbs): Obb {\n const radius = mbs[3];\n const center = new Vector3(mbs[0], mbs[1], mbs[2]);\n const halfAxex = new Matrix3([radius, 0, 0, 0, radius, 0, 0, 0, radius]);\n return new OrientedBoundingBox(center, halfAxex);\n}\n"],"mappings":"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"}
|
|
@@ -123,6 +123,7 @@ export default class I3SConverter {
|
|
|
123
123
|
}
|
|
124
124
|
await this.loadWorkers();
|
|
125
125
|
try {
|
|
126
|
+
var _sourceTilesetJson$ro, _sourceTilesetJson$ro2;
|
|
126
127
|
const preloadOptions = await this._fetchPreloadOptions();
|
|
127
128
|
const tilesetOptions = {
|
|
128
129
|
loadOptions: {
|
|
@@ -148,7 +149,7 @@ export default class I3SConverter {
|
|
|
148
149
|
Object.assign(tilesetOptions, preloadOptions);
|
|
149
150
|
const sourceTilesetJson = await load(inputUrl, this.Loader, tilesetOptions.loadOptions);
|
|
150
151
|
this.sourceTileset = new Tileset3D(sourceTilesetJson, tilesetOptions);
|
|
151
|
-
await this._createAndSaveTileset(outputPath, tilesetName);
|
|
152
|
+
await this._createAndSaveTileset(outputPath, tilesetName, sourceTilesetJson === null || sourceTilesetJson === void 0 ? void 0 : (_sourceTilesetJson$ro = sourceTilesetJson.root) === null || _sourceTilesetJson$ro === void 0 ? void 0 : (_sourceTilesetJson$ro2 = _sourceTilesetJson$ro.boundingVolume) === null || _sourceTilesetJson$ro2 === void 0 ? void 0 : _sourceTilesetJson$ro2.region);
|
|
152
153
|
await this._finishConversion({
|
|
153
154
|
slpk: Boolean(slpk),
|
|
154
155
|
outputPath,
|
|
@@ -163,14 +164,14 @@ export default class I3SConverter {
|
|
|
163
164
|
}
|
|
164
165
|
}
|
|
165
166
|
|
|
166
|
-
async _createAndSaveTileset(outputPath, tilesetName) {
|
|
167
|
+
async _createAndSaveTileset(outputPath, tilesetName, boundingVolumeRegion) {
|
|
167
168
|
const tilesetPath = join("".concat(outputPath), "".concat(tilesetName));
|
|
168
169
|
try {
|
|
169
170
|
await removeDir(tilesetPath);
|
|
170
171
|
} catch (e) {
|
|
171
172
|
}
|
|
172
173
|
this.layers0Path = join(tilesetPath, 'SceneServer', 'layers', '0');
|
|
173
|
-
this._formLayers0(tilesetName);
|
|
174
|
+
this._formLayers0(tilesetName, boundingVolumeRegion);
|
|
174
175
|
this.materialDefinitions = [];
|
|
175
176
|
this.materialMap = new Map();
|
|
176
177
|
const sourceRootTile = this.sourceTileset.root;
|
|
@@ -196,9 +197,13 @@ export default class I3SConverter {
|
|
|
196
197
|
await this._createSlpk(tilesetPath);
|
|
197
198
|
}
|
|
198
199
|
|
|
199
|
-
_formLayers0(tilesetName) {
|
|
200
|
+
_formLayers0(tilesetName, boundingVolumeRegion) {
|
|
200
201
|
var _this$sourceTileset, _this$sourceTileset2, _this$sourceTileset2$;
|
|
201
202
|
const fullExtent = convertBoundingVolumeToI3SFullExtent(((_this$sourceTileset = this.sourceTileset) === null || _this$sourceTileset === void 0 ? void 0 : _this$sourceTileset.boundingVolume) || ((_this$sourceTileset2 = this.sourceTileset) === null || _this$sourceTileset2 === void 0 ? void 0 : (_this$sourceTileset2$ = _this$sourceTileset2.root) === null || _this$sourceTileset2$ === void 0 ? void 0 : _this$sourceTileset2$.boundingVolume));
|
|
203
|
+
if (boundingVolumeRegion) {
|
|
204
|
+
fullExtent.zmin = boundingVolumeRegion[4];
|
|
205
|
+
fullExtent.zmax = boundingVolumeRegion[5];
|
|
206
|
+
}
|
|
202
207
|
const extent = [fullExtent.xmin, fullExtent.ymin, fullExtent.xmax, fullExtent.ymax];
|
|
203
208
|
const layers0data = {
|
|
204
209
|
version: "{".concat(uuidv4().toUpperCase(), "}"),
|
|
@@ -423,9 +428,7 @@ export default class I3SConverter {
|
|
|
423
428
|
|
|
424
429
|
async _createNode(parentTile, sourceTile, parentId, level) {
|
|
425
430
|
var _this$layers, _this$layers$attribut;
|
|
426
|
-
|
|
427
|
-
this._checkAddRefinementTypeForTile(sourceTile);
|
|
428
|
-
}
|
|
431
|
+
this._checkAddRefinementTypeForTile(sourceTile);
|
|
429
432
|
await this._updateTilesetOptions();
|
|
430
433
|
await this.sourceTileset._loadTile(sourceTile);
|
|
431
434
|
let boundingVolumes = createBoundingVolumes(sourceTile, this.geoidHeightModel);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i3s-converter.js","names":["load","encode","fetchFile","getLoaderOptions","isBrowser","Tileset3D","CesiumIonLoader","Tiles3DLoader","join","v4","uuidv4","process","transform","md5","NodePages","writeFile","removeDir","writeFileForSlpk","compressWithChildProcess","calculateFilesSize","timeConverter","convertB3dmToI3sGeometry","getPropertyTable","createBoundingVolumes","convertBoundingVolumeToI3SFullExtent","createSceneServerPath","convertGeometricErrorToScreenThreshold","PGMLoader","LAYERS","layersTemplate","NODE","nodeTemplate","SHARED_RESOURCES","sharedResourcesTemplate","validateNodeBoundingVolumes","KTX2BasisWriterWorker","ImageWriter","getWorkerURL","WorkerFarm","DracoWriterWorker","WriteQueue","I3SAttributesWorker","BROWSER_ERROR_MESSAGE","createdStorageAttribute","createFieldAttribute","createPopupInfo","getAttributeType","getFieldAttributeType","ION_DEFAULT_TOKEN","env","IonToken","HARDCODED_NODES_PER_PAGE","_3D_TILES","_3D_OBJECT_LAYER_TYPE","REFRESH_TOKEN_TIMEOUT","CESIUM_DATASET_PREFIX","I3SConverter","constructor","nodePages","options","layers0Path","materialMap","Map","materialDefinitions","vertexCounter","layers0","featuresHashArray","refinementCounter","tilesCount","tilesWithAddRefineCount","validate","generateTextures","generateBoundingVolumes","layersHasTexture","convert","console","log","conversionStartTime","hrtime","tilesetName","slpk","egmFilePath","inputUrl","outputPath","draco","sevenZipExe","maxDepth","token","Boolean","Loader","indexOf","writeQueue","startListening","geoidHeightModel","useWriteFunction","loadWorkers","preloadOptions","_fetchPreloadOptions","tilesetOptions","loadOptions","_nodeWorkers","reuseWorkers","basis","format","workerUrl","headers","fetch","Object","assign","sourceTilesetJson","sourceTileset","_createAndSaveTileset","_finishConversion","error","workerFarm","getWorkerFarm","destroy","tilesetPath","e","_formLayers0","sourceRootTile","root","boundingVolumes","parentId","push","index","lodThreshold","obb","children","isCreateSlpk","root0","_formRootNodeIndexDocument","_convertNodesTree","store","defaultGeometrySchema","ordering","filter","attribute","_writeLayers0","_writeNodeIndexDocument","save","finalize","_createSlpk","fullExtent","boundingVolume","extent","xmin","ymin","xmax","ymax","layers0data","version","toUpperCase","id","name","href","nodesPerPage","compressGeometry","root0data","level","lodSelection","metricType","maxError","_loadTile","isContentSupported","child","_createNode","childPath","path","enqueue","archiveKey","writePromise","JSON","stringify","_addChildrenWithNeighborsAndWriteFile","parentNode","sourceTiles","unloadContent","nodePath","rootPath","slpkTilesetPath","slpkFileName","data","childNodes","_addChildren","_addNeighborsAndWriteFile","convertNestedTileset","sourceTile","convertNode","mbs","promises","type","Promise","all","node","Number","length","neighbor","neighbors","warn","parentTile","_checkAddRefinementTypeForTile","_updateTilesetOptions","propertyTable","content","attributeStorageInfo","_convertPropertyTableToNodeAttributes","resourcesData","_convertResources","nodes","nodesInPage","emptyResources","geometry","compressedGeometry","texture","sharedResources","meshMaterial","vertexCount","attributes","featureCount","resources","maxScreenThresholdSQ","find","val","nodeInPage","_updateNodeInNodePages","_createNodeIndexDocument","mesh","_writeResources","boundingVolumeWarnings","draftObb","center","halfSize","quaternion","workerSource","definition","resource","material","nodeId","updateAll","getNodeById","updateResourceInMesh","updateMaterialByNodeId","_findOrCreateMaterial","texelCountHint","image","height","width","updateTexelCountHintByNodeId","updateVertexCountByNodeId","updateNodeAttributeByNodeId","updateFeatureCountByNodeId","nodeData","toString","geometryData","sharedResource","textureData","attributeData","folderName","key","geometryBuffer","slpkChildPath","_writeGeometries","_writeShared","_writeTexture","_writeAttributes","slpkGeometryPath","geometryPath","slpkCompressedGeometryPath","compressedGeometryPath","sharedData","sharedDataStr","slpkSharedPath","sharedPath","_getFormatByMimeType","mimeType","formats","bufferView","writeTextureFile","copyArrayBuffer","subarray","arrayToEncode","Uint8Array","ktx2TextureData","source","ktx2","decodedFromKTX2TextureData","textureSetDefinitions","slpkTexturePath","compress","texturePath","fileBuffer","slpkAttributesPath","attributesPath","hash","has","get","newMaterialId","set","attributeIndex","propertyTableWithObjectId","OBJECTID","firstAttribute","attributeType","storageAttribute","fieldAttributeType","fieldAttribute","popupInfo","fields","layerType","params","addRefinementPercentage","filesSize","diff","conversionTime","preload","accessToken","refreshTokenTime","tile","ADD_TILE_REFINEMENT","refine","includes","url","sourceResponse","text","i3sAttributesWorkerUrl","I3SAttributes"],"sources":["../../../src/i3s-converter/i3s-converter.ts"],"sourcesContent":["import type {Tile3D, Tileset3DProps} from '@loaders.gl/tiles';\nimport type {FeatureTableJson} from '@loaders.gl/3d-tiles';\nimport type {WriteQueueItem} from '../lib/utils/write-queue';\nimport type {\n SceneLayer3D,\n BoundingVolumes,\n Node3DIndexDocument,\n NodeReference,\n MaxScreenThresholdSQ,\n NodeInPage,\n LodSelection\n} from '@loaders.gl/i3s';\nimport {load, encode, fetchFile, getLoaderOptions, isBrowser} from '@loaders.gl/core';\nimport {Tileset3D} from '@loaders.gl/tiles';\nimport {CesiumIonLoader, Tiles3DLoader} from '@loaders.gl/3d-tiles';\nimport {Geoid} from '@math.gl/geoid';\nimport {join} from 'path';\nimport {v4 as uuidv4} from 'uuid';\nimport process from 'process';\nimport transform from 'json-map-transform';\nimport md5 from 'md5';\n\nimport NodePages from './helpers/node-pages';\nimport {writeFile, removeDir, writeFileForSlpk} from '../lib/utils/file-utils';\nimport {\n compressWithChildProcess\n // generateHash128FromZip,\n // addFileToZip\n} from '../lib/utils/compress-util';\nimport {calculateFilesSize, timeConverter} from '../lib/utils/statistic-utills';\nimport convertB3dmToI3sGeometry, {getPropertyTable} from './helpers/geometry-converter';\nimport {\n createBoundingVolumes,\n convertBoundingVolumeToI3SFullExtent\n} from './helpers/coordinate-converter';\nimport {createSceneServerPath} from './helpers/create-scene-server-path';\nimport {convertGeometricErrorToScreenThreshold} from '../lib/utils/lod-conversion-utils';\nimport {PGMLoader} from '../pgm-loader';\n\nimport {LAYERS as layersTemplate} from './json-templates/layers';\nimport {NODE as nodeTemplate} from './json-templates/node';\nimport {SHARED_RESOURCES as sharedResourcesTemplate} from './json-templates/shared-resources';\nimport {validateNodeBoundingVolumes} from './helpers/node-debug';\nimport TileHeader from '@loaders.gl/tiles/src/tileset/tile-3d';\nimport {KTX2BasisWriterWorker} from '@loaders.gl/textures';\nimport {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {I3SMaterialDefinition, TextureSetDefinitionFormats} from '@loaders.gl/i3s/src/types';\nimport {ImageWriter} from '@loaders.gl/images';\nimport {GLTFImagePostprocessed} from '@loaders.gl/gltf';\nimport {I3SConvertedResources, SharedResourcesArrays} from './types';\nimport {getWorkerURL, WorkerFarm} from '@loaders.gl/worker-utils';\nimport {DracoWriterWorker} from '@loaders.gl/draco';\nimport WriteQueue from '../lib/utils/write-queue';\nimport {I3SAttributesWorker} from '../i3s-attributes-worker';\nimport {BROWSER_ERROR_MESSAGE} from '../constants';\nimport {\n createdStorageAttribute,\n createFieldAttribute,\n createPopupInfo,\n getAttributeType,\n getFieldAttributeType\n} from './helpers/feature-attributes';\n\nconst ION_DEFAULT_TOKEN =\n process.env?.IonToken || // eslint-disable-line\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlYWMxMzcyYy0zZjJkLTQwODctODNlNi01MDRkZmMzMjIxOWIiLCJpZCI6OTYyMCwic2NvcGVzIjpbImFzbCIsImFzciIsImdjIl0sImlhdCI6MTU2Mjg2NjI3M30.1FNiClUyk00YH_nWfSGpiQAjR5V2OvREDq1PJ5QMjWQ'; // eslint-disable-line\nconst HARDCODED_NODES_PER_PAGE = 64;\nconst _3D_TILES = '3DTILES';\nconst _3D_OBJECT_LAYER_TYPE = '3DObject';\nconst REFRESH_TOKEN_TIMEOUT = 1800; // 30 minutes in seconds\nconst CESIUM_DATASET_PREFIX = 'https://';\n// const FS_FILE_TOO_LARGE = 'ERR_FS_FILE_TOO_LARGE';\n\n/**\n * Converter from 3d-tiles tileset to i3s layer\n */\nexport default class I3SConverter {\n nodePages: NodePages;\n options: any;\n layers0Path: string;\n materialMap: Map<any, any>;\n materialDefinitions: I3SMaterialDefinition[];\n vertexCounter: number;\n layers0: SceneLayer3D | null;\n featuresHashArray: string[];\n refinementCounter: {\n tilesCount: number;\n tilesWithAddRefineCount: number;\n };\n validate: boolean;\n boundingVolumeWarnings?: string[] = [];\n conversionStartTime: [number, number] = [0, 0];\n refreshTokenTime: [number, number] = [0, 0];\n sourceTileset: Tileset3D | null = null;\n geoidHeightModel: Geoid | null = null;\n Loader: LoaderWithParser = Tiles3DLoader;\n generateTextures: boolean;\n generateBoundingVolumes: boolean;\n layersHasTexture: boolean;\n workerSource: {[key: string]: string} = {};\n writeQueue: WriteQueue<WriteQueueItem> = new WriteQueue();\n\n constructor() {\n this.nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);\n this.options = {};\n this.layers0Path = '';\n this.materialMap = new Map();\n this.materialDefinitions = [];\n this.vertexCounter = 0;\n this.layers0 = null;\n this.featuresHashArray = [];\n this.refinementCounter = {\n tilesCount: 0,\n tilesWithAddRefineCount: 0\n };\n this.validate = false;\n this.generateTextures = false;\n this.generateBoundingVolumes = false;\n this.layersHasTexture = false;\n }\n\n /**\n * Convert a 3d tileset\n * @param options\n * @param options.inputUrl the url to read the tileset from\n * @param options.outputPath the output filename\n * @param options.tilesetName the output name of the tileset\n * @param options.maxDepth The max tree depth of conversion\n * @param options.slpk Generate slpk (Scene Layer Packages) output file\n * @param options.sevenZipExe Location of 7z.exe archiver to create slpk on Windows\n * @param options.egmFilePath location of *.pgm file to convert heights from ellipsoidal to gravity-related format\n * @param options.token Token for Cesium ION tilesets authentication\n * @param options.draco Generate I3S 1.7 draco compressed geometries\n * @param options.validate -enable validation\n */\n async convert(options: {\n inputUrl: string;\n outputPath: string;\n tilesetName: string;\n sevenZipExe: string;\n egmFilePath: string;\n maxDepth?: number;\n slpk?: boolean;\n token?: string;\n draco?: boolean;\n validate?: boolean;\n generateTextures?: boolean;\n generateBoundingVolumes?: boolean;\n }): Promise<any> {\n if (isBrowser) {\n console.log(BROWSER_ERROR_MESSAGE);\n return BROWSER_ERROR_MESSAGE;\n }\n this.conversionStartTime = process.hrtime();\n const {\n tilesetName,\n slpk,\n egmFilePath,\n inputUrl,\n validate,\n outputPath,\n draco,\n sevenZipExe,\n maxDepth,\n token,\n generateTextures,\n generateBoundingVolumes\n } = options;\n this.options = {maxDepth, slpk, sevenZipExe, egmFilePath, draco, token, inputUrl};\n this.validate = Boolean(validate);\n this.Loader = inputUrl.indexOf(CESIUM_DATASET_PREFIX) !== -1 ? CesiumIonLoader : Tiles3DLoader;\n this.generateTextures = Boolean(generateTextures);\n this.generateBoundingVolumes = Boolean(generateBoundingVolumes);\n\n this.writeQueue = new WriteQueue();\n this.writeQueue.startListening();\n\n console.log('Loading egm file...'); // eslint-disable-line\n this.geoidHeightModel = await load(egmFilePath, PGMLoader);\n console.log('Loading egm file completed!'); // eslint-disable-line\n\n if (slpk) {\n this.nodePages.useWriteFunction(writeFileForSlpk);\n }\n\n await this.loadWorkers();\n\n try {\n const preloadOptions = await this._fetchPreloadOptions();\n const tilesetOptions: Tileset3DProps = {\n loadOptions: {\n _nodeWorkers: true,\n reuseWorkers: true,\n basis: {format: 'rgba32'},\n 'basis-nodejs': {\n format: 'rgba32',\n workerUrl: './modules/textures/dist/basis-nodejs-worker.js'\n },\n 'draco-nodejs': {workerUrl: './modules/draco/dist/draco-nodejs-worker.js'}\n }\n };\n if (preloadOptions.headers) {\n tilesetOptions.loadOptions!.fetch = {headers: preloadOptions.headers};\n }\n Object.assign(tilesetOptions, preloadOptions);\n const sourceTilesetJson = await load(inputUrl, this.Loader, tilesetOptions.loadOptions);\n // console.log(tilesetJson); // eslint-disable-line\n this.sourceTileset = new Tileset3D(sourceTilesetJson, tilesetOptions);\n\n await this._createAndSaveTileset(outputPath, tilesetName);\n await this._finishConversion({slpk: Boolean(slpk), outputPath, tilesetName});\n return sourceTilesetJson;\n } catch (error) {\n throw error;\n } finally {\n // Clean up worker pools\n const workerFarm = WorkerFarm.getWorkerFarm({});\n workerFarm.destroy();\n }\n }\n\n /**\n * Convert and save the layer and embedded tiles\n * @param outputPath - path to save output data\n * @param tilesetName - new tileset path\n */\n private async _createAndSaveTileset(outputPath: string, tilesetName: string): Promise<void> {\n const tilesetPath = join(`${outputPath}`, `${tilesetName}`);\n // Removing the tilesetPath needed to exclude erroneous files after conversion\n try {\n await removeDir(tilesetPath);\n } catch (e) {\n // do nothing\n }\n\n this.layers0Path = join(tilesetPath, 'SceneServer', 'layers', '0');\n\n this._formLayers0(tilesetName);\n\n this.materialDefinitions = [];\n this.materialMap = new Map();\n\n const sourceRootTile: TileHeader = this.sourceTileset!.root!;\n const boundingVolumes = createBoundingVolumes(sourceRootTile, this.geoidHeightModel!);\n const parentId = this.nodePages.push({\n index: 0,\n lodThreshold: 0,\n obb: boundingVolumes.obb,\n children: []\n });\n\n const isCreateSlpk = this.options.slpk;\n const root0 = this._formRootNodeIndexDocument(boundingVolumes);\n\n await this._convertNodesTree(root0, sourceRootTile, parentId, boundingVolumes);\n\n this.layers0!.materialDefinitions = this.materialDefinitions;\n\n if (this.layersHasTexture === false) {\n this.layers0!.store.defaultGeometrySchema.ordering =\n this.layers0!.store.defaultGeometrySchema.ordering.filter(\n (attribute) => attribute !== 'uv0'\n );\n }\n\n await this._writeLayers0();\n createSceneServerPath(tilesetName, this.layers0!, tilesetPath);\n await this._writeNodeIndexDocument(root0, 'root', join(this.layers0Path, 'nodes', 'root'));\n await this.nodePages.save(this.layers0Path, this.writeQueue, isCreateSlpk);\n await this.writeQueue.finalize();\n await this._createSlpk(tilesetPath);\n }\n\n /**\n * Form object of 3DSceneLayer https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DSceneLayer.cmn.md\n * @param tilesetName - Name of layer\n */\n private _formLayers0(tilesetName: string): void {\n const fullExtent = convertBoundingVolumeToI3SFullExtent(\n this.sourceTileset?.boundingVolume || this.sourceTileset?.root?.boundingVolume\n );\n const extent = [fullExtent.xmin, fullExtent.ymin, fullExtent.xmax, fullExtent.ymax];\n const layers0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 0,\n name: tilesetName,\n href: './layers/0',\n store: {\n id: `{${uuidv4().toUpperCase()}}`,\n extent\n },\n nodePages: {\n nodesPerPage: HARDCODED_NODES_PER_PAGE\n },\n compressGeometry: this.options.draco,\n fullExtent\n };\n this.layers0 = transform(layers0data, layersTemplate());\n }\n\n /**\n * Convert and save the layer and embedded tiles\n * @param boundingVolumes - mbs and obb data about node's bounding volume\n * @return 3DNodeIndexDocument data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n */\n private _formRootNodeIndexDocument(boundingVolumes: BoundingVolumes): Node3DIndexDocument {\n const root0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 'root',\n level: 0,\n lodSelection: [\n {\n metricType: 'maxScreenThresholdSQ',\n maxError: 0\n },\n {\n metricType: 'maxScreenThreshold',\n maxError: 0\n }\n ],\n ...boundingVolumes,\n children: []\n };\n return transform(root0data, nodeTemplate());\n }\n\n /**\n * Form object of 3DSceneLayer https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DSceneLayer.cmn.md\n * @param root0 - 3DNodeIndexDocument of root node https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n * @param sourceRootTile - Source (3DTile) tile data\n * @param parentId - node id in node pages\n * @param boundingVolumes - mbs and obb data about node's bounding volume\n */\n private async _convertNodesTree(\n root0: Node3DIndexDocument,\n sourceRootTile: TileHeader,\n parentId: number,\n boundingVolumes: BoundingVolumes\n ): Promise<void> {\n await this.sourceTileset!._loadTile(sourceRootTile);\n if (this.isContentSupported(sourceRootTile)) {\n root0.children = root0.children || [];\n root0.children.push({\n id: '1',\n href: './1',\n ...boundingVolumes\n });\n const [child] = await this._createNode(root0, sourceRootTile, parentId, 0);\n const childPath = join(this.layers0Path, 'nodes', child.path!);\n\n if (this.options.slpk) {\n await this.writeQueue.enqueue({\n archiveKey: 'nodes/1/3dNodeIndexDocument.json.gz',\n writePromise: writeFileForSlpk(\n childPath,\n JSON.stringify(child),\n '3dNodeIndexDocument.json'\n )\n });\n } else {\n await this.writeQueue.enqueue({writePromise: writeFile(childPath, JSON.stringify(child))});\n }\n } else {\n await this._addChildrenWithNeighborsAndWriteFile({\n parentNode: root0,\n sourceTiles: sourceRootTile.children,\n parentId,\n level: 1\n });\n }\n await sourceRootTile.unloadContent();\n }\n\n /**\n * Write 3DSceneLayer https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DSceneLayer.cmn.md in file\n */\n private async _writeLayers0(): Promise<void> {\n if (this.options.slpk) {\n await this.writeQueue.enqueue({\n archiveKey: '3dSceneLayer.json.gz',\n writePromise: writeFileForSlpk(\n this.layers0Path,\n JSON.stringify(this.layers0),\n '3dSceneLayer.json'\n )\n });\n } else {\n await this.writeQueue.enqueue({\n writePromise: writeFile(this.layers0Path, JSON.stringify(this.layers0))\n });\n }\n }\n\n /**\n * Write 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md in file\n */\n private async _writeNodeIndexDocument(\n root0: Node3DIndexDocument,\n nodePath: string,\n rootPath: string\n ): Promise<void> {\n if (this.options.slpk) {\n await this.writeQueue.enqueue({\n archiveKey: `nodes/${nodePath}/3dNodeIndexDocument.json.gz`,\n writePromise: writeFileForSlpk(rootPath, JSON.stringify(root0), '3dNodeIndexDocument.json')\n });\n } else {\n await this.writeQueue.enqueue({writePromise: writeFile(rootPath, JSON.stringify(root0))});\n }\n }\n\n /**\n * Pack files into *.slpk archive\n * @param tilesetPath - Path to save file\n */\n private async _createSlpk(tilesetPath: string): Promise<void> {\n if (this.options.slpk) {\n const slpkTilesetPath = join(tilesetPath, 'SceneServer', 'layers', '0');\n const slpkFileName = `${tilesetPath}.slpk`;\n await compressWithChildProcess(\n slpkTilesetPath,\n slpkFileName,\n 0,\n '.',\n this.options.sevenZipExe\n );\n\n // TODO: `addFileToZip` corrupts archive so it can't be validated with windows i3s_converter.exe\n // const fileHash128Path = `${tilesetPath}/@specialIndexFileHASH128@`;\n // try {\n // await generateHash128FromZip(slpkFileName, fileHash128Path);\n // await addFileToZip(\n // tilesetPath,\n // '@specialIndexFileHASH128@',\n // slpkFileName,\n // this.options.sevenZipExe\n // );\n // } catch (error) {\n // if (error.code === FS_FILE_TOO_LARGE) {\n // console.warn(`${slpkFileName} file is too big to generate a hash`); // eslint-disable-line\n // } else {\n // console.error(error); // eslint-disable-line\n // }\n // }\n // All converted files are contained in slpk now they can be deleted\n try {\n await removeDir(tilesetPath);\n } catch (e) {\n // do nothing\n }\n }\n }\n\n /**\n * Add child nodes recursively and write them to files\n * @param data - arguments\n * @param data.sourceTiles - array of source child nodes\n * @param data.parentNode - 3DNodeIndexDocument of parent node for processing child nodes\n * @param data.parentId - id of parent node in node pages\n * @param data.level - level of node (distanse to root node in the tree)\n */\n private async _addChildrenWithNeighborsAndWriteFile(data: {\n parentNode: Node3DIndexDocument;\n sourceTiles: TileHeader[];\n parentId: number;\n level: number;\n }): Promise<void> {\n const childNodes = [];\n await this._addChildren({...data, childNodes});\n await this._addNeighborsAndWriteFile(data.parentNode, childNodes);\n }\n\n /**\n * Convert nested subtree of 3DTiles dataset\n * @param param0\n * @param param0.sourceTile - source 3DTile data\n * @param param0.parentNode - parent I3S node\n * @param param0.childNodes - child I3S nodes\n * @param param0.parentId - parent node ID\n * @param param0.level - tree level\n */\n private async convertNestedTileset({\n sourceTile,\n parentNode,\n childNodes,\n parentId,\n level\n }: {\n childNodes: NodeReference[];\n sourceTile: TileHeader;\n parentNode: Node3DIndexDocument;\n parentId: number;\n level: number;\n }) {\n await this.sourceTileset!._loadTile(sourceTile);\n await this._addChildren({\n parentNode,\n sourceTiles: sourceTile.children,\n childNodes,\n parentId,\n level: level + 1\n });\n await sourceTile.unloadContent();\n }\n\n /**\n * Convert 3DTiles tile to I3S node\n * @param param0\n * @param param0.sourceTile - source 3DTile data\n * @param param0.parentNode - parent I3S node\n * @param param0.childNodes - child I3S nodes\n * @param param0.parentId - parent node ID\n * @param param0.level - tree level\n */\n private async convertNode({\n sourceTile,\n parentNode,\n childNodes,\n parentId,\n level\n }: {\n childNodes: NodeReference[];\n sourceTile: TileHeader;\n parentNode: Node3DIndexDocument;\n parentId: number;\n level: number;\n }) {\n const children = await this._createNode(parentNode, sourceTile, parentId, level);\n parentNode.children = parentNode.children || [];\n for (const child of children) {\n parentNode.children.push({\n id: child.id,\n href: `../${child.path}`,\n obb: child.obb,\n mbs: child.mbs\n });\n childNodes.push(child);\n }\n }\n\n /**\n * Add child nodes recursively and write them to files\n * @param data - arguments\n * @param data.childNodes - array of target child nodes\n * @param data.sourceTiles - array of source child nodes\n * @param data.parentNode - 3DNodeIndexDocument of parent node for processing child nodes\n * @param data.parentId - id of parent node in node pages\n * @param data.level - level of node (distanse to root node in the tree)\n */\n private async _addChildren(data: {\n childNodes: NodeReference[];\n sourceTiles: TileHeader[];\n parentNode: Node3DIndexDocument;\n parentId: number;\n level: number;\n }): Promise<void> {\n const {childNodes, sourceTiles, parentNode, parentId, level} = data;\n if (this.options.maxDepth && level > this.options.maxDepth) {\n return;\n }\n\n const promises: Promise<void>[] = [];\n\n for (const sourceTile of sourceTiles) {\n if (sourceTile.type === 'json') {\n promises.push(\n this.convertNestedTileset({sourceTile, parentNode, childNodes, parentId, level})\n );\n } else {\n promises.push(this.convertNode({sourceTile, parentNode, childNodes, parentId, level}));\n }\n await Promise.all(promises);\n if (sourceTile.id) {\n console.log(sourceTile.id); // eslint-disable-line\n }\n }\n }\n\n /**\n * Add neightbors to 3DNodeIndexDocument and write it in a file\n * @param parentNode - arguments\n * @param childNodes - array of target child nodes\n */\n private async _addNeighborsAndWriteFile(\n parentNode: Node3DIndexDocument,\n childNodes: Node3DIndexDocument[]\n ): Promise<void> {\n for (const node of childNodes) {\n const childPath = join(this.layers0Path, 'nodes', node.path!);\n const nodePath = node.path;\n delete node.path;\n\n // Don't do large amount of \"neightbors\" to avoid big memory consumption\n if (Number(parentNode?.children?.length) < 1000) {\n for (const neighbor of parentNode.children || []) {\n // eslint-disable-next-line max-depth\n if (node.id === neighbor.id) {\n continue; // eslint-disable-line\n }\n\n if (node.neighbors) {\n node.neighbors.push({...neighbor});\n }\n }\n } else {\n // eslint-disable-next-line no-console, no-undef\n console.warn(\n `Node ${node.id}: neighbors attribute is omited because of large number of neigbors`\n );\n delete node.neighbors;\n }\n await this._writeNodeIndexDocument(node, nodePath!, childPath);\n node.neighbors = [];\n }\n }\n\n /**\n * Convert tile to one or more I3S nodes\n * @param parentTile - parent 3DNodeIndexDocument\n * @param sourceTile - source tile (3DTile)\n * @param parentId - id of parent node in node pages\n * @param level - level of node (distanse to root node in the tree)\n */\n private async _createNode(\n parentTile: Node3DIndexDocument,\n sourceTile: TileHeader,\n parentId: number,\n level: number\n ): Promise<Node3DIndexDocument[]> {\n if (this.validate) {\n this._checkAddRefinementTypeForTile(sourceTile);\n }\n\n await this._updateTilesetOptions();\n await this.sourceTileset!._loadTile(sourceTile);\n\n let boundingVolumes = createBoundingVolumes(sourceTile, this.geoidHeightModel!);\n\n const propertyTable = getPropertyTable(sourceTile.content);\n\n if (propertyTable && !this.layers0?.attributeStorageInfo?.length) {\n this._convertPropertyTableToNodeAttributes(propertyTable);\n }\n\n const resourcesData = await this._convertResources(sourceTile, parentId, propertyTable);\n\n const nodes: Node3DIndexDocument[] = [];\n const nodesInPage: NodeInPage[] = [];\n const emptyResources = {\n geometry: null,\n compressedGeometry: null,\n texture: null,\n sharedResources: null,\n meshMaterial: null,\n vertexCount: null,\n attributes: null,\n featureCount: null,\n boundingVolumes: null\n };\n\n for (const resources of resourcesData || [emptyResources]) {\n this.layersHasTexture = this.layersHasTexture || Boolean(resources.texture);\n\n if (this.generateBoundingVolumes && resources.boundingVolumes) {\n boundingVolumes = resources.boundingVolumes;\n }\n\n const lodSelection = convertGeometricErrorToScreenThreshold(sourceTile, boundingVolumes);\n const maxScreenThresholdSQ = lodSelection.find(\n (val) => val.metricType === 'maxScreenThresholdSQ'\n ) || {maxError: 0};\n\n const nodeInPage = this._updateNodeInNodePages(\n maxScreenThresholdSQ,\n boundingVolumes,\n sourceTile,\n parentId,\n resources\n );\n const node = this._createNodeIndexDocument(\n parentTile,\n boundingVolumes,\n lodSelection,\n nodeInPage,\n resources\n );\n\n if (nodeInPage.mesh) {\n await this._writeResources(resources, node.path!);\n }\n\n if (this.validate) {\n this.boundingVolumeWarnings = validateNodeBoundingVolumes(node);\n\n if (this.boundingVolumeWarnings && this.boundingVolumeWarnings.length) {\n console.warn('Bounding Volume Warnings: ', ...this.boundingVolumeWarnings); //eslint-disable-line\n }\n }\n\n nodes.push(node);\n nodesInPage.push(nodeInPage);\n }\n\n sourceTile.unloadContent();\n\n await this._addChildrenWithNeighborsAndWriteFile({\n parentNode: nodes[0],\n sourceTiles: sourceTile.children,\n parentId: nodesInPage[0].index!,\n level: level + 1\n });\n return nodes;\n }\n\n /**\n * Convert tile to one or more I3S nodes\n * @param sourceTile - source tile (3DTile)\n * @param parentId - id of parent node in node pages\n * @param propertyTable - batch table from b3dm / feature properties from EXT_FEATURE_METADATA\n * result.geometry - ArrayBuffer with geometry attributes\n * result.compressedGeometry - ArrayBuffer with compressed (draco) geometry\n * result.texture - texture image\n * result.sharedResources - shared resource data object\n * result.meshMaterial - PBR-like material object\n * result.vertexCount - number of vertices in geometry\n * result.attributes - feature attributes\n * result.featureCount - number of features\n */\n private async _convertResources(\n sourceTile: TileHeader,\n parentId: number,\n propertyTable: FeatureTableJson | null\n ): Promise<I3SConvertedResources[] | null> {\n if (!this.isContentSupported(sourceTile)) {\n return null;\n }\n const draftObb = {\n center: [],\n halfSize: [],\n quaternion: []\n };\n const resourcesData = await convertB3dmToI3sGeometry(\n sourceTile.content,\n () => this.nodePages.push({index: 0, obb: draftObb}, parentId),\n propertyTable,\n this.featuresHashArray,\n this.layers0?.attributeStorageInfo,\n this.options.draco,\n this.generateBoundingVolumes,\n this.geoidHeightModel!,\n this.workerSource\n );\n return resourcesData;\n }\n\n /**\n * Update node object (https://github.com/Esri/i3s-spec/blob/master/docs/1.7/node.cmn.md)\n * in node pages (https://github.com/Esri/i3s-spec/blob/master/docs/1.7/nodePage.cmn.md)\n * @param maxScreenThresholdSQ - Level of Details (LOD) metric\n * @param boundingVolumes - Bounding volumes\n * @param sourceTile - source tile (3DTile)\n * @param parentId - id of parent node in node pages\n * @param resources - the node resources data\n * @param resources.meshMaterial - PBR-like material object\n * @param resources.texture - texture image\n * @param resources.vertexCount - number of vertices in geometry\n * @param resources.featureCount - number of features\n * @return the node object in node pages\n */\n private _updateNodeInNodePages(\n maxScreenThresholdSQ: MaxScreenThresholdSQ,\n boundingVolumes: BoundingVolumes,\n sourceTile: TileHeader,\n parentId: number,\n resources: I3SConvertedResources\n ): NodeInPage {\n const {meshMaterial, texture, vertexCount, featureCount, geometry} = resources;\n const nodeInPage: NodeInPage = {\n index: 0,\n lodThreshold: maxScreenThresholdSQ.maxError,\n obb: boundingVolumes.obb,\n children: []\n };\n if (geometry && this.isContentSupported(sourceTile)) {\n nodeInPage.mesh = {\n geometry: {\n definition: texture ? 0 : 1,\n resource: 0\n },\n attribute: {\n resource: 0\n },\n material: {\n definition: 0\n }\n };\n }\n\n let nodeId = resources.nodeId;\n if (nodeId) {\n this.nodePages.updateAll(nodeId, nodeInPage);\n const node = this.nodePages.getNodeById(nodeId);\n this.nodePages.updateResourceInMesh(node);\n } else {\n nodeId = this.nodePages.push(nodeInPage, parentId);\n }\n\n if (meshMaterial) {\n this.nodePages.updateMaterialByNodeId(nodeId, this._findOrCreateMaterial(meshMaterial));\n }\n\n if (texture) {\n const texelCountHint = texture.image.height * texture.image.width;\n this.nodePages.updateTexelCountHintByNodeId(nodeId, texelCountHint);\n }\n\n if (vertexCount) {\n this.vertexCounter += vertexCount;\n this.nodePages.updateVertexCountByNodeId(nodeId, vertexCount);\n }\n this.nodePages.updateNodeAttributeByNodeId(nodeId);\n if (featureCount) {\n this.nodePages.updateFeatureCountByNodeId(nodeId, featureCount);\n }\n\n return this.nodePages.getNodeById(nodeId);\n }\n\n /**\n * Create a new node page object in node pages\n * @param parentNode - 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object of the parent node\n * @param boundingVolumes - Bounding volumes\n * @param lodSelection - Level of Details (LOD) metrics\n * @param nodeInPage - corresponding node object in a node page\n * @param resources - the node resources data\n * @param resources.texture - texture image\n * @param resources.attributes - feature attributes\n * @return 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object\n */\n private _createNodeIndexDocument(\n parentNode: Node3DIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources\n ): Node3DIndexDocument {\n const {texture, attributes} = resources;\n const nodeId = nodeInPage.index!;\n const nodeData = {\n version: parentNode.version,\n id: nodeId.toString(),\n path: nodeId.toString(),\n level: parentNode.level! + 1,\n ...boundingVolumes,\n lodSelection,\n parentNode: {\n id: parentNode.id,\n href: `../${parentNode.id}`,\n mbs: parentNode.mbs,\n obb: parentNode.obb\n },\n children: [],\n neighbors: []\n };\n const node = transform(nodeData, nodeTemplate());\n\n if (nodeInPage.mesh) {\n node.geometryData = [{href: './geometries/0'}];\n node.sharedResource = {href: './shared'};\n\n if (texture) {\n node.textureData = [{href: './textures/0'}, {href: './textures/1'}];\n }\n\n if (attributes && attributes.length && this.layers0?.attributeStorageInfo?.length) {\n node.attributeData = [];\n for (let index = 0; index < attributes.length; index++) {\n const folderName = this.layers0.attributeStorageInfo[index].key;\n node.attributeData.push({href: `./attributes/${folderName}/0`});\n }\n }\n }\n\n return node;\n }\n\n /**\n * Write node resources in files\n * @param resources - source tile (3DTile)\n * @param resources.geometry - Uint8Array with geometry attributes\n * @param resources.compressedGeometry - Uint8Array with compressed (draco) geometry\n * @param resources.texture - texture image\n * @param resources.sharedResources - shared resource data object\n * @param resources.attributes - feature attributes\n * @return {Promise<void>}\n */\n private async _writeResources(resources: I3SConvertedResources, nodePath: string): Promise<void> {\n const {\n geometry: geometryBuffer,\n compressedGeometry,\n texture,\n sharedResources,\n attributes\n } = resources;\n const childPath = join(this.layers0Path, 'nodes', nodePath);\n const slpkChildPath = join('nodes', nodePath);\n\n await this._writeGeometries(geometryBuffer!, compressedGeometry!, childPath, slpkChildPath);\n await this._writeShared(sharedResources, childPath, slpkChildPath, nodePath);\n await this._writeTexture(texture, childPath, slpkChildPath);\n await this._writeAttributes(attributes, childPath, slpkChildPath);\n }\n\n /**\n * Write non-compressed and compressed geometries in files\n * @param geometryBuffer - Uint8Array with geometry attributes\n * @param compressedGeometry - Uint8Array with compressed (draco) geometry\n * @param childPath - a child path to write resources\n * @param slpkChildPath - resource path inside *slpk file\n */\n private async _writeGeometries(\n geometryBuffer: ArrayBuffer,\n compressedGeometry: Promise<ArrayBuffer>,\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (this.options.slpk) {\n const slpkGeometryPath = join(childPath, 'geometries');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/geometries/0.bin.gz`,\n writePromise: writeFileForSlpk(slpkGeometryPath, geometryBuffer, '0.bin')\n });\n } else {\n const geometryPath = join(childPath, 'geometries/0/');\n await this.writeQueue.enqueue({\n writePromise: writeFile(geometryPath, geometryBuffer, 'index.bin')\n });\n }\n\n if (this.options.draco) {\n if (this.options.slpk) {\n const slpkCompressedGeometryPath = join(childPath, 'geometries');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/geometries/1.bin.gz`,\n writePromise: writeFileForSlpk(slpkCompressedGeometryPath, compressedGeometry, '1.bin')\n });\n } else {\n const compressedGeometryPath = join(childPath, 'geometries/1/');\n await this.writeQueue.enqueue({\n writePromise: writeFile(compressedGeometryPath, compressedGeometry, 'index.bin')\n });\n }\n }\n }\n\n /**\n * Write shared resources in a file\n * @param sharedResources - shared resource data object\n * @param childPath - a child path to write resources\n * @param slpkChildPath - resource path inside *slpk file\n * @param nodePath - a node path\n */\n private async _writeShared(\n sharedResources: SharedResourcesArrays | null,\n childPath: string,\n slpkChildPath: string,\n nodePath: string\n ): Promise<void> {\n if (!sharedResources) {\n return;\n }\n sharedResources.nodePath = nodePath;\n const sharedData = transform(sharedResources, sharedResourcesTemplate());\n const sharedDataStr = JSON.stringify(sharedData);\n if (this.options.slpk) {\n const slpkSharedPath = join(childPath, 'shared');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/shared/sharedResource.json.gz`,\n writePromise: writeFileForSlpk(slpkSharedPath, sharedDataStr, 'sharedResource.json')\n });\n } else {\n const sharedPath = join(childPath, 'shared/');\n await this.writeQueue.enqueue({writePromise: writeFile(sharedPath, sharedDataStr)});\n }\n }\n\n /**\n * Generates textures based on texture mime type and fill in textureSetDefinitions data.\n * @param texture - the texture image\n * @param childPath - a child path to write resources\n * @param slpkChildPath - the resource path inside *slpk file\n */\n private async _writeTexture(\n texture: GLTFImagePostprocessed,\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (texture) {\n const format = this._getFormatByMimeType(texture?.mimeType);\n const formats: TextureSetDefinitionFormats = [];\n const textureData = texture.bufferView!.data;\n\n switch (format) {\n case 'jpg':\n case 'png': {\n formats.push({name: '0', format});\n await this.writeTextureFile(textureData, '0', format, childPath, slpkChildPath);\n\n if (this.generateTextures) {\n formats.push({name: '1', format: 'ktx2'});\n // For Node.js texture.image.data is type of Buffer\n const copyArrayBuffer = texture.image.data.subarray();\n const arrayToEncode = new Uint8Array(copyArrayBuffer);\n const ktx2TextureData = encode(\n {...texture.image, data: arrayToEncode},\n KTX2BasisWriterWorker,\n {\n ...KTX2BasisWriterWorker.options,\n source: this.workerSource.ktx2,\n reuseWorkers: true,\n _nodeWorkers: true\n }\n );\n\n await this.writeTextureFile(ktx2TextureData, '1', 'ktx2', childPath, slpkChildPath);\n }\n\n break;\n }\n\n case 'ktx2': {\n formats.push({name: '1', format});\n await this.writeTextureFile(textureData, '1', format, childPath, slpkChildPath);\n\n if (this.generateTextures) {\n formats.push({name: '0', format: 'jpg'});\n const decodedFromKTX2TextureData = encode(texture.image!.data[0], ImageWriter);\n await this.writeTextureFile(\n decodedFromKTX2TextureData,\n '0',\n 'jpg',\n childPath,\n slpkChildPath\n );\n }\n }\n }\n\n if (!this.layers0!.textureSetDefinitions!.length) {\n this.layers0!.textureSetDefinitions!.push({formats});\n }\n }\n }\n\n /**\n * Write the texture image in a file\n * @param textureData\n * @param name\n * @param format\n * @param childPath\n * @param slpkChildPath\n */\n private async writeTextureFile(\n textureData: Promise<ArrayBuffer>,\n name: string,\n format: 'jpg' | 'png' | 'ktx2',\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (this.options.slpk) {\n const slpkTexturePath = join(childPath, 'textures');\n const compress = false;\n\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/textures/${name}.${format}`,\n writePromise: writeFileForSlpk(slpkTexturePath, textureData, `${name}.${format}`, compress)\n });\n } else {\n const texturePath = join(childPath, `textures/${name}/`);\n await this.writeQueue.enqueue({\n writePromise: writeFile(texturePath, textureData, `index.${format}`)\n });\n }\n }\n\n /**\n * Write feature attributes in files\n * @param attributes - feature attributes\n * @param childPath - a child path to write resources\n * @param slpkChildPath - the resource path inside *slpk file\n */\n private async _writeAttributes(\n attributes: ArrayBuffer[] | null = [],\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (attributes?.length && this.layers0?.attributeStorageInfo?.length) {\n for (let index = 0; index < attributes.length; index++) {\n const folderName = this.layers0.attributeStorageInfo[index].key;\n const fileBuffer = new Uint8Array(attributes[index]);\n\n if (this.options.slpk) {\n const slpkAttributesPath = join(childPath, 'attributes', folderName);\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/attributes/${folderName}.bin.gz`,\n writePromise: writeFileForSlpk(slpkAttributesPath, fileBuffer, '0.bin')\n });\n } else {\n const attributesPath = join(childPath, `attributes/${folderName}/0`);\n await this.writeQueue.enqueue({\n writePromise: writeFile(attributesPath, fileBuffer, 'index.bin')\n });\n }\n }\n }\n }\n\n /**\n * Return file format by its MIME type\n * @param mimeType - feature attributes\n */\n private _getFormatByMimeType(mimeType: string | undefined): 'jpg' | 'png' | 'ktx2' {\n switch (mimeType) {\n case 'image/jpeg':\n return 'jpg';\n case 'image/png':\n return 'png';\n case 'image/ktx2':\n return 'ktx2';\n default:\n return 'jpg';\n }\n }\n\n /**\n * Find or create material in materialDefinitions array\n * @param material - end-to-end index of the node\n * @return material id\n */\n private _findOrCreateMaterial(material: I3SMaterialDefinition): number {\n const hash = md5(JSON.stringify(material));\n if (this.materialMap.has(hash)) {\n return this.materialMap.get(hash);\n }\n const newMaterialId = this.materialDefinitions.push(material) - 1;\n this.materialMap.set(hash, newMaterialId);\n return newMaterialId;\n }\n\n /**\n * Do conversion of 3DTiles property table to I3s node attributes.\n * @param propertyTable - Table with layer meta data.\n */\n private _convertPropertyTableToNodeAttributes(propertyTable: FeatureTableJson): void {\n let attributeIndex = 0;\n const propertyTableWithObjectId = {\n OBJECTID: [0],\n ...propertyTable\n };\n\n for (const key in propertyTableWithObjectId) {\n const firstAttribute = propertyTableWithObjectId[key][0];\n const attributeType = getAttributeType(key, firstAttribute);\n\n const storageAttribute = createdStorageAttribute(attributeIndex, key, attributeType);\n const fieldAttributeType = getFieldAttributeType(attributeType);\n const fieldAttribute = createFieldAttribute(key, fieldAttributeType);\n const popupInfo = createPopupInfo(propertyTableWithObjectId);\n\n this.layers0!.attributeStorageInfo!.push(storageAttribute);\n this.layers0!.fields!.push(fieldAttribute);\n this.layers0!.popupInfo = popupInfo;\n this.layers0!.layerType = _3D_OBJECT_LAYER_TYPE;\n\n attributeIndex += 1;\n }\n }\n\n /**\n * Print statistics in the end of conversion\n * @param params - output files data\n */\n private async _finishConversion(params: {\n slpk: boolean;\n outputPath: string;\n tilesetName: string;\n }): Promise<void> {\n const {tilesCount, tilesWithAddRefineCount} = this.refinementCounter;\n const addRefinementPercentage = tilesWithAddRefineCount\n ? (tilesWithAddRefineCount / tilesCount) * 100\n : 0;\n const filesSize = await calculateFilesSize(params);\n const diff = process.hrtime(this.conversionStartTime);\n const conversionTime = timeConverter(diff);\n console.log(`------------------------------------------------`); // eslint-disable-line no-undef, no-console\n console.log(`Finishing conversion of ${_3D_TILES}`); // eslint-disable-line no-undef, no-console\n console.log(`Total conversion time: ${conversionTime}`); // eslint-disable-line no-undef, no-console\n console.log(`Vertex count: `, this.vertexCounter); // eslint-disable-line no-undef, no-console\n console.log(`File(s) size: `, filesSize, ' bytes'); // eslint-disable-line no-undef, no-console\n console.log(`Percentage of tiles with \"ADD\" refinement type:`, addRefinementPercentage, '%'); // eslint-disable-line no-undef, no-console\n console.log(`------------------------------------------------`); // eslint-disable-line no-undef, no-console\n }\n\n /**\n * Fetch preload options for ION tileset\n */\n private async _fetchPreloadOptions(): Promise<any> {\n if (!this.Loader.preload) {\n return {};\n }\n const options = {\n 'cesium-ion': {accessToken: this.options.token || ION_DEFAULT_TOKEN}\n };\n const preloadOptions = await this.Loader.preload(this.options.inputUrl, options);\n this.refreshTokenTime = process.hrtime();\n return {...options, ...preloadOptions};\n }\n\n /**\n * Update options of source tileset\n */\n private async _updateTilesetOptions(): Promise<void> {\n const diff = process.hrtime(this.refreshTokenTime);\n if (diff[0] < REFRESH_TOKEN_TIMEOUT) {\n return;\n }\n this.refreshTokenTime = process.hrtime();\n\n const preloadOptions = await this._fetchPreloadOptions();\n this.sourceTileset!.options = {...this.sourceTileset!.options, ...preloadOptions};\n if (preloadOptions.headers) {\n this.sourceTileset!.loadOptions.fetch = {\n ...this.sourceTileset!.loadOptions.fetch,\n headers: preloadOptions.headers\n };\n console.log('Authorization Bearer token has been updated'); // eslint-disable-line no-undef, no-console\n }\n }\n\n /** Do calculations of all tiles and tiles with \"ADD\" type of refinement.\n * @param tile\n */\n private _checkAddRefinementTypeForTile(tile: TileHeader): void {\n const ADD_TILE_REFINEMENT = 1;\n\n if (tile.refine === ADD_TILE_REFINEMENT) {\n this.refinementCounter.tilesWithAddRefineCount += 1;\n console.warn('This tile uses \"ADD\" type of refinement'); // eslint-disable-line\n }\n\n this.refinementCounter.tilesCount += 1;\n }\n /**\n * Check if the tile's content format is supported by the converter\n * @param sourceRootTile\n * @returns\n */\n private isContentSupported(sourceRootTile: Tile3D): boolean {\n return ['b3dm', 'glTF'].includes(sourceRootTile?.content?.type);\n }\n\n private async loadWorkers(): Promise<void> {\n console.log(`Loading workers source...`); // eslint-disable-line no-undef, no-console\n if (this.options.draco) {\n const url = getWorkerURL(DracoWriterWorker, {...getLoaderOptions()});\n const sourceResponse = await fetchFile(url);\n const source = await sourceResponse.text();\n this.workerSource.draco = source;\n }\n\n if (this.generateTextures) {\n const url = getWorkerURL(KTX2BasisWriterWorker, {...getLoaderOptions()});\n const sourceResponse = await fetchFile(url);\n const source = await sourceResponse.text();\n this.workerSource.ktx2 = source;\n }\n\n const i3sAttributesWorkerUrl = getWorkerURL(I3SAttributesWorker, {...getLoaderOptions()});\n const sourceResponse = await fetchFile(i3sAttributesWorkerUrl);\n const source = await sourceResponse.text();\n this.workerSource.I3SAttributes = source;\n console.log(`Loading workers source completed!`); // eslint-disable-line no-undef, no-console\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"i3s-converter.js","names":["load","encode","fetchFile","getLoaderOptions","isBrowser","Tileset3D","CesiumIonLoader","Tiles3DLoader","join","v4","uuidv4","process","transform","md5","NodePages","writeFile","removeDir","writeFileForSlpk","compressWithChildProcess","calculateFilesSize","timeConverter","convertB3dmToI3sGeometry","getPropertyTable","createBoundingVolumes","convertBoundingVolumeToI3SFullExtent","createSceneServerPath","convertGeometricErrorToScreenThreshold","PGMLoader","LAYERS","layersTemplate","NODE","nodeTemplate","SHARED_RESOURCES","sharedResourcesTemplate","validateNodeBoundingVolumes","KTX2BasisWriterWorker","ImageWriter","getWorkerURL","WorkerFarm","DracoWriterWorker","WriteQueue","I3SAttributesWorker","BROWSER_ERROR_MESSAGE","createdStorageAttribute","createFieldAttribute","createPopupInfo","getAttributeType","getFieldAttributeType","ION_DEFAULT_TOKEN","env","IonToken","HARDCODED_NODES_PER_PAGE","_3D_TILES","_3D_OBJECT_LAYER_TYPE","REFRESH_TOKEN_TIMEOUT","CESIUM_DATASET_PREFIX","I3SConverter","constructor","nodePages","options","layers0Path","materialMap","Map","materialDefinitions","vertexCounter","layers0","featuresHashArray","refinementCounter","tilesCount","tilesWithAddRefineCount","validate","generateTextures","generateBoundingVolumes","layersHasTexture","convert","console","log","conversionStartTime","hrtime","tilesetName","slpk","egmFilePath","inputUrl","outputPath","draco","sevenZipExe","maxDepth","token","Boolean","Loader","indexOf","writeQueue","startListening","geoidHeightModel","useWriteFunction","loadWorkers","preloadOptions","_fetchPreloadOptions","tilesetOptions","loadOptions","_nodeWorkers","reuseWorkers","basis","format","workerUrl","headers","fetch","Object","assign","sourceTilesetJson","sourceTileset","_createAndSaveTileset","root","boundingVolume","region","_finishConversion","error","workerFarm","getWorkerFarm","destroy","boundingVolumeRegion","tilesetPath","e","_formLayers0","sourceRootTile","boundingVolumes","parentId","push","index","lodThreshold","obb","children","isCreateSlpk","root0","_formRootNodeIndexDocument","_convertNodesTree","store","defaultGeometrySchema","ordering","filter","attribute","_writeLayers0","_writeNodeIndexDocument","save","finalize","_createSlpk","fullExtent","zmin","zmax","extent","xmin","ymin","xmax","ymax","layers0data","version","toUpperCase","id","name","href","nodesPerPage","compressGeometry","root0data","level","lodSelection","metricType","maxError","_loadTile","isContentSupported","child","_createNode","childPath","path","enqueue","archiveKey","writePromise","JSON","stringify","_addChildrenWithNeighborsAndWriteFile","parentNode","sourceTiles","unloadContent","nodePath","rootPath","slpkTilesetPath","slpkFileName","data","childNodes","_addChildren","_addNeighborsAndWriteFile","convertNestedTileset","sourceTile","convertNode","mbs","promises","type","Promise","all","node","Number","length","neighbor","neighbors","warn","parentTile","_checkAddRefinementTypeForTile","_updateTilesetOptions","propertyTable","content","attributeStorageInfo","_convertPropertyTableToNodeAttributes","resourcesData","_convertResources","nodes","nodesInPage","emptyResources","geometry","compressedGeometry","texture","sharedResources","meshMaterial","vertexCount","attributes","featureCount","resources","maxScreenThresholdSQ","find","val","nodeInPage","_updateNodeInNodePages","_createNodeIndexDocument","mesh","_writeResources","boundingVolumeWarnings","draftObb","center","halfSize","quaternion","workerSource","definition","resource","material","nodeId","updateAll","getNodeById","updateResourceInMesh","updateMaterialByNodeId","_findOrCreateMaterial","texelCountHint","image","height","width","updateTexelCountHintByNodeId","updateVertexCountByNodeId","updateNodeAttributeByNodeId","updateFeatureCountByNodeId","nodeData","toString","geometryData","sharedResource","textureData","attributeData","folderName","key","geometryBuffer","slpkChildPath","_writeGeometries","_writeShared","_writeTexture","_writeAttributes","slpkGeometryPath","geometryPath","slpkCompressedGeometryPath","compressedGeometryPath","sharedData","sharedDataStr","slpkSharedPath","sharedPath","_getFormatByMimeType","mimeType","formats","bufferView","writeTextureFile","copyArrayBuffer","subarray","arrayToEncode","Uint8Array","ktx2TextureData","source","ktx2","decodedFromKTX2TextureData","textureSetDefinitions","slpkTexturePath","compress","texturePath","fileBuffer","slpkAttributesPath","attributesPath","hash","has","get","newMaterialId","set","attributeIndex","propertyTableWithObjectId","OBJECTID","firstAttribute","attributeType","storageAttribute","fieldAttributeType","fieldAttribute","popupInfo","fields","layerType","params","addRefinementPercentage","filesSize","diff","conversionTime","preload","accessToken","refreshTokenTime","tile","ADD_TILE_REFINEMENT","refine","includes","url","sourceResponse","text","i3sAttributesWorkerUrl","I3SAttributes"],"sources":["../../../src/i3s-converter/i3s-converter.ts"],"sourcesContent":["import type {Tile3D, Tileset3DProps} from '@loaders.gl/tiles';\nimport type {FeatureTableJson} from '@loaders.gl/3d-tiles';\nimport type {WriteQueueItem} from '../lib/utils/write-queue';\nimport type {\n SceneLayer3D,\n BoundingVolumes,\n Node3DIndexDocument,\n NodeReference,\n MaxScreenThresholdSQ,\n NodeInPage,\n LodSelection\n} from '@loaders.gl/i3s';\nimport {load, encode, fetchFile, getLoaderOptions, isBrowser} from '@loaders.gl/core';\nimport {Tileset3D} from '@loaders.gl/tiles';\nimport {CesiumIonLoader, Tiles3DLoader} from '@loaders.gl/3d-tiles';\nimport {Geoid} from '@math.gl/geoid';\nimport {join} from 'path';\nimport {v4 as uuidv4} from 'uuid';\nimport process from 'process';\nimport transform from 'json-map-transform';\nimport md5 from 'md5';\n\nimport NodePages from './helpers/node-pages';\nimport {writeFile, removeDir, writeFileForSlpk} from '../lib/utils/file-utils';\nimport {\n compressWithChildProcess\n // generateHash128FromZip,\n // addFileToZip\n} from '../lib/utils/compress-util';\nimport {calculateFilesSize, timeConverter} from '../lib/utils/statistic-utills';\nimport convertB3dmToI3sGeometry, {getPropertyTable} from './helpers/geometry-converter';\nimport {\n createBoundingVolumes,\n convertBoundingVolumeToI3SFullExtent\n} from './helpers/coordinate-converter';\nimport {createSceneServerPath} from './helpers/create-scene-server-path';\nimport {convertGeometricErrorToScreenThreshold} from '../lib/utils/lod-conversion-utils';\nimport {PGMLoader} from '../pgm-loader';\n\nimport {LAYERS as layersTemplate} from './json-templates/layers';\nimport {NODE as nodeTemplate} from './json-templates/node';\nimport {SHARED_RESOURCES as sharedResourcesTemplate} from './json-templates/shared-resources';\nimport {validateNodeBoundingVolumes} from './helpers/node-debug';\nimport TileHeader from '@loaders.gl/tiles/src/tileset/tile-3d';\nimport {KTX2BasisWriterWorker} from '@loaders.gl/textures';\nimport {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {I3SMaterialDefinition, TextureSetDefinitionFormats} from '@loaders.gl/i3s/src/types';\nimport {ImageWriter} from '@loaders.gl/images';\nimport {GLTFImagePostprocessed} from '@loaders.gl/gltf';\nimport {I3SConvertedResources, SharedResourcesArrays} from './types';\nimport {getWorkerURL, WorkerFarm} from '@loaders.gl/worker-utils';\nimport {DracoWriterWorker} from '@loaders.gl/draco';\nimport WriteQueue from '../lib/utils/write-queue';\nimport {I3SAttributesWorker} from '../i3s-attributes-worker';\nimport {BROWSER_ERROR_MESSAGE} from '../constants';\nimport {\n createdStorageAttribute,\n createFieldAttribute,\n createPopupInfo,\n getAttributeType,\n getFieldAttributeType\n} from './helpers/feature-attributes';\n\nconst ION_DEFAULT_TOKEN =\n process.env?.IonToken || // eslint-disable-line\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlYWMxMzcyYy0zZjJkLTQwODctODNlNi01MDRkZmMzMjIxOWIiLCJpZCI6OTYyMCwic2NvcGVzIjpbImFzbCIsImFzciIsImdjIl0sImlhdCI6MTU2Mjg2NjI3M30.1FNiClUyk00YH_nWfSGpiQAjR5V2OvREDq1PJ5QMjWQ'; // eslint-disable-line\nconst HARDCODED_NODES_PER_PAGE = 64;\nconst _3D_TILES = '3DTILES';\nconst _3D_OBJECT_LAYER_TYPE = '3DObject';\nconst REFRESH_TOKEN_TIMEOUT = 1800; // 30 minutes in seconds\nconst CESIUM_DATASET_PREFIX = 'https://';\n// const FS_FILE_TOO_LARGE = 'ERR_FS_FILE_TOO_LARGE';\n\n/**\n * Converter from 3d-tiles tileset to i3s layer\n */\nexport default class I3SConverter {\n nodePages: NodePages;\n options: any;\n layers0Path: string;\n materialMap: Map<any, any>;\n materialDefinitions: I3SMaterialDefinition[];\n vertexCounter: number;\n layers0: SceneLayer3D | null;\n featuresHashArray: string[];\n refinementCounter: {\n tilesCount: number;\n tilesWithAddRefineCount: number;\n };\n validate: boolean;\n boundingVolumeWarnings?: string[] = [];\n conversionStartTime: [number, number] = [0, 0];\n refreshTokenTime: [number, number] = [0, 0];\n sourceTileset: Tileset3D | null = null;\n geoidHeightModel: Geoid | null = null;\n Loader: LoaderWithParser = Tiles3DLoader;\n generateTextures: boolean;\n generateBoundingVolumes: boolean;\n layersHasTexture: boolean;\n workerSource: {[key: string]: string} = {};\n writeQueue: WriteQueue<WriteQueueItem> = new WriteQueue();\n\n constructor() {\n this.nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);\n this.options = {};\n this.layers0Path = '';\n this.materialMap = new Map();\n this.materialDefinitions = [];\n this.vertexCounter = 0;\n this.layers0 = null;\n this.featuresHashArray = [];\n this.refinementCounter = {\n tilesCount: 0,\n tilesWithAddRefineCount: 0\n };\n this.validate = false;\n this.generateTextures = false;\n this.generateBoundingVolumes = false;\n this.layersHasTexture = false;\n }\n\n /**\n * Convert a 3d tileset\n * @param options\n * @param options.inputUrl the url to read the tileset from\n * @param options.outputPath the output filename\n * @param options.tilesetName the output name of the tileset\n * @param options.maxDepth The max tree depth of conversion\n * @param options.slpk Generate slpk (Scene Layer Packages) output file\n * @param options.sevenZipExe Location of 7z.exe archiver to create slpk on Windows\n * @param options.egmFilePath location of *.pgm file to convert heights from ellipsoidal to gravity-related format\n * @param options.token Token for Cesium ION tilesets authentication\n * @param options.draco Generate I3S 1.7 draco compressed geometries\n * @param options.validate -enable validation\n */\n async convert(options: {\n inputUrl: string;\n outputPath: string;\n tilesetName: string;\n sevenZipExe: string;\n egmFilePath: string;\n maxDepth?: number;\n slpk?: boolean;\n token?: string;\n draco?: boolean;\n validate?: boolean;\n generateTextures?: boolean;\n generateBoundingVolumes?: boolean;\n }): Promise<any> {\n if (isBrowser) {\n console.log(BROWSER_ERROR_MESSAGE);\n return BROWSER_ERROR_MESSAGE;\n }\n this.conversionStartTime = process.hrtime();\n const {\n tilesetName,\n slpk,\n egmFilePath,\n inputUrl,\n validate,\n outputPath,\n draco,\n sevenZipExe,\n maxDepth,\n token,\n generateTextures,\n generateBoundingVolumes\n } = options;\n this.options = {maxDepth, slpk, sevenZipExe, egmFilePath, draco, token, inputUrl};\n this.validate = Boolean(validate);\n this.Loader = inputUrl.indexOf(CESIUM_DATASET_PREFIX) !== -1 ? CesiumIonLoader : Tiles3DLoader;\n this.generateTextures = Boolean(generateTextures);\n this.generateBoundingVolumes = Boolean(generateBoundingVolumes);\n\n this.writeQueue = new WriteQueue();\n this.writeQueue.startListening();\n\n console.log('Loading egm file...'); // eslint-disable-line\n this.geoidHeightModel = await load(egmFilePath, PGMLoader);\n console.log('Loading egm file completed!'); // eslint-disable-line\n\n if (slpk) {\n this.nodePages.useWriteFunction(writeFileForSlpk);\n }\n\n await this.loadWorkers();\n\n try {\n const preloadOptions = await this._fetchPreloadOptions();\n const tilesetOptions: Tileset3DProps = {\n loadOptions: {\n _nodeWorkers: true,\n reuseWorkers: true,\n basis: {format: 'rgba32'},\n 'basis-nodejs': {\n format: 'rgba32',\n workerUrl: './modules/textures/dist/basis-nodejs-worker.js'\n },\n 'draco-nodejs': {workerUrl: './modules/draco/dist/draco-nodejs-worker.js'}\n }\n };\n if (preloadOptions.headers) {\n tilesetOptions.loadOptions!.fetch = {headers: preloadOptions.headers};\n }\n Object.assign(tilesetOptions, preloadOptions);\n const sourceTilesetJson = await load(inputUrl, this.Loader, tilesetOptions.loadOptions);\n // console.log(tilesetJson); // eslint-disable-line\n this.sourceTileset = new Tileset3D(sourceTilesetJson, tilesetOptions);\n\n await this._createAndSaveTileset(\n outputPath,\n tilesetName,\n sourceTilesetJson?.root?.boundingVolume?.region\n );\n await this._finishConversion({slpk: Boolean(slpk), outputPath, tilesetName});\n return sourceTilesetJson;\n } catch (error) {\n throw error;\n } finally {\n // Clean up worker pools\n const workerFarm = WorkerFarm.getWorkerFarm({});\n workerFarm.destroy();\n }\n }\n\n /**\n * Convert and save the layer and embedded tiles\n * @param outputPath - path to save output data\n * @param tilesetName - new tileset path\n */\n private async _createAndSaveTileset(\n outputPath: string,\n tilesetName: string,\n boundingVolumeRegion?: number[]\n ): Promise<void> {\n const tilesetPath = join(`${outputPath}`, `${tilesetName}`);\n // Removing the tilesetPath needed to exclude erroneous files after conversion\n try {\n await removeDir(tilesetPath);\n } catch (e) {\n // do nothing\n }\n\n this.layers0Path = join(tilesetPath, 'SceneServer', 'layers', '0');\n\n this._formLayers0(tilesetName, boundingVolumeRegion);\n\n this.materialDefinitions = [];\n this.materialMap = new Map();\n\n const sourceRootTile: TileHeader = this.sourceTileset!.root!;\n const boundingVolumes = createBoundingVolumes(sourceRootTile, this.geoidHeightModel!);\n const parentId = this.nodePages.push({\n index: 0,\n lodThreshold: 0,\n obb: boundingVolumes.obb,\n children: []\n });\n\n const isCreateSlpk = this.options.slpk;\n const root0 = this._formRootNodeIndexDocument(boundingVolumes);\n\n await this._convertNodesTree(root0, sourceRootTile, parentId, boundingVolumes);\n\n this.layers0!.materialDefinitions = this.materialDefinitions;\n\n if (this.layersHasTexture === false) {\n this.layers0!.store.defaultGeometrySchema.ordering =\n this.layers0!.store.defaultGeometrySchema.ordering.filter(\n (attribute) => attribute !== 'uv0'\n );\n }\n\n await this._writeLayers0();\n createSceneServerPath(tilesetName, this.layers0!, tilesetPath);\n await this._writeNodeIndexDocument(root0, 'root', join(this.layers0Path, 'nodes', 'root'));\n await this.nodePages.save(this.layers0Path, this.writeQueue, isCreateSlpk);\n await this.writeQueue.finalize();\n await this._createSlpk(tilesetPath);\n }\n\n /**\n * Form object of 3DSceneLayer https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DSceneLayer.cmn.md\n * @param tilesetName - Name of layer\n */\n private _formLayers0(tilesetName: string, boundingVolumeRegion?: number[]): void {\n const fullExtent = convertBoundingVolumeToI3SFullExtent(\n this.sourceTileset?.boundingVolume || this.sourceTileset?.root?.boundingVolume\n );\n if (boundingVolumeRegion) {\n fullExtent.zmin = boundingVolumeRegion[4];\n fullExtent.zmax = boundingVolumeRegion[5];\n }\n const extent = [fullExtent.xmin, fullExtent.ymin, fullExtent.xmax, fullExtent.ymax];\n const layers0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 0,\n name: tilesetName,\n href: './layers/0',\n store: {\n id: `{${uuidv4().toUpperCase()}}`,\n extent\n },\n nodePages: {\n nodesPerPage: HARDCODED_NODES_PER_PAGE\n },\n compressGeometry: this.options.draco,\n fullExtent\n };\n this.layers0 = transform(layers0data, layersTemplate());\n }\n\n /**\n * Convert and save the layer and embedded tiles\n * @param boundingVolumes - mbs and obb data about node's bounding volume\n * @return 3DNodeIndexDocument data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n */\n private _formRootNodeIndexDocument(boundingVolumes: BoundingVolumes): Node3DIndexDocument {\n const root0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 'root',\n level: 0,\n lodSelection: [\n {\n metricType: 'maxScreenThresholdSQ',\n maxError: 0\n },\n {\n metricType: 'maxScreenThreshold',\n maxError: 0\n }\n ],\n ...boundingVolumes,\n children: []\n };\n return transform(root0data, nodeTemplate());\n }\n\n /**\n * Form object of 3DSceneLayer https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DSceneLayer.cmn.md\n * @param root0 - 3DNodeIndexDocument of root node https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n * @param sourceRootTile - Source (3DTile) tile data\n * @param parentId - node id in node pages\n * @param boundingVolumes - mbs and obb data about node's bounding volume\n */\n private async _convertNodesTree(\n root0: Node3DIndexDocument,\n sourceRootTile: TileHeader,\n parentId: number,\n boundingVolumes: BoundingVolumes\n ): Promise<void> {\n await this.sourceTileset!._loadTile(sourceRootTile);\n if (this.isContentSupported(sourceRootTile)) {\n root0.children = root0.children || [];\n root0.children.push({\n id: '1',\n href: './1',\n ...boundingVolumes\n });\n const [child] = await this._createNode(root0, sourceRootTile, parentId, 0);\n const childPath = join(this.layers0Path, 'nodes', child.path!);\n\n if (this.options.slpk) {\n await this.writeQueue.enqueue({\n archiveKey: 'nodes/1/3dNodeIndexDocument.json.gz',\n writePromise: writeFileForSlpk(\n childPath,\n JSON.stringify(child),\n '3dNodeIndexDocument.json'\n )\n });\n } else {\n await this.writeQueue.enqueue({writePromise: writeFile(childPath, JSON.stringify(child))});\n }\n } else {\n await this._addChildrenWithNeighborsAndWriteFile({\n parentNode: root0,\n sourceTiles: sourceRootTile.children,\n parentId,\n level: 1\n });\n }\n await sourceRootTile.unloadContent();\n }\n\n /**\n * Write 3DSceneLayer https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DSceneLayer.cmn.md in file\n */\n private async _writeLayers0(): Promise<void> {\n if (this.options.slpk) {\n await this.writeQueue.enqueue({\n archiveKey: '3dSceneLayer.json.gz',\n writePromise: writeFileForSlpk(\n this.layers0Path,\n JSON.stringify(this.layers0),\n '3dSceneLayer.json'\n )\n });\n } else {\n await this.writeQueue.enqueue({\n writePromise: writeFile(this.layers0Path, JSON.stringify(this.layers0))\n });\n }\n }\n\n /**\n * Write 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md in file\n */\n private async _writeNodeIndexDocument(\n root0: Node3DIndexDocument,\n nodePath: string,\n rootPath: string\n ): Promise<void> {\n if (this.options.slpk) {\n await this.writeQueue.enqueue({\n archiveKey: `nodes/${nodePath}/3dNodeIndexDocument.json.gz`,\n writePromise: writeFileForSlpk(rootPath, JSON.stringify(root0), '3dNodeIndexDocument.json')\n });\n } else {\n await this.writeQueue.enqueue({writePromise: writeFile(rootPath, JSON.stringify(root0))});\n }\n }\n\n /**\n * Pack files into *.slpk archive\n * @param tilesetPath - Path to save file\n */\n private async _createSlpk(tilesetPath: string): Promise<void> {\n if (this.options.slpk) {\n const slpkTilesetPath = join(tilesetPath, 'SceneServer', 'layers', '0');\n const slpkFileName = `${tilesetPath}.slpk`;\n await compressWithChildProcess(\n slpkTilesetPath,\n slpkFileName,\n 0,\n '.',\n this.options.sevenZipExe\n );\n\n // TODO: `addFileToZip` corrupts archive so it can't be validated with windows i3s_converter.exe\n // const fileHash128Path = `${tilesetPath}/@specialIndexFileHASH128@`;\n // try {\n // await generateHash128FromZip(slpkFileName, fileHash128Path);\n // await addFileToZip(\n // tilesetPath,\n // '@specialIndexFileHASH128@',\n // slpkFileName,\n // this.options.sevenZipExe\n // );\n // } catch (error) {\n // if (error.code === FS_FILE_TOO_LARGE) {\n // console.warn(`${slpkFileName} file is too big to generate a hash`); // eslint-disable-line\n // } else {\n // console.error(error); // eslint-disable-line\n // }\n // }\n // All converted files are contained in slpk now they can be deleted\n try {\n await removeDir(tilesetPath);\n } catch (e) {\n // do nothing\n }\n }\n }\n\n /**\n * Add child nodes recursively and write them to files\n * @param data - arguments\n * @param data.sourceTiles - array of source child nodes\n * @param data.parentNode - 3DNodeIndexDocument of parent node for processing child nodes\n * @param data.parentId - id of parent node in node pages\n * @param data.level - level of node (distanse to root node in the tree)\n */\n private async _addChildrenWithNeighborsAndWriteFile(data: {\n parentNode: Node3DIndexDocument;\n sourceTiles: TileHeader[];\n parentId: number;\n level: number;\n }): Promise<void> {\n const childNodes = [];\n await this._addChildren({...data, childNodes});\n await this._addNeighborsAndWriteFile(data.parentNode, childNodes);\n }\n\n /**\n * Convert nested subtree of 3DTiles dataset\n * @param param0\n * @param param0.sourceTile - source 3DTile data\n * @param param0.parentNode - parent I3S node\n * @param param0.childNodes - child I3S nodes\n * @param param0.parentId - parent node ID\n * @param param0.level - tree level\n */\n private async convertNestedTileset({\n sourceTile,\n parentNode,\n childNodes,\n parentId,\n level\n }: {\n childNodes: NodeReference[];\n sourceTile: TileHeader;\n parentNode: Node3DIndexDocument;\n parentId: number;\n level: number;\n }) {\n await this.sourceTileset!._loadTile(sourceTile);\n await this._addChildren({\n parentNode,\n sourceTiles: sourceTile.children,\n childNodes,\n parentId,\n level: level + 1\n });\n await sourceTile.unloadContent();\n }\n\n /**\n * Convert 3DTiles tile to I3S node\n * @param param0\n * @param param0.sourceTile - source 3DTile data\n * @param param0.parentNode - parent I3S node\n * @param param0.childNodes - child I3S nodes\n * @param param0.parentId - parent node ID\n * @param param0.level - tree level\n */\n private async convertNode({\n sourceTile,\n parentNode,\n childNodes,\n parentId,\n level\n }: {\n childNodes: NodeReference[];\n sourceTile: TileHeader;\n parentNode: Node3DIndexDocument;\n parentId: number;\n level: number;\n }) {\n const children = await this._createNode(parentNode, sourceTile, parentId, level);\n parentNode.children = parentNode.children || [];\n for (const child of children) {\n parentNode.children.push({\n id: child.id,\n href: `../${child.path}`,\n obb: child.obb,\n mbs: child.mbs\n });\n childNodes.push(child);\n }\n }\n\n /**\n * Add child nodes recursively and write them to files\n * @param data - arguments\n * @param data.childNodes - array of target child nodes\n * @param data.sourceTiles - array of source child nodes\n * @param data.parentNode - 3DNodeIndexDocument of parent node for processing child nodes\n * @param data.parentId - id of parent node in node pages\n * @param data.level - level of node (distanse to root node in the tree)\n */\n private async _addChildren(data: {\n childNodes: NodeReference[];\n sourceTiles: TileHeader[];\n parentNode: Node3DIndexDocument;\n parentId: number;\n level: number;\n }): Promise<void> {\n const {childNodes, sourceTiles, parentNode, parentId, level} = data;\n if (this.options.maxDepth && level > this.options.maxDepth) {\n return;\n }\n\n const promises: Promise<void>[] = [];\n\n for (const sourceTile of sourceTiles) {\n if (sourceTile.type === 'json') {\n promises.push(\n this.convertNestedTileset({sourceTile, parentNode, childNodes, parentId, level})\n );\n } else {\n promises.push(this.convertNode({sourceTile, parentNode, childNodes, parentId, level}));\n }\n await Promise.all(promises);\n if (sourceTile.id) {\n console.log(sourceTile.id); // eslint-disable-line\n }\n }\n }\n\n /**\n * Add neightbors to 3DNodeIndexDocument and write it in a file\n * @param parentNode - arguments\n * @param childNodes - array of target child nodes\n */\n private async _addNeighborsAndWriteFile(\n parentNode: Node3DIndexDocument,\n childNodes: Node3DIndexDocument[]\n ): Promise<void> {\n for (const node of childNodes) {\n const childPath = join(this.layers0Path, 'nodes', node.path!);\n const nodePath = node.path;\n delete node.path;\n\n // Don't do large amount of \"neightbors\" to avoid big memory consumption\n if (Number(parentNode?.children?.length) < 1000) {\n for (const neighbor of parentNode.children || []) {\n // eslint-disable-next-line max-depth\n if (node.id === neighbor.id) {\n continue; // eslint-disable-line\n }\n\n if (node.neighbors) {\n node.neighbors.push({...neighbor});\n }\n }\n } else {\n // eslint-disable-next-line no-console, no-undef\n console.warn(\n `Node ${node.id}: neighbors attribute is omited because of large number of neigbors`\n );\n delete node.neighbors;\n }\n await this._writeNodeIndexDocument(node, nodePath!, childPath);\n node.neighbors = [];\n }\n }\n\n /**\n * Convert tile to one or more I3S nodes\n * @param parentTile - parent 3DNodeIndexDocument\n * @param sourceTile - source tile (3DTile)\n * @param parentId - id of parent node in node pages\n * @param level - level of node (distanse to root node in the tree)\n */\n private async _createNode(\n parentTile: Node3DIndexDocument,\n sourceTile: TileHeader,\n parentId: number,\n level: number\n ): Promise<Node3DIndexDocument[]> {\n this._checkAddRefinementTypeForTile(sourceTile);\n\n await this._updateTilesetOptions();\n await this.sourceTileset!._loadTile(sourceTile);\n\n let boundingVolumes = createBoundingVolumes(sourceTile, this.geoidHeightModel!);\n\n const propertyTable = getPropertyTable(sourceTile.content);\n\n if (propertyTable && !this.layers0?.attributeStorageInfo?.length) {\n this._convertPropertyTableToNodeAttributes(propertyTable);\n }\n\n const resourcesData = await this._convertResources(sourceTile, parentId, propertyTable);\n\n const nodes: Node3DIndexDocument[] = [];\n const nodesInPage: NodeInPage[] = [];\n const emptyResources = {\n geometry: null,\n compressedGeometry: null,\n texture: null,\n sharedResources: null,\n meshMaterial: null,\n vertexCount: null,\n attributes: null,\n featureCount: null,\n boundingVolumes: null\n };\n\n for (const resources of resourcesData || [emptyResources]) {\n this.layersHasTexture = this.layersHasTexture || Boolean(resources.texture);\n\n if (this.generateBoundingVolumes && resources.boundingVolumes) {\n boundingVolumes = resources.boundingVolumes;\n }\n\n const lodSelection = convertGeometricErrorToScreenThreshold(sourceTile, boundingVolumes);\n const maxScreenThresholdSQ = lodSelection.find(\n (val) => val.metricType === 'maxScreenThresholdSQ'\n ) || {maxError: 0};\n\n const nodeInPage = this._updateNodeInNodePages(\n maxScreenThresholdSQ,\n boundingVolumes,\n sourceTile,\n parentId,\n resources\n );\n const node = this._createNodeIndexDocument(\n parentTile,\n boundingVolumes,\n lodSelection,\n nodeInPage,\n resources\n );\n\n if (nodeInPage.mesh) {\n await this._writeResources(resources, node.path!);\n }\n\n if (this.validate) {\n this.boundingVolumeWarnings = validateNodeBoundingVolumes(node);\n\n if (this.boundingVolumeWarnings && this.boundingVolumeWarnings.length) {\n console.warn('Bounding Volume Warnings: ', ...this.boundingVolumeWarnings); //eslint-disable-line\n }\n }\n\n nodes.push(node);\n nodesInPage.push(nodeInPage);\n }\n\n sourceTile.unloadContent();\n\n await this._addChildrenWithNeighborsAndWriteFile({\n parentNode: nodes[0],\n sourceTiles: sourceTile.children,\n parentId: nodesInPage[0].index!,\n level: level + 1\n });\n return nodes;\n }\n\n /**\n * Convert tile to one or more I3S nodes\n * @param sourceTile - source tile (3DTile)\n * @param parentId - id of parent node in node pages\n * @param propertyTable - batch table from b3dm / feature properties from EXT_FEATURE_METADATA\n * result.geometry - ArrayBuffer with geometry attributes\n * result.compressedGeometry - ArrayBuffer with compressed (draco) geometry\n * result.texture - texture image\n * result.sharedResources - shared resource data object\n * result.meshMaterial - PBR-like material object\n * result.vertexCount - number of vertices in geometry\n * result.attributes - feature attributes\n * result.featureCount - number of features\n */\n private async _convertResources(\n sourceTile: TileHeader,\n parentId: number,\n propertyTable: FeatureTableJson | null\n ): Promise<I3SConvertedResources[] | null> {\n if (!this.isContentSupported(sourceTile)) {\n return null;\n }\n const draftObb = {\n center: [],\n halfSize: [],\n quaternion: []\n };\n const resourcesData = await convertB3dmToI3sGeometry(\n sourceTile.content,\n () => this.nodePages.push({index: 0, obb: draftObb}, parentId),\n propertyTable,\n this.featuresHashArray,\n this.layers0?.attributeStorageInfo,\n this.options.draco,\n this.generateBoundingVolumes,\n this.geoidHeightModel!,\n this.workerSource\n );\n return resourcesData;\n }\n\n /**\n * Update node object (https://github.com/Esri/i3s-spec/blob/master/docs/1.7/node.cmn.md)\n * in node pages (https://github.com/Esri/i3s-spec/blob/master/docs/1.7/nodePage.cmn.md)\n * @param maxScreenThresholdSQ - Level of Details (LOD) metric\n * @param boundingVolumes - Bounding volumes\n * @param sourceTile - source tile (3DTile)\n * @param parentId - id of parent node in node pages\n * @param resources - the node resources data\n * @param resources.meshMaterial - PBR-like material object\n * @param resources.texture - texture image\n * @param resources.vertexCount - number of vertices in geometry\n * @param resources.featureCount - number of features\n * @return the node object in node pages\n */\n private _updateNodeInNodePages(\n maxScreenThresholdSQ: MaxScreenThresholdSQ,\n boundingVolumes: BoundingVolumes,\n sourceTile: TileHeader,\n parentId: number,\n resources: I3SConvertedResources\n ): NodeInPage {\n const {meshMaterial, texture, vertexCount, featureCount, geometry} = resources;\n const nodeInPage: NodeInPage = {\n index: 0,\n lodThreshold: maxScreenThresholdSQ.maxError,\n obb: boundingVolumes.obb,\n children: []\n };\n if (geometry && this.isContentSupported(sourceTile)) {\n nodeInPage.mesh = {\n geometry: {\n definition: texture ? 0 : 1,\n resource: 0\n },\n attribute: {\n resource: 0\n },\n material: {\n definition: 0\n }\n };\n }\n\n let nodeId = resources.nodeId;\n if (nodeId) {\n this.nodePages.updateAll(nodeId, nodeInPage);\n const node = this.nodePages.getNodeById(nodeId);\n this.nodePages.updateResourceInMesh(node);\n } else {\n nodeId = this.nodePages.push(nodeInPage, parentId);\n }\n\n if (meshMaterial) {\n this.nodePages.updateMaterialByNodeId(nodeId, this._findOrCreateMaterial(meshMaterial));\n }\n\n if (texture) {\n const texelCountHint = texture.image.height * texture.image.width;\n this.nodePages.updateTexelCountHintByNodeId(nodeId, texelCountHint);\n }\n\n if (vertexCount) {\n this.vertexCounter += vertexCount;\n this.nodePages.updateVertexCountByNodeId(nodeId, vertexCount);\n }\n this.nodePages.updateNodeAttributeByNodeId(nodeId);\n if (featureCount) {\n this.nodePages.updateFeatureCountByNodeId(nodeId, featureCount);\n }\n\n return this.nodePages.getNodeById(nodeId);\n }\n\n /**\n * Create a new node page object in node pages\n * @param parentNode - 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object of the parent node\n * @param boundingVolumes - Bounding volumes\n * @param lodSelection - Level of Details (LOD) metrics\n * @param nodeInPage - corresponding node object in a node page\n * @param resources - the node resources data\n * @param resources.texture - texture image\n * @param resources.attributes - feature attributes\n * @return 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object\n */\n private _createNodeIndexDocument(\n parentNode: Node3DIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources\n ): Node3DIndexDocument {\n const {texture, attributes} = resources;\n const nodeId = nodeInPage.index!;\n const nodeData = {\n version: parentNode.version,\n id: nodeId.toString(),\n path: nodeId.toString(),\n level: parentNode.level! + 1,\n ...boundingVolumes,\n lodSelection,\n parentNode: {\n id: parentNode.id,\n href: `../${parentNode.id}`,\n mbs: parentNode.mbs,\n obb: parentNode.obb\n },\n children: [],\n neighbors: []\n };\n const node = transform(nodeData, nodeTemplate());\n\n if (nodeInPage.mesh) {\n node.geometryData = [{href: './geometries/0'}];\n node.sharedResource = {href: './shared'};\n\n if (texture) {\n node.textureData = [{href: './textures/0'}, {href: './textures/1'}];\n }\n\n if (attributes && attributes.length && this.layers0?.attributeStorageInfo?.length) {\n node.attributeData = [];\n for (let index = 0; index < attributes.length; index++) {\n const folderName = this.layers0.attributeStorageInfo[index].key;\n node.attributeData.push({href: `./attributes/${folderName}/0`});\n }\n }\n }\n\n return node;\n }\n\n /**\n * Write node resources in files\n * @param resources - source tile (3DTile)\n * @param resources.geometry - Uint8Array with geometry attributes\n * @param resources.compressedGeometry - Uint8Array with compressed (draco) geometry\n * @param resources.texture - texture image\n * @param resources.sharedResources - shared resource data object\n * @param resources.attributes - feature attributes\n * @return {Promise<void>}\n */\n private async _writeResources(resources: I3SConvertedResources, nodePath: string): Promise<void> {\n const {\n geometry: geometryBuffer,\n compressedGeometry,\n texture,\n sharedResources,\n attributes\n } = resources;\n const childPath = join(this.layers0Path, 'nodes', nodePath);\n const slpkChildPath = join('nodes', nodePath);\n\n await this._writeGeometries(geometryBuffer!, compressedGeometry!, childPath, slpkChildPath);\n await this._writeShared(sharedResources, childPath, slpkChildPath, nodePath);\n await this._writeTexture(texture, childPath, slpkChildPath);\n await this._writeAttributes(attributes, childPath, slpkChildPath);\n }\n\n /**\n * Write non-compressed and compressed geometries in files\n * @param geometryBuffer - Uint8Array with geometry attributes\n * @param compressedGeometry - Uint8Array with compressed (draco) geometry\n * @param childPath - a child path to write resources\n * @param slpkChildPath - resource path inside *slpk file\n */\n private async _writeGeometries(\n geometryBuffer: ArrayBuffer,\n compressedGeometry: Promise<ArrayBuffer>,\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (this.options.slpk) {\n const slpkGeometryPath = join(childPath, 'geometries');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/geometries/0.bin.gz`,\n writePromise: writeFileForSlpk(slpkGeometryPath, geometryBuffer, '0.bin')\n });\n } else {\n const geometryPath = join(childPath, 'geometries/0/');\n await this.writeQueue.enqueue({\n writePromise: writeFile(geometryPath, geometryBuffer, 'index.bin')\n });\n }\n\n if (this.options.draco) {\n if (this.options.slpk) {\n const slpkCompressedGeometryPath = join(childPath, 'geometries');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/geometries/1.bin.gz`,\n writePromise: writeFileForSlpk(slpkCompressedGeometryPath, compressedGeometry, '1.bin')\n });\n } else {\n const compressedGeometryPath = join(childPath, 'geometries/1/');\n await this.writeQueue.enqueue({\n writePromise: writeFile(compressedGeometryPath, compressedGeometry, 'index.bin')\n });\n }\n }\n }\n\n /**\n * Write shared resources in a file\n * @param sharedResources - shared resource data object\n * @param childPath - a child path to write resources\n * @param slpkChildPath - resource path inside *slpk file\n * @param nodePath - a node path\n */\n private async _writeShared(\n sharedResources: SharedResourcesArrays | null,\n childPath: string,\n slpkChildPath: string,\n nodePath: string\n ): Promise<void> {\n if (!sharedResources) {\n return;\n }\n sharedResources.nodePath = nodePath;\n const sharedData = transform(sharedResources, sharedResourcesTemplate());\n const sharedDataStr = JSON.stringify(sharedData);\n if (this.options.slpk) {\n const slpkSharedPath = join(childPath, 'shared');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/shared/sharedResource.json.gz`,\n writePromise: writeFileForSlpk(slpkSharedPath, sharedDataStr, 'sharedResource.json')\n });\n } else {\n const sharedPath = join(childPath, 'shared/');\n await this.writeQueue.enqueue({writePromise: writeFile(sharedPath, sharedDataStr)});\n }\n }\n\n /**\n * Generates textures based on texture mime type and fill in textureSetDefinitions data.\n * @param texture - the texture image\n * @param childPath - a child path to write resources\n * @param slpkChildPath - the resource path inside *slpk file\n */\n private async _writeTexture(\n texture: GLTFImagePostprocessed,\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (texture) {\n const format = this._getFormatByMimeType(texture?.mimeType);\n const formats: TextureSetDefinitionFormats = [];\n const textureData = texture.bufferView!.data;\n\n switch (format) {\n case 'jpg':\n case 'png': {\n formats.push({name: '0', format});\n await this.writeTextureFile(textureData, '0', format, childPath, slpkChildPath);\n\n if (this.generateTextures) {\n formats.push({name: '1', format: 'ktx2'});\n // For Node.js texture.image.data is type of Buffer\n const copyArrayBuffer = texture.image.data.subarray();\n const arrayToEncode = new Uint8Array(copyArrayBuffer);\n const ktx2TextureData = encode(\n {...texture.image, data: arrayToEncode},\n KTX2BasisWriterWorker,\n {\n ...KTX2BasisWriterWorker.options,\n source: this.workerSource.ktx2,\n reuseWorkers: true,\n _nodeWorkers: true\n }\n );\n\n await this.writeTextureFile(ktx2TextureData, '1', 'ktx2', childPath, slpkChildPath);\n }\n\n break;\n }\n\n case 'ktx2': {\n formats.push({name: '1', format});\n await this.writeTextureFile(textureData, '1', format, childPath, slpkChildPath);\n\n if (this.generateTextures) {\n formats.push({name: '0', format: 'jpg'});\n const decodedFromKTX2TextureData = encode(texture.image!.data[0], ImageWriter);\n await this.writeTextureFile(\n decodedFromKTX2TextureData,\n '0',\n 'jpg',\n childPath,\n slpkChildPath\n );\n }\n }\n }\n\n if (!this.layers0!.textureSetDefinitions!.length) {\n this.layers0!.textureSetDefinitions!.push({formats});\n }\n }\n }\n\n /**\n * Write the texture image in a file\n * @param textureData\n * @param name\n * @param format\n * @param childPath\n * @param slpkChildPath\n */\n private async writeTextureFile(\n textureData: Promise<ArrayBuffer>,\n name: string,\n format: 'jpg' | 'png' | 'ktx2',\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (this.options.slpk) {\n const slpkTexturePath = join(childPath, 'textures');\n const compress = false;\n\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/textures/${name}.${format}`,\n writePromise: writeFileForSlpk(slpkTexturePath, textureData, `${name}.${format}`, compress)\n });\n } else {\n const texturePath = join(childPath, `textures/${name}/`);\n await this.writeQueue.enqueue({\n writePromise: writeFile(texturePath, textureData, `index.${format}`)\n });\n }\n }\n\n /**\n * Write feature attributes in files\n * @param attributes - feature attributes\n * @param childPath - a child path to write resources\n * @param slpkChildPath - the resource path inside *slpk file\n */\n private async _writeAttributes(\n attributes: ArrayBuffer[] | null = [],\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (attributes?.length && this.layers0?.attributeStorageInfo?.length) {\n for (let index = 0; index < attributes.length; index++) {\n const folderName = this.layers0.attributeStorageInfo[index].key;\n const fileBuffer = new Uint8Array(attributes[index]);\n\n if (this.options.slpk) {\n const slpkAttributesPath = join(childPath, 'attributes', folderName);\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/attributes/${folderName}.bin.gz`,\n writePromise: writeFileForSlpk(slpkAttributesPath, fileBuffer, '0.bin')\n });\n } else {\n const attributesPath = join(childPath, `attributes/${folderName}/0`);\n await this.writeQueue.enqueue({\n writePromise: writeFile(attributesPath, fileBuffer, 'index.bin')\n });\n }\n }\n }\n }\n\n /**\n * Return file format by its MIME type\n * @param mimeType - feature attributes\n */\n private _getFormatByMimeType(mimeType: string | undefined): 'jpg' | 'png' | 'ktx2' {\n switch (mimeType) {\n case 'image/jpeg':\n return 'jpg';\n case 'image/png':\n return 'png';\n case 'image/ktx2':\n return 'ktx2';\n default:\n return 'jpg';\n }\n }\n\n /**\n * Find or create material in materialDefinitions array\n * @param material - end-to-end index of the node\n * @return material id\n */\n private _findOrCreateMaterial(material: I3SMaterialDefinition): number {\n const hash = md5(JSON.stringify(material));\n if (this.materialMap.has(hash)) {\n return this.materialMap.get(hash);\n }\n const newMaterialId = this.materialDefinitions.push(material) - 1;\n this.materialMap.set(hash, newMaterialId);\n return newMaterialId;\n }\n\n /**\n * Do conversion of 3DTiles property table to I3s node attributes.\n * @param propertyTable - Table with layer meta data.\n */\n private _convertPropertyTableToNodeAttributes(propertyTable: FeatureTableJson): void {\n let attributeIndex = 0;\n const propertyTableWithObjectId = {\n OBJECTID: [0],\n ...propertyTable\n };\n\n for (const key in propertyTableWithObjectId) {\n const firstAttribute = propertyTableWithObjectId[key][0];\n const attributeType = getAttributeType(key, firstAttribute);\n\n const storageAttribute = createdStorageAttribute(attributeIndex, key, attributeType);\n const fieldAttributeType = getFieldAttributeType(attributeType);\n const fieldAttribute = createFieldAttribute(key, fieldAttributeType);\n const popupInfo = createPopupInfo(propertyTableWithObjectId);\n\n this.layers0!.attributeStorageInfo!.push(storageAttribute);\n this.layers0!.fields!.push(fieldAttribute);\n this.layers0!.popupInfo = popupInfo;\n this.layers0!.layerType = _3D_OBJECT_LAYER_TYPE;\n\n attributeIndex += 1;\n }\n }\n\n /**\n * Print statistics in the end of conversion\n * @param params - output files data\n */\n private async _finishConversion(params: {\n slpk: boolean;\n outputPath: string;\n tilesetName: string;\n }): Promise<void> {\n const {tilesCount, tilesWithAddRefineCount} = this.refinementCounter;\n const addRefinementPercentage = tilesWithAddRefineCount\n ? (tilesWithAddRefineCount / tilesCount) * 100\n : 0;\n const filesSize = await calculateFilesSize(params);\n const diff = process.hrtime(this.conversionStartTime);\n const conversionTime = timeConverter(diff);\n console.log(`------------------------------------------------`); // eslint-disable-line no-undef, no-console\n console.log(`Finishing conversion of ${_3D_TILES}`); // eslint-disable-line no-undef, no-console\n console.log(`Total conversion time: ${conversionTime}`); // eslint-disable-line no-undef, no-console\n console.log(`Vertex count: `, this.vertexCounter); // eslint-disable-line no-undef, no-console\n console.log(`File(s) size: `, filesSize, ' bytes'); // eslint-disable-line no-undef, no-console\n console.log(`Percentage of tiles with \"ADD\" refinement type:`, addRefinementPercentage, '%'); // eslint-disable-line no-undef, no-console\n console.log(`------------------------------------------------`); // eslint-disable-line no-undef, no-console\n }\n\n /**\n * Fetch preload options for ION tileset\n */\n private async _fetchPreloadOptions(): Promise<any> {\n if (!this.Loader.preload) {\n return {};\n }\n const options = {\n 'cesium-ion': {accessToken: this.options.token || ION_DEFAULT_TOKEN}\n };\n const preloadOptions = await this.Loader.preload(this.options.inputUrl, options);\n this.refreshTokenTime = process.hrtime();\n return {...options, ...preloadOptions};\n }\n\n /**\n * Update options of source tileset\n */\n private async _updateTilesetOptions(): Promise<void> {\n const diff = process.hrtime(this.refreshTokenTime);\n if (diff[0] < REFRESH_TOKEN_TIMEOUT) {\n return;\n }\n this.refreshTokenTime = process.hrtime();\n\n const preloadOptions = await this._fetchPreloadOptions();\n this.sourceTileset!.options = {...this.sourceTileset!.options, ...preloadOptions};\n if (preloadOptions.headers) {\n this.sourceTileset!.loadOptions.fetch = {\n ...this.sourceTileset!.loadOptions.fetch,\n headers: preloadOptions.headers\n };\n console.log('Authorization Bearer token has been updated'); // eslint-disable-line no-undef, no-console\n }\n }\n\n /** Do calculations of all tiles and tiles with \"ADD\" type of refinement.\n * @param tile\n */\n private _checkAddRefinementTypeForTile(tile: TileHeader): void {\n const ADD_TILE_REFINEMENT = 1;\n\n if (tile.refine === ADD_TILE_REFINEMENT) {\n this.refinementCounter.tilesWithAddRefineCount += 1;\n console.warn('This tile uses \"ADD\" type of refinement'); // eslint-disable-line\n }\n\n this.refinementCounter.tilesCount += 1;\n }\n /**\n * Check if the tile's content format is supported by the converter\n * @param sourceRootTile\n * @returns\n */\n private isContentSupported(sourceRootTile: Tile3D): boolean {\n return ['b3dm', 'glTF'].includes(sourceRootTile?.content?.type);\n }\n\n private async loadWorkers(): Promise<void> {\n console.log(`Loading workers source...`); // eslint-disable-line no-undef, no-console\n if (this.options.draco) {\n const url = getWorkerURL(DracoWriterWorker, {...getLoaderOptions()});\n const sourceResponse = await fetchFile(url);\n const source = await sourceResponse.text();\n this.workerSource.draco = source;\n }\n\n if (this.generateTextures) {\n const url = getWorkerURL(KTX2BasisWriterWorker, {...getLoaderOptions()});\n const sourceResponse = await fetchFile(url);\n const source = await sourceResponse.text();\n this.workerSource.ktx2 = source;\n }\n\n const i3sAttributesWorkerUrl = getWorkerURL(I3SAttributesWorker, {...getLoaderOptions()});\n const sourceResponse = await fetchFile(i3sAttributesWorkerUrl);\n const source = await sourceResponse.text();\n this.workerSource.I3SAttributes = source;\n console.log(`Loading workers source completed!`); // eslint-disable-line no-undef, no-console\n }\n}\n"],"mappings":"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"}
|
package/dist/esm/pgm-loader.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parsePGM } from '@math.gl/geoid';
|
|
2
2
|
|
|
3
|
-
const VERSION = typeof "3.3.0-alpha.
|
|
3
|
+
const VERSION = typeof "3.3.0-alpha.8" !== 'undefined' ? "3.3.0-alpha.8" : 'latest';
|
|
4
4
|
|
|
5
5
|
export const PGMLoader = {
|
|
6
6
|
name: 'PGM - Netpbm grayscale image format',
|
|
@@ -2,13 +2,13 @@ import type { WorkerObject } from '@loaders.gl/worker-utils';
|
|
|
2
2
|
import type { ConvertedAttributes } from './i3s-converter/types';
|
|
3
3
|
import type { Matrix4, Vector3 } from '@math.gl/core';
|
|
4
4
|
import type { GLTFImagePostprocessed, GLTFNodePostprocessed } from '@loaders.gl/gltf';
|
|
5
|
-
export
|
|
5
|
+
export type I3SAttributesWorkerOptions = {
|
|
6
6
|
_nodeWorkers: boolean;
|
|
7
7
|
reuseWorkers: boolean;
|
|
8
8
|
useCartesianPositions: boolean;
|
|
9
9
|
source: string;
|
|
10
10
|
};
|
|
11
|
-
export
|
|
11
|
+
export type B3DMAttributesData = {
|
|
12
12
|
gltfMaterials?: {
|
|
13
13
|
id: string;
|
|
14
14
|
}[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i3s-attributes-worker.d.ts","sourceRoot":"","sources":["../src/i3s-attributes-worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAC,sBAAsB,EAAE,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAQpF,
|
|
1
|
+
{"version":3,"file":"i3s-attributes-worker.d.ts","sourceRoot":"","sources":["../src/i3s-attributes-worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAC,sBAAsB,EAAE,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAQpF,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,CAAC,EAAE;QAAC,EAAE,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAC/B,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;CAQ/B,CAAC;AAEF;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,cAAc,EAAE,kBAAkB,EAClC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAE3C;AAED,eAAO,MAAM,6BAA6B,EAAE,YAAkC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinate-converter.d.ts","sourceRoot":"","sources":["../../../src/i3s-converter/helpers/coordinate-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAsB,OAAO,EAAC,MAAM,eAAe,CAAC;AAE3D,OAAO,EACL,mBAAmB,EAGnB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAErC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,GAAG,eAAe,CAiC5F;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,kBAAkB,EAAE,YAAY,EAChC,gBAAgB,EAAE,KAAK,GACtB;IAAC,GAAG,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAC,CAoBtB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,EAAE,CAW5E;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,cAAc,EAAE,mBAAmB,GAAG,cAAc,GACnD,UAAU,
|
|
1
|
+
{"version":3,"file":"coordinate-converter.d.ts","sourceRoot":"","sources":["../../../src/i3s-converter/helpers/coordinate-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAsB,OAAO,EAAC,MAAM,eAAe,CAAC;AAE3D,OAAO,EACL,mBAAmB,EAGnB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAErC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,GAAG,eAAe,CAiC5F;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,kBAAkB,EAAE,YAAY,EAChC,gBAAgB,EAAE,KAAK,GACtB;IAAC,GAAG,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAC,CAoBtB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,EAAE,CAW5E;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,cAAc,EAAE,mBAAmB,GAAG,cAAc,GACnD,UAAU,CA4BZ;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAK9C"}
|
|
@@ -98,13 +98,15 @@ function convertBoundingVolumeToI3SFullExtent(boundingVolume) {
|
|
|
98
98
|
const radius = sphere.radius;
|
|
99
99
|
const vertexMax = geospatial_1.Ellipsoid.WGS84.cartesianToCartographic(new core_1.Vector3(center[0] + radius, center[1] + radius, center[2] + radius), new core_1.Vector3());
|
|
100
100
|
const vertexMin = geospatial_1.Ellipsoid.WGS84.cartesianToCartographic(new core_1.Vector3(center[0] - radius, center[1] - radius, center[2] - radius), new core_1.Vector3());
|
|
101
|
+
// Converter sometimes returns min values that are bigger then max,
|
|
102
|
+
// so we should check and take bigger value from max and smaller for nim
|
|
101
103
|
return {
|
|
102
|
-
xmin: vertexMin[0],
|
|
103
|
-
xmax: vertexMax[0],
|
|
104
|
-
ymin: vertexMin[1],
|
|
105
|
-
ymax: vertexMax[1],
|
|
106
|
-
zmin: vertexMin[2],
|
|
107
|
-
zmax: vertexMax[2]
|
|
104
|
+
xmin: Math.min(vertexMin[0], vertexMax[0]),
|
|
105
|
+
xmax: Math.max(vertexMin[0], vertexMax[0]),
|
|
106
|
+
ymin: Math.min(vertexMin[1], vertexMax[1]),
|
|
107
|
+
ymax: Math.max(vertexMin[1], vertexMax[1]),
|
|
108
|
+
zmin: Math.min(vertexMin[2], vertexMax[2]),
|
|
109
|
+
zmax: Math.max(vertexMin[2], vertexMax[2])
|
|
108
110
|
};
|
|
109
111
|
}
|
|
110
112
|
exports.convertBoundingVolumeToI3SFullExtent = convertBoundingVolumeToI3SFullExtent;
|