@loaders.gl/tile-converter 3.1.8 → 3.2.0-alpha.1
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-converter/3d-tiles-converter.d.ts +78 -0
- package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -0
- package/dist/3d-tiles-converter/3d-tiles-converter.js +242 -0
- package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts +83 -0
- package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -0
- package/dist/3d-tiles-converter/helpers/b3dm-converter.js +278 -0
- package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.d.ts +13 -0
- package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.d.ts.map +1 -0
- package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +23 -0
- package/dist/3d-tiles-converter/helpers/texture-atlas.d.ts +9 -0
- package/dist/3d-tiles-converter/helpers/texture-atlas.d.ts.map +1 -0
- package/dist/3d-tiles-converter/helpers/texture-atlas.js +52 -0
- package/dist/3d-tiles-converter/json-templates/tileset.d.ts +15 -0
- package/dist/3d-tiles-converter/json-templates/tileset.d.ts.map +1 -0
- package/dist/3d-tiles-converter/json-templates/tileset.js +43 -0
- package/dist/bundle.d.ts +2 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +5 -0
- package/dist/converter.min.js +19 -19
- package/dist/deps-installer/deps-installer.d.ts +4 -0
- package/dist/deps-installer/deps-installer.d.ts.map +1 -0
- package/dist/deps-installer/deps-installer.js +21 -0
- package/dist/dist.min.js +304 -494
- package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +2 -1
- package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +14 -21
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/es5/i3s-converter/i3s-converter.js +35 -25
- package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/es5/pgm-loader.js +1 -1
- package/dist/es5/pgm-loader.js.map +1 -1
- package/dist/esm/3d-tiles-converter/3d-tiles-converter.js +2 -1
- package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +7 -5
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/esm/i3s-converter/i3s-converter.js +10 -0
- package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/esm/pgm-loader.js +1 -1
- package/dist/esm/pgm-loader.js.map +1 -1
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts +41 -0
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/coordinate-converter.js +118 -0
- package/dist/i3s-converter/helpers/create-scene-server-path.d.ts +9 -0
- package/dist/i3s-converter/helpers/create-scene-server-path.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/create-scene-server-path.js +28 -0
- package/dist/i3s-converter/helpers/geometry-attributes.d.ts +8 -0
- package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/geometry-attributes.js +176 -0
- package/dist/i3s-converter/helpers/geometry-converter.d.ts +12 -0
- package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/geometry-converter.js +791 -0
- package/dist/i3s-converter/helpers/node-debug.d.ts +8 -0
- package/dist/i3s-converter/helpers/node-debug.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/node-debug.js +114 -0
- package/dist/i3s-converter/helpers/node-pages.d.ts +116 -0
- package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/node-pages.js +203 -0
- package/dist/i3s-converter/i3s-converter.d.ts +321 -0
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -0
- package/dist/i3s-converter/i3s-converter.js +994 -0
- package/dist/i3s-converter/json-templates/layers.d.ts +95 -0
- package/dist/i3s-converter/json-templates/layers.d.ts.map +1 -0
- package/dist/i3s-converter/json-templates/layers.js +199 -0
- package/dist/i3s-converter/json-templates/metadata.d.ts +22 -0
- package/dist/i3s-converter/json-templates/metadata.d.ts.map +1 -0
- package/dist/i3s-converter/json-templates/metadata.js +25 -0
- package/dist/i3s-converter/json-templates/node.d.ts +61 -0
- package/dist/i3s-converter/json-templates/node.d.ts.map +1 -0
- package/dist/i3s-converter/json-templates/node.js +89 -0
- package/dist/i3s-converter/json-templates/scene-server.d.ts +28 -0
- package/dist/i3s-converter/json-templates/scene-server.d.ts.map +1 -0
- package/dist/i3s-converter/json-templates/scene-server.js +31 -0
- package/dist/i3s-converter/json-templates/shared-resources.d.ts +14 -0
- package/dist/i3s-converter/json-templates/shared-resources.d.ts.map +1 -0
- package/dist/i3s-converter/json-templates/shared-resources.js +129 -0
- package/dist/i3s-converter/json-templates/store.d.ts +95 -0
- package/dist/i3s-converter/json-templates/store.d.ts.map +1 -0
- package/dist/i3s-converter/json-templates/store.js +103 -0
- package/dist/i3s-converter/types.d.ts +39 -0
- package/dist/i3s-converter/types.d.ts.map +1 -0
- package/dist/i3s-converter/types.js +2 -0
- package/dist/i3s-server/app.d.ts +3 -0
- package/dist/i3s-server/app.d.ts.map +1 -0
- package/dist/i3s-server/app.js +14 -0
- package/dist/i3s-server/controllers/index-controller.d.ts +2 -0
- package/dist/i3s-server/controllers/index-controller.d.ts.map +1 -0
- package/dist/i3s-server/controllers/index-controller.js +23 -0
- package/dist/i3s-server/routes/index.d.ts +3 -0
- package/dist/i3s-server/routes/index.d.ts.map +1 -0
- package/dist/i3s-server/routes/index.js +16 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/lib/utils/compress-util.d.ts +6 -0
- package/dist/lib/utils/compress-util.d.ts.map +1 -0
- package/dist/lib/utils/compress-util.js +190 -0
- package/dist/lib/utils/file-utils.d.ts +6 -0
- package/dist/lib/utils/file-utils.d.ts.map +1 -0
- package/dist/lib/utils/file-utils.js +42 -0
- package/dist/lib/utils/lod-conversion-utils.d.ts +20 -0
- package/dist/lib/utils/lod-conversion-utils.d.ts.map +1 -0
- package/dist/lib/utils/lod-conversion-utils.js +57 -0
- package/dist/lib/utils/statistic-utills.d.ts +3 -0
- package/dist/lib/utils/statistic-utills.d.ts.map +1 -0
- package/dist/lib/utils/statistic-utills.js +64 -0
- package/dist/pgm-loader.d.ts +6 -0
- package/dist/pgm-loader.d.ts.map +1 -0
- package/dist/pgm-loader.js +23 -0
- package/package.json +16 -17
- package/src/3d-tiles-converter/3d-tiles-converter.ts +4 -1
- package/src/3d-tiles-converter/helpers/b3dm-converter.ts +6 -5
- package/src/i3s-converter/i3s-converter.ts +12 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/3d-tiles-converter/helpers/b3dm-converter.ts"],"names":["encode","encodeSync","GLTFScenegraph","GLTFWriter","Tile3DWriter","ImageWriter","Matrix4","Vector3","Ellipsoid","convertTextureAtlas","Z_UP_TO_Y_UP_MATRIX","scratchVector","B3dmConverter","convert","i3sTile","attributes","gltf","buildGltf","b3dm","gltfEncoded","Uint8Array","type","featuresLength","_getFeaturesLength","batchTable","material","indices","originalIndices","cartesianOrigin","cartographicOrigin","modelMatrix","content","gltfBuilder","textureIndex","_addI3sTextureToGltf","pbrMaterialInfo","_convertI3sMaterialToGltfMaterial","materialIndex","addMaterial","positions","positionsValue","value","uvRegions","texCoords","_normalizePositions","normals","_checkNormals","_generateSynteticIndices","length","size","meshIndex","addMesh","transformMatrix","_generateTransformMatrix","nodeIndex","addNode","matrix","sceneIndex","addScene","nodeIndices","setDefaultScene","createBinaryChunk","gltfBuffer","texture","header","textureFormat","selectedTexture","pbrMetallicRoughness","baseColorTexture","source","image","mimeType","_deduceMimeTypeFromFormat","imageBuffer","imageIndex","addImage","addTexture","colors","newPositionsValue","Float32Array","index","vertex","subarray","cartesianOriginVector","vertexVector","Array","from","transform","add","WGS84","cartographicToCartesian","subtract","set","translateOriginMatrix","translate","result","multiplyLeft","_generateBatchId","faceRanges","batchIdArraySize","batchId","rangeIndex","currentBatchId","fromIndex","untilPosition","fill","vertexCount","Uint32Array","format","console","warn","isTextureIndexExists","alphaMode","doubleSided","metallicFactor","roughnessFactor","texCoord","baseColorFactor","_setGltfTexture","materialDefinition","emissiveTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","firstKey","Object","keys","find"],"mappings":"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","sourcesContent":["import {encode, encodeSync} from '@loaders.gl/core';\nimport {GLTFScenegraph, GLTFWriter} from '@loaders.gl/gltf';\nimport {Tile3DWriter} from '@loaders.gl/3d-tiles';\nimport {ImageWriter} from '@loaders.gl/images';\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {convertTextureAtlas} from './texture-atlas';\n\nconst Z_UP_TO_Y_UP_MATRIX = new Matrix4([1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1]);\nconst scratchVector = new Vector3();\n\n/**\n * Converts content of an I3S node to *.b3dm's file content\n */\nexport default class B3dmConverter {\n // @ts-expect-error\n rtcCenter: Float32Array;\n i3sTile: any;\n\n /**\n * The starter of content conversion\n * @param i3sTile - Tile3D instance for I3S node\n * @returns - encoded content\n */\n async convert(i3sTile: Object, attributes: any = null): Promise<ArrayBuffer> {\n this.i3sTile = i3sTile;\n const gltf = await this.buildGltf(i3sTile);\n const b3dm = encodeSync(\n {\n gltfEncoded: new Uint8Array(gltf),\n type: 'b3dm',\n featuresLength: this._getFeaturesLength(attributes),\n batchTable: attributes\n },\n Tile3DWriter\n );\n return b3dm;\n }\n\n /**\n * Build and encode gltf\n * @param i3sTile - Tile3D instance for I3S node\n * @returns - encoded glb content\n */\n async buildGltf(i3sTile): Promise<ArrayBuffer> {\n const {\n material,\n attributes,\n indices: originalIndices,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n } = i3sTile.content;\n const gltfBuilder = new GLTFScenegraph();\n\n const textureIndex = await this._addI3sTextureToGltf(i3sTile, gltfBuilder);\n const pbrMaterialInfo = this._convertI3sMaterialToGltfMaterial(material, textureIndex);\n const materialIndex = gltfBuilder.addMaterial(pbrMaterialInfo);\n\n const positions = attributes.positions;\n const positionsValue = positions.value;\n\n if (attributes.uvRegions && attributes.texCoords) {\n attributes.texCoords.value = convertTextureAtlas(\n attributes.texCoords.value,\n attributes.uvRegions.value\n );\n }\n\n attributes.positions.value = this._normalizePositions(\n positionsValue,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n );\n if (attributes.normals && !this._checkNormals(attributes.normals.value)) {\n delete attributes.normals;\n }\n const indices =\n originalIndices || this._generateSynteticIndices(positionsValue.length / positions.size);\n const meshIndex = gltfBuilder.addMesh({\n attributes,\n indices,\n material: materialIndex\n });\n const transformMatrix = this._generateTransformMatrix(cartesianOrigin);\n const nodeIndex = gltfBuilder.addNode({meshIndex, matrix: transformMatrix});\n const sceneIndex = gltfBuilder.addScene({nodeIndices: [nodeIndex]});\n gltfBuilder.setDefaultScene(sceneIndex);\n\n gltfBuilder.createBinaryChunk();\n\n const gltfBuffer = encodeSync(gltfBuilder.gltf, GLTFWriter);\n\n return gltfBuffer;\n }\n\n /**\n * Update gltfBuilder with texture from I3S tile\n * @param {object} i3sTile - Tile3D object\n * @param {GLTFScenegraph} gltfBuilder - gltfScenegraph instance to construct GLTF\n * @returns {Promise<number | null>} - GLTF texture index\n */\n async _addI3sTextureToGltf(i3sTile, gltfBuilder) {\n const {\n content: {texture, material, attributes},\n header: {textureFormat}\n } = i3sTile;\n let textureIndex = null;\n let selectedTexture = texture;\n if (!texture && material) {\n selectedTexture =\n material.pbrMetallicRoughness &&\n material.pbrMetallicRoughness.baseColorTexture &&\n material.pbrMetallicRoughness.baseColorTexture.texture.source.image;\n }\n if (selectedTexture) {\n const mimeType = this._deduceMimeTypeFromFormat(textureFormat);\n const imageBuffer = await encode(selectedTexture, ImageWriter);\n const imageIndex = gltfBuilder.addImage(imageBuffer, mimeType);\n textureIndex = gltfBuilder.addTexture({imageIndex});\n delete attributes.colors;\n }\n return textureIndex;\n }\n\n /**\n * Generate a positions array which is correct for 3DTiles/GLTF format\n * @param {Float64Array} positionsValue - the input geometry positions array\n * @param {number[]} cartesianOrigin - the tile center in the cartesian coordinate system\n * @param {number[]} cartographicOrigin - the tile center in the cartographic coordinate system\n * @param {number[]} modelMatrix - the model matrix of geometry\n * @returns {Float32Array} - the output geometry positions array\n */\n _normalizePositions(positionsValue, cartesianOrigin, cartographicOrigin, modelMatrix) {\n const newPositionsValue = new Float32Array(positionsValue.length);\n for (let index = 0; index < positionsValue.length; index += 3) {\n const vertex = positionsValue.subarray(index, index + 3);\n const cartesianOriginVector = new Vector3(cartesianOrigin);\n let vertexVector = new Vector3(Array.from(vertex))\n .transform(modelMatrix)\n .add(cartographicOrigin);\n Ellipsoid.WGS84.cartographicToCartesian(vertexVector, scratchVector);\n vertexVector = scratchVector.subtract(cartesianOriginVector);\n newPositionsValue.set(vertexVector, index);\n }\n return newPositionsValue;\n }\n\n /**\n * Generate the transformation matrix for GLTF node:\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-node\n * 1. Create the translate transformation from cartesianOrigin (the positions array stores offsets from this cartesianOrigin)\n * 2. Create the rotation transformation to rotate model from z-up coordinates (I3S specific) to y-up coordinates (GLTF specific)\n * @param {number[]} cartesianOrigin - the tile center in the cartesian coordinate system\n * @returns {Matrix4} - an array of 16 numbers (4x4 matrix)\n */\n _generateTransformMatrix(cartesianOrigin) {\n const translateOriginMatrix = new Matrix4().translate(cartesianOrigin);\n const result = translateOriginMatrix.multiplyLeft(Z_UP_TO_Y_UP_MATRIX);\n return result;\n }\n\n /**\n * Generate batchId attribute from faceRanges.\n * @param {Uint32Array} faceRanges - the source array\n * @returns {Float32Array} batchId list.\n */\n _generateBatchId(faceRanges) {\n const batchIdArraySize = (faceRanges[faceRanges.length - 1] + 1) * 3;\n const batchId = new Float32Array(batchIdArraySize);\n let rangeIndex = 0;\n let currentBatchId = 0;\n\n for (let index = 0; index < faceRanges.length / 2; index++) {\n const fromIndex = faceRanges[rangeIndex] * 3;\n const untilPosition = (faceRanges[rangeIndex + 1] + 1) * 3;\n\n batchId.fill(currentBatchId, fromIndex, untilPosition);\n rangeIndex += 2;\n currentBatchId += 1;\n }\n return batchId;\n }\n\n /**\n * luma.gl can not work without indices now:\n * https://github.com/visgl/luma.gl/blob/d8cad75b9f8ca3e578cf078ed9d19e619c2ddbc9/modules/experimental/src/gltf/gltf-instantiator.js#L115\n * This method generates syntetic indices array: [0, 1, 2, 3, .... , vertexCount-1]\n * @param {number} vertexCount - vertex count in the geometry\n * @returns {Uint32Array} indices array.\n */\n _generateSynteticIndices(vertexCount) {\n const result = new Uint32Array(vertexCount);\n for (let index = 0; index < vertexCount; index++) {\n result.set([index], index);\n }\n return result;\n }\n\n /**\n * Deduce mime type by format from `textureSetDefinition.formats[0].format`\n * https://github.com/Esri/i3s-spec/blob/master/docs/1.7/textureSetDefinitionFormat.cmn.md\n * @param {string} format - format name\n * @returns {string} mime type.\n */\n _deduceMimeTypeFromFormat(format) {\n switch (format) {\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n default:\n console.warn(`Unexpected texture format in I3S: ${format}`); // eslint-disable-line no-console, no-undef\n return 'image/jpeg';\n }\n }\n\n /**\n * Convert i3s material to GLTF compatible material\n * @param {object} material - i3s material definition\n * @param {number | null} textureIndex - texture index in GLTF\n * @returns {object} GLTF material\n */\n _convertI3sMaterialToGltfMaterial(material, textureIndex) {\n const isTextureIndexExists = textureIndex !== null;\n\n if (!material) {\n material = {\n alphaMode: 'OPAQUE',\n doubleSided: false,\n pbrMetallicRoughness: {\n metallicFactor: 0,\n roughnessFactor: 1\n }\n };\n\n if (isTextureIndexExists) {\n material.pbrMetallicRoughness.baseColorTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else {\n material.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, 1];\n }\n\n return material;\n }\n\n if (textureIndex !== null) {\n material = this._setGltfTexture(material, textureIndex);\n }\n\n return material;\n }\n\n /**\n * Set texture properties in material with GLTF textureIndex\n * @param {object} materialDefinition - i3s material definition\n * @param {number} textureIndex - texture index in GLTF\n * @returns {void}\n */\n _setGltfTexture(materialDefinition, textureIndex) {\n const material = {\n ...materialDefinition,\n pbrMetallicRoughness: {...materialDefinition.pbrMetallicRoughness}\n };\n // I3SLoader now support loading only one texture. This elseif sequence will assign this texture to one of\n // properties defined in materialDefinition\n if (\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.baseColorTexture\n ) {\n material.pbrMetallicRoughness.baseColorTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.emissiveTexture) {\n material.emissiveTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.metallicRoughnessTexture\n ) {\n material.pbrMetallicRoughness.metallicRoughnessTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.normalTexture) {\n material.normalTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.occlusionTexture) {\n material.occlusionTexture = {\n index: textureIndex,\n texCoord: 0\n };\n }\n return material;\n }\n\n /*\n * Returns Features length based on attribute array in attribute object.\n * @param {Object} attributes\n * @returns {Number} Features length .\n */\n _getFeaturesLength(attributes) {\n if (!attributes) {\n return 0;\n }\n const firstKey = Object.keys(attributes)[0];\n return firstKey ? attributes[firstKey].length : 0;\n }\n\n /* Checks that normals buffer is correct\n * @param {TypedArray} normals\n * @returns {boolean} true - normals are correct; false - normals are incorrect\n */\n _checkNormals(normals) {\n // If all normals === 0, the resulting tileset is all in black colors on Cesium\n return normals.find((value) => value);\n }\n}\n"],"file":"b3dm-converter.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/3d-tiles-converter/helpers/b3dm-converter.ts"],"names":["encodeSync","GLTFScenegraph","GLTFWriter","Tile3DWriter","Matrix4","Vector3","Ellipsoid","convertTextureAtlas","Z_UP_TO_Y_UP_MATRIX","scratchVector","B3dmConverter","convert","i3sTile","attributes","gltf","buildGltf","b3dm","gltfEncoded","Uint8Array","type","featuresLength","_getFeaturesLength","batchTable","material","indices","originalIndices","cartesianOrigin","cartographicOrigin","modelMatrix","content","gltfBuilder","textureIndex","_addI3sTextureToGltf","pbrMaterialInfo","_convertI3sMaterialToGltfMaterial","materialIndex","addMaterial","positions","positionsValue","value","uvRegions","texCoords","_normalizePositions","normals","_checkNormals","_generateSynteticIndices","length","size","meshIndex","addMesh","mode","transformMatrix","_generateTransformMatrix","nodeIndex","addNode","matrix","sceneIndex","addScene","nodeIndices","setDefaultScene","createBinaryChunk","gltfBuffer","texture","header","textureFormat","selectedTexture","pbrMetallicRoughness","baseColorTexture","source","image","mimeType","_deduceMimeTypeFromFormat","imageIndex","addImage","addTexture","colors","newPositionsValue","Float32Array","index","vertex","subarray","cartesianOriginVector","vertexVector","Array","from","transform","add","WGS84","cartographicToCartesian","subtract","set","translateOriginMatrix","translate","result","multiplyLeft","_generateBatchId","faceRanges","batchIdArraySize","batchId","rangeIndex","currentBatchId","fromIndex","untilPosition","fill","vertexCount","Uint32Array","format","console","warn","isTextureIndexExists","alphaMode","doubleSided","metallicFactor","roughnessFactor","texCoord","baseColorFactor","_setGltfTexture","materialDefinition","emissiveTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","firstKey","Object","keys","find"],"mappings":"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","sourcesContent":["import {encodeSync} from '@loaders.gl/core';\nimport {GLTFScenegraph, GLTFWriter} from '@loaders.gl/gltf';\nimport {Tile3DWriter} from '@loaders.gl/3d-tiles';\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {convertTextureAtlas} from './texture-atlas';\n\nconst Z_UP_TO_Y_UP_MATRIX = new Matrix4([1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1]);\nconst scratchVector = new Vector3();\n\n/**\n * Converts content of an I3S node to *.b3dm's file content\n */\nexport default class B3dmConverter {\n // @ts-expect-error\n rtcCenter: Float32Array;\n i3sTile: any;\n\n /**\n * The starter of content conversion\n * @param i3sTile - Tile3D instance for I3S node\n * @returns - encoded content\n */\n async convert(i3sTile: Object, attributes: any = null): Promise<ArrayBuffer> {\n this.i3sTile = i3sTile;\n const gltf = await this.buildGltf(i3sTile);\n const b3dm = encodeSync(\n {\n gltfEncoded: new Uint8Array(gltf),\n type: 'b3dm',\n featuresLength: this._getFeaturesLength(attributes),\n batchTable: attributes\n },\n Tile3DWriter\n );\n return b3dm;\n }\n\n /**\n * Build and encode gltf\n * @param i3sTile - Tile3D instance for I3S node\n * @returns - encoded glb content\n */\n async buildGltf(i3sTile): Promise<ArrayBuffer> {\n const {\n material,\n attributes,\n indices: originalIndices,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n } = i3sTile.content;\n const gltfBuilder = new GLTFScenegraph();\n\n const textureIndex = await this._addI3sTextureToGltf(i3sTile, gltfBuilder);\n const pbrMaterialInfo = this._convertI3sMaterialToGltfMaterial(material, textureIndex);\n const materialIndex = gltfBuilder.addMaterial(pbrMaterialInfo);\n\n const positions = attributes.positions;\n const positionsValue = positions.value;\n\n if (attributes.uvRegions && attributes.texCoords) {\n attributes.texCoords.value = convertTextureAtlas(\n attributes.texCoords.value,\n attributes.uvRegions.value\n );\n }\n\n attributes.positions.value = this._normalizePositions(\n positionsValue,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n );\n if (attributes.normals && !this._checkNormals(attributes.normals.value)) {\n delete attributes.normals;\n }\n const indices =\n originalIndices || this._generateSynteticIndices(positionsValue.length / positions.size);\n const meshIndex = gltfBuilder.addMesh({\n attributes,\n indices,\n material: materialIndex,\n mode: 4\n });\n const transformMatrix = this._generateTransformMatrix(cartesianOrigin);\n const nodeIndex = gltfBuilder.addNode({meshIndex, matrix: transformMatrix});\n const sceneIndex = gltfBuilder.addScene({nodeIndices: [nodeIndex]});\n gltfBuilder.setDefaultScene(sceneIndex);\n\n gltfBuilder.createBinaryChunk();\n\n const gltfBuffer = encodeSync(gltfBuilder.gltf, GLTFWriter);\n\n return gltfBuffer;\n }\n\n /**\n * Update gltfBuilder with texture from I3S tile\n * @param {object} i3sTile - Tile3D object\n * @param {GLTFScenegraph} gltfBuilder - gltfScenegraph instance to construct GLTF\n * @returns {Promise<number | null>} - GLTF texture index\n */\n async _addI3sTextureToGltf(i3sTile, gltfBuilder) {\n const {\n content: {texture, material, attributes},\n header: {textureFormat}\n } = i3sTile;\n let textureIndex = null;\n let selectedTexture = texture;\n if (!texture && material) {\n selectedTexture =\n material.pbrMetallicRoughness &&\n material.pbrMetallicRoughness.baseColorTexture &&\n material.pbrMetallicRoughness.baseColorTexture.texture.source.image;\n }\n if (selectedTexture) {\n const mimeType = this._deduceMimeTypeFromFormat(textureFormat);\n const imageIndex = gltfBuilder.addImage(selectedTexture, mimeType);\n textureIndex = gltfBuilder.addTexture({imageIndex});\n delete attributes.colors;\n }\n return textureIndex;\n }\n\n /**\n * Generate a positions array which is correct for 3DTiles/GLTF format\n * @param {Float64Array} positionsValue - the input geometry positions array\n * @param {number[]} cartesianOrigin - the tile center in the cartesian coordinate system\n * @param {number[]} cartographicOrigin - the tile center in the cartographic coordinate system\n * @param {number[]} modelMatrix - the model matrix of geometry\n * @returns {Float32Array} - the output geometry positions array\n */\n _normalizePositions(positionsValue, cartesianOrigin, cartographicOrigin, modelMatrix) {\n const newPositionsValue = new Float32Array(positionsValue.length);\n for (let index = 0; index < positionsValue.length; index += 3) {\n const vertex = positionsValue.subarray(index, index + 3);\n const cartesianOriginVector = new Vector3(cartesianOrigin);\n let vertexVector = new Vector3(Array.from(vertex))\n .transform(modelMatrix)\n .add(cartographicOrigin);\n Ellipsoid.WGS84.cartographicToCartesian(vertexVector, scratchVector);\n vertexVector = scratchVector.subtract(cartesianOriginVector);\n newPositionsValue.set(vertexVector, index);\n }\n return newPositionsValue;\n }\n\n /**\n * Generate the transformation matrix for GLTF node:\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-node\n * 1. Create the translate transformation from cartesianOrigin (the positions array stores offsets from this cartesianOrigin)\n * 2. Create the rotation transformation to rotate model from z-up coordinates (I3S specific) to y-up coordinates (GLTF specific)\n * @param {number[]} cartesianOrigin - the tile center in the cartesian coordinate system\n * @returns {Matrix4} - an array of 16 numbers (4x4 matrix)\n */\n _generateTransformMatrix(cartesianOrigin) {\n const translateOriginMatrix = new Matrix4().translate(cartesianOrigin);\n const result = translateOriginMatrix.multiplyLeft(Z_UP_TO_Y_UP_MATRIX);\n return result;\n }\n\n /**\n * Generate batchId attribute from faceRanges.\n * @param {Uint32Array} faceRanges - the source array\n * @returns {Float32Array} batchId list.\n */\n _generateBatchId(faceRanges) {\n const batchIdArraySize = (faceRanges[faceRanges.length - 1] + 1) * 3;\n const batchId = new Float32Array(batchIdArraySize);\n let rangeIndex = 0;\n let currentBatchId = 0;\n\n for (let index = 0; index < faceRanges.length / 2; index++) {\n const fromIndex = faceRanges[rangeIndex] * 3;\n const untilPosition = (faceRanges[rangeIndex + 1] + 1) * 3;\n\n batchId.fill(currentBatchId, fromIndex, untilPosition);\n rangeIndex += 2;\n currentBatchId += 1;\n }\n return batchId;\n }\n\n /**\n * luma.gl can not work without indices now:\n * https://github.com/visgl/luma.gl/blob/d8cad75b9f8ca3e578cf078ed9d19e619c2ddbc9/modules/experimental/src/gltf/gltf-instantiator.js#L115\n * This method generates syntetic indices array: [0, 1, 2, 3, .... , vertexCount-1]\n * @param {number} vertexCount - vertex count in the geometry\n * @returns {Uint32Array} indices array.\n */\n _generateSynteticIndices(vertexCount) {\n const result = new Uint32Array(vertexCount);\n for (let index = 0; index < vertexCount; index++) {\n result.set([index], index);\n }\n return result;\n }\n\n /**\n * Deduce mime type by format from `textureSetDefinition.formats[0].format`\n * https://github.com/Esri/i3s-spec/blob/master/docs/1.7/textureSetDefinitionFormat.cmn.md\n * @param {string} format - format name\n * @returns {string} mime type.\n */\n _deduceMimeTypeFromFormat(format) {\n switch (format) {\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'ktx2':\n return 'image/ktx2';\n default:\n console.warn(`Unexpected texture format in I3S: ${format}`); // eslint-disable-line no-console, no-undef\n return 'image/jpeg';\n }\n }\n\n /**\n * Convert i3s material to GLTF compatible material\n * @param {object} material - i3s material definition\n * @param {number | null} textureIndex - texture index in GLTF\n * @returns {object} GLTF material\n */\n _convertI3sMaterialToGltfMaterial(material, textureIndex) {\n const isTextureIndexExists = textureIndex !== null;\n\n if (!material) {\n material = {\n alphaMode: 'OPAQUE',\n doubleSided: false,\n pbrMetallicRoughness: {\n metallicFactor: 0,\n roughnessFactor: 1\n }\n };\n\n if (isTextureIndexExists) {\n material.pbrMetallicRoughness.baseColorTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else {\n material.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, 1];\n }\n\n return material;\n }\n\n if (textureIndex !== null) {\n material = this._setGltfTexture(material, textureIndex);\n }\n\n return material;\n }\n\n /**\n * Set texture properties in material with GLTF textureIndex\n * @param {object} materialDefinition - i3s material definition\n * @param {number} textureIndex - texture index in GLTF\n * @returns {void}\n */\n _setGltfTexture(materialDefinition, textureIndex) {\n const material = {\n ...materialDefinition,\n pbrMetallicRoughness: {...materialDefinition.pbrMetallicRoughness}\n };\n // I3SLoader now support loading only one texture. This elseif sequence will assign this texture to one of\n // properties defined in materialDefinition\n if (\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.baseColorTexture\n ) {\n material.pbrMetallicRoughness.baseColorTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.emissiveTexture) {\n material.emissiveTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.metallicRoughnessTexture\n ) {\n material.pbrMetallicRoughness.metallicRoughnessTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.normalTexture) {\n material.normalTexture = {\n index: textureIndex,\n texCoord: 0\n };\n } else if (materialDefinition.occlusionTexture) {\n material.occlusionTexture = {\n index: textureIndex,\n texCoord: 0\n };\n }\n return material;\n }\n\n /*\n * Returns Features length based on attribute array in attribute object.\n * @param {Object} attributes\n * @returns {Number} Features length .\n */\n _getFeaturesLength(attributes) {\n if (!attributes) {\n return 0;\n }\n const firstKey = Object.keys(attributes)[0];\n return firstKey ? attributes[firstKey].length : 0;\n }\n\n /* Checks that normals buffer is correct\n * @param {TypedArray} normals\n * @returns {boolean} true - normals are correct; false - normals are incorrect\n */\n _checkNormals(normals) {\n // If all normals === 0, the resulting tileset is all in black colors on Cesium\n return normals.find((value) => value);\n }\n}\n"],"file":"b3dm-converter.js"}
|
|
@@ -72,6 +72,8 @@ export default class I3SConverter {
|
|
|
72
72
|
|
|
73
73
|
_defineProperty(this, "generateBoundingVolumes", void 0);
|
|
74
74
|
|
|
75
|
+
_defineProperty(this, "layersHasTexture", void 0);
|
|
76
|
+
|
|
75
77
|
this.nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);
|
|
76
78
|
this.fileMap = {};
|
|
77
79
|
this.options = {};
|
|
@@ -88,6 +90,7 @@ export default class I3SConverter {
|
|
|
88
90
|
this.validate = false;
|
|
89
91
|
this.generateTextures = false;
|
|
90
92
|
this.generateBoundingVolumes = false;
|
|
93
|
+
this.layersHasTexture = false;
|
|
91
94
|
}
|
|
92
95
|
|
|
93
96
|
async convert(options) {
|
|
@@ -181,6 +184,11 @@ export default class I3SConverter {
|
|
|
181
184
|
|
|
182
185
|
await this._convertNodesTree(root0, sourceRootTile, parentId, boundingVolumes);
|
|
183
186
|
this.layers0.materialDefinitions = this.materialDefinitions;
|
|
187
|
+
|
|
188
|
+
if (this.layersHasTexture === false) {
|
|
189
|
+
this.layers0.store.defaultGeometrySchema.ordering = this.layers0.store.defaultGeometrySchema.ordering.filter(attribute => attribute !== 'uv0');
|
|
190
|
+
}
|
|
191
|
+
|
|
184
192
|
await this._writeLayers0();
|
|
185
193
|
createSceneServerPath(tilesetName, this.layers0, tilesetPath);
|
|
186
194
|
await this._writeNodeIndexDocument(root0, 'root', join(this.layers0Path, 'nodes', 'root'));
|
|
@@ -397,6 +405,8 @@ export default class I3SConverter {
|
|
|
397
405
|
};
|
|
398
406
|
|
|
399
407
|
for (const resources of resourcesData || [emptyResources]) {
|
|
408
|
+
this.layersHasTexture = this.layersHasTexture || Boolean(resources.texture);
|
|
409
|
+
|
|
400
410
|
if (this.generateBoundingVolumes && resources.boundingVolumes) {
|
|
401
411
|
boundingVolumes = resources.boundingVolumes;
|
|
402
412
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/i3s-converter/i3s-converter.ts"],"names":["load","encode","Tileset3D","CesiumIonLoader","Tiles3DLoader","join","v4","uuidv4","process","transform","md5","NodePages","writeFile","removeDir","writeFileForSlpk","compressWithChildProcess","calculateFilesSize","timeConverter","convertB3dmToI3sGeometry","createBoundingVolumes","convertCommonToI3SExtentCoordinate","createSceneServerPath","convertGeometricErrorToScreenThreshold","PGMLoader","LAYERS","layersTemplate","NODE","nodeTemplate","SHARED_RESOURCES","sharedResourcesTemplate","validateNodeBoundingVolumes","KTX2BasisUniversalTextureWriter","ImageWriter","ION_DEFAULT_TOKEN","env","IonToken","HARDCODED_NODES_PER_PAGE","_3D_TILES","_3D_OBJECT_LAYER_TYPE","STRING_TYPE","SHORT_INT_TYPE","DOUBLE_TYPE","OBJECT_ID_TYPE","REFRESH_TOKEN_TIMEOUT","CESIUM_DATASET_PREFIX","I3SConverter","constructor","nodePages","fileMap","options","layers0Path","materialMap","Map","materialDefinitions","vertexCounter","layers0","featuresHashArray","refinementCounter","tilesCount","tilesWithAddRefineCount","validate","generateTextures","generateBoundingVolumes","convert","conversionStartTime","hrtime","tilesetName","slpk","egmFilePath","inputUrl","outputPath","draco","sevenZipExe","maxDepth","token","Boolean","Loader","indexOf","console","log","geoidHeightModel","useWriteFunction","preloadOptions","_fetchPreloadOptions","tilesetOptions","loadOptions","basis","format","headers","fetch","Object","assign","sourceTilesetJson","sourceTileset","_createAndSaveTileset","_finishConversion","tilesetPath","e","_formLayers0","sourceRootTile","root","boundingVolumes","parentId","push","index","lodThreshold","obb","children","isCreateSlpk","root0","_formRootNodeIndexDocument","_convertNodesTree","_writeLayers0","_writeNodeIndexDocument","save","_createSlpk","extent","layers0data","version","toUpperCase","id","name","href","store","nodesPerPage","compressGeometry","root0data","level","lodSelection","metricType","maxError","_loadTile","isContentSupported","child","_createNode","childPath","path","JSON","stringify","_addChildrenWithNeighborsAndWriteFile","parentNode","sourceTiles","unloadContent","nodePath","rootPath","slpkTilesetPath","slpkFileName","data","childNodes","_addChildren","_addNeighborsAndWriteFile","sourceTile","type","mbs","node","Number","length","neighbor","neighbors","warn","parentTile","_checkAddRefinementTypeForTile","_updateTilesetOptions","batchTable","content","batchTableJson","_convertAttributeStorageInfo","resourcesData","_convertResources","nodes","nodesInPage","emptyResources","geometry","compressedGeometry","texture","sharedResources","meshMaterial","vertexCount","attributes","featureCount","resources","maxScreenThresholdSQ","find","val","nodeInPage","_createNodeInNodePages","_createNodeIndexDocument","mesh","_writeResources","boundingVolumeWarnings","sourceTileContent","attributeStorageInfo","_convertBatchTableInfoToNodeAttributes","nodesCounter","definition","resource","attribute","material","nodeId","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","ktx2TextureData","Uint8Array","decodedFromKTX2TextureData","textureSetDefinitions","slpkTexturePath","compress","texturePath","fileBuffer","slpkAttributesPath","attributesPath","hash","has","get","newMaterialId","set","_createdStorageAttribute","attributeIndex","attributeType","storageAttribute","ordering","header","property","valueType","attributeValues","valuesPerElement","_setupIdAttribute","_setupStringAttribute","_setupDoubleAttribute","getAttributeType","isInteger","unshift","encoding","attributeByteCounts","_createFieldAttribute","fieldAttributeType","alias","batchTableWithObjectId","OBJECTID","firstAttribute","_getFieldAttributeType","fieldAttribute","popupInfo","_createPopupInfo","fields","layerType","title","mediaInfos","fieldInfos","popupElements","expressionInfos","fieldName","visible","isEditable","label","params","addRefinementPercentage","filesSize","diff","conversionTime","preload","accessToken","refreshTokenTime","tile","ADD_TILE_REFINEMENT","refine","includes"],"mappings":";AAmBA,SAAQA,IAAR,EAAcC,MAAd,QAA2B,kBAA3B;AACA,SAAQC,SAAR,QAAwB,mBAAxB;AACA,SAAQC,eAAR,EAAyBC,aAAzB,QAA6C,sBAA7C;AAEA,SAAQC,IAAR,QAAmB,MAAnB;AACA,SAAQC,EAAE,IAAIC,MAAd,QAA2B,MAA3B;AACA,OAAOC,OAAP,MAAoB,SAApB;AACA,OAAOC,SAAP,MAAsB,oBAAtB;AACA,OAAOC,GAAP,MAAgB,KAAhB;AAEA,OAAOC,SAAP,MAAsB,sBAAtB;AACA,SAAQC,SAAR,EAAmBC,SAAnB,EAA8BC,gBAA9B,QAAqD,yBAArD;AACA,SACEC,wBADF,QAIO,4BAJP;AAKA,SAAQC,kBAAR,EAA4BC,aAA5B,QAAgD,+BAAhD;AACA,OAAOC,wBAAP,MAAqC,8BAArC;AACA,SACEC,qBADF,EAEEC,kCAFF,QAGO,gCAHP;AAIA,SAAQC,qBAAR,QAAoC,oCAApC;AACA,SAAQC,sCAAR,QAAqD,mCAArD;AACA,SAAQC,SAAR,QAAwB,eAAxB;AAEA,SAAQC,MAAM,IAAIC,cAAlB,QAAuC,yBAAvC;AACA,SAAQC,IAAI,IAAIC,YAAhB,QAAmC,uBAAnC;AACA,SAAQC,gBAAgB,IAAIC,uBAA5B,QAA0D,mCAA1D;AACA,SAAQC,2BAAR,QAA0C,sBAA1C;AAEA,SAAQC,+BAAR,QAA8C,sBAA9C;AAGA,SAAQC,WAAR,QAA0B,oBAA1B;AAIA,MAAMC,iBAAiB,GACrBzB,OAAO,CAAC0B,GAAR,CAAYC,QAAZ,IACA,0NAFF;AAGA,MAAMC,wBAAwB,GAAG,EAAjC;AACA,MAAMC,SAAS,GAAG,SAAlB;AACA,MAAMC,qBAAqB,GAAG,UAA9B;AACA,MAAMC,WAAW,GAAG,QAApB;AACA,MAAMC,cAAc,GAAG,OAAvB;AACA,MAAMC,WAAW,GAAG,QAApB;AACA,MAAMC,cAAc,GAAG,UAAvB;AACA,MAAMC,qBAAqB,GAAG,IAA9B;AACA,MAAMC,qBAAqB,GAAG,UAA9B;AAMA,eAAe,MAAMC,YAAN,CAAmB;AAwBhCC,EAAAA,WAAW,GAAG;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,oDATsB,EAStB;;AAAA,iDAR0B,CAAC,CAAD,EAAI,CAAJ,CAQ1B;;AAAA,8CAPuB,CAAC,CAAD,EAAI,CAAJ,CAOvB;;AAAA,2CANoB,IAMpB;;AAAA,8CALmB,IAKnB;;AAAA,oCAJa1C,aAIb;;AAAA;;AAAA;;AACZ,SAAK2C,SAAL,GAAiB,IAAIpC,SAAJ,CAAcC,SAAd,EAAyBwB,wBAAzB,CAAjB;AACA,SAAKY,OAAL,GAAe,EAAf;AACA,SAAKC,OAAL,GAAe,EAAf;AACA,SAAKC,WAAL,GAAmB,EAAnB;AACA,SAAKC,WAAL,GAAmB,IAAIC,GAAJ,EAAnB;AACA,SAAKC,mBAAL,GAA2B,EAA3B;AACA,SAAKC,aAAL,GAAqB,CAArB;AACA,SAAKC,OAAL,GAAe,IAAf;AACA,SAAKC,iBAAL,GAAyB,EAAzB;AACA,SAAKC,iBAAL,GAAyB;AACvBC,MAAAA,UAAU,EAAE,CADW;AAEvBC,MAAAA,uBAAuB,EAAE;AAFF,KAAzB;AAIA,SAAKC,QAAL,GAAgB,KAAhB;AACA,SAAKC,gBAAL,GAAwB,KAAxB;AACA,SAAKC,uBAAL,GAA+B,KAA/B;AACD;;AAgBY,QAAPC,OAAO,CAACd,OAAD,EAeI;AACf,SAAKe,mBAAL,GAA2BxD,OAAO,CAACyD,MAAR,EAA3B;AACA,UAAM;AACJC,MAAAA,WADI;AAEJC,MAAAA,IAFI;AAGJC,MAAAA,WAHI;AAIJC,MAAAA,QAJI;AAKJT,MAAAA,QALI;AAMJU,MAAAA,UANI;AAOJC,MAAAA,KAPI;AAQJC,MAAAA,WARI;AASJC,MAAAA,QATI;AAUJC,MAAAA,KAVI;AAWJb,MAAAA,gBAXI;AAYJC,MAAAA;AAZI,QAaFb,OAbJ;AAcA,SAAKA,OAAL,GAAe;AAACwB,MAAAA,QAAD;AAAWN,MAAAA,IAAX;AAAiBK,MAAAA,WAAjB;AAA8BJ,MAAAA,WAA9B;AAA2CG,MAAAA,KAA3C;AAAkDG,MAAAA,KAAlD;AAAyDL,MAAAA;AAAzD,KAAf;AACA,SAAKT,QAAL,GAAgBe,OAAO,CAACf,QAAD,CAAvB;AACA,SAAKgB,MAAL,GAAcP,QAAQ,CAACQ,OAAT,CAAiBjC,qBAAjB,MAA4C,CAAC,CAA7C,GAAiDzC,eAAjD,GAAmEC,aAAjF;AACA,SAAKyD,gBAAL,GAAwBc,OAAO,CAACd,gBAAD,CAA/B;AACA,SAAKC,uBAAL,GAA+Ba,OAAO,CAACb,uBAAD,CAAtC;AAEAgB,IAAAA,OAAO,CAACC,GAAR,CAAY,qBAAZ;AACA,SAAKC,gBAAL,GAAwB,MAAMhF,IAAI,CAACoE,WAAD,EAAc7C,SAAd,CAAlC;AACAuD,IAAAA,OAAO,CAACC,GAAR,CAAY,6BAAZ;;AAEA,QAAIZ,IAAJ,EAAU;AACR,WAAKpB,SAAL,CAAekC,gBAAf,CAAgCnE,gBAAhC;AACD;;AAED,UAAMoE,cAAc,GAAG,MAAM,KAAKC,oBAAL,EAA7B;AACA,UAAMC,cAA8B,GAAG;AAACC,MAAAA,WAAW,EAAE;AAACC,QAAAA,KAAK,EAAE;AAACC,UAAAA,MAAM,EAAE;AAAT;AAAR;AAAd,KAAvC;;AACA,QAAIL,cAAc,CAACM,OAAnB,EAA4B;AAC1BJ,MAAAA,cAAc,CAACC,WAAf,CAA4BI,KAA5B,GAAoC;AAACD,QAAAA,OAAO,EAAEN,cAAc,CAACM;AAAzB,OAApC;AACD;;AACDE,IAAAA,MAAM,CAACC,MAAP,CAAcP,cAAd,EAA8BF,cAA9B;AACA,UAAMU,iBAAiB,GAAG,MAAM5F,IAAI,CAACqE,QAAD,EAAW,KAAKO,MAAhB,EAAwBQ,cAAc,CAACC,WAAvC,CAApC;AAEA,SAAKQ,aAAL,GAAqB,IAAI3F,SAAJ,CAAc0F,iBAAd,EAAiCR,cAAjC,CAArB;AAEA,UAAM,KAAKU,qBAAL,CAA2BxB,UAA3B,EAAuCJ,WAAvC,CAAN;AACA,UAAM,KAAK6B,iBAAL,CAAuB;AAAC5B,MAAAA,IAAI,EAAEQ,OAAO,CAACR,IAAD,CAAd;AAAsBG,MAAAA,UAAtB;AAAkCJ,MAAAA;AAAlC,KAAvB,CAAN;AACA,WAAO0B,iBAAP;AACD;;AAOkC,QAArBE,qBAAqB,CAACxB,UAAD,EAAqBJ,WAArB,EAAyD;AAC1F,UAAM8B,WAAW,GAAG3F,IAAI,WAAIiE,UAAJ,aAAqBJ,WAArB,EAAxB;;AAEA,QAAI;AACF,YAAMrD,SAAS,CAACmF,WAAD,CAAf;AACD,KAFD,CAEE,OAAOC,CAAP,EAAU,CAEX;;AAED,SAAK/C,WAAL,GAAmB7C,IAAI,CAAC2F,WAAD,EAAc,aAAd,EAA6B,QAA7B,EAAuC,GAAvC,CAAvB;;AAEA,SAAKE,YAAL,CAAkBhC,WAAlB;;AAEA,SAAKb,mBAAL,GAA2B,EAA3B;AACA,SAAKF,WAAL,GAAmB,IAAIC,GAAJ,EAAnB;AAEA,UAAM+C,cAA0B,GAAG,KAAKN,aAAL,CAAoBO,IAAvD;AACA,UAAMC,eAAe,GAAGlF,qBAAqB,CAACgF,cAAD,EAAiB,KAAKnB,gBAAtB,CAA7C;AACA,UAAMsB,QAAQ,GAAG,KAAKvD,SAAL,CAAewD,IAAf,CAAoB;AACnCC,MAAAA,KAAK,EAAE,CAD4B;AAEnCC,MAAAA,YAAY,EAAE,CAFqB;AAGnCC,MAAAA,GAAG,EAAEL,eAAe,CAACK,GAHc;AAInCC,MAAAA,QAAQ,EAAE;AAJyB,KAApB,CAAjB;AAOA,UAAMC,YAAY,GAAG,KAAK3D,OAAL,CAAakB,IAAlC;;AACA,UAAM0C,KAAK,GAAG,KAAKC,0BAAL,CAAgCT,eAAhC,CAAd;;AAEA,UAAM,KAAKU,iBAAL,CAAuBF,KAAvB,EAA8BV,cAA9B,EAA8CG,QAA9C,EAAwDD,eAAxD,CAAN;AAEA,SAAK9C,OAAL,CAAcF,mBAAd,GAAoC,KAAKA,mBAAzC;AACA,UAAM,KAAK2D,aAAL,EAAN;AACA3F,IAAAA,qBAAqB,CAAC6C,WAAD,EAAc,KAAKX,OAAnB,EAA6ByC,WAA7B,CAArB;AACA,UAAM,KAAKiB,uBAAL,CAA6BJ,KAA7B,EAAoC,MAApC,EAA4CxG,IAAI,CAAC,KAAK6C,WAAN,EAAmB,OAAnB,EAA4B,MAA5B,CAAhD,CAAN;AACA,UAAM,KAAKH,SAAL,CAAemE,IAAf,CAAoB,KAAKhE,WAAzB,EAAsC,KAAKF,OAA3C,EAAoD4D,YAApD,CAAN;AACA,UAAM,KAAKO,WAAL,CAAiBnB,WAAjB,CAAN;AACD;;AAMOE,EAAAA,YAAY,CAAChC,WAAD,EAA4B;AAC9C,UAAMkD,MAAM,GAAGhG,kCAAkC,CAAC,KAAKyE,aAAN,CAAjD;AACA,UAAMwB,WAAW,GAAG;AAClBC,MAAAA,OAAO,aAAM/G,MAAM,GAAGgH,WAAT,EAAN,MADW;AAElBC,MAAAA,EAAE,EAAE,CAFc;AAGlBC,MAAAA,IAAI,EAAEvD,WAHY;AAIlBwD,MAAAA,IAAI,EAAE,YAJY;AAKlBC,MAAAA,KAAK,EAAE;AACLH,QAAAA,EAAE,aAAMjH,MAAM,GAAGgH,WAAT,EAAN,MADG;AAELH,QAAAA;AAFK,OALW;AASlBrE,MAAAA,SAAS,EAAE;AACT6E,QAAAA,YAAY,EAAExF;AADL,OATO;AAYlByF,MAAAA,gBAAgB,EAAE,KAAK5E,OAAL,CAAasB;AAZb,KAApB;AAeA,SAAKhB,OAAL,GAAe9C,SAAS,CAAC4G,WAAD,EAAc5F,cAAc,EAA5B,CAAxB;AACD;;AAOOqF,EAAAA,0BAA0B,CAACT,eAAD,EAAwD;AACxF,UAAMyB,SAAS,GAAG;AAChBR,MAAAA,OAAO,aAAM/G,MAAM,GAAGgH,WAAT,EAAN,MADS;AAEhBC,MAAAA,EAAE,EAAE,MAFY;AAGhBO,MAAAA,KAAK,EAAE,CAHS;AAIhBC,MAAAA,YAAY,EAAE,CACZ;AACEC,QAAAA,UAAU,EAAE,sBADd;AAEEC,QAAAA,QAAQ,EAAE;AAFZ,OADY,EAKZ;AACED,QAAAA,UAAU,EAAE,oBADd;AAEEC,QAAAA,QAAQ,EAAE;AAFZ,OALY,CAJE;AAchB,SAAG7B,eAda;AAehBM,MAAAA,QAAQ,EAAE;AAfM,KAAlB;AAiBA,WAAOlG,SAAS,CAACqH,SAAD,EAAYnG,YAAY,EAAxB,CAAhB;AACD;;AAS8B,QAAjBoF,iBAAiB,CAC7BF,KAD6B,EAE7BV,cAF6B,EAG7BG,QAH6B,EAI7BD,eAJ6B,EAKd;AACf,UAAM,KAAKR,aAAL,CAAoBsC,SAApB,CAA8BhC,cAA9B,CAAN;;AACA,QAAI,KAAKiC,kBAAL,CAAwBjC,cAAxB,CAAJ,EAA6C;AAC3CU,MAAAA,KAAK,CAACF,QAAN,GAAiBE,KAAK,CAACF,QAAN,IAAkB,EAAnC;AACAE,MAAAA,KAAK,CAACF,QAAN,CAAeJ,IAAf,CAAoB;AAClBiB,QAAAA,EAAE,EAAE,GADc;AAElBE,QAAAA,IAAI,EAAE,KAFY;AAGlB,WAAGrB;AAHe,OAApB;AAKA,YAAM,CAACgC,KAAD,IAAU,MAAM,KAAKC,WAAL,CAAiBzB,KAAjB,EAAwBV,cAAxB,EAAwCG,QAAxC,EAAkD,CAAlD,CAAtB;AACA,YAAMiC,SAAS,GAAGlI,IAAI,CAAC,KAAK6C,WAAN,EAAmB,OAAnB,EAA4BmF,KAAK,CAACG,IAAlC,CAAtB;;AAEA,UAAI,KAAKvF,OAAL,CAAakB,IAAjB,EAAuB;AACrB,aAAKnB,OAAL,CAAa,qCAAb,IAAsD,MAAMlC,gBAAgB,CAC1EyH,SAD0E,EAE1EE,IAAI,CAACC,SAAL,CAAeL,KAAf,CAF0E,EAG1E,0BAH0E,CAA5E;AAKD,OAND,MAMO;AACL,cAAMzH,SAAS,CAAC2H,SAAD,EAAYE,IAAI,CAACC,SAAL,CAAeL,KAAf,CAAZ,CAAf;AACD;AACF,KAnBD,MAmBO;AACL,YAAM,KAAKM,qCAAL,CAA2C;AAC/CC,QAAAA,UAAU,EAAE/B,KADmC;AAE/CgC,QAAAA,WAAW,EAAE1C,cAAc,CAACQ,QAFmB;AAG/CL,QAAAA,QAH+C;AAI/CyB,QAAAA,KAAK,EAAE;AAJwC,OAA3C,CAAN;AAMD;;AACD,UAAM5B,cAAc,CAAC2C,aAAf,EAAN;AACD;;AAK0B,QAAb9B,aAAa,GAAkB;AAC3C,QAAI,KAAK/D,OAAL,CAAakB,IAAjB,EAAuB;AACrB,WAAKnB,OAAL,CAAa,sBAAb,IAAuC,MAAMlC,gBAAgB,CAC3D,KAAKoC,WADsD,EAE3DuF,IAAI,CAACC,SAAL,CAAe,KAAKnF,OAApB,CAF2D,EAG3D,mBAH2D,CAA7D;AAKD,KAND,MAMO;AACL,YAAM3C,SAAS,CAAC,KAAKsC,WAAN,EAAmBuF,IAAI,CAACC,SAAL,CAAe,KAAKnF,OAApB,CAAnB,CAAf;AACD;AACF;;AAKoC,QAAvB0D,uBAAuB,CACnCJ,KADmC,EAEnCkC,QAFmC,EAGnCC,QAHmC,EAIpB;AACf,QAAI,KAAK/F,OAAL,CAAakB,IAAjB,EAAuB;AACrB,WAAKnB,OAAL,iBAAsB+F,QAAtB,qCAAgE,MAAMjI,gBAAgB,CACpFkI,QADoF,EAEpFP,IAAI,CAACC,SAAL,CAAe7B,KAAf,CAFoF,EAGpF,0BAHoF,CAAtF;AAKD,KAND,MAMO;AACL,YAAMjG,SAAS,CAACoI,QAAD,EAAWP,IAAI,CAACC,SAAL,CAAe7B,KAAf,CAAX,CAAf;AACD;AACF;;AAMwB,QAAXM,WAAW,CAACnB,WAAD,EAAqC;AAC5D,QAAI,KAAK/C,OAAL,CAAakB,IAAjB,EAAuB;AACrB,YAAM8E,eAAe,GAAG5I,IAAI,CAAC2F,WAAD,EAAc,aAAd,EAA6B,QAA7B,EAAuC,GAAvC,CAA5B;AACA,YAAMkD,YAAY,aAAMlD,WAAN,UAAlB;AACA,YAAMjF,wBAAwB,CAC5BkI,eAD4B,EAE5BC,YAF4B,EAG5B,CAH4B,EAI5B,GAJ4B,EAM5B,KAAKjG,OAAL,CAAauB,WANe,CAA9B;;AA2BA,UAAI;AACF,cAAM3D,SAAS,CAACmF,WAAD,CAAf;AACD,OAFD,CAEE,OAAOC,CAAP,EAAU,CAEX;AACF;AACF;;AAUkD,QAArC0C,qCAAqC,CAACQ,IAAD,EAKjC;AAChB,UAAMC,UAAU,GAAG,EAAnB;AACA,UAAM,KAAKC,YAAL,CAAkB,EAAC,GAAGF,IAAJ;AAAUC,MAAAA;AAAV,KAAlB,CAAN;AACA,UAAM,KAAKE,yBAAL,CAA+BH,IAAI,CAACP,UAApC,EAAgDQ,UAAhD,CAAN;AACD;;AAWyB,QAAZC,YAAY,CAACF,IAAD,EAMR;AAChB,UAAM;AAACC,MAAAA,UAAD;AAAaP,MAAAA,WAAb;AAA0BD,MAAAA,UAA1B;AAAsCtC,MAAAA,QAAtC;AAAgDyB,MAAAA;AAAhD,QAAyDoB,IAA/D;;AACA,QAAI,KAAKlG,OAAL,CAAawB,QAAb,IAAyBsD,KAAK,GAAG,KAAK9E,OAAL,CAAawB,QAAlD,EAA4D;AAC1D;AACD;;AACD,SAAK,MAAM8E,UAAX,IAAyBV,WAAzB,EAAsC;AACpC,UAAIU,UAAU,CAACC,IAAX,KAAoB,MAAxB,EAAgC;AAC9B,cAAM,KAAK3D,aAAL,CAAoBsC,SAApB,CAA8BoB,UAA9B,CAAN;AACA,cAAM,KAAKF,YAAL,CAAkB;AACtBT,UAAAA,UADsB;AAEtBC,UAAAA,WAAW,EAAEU,UAAU,CAAC5C,QAFF;AAGtByC,UAAAA,UAHsB;AAItB9C,UAAAA,QAJsB;AAKtByB,UAAAA,KAAK,EAAEA,KAAK,GAAG;AALO,SAAlB,CAAN;AAOA,cAAMwB,UAAU,CAACT,aAAX,EAAN;AACD,OAVD,MAUO;AACL,cAAMnC,QAAQ,GAAG,MAAM,KAAK2B,WAAL,CAAiBM,UAAjB,EAA6BW,UAA7B,EAAyCjD,QAAzC,EAAmDyB,KAAnD,CAAvB;AACAa,QAAAA,UAAU,CAACjC,QAAX,GAAsBiC,UAAU,CAACjC,QAAX,IAAuB,EAA7C;;AACA,aAAK,MAAM0B,KAAX,IAAoB1B,QAApB,EAA8B;AAC5BiC,UAAAA,UAAU,CAACjC,QAAX,CAAoBJ,IAApB,CAAyB;AACvBiB,YAAAA,EAAE,EAAEa,KAAK,CAACb,EADa;AAEvBE,YAAAA,IAAI,eAAQW,KAAK,CAACG,IAAd,CAFmB;AAGvB9B,YAAAA,GAAG,EAAE2B,KAAK,CAAC3B,GAHY;AAIvB+C,YAAAA,GAAG,EAAEpB,KAAK,CAACoB;AAJY,WAAzB;AAMAL,UAAAA,UAAU,CAAC7C,IAAX,CAAgB8B,KAAhB;AACD;AACF;;AACD,UAAIkB,UAAU,CAAC/B,EAAf,EAAmB;AACjB1C,QAAAA,OAAO,CAACC,GAAR,CAAYwE,UAAU,CAAC/B,EAAvB;AACD;AACF;AACF;;AAOsC,QAAzB8B,yBAAyB,CACrCV,UADqC,EAErCQ,UAFqC,EAGtB;AACf,SAAK,MAAMM,IAAX,IAAmBN,UAAnB,EAA+B;AAAA;;AAC7B,YAAMb,SAAS,GAAGlI,IAAI,CAAC,KAAK6C,WAAN,EAAmB,OAAnB,EAA4BwG,IAAI,CAAClB,IAAjC,CAAtB;AACA,YAAMO,QAAQ,GAAGW,IAAI,CAAClB,IAAtB;AACA,aAAOkB,IAAI,CAAClB,IAAZ;;AAGA,UAAImB,MAAM,CAACf,UAAD,aAACA,UAAD,+CAACA,UAAU,CAAEjC,QAAb,yDAAC,qBAAsBiD,MAAvB,CAAN,GAAuC,IAA3C,EAAiD;AAC/C,aAAK,MAAMC,QAAX,IAAuBjB,UAAU,CAACjC,QAAX,IAAuB,EAA9C,EAAkD;AAEhD,cAAI+C,IAAI,CAAClC,EAAL,KAAYqC,QAAQ,CAACrC,EAAzB,EAA6B;AAC3B;AACD;;AAED,cAAIkC,IAAI,CAACI,SAAT,EAAoB;AAClBJ,YAAAA,IAAI,CAACI,SAAL,CAAevD,IAAf,CAAoB,EAAC,GAAGsD;AAAJ,aAApB;AACD;AACF;AACF,OAXD,MAWO;AAEL/E,QAAAA,OAAO,CAACiF,IAAR,gBACUL,IAAI,CAAClC,EADf;AAGA,eAAOkC,IAAI,CAACI,SAAZ;AACD;;AACD,YAAM,KAAK7C,uBAAL,CAA6ByC,IAA7B,EAAmCX,QAAnC,EAA8CR,SAA9C,CAAN;AACAmB,MAAAA,IAAI,CAACI,SAAL,GAAiB,EAAjB;AACD;AACF;;AASwB,QAAXxB,WAAW,CACvB0B,UADuB,EAEvBT,UAFuB,EAGvBjD,QAHuB,EAIvByB,KAJuB,EAKS;AAAA;;AAChC,QAAI,KAAKnE,QAAT,EAAmB;AACjB,WAAKqG,8BAAL,CAAoCV,UAApC;AACD;;AAED,UAAM,KAAKW,qBAAL,EAAN;AACA,UAAM,KAAKrE,aAAL,CAAoBsC,SAApB,CAA8BoB,UAA9B,CAAN;AAEA,QAAIlD,eAAe,GAAGlF,qBAAqB,CAACoI,UAAD,EAAa,KAAKvE,gBAAlB,CAA3C;AAEA,UAAMmF,UAAU,GAAGZ,UAAH,aAAGA,UAAH,8CAAGA,UAAU,CAAEa,OAAf,wDAAG,oBAAqBC,cAAxC;;AAEA,QAAIF,UAAJ,EAAgB;AACd,WAAKG,4BAAL,CAAkCf,UAAU,CAACa,OAA7C;AACD;;AAED,UAAMG,aAAa,GAAG,MAAM,KAAKC,iBAAL,CAAuBjB,UAAvB,CAA5B;AAEA,UAAMkB,KAA4B,GAAG,EAArC;AACA,UAAMC,WAAyB,GAAG,EAAlC;AACA,UAAMC,cAAc,GAAG;AACrBC,MAAAA,QAAQ,EAAE,IADW;AAErBC,MAAAA,kBAAkB,EAAE,IAFC;AAGrBC,MAAAA,OAAO,EAAE,IAHY;AAIrBC,MAAAA,eAAe,EAAE,IAJI;AAKrBC,MAAAA,YAAY,EAAE,IALO;AAMrBC,MAAAA,WAAW,EAAE,IANQ;AAOrBC,MAAAA,UAAU,EAAE,IAPS;AAQrBC,MAAAA,YAAY,EAAE,IARO;AASrB9E,MAAAA,eAAe,EAAE;AATI,KAAvB;;AAYA,SAAK,MAAM+E,SAAX,IAAwBb,aAAa,IAAI,CAACI,cAAD,CAAzC,EAA2D;AACzD,UAAI,KAAK7G,uBAAL,IAAgCsH,SAAS,CAAC/E,eAA9C,EAA+D;AAC7DA,QAAAA,eAAe,GAAG+E,SAAS,CAAC/E,eAA5B;AACD;;AAED,YAAM2B,YAAY,GAAG1G,sCAAsC,CAACiI,UAAD,EAAalD,eAAb,CAA3D;AACA,YAAMgF,oBAAoB,GAAGrD,YAAY,CAACsD,IAAb,CAC1BC,GAAD,IAASA,GAAG,CAACtD,UAAJ,KAAmB,sBADD,KAExB;AAACC,QAAAA,QAAQ,EAAE;AAAX,OAFL;;AAIA,YAAMsD,UAAU,GAAG,KAAKC,sBAAL,CACjBJ,oBADiB,EAEjBhF,eAFiB,EAGjBkD,UAHiB,EAIjBjD,QAJiB,EAKjB8E,SALiB,CAAnB;;AAOA,YAAM1B,IAAI,GAAG,KAAKgC,wBAAL,CACX1B,UADW,EAEX3D,eAFW,EAGX2B,YAHW,EAIXwD,UAJW,EAKXJ,SALW,CAAb;;AAQA,UAAII,UAAU,CAACG,IAAf,EAAqB;AACnB,cAAM,KAAKC,eAAL,CAAqBR,SAArB,EAAgC1B,IAAI,CAAClB,IAArC,CAAN;AACD;;AAED,UAAI,KAAK5E,QAAT,EAAmB;AACjB,aAAKiI,sBAAL,GAA8B/J,2BAA2B,CAAC4H,IAAD,CAAzD;;AAEA,YAAI,KAAKmC,sBAAL,IAA+B,KAAKA,sBAAL,CAA4BjC,MAA/D,EAAuE;AACrE9E,UAAAA,OAAO,CAACiF,IAAR,CAAa,4BAAb,EAA2C,GAAG,KAAK8B,sBAAnD;AACD;AACF;;AAEDpB,MAAAA,KAAK,CAAClE,IAAN,CAAWmD,IAAX;AACAgB,MAAAA,WAAW,CAACnE,IAAZ,CAAiBiF,UAAjB;AACD;;AAEDjC,IAAAA,UAAU,CAACT,aAAX;AAEA,UAAM,KAAKH,qCAAL,CAA2C;AAC/CC,MAAAA,UAAU,EAAE6B,KAAK,CAAC,CAAD,CAD8B;AAE/C5B,MAAAA,WAAW,EAAEU,UAAU,CAAC5C,QAFuB;AAG/CL,MAAAA,QAAQ,EAAEoE,WAAW,CAAC,CAAD,CAAX,CAAelE,KAHsB;AAI/CuB,MAAAA,KAAK,EAAEA,KAAK,GAAG;AAJgC,KAA3C,CAAN;AAMA,WAAO0C,KAAP;AACD;;AAQOH,EAAAA,4BAA4B,CAACwB,iBAAD,EAAuC;AAAA;;AAEzE,UAAM3B,UAAU,GAAG2B,iBAAiB,IAAIA,iBAAiB,CAACzB,cAA1D;;AACA,QAAIF,UAAU,IAAI,kBAAC,KAAK5G,OAAN,kEAAC,aAAcwI,oBAAf,kDAAC,sBAAoCnC,MAArC,CAAlB,EAA+D;AAC7D,WAAKoC,sCAAL,CAA4C7B,UAA5C;AACD;AACF;;AAc8B,QAAjBK,iBAAiB,CAACjB,UAAD,EAAkE;AAAA;;AAC/F,QAAI,CAAC,KAAKnB,kBAAL,CAAwBmB,UAAxB,CAAL,EAA0C;AACxC,aAAO,IAAP;AACD;;AACD,UAAMgB,aAAa,GAAG,MAAMrJ,wBAAwB,CAClDqI,UAAU,CAACa,OADuC,EAElDT,MAAM,CAAC,KAAK5G,SAAL,CAAekJ,YAAhB,CAF4C,EAGlD,KAAKzI,iBAH6C,mBAIlD,KAAKD,OAJ6C,kDAIlD,cAAcwI,oBAJoC,EAKlD,KAAK9I,OAAL,CAAasB,KALqC,EAMlD,KAAKT,uBAN6C,EAOlD,KAAKkB,gBAP6C,CAApD;AASA,WAAOuF,aAAP;AACD;;AAgBOkB,EAAAA,sBAAsB,CAC5BJ,oBAD4B,EAE5BhF,eAF4B,EAG5BkD,UAH4B,EAI5BjD,QAJ4B,EAK5B8E,SAL4B,EAMhB;AACZ,UAAM;AAACJ,MAAAA,YAAD;AAAeF,MAAAA,OAAf;AAAwBG,MAAAA,WAAxB;AAAqCE,MAAAA,YAArC;AAAmDP,MAAAA;AAAnD,QAA+DQ,SAArE;AACA,UAAMI,UAAsB,GAAG;AAC7BhF,MAAAA,KAAK,EAAE,CADsB;AAE7BC,MAAAA,YAAY,EAAE4E,oBAAoB,CAACnD,QAFN;AAG7BxB,MAAAA,GAAG,EAAEL,eAAe,CAACK,GAHQ;AAI7BC,MAAAA,QAAQ,EAAE;AAJmB,KAA/B;;AAMA,QAAIiE,QAAQ,IAAI,KAAKxC,kBAAL,CAAwBmB,UAAxB,CAAhB,EAAqD;AACnDiC,MAAAA,UAAU,CAACG,IAAX,GAAkB;AAChBf,QAAAA,QAAQ,EAAE;AACRsB,UAAAA,UAAU,EAAEpB,OAAO,GAAG,CAAH,GAAO,CADlB;AAERqB,UAAAA,QAAQ,EAAE;AAFF,SADM;AAKhBC,QAAAA,SAAS,EAAE;AACTD,UAAAA,QAAQ,EAAE;AADD,SALK;AAQhBE,QAAAA,QAAQ,EAAE;AACRH,UAAAA,UAAU,EAAE;AADJ;AARM,OAAlB;AAYD;;AACD,UAAMI,MAAM,GAAG,KAAKvJ,SAAL,CAAewD,IAAf,CAAoBiF,UAApB,EAAgClF,QAAhC,CAAf;;AAEA,QAAI0E,YAAJ,EAAkB;AAChB,WAAKjI,SAAL,CAAewJ,sBAAf,CAAsCD,MAAtC,EAA8C,KAAKE,qBAAL,CAA2BxB,YAA3B,CAA9C;AACD;;AAED,QAAIF,OAAJ,EAAa;AACX,YAAM2B,cAAc,GAAG3B,OAAO,CAAC4B,KAAR,CAAcC,MAAd,GAAuB7B,OAAO,CAAC4B,KAAR,CAAcE,KAA5D;AACA,WAAK7J,SAAL,CAAe8J,4BAAf,CAA4CP,MAA5C,EAAoDG,cAApD;AACD;;AAED,QAAIxB,WAAJ,EAAiB;AACf,WAAK3H,aAAL,IAAsB2H,WAAtB;AACA,WAAKlI,SAAL,CAAe+J,yBAAf,CAAyCR,MAAzC,EAAiDrB,WAAjD;AACD;;AACD,SAAKlI,SAAL,CAAegK,2BAAf,CAA2CT,MAA3C;;AACA,QAAInB,YAAJ,EAAkB;AAChB,WAAKpI,SAAL,CAAeiK,0BAAf,CAA0CV,MAA1C,EAAkDnB,YAAlD;AACD;;AAED,WAAOK,UAAP;AACD;;AAaOE,EAAAA,wBAAwB,CAC9B9C,UAD8B,EAE9BvC,eAF8B,EAG9B2B,YAH8B,EAI9BwD,UAJ8B,EAK9BJ,SAL8B,EAMT;AACrB,UAAM;AAACN,MAAAA,OAAD;AAAUI,MAAAA;AAAV,QAAwBE,SAA9B;AACA,UAAMkB,MAAM,GAAGd,UAAU,CAAChF,KAA1B;AACA,UAAMyG,QAAQ,GAAG;AACf3F,MAAAA,OAAO,EAAEsB,UAAU,CAACtB,OADL;AAEfE,MAAAA,EAAE,EAAE8E,MAAM,CAACY,QAAP,EAFW;AAGf1E,MAAAA,IAAI,EAAE8D,MAAM,CAACY,QAAP,EAHS;AAIfnF,MAAAA,KAAK,EAAEa,UAAU,CAACb,KAAX,GAAoB,CAJZ;AAKf,SAAG1B,eALY;AAMf2B,MAAAA,YANe;AAOfY,MAAAA,UAAU,EAAE;AACVpB,QAAAA,EAAE,EAAEoB,UAAU,CAACpB,EADL;AAEVE,QAAAA,IAAI,eAAQkB,UAAU,CAACpB,EAAnB,CAFM;AAGViC,QAAAA,GAAG,EAAEb,UAAU,CAACa,GAHN;AAIV/C,QAAAA,GAAG,EAAEkC,UAAU,CAAClC;AAJN,OAPG;AAafC,MAAAA,QAAQ,EAAE,EAbK;AAcfmD,MAAAA,SAAS,EAAE;AAdI,KAAjB;AAgBA,UAAMJ,IAAI,GAAGjJ,SAAS,CAACwM,QAAD,EAAWtL,YAAY,EAAvB,CAAtB;;AAEA,QAAI6J,UAAU,CAACG,IAAf,EAAqB;AAAA;;AACnBjC,MAAAA,IAAI,CAACyD,YAAL,GAAoB,CAAC;AAACzF,QAAAA,IAAI,EAAE;AAAP,OAAD,CAApB;AACAgC,MAAAA,IAAI,CAAC0D,cAAL,GAAsB;AAAC1F,QAAAA,IAAI,EAAE;AAAP,OAAtB;;AAEA,UAAIoD,OAAJ,EAAa;AACXpB,QAAAA,IAAI,CAAC2D,WAAL,GAAmB,CAAC;AAAC3F,UAAAA,IAAI,EAAE;AAAP,SAAD,EAAyB;AAACA,UAAAA,IAAI,EAAE;AAAP,SAAzB,CAAnB;AACD;;AAED,UAAIwD,UAAU,IAAIA,UAAU,CAACtB,MAAzB,qBAAmC,KAAKrG,OAAxC,mEAAmC,cAAcwI,oBAAjD,kDAAmC,sBAAoCnC,MAA3E,EAAmF;AACjFF,QAAAA,IAAI,CAAC4D,aAAL,GAAqB,EAArB;;AACA,aAAK,IAAI9G,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAG0E,UAAU,CAACtB,MAAvC,EAA+CpD,KAAK,EAApD,EAAwD;AACtD,gBAAM+G,UAAU,GAAG,KAAKhK,OAAL,CAAawI,oBAAb,CAAkCvF,KAAlC,EAAyCgH,GAA5D;AACA9D,UAAAA,IAAI,CAAC4D,aAAL,CAAmB/G,IAAnB,CAAwB;AAACmB,YAAAA,IAAI,yBAAkB6F,UAAlB;AAAL,WAAxB;AACD;AACF;AACF;;AAED,WAAO7D,IAAP;AACD;;AAY4B,QAAfkC,eAAe,CAACR,SAAD,EAAmCrC,QAAnC,EAAoE;AAC/F,UAAM;AACJ6B,MAAAA,QAAQ,EAAE6C,cADN;AAEJ5C,MAAAA,kBAFI;AAGJC,MAAAA,OAHI;AAIJC,MAAAA,eAJI;AAKJG,MAAAA;AALI,QAMFE,SANJ;AAOA,UAAM7C,SAAS,GAAGlI,IAAI,CAAC,KAAK6C,WAAN,EAAmB,OAAnB,EAA4B6F,QAA5B,CAAtB;AACA,UAAM2E,aAAa,GAAGrN,IAAI,CAAC,OAAD,EAAU0I,QAAV,CAA1B;AAEA,UAAM,KAAK4E,gBAAL,CAAsBF,cAAtB,EAAuC5C,kBAAvC,EAA4DtC,SAA5D,EAAuEmF,aAAvE,CAAN;AACA,UAAM,KAAKE,YAAL,CAAkB7C,eAAlB,EAAoCxC,SAApC,EAA+CmF,aAA/C,EAA8D3E,QAA9D,CAAN;AACA,UAAM,KAAK8E,aAAL,CAAmB/C,OAAnB,EAA4BvC,SAA5B,EAAuCmF,aAAvC,CAAN;AACA,UAAM,KAAKI,gBAAL,CAAsB5C,UAAtB,EAAkC3C,SAAlC,EAA6CmF,aAA7C,CAAN;AACD;;AAS6B,QAAhBC,gBAAgB,CAC5BF,cAD4B,EAE5B5C,kBAF4B,EAG5BtC,SAH4B,EAI5BmF,aAJ4B,EAKb;AACf,QAAI,KAAKzK,OAAL,CAAakB,IAAjB,EAAuB;AACrB,YAAM4J,gBAAgB,GAAG1N,IAAI,CAACkI,SAAD,EAAY,YAAZ,CAA7B;AACA,WAAKvF,OAAL,WAAgB0K,aAAhB,6BAAuD,MAAM5M,gBAAgB,CAC3EiN,gBAD2E,EAE3EN,cAF2E,EAG3E,OAH2E,CAA7E;AAKD,KAPD,MAOO;AACL,YAAMO,YAAY,GAAG3N,IAAI,CAACkI,SAAD,EAAY,eAAZ,CAAzB;AACA,YAAM3H,SAAS,CAACoN,YAAD,EAAeP,cAAf,EAA+B,WAA/B,CAAf;AACD;;AAED,QAAI,KAAKxK,OAAL,CAAasB,KAAjB,EAAwB;AACtB,UAAI,KAAKtB,OAAL,CAAakB,IAAjB,EAAuB;AACrB,cAAM8J,0BAA0B,GAAG5N,IAAI,CAACkI,SAAD,EAAY,YAAZ,CAAvC;AACA,aAAKvF,OAAL,WAAgB0K,aAAhB,6BAAuD,MAAM5M,gBAAgB,CAC3EmN,0BAD2E,EAE3EpD,kBAF2E,EAG3E,OAH2E,CAA7E;AAKD,OAPD,MAOO;AACL,cAAMqD,sBAAsB,GAAG7N,IAAI,CAACkI,SAAD,EAAY,eAAZ,CAAnC;AACA,cAAM3H,SAAS,CAACsN,sBAAD,EAAyBrD,kBAAzB,EAA6C,WAA7C,CAAf;AACD;AACF;AACF;;AASyB,QAAZ+C,YAAY,CACxB7C,eADwB,EAExBxC,SAFwB,EAGxBmF,aAHwB,EAIxB3E,QAJwB,EAKT;AACfgC,IAAAA,eAAe,CAAChC,QAAhB,GAA2BA,QAA3B;AACA,UAAMoF,UAAU,GAAG1N,SAAS,CAACsK,eAAD,EAAkBlJ,uBAAuB,EAAzC,CAA5B;AACA,UAAMuM,aAAa,GAAG3F,IAAI,CAACC,SAAL,CAAeyF,UAAf,CAAtB;;AACA,QAAI,KAAKlL,OAAL,CAAakB,IAAjB,EAAuB;AACrB,YAAMkK,cAAc,GAAGhO,IAAI,CAACkI,SAAD,EAAY,QAAZ,CAA3B;AACA,WAAKvF,OAAL,WAAgB0K,aAAhB,uCAAiE,MAAM5M,gBAAgB,CACrFuN,cADqF,EAErFD,aAFqF,EAGrF,qBAHqF,CAAvF;AAKD,KAPD,MAOO;AACL,YAAME,UAAU,GAAGjO,IAAI,CAACkI,SAAD,EAAY,SAAZ,CAAvB;AACA,YAAM3H,SAAS,CAAC0N,UAAD,EAAaF,aAAb,CAAf;AACD;AACF;;AAQ0B,QAAbP,aAAa,CACzB/C,OADyB,EAEzBvC,SAFyB,EAGzBmF,aAHyB,EAIV;AACf,QAAI5C,OAAJ,EAAa;AACX,YAAMvF,MAAM,GAAG,KAAKgJ,oBAAL,CAA0BzD,OAA1B,aAA0BA,OAA1B,uBAA0BA,OAAO,CAAE0D,QAAnC,CAAf;;AACA,YAAMC,OAAoC,GAAG,EAA7C;AACA,YAAMpB,WAAW,GAAGvC,OAAO,CAAC4D,UAAR,CAAoBvF,IAAxC;;AAEA,cAAQ5D,MAAR;AACE,aAAK,KAAL;AACA,aAAK,KAAL;AAAY;AACVkJ,YAAAA,OAAO,CAAClI,IAAR,CAAa;AAACkB,cAAAA,IAAI,EAAE,GAAP;AAAYlC,cAAAA;AAAZ,aAAb;AACA,kBAAM,KAAKoJ,gBAAL,CAAsBtB,WAAtB,EAAmC,GAAnC,EAAwC9H,MAAxC,EAAgDgD,SAAhD,EAA2DmF,aAA3D,CAAN;;AAEA,gBAAI,KAAK7J,gBAAT,EAA2B;AACzB4K,cAAAA,OAAO,CAAClI,IAAR,CAAa;AAACkB,gBAAAA,IAAI,EAAE,GAAP;AAAYlC,gBAAAA,MAAM,EAAE;AAApB,eAAb;AACA,oBAAMqJ,eAAe,GAAG,IAAIC,UAAJ,CACtB,MAAM5O,MAAM,CAAC6K,OAAO,CAAC4B,KAAT,EAAgB3K,+BAAhB,CADU,CAAxB;AAGA,oBAAM,KAAK4M,gBAAL,CAAsBC,eAAtB,EAAuC,GAAvC,EAA4C,MAA5C,EAAoDrG,SAApD,EAA+DmF,aAA/D,CAAN;AACD;;AAED;AACD;;AAED,aAAK,MAAL;AAAa;AACXe,YAAAA,OAAO,CAAClI,IAAR,CAAa;AAACkB,cAAAA,IAAI,EAAE,GAAP;AAAYlC,cAAAA;AAAZ,aAAb;AACA,kBAAM,KAAKoJ,gBAAL,CAAsBtB,WAAtB,EAAmC,GAAnC,EAAwC9H,MAAxC,EAAgDgD,SAAhD,EAA2DmF,aAA3D,CAAN;;AAEA,gBAAI,KAAK7J,gBAAT,EAA2B;AACzB4K,cAAAA,OAAO,CAAClI,IAAR,CAAa;AAACkB,gBAAAA,IAAI,EAAE,GAAP;AAAYlC,gBAAAA,MAAM,EAAE;AAApB,eAAb;AACA,oBAAMuJ,0BAA0B,GAAG,IAAID,UAAJ,CACjC,MAAM5O,MAAM,CAAC6K,OAAO,CAAC4B,KAAR,CAAevD,IAAf,CAAoB,CAApB,CAAD,EAAyBnH,WAAzB,CADqB,CAAnC;AAGA,oBAAM,KAAK2M,gBAAL,CACJG,0BADI,EAEJ,GAFI,EAGJ,KAHI,EAIJvG,SAJI,EAKJmF,aALI,CAAN;AAOD;AACF;AAlCH;;AAqCA,UAAI,CAAC,KAAKnK,OAAL,CAAcwL,qBAAd,CAAqCnF,MAA1C,EAAkD;AAChD,aAAKrG,OAAL,CAAcwL,qBAAd,CAAqCxI,IAArC,CAA0C;AAACkI,UAAAA;AAAD,SAA1C;AACD;AACF;AACF;;AAU6B,QAAhBE,gBAAgB,CAC5BtB,WAD4B,EAE5B5F,IAF4B,EAG5BlC,MAH4B,EAI5BgD,SAJ4B,EAK5BmF,aAL4B,EAMb;AACf,QAAI,KAAKzK,OAAL,CAAakB,IAAjB,EAAuB;AACrB,YAAM6K,eAAe,GAAG3O,IAAI,CAACkI,SAAD,EAAY,UAAZ,CAA5B;AACA,YAAM0G,QAAQ,GAAG,KAAjB;AAEA,WAAKjM,OAAL,WAAgB0K,aAAhB,uBAA0CjG,IAA1C,cAAkDlC,MAAlD,KAA8D,MAAMzE,gBAAgB,CAClFkO,eADkF,EAElF3B,WAFkF,YAG/E5F,IAH+E,cAGvElC,MAHuE,GAIlF0J,QAJkF,CAApF;AAMD,KAVD,MAUO;AACL,YAAMC,WAAW,GAAG7O,IAAI,CAACkI,SAAD,qBAAwBd,IAAxB,OAAxB;AACA,YAAM7G,SAAS,CAACsO,WAAD,EAAc7B,WAAd,kBAAoC9H,MAApC,EAAf;AACD;AACF;;AAQ6B,QAAhBuI,gBAAgB,CAC5B5C,UAD4B,EAE5B3C,SAF4B,EAG5BmF,aAH4B,EAIb;AAAA;;AACf,QAAIxC,UAAU,CAACtB,MAAX,qBAAqB,KAAKrG,OAA1B,mEAAqB,cAAcwI,oBAAnC,kDAAqB,sBAAoCnC,MAA7D,EAAqE;AACnE,WAAK,IAAIpD,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAG0E,UAAU,CAACtB,MAAvC,EAA+CpD,KAAK,EAApD,EAAwD;AACtD,cAAM+G,UAAU,GAAG,KAAKhK,OAAL,CAAawI,oBAAb,CAAkCvF,KAAlC,EAAyCgH,GAA5D;AACA,cAAM2B,UAAU,GAAG,IAAIN,UAAJ,CAAe3D,UAAU,CAAC1E,KAAD,CAAzB,CAAnB;;AAEA,YAAI,KAAKvD,OAAL,CAAakB,IAAjB,EAAuB;AACrB,gBAAMiL,kBAAkB,GAAG/O,IAAI,CAACkI,SAAD,EAAY,YAAZ,EAA0BgF,UAA1B,CAA/B;AACA,eAAKvK,OAAL,WAAgB0K,aAAhB,yBAA4CH,UAA5C,gBAAmE,MAAMzM,gBAAgB,CACvFsO,kBADuF,EAEvFD,UAFuF,EAGvF,OAHuF,CAAzF;AAKD,SAPD,MAOO;AACL,gBAAME,cAAc,GAAGhP,IAAI,CAACkI,SAAD,uBAA0BgF,UAA1B,QAA3B;AACA,gBAAM3M,SAAS,CAACyO,cAAD,EAAiBF,UAAjB,EAA6B,WAA7B,CAAf;AACD;AACF;AACF;AACF;;AAMOZ,EAAAA,oBAAoB,CAACC,QAAD,EAAuD;AACjF,YAAQA,QAAR;AACE,WAAK,YAAL;AACE,eAAO,KAAP;;AACF,WAAK,WAAL;AACE,eAAO,KAAP;;AACF,WAAK,YAAL;AACE,eAAO,MAAP;;AACF;AACE,eAAO,KAAP;AARJ;AAUD;;AAOOhC,EAAAA,qBAAqB,CAACH,QAAD,EAA0C;AACrE,UAAMiD,IAAI,GAAG5O,GAAG,CAAC+H,IAAI,CAACC,SAAL,CAAe2D,QAAf,CAAD,CAAhB;;AACA,QAAI,KAAKlJ,WAAL,CAAiBoM,GAAjB,CAAqBD,IAArB,CAAJ,EAAgC;AAC9B,aAAO,KAAKnM,WAAL,CAAiBqM,GAAjB,CAAqBF,IAArB,CAAP;AACD;;AACD,UAAMG,aAAa,GAAG,KAAKpM,mBAAL,CAAyBkD,IAAzB,CAA8B8F,QAA9B,IAA0C,CAAhE;AACA,SAAKlJ,WAAL,CAAiBuM,GAAjB,CAAqBJ,IAArB,EAA2BG,aAA3B;AACA,WAAOA,aAAP;AACD;;AASOE,EAAAA,wBAAwB,CAC9BC,cAD8B,EAE9BpC,GAF8B,EAG9BqC,aAH8B,EAIR;AACtB,UAAMC,gBAAgB,GAAG;AACvBtC,MAAAA,GAAG,cAAOoC,cAAP,CADoB;AAEvBnI,MAAAA,IAAI,EAAE+F,GAFiB;AAGvBuC,MAAAA,QAAQ,EAAE,CAAC,iBAAD,CAHa;AAIvBC,MAAAA,MAAM,EAAE,CAAC;AAACC,QAAAA,QAAQ,EAAE,OAAX;AAAoBC,QAAAA,SAAS,EAAE;AAA/B,OAAD,CAJe;AAKvBC,MAAAA,eAAe,EAAE;AAACD,QAAAA,SAAS,EAAE,OAAZ;AAAqBE,QAAAA,gBAAgB,EAAE;AAAvC;AALM,KAAzB;;AAQA,YAAQP,aAAR;AACE,WAAKnN,cAAL;AACE,aAAK2N,iBAAL,CAAuBP,gBAAvB;;AACA;;AACF,WAAKvN,WAAL;AACE,aAAK+N,qBAAL,CAA2BR,gBAA3B;;AACA;;AACF,WAAKrN,WAAL;AACE,aAAK8N,qBAAL,CAA2BT,gBAA3B;;AACA;;AACF,WAAKtN,cAAL;AACE;;AACF;AACE,aAAK8N,qBAAL,CAA2BR,gBAA3B;;AAbJ;;AAgBA,WAAOA,gBAAP;AACD;;AAOOU,EAAAA,gBAAgB,CAAChD,GAAD,EAAcpB,SAAd,EAAyC;AAC/D,QAAIoB,GAAG,KAAK9K,cAAZ,EAA4B;AAC1B,aAAOA,cAAP;AACD;;AACD,QAAI,OAAO0J,SAAP,KAAqB7J,WAAzB,EAAsC;AACpC,aAAOA,WAAP;AACD,KAFD,MAEO,IAAI,OAAO6J,SAAP,KAAqB,QAAzB,EAAmC;AACxC,aAAOzC,MAAM,CAAC8G,SAAP,CAAiBrE,SAAjB,IAA8B5J,cAA9B,GAA+CC,WAAtD;AACD;;AACD,WAAOF,WAAP;AACD;;AAMO+N,EAAAA,qBAAqB,CAACR,gBAAD,EAA+C;AAC1EA,IAAAA,gBAAgB,CAACC,QAAjB,CAA2BW,OAA3B,CAAmC,qBAAnC;AACAZ,IAAAA,gBAAgB,CAACE,MAAjB,CAAwBzJ,IAAxB,CAA6B;AAAC0J,MAAAA,QAAQ,EAAE,0BAAX;AAAuCC,MAAAA,SAAS,EAAE;AAAlD,KAA7B;AACAJ,IAAAA,gBAAgB,CAACK,eAAjB,GAAmC;AACjCD,MAAAA,SAAS,EAAE,QADsB;AAEjCS,MAAAA,QAAQ,EAAE,OAFuB;AAGjCP,MAAAA,gBAAgB,EAAE;AAHe,KAAnC;AAKAN,IAAAA,gBAAgB,CAACc,mBAAjB,GAAuC;AACrCV,MAAAA,SAAS,EAAE,QAD0B;AAErCE,MAAAA,gBAAgB,EAAE;AAFmB,KAAvC;AAID;;AAMOC,EAAAA,iBAAiB,CAACP,gBAAD,EAA+C;AACtEA,IAAAA,gBAAgB,CAACK,eAAjB,GAAmC;AACjCD,MAAAA,SAAS,EAAE,OADsB;AAEjCE,MAAAA,gBAAgB,EAAE;AAFe,KAAnC;AAID;;AAMOG,EAAAA,qBAAqB,CAACT,gBAAD,EAA+C;AAC1EA,IAAAA,gBAAgB,CAACK,eAAjB,GAAmC;AACjCD,MAAAA,SAAS,EAAE,SADsB;AAEjCE,MAAAA,gBAAgB,EAAE;AAFe,KAAnC;AAID;;AAOOS,EAAAA,qBAAqB,CAACrD,GAAD,EAAcsD,kBAAd,EAAoD;AAC/E,WAAO;AACLrJ,MAAAA,IAAI,EAAE+F,GADD;AAELhE,MAAAA,IAAI,EAAEsH,kBAFD;AAGLC,MAAAA,KAAK,EAAEvD;AAHF,KAAP;AAKD;;AAMOxB,EAAAA,sCAAsC,CAAC7B,UAAD,EAAmC;AAC/E,QAAIyF,cAAc,GAAG,CAArB;AACA,UAAMoB,sBAAsB,GAAG;AAC7BC,MAAAA,QAAQ,EAAE,CAAC,CAAD,CADmB;AAE7B,SAAG9G;AAF0B,KAA/B;;AAKA,SAAK,MAAMqD,GAAX,IAAkBwD,sBAAlB,EAA0C;AACxC,YAAME,cAAc,GAAGF,sBAAsB,CAACxD,GAAD,CAAtB,CAA4B,CAA5B,CAAvB;AACA,YAAMqC,aAAa,GAAG,KAAKW,gBAAL,CAAsBhD,GAAtB,EAA2B0D,cAA3B,CAAtB;;AAEA,YAAMpB,gBAAgB,GAAG,KAAKH,wBAAL,CAA8BC,cAA9B,EAA8CpC,GAA9C,EAAmDqC,aAAnD,CAAzB;;AACA,YAAMiB,kBAAkB,GAAG,KAAKK,sBAAL,CAA4BtB,aAA5B,CAA3B;;AACA,YAAMuB,cAAc,GAAG,KAAKP,qBAAL,CAA2BrD,GAA3B,EAAgCsD,kBAAhC,CAAvB;;AACA,YAAMO,SAAS,GAAG,KAAKC,gBAAL,CAAsBN,sBAAtB,CAAlB;;AAEA,WAAKzN,OAAL,CAAcwI,oBAAd,CAAoCxF,IAApC,CAAyCuJ,gBAAzC;AACA,WAAKvM,OAAL,CAAcgO,MAAd,CAAsBhL,IAAtB,CAA2B6K,cAA3B;AACA,WAAK7N,OAAL,CAAc8N,SAAd,GAA0BA,SAA1B;AACA,WAAK9N,OAAL,CAAciO,SAAd,GAA0BlP,qBAA1B;AAEAsN,MAAAA,cAAc,IAAI,CAAlB;AACD;AACF;;AAMOuB,EAAAA,sBAAsB,CAACtB,aAAD,EAAsC;AAClE,YAAQA,aAAR;AACE,WAAKnN,cAAL;AACE,eAAO,kBAAP;;AACF,WAAKH,WAAL;AACE,eAAO,qBAAP;;AACF,WAAKC,cAAL;AACE,eAAO,sBAAP;;AACF,WAAKC,WAAL;AACE,eAAO,qBAAP;;AACF;AACE,eAAO,qBAAP;AAVJ;AAYD;;AAOO6O,EAAAA,gBAAgB,CAACnH,UAAD,EAAwC;AAC9D,UAAMsH,KAAK,GAAG,YAAd;AACA,UAAMC,UAAU,GAAG,EAAnB;AACA,UAAMC,UAAuB,GAAG,EAAhC;AACA,UAAMC,aAGH,GAAG,EAHN;AAIA,UAAMC,eAAe,GAAG,EAAxB;;AAEA,SAAK,MAAMrE,GAAX,IAAkBrD,UAAlB,EAA8B;AAC5BwH,MAAAA,UAAU,CAACpL,IAAX,CAAgB;AACduL,QAAAA,SAAS,EAAEtE,GADG;AAEduE,QAAAA,OAAO,EAAE,IAFK;AAGdC,QAAAA,UAAU,EAAE,KAHE;AAIdC,QAAAA,KAAK,EAAEzE;AAJO,OAAhB;AAMD;;AACDoE,IAAAA,aAAa,CAACrL,IAAd,CAAmB;AACjBoL,MAAAA,UADiB;AAEjBnI,MAAAA,IAAI,EAAE;AAFW,KAAnB;AAKA,WAAO;AACLiI,MAAAA,KADK;AAELC,MAAAA,UAFK;AAGLE,MAAAA,aAHK;AAILD,MAAAA,UAJK;AAKLE,MAAAA;AALK,KAAP;AAOD;;AAM8B,QAAjB9L,iBAAiB,CAACmM,MAAD,EAIb;AAChB,UAAM;AAACxO,MAAAA,UAAD;AAAaC,MAAAA;AAAb,QAAwC,KAAKF,iBAAnD;AACA,UAAM0O,uBAAuB,GAAGxO,uBAAuB,GAClDA,uBAAuB,GAAGD,UAA3B,GAAyC,GADU,GAEnD,CAFJ;AAGA,UAAM0O,SAAS,GAAG,MAAMpR,kBAAkB,CAACkR,MAAD,CAA1C;AACA,UAAMG,IAAI,GAAG7R,OAAO,CAACyD,MAAR,CAAe,KAAKD,mBAApB,CAAb;AACA,UAAMsO,cAAc,GAAGrR,aAAa,CAACoR,IAAD,CAApC;AACAvN,IAAAA,OAAO,CAACC,GAAR;AACAD,IAAAA,OAAO,CAACC,GAAR,mCAAuC1C,SAAvC;AACAyC,IAAAA,OAAO,CAACC,GAAR,kCAAsCuN,cAAtC;AACAxN,IAAAA,OAAO,CAACC,GAAR,mBAA8B,KAAKzB,aAAnC;AACAwB,IAAAA,OAAO,CAACC,GAAR,mBAA8BqN,SAA9B,EAAyC,QAAzC;AACAtN,IAAAA,OAAO,CAACC,GAAR,sDAA+DoN,uBAA/D,EAAwF,GAAxF;AACArN,IAAAA,OAAO,CAACC,GAAR;AACD;;AAKiC,QAApBI,oBAAoB,GAAiB;AACjD,QAAI,CAAC,KAAKP,MAAL,CAAY2N,OAAjB,EAA0B;AACxB,aAAO,EAAP;AACD;;AACD,UAAMtP,OAAO,GAAG;AACd,oBAAc;AAACuP,QAAAA,WAAW,EAAE,KAAKvP,OAAL,CAAayB,KAAb,IAAsBzC;AAApC;AADA,KAAhB;AAGA,UAAMiD,cAAc,GAAG,MAAM,KAAKN,MAAL,CAAY2N,OAAZ,CAAoB,KAAKtP,OAAL,CAAaoB,QAAjC,EAA2CpB,OAA3C,CAA7B;AACA,SAAKwP,gBAAL,GAAwBjS,OAAO,CAACyD,MAAR,EAAxB;AACA,WAAO,EAAC,GAAGhB,OAAJ;AAAa,SAAGiC;AAAhB,KAAP;AACD;;AAKkC,QAArBgF,qBAAqB,GAAkB;AACnD,UAAMmI,IAAI,GAAG7R,OAAO,CAACyD,MAAR,CAAe,KAAKwO,gBAApB,CAAb;;AACA,QAAIJ,IAAI,CAAC,CAAD,CAAJ,GAAU1P,qBAAd,EAAqC;AACnC;AACD;;AACD,SAAK8P,gBAAL,GAAwBjS,OAAO,CAACyD,MAAR,EAAxB;AAEA,UAAMiB,cAAc,GAAG,MAAM,KAAKC,oBAAL,EAA7B;AACA,SAAKU,aAAL,CAAoB5C,OAApB,GAA8B,EAAC,GAAG,KAAK4C,aAAL,CAAoB5C,OAAxB;AAAiC,SAAGiC;AAApC,KAA9B;;AACA,QAAIA,cAAc,CAACM,OAAnB,EAA4B;AAC1B,WAAKK,aAAL,CAAoBR,WAApB,CAAgCI,KAAhC,GAAwC,EACtC,GAAG,KAAKI,aAAL,CAAoBR,WAApB,CAAgCI,KADG;AAEtCD,QAAAA,OAAO,EAAEN,cAAc,CAACM;AAFc,OAAxC;AAIAV,MAAAA,OAAO,CAACC,GAAR,CAAY,6CAAZ;AACD;AACF;;AAKOkF,EAAAA,8BAA8B,CAACyI,IAAD,EAAyB;AAC7D,UAAMC,mBAAmB,GAAG,CAA5B;;AAEA,QAAID,IAAI,CAACE,MAAL,KAAgBD,mBAApB,EAAyC;AACvC,WAAKlP,iBAAL,CAAuBE,uBAAvB,IAAkD,CAAlD;AACAmB,MAAAA,OAAO,CAACiF,IAAR,CAAa,yCAAb;AACD;;AAED,SAAKtG,iBAAL,CAAuBC,UAAvB,IAAqC,CAArC;AACD;;AAMO0E,EAAAA,kBAAkB,CAACjC,cAAD,EAAkC;AAAA;;AAC1D,WAAO,CAAC,MAAD,EAAS,MAAT,EAAiB0M,QAAjB,CAA0B1M,cAA1B,aAA0BA,cAA1B,gDAA0BA,cAAc,CAAEiE,OAA1C,0DAA0B,sBAAyBZ,IAAnD,CAAP;AACD;;AAvsC+B","sourcesContent":["import type {Tile3D, Tileset3DProps} from '@loaders.gl/tiles';\nimport type {BatchTableJson, B3DMContent} from '@loaders.gl/3d-tiles';\n\nimport type {\n AttributeStorageInfo,\n SceneLayer3D,\n BoundingVolumes,\n Node3DIndexDocument,\n NodeReference,\n MaxScreenThresholdSQ,\n NodeInPage,\n LodSelection,\n SharedResources,\n Attribute,\n ESRIField,\n Field,\n PopupInfo,\n FieldInfo\n} from '@loaders.gl/i3s';\nimport {load, encode} 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 from './helpers/geometry-converter';\nimport {\n createBoundingVolumes,\n convertCommonToI3SExtentCoordinate\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 {KTX2BasisUniversalTextureWriter} 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} from './types';\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 STRING_TYPE = 'string';\nconst SHORT_INT_TYPE = 'Int32';\nconst DOUBLE_TYPE = 'double';\nconst OBJECT_ID_TYPE = 'OBJECTID';\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 fileMap: {[key: string]: string};\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\n constructor() {\n this.nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);\n this.fileMap = {};\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 }\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 /** @deprecated */\n inputType?: string;\n }): Promise<any> {\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 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 const preloadOptions = await this._fetchPreloadOptions();\n const tilesetOptions: Tileset3DProps = {loadOptions: {basis: {format: 'rgba32'}}};\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 }\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 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.fileMap, isCreateSlpk);\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 extent = convertCommonToI3SExtentCoordinate(this.sourceTileset);\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 };\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 this.fileMap['nodes/1/3dNodeIndexDocument.json.gz'] = await writeFileForSlpk(\n childPath,\n JSON.stringify(child),\n '3dNodeIndexDocument.json'\n );\n } else {\n await 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 this.fileMap['3dSceneLayer.json.gz'] = await writeFileForSlpk(\n this.layers0Path,\n JSON.stringify(this.layers0),\n '3dSceneLayer.json'\n );\n } else {\n await writeFile(this.layers0Path, JSON.stringify(this.layers0));\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 this.fileMap[`nodes/${nodePath}/3dNodeIndexDocument.json.gz`] = await writeFileForSlpk(\n rootPath,\n JSON.stringify(root0),\n '3dNodeIndexDocument.json'\n );\n } else {\n await 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 // @ts-expect-error\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 * 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 for (const sourceTile of sourceTiles) {\n if (sourceTile.type === 'json') {\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 } else {\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 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 batchTable = sourceTile?.content?.batchTableJson;\n\n if (batchTable) {\n this._convertAttributeStorageInfo(sourceTile.content);\n }\n\n const resourcesData = await this._convertResources(sourceTile);\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 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._createNodeInNodePages(\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 attributesStorageInfo https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * from B3DM batch table\n * @param sourceTileContent - tile content of 3DTile\n * @return {void}\n */\n private _convertAttributeStorageInfo(sourceTileContent: B3DMContent): void {\n // In legacy b3dm files sometimes sourceTileContent is null.\n const batchTable = sourceTileContent && sourceTileContent.batchTableJson;\n if (batchTable && !this.layers0?.attributeStorageInfo?.length) {\n this._convertBatchTableInfoToNodeAttributes(batchTable);\n }\n }\n\n /**\n * Convert tile to one or more I3S nodes\n * @param sourceTile - source tile (3DTile)\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(sourceTile: TileHeader): Promise<I3SConvertedResources[] | null> {\n if (!this.isContentSupported(sourceTile)) {\n return null;\n }\n const resourcesData = await convertB3dmToI3sGeometry(\n sourceTile.content,\n Number(this.nodePages.nodesCounter),\n this.featuresHashArray,\n this.layers0?.attributeStorageInfo,\n this.options.draco,\n this.generateBoundingVolumes,\n this.geoidHeightModel!\n );\n return resourcesData;\n }\n\n /**\n * Create a new 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 _createNodeInNodePages(\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 const nodeId = this.nodePages.push(nodeInPage, parentId);\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 nodeInPage;\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: ArrayBuffer,\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (this.options.slpk) {\n const slpkGeometryPath = join(childPath, 'geometries');\n this.fileMap[`${slpkChildPath}/geometries/0.bin.gz`] = await writeFileForSlpk(\n slpkGeometryPath,\n geometryBuffer,\n '0.bin'\n );\n } else {\n const geometryPath = join(childPath, 'geometries/0/');\n await writeFile(geometryPath, geometryBuffer, 'index.bin');\n }\n\n if (this.options.draco) {\n if (this.options.slpk) {\n const slpkCompressedGeometryPath = join(childPath, 'geometries');\n this.fileMap[`${slpkChildPath}/geometries/1.bin.gz`] = await writeFileForSlpk(\n slpkCompressedGeometryPath,\n compressedGeometry,\n '1.bin'\n );\n } else {\n const compressedGeometryPath = join(childPath, 'geometries/1/');\n await writeFile(compressedGeometryPath, compressedGeometry, 'index.bin');\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: SharedResources,\n childPath: string,\n slpkChildPath: string,\n nodePath: string\n ): Promise<void> {\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 this.fileMap[`${slpkChildPath}/shared/sharedResource.json.gz`] = await writeFileForSlpk(\n slpkSharedPath,\n sharedDataStr,\n 'sharedResource.json'\n );\n } else {\n const sharedPath = join(childPath, 'shared/');\n await 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 const ktx2TextureData = new Uint8Array(\n await encode(texture.image, KTX2BasisUniversalTextureWriter)\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 = new Uint8Array(\n await encode(texture.image!.data[0], ImageWriter)\n );\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: 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 this.fileMap[`${slpkChildPath}/textures/${name}.${format}`] = await writeFileForSlpk(\n slpkTexturePath,\n textureData,\n `${name}.${format}`,\n compress\n );\n } else {\n const texturePath = join(childPath, `textures/${name}/`);\n await writeFile(texturePath, textureData, `index.${format}`);\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[],\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 this.fileMap[`${slpkChildPath}/attributes/${folderName}.bin.gz`] = await writeFileForSlpk(\n slpkAttributesPath,\n fileBuffer,\n '0.bin'\n );\n } else {\n const attributesPath = join(childPath, `attributes/${folderName}/0`);\n await writeFile(attributesPath, fileBuffer, 'index.bin');\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 * Generate storage attribute for map segmentation.\n * @param attributeIndex - order index of attribute (f_0, f_1 ...).\n * @param key - attribute key from batch table.\\\n * @param attributeType - attribute type.\n * @return Updated storageAttribute.\n */\n private _createdStorageAttribute(\n attributeIndex: number,\n key: string,\n attributeType: Attribute\n ): AttributeStorageInfo {\n const storageAttribute = {\n key: `f_${attributeIndex}`,\n name: key,\n ordering: ['attributeValues'],\n header: [{property: 'count', valueType: 'UInt32'}],\n attributeValues: {valueType: 'Int32', valuesPerElement: 1}\n };\n\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n this._setupIdAttribute(storageAttribute);\n break;\n case STRING_TYPE:\n this._setupStringAttribute(storageAttribute);\n break;\n case DOUBLE_TYPE:\n this._setupDoubleAttribute(storageAttribute);\n break;\n case SHORT_INT_TYPE:\n break;\n default:\n this._setupStringAttribute(storageAttribute);\n }\n\n return storageAttribute;\n }\n\n /**\n * Get the attribute type for attributeStorageInfo https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param key - attribute's key\n * @param attribute - attribute's type in batchTable\n */\n private getAttributeType(key: string, attribute: string): string {\n if (key === OBJECT_ID_TYPE) {\n return OBJECT_ID_TYPE;\n }\n if (typeof attribute === STRING_TYPE) {\n return STRING_TYPE;\n } else if (typeof attribute === 'number') {\n return Number.isInteger(attribute) ? SHORT_INT_TYPE : DOUBLE_TYPE;\n }\n return STRING_TYPE;\n }\n\n /**\n * Setup storage attribute as string.\n * @param storageAttribute - attribute for map segmentation.\n */\n private _setupStringAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.ordering!.unshift('attributeByteCounts');\n storageAttribute.header.push({property: 'attributeValuesByteCount', valueType: 'UInt32'});\n storageAttribute.attributeValues = {\n valueType: 'String',\n encoding: 'UTF-8',\n valuesPerElement: 1\n };\n storageAttribute.attributeByteCounts = {\n valueType: 'UInt32',\n valuesPerElement: 1\n };\n }\n\n /**\n * Setup Id attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\n private _setupIdAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Oid32',\n valuesPerElement: 1\n };\n }\n\n /**\n * Setup double attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\n private _setupDoubleAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Float64',\n valuesPerElement: 1\n };\n }\n\n /**\n * Setup field attribute for map segmentation.\n * @param key - attribute for map segmentation.\n * @param fieldAttributeType - esri attribute type ('esriFieldTypeString' or 'esriFieldTypeOID').\n */\n private _createFieldAttribute(key: string, fieldAttributeType: ESRIField): Field {\n return {\n name: key,\n type: fieldAttributeType,\n alias: key\n };\n }\n\n /**\n * Do conversion of 3DTiles batch table to I3s node attributes.\n * @param batchTable - Table with layer meta data.\n */\n private _convertBatchTableInfoToNodeAttributes(batchTable: BatchTableJson): void {\n let attributeIndex = 0;\n const batchTableWithObjectId = {\n OBJECTID: [0],\n ...batchTable\n };\n\n for (const key in batchTableWithObjectId) {\n const firstAttribute = batchTableWithObjectId[key][0];\n const attributeType = this.getAttributeType(key, firstAttribute);\n\n const storageAttribute = this._createdStorageAttribute(attributeIndex, key, attributeType);\n const fieldAttributeType = this._getFieldAttributeType(attributeType);\n const fieldAttribute = this._createFieldAttribute(key, fieldAttributeType);\n const popupInfo = this._createPopupInfo(batchTableWithObjectId);\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 * Find and return attribute type based on key form Batch table.\n * @param attributeType\n */\n private _getFieldAttributeType(attributeType: Attribute): ESRIField {\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n return 'esriFieldTypeOID';\n case STRING_TYPE:\n return 'esriFieldTypeString';\n case SHORT_INT_TYPE:\n return 'esriFieldTypeInteger';\n case DOUBLE_TYPE:\n return 'esriFieldTypeDouble';\n default:\n return 'esriFieldTypeString';\n }\n }\n\n /**\n * Generate popup info to show metadata on the map.\n * @param batchTable - Batch table data with OBJECTID.\n * @return data for correct rendering of popup.\n */\n private _createPopupInfo(batchTable: BatchTableJson): PopupInfo {\n const title = '{OBJECTID}';\n const mediaInfos = [];\n const fieldInfos: FieldInfo[] = [];\n const popupElements: {\n fieldInfos: FieldInfo[];\n type: string;\n }[] = [];\n const expressionInfos = [];\n\n for (const key in batchTable) {\n fieldInfos.push({\n fieldName: key,\n visible: true,\n isEditable: false,\n label: key\n });\n }\n popupElements.push({\n fieldInfos,\n type: 'fields'\n });\n\n return {\n title,\n mediaInfos,\n popupElements,\n fieldInfos,\n expressionInfos\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"],"file":"i3s-converter.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/i3s-converter/i3s-converter.ts"],"names":["load","encode","Tileset3D","CesiumIonLoader","Tiles3DLoader","join","v4","uuidv4","process","transform","md5","NodePages","writeFile","removeDir","writeFileForSlpk","compressWithChildProcess","calculateFilesSize","timeConverter","convertB3dmToI3sGeometry","createBoundingVolumes","convertCommonToI3SExtentCoordinate","createSceneServerPath","convertGeometricErrorToScreenThreshold","PGMLoader","LAYERS","layersTemplate","NODE","nodeTemplate","SHARED_RESOURCES","sharedResourcesTemplate","validateNodeBoundingVolumes","KTX2BasisUniversalTextureWriter","ImageWriter","ION_DEFAULT_TOKEN","env","IonToken","HARDCODED_NODES_PER_PAGE","_3D_TILES","_3D_OBJECT_LAYER_TYPE","STRING_TYPE","SHORT_INT_TYPE","DOUBLE_TYPE","OBJECT_ID_TYPE","REFRESH_TOKEN_TIMEOUT","CESIUM_DATASET_PREFIX","I3SConverter","constructor","nodePages","fileMap","options","layers0Path","materialMap","Map","materialDefinitions","vertexCounter","layers0","featuresHashArray","refinementCounter","tilesCount","tilesWithAddRefineCount","validate","generateTextures","generateBoundingVolumes","layersHasTexture","convert","conversionStartTime","hrtime","tilesetName","slpk","egmFilePath","inputUrl","outputPath","draco","sevenZipExe","maxDepth","token","Boolean","Loader","indexOf","console","log","geoidHeightModel","useWriteFunction","preloadOptions","_fetchPreloadOptions","tilesetOptions","loadOptions","basis","format","headers","fetch","Object","assign","sourceTilesetJson","sourceTileset","_createAndSaveTileset","_finishConversion","tilesetPath","e","_formLayers0","sourceRootTile","root","boundingVolumes","parentId","push","index","lodThreshold","obb","children","isCreateSlpk","root0","_formRootNodeIndexDocument","_convertNodesTree","store","defaultGeometrySchema","ordering","filter","attribute","_writeLayers0","_writeNodeIndexDocument","save","_createSlpk","extent","layers0data","version","toUpperCase","id","name","href","nodesPerPage","compressGeometry","root0data","level","lodSelection","metricType","maxError","_loadTile","isContentSupported","child","_createNode","childPath","path","JSON","stringify","_addChildrenWithNeighborsAndWriteFile","parentNode","sourceTiles","unloadContent","nodePath","rootPath","slpkTilesetPath","slpkFileName","data","childNodes","_addChildren","_addNeighborsAndWriteFile","sourceTile","type","mbs","node","Number","length","neighbor","neighbors","warn","parentTile","_checkAddRefinementTypeForTile","_updateTilesetOptions","batchTable","content","batchTableJson","_convertAttributeStorageInfo","resourcesData","_convertResources","nodes","nodesInPage","emptyResources","geometry","compressedGeometry","texture","sharedResources","meshMaterial","vertexCount","attributes","featureCount","resources","maxScreenThresholdSQ","find","val","nodeInPage","_createNodeInNodePages","_createNodeIndexDocument","mesh","_writeResources","boundingVolumeWarnings","sourceTileContent","attributeStorageInfo","_convertBatchTableInfoToNodeAttributes","nodesCounter","definition","resource","material","nodeId","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","ktx2TextureData","Uint8Array","decodedFromKTX2TextureData","textureSetDefinitions","slpkTexturePath","compress","texturePath","fileBuffer","slpkAttributesPath","attributesPath","hash","has","get","newMaterialId","set","_createdStorageAttribute","attributeIndex","attributeType","storageAttribute","header","property","valueType","attributeValues","valuesPerElement","_setupIdAttribute","_setupStringAttribute","_setupDoubleAttribute","getAttributeType","isInteger","unshift","encoding","attributeByteCounts","_createFieldAttribute","fieldAttributeType","alias","batchTableWithObjectId","OBJECTID","firstAttribute","_getFieldAttributeType","fieldAttribute","popupInfo","_createPopupInfo","fields","layerType","title","mediaInfos","fieldInfos","popupElements","expressionInfos","fieldName","visible","isEditable","label","params","addRefinementPercentage","filesSize","diff","conversionTime","preload","accessToken","refreshTokenTime","tile","ADD_TILE_REFINEMENT","refine","includes"],"mappings":"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","sourcesContent":["import type {Tile3D, Tileset3DProps} from '@loaders.gl/tiles';\nimport type {BatchTableJson, B3DMContent} from '@loaders.gl/3d-tiles';\n\nimport type {\n AttributeStorageInfo,\n SceneLayer3D,\n BoundingVolumes,\n Node3DIndexDocument,\n NodeReference,\n MaxScreenThresholdSQ,\n NodeInPage,\n LodSelection,\n SharedResources,\n Attribute,\n ESRIField,\n Field,\n PopupInfo,\n FieldInfo\n} from '@loaders.gl/i3s';\nimport {load, encode} 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 from './helpers/geometry-converter';\nimport {\n createBoundingVolumes,\n convertCommonToI3SExtentCoordinate\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 {KTX2BasisUniversalTextureWriter} 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} from './types';\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 STRING_TYPE = 'string';\nconst SHORT_INT_TYPE = 'Int32';\nconst DOUBLE_TYPE = 'double';\nconst OBJECT_ID_TYPE = 'OBJECTID';\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 fileMap: {[key: string]: string};\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\n constructor() {\n this.nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);\n this.fileMap = {};\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 /** @deprecated */\n inputType?: string;\n }): Promise<any> {\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 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 const preloadOptions = await this._fetchPreloadOptions();\n const tilesetOptions: Tileset3DProps = {loadOptions: {basis: {format: 'rgba32'}}};\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 }\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.fileMap, isCreateSlpk);\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 extent = convertCommonToI3SExtentCoordinate(this.sourceTileset);\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 };\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 this.fileMap['nodes/1/3dNodeIndexDocument.json.gz'] = await writeFileForSlpk(\n childPath,\n JSON.stringify(child),\n '3dNodeIndexDocument.json'\n );\n } else {\n await 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 this.fileMap['3dSceneLayer.json.gz'] = await writeFileForSlpk(\n this.layers0Path,\n JSON.stringify(this.layers0),\n '3dSceneLayer.json'\n );\n } else {\n await writeFile(this.layers0Path, JSON.stringify(this.layers0));\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 this.fileMap[`nodes/${nodePath}/3dNodeIndexDocument.json.gz`] = await writeFileForSlpk(\n rootPath,\n JSON.stringify(root0),\n '3dNodeIndexDocument.json'\n );\n } else {\n await 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 // @ts-expect-error\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 * 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 for (const sourceTile of sourceTiles) {\n if (sourceTile.type === 'json') {\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 } else {\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 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 batchTable = sourceTile?.content?.batchTableJson;\n\n if (batchTable) {\n this._convertAttributeStorageInfo(sourceTile.content);\n }\n\n const resourcesData = await this._convertResources(sourceTile);\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._createNodeInNodePages(\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 attributesStorageInfo https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * from B3DM batch table\n * @param sourceTileContent - tile content of 3DTile\n * @return {void}\n */\n private _convertAttributeStorageInfo(sourceTileContent: B3DMContent): void {\n // In legacy b3dm files sometimes sourceTileContent is null.\n const batchTable = sourceTileContent && sourceTileContent.batchTableJson;\n if (batchTable && !this.layers0?.attributeStorageInfo?.length) {\n this._convertBatchTableInfoToNodeAttributes(batchTable);\n }\n }\n\n /**\n * Convert tile to one or more I3S nodes\n * @param sourceTile - source tile (3DTile)\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(sourceTile: TileHeader): Promise<I3SConvertedResources[] | null> {\n if (!this.isContentSupported(sourceTile)) {\n return null;\n }\n const resourcesData = await convertB3dmToI3sGeometry(\n sourceTile.content,\n Number(this.nodePages.nodesCounter),\n this.featuresHashArray,\n this.layers0?.attributeStorageInfo,\n this.options.draco,\n this.generateBoundingVolumes,\n this.geoidHeightModel!\n );\n return resourcesData;\n }\n\n /**\n * Create a new 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 _createNodeInNodePages(\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 const nodeId = this.nodePages.push(nodeInPage, parentId);\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 nodeInPage;\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: ArrayBuffer,\n childPath: string,\n slpkChildPath: string\n ): Promise<void> {\n if (this.options.slpk) {\n const slpkGeometryPath = join(childPath, 'geometries');\n this.fileMap[`${slpkChildPath}/geometries/0.bin.gz`] = await writeFileForSlpk(\n slpkGeometryPath,\n geometryBuffer,\n '0.bin'\n );\n } else {\n const geometryPath = join(childPath, 'geometries/0/');\n await writeFile(geometryPath, geometryBuffer, 'index.bin');\n }\n\n if (this.options.draco) {\n if (this.options.slpk) {\n const slpkCompressedGeometryPath = join(childPath, 'geometries');\n this.fileMap[`${slpkChildPath}/geometries/1.bin.gz`] = await writeFileForSlpk(\n slpkCompressedGeometryPath,\n compressedGeometry,\n '1.bin'\n );\n } else {\n const compressedGeometryPath = join(childPath, 'geometries/1/');\n await writeFile(compressedGeometryPath, compressedGeometry, 'index.bin');\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: SharedResources,\n childPath: string,\n slpkChildPath: string,\n nodePath: string\n ): Promise<void> {\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 this.fileMap[`${slpkChildPath}/shared/sharedResource.json.gz`] = await writeFileForSlpk(\n slpkSharedPath,\n sharedDataStr,\n 'sharedResource.json'\n );\n } else {\n const sharedPath = join(childPath, 'shared/');\n await 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 const ktx2TextureData = new Uint8Array(\n await encode(texture.image, KTX2BasisUniversalTextureWriter)\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 = new Uint8Array(\n await encode(texture.image!.data[0], ImageWriter)\n );\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: 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 this.fileMap[`${slpkChildPath}/textures/${name}.${format}`] = await writeFileForSlpk(\n slpkTexturePath,\n textureData,\n `${name}.${format}`,\n compress\n );\n } else {\n const texturePath = join(childPath, `textures/${name}/`);\n await writeFile(texturePath, textureData, `index.${format}`);\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[],\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 this.fileMap[`${slpkChildPath}/attributes/${folderName}.bin.gz`] = await writeFileForSlpk(\n slpkAttributesPath,\n fileBuffer,\n '0.bin'\n );\n } else {\n const attributesPath = join(childPath, `attributes/${folderName}/0`);\n await writeFile(attributesPath, fileBuffer, 'index.bin');\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 * Generate storage attribute for map segmentation.\n * @param attributeIndex - order index of attribute (f_0, f_1 ...).\n * @param key - attribute key from batch table.\\\n * @param attributeType - attribute type.\n * @return Updated storageAttribute.\n */\n private _createdStorageAttribute(\n attributeIndex: number,\n key: string,\n attributeType: Attribute\n ): AttributeStorageInfo {\n const storageAttribute = {\n key: `f_${attributeIndex}`,\n name: key,\n ordering: ['attributeValues'],\n header: [{property: 'count', valueType: 'UInt32'}],\n attributeValues: {valueType: 'Int32', valuesPerElement: 1}\n };\n\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n this._setupIdAttribute(storageAttribute);\n break;\n case STRING_TYPE:\n this._setupStringAttribute(storageAttribute);\n break;\n case DOUBLE_TYPE:\n this._setupDoubleAttribute(storageAttribute);\n break;\n case SHORT_INT_TYPE:\n break;\n default:\n this._setupStringAttribute(storageAttribute);\n }\n\n return storageAttribute;\n }\n\n /**\n * Get the attribute type for attributeStorageInfo https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param key - attribute's key\n * @param attribute - attribute's type in batchTable\n */\n private getAttributeType(key: string, attribute: string): string {\n if (key === OBJECT_ID_TYPE) {\n return OBJECT_ID_TYPE;\n }\n if (typeof attribute === STRING_TYPE) {\n return STRING_TYPE;\n } else if (typeof attribute === 'number') {\n return Number.isInteger(attribute) ? SHORT_INT_TYPE : DOUBLE_TYPE;\n }\n return STRING_TYPE;\n }\n\n /**\n * Setup storage attribute as string.\n * @param storageAttribute - attribute for map segmentation.\n */\n private _setupStringAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.ordering!.unshift('attributeByteCounts');\n storageAttribute.header.push({property: 'attributeValuesByteCount', valueType: 'UInt32'});\n storageAttribute.attributeValues = {\n valueType: 'String',\n encoding: 'UTF-8',\n valuesPerElement: 1\n };\n storageAttribute.attributeByteCounts = {\n valueType: 'UInt32',\n valuesPerElement: 1\n };\n }\n\n /**\n * Setup Id attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\n private _setupIdAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Oid32',\n valuesPerElement: 1\n };\n }\n\n /**\n * Setup double attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\n private _setupDoubleAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Float64',\n valuesPerElement: 1\n };\n }\n\n /**\n * Setup field attribute for map segmentation.\n * @param key - attribute for map segmentation.\n * @param fieldAttributeType - esri attribute type ('esriFieldTypeString' or 'esriFieldTypeOID').\n */\n private _createFieldAttribute(key: string, fieldAttributeType: ESRIField): Field {\n return {\n name: key,\n type: fieldAttributeType,\n alias: key\n };\n }\n\n /**\n * Do conversion of 3DTiles batch table to I3s node attributes.\n * @param batchTable - Table with layer meta data.\n */\n private _convertBatchTableInfoToNodeAttributes(batchTable: BatchTableJson): void {\n let attributeIndex = 0;\n const batchTableWithObjectId = {\n OBJECTID: [0],\n ...batchTable\n };\n\n for (const key in batchTableWithObjectId) {\n const firstAttribute = batchTableWithObjectId[key][0];\n const attributeType = this.getAttributeType(key, firstAttribute);\n\n const storageAttribute = this._createdStorageAttribute(attributeIndex, key, attributeType);\n const fieldAttributeType = this._getFieldAttributeType(attributeType);\n const fieldAttribute = this._createFieldAttribute(key, fieldAttributeType);\n const popupInfo = this._createPopupInfo(batchTableWithObjectId);\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 * Find and return attribute type based on key form Batch table.\n * @param attributeType\n */\n private _getFieldAttributeType(attributeType: Attribute): ESRIField {\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n return 'esriFieldTypeOID';\n case STRING_TYPE:\n return 'esriFieldTypeString';\n case SHORT_INT_TYPE:\n return 'esriFieldTypeInteger';\n case DOUBLE_TYPE:\n return 'esriFieldTypeDouble';\n default:\n return 'esriFieldTypeString';\n }\n }\n\n /**\n * Generate popup info to show metadata on the map.\n * @param batchTable - Batch table data with OBJECTID.\n * @return data for correct rendering of popup.\n */\n private _createPopupInfo(batchTable: BatchTableJson): PopupInfo {\n const title = '{OBJECTID}';\n const mediaInfos = [];\n const fieldInfos: FieldInfo[] = [];\n const popupElements: {\n fieldInfos: FieldInfo[];\n type: string;\n }[] = [];\n const expressionInfos = [];\n\n for (const key in batchTable) {\n fieldInfos.push({\n fieldName: key,\n visible: true,\n isEditable: false,\n label: key\n });\n }\n popupElements.push({\n fieldInfos,\n type: 'fields'\n });\n\n return {\n title,\n mediaInfos,\n popupElements,\n fieldInfos,\n expressionInfos\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"],"file":"i3s-converter.js"}
|
package/dist/esm/pgm-loader.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const VERSION = typeof "3.1
|
|
1
|
+
const VERSION = typeof "3.2.0-alpha.1" !== 'undefined' ? "3.2.0-alpha.1" : 'latest';
|
|
2
2
|
import { parsePGM } from '@math.gl/geoid';
|
|
3
3
|
export const PGMLoader = {
|
|
4
4
|
name: 'PGM - Netpbm grayscale image format',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pgm-loader.ts"],"names":["VERSION","parsePGM","PGMLoader","name","id","module","version","mimeTypes","parse","arrayBuffer","options","Uint8Array","extensions","cubic"],"mappings":"AAIA,MAAMA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"sources":["../../src/pgm-loader.ts"],"names":["VERSION","parsePGM","PGMLoader","name","id","module","version","mimeTypes","parse","arrayBuffer","options","Uint8Array","extensions","cubic"],"mappings":"AAIA,MAAMA,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,QAAnE;AAEA,SAAQC,QAAR,QAAuB,gBAAvB;AAKA,OAAO,MAAMC,SAA2B,GAAG;AACzCC,EAAAA,IAAI,EAAE,qCADmC;AAEzCC,EAAAA,EAAE,EAAE,KAFqC;AAGzCC,EAAAA,MAAM,EAAE,gBAHiC;AAIzCC,EAAAA,OAAO,EAAEN,OAJgC;AAKzCO,EAAAA,SAAS,EAAE,CAAC,0BAAD,CAL8B;AAMzCC,EAAAA,KAAK,EAAE,OAAOC,WAAP,EAAoBC,OAApB,KAAgCT,QAAQ,CAAC,IAAIU,UAAJ,CAAeF,WAAf,CAAD,EAA8BC,OAA9B,CANN;AAOzCE,EAAAA,UAAU,EAAE,CAAC,KAAD,CAP6B;AAQzCF,EAAAA,OAAO,EAAE;AAEPG,IAAAA,KAAK,EAAE;AAFA;AARgC,CAApC","sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nimport {parsePGM} from '@math.gl/geoid';\n\n/**\n * Loader for PGM - Netpbm grayscale image format\n */\nexport const PGMLoader: LoaderWithParser = {\n name: 'PGM - Netpbm grayscale image format',\n id: 'pgm',\n module: 'tile-converter',\n version: VERSION,\n mimeTypes: ['image/x-portable-graymap'],\n parse: async (arrayBuffer, options) => parsePGM(new Uint8Array(arrayBuffer), options),\n extensions: ['pgm'],\n options: {\n // TODO - use pgm namespace\n cubic: false\n }\n};\n"],"file":"pgm-loader.js"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { BoundingVolumes, Extent, Mbs, Obb } from '@loaders.gl/i3s';
|
|
2
|
+
import { Vector3 } from '@math.gl/core';
|
|
3
|
+
import TileHeader from '@loaders.gl/tiles/src/tileset/tile-3d';
|
|
4
|
+
import { Geoid } from '@math.gl/geoid';
|
|
5
|
+
import { Tileset3D } from '@loaders.gl/tiles';
|
|
6
|
+
/**
|
|
7
|
+
* Create bounding volumes object from tile and geoid height model.
|
|
8
|
+
* @param tile
|
|
9
|
+
* @param geoidHeightModel
|
|
10
|
+
* @returns - Bounding volumes object
|
|
11
|
+
*/
|
|
12
|
+
export declare function createBoundingVolumes(tile: TileHeader, geoidHeightModel: Geoid): BoundingVolumes;
|
|
13
|
+
/**
|
|
14
|
+
* Generates bounding volumes from geometry positions
|
|
15
|
+
* @param cartesianPositions
|
|
16
|
+
* @param geoidHeightModel
|
|
17
|
+
*/
|
|
18
|
+
export declare function createBoundingVolumesFromGeometry(cartesianPositions: Float32Array, geoidHeightModel: Geoid): {
|
|
19
|
+
mbs: Mbs;
|
|
20
|
+
obb: Obb;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Create array of posisitons where each vertex is vector
|
|
24
|
+
* @param {array} positions
|
|
25
|
+
* @returns {Vector3[]}
|
|
26
|
+
*/
|
|
27
|
+
export declare function convertPositionsToVectors(positions: Float32Array): Vector3[];
|
|
28
|
+
/**
|
|
29
|
+
* Convert common coordinate to extent coordinate
|
|
30
|
+
* @param tileset
|
|
31
|
+
* @returns - Extent
|
|
32
|
+
* @todo why lodMetricValue is radius? need to check this function
|
|
33
|
+
*/
|
|
34
|
+
export declare function convertCommonToI3SExtentCoordinate(tileset: Tileset3D | null): Extent | null;
|
|
35
|
+
/**
|
|
36
|
+
* Creates oriented boundinb box from mbs.
|
|
37
|
+
* @param mbs - Minimum Bounding Sphere
|
|
38
|
+
* @returns - Oriented BOunding Box
|
|
39
|
+
*/
|
|
40
|
+
export declare function createObbFromMbs(mbs: Mbs): Obb;
|
|
41
|
+
//# sourceMappingURL=coordinate-converter.d.ts.map
|
|
@@ -0,0 +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,MAAM,EAAE,GAAG,EAAE,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAsB,OAAO,EAAC,MAAM,eAAe,CAAC;AAO3D,OAAO,UAAU,MAAM,uCAAuC,CAAC;AAC/D,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,GAAG,eAAe,CAiChG;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,kCAAkC,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAuB3F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAK9C"}
|