@loaders.gl/tile-converter 4.2.0-alpha.3 → 4.2.0-alpha.5

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.
Files changed (144) hide show
  1. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +3 -3
  2. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
  3. package/dist/3d-tiles-converter/3d-tiles-converter.js +329 -293
  4. package/dist/3d-tiles-converter/helpers/b3dm-converter.js +257 -200
  5. package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +14 -5
  6. package/dist/3d-tiles-converter/helpers/load-i3s.js +106 -75
  7. package/dist/3d-tiles-converter/helpers/texture-atlas.js +44 -21
  8. package/dist/3d-tiles-converter/json-templates/tileset.js +32 -33
  9. package/dist/constants.js +0 -1
  10. package/dist/converter-cli.js +255 -234
  11. package/dist/converter.min.cjs +80 -90
  12. package/dist/deps-installer/deps-installer.js +73 -59
  13. package/dist/i3s-converter/helpers/attribute-metadata-info.js +207 -153
  14. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +1 -1
  15. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
  16. package/dist/i3s-converter/helpers/batch-ids-extensions.js +145 -103
  17. package/dist/i3s-converter/helpers/coordinate-converter.js +100 -65
  18. package/dist/i3s-converter/helpers/create-scene-server-path.js +14 -9
  19. package/dist/i3s-converter/helpers/feature-attributes.js +168 -105
  20. package/dist/i3s-converter/helpers/geometry-attributes.d.ts +1 -1
  21. package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
  22. package/dist/i3s-converter/helpers/geometry-attributes.js +204 -212
  23. package/dist/i3s-converter/helpers/geometry-converter.d.ts +2 -2
  24. package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
  25. package/dist/i3s-converter/helpers/geometry-converter.js +1148 -829
  26. package/dist/i3s-converter/helpers/gltf-attributes.d.ts +1 -1
  27. package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
  28. package/dist/i3s-converter/helpers/gltf-attributes.js +111 -97
  29. package/dist/i3s-converter/helpers/load-3d-tiles.js +103 -66
  30. package/dist/i3s-converter/helpers/node-debug.js +98 -54
  31. package/dist/i3s-converter/helpers/node-index-document.d.ts +3 -3
  32. package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -1
  33. package/dist/i3s-converter/helpers/node-index-document.js +248 -177
  34. package/dist/i3s-converter/helpers/node-pages.d.ts +1 -1
  35. package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
  36. package/dist/i3s-converter/helpers/node-pages.js +299 -194
  37. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts +1 -1
  38. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -1
  39. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +92 -60
  40. package/dist/i3s-converter/helpers/progress.js +134 -83
  41. package/dist/i3s-converter/helpers/tileset-traversal.d.ts +1 -1
  42. package/dist/i3s-converter/helpers/tileset-traversal.d.ts.map +1 -1
  43. package/dist/i3s-converter/helpers/tileset-traversal.js +24 -13
  44. package/dist/i3s-converter/i3s-converter.d.ts +7 -7
  45. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  46. package/dist/i3s-converter/i3s-converter.js +1044 -898
  47. package/dist/i3s-converter/json-templates/geometry-definitions.js +70 -79
  48. package/dist/i3s-converter/json-templates/layers.js +120 -121
  49. package/dist/i3s-converter/json-templates/metadata.js +19 -20
  50. package/dist/i3s-converter/json-templates/node.js +73 -71
  51. package/dist/i3s-converter/json-templates/scene-server.js +25 -26
  52. package/dist/i3s-converter/json-templates/shared-resources.js +107 -108
  53. package/dist/i3s-converter/json-templates/store.js +96 -94
  54. package/dist/i3s-converter/types.js +35 -23
  55. package/dist/i3s-server/app.js +15 -12
  56. package/dist/i3s-server/bin/www.js +14 -7
  57. package/dist/i3s-server/controllers/index-controller.js +18 -15
  58. package/dist/i3s-server/controllers/slpk-controller.js +22 -11
  59. package/dist/i3s-server/routes/index.js +9 -8
  60. package/dist/i3s-server/routes/slpk-router.js +18 -17
  61. package/dist/i3s-server/utils/create-scene-server.js +15 -10
  62. package/dist/i3s-server/utils/server-utils.js +49 -32
  63. package/dist/index.cjs +292 -851
  64. package/dist/index.cjs.map +7 -0
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +0 -1
  68. package/dist/lib/json-schemas/conversion-dump-json-schema.js +243 -421
  69. package/dist/lib/utils/cli-utils.js +63 -36
  70. package/dist/lib/utils/compress-util.js +20 -15
  71. package/dist/lib/utils/conversion-dump.d.ts +1 -1
  72. package/dist/lib/utils/conversion-dump.d.ts.map +1 -1
  73. package/dist/lib/utils/conversion-dump.js +209 -187
  74. package/dist/lib/utils/file-utils.js +122 -74
  75. package/dist/lib/utils/geometry-utils.js +13 -7
  76. package/dist/lib/utils/lod-conversion-utils.js +65 -33
  77. package/dist/lib/utils/queue.js +12 -13
  78. package/dist/lib/utils/statistic-utills.d.ts +6 -23
  79. package/dist/lib/utils/statistic-utills.js +64 -59
  80. package/dist/lib/utils/write-queue.d.ts +2 -2
  81. package/dist/lib/utils/write-queue.d.ts.map +1 -1
  82. package/dist/lib/utils/write-queue.js +68 -86
  83. package/dist/pgm-loader.js +17 -13
  84. package/dist/slpk-extractor/slpk-extractor.js +59 -50
  85. package/dist/slpk-extractor-cli.js +82 -59
  86. package/package.json +18 -18
  87. package/dist/3d-tiles-converter/3d-tiles-converter.js.map +0 -1
  88. package/dist/3d-tiles-converter/helpers/b3dm-converter.js.map +0 -1
  89. package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +0 -1
  90. package/dist/3d-tiles-converter/helpers/load-i3s.js.map +0 -1
  91. package/dist/3d-tiles-converter/helpers/texture-atlas.js.map +0 -1
  92. package/dist/3d-tiles-converter/json-templates/tileset.js.map +0 -1
  93. package/dist/constants.js.map +0 -1
  94. package/dist/converter-cli.js.map +0 -1
  95. package/dist/deps-installer/deps-installer.js.map +0 -1
  96. package/dist/i3s-converter/helpers/attribute-metadata-info.js.map +0 -1
  97. package/dist/i3s-converter/helpers/batch-ids-extensions.js.map +0 -1
  98. package/dist/i3s-converter/helpers/coordinate-converter.js.map +0 -1
  99. package/dist/i3s-converter/helpers/create-scene-server-path.js.map +0 -1
  100. package/dist/i3s-converter/helpers/feature-attributes.js.map +0 -1
  101. package/dist/i3s-converter/helpers/geometry-attributes.js.map +0 -1
  102. package/dist/i3s-converter/helpers/geometry-converter.js.map +0 -1
  103. package/dist/i3s-converter/helpers/gltf-attributes.js.map +0 -1
  104. package/dist/i3s-converter/helpers/load-3d-tiles.js.map +0 -1
  105. package/dist/i3s-converter/helpers/node-debug.js.map +0 -1
  106. package/dist/i3s-converter/helpers/node-index-document.js.map +0 -1
  107. package/dist/i3s-converter/helpers/node-pages.js.map +0 -1
  108. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js.map +0 -1
  109. package/dist/i3s-converter/helpers/progress.js.map +0 -1
  110. package/dist/i3s-converter/helpers/tileset-traversal.js.map +0 -1
  111. package/dist/i3s-converter/i3s-converter.js.map +0 -1
  112. package/dist/i3s-converter/json-templates/geometry-definitions.js.map +0 -1
  113. package/dist/i3s-converter/json-templates/layers.js.map +0 -1
  114. package/dist/i3s-converter/json-templates/metadata.js.map +0 -1
  115. package/dist/i3s-converter/json-templates/node.js.map +0 -1
  116. package/dist/i3s-converter/json-templates/scene-server.js.map +0 -1
  117. package/dist/i3s-converter/json-templates/shared-resources.js.map +0 -1
  118. package/dist/i3s-converter/json-templates/store.js.map +0 -1
  119. package/dist/i3s-converter/types.js.map +0 -1
  120. package/dist/i3s-server/README.md +0 -63
  121. package/dist/i3s-server/app.js.map +0 -1
  122. package/dist/i3s-server/bin/www.js.map +0 -1
  123. package/dist/i3s-server/certs/cert.pem +0 -19
  124. package/dist/i3s-server/certs/key.pem +0 -27
  125. package/dist/i3s-server/controllers/index-controller.js.map +0 -1
  126. package/dist/i3s-server/controllers/slpk-controller.js.map +0 -1
  127. package/dist/i3s-server/routes/index.js.map +0 -1
  128. package/dist/i3s-server/routes/slpk-router.js.map +0 -1
  129. package/dist/i3s-server/utils/create-scene-server.js.map +0 -1
  130. package/dist/i3s-server/utils/server-utils.js.map +0 -1
  131. package/dist/index.js.map +0 -1
  132. package/dist/lib/json-schemas/conversion-dump-json-schema.js.map +0 -1
  133. package/dist/lib/utils/cli-utils.js.map +0 -1
  134. package/dist/lib/utils/compress-util.js.map +0 -1
  135. package/dist/lib/utils/conversion-dump.js.map +0 -1
  136. package/dist/lib/utils/file-utils.js.map +0 -1
  137. package/dist/lib/utils/geometry-utils.js.map +0 -1
  138. package/dist/lib/utils/lod-conversion-utils.js.map +0 -1
  139. package/dist/lib/utils/queue.js.map +0 -1
  140. package/dist/lib/utils/statistic-utills.js.map +0 -1
  141. package/dist/lib/utils/write-queue.js.map +0 -1
  142. package/dist/pgm-loader.js.map +0 -1
  143. package/dist/slpk-extractor/slpk-extractor.js.map +0 -1
  144. package/dist/slpk-extractor-cli.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"b3dm-converter.js","names":["encodeSync","GLTFScenegraph","GLTFWriter","Tile3DWriter","Matrix4","Vector3","Ellipsoid","convertTextureAtlas","generateSyntheticIndices","Z_UP_TO_Y_UP_MATRIX","scratchVector","KHR_MATERIALS_UNLIT","METALLIC_FACTOR_DEFAULT","ROUGHNESS_FACTOR_DEFAULT","B3dmConverter","constructor","rtcCenter","i3sTile","convert","i3sAttributesData","featureAttributes","arguments","length","undefined","gltf","buildGLTF","b3dm","gltfEncoded","Uint8Array","type","featuresLength","_getFeaturesLength","batchTable","tileContent","textureFormat","box","material","attributes","indices","originalIndices","modelMatrix","gltfBuilder","textureIndex","_addI3sTextureToGLTF","pbrMetallicRoughness","metallicFactor","roughnessFactor","addObjectExtension","addExtension","pbrMaterialInfo","_convertI3sMaterialToGLTFMaterial","materialIndex","addMaterial","positions","positionsValue","value","uvRegions","texCoords","cartesianOrigin","cartographicOrigin","WGS84","cartesianToCartographic","_normalizePositions","_createBatchIds","normals","_checkNormals","size","meshIndex","addMesh","mode","transformMatrix","_generateTransformMatrix","nodeIndex","addNode","matrix","sceneIndex","addScene","nodeIndices","setDefaultScene","createBinaryChunk","gltfBuffer","texture","selectedTexture","baseColorTexture","source","image","mimeType","_deduceMimeTypeFromFormat","imageIndex","addImage","addTexture","colors","newPositionsValue","Float32Array","index","vertex","subarray","cartesianOriginVector","vertexVector","Array","from","transform","add","cartographicToCartesian","subtract","set","translateOriginMatrix","translate","result","multiplyLeft","i3sContent","featureIds","OBJECTID","objectIds","i","featureId","batchId","indexOf","_BATCHID","byteOffset","format","console","warn","isTextureIndexExists","alphaMode","doubleSided","texCoord","baseColorFactor","_setGLTFTexture","materialDefinition","emissiveTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","firstKey","Object","keys","find"],"sources":["../../../src/3d-tiles-converter/helpers/b3dm-converter.ts"],"sourcesContent":["import type {I3STileContent} from '@loaders.gl/i3s';\nimport {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';\nimport {generateSyntheticIndices} from '../../lib/utils/geometry-utils';\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();\nconst KHR_MATERIALS_UNLIT = 'KHR_materials_unlit';\nconst METALLIC_FACTOR_DEFAULT = 1.0;\nconst ROUGHNESS_FACTOR_DEFAULT = 1.0;\n\nexport type I3SAttributesData = {\n tileContent: I3STileContent;\n box: number[];\n textureFormat: string;\n};\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(\n i3sAttributesData: I3SAttributesData,\n featureAttributes: any = null\n ): Promise<ArrayBuffer> {\n const gltf = await this.buildGLTF(i3sAttributesData, featureAttributes);\n const b3dm = encodeSync(\n {\n gltfEncoded: new Uint8Array(gltf),\n type: 'b3dm',\n featuresLength: this._getFeaturesLength(featureAttributes),\n batchTable: featureAttributes\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(\n i3sAttributesData: I3SAttributesData,\n featureAttributes: any\n ): Promise<ArrayBuffer> {\n const {tileContent, textureFormat, box} = i3sAttributesData;\n const {material, attributes, indices: originalIndices, modelMatrix} = tileContent;\n const gltfBuilder = new GLTFScenegraph();\n\n const textureIndex = await this._addI3sTextureToGLTF(tileContent, textureFormat, gltfBuilder);\n\n // Add KHR_MATERIALS_UNLIT extension in the following cases:\n // - metallicFactor or roughnessFactor are set to default values\n // - metallicFactor or roughnessFactor are not set\n const pbrMetallicRoughness = material?.pbrMetallicRoughness;\n if (\n pbrMetallicRoughness &&\n (pbrMetallicRoughness.metallicFactor === undefined ||\n pbrMetallicRoughness.metallicFactor === METALLIC_FACTOR_DEFAULT) &&\n (pbrMetallicRoughness.roughnessFactor === undefined ||\n pbrMetallicRoughness.roughnessFactor === ROUGHNESS_FACTOR_DEFAULT)\n ) {\n gltfBuilder.addObjectExtension(material, KHR_MATERIALS_UNLIT, {});\n gltfBuilder.addExtension(KHR_MATERIALS_UNLIT);\n }\n\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 const cartesianOrigin = new Vector3(box);\n const cartographicOrigin = Ellipsoid.WGS84.cartesianToCartographic(\n cartesianOrigin,\n new Vector3()\n );\n\n attributes.positions.value = this._normalizePositions(\n positionsValue,\n cartesianOrigin,\n cartographicOrigin,\n modelMatrix\n );\n this._createBatchIds(tileContent, featureAttributes);\n if (attributes.normals && !this._checkNormals(attributes.normals.value)) {\n delete attributes.normals;\n }\n const indices =\n originalIndices || generateSyntheticIndices(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(tileContent, textureFormat, gltfBuilder) {\n const {texture, material, attributes} = tileContent;\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 * Create _BATCHID attribute\n * @param {Object} i3sContent - the source object\n * @returns {void}\n */\n _createBatchIds(i3sContent, featureAttributes) {\n const {featureIds} = i3sContent;\n const {OBJECTID: objectIds} = featureAttributes || {};\n if (!featureIds || !objectIds) {\n return;\n }\n\n for (let i = 0; i < featureIds.length; i++) {\n const featureId = featureIds[i];\n const batchId = objectIds.indexOf(featureId);\n featureIds[i] = batchId;\n }\n\n i3sContent.attributes._BATCHID = {\n size: 1,\n byteOffset: 0,\n value: featureIds\n };\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"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"i3s-obb-to-3d-tiles-obb.js","names":["Vector3","Ellipsoid","OrientedBoundingBox","i3sObbTo3dTilesObb","i3SObb","geoidHeightModel","tiles3DCenter","center","getHeight","cartesianCenter","WGS84","cartographicToCartesian","tiles3DObb","fromCenterHalfSizeQuaternion","halfSize","quaternion","halfAxes","toArray"],"sources":["../../../src/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.ts"],"sourcesContent":["import {Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {OrientedBoundingBox} from '@math.gl/culling';\n// @ts-expect-error\nimport {GeoidHeightModel} from '@loaders.gl/tile-converter/lib/geoid-height-model';\n\n/**\n * Convert quaternion-based OBB to half-axes-based OBB\n * @param i3SObb quaternion based OBB\n * @param geoidHeightModel the Earth Gravity Model instance\n * @returns number[12] 3DTiles OBB https://github.com/CesiumGS/3d-tiles/tree/master/specification#box\n */\nexport function i3sObbTo3dTilesObb(\n i3SObb: {\n center: number[];\n halfSize: number[];\n quaternion: number[];\n },\n geoidHeightModel: GeoidHeightModel\n): number[] {\n const tiles3DCenter = [\n i3SObb.center[0],\n i3SObb.center[1],\n i3SObb.center[2] + geoidHeightModel.getHeight(i3SObb.center[1], i3SObb.center[0])\n ];\n const cartesianCenter = Ellipsoid.WGS84.cartographicToCartesian(tiles3DCenter, new Vector3());\n const tiles3DObb = new OrientedBoundingBox().fromCenterHalfSizeQuaternion(\n cartesianCenter,\n i3SObb.halfSize,\n i3SObb.quaternion\n );\n return [...tiles3DObb.center, ...tiles3DObb.halfAxes.toArray()];\n}\n"],"mappings":"AAAA,SAAQA,OAAO,QAAO,eAAe;AACrC,SAAQC,SAAS,QAAO,qBAAqB;AAC7C,SAAQC,mBAAmB,QAAO,kBAAkB;AAUpD,OAAO,SAASC,kBAAkBA,CAChCC,MAIC,EACDC,gBAAkC,EACxB;EACV,MAAMC,aAAa,GAAG,CACpBF,MAAM,CAACG,MAAM,CAAC,CAAC,CAAC,EAChBH,MAAM,CAACG,MAAM,CAAC,CAAC,CAAC,EAChBH,MAAM,CAACG,MAAM,CAAC,CAAC,CAAC,GAAGF,gBAAgB,CAACG,SAAS,CAACJ,MAAM,CAACG,MAAM,CAAC,CAAC,CAAC,EAAEH,MAAM,CAACG,MAAM,CAAC,CAAC,CAAC,CAAC,CAClF;EACD,MAAME,eAAe,GAAGR,SAAS,CAACS,KAAK,CAACC,uBAAuB,CAACL,aAAa,EAAE,IAAIN,OAAO,CAAC,CAAC,CAAC;EAC7F,MAAMY,UAAU,GAAG,IAAIV,mBAAmB,CAAC,CAAC,CAACW,4BAA4B,CACvEJ,eAAe,EACfL,MAAM,CAACU,QAAQ,EACfV,MAAM,CAACW,UACT,CAAC;EACD,OAAO,CAAC,GAAGH,UAAU,CAACL,MAAM,EAAE,GAAGK,UAAU,CAACI,QAAQ,CAACC,OAAO,CAAC,CAAC,CAAC;AACjE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-i3s.js","names":["load","I3SLoader","parseSLPKArchive","FileHandleFile","ZipFileSystem","makeZipCDHeaderIterator","loadI3SContent","sourceTileset","sourceTile","tilesetLoadOptions","slpkFilesystem","contentUrl","loadOptions","i3s","isTileset","isTileHeader","_tileOptions","attributeUrls","textureUrl","textureFormat","textureLoaderOptions","materialDefinition","isDracoGeometry","mbs","_tilesetOptions","store","attributeStorageInfo","fields","tileContent","loadFromArchive","openSLPK","url","slpkUrlParts","split","slpkFileName","getSlpkUrlParts","fileProvider","archive","undefined","fileSystem","loader","internalFileName","content","fetch","bind","result","length","slice","Error","getNodeCount","count","filesIterator","file","filename","fileName","indexOf"],"sources":["../../../src/3d-tiles-converter/helpers/load-i3s.ts"],"sourcesContent":["import {LoaderWithParser, load} from '@loaders.gl/core';\nimport {\n I3STileContent,\n I3STileHeader,\n I3STilesetHeader,\n I3SLoader,\n I3SLoaderOptions,\n parseSLPKArchive\n} from '@loaders.gl/i3s';\nimport {FileHandleFile} from '@loaders.gl/loader-utils';\nimport {ZipFileSystem, makeZipCDHeaderIterator} from '@loaders.gl/zip';\n\nexport type SLPKUrlParts = {slpkFileName: string; internalFileName: string};\n\n/**\n * Load I3S node content\n * @param sourceTileset - source layer JSON\n * @param sourceTile - source I3S node metadata\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @param slpkFilesystem - loaded instance of ZipFileSystem for local convertion from SLPK file\n * @returns - 3DTiles tile content or null\n */\nexport const loadI3SContent = async (\n sourceTileset: I3STilesetHeader | null,\n sourceTile: I3STileHeader,\n tilesetLoadOptions: I3SLoaderOptions,\n slpkFilesystem: ZipFileSystem | null\n): Promise<I3STileContent | null> => {\n if (!sourceTileset || !sourceTile.contentUrl) {\n return null;\n }\n\n const loadOptions: I3SLoaderOptions = {\n ...tilesetLoadOptions,\n i3s: {\n ...tilesetLoadOptions.i3s,\n // @ts-expect-error\n isTileset: false,\n // @ts-expect-error\n isTileHeader: false,\n _tileOptions: {\n attributeUrls: sourceTile.attributeUrls || [],\n textureUrl: sourceTile.textureUrl,\n textureFormat: sourceTile.textureFormat,\n textureLoaderOptions: sourceTile.textureLoaderOptions,\n materialDefinition: sourceTile.materialDefinition,\n isDracoGeometry: sourceTile.isDracoGeometry,\n mbs: sourceTile.mbs\n },\n _tilesetOptions: {\n store: sourceTileset.store,\n // @ts-expect-error\n attributeStorageInfo: sourceTileset.attributeStorageInfo,\n // @ts-expect-error\n fields: sourceTileset.fields\n }\n }\n };\n const tileContent = await loadFromArchive(\n sourceTile.contentUrl,\n I3SLoader,\n loadOptions,\n slpkFilesystem\n );\n\n return tileContent;\n};\n\n/**\n * Load local SLPK file to ZipFileSystem instance\n * @param url - path to SLPK file\n * @returns instance of ZipFileSystem or null if url is not an SLPK file\n */\nexport async function openSLPK(url: string): Promise<ZipFileSystem | null> {\n const slpkUrlParts = url.split('.slpk');\n const {slpkFileName} = getSlpkUrlParts(url) || {};\n if (slpkFileName) {\n const slpkFileName = `${slpkUrlParts[0]}.slpk`;\n const fileProvider = new FileHandleFile(slpkFileName);\n const archive = await parseSLPKArchive(fileProvider, undefined, slpkFileName);\n const fileSystem = new ZipFileSystem(archive);\n return fileSystem;\n }\n return null;\n}\n\n/**\n * Load a resource with load options and .3tz format support\n * @param url - resource URL\n * @param loader - loader to parse data (Tiles3DLoader / CesiumIonLoader)\n * @param loadOptions - i3s loader options\n * @returns i3s resource\n */\nexport async function loadFromArchive(\n url: string,\n loader: LoaderWithParser,\n loadOptions: I3SLoaderOptions,\n fileSystem: ZipFileSystem | null\n) {\n const slpkUrlParts = getSlpkUrlParts(url);\n if (fileSystem !== null && slpkUrlParts !== null) {\n const {internalFileName} = slpkUrlParts;\n const content = await load(internalFileName, loader, {\n ...loadOptions,\n fetch: fileSystem.fetch.bind(fileSystem)\n });\n return content;\n }\n return await load(url, loader, loadOptions);\n}\n\n/**\n * Extract slpk file path and internal from the url\n * For example, for `./path/to/file.slpk/nodes/0` it returns\n * {\"slpkFileName\": \"./path/to/file.slpk\", \"internalFileName\": \"/nodes/0\" }\n * @param url full internal file path\n * @returns object with internal slpk file parts\n */\nfunction getSlpkUrlParts(url: string): SLPKUrlParts | null {\n const slpkUrlParts = url.split('.slpk');\n let result: SLPKUrlParts | null;\n // Not '.slpk'. The file will be loaded with global fetch function\n if (slpkUrlParts.length === 1) {\n result = null;\n } else if (slpkUrlParts.length === 2) {\n result = {slpkFileName: `${slpkUrlParts[0]}.slpk`, internalFileName: slpkUrlParts[1].slice(1)};\n } else {\n throw new Error('Unexpected URL format');\n }\n return result;\n}\n\n/**\n * Get nodes count inside SLPK\n * @param fileSystem - file system of SLPK\n * @returns number of nodes\n */\nexport async function getNodeCount(fileSystem: ZipFileSystem | null): Promise<number> {\n if (!fileSystem?.fileProvider) {\n return 0;\n }\n let count = 0;\n const filesIterator = makeZipCDHeaderIterator(fileSystem.fileProvider);\n for await (const file of filesIterator) {\n const filename = file.fileName;\n if (filename.indexOf('3dNodeIndexDocument.json.gz') >= 0) {\n count++;\n }\n }\n return count;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"texture-atlas.js","names":["convertTextureAtlas","texCoords","uvRegions","convertedTexCoords","Float32Array","length","normalisedRegions","normalizeRegions","index","uv","subarray","regions","slice","fractatedUV","fract","subtracted","multiplicationResult","convertedUV","Math","floor","MAX_UINT_16_VALUE","normalizedRegions"],"sources":["../../../src/3d-tiles-converter/helpers/texture-atlas.ts"],"sourcesContent":["import type {TypedArray} from '@loaders.gl/loader-utils';\n\n/**\n * Apply uvRegions to texture coordinates.\n * Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/geometryUVRegion.cmn.md\n * Shader formula vec2 uv = fract(texCoords) * (uvRegions.zw - uvRegions.xy) + uvRegions.xy;\n * @param texCoords\n * @param uvRegions\n */\nexport function convertTextureAtlas(texCoords: TypedArray, uvRegions: TypedArray): Float32Array {\n const convertedTexCoords = new Float32Array(texCoords.length);\n const normalisedRegions = normalizeRegions(uvRegions);\n\n for (let index = 0; index < texCoords.length; index += 2) {\n const uv = texCoords.subarray(index, index + 2);\n const regions = normalisedRegions.slice(index * 2, index * 2 + 4);\n // fract(texCoords)\n const fractatedUV = fract([uv[0], uv[1]]);\n // (uvRegions.zw - uvRegions.xy)\n const subtracted = [regions[2] - regions[0], regions[3] - regions[1]];\n // fract(texCoords) * (uvRegions.zw - uvRegions.xy)\n const multiplicationResult = [fractatedUV[0] * subtracted[0], fractatedUV[1] * subtracted[1]];\n // fract(texCoords) * (uvRegions.zw - uvRegions.xy) + uvRegions.xy;\n const convertedUV = [\n multiplicationResult[0] + regions[0],\n multiplicationResult[1] + regions[1]\n ];\n\n convertedTexCoords[index] = convertedUV[0];\n convertedTexCoords[index + 1] = convertedUV[1];\n }\n\n return convertedTexCoords;\n}\n\n/**\n * Do fractation of UV array.\n * @param uv\n */\nfunction fract(uv: [number, number]): [number, number] {\n return [uv[0] - Math.floor(uv[0]), uv[1] - Math.floor(uv[1])];\n}\n\n/**\n * Normalize uvRegions by dividing by the maximum Uint16 value\n * @param regions\n */\nfunction normalizeRegions(regions: TypedArray): number[] {\n // The code is for Uint16Array because it is the spec requirement\n // https://github.com/Esri/i3s-spec/blob/master/docs/1.8/geometryUVRegion.cmn.md\n const MAX_UINT_16_VALUE = 65535;\n const normalizedRegions: number[] = [];\n\n for (let index = 0; index < regions.length; index++) {\n normalizedRegions[index] = regions[index] / MAX_UINT_16_VALUE;\n }\n\n return normalizedRegions;\n}\n"],"mappings":"AASA,OAAO,SAASA,mBAAmBA,CAACC,SAAqB,EAAEC,SAAqB,EAAgB;EAC9F,MAAMC,kBAAkB,GAAG,IAAIC,YAAY,CAACH,SAAS,CAACI,MAAM,CAAC;EAC7D,MAAMC,iBAAiB,GAAGC,gBAAgB,CAACL,SAAS,CAAC;EAErD,KAAK,IAAIM,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGP,SAAS,CAACI,MAAM,EAAEG,KAAK,IAAI,CAAC,EAAE;IACxD,MAAMC,EAAE,GAAGR,SAAS,CAACS,QAAQ,CAACF,KAAK,EAAEA,KAAK,GAAG,CAAC,CAAC;IAC/C,MAAMG,OAAO,GAAGL,iBAAiB,CAACM,KAAK,CAACJ,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjE,MAAMK,WAAW,GAAGC,KAAK,CAAC,CAACL,EAAE,CAAC,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzC,MAAMM,UAAU,GAAG,CAACJ,OAAO,CAAC,CAAC,CAAC,GAAGA,OAAO,CAAC,CAAC,CAAC,EAAEA,OAAO,CAAC,CAAC,CAAC,GAAGA,OAAO,CAAC,CAAC,CAAC,CAAC;IAErE,MAAMK,oBAAoB,GAAG,CAACH,WAAW,CAAC,CAAC,CAAC,GAAGE,UAAU,CAAC,CAAC,CAAC,EAAEF,WAAW,CAAC,CAAC,CAAC,GAAGE,UAAU,CAAC,CAAC,CAAC,CAAC;IAE7F,MAAME,WAAW,GAAG,CAClBD,oBAAoB,CAAC,CAAC,CAAC,GAAGL,OAAO,CAAC,CAAC,CAAC,EACpCK,oBAAoB,CAAC,CAAC,CAAC,GAAGL,OAAO,CAAC,CAAC,CAAC,CACrC;IAEDR,kBAAkB,CAACK,KAAK,CAAC,GAAGS,WAAW,CAAC,CAAC,CAAC;IAC1Cd,kBAAkB,CAACK,KAAK,GAAG,CAAC,CAAC,GAAGS,WAAW,CAAC,CAAC,CAAC;EAChD;EAEA,OAAOd,kBAAkB;AAC3B;AAMA,SAASW,KAAKA,CAACL,EAAoB,EAAoB;EACrD,OAAO,CAACA,EAAE,CAAC,CAAC,CAAC,GAAGS,IAAI,CAACC,KAAK,CAACV,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAC,CAAC,GAAGS,IAAI,CAACC,KAAK,CAACV,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D;AAMA,SAASF,gBAAgBA,CAACI,OAAmB,EAAY;EAGvD,MAAMS,iBAAiB,GAAG,KAAK;EAC/B,MAAMC,iBAA2B,GAAG,EAAE;EAEtC,KAAK,IAAIb,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGG,OAAO,CAACN,MAAM,EAAEG,KAAK,EAAE,EAAE;IACnDa,iBAAiB,CAACb,KAAK,CAAC,GAAGG,OAAO,CAACH,KAAK,CAAC,GAAGY,iBAAiB;EAC/D;EAEA,OAAOC,iBAAiB;AAC1B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tileset.js","names":["transform","ASSET","version","path","default","TILE","boundingVolume","geometricError","refine","content","children","val","map","tile","TILESET","asset","root"],"sources":["../../../src/3d-tiles-converter/json-templates/tileset.ts"],"sourcesContent":["import transform from 'json-map-transform';\n\nconst ASSET = () => ({\n version: {\n path: 'version',\n default: '1.0'\n }\n});\n\nconst TILE = () => ({\n boundingVolume: {\n path: 'boundingVolume'\n },\n geometricError: {\n path: 'geometricError'\n },\n refine: {\n path: 'refine'\n },\n content: {\n path: 'content'\n },\n children: {\n path: 'children',\n transform: (val) => val.map((tile) => transform(tile, TILE()))\n }\n});\n\nexport const TILESET = () => ({\n asset: {\n path: 'asset',\n transform: (val) => transform(val, ASSET())\n },\n geometricError: {\n path: 'root',\n transform: (val) => val.geometricError\n },\n root: {\n path: 'root',\n transform: (val) => transform(val, TILE())\n }\n});\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,oBAAoB;AAE1C,MAAMC,KAAK,GAAGA,CAAA,MAAO;EACnBC,OAAO,EAAE;IACPC,IAAI,EAAE,SAAS;IACfC,OAAO,EAAE;EACX;AACF,CAAC,CAAC;AAEF,MAAMC,IAAI,GAAGA,CAAA,MAAO;EAClBC,cAAc,EAAE;IACdH,IAAI,EAAE;EACR,CAAC;EACDI,cAAc,EAAE;IACdJ,IAAI,EAAE;EACR,CAAC;EACDK,MAAM,EAAE;IACNL,IAAI,EAAE;EACR,CAAC;EACDM,OAAO,EAAE;IACPN,IAAI,EAAE;EACR,CAAC;EACDO,QAAQ,EAAE;IACRP,IAAI,EAAE,UAAU;IAChBH,SAAS,EAAGW,GAAG,IAAKA,GAAG,CAACC,GAAG,CAAEC,IAAI,IAAKb,SAAS,CAACa,IAAI,EAAER,IAAI,CAAC,CAAC,CAAC;EAC/D;AACF,CAAC,CAAC;AAEF,OAAO,MAAMS,OAAO,GAAGA,CAAA,MAAO;EAC5BC,KAAK,EAAE;IACLZ,IAAI,EAAE,OAAO;IACbH,SAAS,EAAGW,GAAG,IAAKX,SAAS,CAACW,GAAG,EAAEV,KAAK,CAAC,CAAC;EAC5C,CAAC;EACDM,cAAc,EAAE;IACdJ,IAAI,EAAE,MAAM;IACZH,SAAS,EAAGW,GAAG,IAAKA,GAAG,CAACJ;EAC1B,CAAC;EACDS,IAAI,EAAE;IACJb,IAAI,EAAE,MAAM;IACZH,SAAS,EAAGW,GAAG,IAAKX,SAAS,CAACW,GAAG,EAAEN,IAAI,CAAC,CAAC;EAC3C;AACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","names":["BROWSER_ERROR_MESSAGE","DUMP_FILE_SUFFIX"],"sources":["../src/constants.ts"],"sourcesContent":["export const BROWSER_ERROR_MESSAGE =\n 'Tile converter does not work in browser, only in node js environment';\nexport const DUMP_FILE_SUFFIX = '.dump.json';\n"],"mappings":"AAAA,OAAO,MAAMA,qBAAqB,GAChC,sEAAsE;AACxE,OAAO,MAAMC,gBAAgB,GAAG,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"converter-cli.js","names":["join","inquirer","I3SConverter","Tiles3DConverter","DepsInstaller","getBooleanValue","getIntegerValue","getStringValue","getURLValue","validateOptionsWithEqual","addOneFile","composeHashFile","makeZipCDHeaderIterator","FileHandleFile","copyFile","TILESET_TYPE","I3S","_3DTILES","main","args","process","argv","length","printHelp","validatedOptionsArr","options","parseOptions","installDependencies","depthInstaller","install","addHash","validatedOptions","validateOptions","finalPath","tileset","quiet","output","nameWithoutExt","substring","result","prompt","name","type","message","choices","value","isNewFileRequired","hashTable","convert","catch","error","console","log","exit","inputType","toUpperCase","tiles3DConverter","inputUrl","outputPath","tilesetName","maxDepth","egmFilePath","egm","analyze","undefined","converter","slpk","sevenZipExe","token","draco","mergeMaterials","generateTextures","generateBoundingVolumes","validate","instantNodeWriting","metadataClass","mandatoryOptionsWithExceptions","getMessage","condition","Boolean","Object","values","includes","exceptions","mandatoryOption","optionValue","conditionFunc","testValue","push","forEach","exeption","opts","cwd","arg","index","indexOf","warn"],"sources":["../src/converter-cli.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport '@loaders.gl/polyfills';\nimport {join} from 'path';\nimport inquirer from 'inquirer';\nimport {I3SConverter, Tiles3DConverter} from '@loaders.gl/tile-converter';\nimport {DepsInstaller} from './deps-installer/deps-installer';\nimport {\n getBooleanValue,\n getIntegerValue,\n getStringValue,\n getURLValue,\n validateOptionsWithEqual\n} from './lib/utils/cli-utils';\nimport {addOneFile, composeHashFile, makeZipCDHeaderIterator} from '@loaders.gl/zip';\nimport {FileHandleFile} from '@loaders.gl/loader-utils';\nimport {copyFile} from 'node:fs/promises';\n\ntype TileConversionOptions = {\n /** \"I3S\" - for I3S to 3DTiles conversion, \"3DTILES\" for 3DTiles to I3S conversion */\n inputType?: string;\n /** \"tileset.json\" file (3DTiles) / \"http://..../SceneServer/layers/0\" resource (I3S) */\n tileset?: string;\n /** Tileset name. This option is used for naming in resulting json resouces and for resulting path/*.slpk file naming */\n name?: string;\n /** Output folder. This folder will be created by converter if doesn't exist. It is relative to the converter path.\n * Default: \"data\" folder */\n output: string;\n /** Keep created 3DNodeIndexDocument files on disk instead of memory. This option reduce memory usage but decelerates conversion speed */\n instantNodeWriting: boolean;\n /** Try to merge similar materials to be able to merge meshes into one node (I3S to 3DTiles conversion only) */\n mergeMaterials: boolean;\n /** 3DTiles->I3S only. location of 7z.exe archiver to create slpk on Windows OS, default: \"C:\\Program Files\\7-Zip\\7z.exe\" */\n sevenZipExe: string;\n /** location of the Earth Gravity Model (*.pgm) file to convert heights from ellipsoidal to gravity-related format,\n * default: \"./deps/egm2008-5.pgm\". A model file can be loaded from GeographicLib\n * https://geographiclib.sourceforge.io/html/geoid.html */\n egm: string;\n /** 3DTile->I3S only. Token for Cesium ION tileset authentication. */\n token?: string;\n /** 3DTiles->I3S only. Enable draco compression for geometry. Default: true */\n draco: boolean;\n /** Run the script for installing dependencies. Run this options separate from others. Now \"*.pgm\" file installation is\n * implemented */\n installDependencies: boolean;\n /** 3DTile->I3S only. Enable KTX2 textures generation if only one of (JPG, PNG) texture is provided or generate JPG texture\n * if only KTX2 is provided */\n generateTextures: boolean;\n /** 3DTile->I3S only. Will generate obb and mbs bounding volumes from geometry */\n generateBoundingVolumes: boolean;\n /** Validate the dataset during conversion. Validation messages will be posted in the console output */\n validate: boolean;\n /** Maximal depth of the hierarchical tiles tree traversal, default: infinite */\n maxDepth?: number;\n /** 3DTiles->I3S only. Whether the converter generates *.slpk (Scene Layer Package) I3S output file */\n slpk: boolean;\n /** adds hash file to the slpk if there's no one */\n addHash: boolean;\n /** Feature metadata class from EXT_FEATURE_METADATA or EXT_STRUCTURAL_METADATA extensions */\n metadataClass?: string;\n /** With this options the tileset content will be analyzed without conversion */\n analyze?: boolean;\n /** Skip all prompts that stop conversion and wait for a user input */\n quiet?: boolean;\n};\n\n/* During validation we check that particular options are defined so they can't be undefined */\ntype ValidatedTileConversionOptions = TileConversionOptions & {\n /** \"I3S\" - for I3S to 3DTiles conversion, \"3DTILES\" for 3DTiles to I3S conversion */\n inputType: string;\n /** \"tileset.json\" file (3DTiles) / \"http://..../SceneServer/layers/0\" resource (I3S) */\n tileset: string;\n /** Tileset name. This option is used for naming in resulting json resouces and for resulting path/*.slpk file naming */\n name: string;\n};\n\nconst TILESET_TYPE = {\n I3S: 'I3S',\n _3DTILES: '3DTILES'\n};\n\n/**\n * CLI entry\n * @returns\n */\nasync function main() {\n const [, , ...args] = process.argv;\n\n if (args.length === 0) {\n printHelp();\n }\n\n const validatedOptionsArr = validateOptionsWithEqual(args);\n\n const options: TileConversionOptions = parseOptions(validatedOptionsArr);\n\n if (options.installDependencies) {\n const depthInstaller = new DepsInstaller();\n depthInstaller.install('deps');\n return;\n }\n\n if (options.addHash) {\n const validatedOptions = validateOptions(options, true);\n let finalPath = validatedOptions.tileset;\n\n if (!options.quiet) {\n if (validatedOptions.output === 'data') {\n const nameWithoutExt = validatedOptions.tileset.substring(\n 0,\n validatedOptions.tileset.length - 5\n );\n\n const result = await inquirer.prompt<{isNewFileRequired: boolean}>([\n {\n name: 'isNewFileRequired',\n type: 'list',\n message: 'What would you like to do?',\n choices: [\n {\n name: 'Add hash file to the current SLPK file',\n value: false\n },\n {\n name: `Create a new file ${nameWithoutExt}-hash.slpk with hash file inside`,\n value: true\n }\n ]\n }\n ]);\n\n if (result.isNewFileRequired) {\n finalPath = `${nameWithoutExt}-hash.slpk`;\n }\n } else {\n finalPath = validatedOptions.output;\n }\n }\n\n if (finalPath !== validatedOptions.tileset) {\n await copyFile(validatedOptions.tileset, finalPath);\n }\n const hashTable = await composeHashFile(makeZipCDHeaderIterator(new FileHandleFile(finalPath)));\n await addOneFile(finalPath, hashTable, '@specialIndexFileHASH128@');\n\n return;\n }\n\n const validatedOptions: ValidatedTileConversionOptions = validateOptions(options);\n\n await convert(validatedOptions);\n}\n\nmain().catch((error) => {\n console.log(error);\n process.exit(1); // eslint-disable-line\n});\n\n/**\n * Output for `npx tile-converter --help`\n */\nfunction printHelp(): void {\n console.log('cli: converter 3dTiles to I3S or I3S to 3dTiles...');\n console.log(\n '--install-dependencies [Run the script for installing dependencies. Run this options separate from others. Now \"*.pgm\" file installation is implemented]'\n );\n console.log(\n '--max-depth [Maximal depth of hierarchical tiles tree traversal, default: infinite]'\n );\n console.log('--name [Tileset name]');\n console.log('--output [Output folder, default: \"data\" folder]');\n console.log(\n '--instant-node-writing [Keep created 3DNodeIndexDocument files on disk instead of memory. This option reduce memory usage but decelerates conversion speed]'\n );\n console.log(\n '--split-nodes [Prevent to merge similar materials that could lead to incorrect visualization (I3S to 3DTiles conversion only)]'\n );\n console.log('--slpk [Generate slpk (Scene Layer Packages) I3S output file]');\n console.log(\n '--tileset [tileset.json file (3DTiles) / http://..../SceneServer/layers/0 resource (I3S)]'\n );\n console.log('--input-type [tileset input type: I3S or 3DTILES]');\n console.log(\n '--7zExe [location of 7z.exe archiver to create slpk on Windows, default: \"C:\\\\Program Files\\\\7-Zip\\\\7z.exe\"]'\n );\n console.log(\n '--egm [location of Earth Gravity Model *.pgm file to convert heights from ellipsoidal to gravity-related format. A model file can be loaded from GeographicLib https://geographiclib.sourceforge.io/html/geoid.html], default: \"./deps/egm2008-5.zip\"'\n );\n console.log('--token [Token for Cesium ION tilesets authentication]');\n console.log('--no-draco [Disable draco compression for geometry]');\n console.log(\n '--generate-textures [Enable KTX2 textures generation if only one of (JPG, PNG) texture is provided or generate JPG texture if only KTX2 is provided]'\n );\n console.log('--generate-bounding-volumes [Generate obb and mbs bounding volumes from geometry]');\n console.log('--analyze [Analyze the input tileset content without conversion, default: false]');\n console.log(\n '--metadata-class [One of the list of feature metadata classes, detected by converter on \"analyze\" stage, default: not set]'\n );\n console.log('--validate [Enable validation]');\n console.log(\n '--quiet [Skip all prompts that stop conversion and wait for a user input: default: false]'\n );\n process.exit(0); // eslint-disable-line\n}\n\n/**\n * Run conversion process\n * @param options validated tile-converter options\n */\nasync function convert(options: ValidatedTileConversionOptions) {\n console.log(`------------------------------------------------`); // eslint-disable-line\n console.log(`Starting conversion of ${options.inputType}`); // eslint-disable-line\n console.log(`------------------------------------------------`); // eslint-disable-line\n const inputType = options.inputType.toUpperCase();\n switch (inputType) {\n case TILESET_TYPE.I3S:\n const tiles3DConverter = new Tiles3DConverter();\n await tiles3DConverter.convert({\n inputUrl: options.tileset,\n outputPath: options.output,\n tilesetName: options.name,\n maxDepth: options.maxDepth,\n egmFilePath: options.egm,\n analyze: options.analyze,\n inquirer: options.quiet ? undefined : inquirer\n });\n break;\n case TILESET_TYPE._3DTILES:\n const converter = new I3SConverter();\n await converter.convert({\n inputUrl: options.tileset,\n outputPath: options.output,\n tilesetName: options.name,\n maxDepth: options.maxDepth,\n slpk: options.slpk,\n sevenZipExe: options.sevenZipExe,\n egmFilePath: options.egm,\n token: options.token,\n draco: options.draco,\n mergeMaterials: options.mergeMaterials,\n generateTextures: options.generateTextures,\n generateBoundingVolumes: options.generateBoundingVolumes,\n validate: options.validate,\n instantNodeWriting: options.instantNodeWriting,\n metadataClass: options.metadataClass,\n analyze: options.analyze,\n inquirer: options.quiet ? undefined : inquirer\n });\n break;\n default:\n printHelp();\n }\n}\n\n// OPTIONS\n/**\n * Validate input options of the CLI command\n * @param options - input options of the CLI command\n * @returns validated options\n */\nfunction validateOptions(\n options: TileConversionOptions,\n addHash?: boolean\n): ValidatedTileConversionOptions {\n const mandatoryOptionsWithExceptions: {\n [key: string]: {\n getMessage: () => void;\n condition?: (optionValue: any) => boolean;\n };\n } = {\n name: {\n getMessage: () => console.log('Missed: --name [Tileset name]'),\n condition: (value: any) => addHash || Boolean(value) || Boolean(options.analyze)\n },\n output: {getMessage: () => console.log('Missed: --output [Output path name]')},\n sevenZipExe: {getMessage: () => console.log('Missed: --7zExe [7z archiver executable path]')},\n egm: {getMessage: () => console.log('Missed: --egm [*.pgm earth gravity model file path]')},\n tileset: {getMessage: () => console.log('Missed: --tileset [tileset.json file]')},\n inputType: {\n getMessage: () =>\n console.log('Missed/Incorrect: --input-type [tileset input type: I3S or 3DTILES]'),\n condition: (value) =>\n addHash || (Boolean(value) && Object.values(TILESET_TYPE).includes(value.toUpperCase()))\n }\n };\n const exceptions: (() => void)[] = [];\n for (const mandatoryOption in mandatoryOptionsWithExceptions) {\n const optionValue = options[mandatoryOption];\n\n const conditionFunc = mandatoryOptionsWithExceptions[mandatoryOption].condition;\n const testValue = conditionFunc ? conditionFunc(optionValue) : optionValue;\n\n if (!testValue) {\n exceptions.push(mandatoryOptionsWithExceptions[mandatoryOption].getMessage);\n }\n }\n if (exceptions.length) {\n exceptions.forEach((exeption) => exeption());\n process.exit(1);\n }\n return <ValidatedTileConversionOptions>options;\n}\n\n/**\n * Parse option from the cli arguments array\n * @param args\n * @returns\n */\nfunction parseOptions(args: string[]): TileConversionOptions {\n const opts: TileConversionOptions = {\n output: 'data',\n instantNodeWriting: false,\n mergeMaterials: true,\n sevenZipExe: 'C:\\\\Program Files\\\\7-Zip\\\\7z.exe',\n egm: join(process.cwd(), 'deps', 'egm2008-5.pgm'),\n draco: true,\n installDependencies: false,\n generateTextures: false,\n generateBoundingVolumes: false,\n validate: false,\n slpk: false,\n addHash: false,\n quiet: false\n };\n\n // eslint-disable-next-line complexity\n args.forEach((arg, index) => {\n if (arg.indexOf('--') === 0) {\n switch (arg) {\n case '--input-type':\n opts.inputType = getStringValue(index, args);\n break;\n case '--tileset':\n opts.tileset = getURLValue(index, args);\n break;\n case '--name':\n opts.name = getStringValue(index, args);\n break;\n case '--output':\n opts.output = getStringValue(index, args);\n break;\n case '--instant-node-writing':\n opts.instantNodeWriting = getBooleanValue(index, args);\n break;\n case '--split-nodes':\n opts.mergeMaterials = getBooleanValue(index, args);\n break;\n case '--max-depth':\n opts.maxDepth = getIntegerValue(index, args);\n break;\n case '--slpk':\n opts.slpk = getBooleanValue(index, args);\n break;\n case '--add-hash':\n opts.addHash = getBooleanValue(index, args);\n break;\n case '--7zExe':\n opts.sevenZipExe = getStringValue(index, args);\n break;\n case '--egm':\n opts.egm = getStringValue(index, args);\n break;\n case '--token':\n opts.token = getStringValue(index, args);\n break;\n case '--no-draco':\n opts.draco = getBooleanValue(index, args);\n break;\n case '--validate':\n opts.validate = getBooleanValue(index, args);\n break;\n case '--install-dependencies':\n opts.installDependencies = getBooleanValue(index, args);\n break;\n case '--generate-textures':\n opts.generateTextures = getBooleanValue(index, args);\n break;\n case '--generate-bounding-volumes':\n opts.generateBoundingVolumes = getBooleanValue(index, args);\n break;\n case '--analyze':\n opts.analyze = getBooleanValue(index, args);\n break;\n case '--quiet':\n opts.quiet = getBooleanValue(index, args);\n break;\n case '--metadata-class':\n opts.metadataClass = getStringValue(index, args);\n break;\n case '--help':\n printHelp();\n break;\n default:\n console.warn(`Unknown option ${arg}`);\n process.exit(0); // eslint-disable-line\n }\n }\n });\n return opts;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"deps-installer.js","names":["load","fetchFile","ZipLoader","writeFile","join","dirname","ChildProcessProxy","DRACO_EXTERNAL_LIBRARIES","DRACO_EXTERNAL_LIBRARY_URLS","BASIS_EXTERNAL_LIBRARIES","VERSION","PGM_LINK","DepsInstaller","install","path","arguments","length","undefined","console","log","fileMap","depsPath","process","cwd","Uint8Array","installFromNpm","installFromUrl","DECODER","DECODER_WASM","ENCODER","TRANSCODER","TRANSCODER_WASM","ENCODER_WASM","childProcess","nodeDir","execPath","start","command","platform","wait","ignoreStderr","module","name","extraPath","fileResponse","fileData","arrayBuffer","url"],"sources":["../../src/deps-installer/deps-installer.ts"],"sourcesContent":["import {load, fetchFile} from '@loaders.gl/core';\nimport {ZipLoader} from '@loaders.gl/zip';\nimport {writeFile} from '../lib/utils/file-utils';\nimport {join, dirname} from 'path';\nimport {ChildProcessProxy} from '@loaders.gl/worker-utils';\nimport {DRACO_EXTERNAL_LIBRARIES, DRACO_EXTERNAL_LIBRARY_URLS} from '@loaders.gl/draco';\nimport {BASIS_EXTERNAL_LIBRARIES} from '@loaders.gl/textures';\n\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nconst PGM_LINK = 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/egm/egm2008-5.zip';\n\n/**\n * Install external dependencies for converter:\n * * PGM file (implemented);\n * * Draco library (not implemented);\n * * 7z archiver (not implemented);\n */\nexport class DepsInstaller {\n /**\n * Run instalation\n * @param path destination folder\n * @param workersPath destination folder for workers.\n * This path is '' by default and is not used by tile-converter.\n * It is used in tests to prevent rewriting actual workers during tests running\n */\n async install(path: string = ''): Promise<void> {\n console.log('Installing \"EGM2008-5\" model...'); // eslint-disable-line no-console\n const fileMap = await load(PGM_LINK, ZipLoader, {});\n\n let depsPath = process.cwd();\n if (path) {\n depsPath = join(depsPath, path);\n }\n\n await writeFile(depsPath, new Uint8Array(fileMap['geoids/egm2008-5.pgm']), 'egm2008-5.pgm');\n\n console.log('Installing \"I3S Content Loader\" worker'); // eslint-disable-line no-console\n await this.installFromNpm('i3s', 'i3s-content-worker-node.js');\n\n console.log('Installing \"Draco Loader\" worker'); // eslint-disable-line no-console\n await this.installFromNpm('draco', 'draco-worker-node.js');\n\n console.log('Installing \"Draco Writer\" worker'); // eslint-disable-line no-console\n await this.installFromNpm('draco', 'draco-writer-worker-node.js');\n\n console.log('Installing \"Basis Loader\" worker'); // eslint-disable-line no-console\n await this.installFromNpm('textures', 'basis-worker-node.js');\n\n console.log('Installing \"KTX2 Basis Writer\" worker'); // eslint-disable-line no-console\n await this.installFromNpm('textures', 'ktx2-basis-writer-worker-node.js');\n\n console.log('Installing \"Draco decoder\" library'); // eslint-disable-line no-console\n await this.installFromUrl(\n DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],\n 'draco',\n DRACO_EXTERNAL_LIBRARIES.DECODER\n );\n await this.installFromUrl(\n DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],\n 'draco',\n DRACO_EXTERNAL_LIBRARIES.DECODER_WASM\n );\n\n console.log('Installing \"Draco encoder\" library'); // eslint-disable-line no-console\n await this.installFromUrl(\n DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER],\n 'draco',\n DRACO_EXTERNAL_LIBRARIES.ENCODER\n );\n\n console.log('Installing \"Basis transcoder\" library'); // eslint-disable-line no-console\n await this.installFromNpm('textures', BASIS_EXTERNAL_LIBRARIES.TRANSCODER, 'libs');\n await this.installFromNpm('textures', BASIS_EXTERNAL_LIBRARIES.TRANSCODER_WASM, 'libs');\n\n console.log('Installing \"Basis encoder\" library'); // eslint-disable-line no-console\n await this.installFromNpm('textures', BASIS_EXTERNAL_LIBRARIES.ENCODER, 'libs');\n await this.installFromNpm('textures', BASIS_EXTERNAL_LIBRARIES.ENCODER_WASM, 'libs');\n\n console.log('Installing \"join-images\" npm package');\n const childProcess = new ChildProcessProxy();\n const nodeDir = dirname(process.execPath);\n await childProcess.start({\n command: `${nodeDir}/${process.platform === 'win32' ? 'npm.cmd' : 'npm'}`,\n // `npm install sharp join-images` works unstable. It fails because installed `sharp` version\n // may be different from the version required by `join-images`. Pointing to specific versions\n // resolve this issue\n arguments: ['install', 'sharp@0.30.4', 'join-images@1.1.3'],\n wait: 0,\n ignoreStderr: true\n });\n\n console.log('All dependencies were installed succesfully.'); // eslint-disable-line no-console\n }\n\n private async installFromNpm(module: string, name: string, extraPath: string = '') {\n const fileResponse = await fetchFile(\n `https://unpkg.com/@loaders.gl/${module}@${VERSION}/dist/${extraPath}/${name}`\n );\n const fileData = await fileResponse.arrayBuffer();\n if (!fileData) {\n return;\n }\n const path = join(process.cwd(), 'modules', module, 'dist', extraPath);\n await writeFile(path, fileData, name);\n }\n\n private async installFromUrl(url: string, module: string, name: string) {\n const fileResponse = await fetchFile(url);\n const fileData = await fileResponse.arrayBuffer();\n if (!fileData) {\n return;\n }\n const path = join(process.cwd(), 'modules', module, 'dist', 'libs');\n await writeFile(path, fileData, name);\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"attribute-metadata-info.js","names":["AttributeType","AttributeMetadataInfo","constructor","_attributeStorageInfo","_fields","_popupInfo","attributeStorageInfo","fields","popupInfo","addMetadataInfo","attributeTypesMap","Object","keys","length","attributeTypes","OBJECTID","OBJECT_ID_TYPE","isUpdated","attributeIndex","key","elementFound","find","element","name","attributeType","storageAttribute","createStorageAttribute","fieldAttributeType","getFieldAttributeType","fieldAttribute","createFieldAttribute","push","attributeNames","info","createPopupInfo","fromObject","object","ordering","header","property","valueType","attributeValues","valuesPerElement","setupIdAttribute","STRING_TYPE","setupStringAttribute","DOUBLE_TYPE","setupDoubleAttribute","SHORT_INT_TYPE","unshift","encoding","attributeByteCounts","type","alias","propertyNames","title","mediaInfos","fieldInfos","popupElements","expressionInfos","propertyName","fieldName","visible","isEditable","label"],"sources":["../../../src/i3s-converter/helpers/attribute-metadata-info.ts"],"sourcesContent":["import type {\n Attribute,\n AttributeStorageInfo,\n ESRIField,\n Field,\n FieldInfo,\n PopupInfo\n} from '@loaders.gl/i3s';\n\nimport {AttributeType} from '../types';\n\nexport type AttributeMetadataInfoObject = {\n attributeStorageInfo: AttributeStorageInfo[];\n fields: Field[];\n popupInfo: PopupInfo | undefined;\n};\n\nexport class AttributeMetadataInfo {\n private _attributeStorageInfo: AttributeStorageInfo[];\n private _fields: Field[];\n private _popupInfo: PopupInfo | undefined;\n\n constructor() {\n this._attributeStorageInfo = [];\n this._fields = [];\n }\n\n get attributeStorageInfo(): AttributeStorageInfo[] {\n return this._attributeStorageInfo;\n }\n\n get fields(): Field[] {\n return this._fields;\n }\n\n get popupInfo(): PopupInfo | undefined {\n return this._popupInfo;\n }\n\n /**\n * Creates and stores Attribute Storage Info, Fields and PopupInfo objects based on attribute's types.\n * Appends objects that have not been stored yet.\n * @param attributeTypesMap - set of attribute's types\n * @example AttributeStorageInfo, Fields and PopupInfo already contain objects for the following attributes:\n * {\n * color: 'string',\n * name: 'string',\n * opt_uint8: 'Int32'\n * }\n * Then, we call the addMetadataInfo method with the following attributeTypesMap:\n * {\n * // The same attributes\n * color: 'string',\n * name: 'string',\n * opt_uint8: 'Int32',\n * // New attributes\n * opt_uint64: 'string',\n * opt_float32: 'double',\n * }\n * The method creates and stores objects for opt_uint64, opt_float32 attributes.\n */\n addMetadataInfo(attributeTypesMap: Record<string, Attribute>): void {\n if (!Object.keys(attributeTypesMap).length) {\n return;\n }\n const attributeTypes: Record<string, Attribute> = {\n OBJECTID: AttributeType.OBJECT_ID_TYPE,\n ...attributeTypesMap\n };\n\n let isUpdated = false;\n let attributeIndex = this._attributeStorageInfo.length;\n for (const key in attributeTypes) {\n /*\n We will append a new attribute only in case it has not been added to the attribute storage info yet.\n */\n const elementFound = this._attributeStorageInfo.find((element) => element.name === key);\n if (!elementFound) {\n const attributeType = attributeTypes[key];\n\n const storageAttribute = this.createStorageAttribute(attributeIndex, key, attributeType);\n const fieldAttributeType = this.getFieldAttributeType(attributeType);\n const fieldAttribute = this.createFieldAttribute(key, fieldAttributeType);\n\n this._attributeStorageInfo.push(storageAttribute);\n this._fields.push(fieldAttribute);\n attributeIndex += 1;\n isUpdated = true;\n }\n }\n if (isUpdated) {\n /*\n The attributeStorageInfo is updated. So, popupInfo should be recreated.\n Use attributeStorageInfo as a source of attribute names to create the popupInfo.\n */\n const attributeNames: string[] = [];\n for (let info of this._attributeStorageInfo) {\n attributeNames.push(info.name);\n }\n this._popupInfo = this.createPopupInfo(attributeNames);\n }\n }\n\n /**\n * Set AttributeMetadataInfo from object\n * @param object - object with AttributeMetadataInfo props\n */\n fromObject(object: AttributeMetadataInfoObject) {\n this._attributeStorageInfo = object.attributeStorageInfo;\n this._fields = object.fields;\n this._popupInfo = object.popupInfo;\n }\n\n /**\n * Generates storage attribute for map segmentation.\n * @param attributeIndex - order index of attribute (f_0, f_1 ...).\n * @param key - attribute key from propertyTable.\n * @param attributeType - attribute type.\n * @return Updated storageAttribute.\n */\n private createStorageAttribute(\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 AttributeType.OBJECT_ID_TYPE:\n this.setupIdAttribute(storageAttribute);\n break;\n case AttributeType.STRING_TYPE:\n this.setupStringAttribute(storageAttribute);\n break;\n case AttributeType.DOUBLE_TYPE:\n this.setupDoubleAttribute(storageAttribute);\n break;\n case AttributeType.SHORT_INT_TYPE:\n break;\n default:\n this.setupStringAttribute(storageAttribute);\n }\n\n return storageAttribute;\n }\n\n /**\n * Finds and returns attribute type based on key form propertyTable.\n * @param attributeType\n */\n private getFieldAttributeType(attributeType: Attribute): ESRIField {\n switch (attributeType) {\n case AttributeType.OBJECT_ID_TYPE:\n return 'esriFieldTypeOID';\n case AttributeType.STRING_TYPE:\n return 'esriFieldTypeString';\n case AttributeType.SHORT_INT_TYPE:\n return 'esriFieldTypeInteger';\n case AttributeType.DOUBLE_TYPE:\n return 'esriFieldTypeDouble';\n default:\n return 'esriFieldTypeString';\n }\n }\n\n /**\n * Sets up 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 * Sets up storage attribute as string.\n * @param storageAttribute - attribute for map segmentation.\n */\n private setupStringAttribute(storageAttribute: AttributeStorageInfo): void {\n // @ts-expect-error\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 * Sets up 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 * Sets up 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 * Generates popup info to show metadata on the map.\n * @param propertyNames - array of property names including OBJECTID.\n * @return data for correct rendering of popup.\n */\n private createPopupInfo(propertyNames: string[]): 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 propertyName of propertyNames) {\n fieldInfos.push({\n fieldName: propertyName,\n visible: true,\n isEditable: false,\n label: propertyName\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"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch-ids-extensions.js","names":["emod","EXT_MESH_FEATURES","EXT_FEATURE_METADATA","getTextureByMetadataClass","tileContent","metadataClass","_tileContent$gltf","_tileContent$gltf$ext","extFeatureMetadata","gltf","extensions","featureTextures","textureKey","texture","class","handleBatchIdsExtensions","attributes","primitive","images","featureTexture","extensionName","extensionData","Object","entries","handleExtFeatureMetadataExtension","handleExtMeshFeaturesExtension","extMeshFeatures","ids","featureIds","propertyTable","data","_extFeatureMetadata$f","_featureIdAttribute$f","_featureIdAttribute$f2","_featureIdAttribute$f3","featureIdAttribute","featureIdAttributes","attribute","batchIdsAttribute","value","hasOwnProperty","_attributes$POSITIONS","featuresCount","POSITIONS","length","generateImplicitFeatureIds","constant","divisor","featureIdTexture","featureIdTextures","_featureIdTexture$fea","_featureIdTexture$fea2","textureAttributeIndex","texCoord","textCoordAttribute","textureCoordinates","generateBatchIdsFromTexture","arguments","undefined","currentValue","devisorCounter","index","push","Array","fill","_featureIdTexture$fea3","_featureIdTexture$fea4","_featureIdTexture$fea5","CHANNELS_MAP","r","g","b","a","textureIndex","featureChannel","channels","image","batchIds","width","height","components","u","v","tx","Math","min","ty","offset","batchId","Uint8Array","console","warn","mimeType"],"sources":["../../../src/i3s-converter/helpers/batch-ids-extensions.ts"],"sourcesContent":["import {GLTFAccessorPostprocessed, GLTFMeshPrimitivePostprocessed} from '@loaders.gl/gltf';\nimport type {NumericArray} from '@loaders.gl/loader-utils';\nimport type {\n GLTF_EXT_feature_metadata_FeatureIdTexture,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_feature_metadata_Primitive\n} from '@loaders.gl/gltf';\n\nimport type {GLTF_EXT_mesh_features} from '@loaders.gl/gltf';\n\nimport {TypedArray} from '@math.gl/core';\nimport {TextureImageProperties} from '../types';\nimport {emod} from '@loaders.gl/math';\nimport {EXT_MESH_FEATURES, EXT_FEATURE_METADATA} from '@loaders.gl/gltf';\nimport {Tiles3DTileContent} from '@loaders.gl/3d-tiles';\n\n/**\n * Get featureTexture by a metadata class.\n * Metadata classes come from a structural metadata extesion (EXT_feature_metadata or EXT_structural_metadata).\n * The glTF might contain multiple texel-level metadata textures related to different classes. Having only one metadata class\n * selected to convert to I3S, we have to pick only one texture to convert to per-vertex property.\n * @param tileContent - 3d tile content\n * @param metadataClass - user selected feature metadata class name\n * @returns featureTexture key\n */\nexport function getTextureByMetadataClass(\n tileContent: Tiles3DTileContent,\n metadataClass?: string\n): string | null {\n const extFeatureMetadata = tileContent.gltf?.extensions?.[\n EXT_FEATURE_METADATA\n ] as GLTF_EXT_feature_metadata_GLTF;\n if (!extFeatureMetadata?.featureTextures) {\n return null;\n }\n for (const textureKey in extFeatureMetadata.featureTextures) {\n const texture = extFeatureMetadata.featureTextures[textureKey];\n if (texture.class === metadataClass) {\n return textureKey;\n }\n }\n return null;\n}\n\n/**\n * Getting batchIds from 3DTilesNext extensions.\n * @param attributes - gltf accessors\n * @param primitive - gltf primitive data\n * @param images - gltf texture images\n * @param featureTexture - feature texture key\n * @return array of batch IDs\n */\nexport function handleBatchIdsExtensions(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n primitive: GLTFMeshPrimitivePostprocessed,\n images: (TextureImageProperties | null)[],\n featureTexture: string | null\n): NumericArray {\n const extensions = primitive?.extensions;\n if (!extensions) {\n return [];\n }\n\n for (const [extensionName, extensionData] of Object.entries(extensions || {})) {\n switch (extensionName) {\n case EXT_FEATURE_METADATA:\n return handleExtFeatureMetadataExtension(\n attributes,\n extensionData as GLTF_EXT_feature_metadata_Primitive,\n images,\n featureTexture\n );\n case EXT_MESH_FEATURES:\n return handleExtMeshFeaturesExtension(attributes, extensionData as GLTF_EXT_mesh_features);\n default:\n return [];\n }\n }\n\n return [];\n}\n\n/**\n * Getting batchIds from EXT_mesh_features extensions.\n * @param attributes - gltf accessors\n * @param extMeshFeatures - EXT_mesh_features extension\n * @returns an array of attribute values\n */\nfunction handleExtMeshFeaturesExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extMeshFeatures: GLTF_EXT_mesh_features\n): NumericArray {\n for (let ids of extMeshFeatures.featureIds) {\n if (typeof ids.propertyTable !== 'undefined') {\n // propertyTable is an index that can be 0\n // return the first featureID set that corresponts to property table.\n return ids.data as NumericArray;\n }\n }\n return [];\n}\n\n/**\n * Get batchIds from EXT_feature_metadata extension.\n * @see - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata\n * @param attributes - glTF attributes\n * @param extFeatureMetadata - primitive-level EXT_FEATURE_METADATA extension data\n * @param textures - texture images\n * @param featureTexture - feature texture key\n */\nfunction handleExtFeatureMetadataExtension(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n extFeatureMetadata: GLTF_EXT_feature_metadata_Primitive,\n images: (TextureImageProperties | null)[],\n featureTexture: string | null\n): NumericArray {\n // Take only first extension object to get batchIds attribute name.\n const featureIdAttribute = extFeatureMetadata?.featureIdAttributes?.[0];\n\n if (featureIdAttribute?.featureIds?.attribute) {\n const batchIdsAttribute = attributes[featureIdAttribute.featureIds.attribute];\n return batchIdsAttribute.value;\n }\n\n if (\n featureIdAttribute?.featureIds?.hasOwnProperty('constant') &&\n featureIdAttribute?.featureIds?.hasOwnProperty('divisor')\n ) {\n const featuresCount = attributes?.POSITIONS?.value.length / 3 || 0;\n return generateImplicitFeatureIds(\n featuresCount,\n featureIdAttribute.featureIds.constant,\n featureIdAttribute.featureIds.divisor\n );\n }\n\n // Take only first extension object to get batchIds attribute name.\n const featureIdTexture =\n extFeatureMetadata?.featureIdTextures && extFeatureMetadata?.featureIdTextures[0];\n\n if (featureIdTexture) {\n const textureAttributeIndex = featureIdTexture?.featureIds?.texture?.texCoord || 0;\n const textCoordAttribute = `TEXCOORD_${textureAttributeIndex}`;\n const textureCoordinates = attributes[textCoordAttribute].value;\n return generateBatchIdsFromTexture(featureIdTexture, textureCoordinates, images);\n }\n\n if (featureTexture) {\n const batchIdsAttribute = attributes[featureTexture];\n return batchIdsAttribute.value;\n }\n\n return [];\n}\n\n/**\n * Generates implicit feature ids\n * @see - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata#implicit-feature-ids\n * @param featuresCount\n * @param constant\n * @param devisor\n */\nfunction generateImplicitFeatureIds(\n featuresCount: number,\n constant: number = 0,\n divisor: number = 0\n): number[] {\n let featureIds: number[] = [];\n\n if (divisor > 0) {\n let currentValue = constant;\n let devisorCounter = divisor;\n\n for (let index = 0; index < featuresCount; index++) {\n featureIds.push(currentValue);\n\n devisorCounter -= 1;\n\n if (devisorCounter === 0) {\n currentValue++;\n devisorCounter = divisor;\n }\n }\n } else {\n featureIds = Array<number>(featuresCount).fill(constant, 0, featuresCount);\n }\n\n return featureIds;\n}\n\n/**\n * Get batchIds from texture.\n * @param primitive\n * @param featureIdTextures\n */\nfunction generateBatchIdsFromTexture(\n featureIdTexture: GLTF_EXT_feature_metadata_FeatureIdTexture,\n textureCoordinates: TypedArray,\n images: (TextureImageProperties | null)[]\n) {\n if (!images?.length) {\n return [];\n }\n\n const CHANNELS_MAP = {\n r: 0,\n g: 1,\n b: 2,\n a: 3\n };\n\n const textureIndex = featureIdTexture?.featureIds?.texture?.index;\n const featureChannel = featureIdTexture?.featureIds?.channels;\n\n if (!featureChannel || textureIndex === undefined) {\n return [];\n }\n\n const image = images[textureIndex];\n const batchIds: number[] = [];\n const channels = CHANNELS_MAP[featureChannel];\n\n if (image && image?.width && image?.height && image?.components) {\n for (let index = 0; index < textureCoordinates.length; index += 2) {\n const u = textureCoordinates[index];\n const v = textureCoordinates[index + 1];\n\n const tx = Math.min((emod(u) * image.width) | 0, image.width - 1);\n const ty = Math.min((emod(v) * image.height) | 0, image.height - 1);\n\n const offset = (ty * image.width + tx) * image.components + channels;\n const batchId = new Uint8Array(image.data)[offset];\n\n batchIds.push(batchId);\n }\n } else {\n console.warn(`Can't get batch Ids from ${image?.mimeType || ''} compressed texture`);\n }\n\n return batchIds;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"coordinate-converter.js","names":["Matrix3","Quaternion","Vector3","Ellipsoid","OrientedBoundingBox","makeOrientedBoundingBoxFromPoints","makeBoundingSphereFromPoints","BoundingSphere","createBoundingVolumes","sourceBoundingVolume","geoidHeightModel","radius","halfSize","quaternion","cartographicCenter","WGS84","cartesianToCartographic","center","getHeight","len","fromMatrix3","normalize","mbs","obb","createBoundingVolumesFromGeometry","cartesianPositions","positionVectors","convertPositionsToVectors","geometryObb","geometryMbs","mbsCenter","obbCenter","positions","result","i","length","positionVector","push","convertBoundingVolumeToI3SFullExtent","boundingVolume","sphere","getBoundingSphere","vertexMax","vertexMin","xmin","Math","min","xmax","max","ymin","ymax","zmin","zmax","createObbFromMbs","halfAxex"],"sources":["../../../src/i3s-converter/helpers/coordinate-converter.ts"],"sourcesContent":["import type {BoundingVolumes, FullExtent, Mbs, Obb} from '@loaders.gl/i3s';\n\nimport {Matrix3, Quaternion, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {\n OrientedBoundingBox,\n makeOrientedBoundingBoxFromPoints,\n makeBoundingSphereFromPoints,\n BoundingSphere\n} from '@math.gl/culling';\nimport {Geoid} from '@math.gl/geoid';\n\n/**\n * Create bounding volumes object from tile and geoid height model.\n * @param sourceBoundingVolume - initialized bounding volume of the source tile\n * @param geoidHeightModel - instance of Geoid class that converts elevation from geoidal to ellipsoidal and back\n * @returns - Bounding volumes object\n */\nexport function createBoundingVolumes(\n sourceBoundingVolume: OrientedBoundingBox | BoundingSphere,\n geoidHeightModel: Geoid\n): BoundingVolumes {\n let radius;\n let halfSize;\n let quaternion;\n\n const cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(\n sourceBoundingVolume.center,\n new Vector3()\n );\n cartographicCenter[2] =\n cartographicCenter[2] -\n geoidHeightModel.getHeight(cartographicCenter[1], cartographicCenter[0]);\n if (sourceBoundingVolume instanceof OrientedBoundingBox) {\n halfSize = sourceBoundingVolume.halfSize;\n radius = new Vector3(halfSize[0], halfSize[1], halfSize[2]).len();\n quaternion = sourceBoundingVolume.quaternion;\n } else {\n radius = sourceBoundingVolume.radius;\n halfSize = [radius, radius, radius];\n quaternion = new Quaternion()\n .fromMatrix3(new Matrix3([halfSize[0], 0, 0, 0, halfSize[1], 0, 0, 0, halfSize[2]]))\n .normalize();\n }\n\n return {\n mbs: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2], radius],\n obb: {\n center: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2]],\n halfSize,\n quaternion\n }\n };\n}\n\n/**\n * Generates bounding volumes from geometry positions\n * @param cartesianPositions\n * @param geoidHeightModel\n */\nexport function createBoundingVolumesFromGeometry(\n cartesianPositions: Float32Array,\n geoidHeightModel: Geoid\n): {mbs: Mbs; obb: Obb} {\n const positionVectors = convertPositionsToVectors(cartesianPositions);\n\n const geometryObb = makeOrientedBoundingBoxFromPoints(positionVectors);\n const geometryMbs = makeBoundingSphereFromPoints(positionVectors);\n\n let mbsCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryMbs.center, new Vector3());\n let obbCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryObb.center, new Vector3());\n\n mbsCenter[2] = mbsCenter[2] - geoidHeightModel.getHeight(mbsCenter[1], mbsCenter[0]);\n obbCenter[2] = obbCenter[2] - geoidHeightModel.getHeight(obbCenter[1], obbCenter[0]);\n\n return {\n mbs: [mbsCenter[0], mbsCenter[1], mbsCenter[2], geometryMbs.radius],\n obb: {\n center: obbCenter,\n halfSize: geometryObb.halfSize,\n quaternion: geometryObb.quaternion\n }\n };\n}\n\n/**\n * Create array of posisitons where each vertex is vector\n * @param {array} positions\n * @returns {Vector3[]}\n */\nexport function convertPositionsToVectors(positions: Float32Array): Vector3[] {\n const result: Vector3[] = [];\n\n for (let i = 0; i < positions.length; i += 3) {\n // TODO: (perf) new Vector3 is not optimal but required in `makeOrientedBoundingBoxFromPoints`.\n // modify `makeOrientedBoundingBoxFromPoints` to use scratch vectors\n const positionVector = new Vector3([positions[i], positions[i + 1], positions[i + 2]]);\n result.push(positionVector);\n }\n\n return result;\n}\n\n/**\n * Convert common coordinate to fullExtent https://github.com/Esri/i3s-spec/blob/master/docs/1.8/fullExtent.cmn.md\n * @param boundingVolume\n * @returns - fullExtent object\n */\nexport function convertBoundingVolumeToI3SFullExtent(\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): FullExtent {\n let sphere: BoundingSphere;\n if (boundingVolume instanceof BoundingSphere) {\n sphere = boundingVolume;\n } else {\n sphere = boundingVolume.getBoundingSphere();\n }\n const center: Vector3 = sphere.center;\n const radius: number = sphere.radius;\n const vertexMax = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] + radius, center[1] + radius, center[2] + radius),\n new Vector3()\n );\n const vertexMin = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] - radius, center[1] - radius, center[2] - radius),\n new Vector3()\n );\n\n // Converter sometimes returns min values that are bigger then max,\n // so we should check and take bigger value from max and smaller for nim\n return {\n xmin: Math.min(vertexMin[0], vertexMax[0]),\n xmax: Math.max(vertexMin[0], vertexMax[0]),\n ymin: Math.min(vertexMin[1], vertexMax[1]),\n ymax: Math.max(vertexMin[1], vertexMax[1]),\n zmin: Math.min(vertexMin[2], vertexMax[2]),\n zmax: Math.max(vertexMin[2], vertexMax[2])\n };\n}\n\n/**\n * Creates oriented boundinb box from mbs.\n * @param mbs - Minimum Bounding Sphere\n * @returns - Oriented Bounding Box\n */\nexport function createObbFromMbs(mbs: Mbs): Obb {\n const radius = mbs[3];\n const center = new Vector3(mbs[0], mbs[1], mbs[2]);\n const halfAxex = new Matrix3([radius, 0, 0, 0, radius, 0, 0, 0, radius]);\n return new OrientedBoundingBox(center, halfAxex);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-scene-server-path.js","names":["v4","uuidv4","transform","join","SCENE_SERVER","sceneServerTemplate","writeFile","createSceneServerPath","layerName","layers0","rootPath","sceneServerData","serviceItemId","replace","sceneServer","nodePagePath","JSON","stringify"],"sources":["../../../src/i3s-converter/helpers/create-scene-server-path.ts"],"sourcesContent":["import type {SceneLayer3D} from '@loaders.gl/i3s';\nimport {v4 as uuidv4} from 'uuid';\nimport transform from 'json-map-transform';\nimport {join} from 'path';\n\nimport {SCENE_SERVER as sceneServerTemplate} from '../json-templates/scene-server';\nimport {writeFile} from '../../lib/utils/file-utils';\n\n/**\n * Form and save sceneServer meta data into a file\n * @param layerName - layer name to display\n * @param layers0 - layer object embedded into sceneServer meta data\n * @param rootPath - root path of new converted tileset\n */\nexport async function createSceneServerPath(\n layerName: string,\n layers0: SceneLayer3D,\n rootPath: string\n): Promise<void> {\n const sceneServerData = {\n serviceItemId: uuidv4().replace(/-/gi, ''),\n layerName,\n layers0\n };\n\n const sceneServer = transform(sceneServerData, sceneServerTemplate());\n const nodePagePath = join(rootPath, 'SceneServer');\n await writeFile(nodePagePath, JSON.stringify(sceneServer));\n}\n"],"mappings":"AACA,SAAQA,EAAE,IAAIC,MAAM,QAAO,MAAM;AACjC,OAAOC,SAAS,MAAM,oBAAoB;AAC1C,SAAQC,IAAI,QAAO,MAAM;AAAC,SAElBC,YAAY,IAAIC,mBAAmB;AAAA,SACnCC,SAAS;AAQjB,OAAO,eAAeC,qBAAqBA,CACzCC,SAAiB,EACjBC,OAAqB,EACrBC,QAAgB,EACD;EACf,MAAMC,eAAe,GAAG;IACtBC,aAAa,EAAEX,MAAM,CAAC,CAAC,CAACY,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC1CL,SAAS;IACTC;EACF,CAAC;EAED,MAAMK,WAAW,GAAGZ,SAAS,CAACS,eAAe,EAAEN,mBAAmB,CAAC,CAAC,CAAC;EACrE,MAAMU,YAAY,GAAGZ,IAAI,CAACO,QAAQ,EAAE,aAAa,CAAC;EAClD,MAAMJ,SAAS,CAACS,YAAY,EAAEC,IAAI,CAACC,SAAS,CAACH,WAAW,CAAC,CAAC;AAC5D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-attributes.js","names":["AttributeType","EXT_FEATURE_METADATA","EXT_STRUCTURAL_METADATA","flattenPropertyTableByFeatureIds","featureIdsMap","propertyTable","resultPropertyTable","propertyName","properties","getPropertiesByFeatureIds","resultProperties","featureIdKey","property","push","checkPropertiesLength","featureIds","needFlatten","attribute","Object","values","length","getAttributeType","STRING_TYPE","Number","isInteger","SHORT_INT_TYPE","DOUBLE_TYPE","getAttributeTypesMapFromPropertyTable","attributeTypesMap","key","firstAttribute","attributeType","getAttributeTypesMapFromSchema","gltfJson","metadataClass","_gltfJson$extensions","_gltfJson$extensions$","_gltfJson$extensions$2","_gltfJson$extensions$3","_gltfJson$extensions2","_gltfJson$extensions3","_gltfJson$extensions4","_gltfJson$extensions5","extFeatureMetadataSchemaClass","extensions","schema","classes","attributeProperty","getAttributeTypeFromExtFeatureMetadata","extStructuralMetadataSchemaClass","getAttributeTypeFromExtStructuralMetadata","type","array","componentType"],"sources":["../../../src/i3s-converter/helpers/feature-attributes.ts"],"sourcesContent":["import type {FeatureTableJson} from '@loaders.gl/3d-tiles';\nimport type {Attribute} from '@loaders.gl/i3s';\nimport type {\n GLTFPostprocessed,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_feature_metadata_ClassProperty,\n GLTF_EXT_structural_metadata_GLTF,\n GLTF_EXT_structural_metadata_ClassProperty\n} from '@loaders.gl/gltf';\n\nimport {AttributeType} from '../types';\n\nimport {EXT_FEATURE_METADATA, EXT_STRUCTURAL_METADATA} from '@loaders.gl/gltf';\n\n/**\n * Takes attributes from property table based on featureIdsMap.\n * If there is no property value for particular featureId (index) the property will be null.\n * Example:\n * Initial data:\n * OBJECTID: {0: 0, 3: 33, 4: 333}\n * component: ['Windows', 'Frames', 'Wall', 'Roof', 'Skylight']\n * Result:\n * OBJECTID: [0, 33, 333]\n * component: ['Windows', 'Roof', 'Skylight']\n * @param featureIdsMap\n * @param propertyTable\n */\nexport function flattenPropertyTableByFeatureIds(\n featureIdsMap: Record<string, number>,\n propertyTable: FeatureTableJson\n): FeatureTableJson {\n const resultPropertyTable: FeatureTableJson = {};\n for (const propertyName in propertyTable) {\n const properties = propertyTable[propertyName];\n resultPropertyTable[propertyName] = getPropertiesByFeatureIds(properties, featureIdsMap);\n }\n\n return resultPropertyTable;\n}\n\n/**\n * Getting properties by featureId index\n * @param properties\n * @param featureIdsMap\n */\nfunction getPropertiesByFeatureIds(\n properties: unknown[],\n featureIdsMap: Record<string, number>\n): unknown[] {\n const resultProperties: unknown[] = [];\n\n if (properties) {\n for (const featureIdKey in featureIdsMap) {\n const property = properties[featureIdKey] || null;\n resultProperties.push(property);\n }\n }\n\n return resultProperties;\n}\n\n/**\n * Check that all attributes in propertyTable have the same length as FeatureIds.\n * If there are differencies between lengths we should flatten property table based on exiesting featureIds.\n * @param featureIds\n * @param propertyTable\n * @returns\n */\nexport function checkPropertiesLength(\n featureIds: number[],\n propertyTable: FeatureTableJson\n): boolean {\n let needFlatten = false;\n\n for (const attribute of Object.values(propertyTable)) {\n if (!featureIds || !attribute || featureIds.length !== attribute.length) {\n needFlatten = true;\n }\n }\n\n return needFlatten;\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 attribute - attribute taken from propertyTable\n */\nexport function getAttributeType(attribute: unknown): string {\n if (typeof attribute === 'string' || typeof attribute === 'bigint') {\n return AttributeType.STRING_TYPE;\n } else if (typeof attribute === 'number') {\n return Number.isInteger(attribute) ? AttributeType.SHORT_INT_TYPE : AttributeType.DOUBLE_TYPE;\n }\n return AttributeType.STRING_TYPE;\n}\n\n/**\n * Gets attribute's types based on the property table records.\n * @param propertyTable - Table with layer meta data.\n * @returns set of attribute types\n * @example of returned object:\n * {\n * \"opt_uint8\": \"Int32\",\n * \"opt_uint64\": \"string\"\n * }\n */\nexport function getAttributeTypesMapFromPropertyTable(\n propertyTable: FeatureTableJson\n): Record<string, Attribute> {\n const attributeTypesMap: Record<string, Attribute> = {};\n for (const key in propertyTable) {\n // Get attribute type based on the first element of each property.\n const firstAttribute = propertyTable[key][0];\n const attributeType = getAttributeType(firstAttribute);\n attributeTypesMap[key] = attributeType;\n }\n return attributeTypesMap;\n}\n\n/**\n * Gets attribute's types from the extension schema selected by the class name 'metadataClass'.\n * @param gltfJson - JSON part of GLB content\n * @param metadataClass - name of the schema class\n * @returns set of attribute's types\n * @example of returned object:\n * {\n * \"opt_uint8\": \"Int32\",\n * \"opt_uint64\": \"string\"\n * }\n */\nexport const getAttributeTypesMapFromSchema = (\n gltfJson: GLTFPostprocessed,\n metadataClass: string\n): Record<string, Attribute> | null => {\n const attributeTypesMap: Record<string, Attribute> = {};\n const extFeatureMetadataSchemaClass = (\n gltfJson.extensions?.[EXT_FEATURE_METADATA] as GLTF_EXT_feature_metadata_GLTF\n )?.schema?.classes?.[metadataClass];\n if (extFeatureMetadataSchemaClass) {\n for (let propertyName in extFeatureMetadataSchemaClass.properties) {\n const property = extFeatureMetadataSchemaClass.properties[propertyName];\n const attributeProperty = getAttributeTypeFromExtFeatureMetadata(property);\n attributeTypesMap[propertyName] = attributeProperty;\n }\n return attributeTypesMap;\n }\n\n const extStructuralMetadataSchemaClass = (\n gltfJson.extensions?.[EXT_STRUCTURAL_METADATA] as GLTF_EXT_structural_metadata_GLTF\n )?.schema?.classes?.[metadataClass];\n if (extStructuralMetadataSchemaClass) {\n for (let propertyName in extStructuralMetadataSchemaClass.properties) {\n const property = extStructuralMetadataSchemaClass.properties[propertyName];\n const attributeProperty = getAttributeTypeFromExtStructuralMetadata(property);\n attributeTypesMap[propertyName] = attributeProperty;\n }\n return attributeTypesMap;\n }\n\n return null;\n};\n\n/**\n * Gets the attribute type according to the Ext_feature_metadata extension class schema\n * @see https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param property - schema of the class property for Ext_feature_metadata\n * @returns attribute's type\n */\nconst getAttributeTypeFromExtFeatureMetadata = (\n property: GLTF_EXT_feature_metadata_ClassProperty\n): Attribute => {\n let attributeType: Attribute;\n switch (property.type) {\n case 'INT8':\n case 'UINT8':\n case 'INT16':\n case 'UINT16':\n case 'INT32':\n case 'UINT32':\n attributeType = AttributeType.SHORT_INT_TYPE;\n break;\n\n case 'FLOAT32':\n case 'FLOAT64':\n attributeType = AttributeType.DOUBLE_TYPE;\n break;\n\n case 'INT64':\n case 'UINT64':\n case 'BOOLEAN':\n case 'ENUM':\n case 'STRING':\n case 'ARRAY':\n attributeType = AttributeType.STRING_TYPE;\n break;\n\n default:\n attributeType = AttributeType.STRING_TYPE;\n break;\n }\n return attributeType;\n};\n\n/**\n * Gets the attribute type according to the Ext_structural_metadata extension class schema\n * @see https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param property - schema of the class property for Ext_structural_metadata\n * @returns attribute's type\n */\nconst getAttributeTypeFromExtStructuralMetadata = (\n property: GLTF_EXT_structural_metadata_ClassProperty\n): Attribute => {\n let attributeType: Attribute;\n if (property.array) {\n attributeType = AttributeType.STRING_TYPE;\n } else {\n switch (property.componentType) {\n case 'INT8':\n case 'UINT8':\n case 'INT16':\n case 'UINT16':\n case 'INT32':\n case 'UINT32':\n attributeType = AttributeType.SHORT_INT_TYPE;\n break;\n\n case 'FLOAT32':\n case 'FLOAT64':\n attributeType = AttributeType.DOUBLE_TYPE;\n break;\n\n case 'INT64':\n case 'UINT64':\n attributeType = AttributeType.STRING_TYPE;\n break;\n\n default:\n attributeType = AttributeType.STRING_TYPE;\n break;\n }\n }\n return attributeType;\n};\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"geometry-attributes.js","names":["concatenateTypedArrays","VALUES_PER_VERTEX","POSITIONS_AND_NORMALS_PER_TRIANGLE","generateAttributes","attributes","positions","normals","texCoords","colors","uvRegions","featureIndices","triangleCount","length","faceRange","Uint32Array","featureIds","featureCount","data","calculateFaceRangesAndFeaturesCount","attributeObjects","makeAttributeObjects","unifiedAttributeObjectsByFeatureIds","unifyObjectsByFeatureId","groupedAttributes","groupAttributesAndRangesByFeatureId","rangeIndex","featureIndex","currentFeatureId","getFrequentValue","slice","faceRangeList","uniqueFeatureIds","index","newFeatureId","includes","push","values","map","mostFrequentValue","maxCount","value","groupedData","positionsList","Float32Array","normalsList","colorsList","Uint8Array","texCoordsList","uvRegionsList","Uint16Array","positionsOffset","normalsOffset","colorsOffset","uvRegionsOffset","texCoordsOffset","startIndex","endIndex","positionsCount","getSliceAttributeCount","normalsCount","colorsCount","uvRegionsCount","texCoordsCount","featureId","subarray","attributeName","itemsPerVertex4","texCoordsPerVertex","trianglesCount","vertexCount","sortedData","groupedMetadata","existingObject","find","obj","uniqueObjects","metatada","concatenateAttributes","unifiedObjects","firstAttributeObject","range","objIndex","sum","currentAttributesObject","groupedObject","positionGroups","_ref","normalGroups","_ref2","colorGroups","_ref3","texCoordGroups","_ref4","uvRegionGroups","_ref5"],"sources":["../../../src/i3s-converter/helpers/geometry-attributes.ts"],"sourcesContent":["import type {\n GeometryAttributes,\n ConvertedAttributes,\n GroupedByFeatureIdAttributes,\n GroupedAttributes\n} from '../types';\nimport {concatenateTypedArrays} from '@loaders.gl/loader-utils';\n\nconst VALUES_PER_VERTEX = 3;\nconst POSITIONS_AND_NORMALS_PER_TRIANGLE = 9;\n\n/**\n * Generate geometry attributes with faceRange and featureCount\n * @param attributes\n * @returns attirbutes with featureCount, featureIds and changed faceRange.\n */\nexport function generateAttributes(attributes: ConvertedAttributes): GeometryAttributes {\n const {positions, normals, texCoords, colors, uvRegions, featureIndices} = attributes;\n const triangleCount = positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE;\n\n if (!featureIndices.length) {\n return {\n faceRange: new Uint32Array([0, triangleCount - 1]),\n featureIds: [0],\n featureCount: 1,\n positions,\n normals,\n texCoords,\n colors,\n uvRegions\n };\n }\n\n const data = calculateFaceRangesAndFeaturesCount(featureIndices);\n const attributeObjects = makeAttributeObjects({...data, ...attributes});\n const unifiedAttributeObjectsByFeatureIds = unifyObjectsByFeatureId(attributeObjects);\n const groupedAttributes = groupAttributesAndRangesByFeatureId(\n unifiedAttributeObjectsByFeatureIds,\n data.featureCount\n );\n return groupedAttributes;\n}\n\n/**\n * Calculates face Ranges and feature count based on featureIndices.\n * @param featureIndices\n * @returns Object with featureCount, reordered attributes and changed faceRange.\n */\nfunction calculateFaceRangesAndFeaturesCount(featureIndices: number[]): {\n faceRange: Uint32Array;\n featureCount: number;\n featureIds: number[];\n} {\n let rangeIndex = 1;\n let featureIndex = 1;\n let currentFeatureId = getFrequentValue(featureIndices.slice(0, VALUES_PER_VERTEX));\n const faceRangeList: any[] = [];\n const featureIds: any[] = [];\n const uniqueFeatureIds = [currentFeatureId];\n\n faceRangeList[0] = 0;\n featureIds[0] = currentFeatureId;\n\n for (let index = VALUES_PER_VERTEX; index < featureIndices.length; index += VALUES_PER_VERTEX) {\n const newFeatureId = getFrequentValue(featureIndices.slice(index, index + VALUES_PER_VERTEX));\n if (currentFeatureId !== newFeatureId) {\n faceRangeList[rangeIndex] = index / VALUES_PER_VERTEX - 1;\n faceRangeList[rangeIndex + 1] = index / VALUES_PER_VERTEX;\n featureIds[featureIndex] = newFeatureId;\n\n if (!uniqueFeatureIds.includes(newFeatureId)) {\n uniqueFeatureIds.push(newFeatureId);\n }\n\n rangeIndex += 2;\n featureIndex += 1;\n }\n currentFeatureId = newFeatureId;\n }\n\n faceRangeList[rangeIndex] = featureIndices.length / VALUES_PER_VERTEX - 1;\n\n const faceRange = new Uint32Array(faceRangeList);\n const featureCount = uniqueFeatureIds.length;\n\n return {faceRange, featureCount, featureIds};\n}\n\n/**\n * Find most frequent value to avoid situation where one vertex can be part of multiple features (objects).\n * @param values\n */\nfunction getFrequentValue(values: number[]): number {\n const map: {[key: number]: number} = {};\n\n let mostFrequentValue = values[0];\n let maxCount = 1;\n\n for (const value of values) {\n // Save item and it's frequency count to the map.\n map[value] = (map[value] || 0) + 1;\n // Find max count of frequency.\n maxCount = maxCount > map[value] ? maxCount : map[value];\n // Find the most frequent value.\n mostFrequentValue = maxCount > map[value] ? mostFrequentValue : value;\n }\n\n return mostFrequentValue;\n}\n\n/**\n * Generate list of attribute object grouped by feature ids.\n * @param attributes\n * @returns sorted list of attribute objects.\n */\nfunction makeAttributeObjects(attributes: GeometryAttributes): GroupedByFeatureIdAttributes[] {\n const {\n featureIds,\n positions,\n normals,\n colors,\n uvRegions,\n texCoords,\n faceRange = new Uint32Array(0)\n } = attributes;\n const groupedData: GroupedByFeatureIdAttributes[] = [];\n\n let positionsList = new Float32Array(positions);\n let normalsList = new Float32Array(normals);\n let colorsList = new Uint8Array(colors);\n let texCoordsList = new Float32Array(texCoords);\n let uvRegionsList = new Uint16Array(uvRegions);\n let positionsOffset = 0;\n let normalsOffset = 0;\n let colorsOffset = 0;\n let uvRegionsOffset = 0;\n let texCoordsOffset = 0;\n\n for (let index = 0; index < featureIds.length; index++) {\n const startIndex = faceRange[index * 2];\n const endIndex = faceRange[index * 2 + 1];\n\n const positionsCount = getSliceAttributeCount('positions', startIndex, endIndex);\n const normalsCount = getSliceAttributeCount('normals', startIndex, endIndex);\n const colorsCount = getSliceAttributeCount('colors', startIndex, endIndex);\n const uvRegionsCount = getSliceAttributeCount('uvRegions', startIndex, endIndex);\n const texCoordsCount = getSliceAttributeCount('texCoords', startIndex, endIndex);\n\n groupedData.push({\n featureId: featureIds[index],\n positions: positionsList.subarray(positionsOffset, positionsOffset + positionsCount),\n normals: normalsList.subarray(normalsOffset, normalsOffset + normalsCount),\n colors: colorsList.subarray(colorsOffset, colorsOffset + colorsCount),\n uvRegions: uvRegionsList.subarray(uvRegionsOffset, uvRegionsOffset + uvRegionsCount),\n texCoords: texCoordsList.subarray(texCoordsOffset, texCoordsOffset + texCoordsCount)\n });\n\n positionsOffset += positionsCount;\n normalsOffset += normalsCount;\n colorsOffset += colorsCount;\n uvRegionsOffset += uvRegionsCount;\n texCoordsOffset += texCoordsCount;\n }\n\n return groupedData;\n}\n\n/**\n * Generate sliced count for generating attribute objects depends on attribute name and range.\n * @param attributeName\n * @param startIndex\n * @param endIndex\n * @returns sliced count\n */\nfunction getSliceAttributeCount(\n attributeName: string,\n startIndex: number,\n endIndex: number\n): number {\n const itemsPerVertex4 = 4;\n const texCoordsPerVertex = 2;\n\n const trianglesCount = endIndex - startIndex + 1;\n const vertexCount = trianglesCount * 3;\n\n switch (attributeName) {\n case 'positions':\n case 'normals':\n return trianglesCount * POSITIONS_AND_NORMALS_PER_TRIANGLE;\n case 'colors':\n case 'uvRegions':\n return vertexCount * itemsPerVertex4;\n case 'texCoords':\n return vertexCount * texCoordsPerVertex;\n default:\n return 0;\n }\n}\n\n/**\n * Generates unique object list depends on feature ids and concantenate their attributes.\n * @param sortedData\n * @returns unique list of objects\n */\nfunction unifyObjectsByFeatureId(\n sortedData: GroupedByFeatureIdAttributes[]\n): GroupedByFeatureIdAttributes[] {\n const groupedMetadata: {\n featureId: number;\n attributes: GroupedByFeatureIdAttributes[];\n }[] = [];\n for (const data of sortedData) {\n const existingObject = groupedMetadata.find((obj) => obj.featureId === data.featureId);\n if (existingObject) {\n existingObject.attributes.push(data);\n } else {\n groupedMetadata.push({\n featureId: data.featureId,\n attributes: [data]\n });\n }\n }\n\n const uniqueObjects: GroupedByFeatureIdAttributes[] = [];\n for (const metatada of groupedMetadata) {\n const attributes = concatenateAttributes(metatada.attributes);\n\n uniqueObjects.push({\n featureId: metatada.featureId,\n ...attributes\n });\n }\n\n return uniqueObjects;\n}\n\n/**\n * Generates attribute objects with new faceRange and reordered attributes.\n * @param unifiedObjects\n * @returns generated attributes with new faceRange.\n */\nfunction groupAttributesAndRangesByFeatureId(\n unifiedObjects: GroupedByFeatureIdAttributes[],\n featureCount: number\n): GeometryAttributes {\n const firstAttributeObject = unifiedObjects[0];\n const featureIds = [firstAttributeObject.featureId || 0];\n const range = [0];\n\n let objIndex = 0;\n let sum = 0;\n\n for (let index = 1; index < unifiedObjects.length; index++) {\n const currentAttributesObject = unifiedObjects[index];\n featureIds.push(currentAttributesObject.featureId || 0);\n\n const groupedObject = unifiedObjects[objIndex];\n range.push(groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE - 1 + sum);\n range.push(groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE + sum);\n\n sum += groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE;\n objIndex += 1;\n }\n\n const attributes = concatenateAttributes(unifiedObjects);\n\n range.push(attributes.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE - 1);\n\n const faceRange = new Uint32Array(range);\n return {faceRange, featureIds, featureCount, ...attributes};\n}\n\n/**\n * Concatenate attributes typed arrays\n * @param attributes - grouped by featureId typed arrays\n * @returns - concatenated typed array list\n */\nfunction concatenateAttributes(attributes: GroupedByFeatureIdAttributes[]): GroupedAttributes {\n const positionGroups = attributes.map(({positions}) => positions);\n const positions =\n positionGroups.length > 1 ? concatenateTypedArrays(...positionGroups) : positionGroups[0];\n\n const normalGroups = attributes.map(({normals}) => normals);\n const normals =\n normalGroups.length > 1 ? concatenateTypedArrays(...normalGroups) : normalGroups[0];\n\n const colorGroups = attributes.map(({colors}) => colors);\n const colors = colorGroups.length > 1 ? concatenateTypedArrays(...colorGroups) : colorGroups[0];\n\n const texCoordGroups = attributes.map(({texCoords}) => texCoords);\n const texCoords =\n texCoordGroups.length > 1 ? concatenateTypedArrays(...texCoordGroups) : texCoordGroups[0];\n\n const uvRegionGroups = attributes.map(({uvRegions}) => uvRegions);\n const uvRegions =\n uvRegionGroups.length > 1 ? concatenateTypedArrays(...uvRegionGroups) : uvRegionGroups[0];\n return {\n positions,\n normals,\n colors,\n texCoords,\n uvRegions\n };\n}\n"],"mappings":"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"}