@loaders.gl/tile-converter 4.2.0-alpha.4 → 4.2.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +4 -4
  2. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
  3. package/dist/3d-tiles-converter/3d-tiles-converter.js +349 -293
  4. package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -1
  5. package/dist/3d-tiles-converter/helpers/b3dm-converter.js +261 -200
  6. package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +14 -5
  7. package/dist/3d-tiles-converter/helpers/load-i3s.d.ts.map +1 -1
  8. package/dist/3d-tiles-converter/helpers/load-i3s.js +83 -77
  9. package/dist/3d-tiles-converter/helpers/texture-atlas.js +44 -21
  10. package/dist/3d-tiles-converter/json-templates/tileset.js +32 -33
  11. package/dist/constants.js +0 -1
  12. package/dist/converter-cli.js +257 -234
  13. package/dist/converter.min.cjs +95 -105
  14. package/dist/deps-installer/deps-installer.d.ts.map +1 -1
  15. package/dist/deps-installer/deps-installer.js +78 -59
  16. package/dist/i3s-converter/helpers/attribute-metadata-info.js +210 -153
  17. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +1 -1
  18. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
  19. package/dist/i3s-converter/helpers/batch-ids-extensions.js +146 -103
  20. package/dist/i3s-converter/helpers/coordinate-converter.js +100 -65
  21. package/dist/i3s-converter/helpers/create-scene-server-path.js +14 -9
  22. package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -1
  23. package/dist/i3s-converter/helpers/feature-attributes.js +170 -105
  24. package/dist/i3s-converter/helpers/geometry-attributes.d.ts +1 -1
  25. package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
  26. package/dist/i3s-converter/helpers/geometry-attributes.js +205 -212
  27. package/dist/i3s-converter/helpers/geometry-converter.d.ts +17 -3
  28. package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
  29. package/dist/i3s-converter/helpers/geometry-converter.js +1189 -830
  30. package/dist/i3s-converter/helpers/gltf-attributes.d.ts +1 -1
  31. package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
  32. package/dist/i3s-converter/helpers/gltf-attributes.js +109 -97
  33. package/dist/i3s-converter/helpers/load-3d-tiles.js +103 -66
  34. package/dist/i3s-converter/helpers/node-debug.js +98 -54
  35. package/dist/i3s-converter/helpers/node-index-document.d.ts +11 -4
  36. package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -1
  37. package/dist/i3s-converter/helpers/node-index-document.js +255 -177
  38. package/dist/i3s-converter/helpers/node-pages.d.ts +1 -1
  39. package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
  40. package/dist/i3s-converter/helpers/node-pages.js +299 -193
  41. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts +1 -1
  42. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -1
  43. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +92 -60
  44. package/dist/i3s-converter/helpers/progress.d.ts.map +1 -1
  45. package/dist/i3s-converter/helpers/progress.js +139 -83
  46. package/dist/i3s-converter/helpers/tileset-traversal.d.ts +9 -2
  47. package/dist/i3s-converter/helpers/tileset-traversal.d.ts.map +1 -1
  48. package/dist/i3s-converter/helpers/tileset-traversal.js +33 -13
  49. package/dist/i3s-converter/i3s-converter.d.ts +7 -7
  50. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  51. package/dist/i3s-converter/i3s-converter.js +1165 -895
  52. package/dist/i3s-converter/json-templates/geometry-definitions.js +70 -79
  53. package/dist/i3s-converter/json-templates/layers.js +120 -121
  54. package/dist/i3s-converter/json-templates/metadata.js +19 -20
  55. package/dist/i3s-converter/json-templates/node.js +73 -71
  56. package/dist/i3s-converter/json-templates/scene-server.js +25 -26
  57. package/dist/i3s-converter/json-templates/shared-resources.js +107 -108
  58. package/dist/i3s-converter/json-templates/store.js +96 -94
  59. package/dist/i3s-converter/types.js +35 -23
  60. package/dist/i3s-server/app.js +15 -12
  61. package/dist/i3s-server/bin/i3s-server.min.cjs +69 -69
  62. package/dist/i3s-server/bin/www.js +16 -7
  63. package/dist/i3s-server/controllers/index-controller.js +18 -15
  64. package/dist/i3s-server/controllers/slpk-controller.d.ts.map +1 -1
  65. package/dist/i3s-server/controllers/slpk-controller.js +24 -11
  66. package/dist/i3s-server/routes/index.js +13 -9
  67. package/dist/i3s-server/routes/slpk-router.d.ts.map +1 -1
  68. package/dist/i3s-server/routes/slpk-router.js +26 -19
  69. package/dist/i3s-server/utils/create-scene-server.js +15 -10
  70. package/dist/i3s-server/utils/server-utils.d.ts.map +1 -1
  71. package/dist/i3s-server/utils/server-utils.js +52 -32
  72. package/dist/index.cjs +616 -967
  73. package/dist/index.cjs.map +7 -0
  74. package/dist/index.d.ts +2 -2
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +0 -1
  77. package/dist/lib/json-schemas/conversion-dump-json-schema.js +243 -421
  78. package/dist/lib/utils/cli-utils.d.ts.map +1 -1
  79. package/dist/lib/utils/cli-utils.js +65 -36
  80. package/dist/lib/utils/compress-util.js +20 -15
  81. package/dist/lib/utils/conversion-dump.d.ts +10 -2
  82. package/dist/lib/utils/conversion-dump.d.ts.map +1 -1
  83. package/dist/lib/utils/conversion-dump.js +242 -197
  84. package/dist/lib/utils/file-utils.d.ts +1 -1
  85. package/dist/lib/utils/file-utils.d.ts.map +1 -1
  86. package/dist/lib/utils/file-utils.js +120 -74
  87. package/dist/lib/utils/geometry-utils.js +13 -7
  88. package/dist/lib/utils/lod-conversion-utils.js +65 -33
  89. package/dist/lib/utils/queue.js +12 -13
  90. package/dist/lib/utils/statistic-utills.d.ts +6 -23
  91. package/dist/lib/utils/statistic-utills.d.ts.map +1 -1
  92. package/dist/lib/utils/statistic-utills.js +58 -55
  93. package/dist/lib/utils/write-queue.d.ts +2 -2
  94. package/dist/lib/utils/write-queue.d.ts.map +1 -1
  95. package/dist/lib/utils/write-queue.js +72 -86
  96. package/dist/pgm-loader.js +17 -13
  97. package/dist/slpk-extractor/slpk-extractor.d.ts.map +1 -1
  98. package/dist/slpk-extractor/slpk-extractor.js +60 -50
  99. package/dist/slpk-extractor-cli.d.ts.map +1 -1
  100. package/dist/slpk-extractor-cli.js +90 -59
  101. package/dist/slpk-extractor.min.cjs +1 -1
  102. package/package.json +27 -26
  103. package/src/3d-tiles-converter/3d-tiles-converter.ts +21 -10
  104. package/src/3d-tiles-converter/helpers/b3dm-converter.ts +1 -0
  105. package/src/3d-tiles-converter/helpers/load-i3s.ts +3 -27
  106. package/src/converter-cli.ts +4 -2
  107. package/src/deps-installer/deps-installer.ts +7 -0
  108. package/src/i3s-converter/helpers/attribute-metadata-info.ts +1 -1
  109. package/src/i3s-converter/helpers/batch-ids-extensions.ts +3 -1
  110. package/src/i3s-converter/helpers/coordinate-converter.ts +2 -2
  111. package/src/i3s-converter/helpers/feature-attributes.ts +5 -2
  112. package/src/i3s-converter/helpers/geometry-attributes.ts +6 -5
  113. package/src/i3s-converter/helpers/geometry-converter.ts +118 -72
  114. package/src/i3s-converter/helpers/gltf-attributes.ts +12 -13
  115. package/src/i3s-converter/helpers/node-index-document.ts +18 -10
  116. package/src/i3s-converter/helpers/node-pages.ts +27 -29
  117. package/src/i3s-converter/helpers/preprocess-3d-tiles.ts +1 -0
  118. package/src/i3s-converter/helpers/progress.ts +1 -0
  119. package/src/i3s-converter/helpers/tileset-traversal.ts +22 -13
  120. package/src/i3s-converter/i3s-converter.ts +173 -114
  121. package/src/i3s-converter/json-templates/node.ts +1 -1
  122. package/src/i3s-server/bin/www.ts +6 -4
  123. package/src/i3s-server/controllers/slpk-controller.ts +4 -2
  124. package/src/i3s-server/routes/index.ts +10 -7
  125. package/src/i3s-server/routes/slpk-router.ts +22 -16
  126. package/src/i3s-server/utils/server-utils.ts +6 -4
  127. package/src/lib/utils/cli-utils.ts +2 -0
  128. package/src/lib/utils/conversion-dump.ts +35 -20
  129. package/src/lib/utils/file-utils.ts +11 -11
  130. package/src/lib/utils/statistic-utills.ts +5 -6
  131. package/src/lib/utils/write-queue.ts +2 -2
  132. package/src/slpk-extractor/slpk-extractor.ts +2 -1
  133. package/src/slpk-extractor-cli.ts +16 -8
  134. package/dist/3d-tiles-converter/3d-tiles-converter.js.map +0 -1
  135. package/dist/3d-tiles-converter/helpers/b3dm-converter.js.map +0 -1
  136. package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +0 -1
  137. package/dist/3d-tiles-converter/helpers/load-i3s.js.map +0 -1
  138. package/dist/3d-tiles-converter/helpers/texture-atlas.js.map +0 -1
  139. package/dist/3d-tiles-converter/json-templates/tileset.js.map +0 -1
  140. package/dist/constants.js.map +0 -1
  141. package/dist/converter-cli.js.map +0 -1
  142. package/dist/deps-installer/deps-installer.js.map +0 -1
  143. package/dist/i3s-converter/helpers/attribute-metadata-info.js.map +0 -1
  144. package/dist/i3s-converter/helpers/batch-ids-extensions.js.map +0 -1
  145. package/dist/i3s-converter/helpers/coordinate-converter.js.map +0 -1
  146. package/dist/i3s-converter/helpers/create-scene-server-path.js.map +0 -1
  147. package/dist/i3s-converter/helpers/feature-attributes.js.map +0 -1
  148. package/dist/i3s-converter/helpers/geometry-attributes.js.map +0 -1
  149. package/dist/i3s-converter/helpers/geometry-converter.js.map +0 -1
  150. package/dist/i3s-converter/helpers/gltf-attributes.js.map +0 -1
  151. package/dist/i3s-converter/helpers/load-3d-tiles.js.map +0 -1
  152. package/dist/i3s-converter/helpers/node-debug.js.map +0 -1
  153. package/dist/i3s-converter/helpers/node-index-document.js.map +0 -1
  154. package/dist/i3s-converter/helpers/node-pages.js.map +0 -1
  155. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js.map +0 -1
  156. package/dist/i3s-converter/helpers/progress.js.map +0 -1
  157. package/dist/i3s-converter/helpers/tileset-traversal.js.map +0 -1
  158. package/dist/i3s-converter/i3s-converter.js.map +0 -1
  159. package/dist/i3s-converter/json-templates/geometry-definitions.js.map +0 -1
  160. package/dist/i3s-converter/json-templates/layers.js.map +0 -1
  161. package/dist/i3s-converter/json-templates/metadata.js.map +0 -1
  162. package/dist/i3s-converter/json-templates/node.js.map +0 -1
  163. package/dist/i3s-converter/json-templates/scene-server.js.map +0 -1
  164. package/dist/i3s-converter/json-templates/shared-resources.js.map +0 -1
  165. package/dist/i3s-converter/json-templates/store.js.map +0 -1
  166. package/dist/i3s-converter/types.js.map +0 -1
  167. package/dist/i3s-server/README.md +0 -63
  168. package/dist/i3s-server/app.js.map +0 -1
  169. package/dist/i3s-server/bin/www.js.map +0 -1
  170. package/dist/i3s-server/certs/cert.pem +0 -19
  171. package/dist/i3s-server/certs/key.pem +0 -27
  172. package/dist/i3s-server/controllers/index-controller.js.map +0 -1
  173. package/dist/i3s-server/controllers/slpk-controller.js.map +0 -1
  174. package/dist/i3s-server/routes/index.js.map +0 -1
  175. package/dist/i3s-server/routes/slpk-router.js.map +0 -1
  176. package/dist/i3s-server/utils/create-scene-server.js.map +0 -1
  177. package/dist/i3s-server/utils/server-utils.js.map +0 -1
  178. package/dist/index.js.map +0 -1
  179. package/dist/lib/json-schemas/conversion-dump-json-schema.js.map +0 -1
  180. package/dist/lib/utils/cli-utils.js.map +0 -1
  181. package/dist/lib/utils/compress-util.js.map +0 -1
  182. package/dist/lib/utils/conversion-dump.js.map +0 -1
  183. package/dist/lib/utils/file-utils.js.map +0 -1
  184. package/dist/lib/utils/geometry-utils.js.map +0 -1
  185. package/dist/lib/utils/lod-conversion-utils.js.map +0 -1
  186. package/dist/lib/utils/queue.js.map +0 -1
  187. package/dist/lib/utils/statistic-utills.js.map +0 -1
  188. package/dist/lib/utils/write-queue.js.map +0 -1
  189. package/dist/pgm-loader.js.map +0 -1
  190. package/dist/slpk-extractor/slpk-extractor.js.map +0 -1
  191. package/dist/slpk-extractor-cli.js.map +0 -1
  192. package/src/lib/utils/statistic-utills.d.ts +0 -25
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-3d-tiles.js","names":["Tiles3DArchive","load","FileHandleFile","CD_HEADER_SIGNATURE","ZipFileSystem","parseHashTable","parseZipCDFileHeader","parseZipLocalFileHeader","searchFromTheEnd","loadNestedTileset","sourceTileset","sourceTile","tilesetLoadOptions","isTileset","isNestedTileset","contentUrl","loadOptions","loader","id","assetGltfUpAxis","asset","gltfUpAxis","tileContent","loadFromArchive","root","children","loadTile3DContent","url","tz3UrlParts","split","filename","length","slice","Error","tz3Path","fileProvider","hashTable","loadHashTable","archive","fileSystem","content","fetch","bind","destroy","tile","type","hashCDOffset","cdFileHeader","fileName","localFileHeader","localHeaderOffset","fileDataOffset","hashFile","compressedSize"],"sources":["../../../src/i3s-converter/helpers/load-3d-tiles.ts"],"sourcesContent":["import type {\n Tiles3DLoaderOptions,\n Tiles3DTileContent,\n Tiles3DTileJSONPostprocessed,\n Tiles3DTilesetJSONPostprocessed\n} from '@loaders.gl/3d-tiles';\nimport {Tiles3DArchive} from '@loaders.gl/3d-tiles';\nimport {LoaderWithParser, load} from '@loaders.gl/core';\nimport {FileHandleFile, FileProvider} from '@loaders.gl/loader-utils';\nimport {\n CD_HEADER_SIGNATURE,\n ZipFileSystem,\n parseHashTable,\n parseZipCDFileHeader,\n parseZipLocalFileHeader,\n searchFromTheEnd\n} from '@loaders.gl/zip';\n\n/**\n * Load nested 3DTiles tileset. If the sourceTile is not nested tileset - do nothing\n * @param sourceTileset - source root tileset JSON\n * @param sourceTile - source tile JSON that is supposed to has link to nested tileset\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns nothing\n */\nexport const loadNestedTileset = async (\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null,\n sourceTile: Tiles3DTileJSONPostprocessed,\n tilesetLoadOptions: Tiles3DLoaderOptions\n): Promise<void> => {\n const isTileset = isNestedTileset(sourceTile);\n if (!sourceTileset || !sourceTile.contentUrl || !isTileset) {\n return;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n [sourceTileset.loader.id]: {\n isTileset,\n assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'\n }\n };\n const tileContent = await loadFromArchive(\n sourceTile.contentUrl,\n sourceTileset.loader,\n loadOptions\n );\n\n if (tileContent.root) {\n sourceTile.children = [tileContent.root];\n }\n};\n\n/**\n * Load 3DTiles tile content, that includes glTF object\n * @param sourceTileset - source root tileset JSON\n * @param sourceTile - source tile JSON that has link to content data\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns - 3DTiles tile content or null\n */\nexport const loadTile3DContent = async (\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null,\n sourceTile: Tiles3DTileJSONPostprocessed,\n tilesetLoadOptions: Tiles3DLoaderOptions\n): Promise<Tiles3DTileContent | null> => {\n const isTileset = isNestedTileset(sourceTile);\n if (!sourceTileset || !sourceTile.contentUrl || isTileset) {\n return null;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n [sourceTileset.loader.id]: {\n // @ts-ignore\n ...(tilesetLoadOptions[sourceTileset.loader.id] || {}),\n isTileset,\n assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'\n }\n };\n const tileContent = await loadFromArchive(\n sourceTile.contentUrl,\n sourceTileset.loader,\n loadOptions\n );\n\n return tileContent;\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 - 3d-tiles loader options\n * @returns 3d-tiles resource\n */\nexport async function loadFromArchive(\n url: string,\n loader: LoaderWithParser,\n loadOptions: Tiles3DLoaderOptions\n) {\n const tz3UrlParts = url.split('.3tz');\n let filename: string | null;\n // No '.3tz'. The file will be loaded with global fetch function\n if (tz3UrlParts.length === 1) {\n filename = null;\n } else if (tz3UrlParts.length === 2) {\n filename = tz3UrlParts[1].slice(1);\n if (filename === '') {\n filename = 'tileset.json';\n }\n } else {\n throw new Error('Unexpected URL format');\n }\n if (filename) {\n const tz3Path = `${tz3UrlParts[0]}.3tz`;\n const fileProvider = new FileHandleFile(tz3Path);\n const hashTable = await loadHashTable(fileProvider);\n const archive = new Tiles3DArchive(fileProvider, hashTable, tz3Path);\n const fileSystem = new ZipFileSystem(archive);\n const content = await load(filename, loader, {\n ...loadOptions,\n fetch: fileSystem.fetch.bind(fileSystem)\n });\n await fileSystem.destroy();\n return content;\n }\n return await load(url, loader, loadOptions);\n}\n\n/**\n * Check if tile is nested tileset\n * @param tile - 3DTiles header data\n * @returns true if tile is nested tileset\n */\nexport function isNestedTileset(tile: Tiles3DTileJSONPostprocessed) {\n return tile?.type === 'json' || tile?.type === '3tz';\n}\n\n/**\n * Load hash file from 3TZ\n * @param fileProvider - binary reader of 3TZ\n * @returns hash table of the 3TZ file content or undefined if the hash file is not presented inside\n */\nasync function loadHashTable(\n fileProvider: FileProvider\n): Promise<undefined | Record<string, bigint>> {\n let hashTable: undefined | Record<string, bigint>;\n\n const hashCDOffset = await searchFromTheEnd(fileProvider, CD_HEADER_SIGNATURE);\n\n const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider);\n\n // '@3dtilesIndex1@' is index file that must be the last in the archive. It allows\n // to improve load and read performance when the archive contains a very large number\n // of files.\n if (cdFileHeader?.fileName === '@3dtilesIndex1@') {\n const localFileHeader = await parseZipLocalFileHeader(\n cdFileHeader.localHeaderOffset,\n fileProvider\n );\n if (!localFileHeader) {\n throw new Error('corrupted 3tz');\n }\n\n const fileDataOffset = localFileHeader.fileDataOffset;\n const hashFile = await fileProvider.slice(\n fileDataOffset,\n fileDataOffset + localFileHeader.compressedSize\n );\n\n hashTable = parseHashTable(hashFile);\n }\n\n return hashTable;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-debug.js","names":["OrientedBoundingBox","BoundingSphere","Vector3","Ellipsoid","CUBE_POSITIONS","Float32Array","validateNodeBoundingVolumes","node","_node$parentNode","_node$parentNode2","parentNode","obb","mbs","tileWarnings","validateObb","validateMbs","_node$parentNode3","parentObb","createBoundingBoxFromTileObb","tileVertices","getTileObbVertices","isTileObbInsideParentObb","isAllVerticesInsideBoundingVolume","title","id","push","tileMbs","createBoundingSphereFromTileMbs","parentMbs","distanceBetweenCenters","center","distanceTo","radius","_node$parentNode4","halfSize","quaternion","fromCenterHalfSizeQuaternion","positions","obbCenterCartesian","WGS84","cartographicToCartesian","vertices","i","length","positionsVector","rotatedPositions","transformByQuaternion","add","concat","boundingVolume","isVerticesInsideObb","index","point","cartographicPoint","cartesianToCartographic","distance"],"sources":["../../../src/i3s-converter/helpers/node-debug.ts"],"sourcesContent":["import type {Mbs, Node3DIndexDocument, Obb} from '@loaders.gl/i3s';\nimport {OrientedBoundingBox, BoundingSphere} from '@math.gl/culling';\nimport {Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\n// prettier-ignore\nconst CUBE_POSITIONS = new Float32Array([\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,\n -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,\n -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,\n -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1,\n 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1,\n -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1\n]);\n\n// TODO Unite Tile validation logic in i3s-17-and-debug with this code.\n\n/**\n * Do validation of bounding volumes for particular node.\n * Generates special warnings if there are some issues.\n * @param node\n */\nexport function validateNodeBoundingVolumes(node: Node3DIndexDocument): string[] {\n if (!node?.parentNode?.obb || !node?.parentNode?.mbs) {\n return [];\n }\n\n const tileWarnings: string[] = [];\n\n validateObb(tileWarnings, node);\n validateMbs(tileWarnings, node);\n\n return tileWarnings;\n}\n\n/**\n * Check if child Obb fit into parent Obb.\n * @param tileWarnings\n * @param node\n */\nfunction validateObb(tileWarnings: string[], node: Node3DIndexDocument): void {\n // @ts-expect-error\n const parentObb = createBoundingBoxFromTileObb(node.parentNode.obb);\n const tileVertices = getTileObbVertices(node);\n const isTileObbInsideParentObb = isAllVerticesInsideBoundingVolume(parentObb, tileVertices);\n\n if (isTileObbInsideParentObb) {\n return;\n }\n\n const title = `OBB of Tile (${node.id}) doesn't fit into Parent (${node.parentNode?.id}) tile OBB`;\n tileWarnings.push(title);\n}\n\n/**\n * Check if child Mbs fit into parent Mbs.\n * @param tileWarnings\n * @param node\n */\nfunction validateMbs(tileWarnings: string[], node: Node3DIndexDocument): void {\n // @ts-expect-error\n const tileMbs = createBoundingSphereFromTileMbs(node.mbs);\n // @ts-expect-error\n const parentMbs = createBoundingSphereFromTileMbs(node.parentNode.mbs);\n const distanceBetweenCenters = tileMbs.center.distanceTo(parentMbs.center);\n\n if (distanceBetweenCenters + tileMbs.radius > parentMbs.radius) {\n const title = `MBS of Tile (${node.id}) doesn't fit into Parent (${node.parentNode?.id}) tile MBS`;\n tileWarnings.push(title);\n }\n}\n\n/**\n * Generates bounding sphere from mbs\n * @param mbs\n */\nfunction createBoundingSphereFromTileMbs(mbs: Mbs): BoundingSphere {\n return new BoundingSphere([mbs[0], mbs[1], mbs[2]], mbs[3]);\n}\n\n/**\n * Generates oriented bounding box from tile obb\n * @param obb\n * @returns\n */\nfunction createBoundingBoxFromTileObb(obb: Obb): OrientedBoundingBox {\n const {center, halfSize, quaternion} = obb;\n return new OrientedBoundingBox().fromCenterHalfSizeQuaternion(center, halfSize, quaternion);\n}\n\n/**\n * Get vertices fromnode obb\n * TODO check if Obb generates properly\n * @param node\n */\nfunction getTileObbVertices(node: Node3DIndexDocument): number[] {\n // @ts-expect-error\n const halfSize = node.obb.halfSize;\n const positions = CUBE_POSITIONS;\n // @ts-expect-error\n const obbCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(node.obb.center);\n\n let vertices = [];\n\n for (let i = 0; i < positions.length; i += 3) {\n const positionsVector = new Vector3(\n (positions[i] *= halfSize[0]),\n (positions[i + 1] *= halfSize[1]),\n (positions[i + 2] *= halfSize[2])\n );\n const rotatedPositions = positionsVector\n // @ts-expect-error\n .transformByQuaternion(node.obb.quaternion)\n .add(obbCenterCartesian);\n // @ts-expect-error\n vertices = vertices.concat(rotatedPositions);\n }\n\n return vertices;\n}\n\n/**\n * Check if all vertices inside bounding volume\n * @param boundingVolume\n * @param positions\n */\nfunction isAllVerticesInsideBoundingVolume(\n boundingVolume: OrientedBoundingBox,\n positions: number[]\n): boolean {\n let isVerticesInsideObb = true;\n\n for (let index = 0; index < positions.length / 3; index += 3) {\n const point = [positions[index], positions[index + 1], positions[index + 2]];\n const cartographicPoint = Ellipsoid.WGS84.cartesianToCartographic(point);\n\n const distance = boundingVolume.distanceTo(cartographicPoint);\n\n if (distance > 0) {\n isVerticesInsideObb = false;\n break;\n }\n }\n\n return isVerticesInsideObb;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-index-document.js","names":["join","transform","v4","uuidv4","openJson","writeFile","writeFileForSlpk","NODE","nodeTemplate","NodeIndexDocument","finalized","_finalized","constructor","id","converter","inPageId","data","children","toString","addData","options","instantNodeWriting","write","addChildren","childNodes","newChildren","node","nodeData","load","push","href","obb","mbs","concat","_data$children","addNeighbors","childNode","_childNodeData$neighb","_nodeData$children","childNodeData","neighbors","Number","length","neighbor","console","warn","save","finalize","child","flush","path","layers0Path","slpk","writeQueue","enqueue","archiveKey","writePromise","JSON","stringify","compressList","parentNodePath","parentNodeFileName","createRootNode","boundingVolumes","rootData","createRootNodeIndexDocument","rootNode","createNode","parentNode","lodSelection","nodeInPage","resources","createNodeIndexDocument","index","root0data","version","toUpperCase","level","metricType","maxError","nodeId","parentNodeData","mesh","_parentNode$converter","_parentNode$converter2","_parentNode$converter3","_parentNode$converter4","geometryData","sharedResource","texture","texelCountHint","textureData","attributes","layers0","attributeStorageInfo","attributesCount","_resources$attributes","attributesLength","attributeData","minimumLength","folderName","key"],"sources":["../../../src/i3s-converter/helpers/node-index-document.ts"],"sourcesContent":["import {join} from 'path';\nimport {\n BoundingVolumes,\n LodSelection,\n Node3DIndexDocument,\n NodeInPage,\n NodeReference\n} from '@loaders.gl/i3s';\nimport transform from 'json-map-transform';\nimport {v4 as uuidv4} from 'uuid';\nimport {openJson, writeFile, writeFileForSlpk} from '../../lib/utils/file-utils';\nimport I3SConverter from '../i3s-converter';\nimport {NODE as nodeTemplate} from '../json-templates/node';\nimport {I3SConvertedResources} from '../types';\nimport {DumpMetadata} from '../../lib/utils/conversion-dump';\n\n/**\n * Wrapper for https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md data\n * The class allows working with 3DNodeIndexDocument in 2 modes:\n * in memory: the data is stored in `data` field\n * on disk: the data is written on disk in a file. The file can be rewritten when new childrend or neighbors have to be added\n */\nexport class NodeIndexDocument {\n /** Node id */\n public id: string;\n /** Id in node pages */\n public inPageId: number;\n /** 3DNodeIndexDocument data */\n public data: Node3DIndexDocument | null = null;\n /** children */\n public children: NodeIndexDocument[] = [];\n /** converter instance */\n private converter: I3SConverter;\n\n /**\n * Finalized property. It means that all child nodes are saved and their data\n * is unloaded\n */\n private _finalized: boolean = false;\n get finalized(): boolean {\n return this._finalized;\n }\n\n /**\n * Constructor\n * @param id - id of the node in node pages\n * @param converter - converter instance\n */\n constructor(id: number, converter: I3SConverter) {\n this.inPageId = id;\n this.id = id === 0 ? 'root' : id.toString();\n this.converter = converter;\n }\n\n /**\n * Add Node3DIndexDocument data to the node\n * @param data Node3DIndexDocument data\n * @returns this NodeIndexDocument instance (to recurring with constructor)\n */\n public async addData(data: Node3DIndexDocument): Promise<NodeIndexDocument> {\n if (this.converter.options.instantNodeWriting) {\n await this.write(data);\n } else {\n this.data = data;\n }\n return this;\n }\n\n /**\n * Add child node references\n * @param childNodes - child NodeIndexDocument instances\n */\n public async addChildren(childNodes: NodeIndexDocument[]): Promise<void> {\n const newChildren: NodeReference[] = [];\n for (const node of childNodes) {\n const nodeData = await node.load();\n newChildren.push({\n id: node.id,\n href: `../${node.id}`,\n obb: nodeData.obb,\n mbs: nodeData.mbs\n });\n }\n this.children = this.children.concat(childNodes);\n\n let data: Node3DIndexDocument | null = this.data;\n if (this.converter.options.instantNodeWriting) {\n data = (await this.load()) as Node3DIndexDocument;\n }\n if (data) {\n data.children = data.children ?? [];\n data.children = data.children.concat(newChildren);\n }\n if (this.converter.options.instantNodeWriting && data) {\n await this.write(data);\n }\n }\n\n /**\n * Add neighbors to child nodes of this node\n */\n public async addNeighbors(): Promise<void> {\n if (this.finalized) {\n return;\n }\n const nodeData = await this.load();\n for (const childNode of this.children) {\n const childNodeData = await childNode.load();\n childNodeData.neighbors = childNodeData.neighbors ?? [];\n\n // Don't do large amount of \"neightbors\" to avoid big memory consumption\n if (Number(nodeData?.children?.length) < 1000) {\n for (const neighbor of nodeData.children || []) {\n if (childNode.id === neighbor.id) {\n continue; // eslint-disable-line\n }\n\n childNodeData.neighbors.push({...neighbor});\n }\n } else {\n // eslint-disable-next-line no-console, no-undef\n console.warn(\n `Node ${childNode.id}: neighbors attribute is omited because of large number of neigbors`\n );\n delete childNodeData.neighbors;\n }\n\n if (this.converter.options.instantNodeWriting && childNodeData) {\n await childNode.write(childNodeData);\n }\n await childNode.save();\n }\n // The save after adding neighbors is the last one. Finalize the the node\n this.finalize();\n }\n\n /** Save 3DNodeIndexDocument in file on disk */\n public async save(): Promise<void> {\n if (this.data) {\n await this.write(this.data);\n }\n }\n\n /** Finalize the node */\n private finalize(): void {\n this._finalized = true;\n for (const child of this.children) {\n child.flush();\n }\n }\n\n /**\n * Write 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n * @param node - Node3DIndexDocument object\n */\n private async write(node: Node3DIndexDocument): Promise<void> {\n const path = join(this.converter.layers0Path, 'nodes', this.id);\n if (this.converter.options.slpk) {\n await this.converter.writeQueue.enqueue(\n {\n archiveKey: `nodes/${this.id}/3dNodeIndexDocument.json.gz`,\n writePromise: () =>\n writeFileForSlpk(\n path,\n JSON.stringify(node),\n '3dNodeIndexDocument.json',\n true,\n this.converter.compressList\n )\n },\n true\n );\n } else {\n await this.converter.writeQueue.enqueue(\n {writePromise: () => writeFile(path, JSON.stringify(node))},\n true\n );\n }\n }\n\n /**\n * Load 3DNodeIndexDocument data from file on disk\n * @returns 3DNodeIndexDocument object\n */\n private async load(): Promise<Node3DIndexDocument> {\n if (this.data) {\n return this.data;\n }\n const path = this.id;\n const parentNodePath = join(this.converter.layers0Path, 'nodes', path);\n let parentNodeFileName = 'index.json';\n if (this.converter.options.slpk) {\n parentNodeFileName = '3dNodeIndexDocument.json';\n }\n return (await openJson(parentNodePath, parentNodeFileName)) as Node3DIndexDocument;\n }\n\n /**\n * Unload the Node data\n */\n private flush(): void {\n this.data = null;\n }\n\n /**\n * Create root node of the tree\n * @param boundingVolumes - MBS and OOB bounding volumes data\n * @param converter - I3SConverter instance\n * @returns instance of NodeIndexDocument\n */\n static async createRootNode(\n boundingVolumes: BoundingVolumes,\n converter: I3SConverter\n ): Promise<NodeIndexDocument> {\n const rootData = NodeIndexDocument.createRootNodeIndexDocument(boundingVolumes);\n const rootNode = await new NodeIndexDocument(0, converter).addData(rootData);\n return rootNode;\n }\n\n /**\n * Create NodeIndexDocument instance\n * @param parentNode - parent NodeIndexDocument\n * @param boundingVolumes - MBS and OOB bounding volumes data\n * @param lodSelection - LOD metrics data\n * @param nodeInPage - node data in node pages\n * @param resources - resources extracted from gltf/b3dm file\n * @param converter - I3SConverter instance\n * @returns NodeIndexDocument instance\n */\n static async createNode(\n parentNode: NodeIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources,\n converter: I3SConverter\n ): Promise<NodeIndexDocument> {\n const data = await NodeIndexDocument.createNodeIndexDocument(\n parentNode,\n boundingVolumes,\n lodSelection,\n nodeInPage,\n resources\n );\n const node = await new NodeIndexDocument(nodeInPage.index, converter).addData(data);\n return node;\n }\n\n /**\n * Form 3DNodeIndexDocument data for the root node\n * @param boundingVolumes - mbs and obb data about node's bounding volume\n * @return 3DNodeIndexDocument data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n */\n static createRootNodeIndexDocument(boundingVolumes: BoundingVolumes): Node3DIndexDocument {\n const root0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 'root',\n level: 0,\n lodSelection: [\n {\n metricType: 'maxScreenThresholdSQ',\n maxError: 0\n },\n {\n metricType: 'maxScreenThreshold',\n maxError: 0\n }\n ],\n ...boundingVolumes,\n children: []\n };\n return transform(root0data, nodeTemplate());\n }\n\n /**\n * Create a new Node3DIndexDocument\n * @param parentNode - 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object of the parent node\n * @param boundingVolumes - Bounding volumes\n * @param lodSelection - Level of Details (LOD) metrics\n * @param nodeInPage - corresponding node object in a node page\n * @param resources - the node resources data\n * @param resources.texture - texture image\n * @param resources.attributes - feature attributes\n * @return 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object\n */\n static async createNodeIndexDocument(\n parentNode: NodeIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources | DumpMetadata\n ): Promise<Node3DIndexDocument> {\n const nodeId = nodeInPage.index!;\n const parentNodeData = await parentNode.load();\n const nodeData = {\n version: parentNodeData.version,\n id: nodeId.toString(),\n level: parentNodeData.level! + 1,\n ...boundingVolumes,\n lodSelection,\n parentNode: {\n id: parentNode.id,\n href: `../${parentNode.id}`,\n mbs: parentNodeData.mbs,\n obb: parentNodeData.obb\n },\n children: [],\n neighbors: []\n };\n const node = transform(nodeData, nodeTemplate());\n\n if (nodeInPage.mesh) {\n node.geometryData = [{href: './geometries/0'}];\n node.sharedResource = {href: './shared'};\n\n if (\n ('texture' in resources && resources.texture) ||\n ('texelCountHint' in resources && resources.texelCountHint)\n ) {\n node.textureData = [{href: './textures/0'}, {href: './textures/1'}];\n }\n\n if (\n ('attributes' in resources &&\n resources.attributes &&\n resources.attributes.length &&\n parentNode.converter.layers0?.attributeStorageInfo?.length) ||\n ('attributesCount' in resources &&\n resources.attributesCount &&\n parentNode.converter.layers0?.attributeStorageInfo?.length)\n ) {\n const attributesLength =\n ('attributes' in resources ? resources.attributes?.length : resources.attributesCount) ||\n 0;\n node.attributeData = [];\n const minimumLength =\n attributesLength < parentNode.converter.layers0.attributeStorageInfo.length\n ? attributesLength\n : parentNode.converter.layers0.attributeStorageInfo.length;\n for (let index = 0; index < minimumLength; index++) {\n const folderName = parentNode.converter.layers0.attributeStorageInfo[index].key;\n node.attributeData.push({href: `./attributes/${folderName}/0`});\n }\n }\n }\n\n return node;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-pages.js","names":["join","transform","METADATA","metadataTemplate","isFileExists","openJson","NodePages","constructor","writeFileFunc","nodesPerPage","converter","nodesCounter","writeFile","nodePages","length","nodes","useWriteFunction","func","getNodePageFileName","nodePageId","filePath","fileName","options","slpk","layers0Path","toString","loadNodePage","fullName","console","log","getPageIndexByNodeId","id","Math","floor","getPageByNodeId","pageIndex","instantNodeWriting","getNodeById","nodePage","nodeIndex","addChildRelation","parentId","childId","_parentNode$children","undefined","parentNode","children","push","saveNode","node","index","currentNodePage","updateResourceInMesh","nodePageIndex","nodeToUpdate","updateAll","nodePageStr","JSON","stringify","writeQueue","enqueue","archiveKey","writePromise","compressList","saveMetadata","metadata","nodeCount","compress","save","entries","slpkPath","nodePagePath","mesh","isFinite","geometry","resource","data","Object","assign","updateMaterialByNodeId","materialId","material","definition","updateVertexCountByNodeId","vertexCount","updateNodeAttributeByNodeId","attribute","updateFeatureCountByNodeId","featureCount","updateTexelCountHintByNodeId","texelCountHint"],"sources":["../../../src/i3s-converter/helpers/node-pages.ts"],"sourcesContent":["import {join} from 'path';\nimport transform from 'json-map-transform';\nimport {METADATA as metadataTemplate} from '../json-templates/metadata';\nimport {NodeInPage} from '@loaders.gl/i3s';\nimport {isFileExists, openJson} from '../../lib/utils/file-utils';\nimport I3SConverter from '../i3s-converter';\n\n/**\n * class NodePages - wrapper of nodePages array\n *\n * @example\n * import {writeFile} from './helpers/write-file';\n *\n * // create an instance of the class\n * const nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);\n * ...\n * // push root node\n * const parent = await nodePages.push({\n lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,\n obb: coordinates.obb,\n children: []\n });\n * ...\n * // push node with parent relation\n * const nodeInPage = {\n lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,\n obb: coordinates.obb,\n children: [],\n mesh: {\n geometry: {\n definition: 0\n }\n }\n };\n * const node = await this.nodePages.push(nodeInPage, parent.index);\n * ...\n * // save all the nodePages in the end of pushing all the nodes\n * await this.nodePages.save(layers0path);\n */\nexport default class NodePages {\n readonly nodesPerPage: number;\n nodesCounter: number;\n writeFile: (...args) => Promise<null | string>;\n converter: I3SConverter;\n readonly nodePages: {nodes: NodeInPage[]}[];\n readonly length: number = 0;\n\n /**\n * @constructs\n * Create a nodePages instance.\n * @param writeFileFunc - function to save one nodePage into a file\n * @param nodesPerPage - length limit for one nodePage. An additional nodePage is created when this limit is met\n */\n constructor(writeFileFunc, nodesPerPage, converter: I3SConverter) {\n this.nodesPerPage = nodesPerPage;\n this.nodesCounter = 0;\n // @ts-expect-error\n this.nodePages = [{}];\n this.nodePages[0].nodes = [];\n this.writeFile = writeFileFunc;\n this.converter = converter;\n this.length = 0;\n }\n\n /**\n * Setup function to save node pages\n * @param func - function which should be used to save node pages\n */\n useWriteFunction(func: (...args) => Promise<null | string>): void {\n this.writeFile = func;\n }\n\n /**\n * Get file path and file name of the node page with the particular id\n * @param nodePageId - node page id\n * @returns file path and file name\n */\n private getNodePageFileName(nodePageId): {filePath: string; fileName: string} {\n let filePath;\n let fileName;\n if (this.converter.options.slpk) {\n filePath = join(this.converter.layers0Path, 'nodepages');\n fileName = `${nodePageId.toString()}.json`;\n } else {\n filePath = join(this.converter.layers0Path, 'nodepages', nodePageId.toString());\n fileName = 'index.json';\n }\n return {filePath, fileName};\n }\n\n /**\n * Load node page from a file on the disk\n * @param nodePageId - node page id\n * @returns - node page data\n */\n private async loadNodePage(nodePageId: number): Promise<{nodes: NodeInPage[]}> {\n const {filePath, fileName} = this.getNodePageFileName(nodePageId);\n const fullName = join(filePath, fileName);\n if (await isFileExists(fullName)) {\n console.log(`load ${fullName}.`); // eslint-disable-line\n return (await openJson(filePath, fileName)) as {nodes: NodeInPage[]};\n } else {\n return {nodes: []};\n }\n }\n\n /**\n * Get nodepage id by node id\n * @param id node id\n * @returns node page id\n */\n private getPageIndexByNodeId(id: number): number {\n return Math.floor(id / this.nodesPerPage);\n }\n\n /**\n * Get node page data by node id\n * @param id node id\n * @returns node page data\n */\n private async getPageByNodeId(id: number): Promise<{nodes: NodeInPage[]}> {\n const pageIndex = this.getPageIndexByNodeId(id);\n if (this.converter.options.instantNodeWriting) {\n return await this.loadNodePage(pageIndex);\n }\n return this.nodePages[pageIndex];\n }\n\n /**\n * Get the node by its end-to-end index\n * @param id - end-to-end index of the node\n * @return the node object\n */\n async getNodeById(id: number, nodePage?: {nodes: NodeInPage[]}): Promise<NodeInPage> {\n const nodeIndex = id % this.nodesPerPage;\n nodePage = nodePage || (await this.getPageByNodeId(id));\n return nodePage.nodes[nodeIndex];\n }\n\n /**\n * Add a child id into the parent node.children array\n * @param parentId - end-to-end parent node index\n * @param childId - end-to-end child node index\n */\n private async addChildRelation(parentId: number | undefined, childId: number): Promise<void> {\n if (parentId === null || parentId === undefined) {\n return;\n }\n const parentNode = await this.getNodeById(parentId);\n parentNode.children?.push(childId);\n await this.saveNode(parentNode);\n }\n\n /**\n * Put new node in nodePages array\n * @param node - node object\n * @param parentId - index of parent node\n * @return\n */\n async push(node: NodeInPage, parentId?: number): Promise<NodeInPage> {\n node.index = this.nodesCounter++;\n if (!this.converter.options.instantNodeWriting) {\n let currentNodePage = this.nodePages[this.nodePages.length - 1];\n if (currentNodePage.nodes.length === this.nodesPerPage) {\n currentNodePage = {nodes: []};\n this.nodePages.push(currentNodePage);\n }\n currentNodePage.nodes.push(node);\n }\n await this.addChildRelation(parentId, node.index);\n NodePages.updateResourceInMesh(node);\n await this.saveNode(node);\n return node;\n }\n\n /**\n * Save node to the file on the disk\n * @param node - node data\n */\n async saveNode(node: NodeInPage): Promise<void> {\n if (!this.converter.options.instantNodeWriting) {\n return;\n } else {\n const nodePageIndex = this.getPageIndexByNodeId(node.index);\n const nodePage = await this.getPageByNodeId(node.index);\n const {filePath, fileName} = this.getNodePageFileName(nodePageIndex);\n const nodeToUpdate = await this.getNodeById(node.index, nodePage);\n if (nodeToUpdate) {\n NodePages.updateAll(nodeToUpdate, node);\n } else {\n nodePage.nodes.push(node);\n }\n const nodePageStr = JSON.stringify(nodePage);\n if (this.converter.options.slpk) {\n await this.converter.writeQueue.enqueue(\n {\n archiveKey: `nodePages/${nodePageIndex.toString()}.json.gz`,\n writePromise: () =>\n this.writeFile(filePath, nodePageStr, fileName, true, this.converter.compressList)\n },\n true\n );\n } else {\n await this.converter.writeQueue.enqueue(\n {\n writePromise: () => this.writeFile(filePath, nodePageStr)\n },\n true\n );\n }\n }\n }\n\n /**\n * Save metadata file (for slpk only)\n */\n async saveMetadata(): Promise<void> {\n const metadata = transform({nodeCount: this.nodesCounter}, metadataTemplate());\n const compress = false;\n await this.converter.writeQueue.enqueue({\n archiveKey: 'metadata.json',\n writePromise: () =>\n this.writeFile(\n this.converter.layers0Path,\n JSON.stringify(metadata),\n 'metadata.json',\n compress\n )\n });\n }\n\n /**\n * Save all the node pages\n * Run this method when all nodes is pushed in nodePages\n */\n async save(): Promise<void> {\n if (this.converter.options.instantNodeWriting) {\n await this.saveMetadata();\n return;\n }\n if (this.converter.options.slpk) {\n for (const [index, nodePage] of this.nodePages.entries()) {\n const nodePageStr = JSON.stringify(nodePage);\n const slpkPath = join(this.converter.layers0Path, 'nodepages');\n await this.converter.writeQueue.enqueue({\n archiveKey: `nodePages/${index.toString()}.json.gz`,\n writePromise: () => this.writeFile(slpkPath, nodePageStr, `${index.toString()}.json`)\n });\n }\n await this.saveMetadata();\n } else {\n for (const [index, nodePage] of this.nodePages.entries()) {\n const nodePageStr = JSON.stringify(nodePage);\n const nodePagePath = join(this.converter.layers0Path, 'nodepages', index.toString());\n await this.converter.writeQueue.enqueue({\n writePromise: () => this.writeFile(nodePagePath, nodePageStr)\n });\n }\n }\n }\n\n /**\n * Update resource index in node.mesh object\n * @param node - node object\n */\n static updateResourceInMesh(node: NodeInPage): void {\n if (node.mesh && isFinite(node.index)) {\n node.mesh.geometry.resource = node.index;\n }\n }\n\n /**\n * Update all fields in the node excluding id\n * @param node - node object\n * @param data - NodeInPage data to replace original data\n */\n static updateAll(node: NodeInPage, data: NodeInPage): NodeInPage {\n Object.assign(node, data, {index: node.index});\n NodePages.updateResourceInMesh(node);\n return node;\n }\n\n /**\n * Update material in node.mesh object by node id\n * @param id - end-to-end index of the node\n * @param materialId - id from scene layer materialDefinitions\n */\n static updateMaterialByNodeId(node: NodeInPage, materialId: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.material = {\n definition: materialId,\n resource: node.index\n };\n }\n\n /**\n * Update vertexCount in node.mesh.geometry object by node id\n * @param id - end-to-end index of the node\n * @param vertexCount - vertex count for particular node\n */\n static updateVertexCountByNodeId(node: NodeInPage, vertexCount: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.geometry.vertexCount = vertexCount;\n }\n\n /**\n * Update resource in node.mesh.attribute object by node id\n * @param node - node object\n */\n static updateNodeAttributeByNodeId(node: NodeInPage): void {\n if (!node.mesh || !node.index) {\n return;\n }\n node.mesh.attribute.resource = node.index;\n }\n\n /**\n * Update featureCount in node.mesh.geometry object by node id\n * @param node - node object\n * @param featureCount - features count of the node\n */\n static updateFeatureCountByNodeId(node: NodeInPage, featureCount: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.geometry.featureCount = featureCount;\n }\n\n /**\n * Update texelCountHint in node.mesh.material object by node id\n * @param node - node object\n * @param texelCountHint - texelCountHint of particular node\n */\n static updateTexelCountHintByNodeId(node: NodeInPage, texelCountHint: number): void {\n if (!node.mesh || !node.mesh.material) {\n return;\n }\n node.mesh.material.texelCountHint = texelCountHint;\n }\n}\n"],"mappings":"AAAA,SAAQA,IAAI,QAAO,MAAM;AACzB,OAAOC,SAAS,MAAM,oBAAoB;AAAC,SACnCC,QAAQ,IAAIC,gBAAgB;AAAA,SAE5BC,YAAY,EAAEC,QAAQ;AAmC9B,eAAe,MAAMC,SAAS,CAAC;EAc7BC,WAAWA,CAACC,aAAa,EAAEC,YAAY,EAAEC,SAAuB,EAAE;IAAA,KAbzDD,YAAY;IAAA,KACrBE,YAAY;IAAA,KACZC,SAAS;IAAA,KACTF,SAAS;IAAA,KACAG,SAAS;IAAA,KACTC,MAAM,GAAW,CAAC;IASzB,IAAI,CAACL,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACE,YAAY,GAAG,CAAC;IAErB,IAAI,CAACE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAACA,SAAS,CAAC,CAAC,CAAC,CAACE,KAAK,GAAG,EAAE;IAC5B,IAAI,CAACH,SAAS,GAAGJ,aAAa;IAC9B,IAAI,CAACE,SAAS,GAAGA,SAAS;IAC1B,IAAI,CAACI,MAAM,GAAG,CAAC;EACjB;EAMAE,gBAAgBA,CAACC,IAAyC,EAAQ;IAChE,IAAI,CAACL,SAAS,GAAGK,IAAI;EACvB;EAOQC,mBAAmBA,CAACC,UAAU,EAAwC;IAC5E,IAAIC,QAAQ;IACZ,IAAIC,QAAQ;IACZ,IAAI,IAAI,CAACX,SAAS,CAACY,OAAO,CAACC,IAAI,EAAE;MAC/BH,QAAQ,GAAGpB,IAAI,CAAC,IAAI,CAACU,SAAS,CAACc,WAAW,EAAE,WAAW,CAAC;MACxDH,QAAQ,GAAI,GAAEF,UAAU,CAACM,QAAQ,CAAC,CAAE,OAAM;IAC5C,CAAC,MAAM;MACLL,QAAQ,GAAGpB,IAAI,CAAC,IAAI,CAACU,SAAS,CAACc,WAAW,EAAE,WAAW,EAAEL,UAAU,CAACM,QAAQ,CAAC,CAAC,CAAC;MAC/EJ,QAAQ,GAAG,YAAY;IACzB;IACA,OAAO;MAACD,QAAQ;MAAEC;IAAQ,CAAC;EAC7B;EAOA,MAAcK,YAAYA,CAACP,UAAkB,EAAkC;IAC7E,MAAM;MAACC,QAAQ;MAAEC;IAAQ,CAAC,GAAG,IAAI,CAACH,mBAAmB,CAACC,UAAU,CAAC;IACjE,MAAMQ,QAAQ,GAAG3B,IAAI,CAACoB,QAAQ,EAAEC,QAAQ,CAAC;IACzC,IAAI,MAAMjB,YAAY,CAACuB,QAAQ,CAAC,EAAE;MAChCC,OAAO,CAACC,GAAG,CAAE,QAAOF,QAAS,GAAE,CAAC;MAChC,OAAQ,MAAMtB,QAAQ,CAACe,QAAQ,EAAEC,QAAQ,CAAC;IAC5C,CAAC,MAAM;MACL,OAAO;QAACN,KAAK,EAAE;MAAE,CAAC;IACpB;EACF;EAOQe,oBAAoBA,CAACC,EAAU,EAAU;IAC/C,OAAOC,IAAI,CAACC,KAAK,CAACF,EAAE,GAAG,IAAI,CAACtB,YAAY,CAAC;EAC3C;EAOA,MAAcyB,eAAeA,CAACH,EAAU,EAAkC;IACxE,MAAMI,SAAS,GAAG,IAAI,CAACL,oBAAoB,CAACC,EAAE,CAAC;IAC/C,IAAI,IAAI,CAACrB,SAAS,CAACY,OAAO,CAACc,kBAAkB,EAAE;MAC7C,OAAO,MAAM,IAAI,CAACV,YAAY,CAACS,SAAS,CAAC;IAC3C;IACA,OAAO,IAAI,CAACtB,SAAS,CAACsB,SAAS,CAAC;EAClC;EAOA,MAAME,WAAWA,CAACN,EAAU,EAAEO,QAAgC,EAAuB;IACnF,MAAMC,SAAS,GAAGR,EAAE,GAAG,IAAI,CAACtB,YAAY;IACxC6B,QAAQ,GAAGA,QAAQ,KAAK,MAAM,IAAI,CAACJ,eAAe,CAACH,EAAE,CAAC,CAAC;IACvD,OAAOO,QAAQ,CAACvB,KAAK,CAACwB,SAAS,CAAC;EAClC;EAOA,MAAcC,gBAAgBA,CAACC,QAA4B,EAAEC,OAAe,EAAiB;IAAA,IAAAC,oBAAA;IAC3F,IAAIF,QAAQ,KAAK,IAAI,IAAIA,QAAQ,KAAKG,SAAS,EAAE;MAC/C;IACF;IACA,MAAMC,UAAU,GAAG,MAAM,IAAI,CAACR,WAAW,CAACI,QAAQ,CAAC;IACnD,CAAAE,oBAAA,GAAAE,UAAU,CAACC,QAAQ,cAAAH,oBAAA,uBAAnBA,oBAAA,CAAqBI,IAAI,CAACL,OAAO,CAAC;IAClC,MAAM,IAAI,CAACM,QAAQ,CAACH,UAAU,CAAC;EACjC;EAQA,MAAME,IAAIA,CAACE,IAAgB,EAAER,QAAiB,EAAuB;IACnEQ,IAAI,CAACC,KAAK,GAAG,IAAI,CAACvC,YAAY,EAAE;IAChC,IAAI,CAAC,IAAI,CAACD,SAAS,CAACY,OAAO,CAACc,kBAAkB,EAAE;MAC9C,IAAIe,eAAe,GAAG,IAAI,CAACtC,SAAS,CAAC,IAAI,CAACA,SAAS,CAACC,MAAM,GAAG,CAAC,CAAC;MAC/D,IAAIqC,eAAe,CAACpC,KAAK,CAACD,MAAM,KAAK,IAAI,CAACL,YAAY,EAAE;QACtD0C,eAAe,GAAG;UAACpC,KAAK,EAAE;QAAE,CAAC;QAC7B,IAAI,CAACF,SAAS,CAACkC,IAAI,CAACI,eAAe,CAAC;MACtC;MACAA,eAAe,CAACpC,KAAK,CAACgC,IAAI,CAACE,IAAI,CAAC;IAClC;IACA,MAAM,IAAI,CAACT,gBAAgB,CAACC,QAAQ,EAAEQ,IAAI,CAACC,KAAK,CAAC;IACjD5C,SAAS,CAAC8C,oBAAoB,CAACH,IAAI,CAAC;IACpC,MAAM,IAAI,CAACD,QAAQ,CAACC,IAAI,CAAC;IACzB,OAAOA,IAAI;EACb;EAMA,MAAMD,QAAQA,CAACC,IAAgB,EAAiB;IAC9C,IAAI,CAAC,IAAI,CAACvC,SAAS,CAACY,OAAO,CAACc,kBAAkB,EAAE;MAC9C;IACF,CAAC,MAAM;MACL,MAAMiB,aAAa,GAAG,IAAI,CAACvB,oBAAoB,CAACmB,IAAI,CAACC,KAAK,CAAC;MAC3D,MAAMZ,QAAQ,GAAG,MAAM,IAAI,CAACJ,eAAe,CAACe,IAAI,CAACC,KAAK,CAAC;MACvD,MAAM;QAAC9B,QAAQ;QAAEC;MAAQ,CAAC,GAAG,IAAI,CAACH,mBAAmB,CAACmC,aAAa,CAAC;MACpE,MAAMC,YAAY,GAAG,MAAM,IAAI,CAACjB,WAAW,CAACY,IAAI,CAACC,KAAK,EAAEZ,QAAQ,CAAC;MACjE,IAAIgB,YAAY,EAAE;QAChBhD,SAAS,CAACiD,SAAS,CAACD,YAAY,EAAEL,IAAI,CAAC;MACzC,CAAC,MAAM;QACLX,QAAQ,CAACvB,KAAK,CAACgC,IAAI,CAACE,IAAI,CAAC;MAC3B;MACA,MAAMO,WAAW,GAAGC,IAAI,CAACC,SAAS,CAACpB,QAAQ,CAAC;MAC5C,IAAI,IAAI,CAAC5B,SAAS,CAACY,OAAO,CAACC,IAAI,EAAE;QAC/B,MAAM,IAAI,CAACb,SAAS,CAACiD,UAAU,CAACC,OAAO,CACrC;UACEC,UAAU,EAAG,aAAYR,aAAa,CAAC5B,QAAQ,CAAC,CAAE,UAAS;UAC3DqC,YAAY,EAAEA,CAAA,KACZ,IAAI,CAAClD,SAAS,CAACQ,QAAQ,EAAEoC,WAAW,EAAEnC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAACX,SAAS,CAACqD,YAAY;QACrF,CAAC,EACD,IACF,CAAC;MACH,CAAC,MAAM;QACL,MAAM,IAAI,CAACrD,SAAS,CAACiD,UAAU,CAACC,OAAO,CACrC;UACEE,YAAY,EAAEA,CAAA,KAAM,IAAI,CAAClD,SAAS,CAACQ,QAAQ,EAAEoC,WAAW;QAC1D,CAAC,EACD,IACF,CAAC;MACH;IACF;EACF;EAKA,MAAMQ,YAAYA,CAAA,EAAkB;IAClC,MAAMC,QAAQ,GAAGhE,SAAS,CAAC;MAACiE,SAAS,EAAE,IAAI,CAACvD;IAAY,CAAC,EAAER,gBAAgB,CAAC,CAAC,CAAC;IAC9E,MAAMgE,QAAQ,GAAG,KAAK;IACtB,MAAM,IAAI,CAACzD,SAAS,CAACiD,UAAU,CAACC,OAAO,CAAC;MACtCC,UAAU,EAAE,eAAe;MAC3BC,YAAY,EAAEA,CAAA,KACZ,IAAI,CAAClD,SAAS,CACZ,IAAI,CAACF,SAAS,CAACc,WAAW,EAC1BiC,IAAI,CAACC,SAAS,CAACO,QAAQ,CAAC,EACxB,eAAe,EACfE,QACF;IACJ,CAAC,CAAC;EACJ;EAMA,MAAMC,IAAIA,CAAA,EAAkB;IAC1B,IAAI,IAAI,CAAC1D,SAAS,CAACY,OAAO,CAACc,kBAAkB,EAAE;MAC7C,MAAM,IAAI,CAAC4B,YAAY,CAAC,CAAC;MACzB;IACF;IACA,IAAI,IAAI,CAACtD,SAAS,CAACY,OAAO,CAACC,IAAI,EAAE;MAC/B,KAAK,MAAM,CAAC2B,KAAK,EAAEZ,QAAQ,CAAC,IAAI,IAAI,CAACzB,SAAS,CAACwD,OAAO,CAAC,CAAC,EAAE;QACxD,MAAMb,WAAW,GAAGC,IAAI,CAACC,SAAS,CAACpB,QAAQ,CAAC;QAC5C,MAAMgC,QAAQ,GAAGtE,IAAI,CAAC,IAAI,CAACU,SAAS,CAACc,WAAW,EAAE,WAAW,CAAC;QAC9D,MAAM,IAAI,CAACd,SAAS,CAACiD,UAAU,CAACC,OAAO,CAAC;UACtCC,UAAU,EAAG,aAAYX,KAAK,CAACzB,QAAQ,CAAC,CAAE,UAAS;UACnDqC,YAAY,EAAEA,CAAA,KAAM,IAAI,CAAClD,SAAS,CAAC0D,QAAQ,EAAEd,WAAW,EAAG,GAAEN,KAAK,CAACzB,QAAQ,CAAC,CAAE,OAAM;QACtF,CAAC,CAAC;MACJ;MACA,MAAM,IAAI,CAACuC,YAAY,CAAC,CAAC;IAC3B,CAAC,MAAM;MACL,KAAK,MAAM,CAACd,KAAK,EAAEZ,QAAQ,CAAC,IAAI,IAAI,CAACzB,SAAS,CAACwD,OAAO,CAAC,CAAC,EAAE;QACxD,MAAMb,WAAW,GAAGC,IAAI,CAACC,SAAS,CAACpB,QAAQ,CAAC;QAC5C,MAAMiC,YAAY,GAAGvE,IAAI,CAAC,IAAI,CAACU,SAAS,CAACc,WAAW,EAAE,WAAW,EAAE0B,KAAK,CAACzB,QAAQ,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,CAACf,SAAS,CAACiD,UAAU,CAACC,OAAO,CAAC;UACtCE,YAAY,EAAEA,CAAA,KAAM,IAAI,CAAClD,SAAS,CAAC2D,YAAY,EAAEf,WAAW;QAC9D,CAAC,CAAC;MACJ;IACF;EACF;EAMA,OAAOJ,oBAAoBA,CAACH,IAAgB,EAAQ;IAClD,IAAIA,IAAI,CAACuB,IAAI,IAAIC,QAAQ,CAACxB,IAAI,CAACC,KAAK,CAAC,EAAE;MACrCD,IAAI,CAACuB,IAAI,CAACE,QAAQ,CAACC,QAAQ,GAAG1B,IAAI,CAACC,KAAK;IAC1C;EACF;EAOA,OAAOK,SAASA,CAACN,IAAgB,EAAE2B,IAAgB,EAAc;IAC/DC,MAAM,CAACC,MAAM,CAAC7B,IAAI,EAAE2B,IAAI,EAAE;MAAC1B,KAAK,EAAED,IAAI,CAACC;IAAK,CAAC,CAAC;IAC9C5C,SAAS,CAAC8C,oBAAoB,CAACH,IAAI,CAAC;IACpC,OAAOA,IAAI;EACb;EAOA,OAAO8B,sBAAsBA,CAAC9B,IAAgB,EAAE+B,UAAkB,EAAQ;IACxE,IAAI,CAAC/B,IAAI,CAACuB,IAAI,EAAE;MACd;IACF;IACAvB,IAAI,CAACuB,IAAI,CAACS,QAAQ,GAAG;MACnBC,UAAU,EAAEF,UAAU;MACtBL,QAAQ,EAAE1B,IAAI,CAACC;IACjB,CAAC;EACH;EAOA,OAAOiC,yBAAyBA,CAAClC,IAAgB,EAAEmC,WAAmB,EAAQ;IAC5E,IAAI,CAACnC,IAAI,CAACuB,IAAI,EAAE;MACd;IACF;IACAvB,IAAI,CAACuB,IAAI,CAACE,QAAQ,CAACU,WAAW,GAAGA,WAAW;EAC9C;EAMA,OAAOC,2BAA2BA,CAACpC,IAAgB,EAAQ;IACzD,IAAI,CAACA,IAAI,CAACuB,IAAI,IAAI,CAACvB,IAAI,CAACC,KAAK,EAAE;MAC7B;IACF;IACAD,IAAI,CAACuB,IAAI,CAACc,SAAS,CAACX,QAAQ,GAAG1B,IAAI,CAACC,KAAK;EAC3C;EAOA,OAAOqC,0BAA0BA,CAACtC,IAAgB,EAAEuC,YAAoB,EAAQ;IAC9E,IAAI,CAACvC,IAAI,CAACuB,IAAI,EAAE;MACd;IACF;IACAvB,IAAI,CAACuB,IAAI,CAACE,QAAQ,CAACc,YAAY,GAAGA,YAAY;EAChD;EAOA,OAAOC,4BAA4BA,CAACxC,IAAgB,EAAEyC,cAAsB,EAAQ;IAClF,IAAI,CAACzC,IAAI,CAACuB,IAAI,IAAI,CAACvB,IAAI,CAACuB,IAAI,CAACS,QAAQ,EAAE;MACrC;IACF;IACAhC,IAAI,CAACuB,IAAI,CAACS,QAAQ,CAACS,cAAc,GAAGA,cAAc;EACpD;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"preprocess-3d-tiles.js","names":["GLTFPrimitiveModeString","EXT_STRUCTURAL_METADATA","GLTFLoader","parse","EXT_FEATURE_METADATA","GLTF_PRIMITIVE_MODES","POINTS","LINES","LINE_LOOP","LINE_STRIP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","analyzeTileContent","tileContent","defaultResult","meshTopologyTypes","Set","metadataClasses","gltfArrayBuffer","gltfData","gltf","normalize","loadBuffers","loadImages","decompressMeshes","json","getMeshTypesFromGLTF","getMetadataClassesFromGLTF","gltfJson","result","mesh","meshes","primitive","primitives","mode","add","_gltfJson$extensions","_gltfJson$extensions$","_gltfJson$extensions$2","_gltfJson$extensions2","_gltfJson$extensions3","_gltfJson$extensions4","extFeatureMetadataClasses","extensions","schema","classes","classKey","Object","keys","extStructuralMetadataClasses","mergePreprocessData","object1","object2","type","metadataClass"],"sources":["../../../src/i3s-converter/helpers/preprocess-3d-tiles.ts"],"sourcesContent":["import {Tiles3DTileContent} from '@loaders.gl/3d-tiles';\nimport {GLTFPrimitiveModeString, PreprocessData} from '../types';\nimport {\n EXT_STRUCTURAL_METADATA,\n GLTF,\n GLTFLoader,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_structural_metadata_GLTF\n} from '@loaders.gl/gltf';\nimport {parse} from '@loaders.gl/core';\nimport {EXT_FEATURE_METADATA} from '@loaders.gl/gltf';\n\n/**\n * glTF primitive modes\n * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode\n */\nexport const GLTF_PRIMITIVE_MODES = [\n GLTFPrimitiveModeString.POINTS, // 0\n GLTFPrimitiveModeString.LINES, // 1\n GLTFPrimitiveModeString.LINE_LOOP, // 2\n GLTFPrimitiveModeString.LINE_STRIP, // 3\n GLTFPrimitiveModeString.TRIANGLES, // 4\n GLTFPrimitiveModeString.TRIANGLE_STRIP, // 5\n GLTFPrimitiveModeString.TRIANGLE_FAN // 6\n];\n\n/**\n * Analyze tile content. This function is used during preprocess stage of\n * conversion\n * @param tileContent - 3DTiles tile content ArrayBuffer\n * @returns\n */\nexport const analyzeTileContent = async (\n tileContent: Tiles3DTileContent | null\n): Promise<PreprocessData> => {\n const defaultResult = {\n meshTopologyTypes: new Set<GLTFPrimitiveModeString>(),\n metadataClasses: new Set<string>()\n };\n if (!tileContent?.gltfArrayBuffer) {\n return defaultResult;\n }\n\n const gltfData = await parse(tileContent.gltfArrayBuffer, GLTFLoader, {\n gltf: {normalize: false, loadBuffers: false, loadImages: false, decompressMeshes: false}\n });\n const gltf = gltfData.json;\n\n if (!gltf) {\n return defaultResult;\n }\n const meshTopologyTypes = getMeshTypesFromGLTF(gltf);\n const metadataClasses = getMetadataClassesFromGLTF(gltf);\n return {\n meshTopologyTypes,\n metadataClasses\n };\n};\n\n/**\n * Get mesh topology types that the glb content has\n * @param gltfJson - JSON part of GLB content\n * @returns array of mesh types found\n */\nconst getMeshTypesFromGLTF = (gltfJson: GLTF): Set<GLTFPrimitiveModeString> => {\n const result: Set<GLTFPrimitiveModeString> = new Set();\n for (const mesh of gltfJson.meshes || []) {\n for (const primitive of mesh.primitives) {\n let {mode} = primitive;\n if (typeof mode !== 'number') {\n mode = 4; // Default is 4 - TRIANGLES\n }\n result.add(GLTF_PRIMITIVE_MODES[mode]);\n }\n }\n return result;\n};\n\n/**\n * Get feature metadata classes from glTF\n * The tileset might contain multiple metadata classes provided by EXT_feature_metadata and EXT_structural_metadata extensions.\n * Every class is a set of properties. But I3S can consume only one set of properties.\n * On the pre-process we collect all classes from the tileset in order to show the prompt to select one class for conversion to I3S.\n * @param gltfJson - JSON part of GLB content\n * @returns array of classes\n */\nconst getMetadataClassesFromGLTF = (gltfJson: GLTF): Set<string> => {\n const result: Set<string> = new Set();\n\n // Try to parse from EXT_feature_metadata\n const extFeatureMetadataClasses = (\n gltfJson.extensions?.[EXT_FEATURE_METADATA] as GLTF_EXT_feature_metadata_GLTF\n )?.schema?.classes;\n\n if (extFeatureMetadataClasses) {\n for (const classKey of Object.keys(extFeatureMetadataClasses)) {\n result.add(classKey);\n }\n }\n\n // Try to parse from EXT_structural_metadata\n const extStructuralMetadataClasses = (\n gltfJson.extensions?.[EXT_STRUCTURAL_METADATA] as GLTF_EXT_structural_metadata_GLTF\n )?.schema?.classes;\n if (extStructuralMetadataClasses) {\n for (const classKey of Object.keys(extStructuralMetadataClasses)) {\n result.add(classKey);\n }\n }\n\n return result;\n};\n\n/**\n * Merge object2 into object1\n * @param object1\n * @param object2\n * @returns nothing\n */\nexport const mergePreprocessData = (object1: PreprocessData, object2: PreprocessData): void => {\n // Merge topology mesh types info\n for (const type of object2.meshTopologyTypes) {\n object1.meshTopologyTypes.add(type);\n }\n\n // Merge feature metadata classes\n for (const metadataClass of object2.metadataClasses) {\n object1.metadataClasses.add(metadataClass);\n }\n};\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress.js","names":["process","timeConverter","THRESHOLD_DEFAULT","Progress","constructor","options","arguments","length","undefined","_stepsTotal","_stepsDone","startTime","stopTime","timeOfUpdatingStepsDone","milliSecForOneStep","trust","numberOfDigitsInPercentage","threshold","getTime","hrtime","bigint","stepsTotal","Math","ceil","log10","stepsDone","getCurrentTimeInMilliSeconds","diff","isVelocityTrust","startMonitoring","stopMonitoring","getPercent","percent","getPercentString","toFixed","getTimeCurrentlyElapsed","currentTime","getTimeRemaining","timeRemainingInMilliSeconds","timeRemaining","getTimeRemainingString","timeRemainingObject","current","previous","dev","abs","Number","BigInt"],"sources":["../../../src/i3s-converter/helpers/progress.ts"],"sourcesContent":["import process from 'process';\nimport {timeConverter} from '../../lib/utils/statistic-utills';\n\n/** Defines a threshold that is used to check if the process velocity can be consifered trust. */\nconst THRESHOLD_DEFAULT = 0.2;\n\n/**\n * Implements methods to keep track on the progress of a long process.\n */\nexport class Progress {\n /** Total amount of work, e.g. number of files to save or number of bytes to send */\n private _stepsTotal: number = 0;\n /** Amount of work already done */\n private _stepsDone: number = 0;\n /** Time in milli-seconds when the process started */\n private startTime: number = 0;\n /** Time in milli-seconds when the process stopped */\n private stopTime: number = 0;\n /** Time in milli-seconds when stepsDone was updated */\n private timeOfUpdatingStepsDone: number = 0;\n /** Time in milli-seconds spent for performing one step*/\n private milliSecForOneStep: number = 0;\n private trust: boolean = false;\n /**\n * The number of digits to appear after decimal point in the string representation of the count of steps already done.\n * It's calculated based on the total count of steps.\n */\n private numberOfDigitsInPercentage: number = 0;\n /** Defines a threshold that is used to check if the process velocity can be consifered trust. */\n private threshold: number;\n /** Function that is used to get the time stamp */\n private getTime: () => bigint;\n\n constructor(options: {threshold?: number; getTime?: () => bigint} = {}) {\n this.getTime = options.getTime || process.hrtime.bigint;\n this.threshold = options.threshold || THRESHOLD_DEFAULT;\n }\n\n /** Total amount of work, e.g. number of files to save or number of bytes to send */\n get stepsTotal() {\n return this._stepsTotal;\n }\n\n set stepsTotal(stepsTotal) {\n this._stepsTotal = stepsTotal;\n this.numberOfDigitsInPercentage =\n this.stepsTotal > 100 ? Math.ceil(Math.log10(this.stepsTotal)) - 2 : 0;\n }\n\n /** Amount of work already done */\n get stepsDone() {\n return this._stepsDone;\n }\n\n set stepsDone(stepsDone) {\n this._stepsDone = stepsDone;\n this.timeOfUpdatingStepsDone = this.getCurrentTimeInMilliSeconds();\n if (this._stepsDone) {\n const diff = this.timeOfUpdatingStepsDone - this.startTime;\n const milliSecForOneStep = diff / this._stepsDone;\n\n this.trust = this.isVelocityTrust(milliSecForOneStep, this.milliSecForOneStep);\n this.milliSecForOneStep = milliSecForOneStep;\n }\n }\n\n /**\n * Saves the current time as we start monitoring the process.\n */\n startMonitoring() {\n this.startTime = this.getCurrentTimeInMilliSeconds();\n this.milliSecForOneStep = 0;\n this.trust = false;\n this.timeOfUpdatingStepsDone = 0;\n this.stopTime = 0;\n this.stepsDone = 0;\n }\n\n /**\n * Saves the current time as we stop monitoring the process.\n */\n stopMonitoring() {\n this.stopTime = this.getCurrentTimeInMilliSeconds();\n }\n\n /**\n * Gets percentage of the work already done.\n * @returns percentage of the work already done.\n */\n getPercent(): number | null {\n if (!this._stepsTotal) {\n return null;\n }\n const percent = (this._stepsDone / this._stepsTotal) * 100.0;\n return percent;\n }\n\n /**\n * Gets string representation of percentage of the work already done.\n * @returns string representation of percentage or an empty string if the percetage value cannot be calculated.\n */\n getPercentString() {\n const percent = this.getPercent();\n return percent !== null ? percent.toFixed(this.numberOfDigitsInPercentage) : '';\n }\n\n /**\n * Gets the time elapsed since the monitoring started\n * @returns Number of milliseconds elapsed\n */\n getTimeCurrentlyElapsed(): number {\n const currentTime = this.stopTime ? this.stopTime : this.getCurrentTimeInMilliSeconds();\n const diff = currentTime - this.startTime;\n return diff;\n }\n\n /**\n * Gets the time remaining (expected at the moment of updating 'stepsDone') to complete the work.\n * @returns Number of milliseconds remaining\n */\n getTimeRemaining(): {timeRemaining: number; trust: boolean} | null {\n if (!this._stepsTotal || !this._stepsDone || !this.startTime) {\n return null;\n }\n\n const timeRemainingInMilliSeconds =\n (this._stepsTotal - this._stepsDone) * this.milliSecForOneStep;\n return {timeRemaining: timeRemainingInMilliSeconds, trust: this.trust};\n }\n\n /**\n * Gets the string representation of the time remaining (expected at the moment of updating 'stepsDone') to complete the work.\n * @returns string representation of the time remaining.\n * It's an empty string if the time cannot be pedicted or it's still being calculated.\n */\n getTimeRemainingString(): string {\n const timeRemainingObject = this.getTimeRemaining();\n return timeRemainingObject?.trust ? timeConverter(timeRemainingObject.timeRemaining) : '';\n }\n\n /**\n * Check if the computed velociy of the process can be considered trust.\n * At the beginning of the process the number of samples collected ('time necessary to perform one step' averaged) is too small,\n * which results in huge deviation of the cumputed velocity of the process.\n * It makes sense to perform the check before reporting the time remainig so the end user is not confused.\n * @param current - current value\n * @param previous - previous value\n * @returns true if the computed velociy can be considered trust, or false otherwise\n */\n private isVelocityTrust(current: number, previous: number): boolean {\n if (previous) {\n const dev = Math.abs((current - previous) / previous);\n return dev < this.threshold;\n }\n return false;\n }\n\n /**\n * Gets current time in milliseconds.\n * @returns current time in milliseconds.\n */\n private getCurrentTimeInMilliSeconds(): number {\n // process.hrtime.bigint() returns the time in nanoseconds. We need the time in milliseconds.\n return Number(this.getTime() / BigInt(1e6));\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tileset-traversal.js","names":["traverseDatasetWith","tile","traversalProps","processTile","postprocessTile","maxDepth","level","arguments","length","undefined","processResults","newTraversalProps","push","childTile","children"],"sources":["../../../src/i3s-converter/helpers/tileset-traversal.ts"],"sourcesContent":["import {Tiles3DTileJSONPostprocessed} from '@loaders.gl/3d-tiles';\nimport {NodeIndexDocument} from './node-index-document';\nimport {Matrix4} from '@math.gl/core';\n\n/** Traversal props for the conversion stage */\nexport type TraversalConversionProps = {\n /** Transformation matrix for the specific tile */\n transform: Matrix4;\n /** Parent nodes of the converted tile. Multiple nodes can be if one tile is converted to multiple nodes*/\n parentNodes: NodeIndexDocument[];\n};\n\n/**\n * Travesal of 3DTile tiles tree with making specific actions with each tile\n * @param tile - 3DTiles tile JSON metadata\n * @param traversalProps - traversal props used to pass data through recursive calls\n * @param processTile - callback to make some actions with the current tile\n * @param postprocessTile - callback to make some action after processing of the current tile and all the subtree\n * @param maxDepth - max recursive calls number the travesal function will do. If not set, the traversal function will\n * go through all the tree.\n * This value is used to limit the convertion with only partial number of levels of the tileset\n * @param level - counter to keep recursive calls number of the tiles tree. This value used to be able to break\n * traversal at the some level of the tree\n * @returns void\n */\nexport const traverseDatasetWith = async <TProps>(\n tile: Tiles3DTileJSONPostprocessed,\n traversalProps: TProps,\n processTile: (tile: Tiles3DTileJSONPostprocessed, traversalProps: TProps) => Promise<TProps>,\n postprocessTile?: (processResults: TProps[], currentTraversalProps: TProps) => Promise<void>,\n maxDepth?: number,\n level = 0\n): Promise<void> => {\n if (maxDepth && level > maxDepth) {\n return;\n }\n const processResults: TProps[] = [];\n const newTraversalProps: TProps = await processTile(tile, traversalProps);\n processResults.push(newTraversalProps);\n for (const childTile of tile.children) {\n await traverseDatasetWith(\n childTile,\n newTraversalProps,\n processTile,\n postprocessTile,\n maxDepth,\n level + 1\n );\n }\n postprocessTile && (await postprocessTile(processResults, traversalProps));\n};\n"],"mappings":"AAyBA,OAAO,MAAMA,mBAAmB,GAAG,eAAAA,CACjCC,IAAkC,EAClCC,cAAsB,EACtBC,WAA4F,EAC5FC,eAA4F,EAC5FC,QAAiB,EAEC;EAAA,IADlBC,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EAET,IAAIF,QAAQ,IAAIC,KAAK,GAAGD,QAAQ,EAAE;IAChC;EACF;EACA,MAAMK,cAAwB,GAAG,EAAE;EACnC,MAAMC,iBAAyB,GAAG,MAAMR,WAAW,CAACF,IAAI,EAAEC,cAAc,CAAC;EACzEQ,cAAc,CAACE,IAAI,CAACD,iBAAiB,CAAC;EACtC,KAAK,MAAME,SAAS,IAAIZ,IAAI,CAACa,QAAQ,EAAE;IACrC,MAAMd,mBAAmB,CACvBa,SAAS,EACTF,iBAAiB,EACjBR,WAAW,EACXC,eAAe,EACfC,QAAQ,EACRC,KAAK,GAAG,CACV,CAAC;EACH;EACAF,eAAe,KAAK,MAAMA,eAAe,CAACM,cAAc,EAAER,cAAc,CAAC,CAAC;AAC5E,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"i3s-converter.js","names":["AttributeMetadataInfo","load","encode","isBrowser","CesiumIonLoader","Tiles3DLoader","join","v4","uuidv4","process","transform","md5","NodePages","writeFile","removeDir","writeFileForSlpk","removeFile","compressFileWithGzip","calculateFilesSize","timeConverter","convertB3dmToI3sGeometry","getPropertyTable","createBoundingVolumes","convertBoundingVolumeToI3SFullExtent","createSceneServerPath","convertGeometricErrorToScreenThreshold","PGMLoader","LAYERS","layersTemplate","GEOMETRY_DEFINITION","geometryDefinitionTemlate","SHARED_RESOURCES","sharedResourcesTemplate","validateNodeBoundingVolumes","KTX2BasisWriterWorker","ImageWriter","GLTFPrimitiveModeString","ResourceType","WorkerFarm","WriteQueue","BROWSER_ERROR_MESSAGE","getAttributeTypesMapFromPropertyTable","getAttributeTypesMapFromSchema","NodeIndexDocument","isNestedTileset","loadNestedTileset","loadTile3DContent","loadFromArchive","Matrix4","createBoundingVolume","traverseDatasetWith","analyzeTileContent","mergePreprocessData","Progress","composeHashFile","createZip","ConversionDump","ION_DEFAULT_TOKEN","_process$env","env","IonToken","HARDCODED_NODES_PER_PAGE","_3D_TILES","_3D_OBJECT_LAYER_TYPE","REFRESH_TOKEN_TIMEOUT","CESIUM_DATASET_PREFIX","PROGRESS_PHASE1_COUNT","I3SConverter","constructor","attributeMetadataInfo","nodePages","options","layers0Path","materialMap","materialDefinitions","geometryMap","geometryConfigs","vertexCounter","layers0","featuresHashArray","refinementCounter","validate","boundingVolumeWarnings","conversionStartTime","refreshTokenTime","sourceTileset","loadOptions","_nodeWorkers","reuseWorkers","useLocalLibraries","basis","format","workerUrl","draco","fetch","modules","geoidHeightModel","Loader","generateTextures","generateBoundingVolumes","layersHasTexture","workerSource","writeQueue","compressList","preprocessData","meshTopologyTypes","Set","metadataClasses","progresses","conversionDump","Map","tilesCount","tilesWithAddRefineCount","convert","console","log","hrtime","tilesetName","slpk","egmFilePath","inputUrl","outputPath","sevenZipExe","maxDepth","token","instantNodeWriting","mergeMaterials","inquirer","metadataClass","analyze","Boolean","indexOf","startListening","useWriteFunction","preloadOptions","_fetchPreloadOptions","tilesetUrl","url","headers","preprocessResult","preprocessConversion","selectMetadataClassResult","selectMetadataClass","_createAndSaveTileset","_finishConversion","error","finalize","workerFarm","getWorkerFarm","destroy","sourceRootTile","root","analyzeTile","bind","undefined","stepsTotal","Array","from","size","has","TRIANGLES","TRIANGLE_STRIP","sourceTile","traversalProps","isTileset","id","tileContent","loadGLTF","contentUrl","tilePreprocessData","_this$options$metadat","length","result","prompt","name","type","message","choices","_this$sourceTileset","_this$sourceTileset$r","_this$sourceTileset$r2","tilesetPath","createDump","restored","resumeConversion","reset","removePath","e","fromObject","i","hash","JSON","stringify","set","sourceBoundingVolume","boundingVolume","_formLayers0","region","boundingVolumes","push","index","lodThreshold","obb","children","startMonitoring","rootNode","createRootNode","parentNodes","convertTile","finalizeTile","stopMonitoring","attributeStorageInfo","fields","popupInfo","layerType","textureSetDefinitions","geometryDefinitions","map","config","geometryConfig","store","defaultGeometrySchema","ordering","filter","attribute","_writeLayers0","filePath","save","_createSlpk","boundingVolumeRegion","_this$sourceTileset2","fullExtent","zmin","zmax","extent","xmin","ymin","xmax","ymax","layers0data","version","toUpperCase","href","nodesPerPage","compressGeometry","enqueue","archiveKey","writePromise","deleteDumpFile","slpkTilesetPath","slpkFileName","fileList","path","file","transformationMatrix","clone","multiplyRight","parentNode","restoreResult","_restoreNode","childNodes","_createNode","addChildren","newTraversalProps","stepsDone","timeRemainingString","timeRemainingStringBasedOnCount","getTimeRemainingString","percentString","getPercentString","progressString","conversionResults","currentTraversalProps","node","addNeighbors","_generateNodeIndexDocument","resources","isDumped","texture","texelCountHint","lodSelection","maxScreenThresholdSQ","find","val","metricType","maxError","draftObb","center","halfSize","quaternion","inPageId","nodeInPage","_updateNodeInNodePages","nodeData","createNodeIndexDocument","addData","_checkAddRefinementTypeForTile","_updateTilesetOptions","isFileConversionComplete","nodes","convertedNode","tilesConverted","dumpMetadata","nodeId","clearDumpRecord","propertyTable","createAttributeStorageInfo","resourcesData","_convertResources","nodeIds","nodesInPage","emptyResources","geometry","compressedGeometry","hasUvRegions","sharedResources","meshMaterial","vertexCount","attributes","featureCount","mesh","_resources$attributes","attributesCount","materialId","material","definition","setMaterialsDefinitions","addNode","_writeResources","warn","parentId","isContentSupported","findOrCreateGeometryDefinition","resource","getNodeById","updateAll","updateMaterialByNodeId","_findOrCreateMaterial","image","height","width","updateTexelCountHintByNodeId","updateVertexCountByNodeId","updateNodeAttributeByNodeId","updateFeatureCountByNodeId","saveNode","nodePath","geometryBuffer","childPath","slpkChildPath","_writeGeometries","parseInt","_writeShared","_writeTexture","_writeAttributes","sourceId","updateDoneStatus","GEOMETRY","slpkGeometryPath","outputId","resourceType","geometryPath","DRACO_GEOMETRY","slpkCompressedGeometryPath","compressedGeometryPath","sharedData","sharedDataStr","SHARED","slpkSharedPath","sharedPath","_getFormatByMimeType","mimeType","formats","textureData","bufferView","data","TEXTURE","writeTextureFile","copyArrayBuffer","subarray","arrayToEncode","Uint8Array","ktx2TextureData","decodedFromKTX2TextureData","atlas","addTexturesDefinitions","slpkTexturePath","compress","texturePath","arguments","minimumLength","folderName","key","fileBuffer","ATTRIBUTES","slpkAttributesPath","attributesPath","get","newMaterialId","hasTexture","newGeometryId","attributeTypesMap","gltf","addMetadataInfo","params","addRefinementPercentage","filesSize","diff","conversionTime","preload","accessToken","tile","ADD_TILE_REFINEMENT","refine","includes"],"sources":["../../src/i3s-converter/i3s-converter.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {AttributeMetadataInfo} from './helpers/attribute-metadata-info';\n\nimport type {\n FeatureTableJson,\n Tiles3DLoaderOptions,\n Tiles3DTileContent,\n Tiles3DTileJSONPostprocessed,\n Tiles3DTilesetJSONPostprocessed\n} from '@loaders.gl/3d-tiles';\nimport type {WriteQueueItem} from '../lib/utils/write-queue';\nimport type {\n SceneLayer3D,\n BoundingVolumes,\n MaxScreenThresholdSQ,\n NodeInPage,\n Attribute,\n Node3DIndexDocument\n} from '@loaders.gl/i3s';\nimport {load, encode, isBrowser} from '@loaders.gl/core';\nimport {CesiumIonLoader, Tiles3DLoader} from '@loaders.gl/3d-tiles';\nimport {Geoid} from '@math.gl/geoid';\nimport {join} from 'path';\nimport {v4 as uuidv4} from 'uuid';\nimport process from 'process';\nimport transform from 'json-map-transform';\nimport md5 from 'md5';\n\nimport NodePages from './helpers/node-pages';\nimport {writeFile, removeDir, writeFileForSlpk, removeFile} from '../lib/utils/file-utils';\nimport {compressFileWithGzip} from '../lib/utils/compress-util';\nimport {calculateFilesSize, timeConverter} from '../lib/utils/statistic-utills';\nimport convertB3dmToI3sGeometry, {getPropertyTable} from './helpers/geometry-converter';\nimport {\n createBoundingVolumes,\n convertBoundingVolumeToI3SFullExtent\n} from './helpers/coordinate-converter';\nimport {createSceneServerPath} from './helpers/create-scene-server-path';\nimport {convertGeometricErrorToScreenThreshold} from '../lib/utils/lod-conversion-utils';\nimport {PGMLoader} from '../pgm-loader';\n\nimport {LAYERS as layersTemplate} from './json-templates/layers';\nimport {GEOMETRY_DEFINITION as geometryDefinitionTemlate} from './json-templates/geometry-definitions';\nimport {SHARED_RESOURCES as sharedResourcesTemplate} from './json-templates/shared-resources';\nimport {validateNodeBoundingVolumes} from './helpers/node-debug';\nimport {KTX2BasisWriterWorker} from '@loaders.gl/textures';\nimport {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {I3SMaterialDefinition, TextureSetDefinitionFormats} from '@loaders.gl/i3s';\nimport {ImageWriter} from '@loaders.gl/images';\nimport {GLTFImagePostprocessed} from '@loaders.gl/gltf';\nimport {\n GLTFPrimitiveModeString,\n I3SConvertedResources,\n PreprocessData,\n ResourceType,\n SharedResourcesArrays\n} from './types';\nimport {WorkerFarm} from '@loaders.gl/worker-utils';\nimport WriteQueue from '../lib/utils/write-queue';\nimport {BROWSER_ERROR_MESSAGE} from '../constants';\nimport {\n getAttributeTypesMapFromPropertyTable,\n getAttributeTypesMapFromSchema\n} from './helpers/feature-attributes';\nimport {NodeIndexDocument} from './helpers/node-index-document';\nimport {\n isNestedTileset,\n loadNestedTileset,\n loadTile3DContent,\n loadFromArchive\n} from './helpers/load-3d-tiles';\nimport {Matrix4} from '@math.gl/core';\nimport {BoundingSphere, OrientedBoundingBox} from '@math.gl/culling';\nimport {createBoundingVolume} from '@loaders.gl/tiles';\nimport {TraversalConversionProps, traverseDatasetWith} from './helpers/tileset-traversal';\nimport {analyzeTileContent, mergePreprocessData} from './helpers/preprocess-3d-tiles';\nimport {Progress} from './helpers/progress';\nimport {composeHashFile, createZip} from '@loaders.gl/zip';\nimport {ConversionDump, ConversionDumpOptions, DumpMetadata} from '../lib/utils/conversion-dump';\n\nconst ION_DEFAULT_TOKEN = process.env?.IonToken;\nconst HARDCODED_NODES_PER_PAGE = 64;\nconst _3D_TILES = '3DTILES';\nconst _3D_OBJECT_LAYER_TYPE = '3DObject';\nconst REFRESH_TOKEN_TIMEOUT = 1800; // 30 minutes in seconds\nconst CESIUM_DATASET_PREFIX = 'https://';\n// const FS_FILE_TOO_LARGE = 'ERR_FS_FILE_TOO_LARGE';\nconst PROGRESS_PHASE1_COUNT = 'phase1-count';\n\n/**\n * Converter from 3d-tiles tileset to i3s layer\n */\nexport default class I3SConverter {\n attributeMetadataInfo: AttributeMetadataInfo;\n nodePages: NodePages;\n options: any;\n layers0Path: string;\n materialMap: Map<string, number>;\n materialDefinitions: I3SMaterialDefinition[];\n geometryMap: Map<string, number>;\n geometryConfigs: {hasTexture: boolean; hasUvRegions: boolean}[];\n vertexCounter: number;\n layers0: SceneLayer3D | null;\n featuresHashArray: string[];\n refinementCounter: {\n tilesCount: number;\n tilesWithAddRefineCount: number;\n };\n validate: boolean;\n boundingVolumeWarnings?: string[] = [];\n conversionStartTime: [number, number] = [0, 0];\n refreshTokenTime: [number, number] = [0, 0];\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null = null;\n loadOptions: Tiles3DLoaderOptions = {\n _nodeWorkers: true,\n reuseWorkers: true,\n useLocalLibraries: true,\n basis: {\n format: 'rgba32',\n // We need to load local fs workers because nodejs can't load workers from the Internet\n workerUrl: './modules/textures/dist/basis-worker-node.js'\n },\n // We need to load local fs workers because nodejs can't load workers from the Internet\n draco: {workerUrl: './modules/draco/dist/draco-worker-node.js'},\n fetch: {},\n modules: {}\n };\n geoidHeightModel: Geoid | null = null;\n Loader: LoaderWithParser = Tiles3DLoader;\n generateTextures: boolean;\n generateBoundingVolumes: boolean;\n layersHasTexture: boolean;\n workerSource: {[key: string]: string} = {};\n writeQueue: WriteQueue<WriteQueueItem> = new WriteQueue(new ConversionDump());\n compressList: string[] | null = null;\n preprocessData: PreprocessData = {\n meshTopologyTypes: new Set(),\n metadataClasses: new Set()\n };\n progresses: Record<string, Progress> = {};\n conversionDump: ConversionDump;\n\n constructor() {\n this.attributeMetadataInfo = new AttributeMetadataInfo();\n this.nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE, this);\n this.options = {};\n this.layers0Path = '';\n this.materialMap = new Map();\n this.materialDefinitions = [];\n this.geometryMap = new Map();\n this.geometryConfigs = [];\n this.vertexCounter = 0;\n this.layers0 = null;\n this.featuresHashArray = [];\n this.refinementCounter = {\n tilesCount: 0,\n tilesWithAddRefineCount: 0\n };\n this.validate = false;\n this.generateTextures = false;\n this.generateBoundingVolumes = false;\n this.layersHasTexture = false;\n this.compressList = null;\n this.conversionDump = new ConversionDump();\n }\n\n /**\n * Convert a 3d tileset\n * @param options\n * @param options.inputUrl the url to read the tileset from\n * @param options.outputPath the output filename\n * @param options.tilesetName the output name of the tileset\n * @param options.maxDepth The max tree depth of conversion\n * @param options.slpk Generate slpk (Scene Layer Packages) output file\n * @param options.sevenZipExe Location of 7z.exe archiver to create slpk on Windows\n * @param options.egmFilePath location of *.pgm file to convert heights from ellipsoidal to gravity-related format\n * @param options.token Token for Cesium ION tilesets authentication\n * @param options.draco Generate I3S 1.7 draco compressed geometries\n * @param options.validate -enable validation\n * @param options.generateTextures - generate alternative type of textures (to have non-compressed jpeg/png and compressed ktx2)\n * @param options.generateBoundingVolumes - generate bounding volumes from vertices coordinates instead of source tiles bounding volumes\n * @param options.instantNodeWriting - Keep created 3DNodeIndexDocument files on disk instead of memory. This option reduce memory usage but decelerates conversion speed\n */\n async convert(options: {\n inputUrl: string;\n outputPath: string;\n tilesetName: string;\n sevenZipExe: string;\n egmFilePath: string;\n maxDepth?: number;\n slpk?: boolean;\n token?: string;\n draco?: boolean;\n mergeMaterials?: boolean;\n validate?: boolean;\n generateTextures?: boolean;\n generateBoundingVolumes?: boolean;\n instantNodeWriting?: boolean;\n inquirer?: Promise<unknown>;\n metadataClass?: string;\n analyze?: boolean;\n }): Promise<string> {\n if (isBrowser) {\n console.log(BROWSER_ERROR_MESSAGE);\n return BROWSER_ERROR_MESSAGE;\n }\n this.conversionStartTime = process.hrtime();\n const {\n tilesetName,\n slpk,\n egmFilePath,\n inputUrl,\n validate,\n outputPath,\n draco = true,\n sevenZipExe,\n maxDepth,\n token,\n generateTextures,\n generateBoundingVolumes,\n instantNodeWriting = false,\n mergeMaterials = true,\n inquirer,\n metadataClass,\n analyze = false\n } = options;\n this.options = {\n outputPath,\n tilesetName,\n maxDepth,\n slpk,\n sevenZipExe,\n egmFilePath,\n draco,\n token,\n inputUrl,\n instantNodeWriting,\n mergeMaterials,\n inquirer,\n metadataClass\n };\n this.progresses[PROGRESS_PHASE1_COUNT] = new Progress();\n this.compressList = (this.options.instantNodeWriting && []) || null;\n this.validate = Boolean(validate);\n this.Loader = inputUrl.indexOf(CESIUM_DATASET_PREFIX) !== -1 ? CesiumIonLoader : Tiles3DLoader;\n this.generateTextures = Boolean(generateTextures);\n this.generateBoundingVolumes = Boolean(generateBoundingVolumes);\n\n this.writeQueue = new WriteQueue(this.conversionDump);\n this.writeQueue.startListening();\n\n console.log('Loading egm file...'); // eslint-disable-line\n this.geoidHeightModel = await load(egmFilePath, PGMLoader);\n console.log('Loading egm file completed!'); // eslint-disable-line\n\n if (slpk) {\n this.nodePages.useWriteFunction(writeFileForSlpk);\n }\n\n try {\n const preloadOptions = await this._fetchPreloadOptions();\n let tilesetUrl = inputUrl;\n if (preloadOptions.url) {\n tilesetUrl = preloadOptions.url;\n }\n if (preloadOptions.headers) {\n this.loadOptions.fetch = {headers: preloadOptions.headers};\n }\n this.sourceTileset = await loadFromArchive(tilesetUrl, this.Loader, this.loadOptions);\n\n const preprocessResult =\n this.Loader === Tiles3DLoader || analyze ? await this.preprocessConversion() : true;\n\n if (preprocessResult && !analyze) {\n const selectMetadataClassResult = await this.selectMetadataClass();\n if (selectMetadataClassResult) {\n await this._createAndSaveTileset(outputPath, tilesetName);\n await this._finishConversion({slpk: Boolean(slpk), outputPath, tilesetName});\n }\n }\n } catch (error) {\n throw error;\n } finally {\n await this.writeQueue.finalize();\n // Clean up worker pools\n const workerFarm = WorkerFarm.getWorkerFarm({});\n workerFarm.destroy();\n }\n return 'success';\n }\n\n /**\n * Preprocess stage of the tile converter. Traverse all the tiles tree and\n * check a tile content to be sure that the data is supported\n * @returns true - the conversion is possible, false - the tileset's content is not supported\n */\n private async preprocessConversion(): Promise<boolean> {\n console.log(`Analyze source tileset`);\n const sourceRootTile: Tiles3DTileJSONPostprocessed = this.sourceTileset!.root!;\n await traverseDatasetWith<null>(\n sourceRootTile,\n null,\n this.analyzeTile.bind(this),\n undefined,\n this.options.maxDepth\n );\n const {meshTopologyTypes, metadataClasses} = this.preprocessData;\n\n console.log(`------------------------------------------------`);\n console.log(`Preprocess results:`);\n console.log(`Tile count: ${this.progresses[PROGRESS_PHASE1_COUNT].stepsTotal}`);\n console.log(`glTF mesh topology types: ${Array.from(meshTopologyTypes).join(', ')}`);\n\n if (metadataClasses.size) {\n console.log(\n `Feature metadata classes have been found: ${Array.from(metadataClasses).join(', ')}`\n );\n } else {\n console.log('Feature metadata classes have not been found');\n }\n\n if (\n !meshTopologyTypes.has(GLTFPrimitiveModeString.TRIANGLES) &&\n !meshTopologyTypes.has(GLTFPrimitiveModeString.TRIANGLE_STRIP)\n ) {\n console.log(\n 'The tileset is of unsupported mesh topology types. The conversion will be interrupted.'\n );\n console.log(`------------------------------------------------`);\n return false;\n }\n\n console.log(`------------------------------------------------`);\n return true;\n }\n\n /**\n * Analyze a tile content. The callback for preprocess stage.\n * @param sourceTile - 3DTiles tile JSON metadata\n * @param traversalProps - mandatory argument but it is not used for the preprocess stage\n * @returns - nothing\n */\n private async analyzeTile(\n sourceTile: Tiles3DTileJSONPostprocessed,\n traversalProps: null\n ): Promise<null> {\n const isTileset = isNestedTileset(sourceTile);\n if (isTileset) {\n await loadNestedTileset(this.sourceTileset, sourceTile, this.loadOptions);\n return null;\n }\n if (sourceTile.id) {\n this.progresses[PROGRESS_PHASE1_COUNT].stepsTotal += 1;\n console.log(`[analyze]: ${sourceTile.id}`); // eslint-disable-line\n }\n\n let tileContent: Tiles3DTileContent | null = null;\n try {\n tileContent = await loadTile3DContent(this.sourceTileset, sourceTile, {\n ...this.loadOptions,\n '3d-tiles': {...this.loadOptions['3d-tiles'], loadGLTF: false}\n });\n } catch (error) {\n console.log(\n `[warning]: Failed to load ${sourceTile.contentUrl}. An I3S tile with empty content will be added to the output tileset`\n );\n }\n const tilePreprocessData = await analyzeTileContent(tileContent);\n mergePreprocessData(this.preprocessData, tilePreprocessData);\n return null;\n }\n\n /**\n * Select metadata class associated with the set of feature attributes\n * @returns true if the metadata class has been successfully selected\n */\n private async selectMetadataClass() {\n const {metadataClasses} = this.preprocessData;\n if (metadataClasses.size > 1) {\n if (this.options.metadataClass?.length) {\n console.log(`${this.options.metadataClass} has been selected`);\n } else if (this.options.inquirer) {\n const result = await this.options.inquirer.prompt([\n {\n name: 'metadataClass',\n type: 'list',\n message: 'Select feature metadata data class to convert...',\n choices: Array.from(metadataClasses)\n }\n ]);\n this.options.metadataClass = result.metadataClass;\n console.log(`${result.metadataClass} has been selected`);\n } else {\n console.log(\n `A feature metadata class has not been selected. Start the converter with option \"--metadata-class\". For example, \"npx tile-converter ... --metadata-class ${\n Array.from(metadataClasses)[0]\n }\"`\n );\n console.log(`------------------------------------------------`);\n return false;\n }\n }\n return true;\n }\n\n /**\n * Convert and save the layer and embedded tiles\n * @param outputPath - path to save output data\n * @param tilesetName - new tileset path\n */\n private async _createAndSaveTileset(outputPath: string, tilesetName: string): Promise<void> {\n const tilesetPath = join(`${outputPath}`, `${tilesetName}`);\n\n await this.conversionDump.createDump(this.options as ConversionDumpOptions);\n if (this.conversionDump.restored && this.options.inquirer) {\n const result = await this.options.inquirer.prompt([\n {\n name: 'resumeConversion',\n type: 'confirm',\n message:\n 'Dump file of the previous conversion exists, do you want to resume that conversion?'\n }\n ]);\n if (!result.resumeConversion) {\n this.conversionDump.reset();\n }\n }\n\n this.layers0Path = join(tilesetPath, 'SceneServer', 'layers', '0');\n\n // Removing the tilesetPath needed to exclude erroneous files after conversion\n const removePath = this.conversionDump.restored\n ? join(this.layers0Path, 'nodepages')\n : tilesetPath;\n try {\n await removeDir(removePath);\n } catch (e) {\n // do nothing\n }\n\n if (this.conversionDump.restored && this.conversionDump.attributeMetadataInfo) {\n this.attributeMetadataInfo.fromObject(this.conversionDump.attributeMetadataInfo);\n }\n\n this.materialDefinitions = [];\n this.materialMap = new Map();\n\n if (this.conversionDump.restored && this.conversionDump.materialDefinitions) {\n for (let i = 0; i < this.conversionDump.materialDefinitions.length; i++) {\n const hash = md5(JSON.stringify(this.conversionDump.materialDefinitions[i]));\n this.materialMap.set(hash, i);\n }\n this.materialDefinitions = this.conversionDump.materialDefinitions;\n }\n\n const sourceRootTile: Tiles3DTileJSONPostprocessed = this.sourceTileset!.root!;\n const sourceBoundingVolume = createBoundingVolume(\n sourceRootTile.boundingVolume,\n new Matrix4(sourceRootTile.transform),\n null\n );\n\n this._formLayers0(\n tilesetName,\n sourceBoundingVolume,\n this.sourceTileset?.root?.boundingVolume?.region\n );\n\n const boundingVolumes = createBoundingVolumes(sourceBoundingVolume, this.geoidHeightModel!);\n\n await this.nodePages.push({\n index: 0,\n lodThreshold: 0,\n obb: boundingVolumes.obb,\n children: []\n });\n this.progresses[PROGRESS_PHASE1_COUNT].startMonitoring();\n const rootNode = await NodeIndexDocument.createRootNode(boundingVolumes, this);\n await traverseDatasetWith<TraversalConversionProps>(\n sourceRootTile,\n {\n transform: new Matrix4(sourceRootTile.transform),\n parentNodes: [rootNode]\n },\n this.convertTile.bind(this),\n this.finalizeTile.bind(this),\n this.options.maxDepth\n );\n this.progresses[PROGRESS_PHASE1_COUNT].stopMonitoring();\n console.log(`[finalizing conversion]`); // eslint-disable-line\n\n this.layers0!.attributeStorageInfo = this.attributeMetadataInfo.attributeStorageInfo;\n this.layers0!.fields = this.attributeMetadataInfo.fields;\n this.layers0!.popupInfo = this.attributeMetadataInfo.popupInfo;\n\n if (this.attributeMetadataInfo.attributeStorageInfo.length) {\n this.layers0!.layerType = _3D_OBJECT_LAYER_TYPE;\n }\n\n if (this.conversionDump.restored && this.conversionDump.textureSetDefinitions) {\n this.layers0!.textureSetDefinitions = this.conversionDump.textureSetDefinitions;\n }\n\n this.layers0!.materialDefinitions = this.materialDefinitions;\n // @ts-ignore\n this.layers0.geometryDefinitions = transform(\n this.geometryConfigs.map((config) => ({\n geometryConfig: {...config, draco: this.options.draco}\n })),\n geometryDefinitionTemlate()\n );\n\n if (this.layersHasTexture === false) {\n this.layers0!.store.defaultGeometrySchema.ordering =\n this.layers0!.store.defaultGeometrySchema.ordering.filter(\n (attribute) => attribute !== 'uv0'\n );\n }\n\n await this._writeLayers0();\n createSceneServerPath(tilesetName, this.layers0!, tilesetPath);\n for (const filePath of this.compressList || []) {\n await compressFileWithGzip(filePath);\n await removeFile(filePath);\n }\n await this.nodePages.save();\n await this.writeQueue.finalize();\n await this._createSlpk(tilesetPath);\n }\n\n /**\n * Form object of 3DSceneLayer https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DSceneLayer.cmn.md\n * @param tilesetName - Name of layer\n * @param sourceBoundingVolume - initialized bounding volume of the source root tile\n * @param boundingVolumeRegion - region bounding volume of the source root tile\n */\n private _formLayers0(\n tilesetName: string,\n sourceBoundingVolume: OrientedBoundingBox | BoundingSphere,\n boundingVolumeRegion?: number[]\n ): void {\n if (!this.sourceTileset?.root) {\n return;\n }\n const fullExtent = convertBoundingVolumeToI3SFullExtent(sourceBoundingVolume);\n if (boundingVolumeRegion) {\n fullExtent.zmin = boundingVolumeRegion[4];\n fullExtent.zmax = boundingVolumeRegion[5];\n }\n const extent = [fullExtent.xmin, fullExtent.ymin, fullExtent.xmax, fullExtent.ymax];\n const layers0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 0,\n name: tilesetName,\n href: './layers/0',\n store: {\n id: `{${uuidv4().toUpperCase()}}`,\n extent\n },\n nodePages: {\n nodesPerPage: HARDCODED_NODES_PER_PAGE\n },\n compressGeometry: this.options.draco,\n fullExtent\n };\n this.layers0 = transform(layers0data, layersTemplate());\n }\n\n /**\n * Write 3DSceneLayer https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DSceneLayer.cmn.md in file\n */\n private async _writeLayers0(): Promise<void> {\n if (this.options.slpk) {\n await this.writeQueue.enqueue({\n archiveKey: '3dSceneLayer.json.gz',\n writePromise: () =>\n writeFileForSlpk(this.layers0Path, JSON.stringify(this.layers0), '3dSceneLayer.json')\n });\n } else {\n await this.writeQueue.enqueue({\n writePromise: () => writeFile(this.layers0Path, JSON.stringify(this.layers0))\n });\n }\n }\n\n /**\n * Pack files into *.slpk archive\n * @param tilesetPath - Path to save file\n */\n private async _createSlpk(tilesetPath: string): Promise<void> {\n await this.conversionDump.deleteDumpFile();\n if (this.options.slpk) {\n const slpkTilesetPath = join(tilesetPath, 'SceneServer', 'layers', '0');\n const slpkFileName = `${tilesetPath}.slpk`;\n\n await createZip(slpkTilesetPath, slpkFileName, async (fileList) => ({\n path: '@specialIndexFileHASH128@',\n file: await composeHashFile(fileList)\n }));\n\n try {\n await removeDir(tilesetPath);\n } catch (e) {\n // do nothing\n }\n }\n }\n\n /**\n * Convert the specific 3DTiles tile to I3S nodes.\n * This is callback function for the traversal generic function\n * @param sourceTile - current 3DTiles tile JSON metadata\n * @param traversalProps - traversal properties calculated recursively\n * @returns - traversal properties for the child tiles\n */\n private async convertTile(\n sourceTile: Tiles3DTileJSONPostprocessed,\n traversalProps: TraversalConversionProps\n ): Promise<TraversalConversionProps> {\n const isTileset = isNestedTileset(sourceTile);\n if (isTileset || sourceTile.type === 'empty') {\n if (isTileset) {\n if (sourceTile.id) {\n console.log(`[load]: ${sourceTile.id}`); // eslint-disable-line\n }\n await loadNestedTileset(this.sourceTileset, sourceTile, this.loadOptions);\n }\n return traversalProps;\n }\n if (sourceTile.id) {\n console.log(`[convert]: ${sourceTile.id}`); // eslint-disable-line\n }\n\n const {parentNodes, transform} = traversalProps;\n let transformationMatrix: Matrix4 = transform.clone();\n if (sourceTile.transform) {\n transformationMatrix = transformationMatrix.multiplyRight(sourceTile.transform);\n }\n const parentNode = parentNodes[0];\n const restoreResult = await this._restoreNode(parentNode, sourceTile, transformationMatrix);\n let childNodes;\n if (restoreResult === null) {\n childNodes = await this._createNode(parentNode, sourceTile, transformationMatrix);\n } else {\n childNodes = restoreResult;\n }\n await parentNode.addChildren(childNodes);\n\n const newTraversalProps: TraversalConversionProps = {\n transform: transformationMatrix,\n parentNodes: childNodes\n };\n\n if (sourceTile.id) {\n this.progresses[PROGRESS_PHASE1_COUNT].stepsDone += 1;\n\n let timeRemainingString = 'Calculating time left...';\n const timeRemainingStringBasedOnCount =\n this.progresses[PROGRESS_PHASE1_COUNT].getTimeRemainingString();\n if (timeRemainingStringBasedOnCount) {\n timeRemainingString = `${timeRemainingStringBasedOnCount} left`;\n }\n\n const percentString = this.progresses[PROGRESS_PHASE1_COUNT].getPercentString();\n const progressString = percentString ? ` ${percentString}%, ${timeRemainingString}` : '';\n console.log(`[converted${progressString}]: ${sourceTile.id}`); // eslint-disable-line\n }\n return newTraversalProps;\n }\n\n /**\n * Do final action with nodes after the current node and all child nodes been converted.\n * @param conversionResults - array of conversion results of the current node\n * @param currentTraversalProps - traversal properties of the current node\n */\n private async finalizeTile(\n conversionResults: TraversalConversionProps[],\n currentTraversalProps: TraversalConversionProps\n ): Promise<void> {\n for (const result of conversionResults) {\n for (const node of result.parentNodes) {\n await node.addNeighbors();\n }\n }\n for (const node of currentTraversalProps.parentNodes) {\n await node.save();\n }\n }\n\n /**\n * Generate NodeIndexDocument\n * @param boundingVolumes - Bounding volumes\n * @param resources - converted or dumped node resources data\n * @param parentNode - 3DNodeIndexDocument of parent node\n * @param sourceTile - source 3DTile data\n * @param isDumped - indicator if the node is dumped\n * @return NodeIndexDocument, nodeInPage and node data\n */\n private async _generateNodeIndexDocument(\n boundingVolumes: BoundingVolumes,\n resources: I3SConvertedResources | DumpMetadata,\n parentNode: NodeIndexDocument,\n sourceTile: Tiles3DTileJSONPostprocessed,\n isDumped: boolean\n ): Promise<{node: NodeIndexDocument; nodeInPage: NodeInPage; nodeData: Node3DIndexDocument}> {\n this.layersHasTexture =\n this.layersHasTexture ||\n Boolean(\n ('texture' in resources && resources.texture) ||\n ('texelCountHint' in resources && resources.texelCountHint)\n );\n\n if (this.generateBoundingVolumes && resources.boundingVolumes) {\n boundingVolumes = resources.boundingVolumes;\n }\n\n const lodSelection = convertGeometricErrorToScreenThreshold(sourceTile, boundingVolumes);\n const maxScreenThresholdSQ = lodSelection.find(\n (val) => val.metricType === 'maxScreenThresholdSQ'\n ) || {maxError: 0};\n\n if (isDumped) {\n const draftObb = {\n center: [],\n halfSize: [],\n quaternion: []\n };\n await this.nodePages.push({index: 0, obb: draftObb}, parentNode.inPageId);\n }\n\n const nodeInPage = await this._updateNodeInNodePages(\n maxScreenThresholdSQ,\n boundingVolumes,\n sourceTile,\n parentNode.inPageId,\n resources\n );\n\n const nodeData = await NodeIndexDocument.createNodeIndexDocument(\n parentNode,\n boundingVolumes,\n lodSelection,\n nodeInPage,\n resources\n );\n\n const node = await new NodeIndexDocument(nodeInPage.index, this).addData(nodeData);\n return {node, nodeInPage, nodeData};\n }\n\n /**\n * Restore 3DNodeIndexDocument from a comversion dump file\n * @param parentNode - 3DNodeIndexDocument of parent node\n * @param sourceTile - source 3DTile data\n * @param transformationMatrix - transformation matrix of the current tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n */\n private async _restoreNode(\n parentNode: NodeIndexDocument,\n sourceTile: Tiles3DTileJSONPostprocessed,\n transformationMatrix: Matrix4\n ): Promise<null | NodeIndexDocument[]> {\n this._checkAddRefinementTypeForTile(sourceTile);\n await this._updateTilesetOptions();\n if (\n this.conversionDump.restored &&\n sourceTile.id &&\n this.conversionDump.isFileConversionComplete(sourceTile.id)\n ) {\n const sourceBoundingVolume = createBoundingVolume(\n sourceTile.boundingVolume,\n transformationMatrix,\n null\n );\n let boundingVolumes = createBoundingVolumes(sourceBoundingVolume, this.geoidHeightModel!);\n const nodes: NodeIndexDocument[] = [];\n for (const convertedNode of this.conversionDump.tilesConverted[sourceTile.id].nodes) {\n const {node} = await this._generateNodeIndexDocument(\n boundingVolumes,\n {\n ...(convertedNode.dumpMetadata as DumpMetadata),\n nodeId: convertedNode.nodeId\n } as I3SConvertedResources | DumpMetadata,\n parentNode,\n sourceTile,\n true\n );\n nodes.push(node);\n }\n return nodes;\n } else if (this.conversionDump.restored && sourceTile.id) {\n //clear existing record in a dump\n this.conversionDump.clearDumpRecord(sourceTile.id);\n }\n return null;\n }\n\n /**\n * Convert tile to one or more I3S nodes\n * @param parentNode - 3DNodeIndexDocument of parent node\n * @param sourceTile - source 3DTile data\n * @param transformationMatrix - transformation matrix of the current tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n * @param level - tree level\n */\n private async _createNode(\n parentNode: NodeIndexDocument,\n sourceTile: Tiles3DTileJSONPostprocessed,\n transformationMatrix: Matrix4\n ): Promise<NodeIndexDocument[]> {\n this._checkAddRefinementTypeForTile(sourceTile);\n\n await this._updateTilesetOptions();\n\n let tileContent: Tiles3DTileContent | null = null;\n try {\n tileContent = await loadTile3DContent(this.sourceTileset, sourceTile, this.loadOptions);\n } catch (error) {\n console.log(`[warning]: Failed to load ${sourceTile.contentUrl}`);\n }\n const sourceBoundingVolume = createBoundingVolume(\n sourceTile.boundingVolume,\n transformationMatrix,\n null\n );\n let boundingVolumes = createBoundingVolumes(sourceBoundingVolume, this.geoidHeightModel!);\n\n const propertyTable = getPropertyTable(tileContent, this.options.metadataClass);\n this.createAttributeStorageInfo(tileContent, propertyTable);\n\n this.conversionDump.attributeMetadataInfo = {\n attributeStorageInfo: this.attributeMetadataInfo.attributeStorageInfo,\n fields: this.attributeMetadataInfo.fields,\n popupInfo: this.attributeMetadataInfo.popupInfo\n };\n\n const resourcesData = await this._convertResources(\n sourceTile,\n transformationMatrix,\n sourceBoundingVolume,\n tileContent,\n parentNode.inPageId,\n propertyTable\n );\n\n const nodes: NodeIndexDocument[] = [];\n const nodeIds: number[] = [];\n const nodesInPage: NodeInPage[] = [];\n const emptyResources = {\n geometry: null,\n compressedGeometry: null,\n texture: null,\n hasUvRegions: false,\n sharedResources: null,\n meshMaterial: null,\n vertexCount: null,\n attributes: null,\n featureCount: null,\n boundingVolumes: null\n };\n\n for (const resources of resourcesData || [emptyResources]) {\n const {node, nodeInPage, nodeData} = await this._generateNodeIndexDocument(\n boundingVolumes,\n resources,\n parentNode,\n sourceTile,\n false\n );\n nodes.push(node);\n\n if (nodeInPage.mesh) {\n //update a record in a dump file\n if (sourceTile.id) {\n const dumpMetadata = {\n boundingVolumes: resources.boundingVolumes,\n attributesCount: resources.attributes?.length,\n featureCount: resources.featureCount,\n geometry: Boolean(resources.geometry),\n hasUvRegions: resources.hasUvRegions,\n materialId: nodeInPage.mesh.material.definition,\n texelCountHint: nodeInPage.mesh.material.texelCountHint,\n vertexCount: resources.vertexCount\n };\n this.conversionDump.setMaterialsDefinitions(this.materialDefinitions);\n await this.conversionDump.addNode(sourceTile.id, nodeInPage.index, dumpMetadata);\n }\n\n //write resources\n await this._writeResources(resources, node.id, sourceTile);\n }\n\n if (this.validate) {\n this.boundingVolumeWarnings = validateNodeBoundingVolumes(nodeData);\n\n if (this.boundingVolumeWarnings && this.boundingVolumeWarnings.length) {\n console.warn('Bounding Volume Warnings: ', ...this.boundingVolumeWarnings); //eslint-disable-line\n }\n }\n\n nodeIds.push(nodeInPage.index);\n nodesInPage.push(nodeInPage);\n }\n\n return nodes;\n }\n\n /**\n * Convert tile to one or more I3S nodes\n * @param sourceTile - source tile (3DTile)\n * @param transformationMatrix - transformation matrix of the current tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n * @param boundingVolume - initialized bounding volume of the source tile\n * @param tileContent - content of the source tile\n * @param parentId - id of parent node in node pages\n * @param propertyTable - batch table from b3dm / feature properties from EXT_FEATURE_METADATA, EXT_MESH_FEATURES or EXT_STRUCTURAL_METADATA\n * @returns - converted node resources\n */\n private async _convertResources(\n sourceTile: Tiles3DTileJSONPostprocessed,\n transformationMatrix: Matrix4,\n boundingVolume: OrientedBoundingBox | BoundingSphere,\n tileContent: Tiles3DTileContent | null,\n parentId: number,\n propertyTable: FeatureTableJson | null\n ): Promise<I3SConvertedResources[] | null> {\n if (!this.isContentSupported(sourceTile) || !tileContent) {\n return null;\n }\n const draftObb = {\n center: [],\n halfSize: [],\n quaternion: []\n };\n const resourcesData = await convertB3dmToI3sGeometry(\n tileContent,\n transformationMatrix,\n boundingVolume,\n async () => (await this.nodePages.push({index: 0, obb: draftObb}, parentId)).index,\n propertyTable,\n this.featuresHashArray,\n this.attributeMetadataInfo.attributeStorageInfo,\n this.options.draco,\n this.generateBoundingVolumes,\n this.options.mergeMaterials,\n this.geoidHeightModel!,\n this.loadOptions.modules as Record<string, string>,\n this.options.metadataClass\n );\n return resourcesData;\n }\n\n /**\n * Update node object (https://github.com/Esri/i3s-spec/blob/master/docs/1.7/node.cmn.md)\n * in node pages (https://github.com/Esri/i3s-spec/blob/master/docs/1.7/nodePage.cmn.md)\n * @param maxScreenThresholdSQ - Level of Details (LOD) metric\n * @param boundingVolumes - Bounding volumes\n * @param sourceTile - source tile (3DTile)\n * @param parentId - id of parent node in node pages\n * @param resources - the node resources data\n * @param resources.meshMaterial - PBR-like material object\n * @param resources.texture - texture image\n * @param resources.vertexCount - number of vertices in geometry\n * @param resources.featureCount - number of features\n * @param resources.geometry - Uint8Array with geometry attributes\n * @return the node object in node pages\n */\n private async _updateNodeInNodePages(\n maxScreenThresholdSQ: MaxScreenThresholdSQ,\n boundingVolumes: BoundingVolumes,\n sourceTile: Tiles3DTileJSONPostprocessed,\n parentId: number,\n resources: I3SConvertedResources | DumpMetadata\n ): Promise<NodeInPage> {\n const {vertexCount, featureCount, geometry, hasUvRegions} = resources;\n const nodeInPage: NodeInPage = {\n index: 0,\n lodThreshold: maxScreenThresholdSQ.maxError,\n obb: boundingVolumes.obb,\n children: []\n };\n if (geometry && this.isContentSupported(sourceTile)) {\n nodeInPage.mesh = {\n geometry: {\n definition: this.findOrCreateGeometryDefinition(\n Boolean(\n ('texture' in resources && resources.texture) ||\n ('texelCountHint' in resources && resources.texelCountHint)\n ),\n hasUvRegions\n ),\n resource: 0\n },\n attribute: {\n resource: 0\n },\n material: {\n definition: 0\n }\n };\n }\n\n let nodeId = 'nodeId' in resources ? resources.nodeId : undefined;\n let node: NodeInPage;\n if (!nodeId) {\n node = await this.nodePages.push(nodeInPage, parentId);\n } else {\n node = await this.nodePages.getNodeById(nodeId);\n }\n\n if (!nodeInPage.mesh) {\n console.log(`[warning]: node ${node.index} is created with empty content`);\n }\n\n NodePages.updateAll(node, nodeInPage);\n if ('meshMaterial' in resources && resources.meshMaterial) {\n NodePages.updateMaterialByNodeId(node, this._findOrCreateMaterial(resources.meshMaterial));\n } else if ('materialId' in resources && resources.materialId !== null) {\n NodePages.updateMaterialByNodeId(node, resources.materialId);\n }\n if ('texture' in resources && resources.texture) {\n const texelCountHint = resources.texture.image.height * resources.texture.image.width;\n NodePages.updateTexelCountHintByNodeId(node, texelCountHint);\n } else if ('texelCountHint' in resources && resources.texelCountHint) {\n NodePages.updateTexelCountHintByNodeId(node, resources.texelCountHint);\n }\n if (vertexCount) {\n this.vertexCounter += vertexCount;\n NodePages.updateVertexCountByNodeId(node, vertexCount);\n }\n NodePages.updateNodeAttributeByNodeId(node);\n if (featureCount) {\n NodePages.updateFeatureCountByNodeId(node, featureCount);\n }\n\n this.nodePages.saveNode(node);\n\n return node;\n }\n\n /**\n * Write node resources in files\n * @param resources - source tile (3DTile)\n * @param resources.geometry - Uint8Array with geometry attributes\n * @param resources.compressedGeometry - Uint8Array with compressed (draco) geometry\n * @param resources.texture - texture image\n * @param resources.sharedResources - shared resource data object\n * @param resources.attributes - feature attributes\n * @param nodePath - node path\n * @param sourceTile - source tile (3DTile)\n * @return {Promise<void>}\n */\n private async _writeResources(\n resources: I3SConvertedResources,\n nodePath: string,\n sourceTile: Tiles3DTileJSONPostprocessed\n ): Promise<void> {\n const {\n geometry: geometryBuffer,\n compressedGeometry,\n texture,\n sharedResources,\n attributes\n } = resources;\n const childPath = join(this.layers0Path, 'nodes', nodePath);\n const slpkChildPath = join('nodes', nodePath);\n\n await this._writeGeometries(\n geometryBuffer!,\n compressedGeometry!,\n childPath,\n slpkChildPath,\n sourceTile.id || '',\n parseInt(nodePath)\n );\n await this._writeShared(\n sharedResources,\n childPath,\n slpkChildPath,\n nodePath,\n sourceTile.id || '',\n parseInt(nodePath)\n );\n await this._writeTexture(\n texture,\n childPath,\n slpkChildPath,\n sourceTile.id || '',\n parseInt(nodePath)\n );\n await this._writeAttributes(\n attributes,\n childPath,\n slpkChildPath,\n sourceTile.id || '',\n parseInt(nodePath)\n );\n }\n\n /**\n * Write non-compressed and compressed geometries in files\n * @param geometryBuffer - Uint8Array with geometry attributes\n * @param compressedGeometry - Uint8Array with compressed (draco) geometry\n * @param childPath - a child path to write resources\n * @param slpkChildPath - resource path inside *slpk file\n * @param sourceId - source filename\n * @param nodeId - nodeId of a converted node for the writing\n */\n private async _writeGeometries(\n geometryBuffer: ArrayBuffer,\n compressedGeometry: Promise<ArrayBuffer>,\n childPath: string,\n slpkChildPath: string,\n sourceId: string,\n nodeId: number\n ): Promise<void> {\n this.conversionDump.updateDoneStatus(sourceId, nodeId, ResourceType.GEOMETRY, false);\n\n if (this.options.slpk) {\n const slpkGeometryPath = join(childPath, 'geometries');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/geometries/0.bin.gz`,\n sourceId,\n outputId: nodeId,\n resourceType: ResourceType.GEOMETRY,\n writePromise: () => writeFileForSlpk(slpkGeometryPath, geometryBuffer, '0.bin')\n });\n } else {\n const geometryPath = join(childPath, 'geometries/0/');\n await this.writeQueue.enqueue({\n sourceId,\n outputId: nodeId,\n resourceType: ResourceType.GEOMETRY,\n writePromise: () => writeFile(geometryPath, geometryBuffer, 'index.bin')\n });\n }\n\n if (this.options.draco) {\n this.conversionDump.updateDoneStatus(sourceId, nodeId, ResourceType.DRACO_GEOMETRY, false);\n\n if (this.options.slpk) {\n const slpkCompressedGeometryPath = join(childPath, 'geometries');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/geometries/1.bin.gz`,\n sourceId,\n outputId: nodeId,\n resourceType: ResourceType.DRACO_GEOMETRY,\n writePromise: () =>\n writeFileForSlpk(slpkCompressedGeometryPath, compressedGeometry, '1.bin')\n });\n } else {\n const compressedGeometryPath = join(childPath, 'geometries/1/');\n await this.writeQueue.enqueue({\n sourceId,\n outputId: nodeId,\n resourceType: ResourceType.DRACO_GEOMETRY,\n writePromise: () => writeFile(compressedGeometryPath, compressedGeometry, 'index.bin')\n });\n }\n }\n }\n\n /**\n * Write shared resources in a file\n * @param sharedResources - shared resource data object\n * @param childPath - a child path to write resources\n * @param slpkChildPath - resource path inside *slpk file\n * @param nodePath - a node path\n * @param sourceId - source filename\n * @param nodeId - nodeId of a converted node for the writing\n */\n private async _writeShared(\n sharedResources: SharedResourcesArrays | null,\n childPath: string,\n slpkChildPath: string,\n nodePath: string,\n sourceId: string,\n nodeId: number\n ): Promise<void> {\n if (!sharedResources) {\n return;\n }\n sharedResources.nodePath = nodePath;\n const sharedData = transform(sharedResources, sharedResourcesTemplate());\n const sharedDataStr = JSON.stringify(sharedData);\n this.conversionDump.updateDoneStatus(sourceId, nodeId, ResourceType.SHARED, false);\n if (this.options.slpk) {\n const slpkSharedPath = join(childPath, 'shared');\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/shared/sharedResource.json.gz`,\n sourceId,\n outputId: nodeId,\n resourceType: ResourceType.SHARED,\n writePromise: () => writeFileForSlpk(slpkSharedPath, sharedDataStr, 'sharedResource.json')\n });\n } else {\n const sharedPath = join(childPath, 'shared/');\n await this.writeQueue.enqueue({\n sourceId,\n outputId: nodeId,\n resourceType: ResourceType.SHARED,\n writePromise: () => writeFile(sharedPath, sharedDataStr)\n });\n }\n }\n\n /**\n * Generates textures based on texture mime type and fill in textureSetDefinitions data.\n * @param texture - the texture image\n * @param childPath - a child path to write resources\n * @param slpkChildPath - the resource path inside *slpk file\n * @param sourceId - source filename\n * @param nodeId - nodeId of a converted node for the writing\n */\n private async _writeTexture(\n texture: GLTFImagePostprocessed,\n childPath: string,\n slpkChildPath: string,\n sourceId: string,\n nodeId: number\n ): Promise<void> {\n if (texture) {\n const format = this._getFormatByMimeType(texture?.mimeType);\n const formats: TextureSetDefinitionFormats = [];\n const textureData = texture.bufferView!.data;\n\n switch (format) {\n case 'jpg':\n case 'png': {\n formats.push({name: '0', format});\n this.conversionDump.updateDoneStatus(\n sourceId,\n nodeId,\n `${ResourceType.TEXTURE}/${format}`,\n false\n );\n await this.writeTextureFile(\n textureData,\n '0',\n format,\n childPath,\n slpkChildPath,\n sourceId,\n nodeId\n );\n\n if (this.generateTextures) {\n formats.push({name: '1', format: 'ktx2'});\n // For Node.js texture.image.data is type of Buffer\n const copyArrayBuffer = texture.image.data.subarray();\n const arrayToEncode = new Uint8Array(copyArrayBuffer);\n const ktx2TextureData = encode(\n {...texture.image, data: arrayToEncode},\n // @ts-expect-error - Worker encoder typing is still WIP\n KTX2BasisWriterWorker,\n {\n ...KTX2BasisWriterWorker.options,\n ['ktx2-basis-writer']: {\n // We need to load local fs workers because nodejs can't load workers from the Internet\n workerUrl: './modules/textures/dist/ktx2-basis-writer-worker-node.js'\n },\n reuseWorkers: true,\n _nodeWorkers: true,\n useLocalLibraries: true\n }\n );\n\n this.conversionDump.updateDoneStatus(\n sourceId,\n nodeId,\n `${ResourceType.TEXTURE}/ktx2`,\n false\n );\n\n await this.writeTextureFile(\n ktx2TextureData,\n '1',\n 'ktx2',\n childPath,\n slpkChildPath,\n sourceId,\n nodeId\n );\n }\n\n break;\n }\n\n case 'ktx2': {\n formats.push({name: '1', format});\n this.conversionDump.updateDoneStatus(\n sourceId,\n nodeId,\n `${ResourceType.TEXTURE}/${format}`,\n false\n );\n await this.writeTextureFile(\n textureData,\n '1',\n format,\n childPath,\n slpkChildPath,\n sourceId,\n nodeId\n );\n\n if (this.generateTextures) {\n formats.push({name: '0', format: 'jpg'});\n const decodedFromKTX2TextureData = encode(texture.image!.data[0], ImageWriter);\n this.conversionDump.updateDoneStatus(\n sourceId,\n nodeId,\n `${ResourceType.TEXTURE}/jpg`,\n false\n );\n await this.writeTextureFile(\n decodedFromKTX2TextureData,\n '0',\n 'jpg',\n childPath,\n slpkChildPath,\n sourceId,\n nodeId\n );\n }\n }\n }\n\n if (!this.layers0!.textureSetDefinitions!.length) {\n this.layers0!.textureSetDefinitions!.push({formats});\n this.layers0!.textureSetDefinitions!.push({formats, atlas: true});\n if (this.layers0!.textureSetDefinitions) {\n this.conversionDump.addTexturesDefinitions(this.layers0!.textureSetDefinitions);\n }\n }\n }\n }\n\n /**\n * Write the texture image in a file\n * @param textureData\n * @param name\n * @param format\n * @param childPath\n * @param slpkChildPath\n * @param sourceId\n * @param nodeId\n */\n private async writeTextureFile(\n textureData: Uint8Array | Promise<ArrayBuffer>,\n name: string,\n format: 'jpg' | 'png' | 'ktx2',\n childPath: string,\n slpkChildPath: string,\n sourceId: string,\n nodeId: number\n ): Promise<void> {\n if (this.options.slpk) {\n const slpkTexturePath = join(childPath, 'textures');\n const compress = false;\n\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/textures/${name}.${format}`,\n sourceId,\n outputId: nodeId,\n resourceType: `${ResourceType.TEXTURE}/${format}`,\n writePromise: () =>\n writeFileForSlpk(slpkTexturePath, textureData, `${name}.${format}`, compress)\n });\n } else {\n const texturePath = join(childPath, `textures/${name}/`);\n await this.writeQueue.enqueue({\n sourceId,\n outputId: nodeId,\n resourceType: `${ResourceType.TEXTURE}/${format}`,\n writePromise: () => writeFile(texturePath, textureData, `index.${format}`)\n });\n }\n }\n\n /**\n * Write feature attributes in files\n * @param attributes - feature attributes\n * @param childPath - a child path to write resources\n * @param slpkChildPath - the resource path inside *slpk file\n * @param sourceId - source filename\n * @param nodeId - nodeId of a converted node for the writing\n */\n private async _writeAttributes(\n attributes: ArrayBuffer[] | null = [],\n childPath: string,\n slpkChildPath: string,\n sourceId: string,\n nodeId: number\n ): Promise<void> {\n if (attributes?.length && this.attributeMetadataInfo.attributeStorageInfo.length) {\n const minimumLength =\n attributes.length < this.attributeMetadataInfo.attributeStorageInfo.length\n ? attributes.length\n : this.attributeMetadataInfo.attributeStorageInfo.length;\n\n for (let index = 0; index < minimumLength; index++) {\n const folderName = this.attributeMetadataInfo.attributeStorageInfo[index].key;\n const fileBuffer = new Uint8Array(attributes[index]);\n this.conversionDump.updateDoneStatus(\n sourceId,\n nodeId,\n `${ResourceType.ATTRIBUTES}/${folderName}`,\n false\n );\n if (this.options.slpk) {\n const slpkAttributesPath = join(childPath, 'attributes', folderName);\n await this.writeQueue.enqueue({\n archiveKey: `${slpkChildPath}/attributes/${folderName}.bin.gz`,\n sourceId,\n outputId: nodeId,\n resourceType: `${ResourceType.ATTRIBUTES}/${folderName}`,\n writePromise: () => writeFileForSlpk(slpkAttributesPath, fileBuffer, '0.bin')\n });\n } else {\n const attributesPath = join(childPath, `attributes/${folderName}/0`);\n await this.writeQueue.enqueue({\n sourceId,\n outputId: nodeId,\n resourceType: `${ResourceType.ATTRIBUTES}/${folderName}`,\n writePromise: () => writeFile(attributesPath, fileBuffer, 'index.bin')\n });\n }\n }\n }\n }\n\n /**\n * Return file format by its MIME type\n * @param mimeType - feature attributes\n */\n private _getFormatByMimeType(mimeType: string | undefined): 'jpg' | 'png' | 'ktx2' {\n switch (mimeType) {\n case 'image/jpeg':\n return 'jpg';\n case 'image/png':\n return 'png';\n case 'image/ktx2':\n return 'ktx2';\n default:\n return 'jpg';\n }\n }\n\n /**\n * Find or create material in materialDefinitions array\n * @param material - end-to-end index of the node\n * @return material id\n */\n private _findOrCreateMaterial(material: I3SMaterialDefinition): number {\n const hash = md5(JSON.stringify(material));\n if (this.materialMap.has(hash)) {\n return this.materialMap.get(hash) || 0;\n }\n const newMaterialId = this.materialDefinitions.push(material) - 1;\n this.materialMap.set(hash, newMaterialId);\n return newMaterialId;\n }\n\n /**\n * Get unique geometry configuration index\n * In the end of conversion configurations will be transformed to geometryDefinitions array\n * @param hasTexture\n * @param hasUvRegions\n * @returns\n */\n private findOrCreateGeometryDefinition(hasTexture: boolean, hasUvRegions: boolean): number {\n const geometryConfig = {hasTexture, hasUvRegions};\n const hash = md5(JSON.stringify(geometryConfig));\n if (this.geometryMap.has(hash)) {\n return this.geometryMap.get(hash) || 0;\n }\n const newGeometryId = this.geometryConfigs.push(geometryConfig) - 1;\n this.geometryMap.set(hash, newGeometryId);\n return newGeometryId;\n }\n\n /**\n * Creates attribute storage info based on either extension schema or property table.\n * @param tileContent - content of the source tile\n * @param propertyTable - feature properties from EXT_FEATURE_METADATA, EXT_STRUCTURAL_METADATA\n */\n private createAttributeStorageInfo(\n tileContent: Tiles3DTileContent | null,\n propertyTable: FeatureTableJson | null\n ): void {\n /*\n In case the tileset doesn't have either EXT_structural_metadata or EXT_feature_metadata\n that can be a source of attribute information so metadataClass is not specified\n we will collect attribute information for node attributes from the property table\n taken from each tile.\n */\n let attributeTypesMap: Record<string, Attribute> | null = null;\n if (this.options.metadataClass) {\n if (!this.attributeMetadataInfo.attributeStorageInfo.length && tileContent?.gltf) {\n attributeTypesMap = getAttributeTypesMapFromSchema(\n tileContent.gltf,\n this.options.metadataClass\n );\n }\n } else if (propertyTable) {\n attributeTypesMap = getAttributeTypesMapFromPropertyTable(propertyTable);\n }\n\n if (attributeTypesMap) {\n // Add new storage attributes, fields and create popupInfo\n this.attributeMetadataInfo.addMetadataInfo(attributeTypesMap);\n }\n }\n\n /**\n * Print statistics in the end of conversion\n * @param params - output files data\n */\n private async _finishConversion(params: {\n slpk: boolean;\n outputPath: string;\n tilesetName: string;\n }): Promise<void> {\n const {tilesCount, tilesWithAddRefineCount} = this.refinementCounter;\n const addRefinementPercentage = tilesWithAddRefineCount\n ? (tilesWithAddRefineCount / tilesCount) * 100\n : 0;\n const filesSize = await calculateFilesSize(params);\n const diff = process.hrtime(this.conversionStartTime);\n const conversionTime = timeConverter(diff);\n console.log(`------------------------------------------------`); // eslint-disable-line no-undef, no-console\n console.log(`Finishing conversion of ${_3D_TILES}`); // eslint-disable-line no-undef, no-console\n console.log(`Total conversion time: ${conversionTime}`); // eslint-disable-line no-undef, no-console\n console.log(`Vertex count: `, this.vertexCounter); // eslint-disable-line no-undef, no-console\n console.log(`File(s) size: `, filesSize, ' bytes'); // eslint-disable-line no-undef, no-console\n console.log(`Percentage of tiles with \"ADD\" refinement type:`, addRefinementPercentage, '%'); // eslint-disable-line no-undef, no-console\n console.log(`------------------------------------------------`); // eslint-disable-line no-undef, no-console\n }\n\n /**\n * Fetch preload options for ION tileset\n */\n private async _fetchPreloadOptions(): Promise<any> {\n if (!this.Loader.preload) {\n return {};\n }\n const options = {\n 'cesium-ion': {accessToken: this.options.token || ION_DEFAULT_TOKEN}\n };\n const preloadOptions = await this.Loader.preload(this.options.inputUrl, options);\n this.refreshTokenTime = process.hrtime();\n return {...options, ...preloadOptions};\n }\n\n /**\n * Update options of source tileset\n */\n private async _updateTilesetOptions(): Promise<void> {\n const diff = process.hrtime(this.refreshTokenTime);\n if (diff[0] < REFRESH_TOKEN_TIMEOUT) {\n return;\n }\n this.refreshTokenTime = process.hrtime();\n\n const preloadOptions = await this._fetchPreloadOptions();\n if (preloadOptions.headers) {\n this.loadOptions.fetch = {\n ...this.loadOptions.fetch,\n headers: preloadOptions.headers\n };\n console.log('Authorization Bearer token has been updated'); // eslint-disable-line no-undef, no-console\n }\n }\n\n /** Do calculations of all tiles and tiles with \"ADD\" type of refinement.\n * @param tile\n */\n private _checkAddRefinementTypeForTile(tile: Tiles3DTileJSONPostprocessed): void {\n const ADD_TILE_REFINEMENT = 1;\n\n if (tile.refine === ADD_TILE_REFINEMENT) {\n this.refinementCounter.tilesWithAddRefineCount += 1;\n console.warn('This tile uses \"ADD\" type of refinement'); // eslint-disable-line\n }\n\n this.refinementCounter.tilesCount += 1;\n }\n\n /**\n * Check if the tile's content format is supported by the converter\n * @param sourceTile\n * @returns\n */\n private isContentSupported(sourceTile: Tiles3DTileJSONPostprocessed): boolean {\n return ['b3dm', 'glTF', 'scenegraph'].includes(sourceTile.type || '');\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"geometry-definitions.js","names":["transform","PLAIN_GEOMETRY_DEFINITION","offset","default","position","type","component","normal","uv0","path","val","omitValues","color","uvRegion","featureId","binding","faceRange","COMPRESSED_GEOMETRY_DEFINITION","result","hasTexture","push","hasUvRegions","GEOMETRY_DEFINITION","geometryBuffers","draco","geometryConfig"],"sources":["../../../src/i3s-converter/json-templates/geometry-definitions.ts"],"sourcesContent":["import transform from 'json-map-transform';\n\nconst PLAIN_GEOMETRY_DEFINITION = () => ({\n offset: {\n default: 8\n },\n position: {\n default: {\n type: 'Float32',\n component: 3\n }\n },\n normal: {\n default: {\n type: 'Float32',\n component: 3\n }\n },\n uv0: {\n path: 'hasTexture',\n transform: (val) => (val && {type: 'Float32', component: 2}) || false,\n omitValues: [false]\n },\n color: {\n default: {\n type: 'UInt8',\n component: 4\n }\n },\n uvRegion: {\n path: 'hasUvRegions',\n transform: (val) => (val && {type: 'UInt16', component: 4}) || false,\n omitValues: [false]\n },\n featureId: {\n default: {\n binding: 'per-feature',\n type: 'UInt64',\n component: 1\n }\n },\n faceRange: {\n default: {\n binding: 'per-feature',\n type: 'UInt32',\n component: 2\n }\n }\n});\n\nconst COMPRESSED_GEOMETRY_DEFINITION = () => ({\n 'compressedAttributes.encoding': {\n default: 'draco'\n },\n 'compressedAttributes.attributes': {\n path: 'geometryConfig',\n transform: (val) => {\n const result = ['position', 'normal'];\n if (val.hasTexture) {\n result.push('uv0');\n }\n result.push('color');\n if (val.hasUvRegions) {\n result.push('uv-region');\n }\n result.push('feature-index');\n return result;\n }\n }\n});\n\nexport const GEOMETRY_DEFINITION = () => ({\n geometryBuffers: {\n path: 'geometryConfig',\n transform: (val) => {\n const result = [transform(val, PLAIN_GEOMETRY_DEFINITION())];\n if (val.draco) {\n result.push(transform({geometryConfig: val}, COMPRESSED_GEOMETRY_DEFINITION()));\n }\n return result;\n }\n }\n});\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,oBAAoB;AAE1C,MAAMC,yBAAyB,GAAGA,CAAA,MAAO;EACvCC,MAAM,EAAE;IACNC,OAAO,EAAE;EACX,CAAC;EACDC,QAAQ,EAAE;IACRD,OAAO,EAAE;MACPE,IAAI,EAAE,SAAS;MACfC,SAAS,EAAE;IACb;EACF,CAAC;EACDC,MAAM,EAAE;IACNJ,OAAO,EAAE;MACPE,IAAI,EAAE,SAAS;MACfC,SAAS,EAAE;IACb;EACF,CAAC;EACDE,GAAG,EAAE;IACHC,IAAI,EAAE,YAAY;IAClBT,SAAS,EAAGU,GAAG,IAAMA,GAAG,IAAI;MAACL,IAAI,EAAE,SAAS;MAAEC,SAAS,EAAE;IAAC,CAAC,IAAK,KAAK;IACrEK,UAAU,EAAE,CAAC,KAAK;EACpB,CAAC;EACDC,KAAK,EAAE;IACLT,OAAO,EAAE;MACPE,IAAI,EAAE,OAAO;MACbC,SAAS,EAAE;IACb;EACF,CAAC;EACDO,QAAQ,EAAE;IACRJ,IAAI,EAAE,cAAc;IACpBT,SAAS,EAAGU,GAAG,IAAMA,GAAG,IAAI;MAACL,IAAI,EAAE,QAAQ;MAAEC,SAAS,EAAE;IAAC,CAAC,IAAK,KAAK;IACpEK,UAAU,EAAE,CAAC,KAAK;EACpB,CAAC;EACDG,SAAS,EAAE;IACTX,OAAO,EAAE;MACPY,OAAO,EAAE,aAAa;MACtBV,IAAI,EAAE,QAAQ;MACdC,SAAS,EAAE;IACb;EACF,CAAC;EACDU,SAAS,EAAE;IACTb,OAAO,EAAE;MACPY,OAAO,EAAE,aAAa;MACtBV,IAAI,EAAE,QAAQ;MACdC,SAAS,EAAE;IACb;EACF;AACF,CAAC,CAAC;AAEF,MAAMW,8BAA8B,GAAGA,CAAA,MAAO;EAC5C,+BAA+B,EAAE;IAC/Bd,OAAO,EAAE;EACX,CAAC;EACD,iCAAiC,EAAE;IACjCM,IAAI,EAAE,gBAAgB;IACtBT,SAAS,EAAGU,GAAG,IAAK;MAClB,MAAMQ,MAAM,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC;MACrC,IAAIR,GAAG,CAACS,UAAU,EAAE;QAClBD,MAAM,CAACE,IAAI,CAAC,KAAK,CAAC;MACpB;MACAF,MAAM,CAACE,IAAI,CAAC,OAAO,CAAC;MACpB,IAAIV,GAAG,CAACW,YAAY,EAAE;QACpBH,MAAM,CAACE,IAAI,CAAC,WAAW,CAAC;MAC1B;MACAF,MAAM,CAACE,IAAI,CAAC,eAAe,CAAC;MAC5B,OAAOF,MAAM;IACf;EACF;AACF,CAAC,CAAC;AAEF,OAAO,MAAMI,mBAAmB,GAAGA,CAAA,MAAO;EACxCC,eAAe,EAAE;IACfd,IAAI,EAAE,gBAAgB;IACtBT,SAAS,EAAGU,GAAG,IAAK;MAClB,MAAMQ,MAAM,GAAG,CAAClB,SAAS,CAACU,GAAG,EAAET,yBAAyB,CAAC,CAAC,CAAC,CAAC;MAC5D,IAAIS,GAAG,CAACc,KAAK,EAAE;QACbN,MAAM,CAACE,IAAI,CAACpB,SAAS,CAAC;UAACyB,cAAc,EAAEf;QAAG,CAAC,EAAEO,8BAA8B,CAAC,CAAC,CAAC,CAAC;MACjF;MACA,OAAOC,MAAM;IACf;EACF;AACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"layers.js","names":["transform","STORE","SPATIAL_REFERENCE","wkid","path","default","latestWkid","vcsWkid","latestVcsWkid","HEIGHT_MODEL_INFO","heightModel","vertCRS","heightUnit","NODE_PAGES","nodesPerPage","lodSelectionMetricType","FULL_EXTENT","xmin","ymin","xmax","ymax","zmin","zmax","LAYERS","version","val","toUpperCase","id","name","href","layerType","spatialReference","capabilities","store","fullExtent","heightModelInfo","nodePages","materialDefinitions","textureSetDefinitions","geometryDefinitions","attributeStorageInfo","fields","popupInfo"],"sources":["../../../src/i3s-converter/json-templates/layers.ts"],"sourcesContent":["import transform from 'json-map-transform';\nimport {STORE} from './store';\n\nconst SPATIAL_REFERENCE = () => ({\n wkid: {\n path: 'wkid',\n default: 4326\n },\n latestWkid: {\n path: 'latestWkid',\n default: 4326\n },\n vcsWkid: {\n path: 'vcsWkid',\n default: 5773\n },\n latestVcsWkid: {\n path: 'latestVcsWkid',\n default: 5773\n }\n});\n\nconst HEIGHT_MODEL_INFO = () => ({\n heightModel: {\n path: 'heightModel',\n default: 'gravity_related_height'\n },\n vertCRS: {\n path: 'vertCRS',\n default: 'EGM96_Geoid'\n },\n heightUnit: {\n path: 'heightUnit',\n default: 'meter'\n }\n});\n\nconst NODE_PAGES = () => ({\n nodesPerPage: {\n path: 'nodesPerPage'\n },\n lodSelectionMetricType: {\n path: 'lodSelectionMetricType',\n default: 'maxScreenThresholdSQ'\n }\n});\n\nconst FULL_EXTENT = () => ({\n xmin: {\n path: 'xmin'\n },\n ymin: {\n path: 'ymin'\n },\n xmax: {\n path: 'xmax'\n },\n ymax: {\n path: 'ymax'\n },\n zmin: {\n path: 'zmin'\n },\n zmax: {\n path: 'zmax'\n }\n});\n\nexport const LAYERS = () => ({\n version: {\n path: 'version',\n transform: (val) => val.toUpperCase()\n },\n id: {\n path: 'id',\n default: 0\n },\n name: {\n path: 'name'\n },\n href: {\n path: 'href',\n default: './layers/0'\n },\n layerType: {\n path: 'layerType',\n default: 'IntegratedMesh'\n },\n spatialReference: {\n path: 'spatialReference',\n transform: (val) => transform(val, SPATIAL_REFERENCE())\n },\n capabilities: {\n path: 'capabilities',\n default: ['View', 'Query']\n },\n store: {\n path: 'store',\n transform: (val) => transform(val, STORE)\n },\n fullExtent: {\n path: 'fullExtent',\n transform: (val) => transform(val, FULL_EXTENT())\n },\n heightModelInfo: {\n path: 'heightModelInfo',\n transform: (val) => transform(val, HEIGHT_MODEL_INFO())\n },\n nodePages: {\n path: 'nodePages',\n transform: (val) => transform(val, NODE_PAGES())\n },\n materialDefinitions: {\n path: 'materialDefinitions',\n default: []\n },\n textureSetDefinitions: {\n path: 'textureSetDefinitions',\n default: []\n },\n geometryDefinitions: {\n path: 'geometryDefinitions',\n default: []\n },\n attributeStorageInfo: {\n path: 'attributeStorageInfo',\n default: []\n },\n fields: {\n path: 'fields',\n default: []\n },\n popupInfo: {\n path: 'popupInfo',\n default: null\n }\n});\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadata.js","names":["METADATA","folderPattern","path","default","archiveCompressionType","resourceCompressionType","I3SVersion","nodeCount"],"sources":["../../../src/i3s-converter/json-templates/metadata.ts"],"sourcesContent":["export const METADATA = () => ({\n folderPattern: {\n path: 'folderPattern',\n default: 'BASIC'\n },\n archiveCompressionType: {\n path: 'archiveCompressionType',\n default: 'STORE'\n },\n resourceCompressionType: {\n path: 'resourceCompressionType',\n default: 'GZIP'\n },\n I3SVersion: {\n path: 'I3SVersion',\n default: '1.8'\n },\n nodeCount: {\n path: 'nodeCount'\n }\n});\n"],"mappings":"AAAA,OAAO,MAAMA,QAAQ,GAAGA,CAAA,MAAO;EAC7BC,aAAa,EAAE;IACbC,IAAI,EAAE,eAAe;IACrBC,OAAO,EAAE;EACX,CAAC;EACDC,sBAAsB,EAAE;IACtBF,IAAI,EAAE,wBAAwB;IAC9BC,OAAO,EAAE;EACX,CAAC;EACDE,uBAAuB,EAAE;IACvBH,IAAI,EAAE,yBAAyB;IAC/BC,OAAO,EAAE;EACX,CAAC;EACDG,UAAU,EAAE;IACVJ,IAAI,EAAE,YAAY;IAClBC,OAAO,EAAE;EACX,CAAC;EACDI,SAAS,EAAE;IACTL,IAAI,EAAE;EACR;AACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.js","names":["transform","COORDINATES","mbs","path","obb","HREF","href","PARENT_NODE","id","NODE","version","level","lodSelection","default","metricType","maxError","children","neighbors","parentNode","val","sharedResource","featureData","geometryData","textureData","attributeData"],"sources":["../../../src/i3s-converter/json-templates/node.ts"],"sourcesContent":["import transform from 'json-map-transform';\n\nconst COORDINATES = () => ({\n mbs: {\n path: 'mbs'\n },\n obb: {\n path: 'obb'\n }\n});\n\nconst HREF = () => ({\n href: {\n path: 'href'\n }\n});\n\nconst PARENT_NODE = () => ({\n id: {\n path: 'id'\n },\n ...HREF(),\n ...COORDINATES()\n});\n\nexport const NODE = () => ({\n version: {\n path: 'version'\n },\n id: {\n path: 'id'\n },\n path: {\n path: 'path'\n },\n level: {\n path: 'level'\n },\n ...COORDINATES(),\n lodSelection: {\n path: 'lodSelection',\n default: [\n {\n metricType: 'maxScreenThresholdSQ',\n maxError: 196349.54374999998\n },\n {\n metricType: 'maxScreenThreshold',\n maxError: 999.99999999999994\n }\n ]\n },\n children: {\n path: 'children',\n default: null\n },\n neighbors: {\n path: 'neighbors',\n default: null\n },\n parentNode: {\n path: 'parentNode',\n transform: (val) => transform(val, PARENT_NODE()),\n default: null\n },\n sharedResource: {\n path: 'sharedResource',\n default: null\n },\n featureData: {\n path: 'featureData',\n default: null\n },\n geometryData: {\n path: 'geometryData',\n default: null\n },\n textureData: {\n path: 'textureData',\n default: null\n },\n attributeData: {\n path: 'attributeData',\n default: null\n }\n});\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,oBAAoB;AAE1C,MAAMC,WAAW,GAAGA,CAAA,MAAO;EACzBC,GAAG,EAAE;IACHC,IAAI,EAAE;EACR,CAAC;EACDC,GAAG,EAAE;IACHD,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAEF,MAAME,IAAI,GAAGA,CAAA,MAAO;EAClBC,IAAI,EAAE;IACJH,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAEF,MAAMI,WAAW,GAAGA,CAAA,MAAO;EACzBC,EAAE,EAAE;IACFL,IAAI,EAAE;EACR,CAAC;EACD,GAAGE,IAAI,CAAC,CAAC;EACT,GAAGJ,WAAW,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,MAAMQ,IAAI,GAAGA,CAAA,MAAO;EACzBC,OAAO,EAAE;IACPP,IAAI,EAAE;EACR,CAAC;EACDK,EAAE,EAAE;IACFL,IAAI,EAAE;EACR,CAAC;EACDA,IAAI,EAAE;IACJA,IAAI,EAAE;EACR,CAAC;EACDQ,KAAK,EAAE;IACLR,IAAI,EAAE;EACR,CAAC;EACD,GAAGF,WAAW,CAAC,CAAC;EAChBW,YAAY,EAAE;IACZT,IAAI,EAAE,cAAc;IACpBU,OAAO,EAAE,CACP;MACEC,UAAU,EAAE,sBAAsB;MAClCC,QAAQ,EAAE;IACZ,CAAC,EACD;MACED,UAAU,EAAE,oBAAoB;MAChCC,QAAQ,EAAE;IACZ,CAAC;EAEL,CAAC;EACDC,QAAQ,EAAE;IACRb,IAAI,EAAE,UAAU;IAChBU,OAAO,EAAE;EACX,CAAC;EACDI,SAAS,EAAE;IACTd,IAAI,EAAE,WAAW;IACjBU,OAAO,EAAE;EACX,CAAC;EACDK,UAAU,EAAE;IACVf,IAAI,EAAE,YAAY;IAClBH,SAAS,EAAGmB,GAAG,IAAKnB,SAAS,CAACmB,GAAG,EAAEZ,WAAW,CAAC,CAAC,CAAC;IACjDM,OAAO,EAAE;EACX,CAAC;EACDO,cAAc,EAAE;IACdjB,IAAI,EAAE,gBAAgB;IACtBU,OAAO,EAAE;EACX,CAAC;EACDQ,WAAW,EAAE;IACXlB,IAAI,EAAE,aAAa;IACnBU,OAAO,EAAE;EACX,CAAC;EACDS,YAAY,EAAE;IACZnB,IAAI,EAAE,cAAc;IACpBU,OAAO,EAAE;EACX,CAAC;EACDU,WAAW,EAAE;IACXpB,IAAI,EAAE,aAAa;IACnBU,OAAO,EAAE;EACX,CAAC;EACDW,aAAa,EAAE;IACbrB,IAAI,EAAE,eAAe;IACrBU,OAAO,EAAE;EACX;AACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scene-server.js","names":["SCENE_SERVER","serviceItemId","path","serviceName","name","currentVersion","default","serviceVersion","supportedBindings","layers","transform","layers0"],"sources":["../../../src/i3s-converter/json-templates/scene-server.ts"],"sourcesContent":["export const SCENE_SERVER = () => ({\n serviceItemId: {\n path: 'serviceItemId'\n },\n serviceName: {\n path: 'layerName'\n },\n name: {\n path: 'layerName'\n },\n currentVersion: {\n path: 'currentVersion',\n default: 10.7\n },\n serviceVersion: {\n path: 'serviceVersion',\n default: '1.8'\n },\n supportedBindings: {\n path: 'supportedBindings',\n default: ['REST']\n },\n layers: {\n path: 'layers0',\n transform: (layers0) => [layers0]\n }\n});\n"],"mappings":"AAAA,OAAO,MAAMA,YAAY,GAAGA,CAAA,MAAO;EACjCC,aAAa,EAAE;IACbC,IAAI,EAAE;EACR,CAAC;EACDC,WAAW,EAAE;IACXD,IAAI,EAAE;EACR,CAAC;EACDE,IAAI,EAAE;IACJF,IAAI,EAAE;EACR,CAAC;EACDG,cAAc,EAAE;IACdH,IAAI,EAAE,gBAAgB;IACtBI,OAAO,EAAE;EACX,CAAC;EACDC,cAAc,EAAE;IACdL,IAAI,EAAE,gBAAgB;IACtBI,OAAO,EAAE;EACX,CAAC;EACDE,iBAAiB,EAAE;IACjBN,IAAI,EAAE,mBAAmB;IACzBI,OAAO,EAAE,CAAC,MAAM;EAClB,CAAC;EACDG,MAAM,EAAE;IACNP,IAAI,EAAE,SAAS;IACfQ,SAAS,EAAGC,OAAO,IAAK,CAACA,OAAO;EAClC;AACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared-resources.js","names":["transform","MATERIAL_DEFINITION_INFO_PARAMS","renderMode","path","default","shininess","reflectivity","ambient","diffuse","specular","useVertexColorAlpha","vertexRegions","vertexColors","MATERIAL_DEFINITION_INFO","name","type","params","val","thisObject","originalObject","TEXTURE_DEFINITION_IMAGE","id","size","href","length","TEXTURE_DEFINITION_INFO","encoding","wrap","atlas","uvSet","channels","images","map","image","SHARED_RESOURCES","materialDefinitions","transfromMaterialDefinitions","textureDefinitions","transfromTextureDefinitions","materialDefinitionInfos","result","index","materialDefinitionInfo","entries","nodePath","textureDefinitionInfos","textureDefinitionInfo","imageIndex"],"sources":["../../../src/i3s-converter/json-templates/shared-resources.ts"],"sourcesContent":["import transform from 'json-map-transform';\n\nconst MATERIAL_DEFINITION_INFO_PARAMS = () => ({\n renderMode: {\n path: 'renderMode',\n default: 'solid'\n },\n shininess: {\n path: 'shininess',\n default: 1\n },\n reflectivity: {\n path: 'reflectivity',\n default: 0\n },\n ambient: {\n path: 'ambient',\n default: [1, 1, 1]\n },\n diffuse: {\n path: 'diffuse',\n default: [1, 1, 1]\n },\n specular: {\n path: 'specular',\n default: [0, 0, 0]\n },\n useVertexColorAlpha: {\n path: 'useVertexColorAlpha',\n default: false\n },\n vertexRegions: {\n path: 'vertexRegions',\n default: false\n },\n vertexColors: {\n path: 'vertexColors',\n default: true\n }\n});\n\nconst MATERIAL_DEFINITION_INFO = () => ({\n name: {\n path: 'name',\n default: 'standard'\n },\n type: {\n path: 'type',\n default: 'standard'\n },\n params: {\n path: 'params',\n transform: (val, thisObject, originalObject) =>\n transform(originalObject, MATERIAL_DEFINITION_INFO_PARAMS())\n }\n});\n\nconst TEXTURE_DEFINITION_IMAGE = () => ({\n id: {\n path: 'id'\n },\n size: {\n path: 'size'\n },\n href: {\n path: 'href',\n default: ['../textures/0']\n },\n length: {\n path: 'length'\n }\n});\n\nconst TEXTURE_DEFINITION_INFO = () => ({\n encoding: {\n path: 'encoding'\n },\n wrap: {\n path: 'wrap',\n default: ['none']\n },\n atlas: {\n path: 'atlas',\n default: false\n },\n uvSet: {\n path: 'uvSet',\n default: 'uv0'\n },\n channels: {\n path: 'channels',\n default: 'rgb'\n },\n images: {\n path: 'images',\n transform: (val, thisObject, originalObject) =>\n val.map((image) => transform(image, TEXTURE_DEFINITION_IMAGE()))\n }\n});\n\nexport const SHARED_RESOURCES = () => ({\n materialDefinitions: {\n path: 'materialDefinitionInfos',\n transform: transfromMaterialDefinitions\n },\n textureDefinitions: {\n path: 'textureDefinitionInfos',\n transform: transfromTextureDefinitions\n }\n});\n\nfunction transfromMaterialDefinitions(materialDefinitionInfos, thisObject, originalObject) {\n const result = {};\n for (const [index, materialDefinitionInfo] of materialDefinitionInfos.entries()) {\n result[`Mat${originalObject.nodePath}${index}`] = transform(\n materialDefinitionInfo,\n MATERIAL_DEFINITION_INFO()\n );\n }\n return result;\n}\n\nfunction transfromTextureDefinitions(textureDefinitionInfos, thisObject, originalObject) {\n if (!textureDefinitionInfos) {\n return null;\n }\n const result = {};\n for (const [index, textureDefinitionInfo] of textureDefinitionInfos.entries()) {\n const imageIndex = `${originalObject.nodePath}${index}`;\n textureDefinitionInfo.imageIndex = imageIndex;\n result[imageIndex] = transform(textureDefinitionInfo, TEXTURE_DEFINITION_INFO());\n }\n return result;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","names":["STORE","id","path","transform","val","toUpperCase","profile","default","version","resourcePattern","rootNode","extent","indexCRS","vertexCRS","normalReferenceFrame","attributeEncoding","textureEncoding","lodType","lodModel","defaultGeometrySchema","geometryType","header","property","type","topology","ordering","vertexAttributes","position","valueType","valuesPerElement","normal","uv0","color","featureAttributeOrder","featureAttributes","faceRange"],"sources":["../../../src/i3s-converter/json-templates/store.ts"],"sourcesContent":["export const STORE = {\n id: {\n path: 'id',\n transform: (val) => val.toUpperCase()\n },\n profile: {\n path: 'profile',\n default: 'meshpyramids'\n },\n version: {\n path: 'version',\n default: '1.8'\n },\n resourcePattern: {\n path: 'resourcePattern',\n default: ['3dNodeIndexDocument', 'Attributes', 'SharedResource', 'Geometry']\n },\n rootNode: {\n path: 'rootNode',\n default: './nodes/root'\n },\n extent: {\n path: 'extent'\n },\n indexCRS: {\n path: 'indexCRS',\n default: 'http://www.opengis.net/def/crs/EPSG/0/4326'\n },\n vertexCRS: {\n path: 'vertexCRS',\n default: 'http://www.opengis.net/def/crs/EPSG/0/4326'\n },\n normalReferenceFrame: {\n path: 'normalReferenceFrame',\n default: 'east-north-up'\n },\n attributeEncoding: {\n path: 'attributeEncoding',\n default: 'application/octet-stream; version=1.6'\n },\n textureEncoding: {\n path: 'textureEncoding',\n default: ['image/jpeg', 'image/ktx2']\n },\n lodType: {\n path: 'lodType',\n default: 'MeshPyramid'\n },\n lodModel: {\n path: 'lodModel',\n default: 'node-switching'\n },\n defaultGeometrySchema: {\n path: 'defaultGeometrySchema',\n default: {\n geometryType: 'triangles',\n header: [\n {\n property: 'vertexCount',\n type: 'UInt32'\n },\n {\n property: 'featureCount',\n type: 'UInt32'\n }\n ],\n topology: 'PerAttributeArray',\n ordering: ['position', 'normal', 'uv0', 'color'],\n vertexAttributes: {\n position: {\n valueType: 'Float32',\n valuesPerElement: 3\n },\n normal: {\n valueType: 'Float32',\n valuesPerElement: 3\n },\n uv0: {\n valueType: 'Float32',\n valuesPerElement: 2\n },\n color: {\n valueType: 'UInt8',\n valuesPerElement: 4\n }\n },\n featureAttributeOrder: ['id', 'faceRange'],\n featureAttributes: {\n id: {\n valueType: 'UInt64',\n valuesPerElement: 1\n },\n faceRange: {\n valueType: 'UInt32',\n valuesPerElement: 2\n }\n }\n }\n }\n};\n"],"mappings":"AAAA,OAAO,MAAMA,KAAK,GAAG;EACnBC,EAAE,EAAE;IACFC,IAAI,EAAE,IAAI;IACVC,SAAS,EAAGC,GAAG,IAAKA,GAAG,CAACC,WAAW,CAAC;EACtC,CAAC;EACDC,OAAO,EAAE;IACPJ,IAAI,EAAE,SAAS;IACfK,OAAO,EAAE;EACX,CAAC;EACDC,OAAO,EAAE;IACPN,IAAI,EAAE,SAAS;IACfK,OAAO,EAAE;EACX,CAAC;EACDE,eAAe,EAAE;IACfP,IAAI,EAAE,iBAAiB;IACvBK,OAAO,EAAE,CAAC,qBAAqB,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU;EAC7E,CAAC;EACDG,QAAQ,EAAE;IACRR,IAAI,EAAE,UAAU;IAChBK,OAAO,EAAE;EACX,CAAC;EACDI,MAAM,EAAE;IACNT,IAAI,EAAE;EACR,CAAC;EACDU,QAAQ,EAAE;IACRV,IAAI,EAAE,UAAU;IAChBK,OAAO,EAAE;EACX,CAAC;EACDM,SAAS,EAAE;IACTX,IAAI,EAAE,WAAW;IACjBK,OAAO,EAAE;EACX,CAAC;EACDO,oBAAoB,EAAE;IACpBZ,IAAI,EAAE,sBAAsB;IAC5BK,OAAO,EAAE;EACX,CAAC;EACDQ,iBAAiB,EAAE;IACjBb,IAAI,EAAE,mBAAmB;IACzBK,OAAO,EAAE;EACX,CAAC;EACDS,eAAe,EAAE;IACfd,IAAI,EAAE,iBAAiB;IACvBK,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY;EACtC,CAAC;EACDU,OAAO,EAAE;IACPf,IAAI,EAAE,SAAS;IACfK,OAAO,EAAE;EACX,CAAC;EACDW,QAAQ,EAAE;IACRhB,IAAI,EAAE,UAAU;IAChBK,OAAO,EAAE;EACX,CAAC;EACDY,qBAAqB,EAAE;IACrBjB,IAAI,EAAE,uBAAuB;IAC7BK,OAAO,EAAE;MACPa,YAAY,EAAE,WAAW;MACzBC,MAAM,EAAE,CACN;QACEC,QAAQ,EAAE,aAAa;QACvBC,IAAI,EAAE;MACR,CAAC,EACD;QACED,QAAQ,EAAE,cAAc;QACxBC,IAAI,EAAE;MACR,CAAC,CACF;MACDC,QAAQ,EAAE,mBAAmB;MAC7BC,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;MAChDC,gBAAgB,EAAE;QAChBC,QAAQ,EAAE;UACRC,SAAS,EAAE,SAAS;UACpBC,gBAAgB,EAAE;QACpB,CAAC;QACDC,MAAM,EAAE;UACNF,SAAS,EAAE,SAAS;UACpBC,gBAAgB,EAAE;QACpB,CAAC;QACDE,GAAG,EAAE;UACHH,SAAS,EAAE,SAAS;UACpBC,gBAAgB,EAAE;QACpB,CAAC;QACDG,KAAK,EAAE;UACLJ,SAAS,EAAE,OAAO;UAClBC,gBAAgB,EAAE;QACpB;MACF,CAAC;MACDI,qBAAqB,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC;MAC1CC,iBAAiB,EAAE;QACjBjC,EAAE,EAAE;UACF2B,SAAS,EAAE,QAAQ;UACnBC,gBAAgB,EAAE;QACpB,CAAC;QACDM,SAAS,EAAE;UACTP,SAAS,EAAE,QAAQ;UACnBC,gBAAgB,EAAE;QACpB;MACF;IACF;EACF;AACF,CAAC"}