@loaders.gl/tile-converter 3.4.0-alpha.1 → 3.4.0-alpha.3

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 (145) hide show
  1. package/dist/3d-tiles-attributes-worker.js +2 -2
  2. package/dist/3d-tiles-attributes-worker.js.map +3 -3
  3. package/dist/converter.min.js +2956 -178
  4. package/dist/deps-installer/deps-installer.d.ts.map +1 -1
  5. package/dist/deps-installer/deps-installer.js +4 -1
  6. package/dist/dist.min.js +30025 -27482
  7. package/dist/es5/3d-tiles-attributes-worker.js +1 -2
  8. package/dist/es5/3d-tiles-attributes-worker.js.map +1 -1
  9. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +264 -287
  10. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  11. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +89 -113
  12. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
  13. package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -1
  14. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js +0 -2
  15. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
  16. package/dist/es5/3d-tiles-converter/json-templates/tileset.js.map +1 -1
  17. package/dist/es5/constants.js.map +1 -1
  18. package/dist/es5/converter-cli.js +67 -81
  19. package/dist/es5/converter-cli.js.map +1 -1
  20. package/dist/es5/deps-installer/deps-installer.js +64 -69
  21. package/dist/es5/deps-installer/deps-installer.js.map +1 -1
  22. package/dist/es5/i3s-attributes-worker.js +1 -2
  23. package/dist/es5/i3s-attributes-worker.js.map +1 -1
  24. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +0 -8
  25. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  26. package/dist/es5/i3s-converter/helpers/coordinate-converter.js +0 -5
  27. package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +1 -1
  28. package/dist/es5/i3s-converter/helpers/create-scene-server-path.js +14 -16
  29. package/dist/es5/i3s-converter/helpers/create-scene-server-path.js.map +1 -1
  30. package/dist/es5/i3s-converter/helpers/feature-attributes.js +1 -11
  31. package/dist/es5/i3s-converter/helpers/feature-attributes.js.map +1 -1
  32. package/dist/es5/i3s-converter/helpers/geometry-attributes.js +3 -10
  33. package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  34. package/dist/es5/i3s-converter/helpers/geometry-converter.js +397 -449
  35. package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
  36. package/dist/es5/i3s-converter/helpers/gltf-attributes.js +0 -2
  37. package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +1 -1
  38. package/dist/es5/i3s-converter/helpers/node-debug.js +1 -9
  39. package/dist/es5/i3s-converter/helpers/node-debug.js.map +1 -1
  40. package/dist/es5/i3s-converter/helpers/node-index-document.js +293 -318
  41. package/dist/es5/i3s-converter/helpers/node-index-document.js.map +1 -1
  42. package/dist/es5/i3s-converter/helpers/node-pages.js +279 -319
  43. package/dist/es5/i3s-converter/helpers/node-pages.js.map +1 -1
  44. package/dist/es5/i3s-converter/i3s-converter.js +964 -1030
  45. package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
  46. package/dist/es5/i3s-converter/json-templates/geometry-definitions.js.map +1 -1
  47. package/dist/es5/i3s-converter/json-templates/layers.js.map +1 -1
  48. package/dist/es5/i3s-converter/json-templates/metadata.js.map +1 -1
  49. package/dist/es5/i3s-converter/json-templates/node.js.map +1 -1
  50. package/dist/es5/i3s-converter/json-templates/scene-server.js.map +1 -1
  51. package/dist/es5/i3s-converter/json-templates/shared-resources.js +1 -1
  52. package/dist/es5/i3s-converter/json-templates/shared-resources.js.map +1 -1
  53. package/dist/es5/i3s-converter/json-templates/store.js.map +1 -1
  54. package/dist/es5/i3s-server/controllers/index-controller.js +28 -30
  55. package/dist/es5/i3s-server/controllers/index-controller.js.map +1 -1
  56. package/dist/es5/i3s-server/routes/index.js +15 -18
  57. package/dist/es5/i3s-server/routes/index.js.map +1 -1
  58. package/dist/es5/index.js.map +1 -1
  59. package/dist/es5/lib/utils/compress-util.js +198 -218
  60. package/dist/es5/lib/utils/compress-util.js.map +1 -1
  61. package/dist/es5/lib/utils/file-utils.js +118 -128
  62. package/dist/es5/lib/utils/file-utils.js.map +1 -1
  63. package/dist/es5/lib/utils/lod-conversion-utils.js +0 -1
  64. package/dist/es5/lib/utils/lod-conversion-utils.js.map +1 -1
  65. package/dist/es5/lib/utils/queue.js.map +1 -1
  66. package/dist/es5/lib/utils/statistic-utills.js +81 -85
  67. package/dist/es5/lib/utils/statistic-utills.js.map +1 -1
  68. package/dist/es5/lib/utils/write-queue.js +84 -92
  69. package/dist/es5/lib/utils/write-queue.js.map +1 -1
  70. package/dist/es5/pgm-loader.js +7 -10
  71. package/dist/es5/pgm-loader.js.map +1 -1
  72. package/dist/es5/workers/3d-tiles-attributes-worker.js +7 -9
  73. package/dist/es5/workers/3d-tiles-attributes-worker.js.map +1 -1
  74. package/dist/es5/workers/i3s-attributes-worker.js +10 -12
  75. package/dist/es5/workers/i3s-attributes-worker.js.map +1 -1
  76. package/dist/esm/3d-tiles-attributes-worker.js +1 -3
  77. package/dist/esm/3d-tiles-attributes-worker.js.map +1 -1
  78. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js +1 -15
  79. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  80. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +0 -12
  81. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
  82. package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +0 -1
  83. package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -1
  84. package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js +0 -3
  85. package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
  86. package/dist/esm/3d-tiles-converter/json-templates/tileset.js.map +1 -1
  87. package/dist/esm/bundle.js +0 -1
  88. package/dist/esm/bundle.js.map +1 -1
  89. package/dist/esm/converter-cli.js +0 -11
  90. package/dist/esm/converter-cli.js.map +1 -1
  91. package/dist/esm/deps-installer/deps-installer.js +2 -5
  92. package/dist/esm/deps-installer/deps-installer.js.map +1 -1
  93. package/dist/esm/i3s-attributes-worker.js +1 -3
  94. package/dist/esm/i3s-attributes-worker.js.map +1 -1
  95. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +0 -8
  96. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  97. package/dist/esm/i3s-converter/helpers/coordinate-converter.js +0 -5
  98. package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +1 -1
  99. package/dist/esm/i3s-converter/helpers/create-scene-server-path.js +0 -1
  100. package/dist/esm/i3s-converter/helpers/create-scene-server-path.js.map +1 -1
  101. package/dist/esm/i3s-converter/helpers/feature-attributes.js +0 -11
  102. package/dist/esm/i3s-converter/helpers/feature-attributes.js.map +1 -1
  103. package/dist/esm/i3s-converter/helpers/geometry-attributes.js +0 -7
  104. package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  105. package/dist/esm/i3s-converter/helpers/geometry-converter.js +0 -48
  106. package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
  107. package/dist/esm/i3s-converter/helpers/gltf-attributes.js +0 -3
  108. package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +1 -1
  109. package/dist/esm/i3s-converter/helpers/node-debug.js +1 -9
  110. package/dist/esm/i3s-converter/helpers/node-debug.js.map +1 -1
  111. package/dist/esm/i3s-converter/helpers/node-index-document.js +0 -14
  112. package/dist/esm/i3s-converter/helpers/node-index-document.js.map +1 -1
  113. package/dist/esm/i3s-converter/helpers/node-pages.js +0 -18
  114. package/dist/esm/i3s-converter/helpers/node-pages.js.map +1 -1
  115. package/dist/esm/i3s-converter/i3s-converter.js +4 -42
  116. package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
  117. package/dist/esm/i3s-converter/json-templates/geometry-definitions.js.map +1 -1
  118. package/dist/esm/i3s-converter/json-templates/layers.js.map +1 -1
  119. package/dist/esm/i3s-converter/json-templates/metadata.js.map +1 -1
  120. package/dist/esm/i3s-converter/json-templates/node.js.map +1 -1
  121. package/dist/esm/i3s-converter/json-templates/scene-server.js.map +1 -1
  122. package/dist/esm/i3s-converter/json-templates/shared-resources.js.map +1 -1
  123. package/dist/esm/i3s-server/controllers/index-controller.js +0 -2
  124. package/dist/esm/i3s-server/controllers/index-controller.js.map +1 -1
  125. package/dist/esm/i3s-server/routes/index.js +0 -1
  126. package/dist/esm/i3s-server/routes/index.js.map +1 -1
  127. package/dist/esm/lib/utils/compress-util.js +1 -17
  128. package/dist/esm/lib/utils/compress-util.js.map +1 -1
  129. package/dist/esm/lib/utils/file-utils.js +0 -7
  130. package/dist/esm/lib/utils/file-utils.js.map +1 -1
  131. package/dist/esm/lib/utils/lod-conversion-utils.js +0 -2
  132. package/dist/esm/lib/utils/lod-conversion-utils.js.map +1 -1
  133. package/dist/esm/lib/utils/queue.js.map +1 -1
  134. package/dist/esm/lib/utils/statistic-utills.js.map +1 -1
  135. package/dist/esm/lib/utils/write-queue.js +0 -2
  136. package/dist/esm/lib/utils/write-queue.js.map +1 -1
  137. package/dist/esm/pgm-loader.js +1 -3
  138. package/dist/esm/pgm-loader.js.map +1 -1
  139. package/dist/esm/workers/3d-tiles-attributes-worker.js.map +1 -1
  140. package/dist/esm/workers/i3s-attributes-worker.js.map +1 -1
  141. package/dist/i3s-attributes-worker.js +2 -2
  142. package/dist/i3s-attributes-worker.js.map +3 -3
  143. package/dist/i3s-converter/helpers/node-pages.js +1 -1
  144. package/package.json +21 -20
  145. package/src/deps-installer/deps-installer.ts +4 -1
@@ -1 +1 @@
1
- {"version":3,"file":"node-debug.js","names":["OrientedBoundingBox","BoundingSphere","CubeGeometry","Vector3","Ellipsoid","validateNodeBoundingVolumes","node","parentNode","obb","mbs","tileWarnings","validateObb","validateMbs","parentObb","createBoundingBoxFromTileObb","tileVertices","getTileObbVertices","isTileObbInsideParentObb","isAllVerticesInsideBoundingVolume","title","id","push","tileMbs","createBoundingSphereFromTileMbs","parentMbs","distanceBetweenCenters","center","distanceTo","radius","halfSize","quaternion","fromCenterHalfSizeQuaternion","geometry","attributes","getAttributes","positions","Float32Array","POSITION","value","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';\n\nimport {OrientedBoundingBox, BoundingSphere} from '@math.gl/culling';\nimport {CubeGeometry} from '@luma.gl/engine';\nimport {Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\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 const geometry = new CubeGeometry();\n // @ts-expect-error\n const halfSize = node.obb.halfSize;\n const attributes = geometry.getAttributes();\n const positions = new Float32Array(attributes.POSITION.value);\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
+ {"version":3,"file":"node-debug.js","names":["OrientedBoundingBox","BoundingSphere","CubeGeometry","Vector3","Ellipsoid","validateNodeBoundingVolumes","node","_node$parentNode","_node$parentNode2","parentNode","obb","mbs","tileWarnings","validateObb","validateMbs","_node$parentNode3","parentObb","createBoundingBoxFromTileObb","tileVertices","getTileObbVertices","isTileObbInsideParentObb","isAllVerticesInsideBoundingVolume","title","concat","id","push","tileMbs","createBoundingSphereFromTileMbs","parentMbs","distanceBetweenCenters","center","distanceTo","radius","_node$parentNode4","halfSize","quaternion","fromCenterHalfSizeQuaternion","geometry","attributes","getAttributes","positions","Float32Array","POSITION","value","obbCenterCartesian","WGS84","cartographicToCartesian","vertices","i","length","positionsVector","rotatedPositions","transformByQuaternion","add","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';\n\nimport {OrientedBoundingBox, BoundingSphere} from '@math.gl/culling';\nimport {CubeGeometry} from '@luma.gl/engine';\nimport {Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\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 const geometry = new CubeGeometry();\n // @ts-expect-error\n const halfSize = node.obb.halfSize;\n const attributes = geometry.getAttributes();\n const positions = new Float32Array(attributes.POSITION.value);\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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"}
@@ -5,7 +5,6 @@ import { v4 as uuidv4 } from 'uuid';
5
5
  import { openJson, writeFile, writeFileForSlpk } from '../../lib/utils/file-utils';
6
6
  import { NODE as nodeTemplate } from '../json-templates/node';
7
7
  export class NodeIndexDocument {
8
-
9
8
  constructor(id, converter) {
10
9
  _defineProperty(this, "id", void 0);
11
10
  _defineProperty(this, "inPageId", void 0);
@@ -16,7 +15,6 @@ export class NodeIndexDocument {
16
15
  this.id = id === 0 ? 'root' : id.toString();
17
16
  this.converter = converter;
18
17
  }
19
-
20
18
  async addData(data) {
21
19
  if (this.converter.options.instantNodeWriting) {
22
20
  await this.write(data);
@@ -25,7 +23,6 @@ export class NodeIndexDocument {
25
23
  }
26
24
  return this;
27
25
  }
28
-
29
26
  async addChildren(childNodes) {
30
27
  const newChildren = [];
31
28
  for (const node of childNodes) {
@@ -51,20 +48,17 @@ export class NodeIndexDocument {
51
48
  await this.write(data);
52
49
  }
53
50
  }
54
-
55
51
  async addNeighbors() {
56
52
  const nodeData = await this.load();
57
53
  for (const childNode of this.children) {
58
54
  var _childNodeData$neighb, _nodeData$children;
59
55
  const childNodeData = await childNode.load();
60
56
  childNodeData.neighbors = (_childNodeData$neighb = childNodeData.neighbors) !== null && _childNodeData$neighb !== void 0 ? _childNodeData$neighb : [];
61
-
62
57
  if (Number(nodeData === null || nodeData === void 0 ? void 0 : (_nodeData$children = nodeData.children) === null || _nodeData$children === void 0 ? void 0 : _nodeData$children.length) < 1000) {
63
58
  for (const neighbor of nodeData.children || []) {
64
59
  if (childNode.id === neighbor.id) {
65
60
  continue;
66
61
  }
67
-
68
62
  childNodeData.neighbors.push({
69
63
  ...neighbor
70
64
  });
@@ -80,13 +74,11 @@ export class NodeIndexDocument {
80
74
  childNode.flush();
81
75
  }
82
76
  }
83
-
84
77
  async save() {
85
78
  if (this.data) {
86
79
  await this.write(this.data);
87
80
  }
88
81
  }
89
-
90
82
  async write(node) {
91
83
  const path = join(this.converter.layers0Path, 'nodes', this.id);
92
84
  if (this.converter.options.slpk) {
@@ -100,7 +92,6 @@ export class NodeIndexDocument {
100
92
  }, true);
101
93
  }
102
94
  }
103
-
104
95
  async load() {
105
96
  if (this.data) {
106
97
  return this.data;
@@ -113,23 +104,19 @@ export class NodeIndexDocument {
113
104
  }
114
105
  return await openJson(parentNodePath, parentNodeFileName);
115
106
  }
116
-
117
107
  flush() {
118
108
  this.data = null;
119
109
  }
120
-
121
110
  static async createRootNode(boundingVolumes, converter) {
122
111
  const rootData = NodeIndexDocument.createRootNodeIndexDocument(boundingVolumes);
123
112
  const rootNode = await new NodeIndexDocument(0, converter).addData(rootData);
124
113
  return rootNode;
125
114
  }
126
-
127
115
  static async createNode(parentNode, boundingVolumes, lodSelection, nodeInPage, resources, converter) {
128
116
  const data = await NodeIndexDocument.createNodeIndexDocument(parentNode, boundingVolumes, lodSelection, nodeInPage, resources);
129
117
  const node = await new NodeIndexDocument(nodeInPage.index, converter).addData(data);
130
118
  return node;
131
119
  }
132
-
133
120
  static createRootNodeIndexDocument(boundingVolumes) {
134
121
  const root0data = {
135
122
  version: "{".concat(uuidv4().toUpperCase(), "}"),
@@ -147,7 +134,6 @@ export class NodeIndexDocument {
147
134
  };
148
135
  return transform(root0data, nodeTemplate());
149
136
  }
150
-
151
137
  static async createNodeIndexDocument(parentNode, boundingVolumes, lodSelection, nodeInPage, resources) {
152
138
  const {
153
139
  texture,
@@ -1 +1 @@
1
- {"version":3,"file":"node-index-document.js","names":["join","transform","v4","uuidv4","openJson","writeFile","writeFileForSlpk","NODE","nodeTemplate","NodeIndexDocument","constructor","id","converter","inPageId","toString","addData","data","options","instantNodeWriting","write","addChildren","childNodes","newChildren","node","nodeData","load","push","href","obb","mbs","children","concat","addNeighbors","childNode","childNodeData","neighbors","Number","length","neighbor","console","warn","save","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","texture","attributes","nodeId","parentNodeData","mesh","geometryData","sharedResource","textureData","layers0","attributeStorageInfo","attributeData","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';\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 * 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 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 // The save after adding neighbors is the last one. Flush the the node\n childNode.flush();\n }\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 /**\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\n ): Promise<Node3DIndexDocument> {\n const {texture, attributes} = resources;\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 (texture) {\n node.textureData = [{href: './textures/0'}, {href: './textures/1'}];\n }\n\n if (\n attributes &&\n attributes.length &&\n parentNode.converter.layers0?.attributeStorageInfo?.length\n ) {\n node.attributeData = [];\n for (let index = 0; index < attributes.length; 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
+ {"version":3,"file":"node-index-document.js","names":["join","transform","v4","uuidv4","openJson","writeFile","writeFileForSlpk","NODE","nodeTemplate","NodeIndexDocument","constructor","id","converter","_defineProperty","inPageId","toString","addData","data","options","instantNodeWriting","write","addChildren","childNodes","newChildren","node","nodeData","load","push","href","concat","obb","mbs","children","_data$children","addNeighbors","childNode","_childNodeData$neighb","_nodeData$children","childNodeData","neighbors","Number","length","neighbor","console","warn","save","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","texture","attributes","nodeId","parentNodeData","mesh","_parentNode$converter","_parentNode$converter2","geometryData","sharedResource","textureData","layers0","attributeStorageInfo","attributeData","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';\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 * 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 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 // The save after adding neighbors is the last one. Flush the the node\n childNode.flush();\n }\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 /**\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\n ): Promise<Node3DIndexDocument> {\n const {texture, attributes} = resources;\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 (texture) {\n node.textureData = [{href: './textures/0'}, {href: './textures/1'}];\n }\n\n if (\n attributes &&\n attributes.length &&\n parentNode.converter.layers0?.attributeStorageInfo?.length\n ) {\n node.attributeData = [];\n for (let index = 0; index < attributes.length; 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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"}
@@ -19,11 +19,9 @@ export default class NodePages {
19
19
  this.converter = converter;
20
20
  this.length = 0;
21
21
  }
22
-
23
22
  useWriteFunction(func) {
24
23
  this.writeFile = func;
25
24
  }
26
-
27
25
  getNodePageFileName(nodePageId) {
28
26
  let filePath;
29
27
  let fileName;
@@ -39,7 +37,6 @@ export default class NodePages {
39
37
  fileName
40
38
  };
41
39
  }
42
-
43
40
  async loadNodePage(nodePageId) {
44
41
  const {
45
42
  filePath,
@@ -55,11 +52,9 @@ export default class NodePages {
55
52
  };
56
53
  }
57
54
  }
58
-
59
55
  getPageIndexByNodeId(id) {
60
56
  return Math.floor(id / this.nodesPerPage);
61
57
  }
62
-
63
58
  async getPageByNodeId(id) {
64
59
  const pageIndex = this.getPageIndexByNodeId(id);
65
60
  if (this.converter.options.instantNodeWriting) {
@@ -67,13 +62,11 @@ export default class NodePages {
67
62
  }
68
63
  return this.nodePages[pageIndex];
69
64
  }
70
-
71
65
  async getNodeById(id, nodePage) {
72
66
  const nodeIndex = id % this.nodesPerPage;
73
67
  nodePage = nodePage || (await this.getPageByNodeId(id));
74
68
  return nodePage.nodes[nodeIndex];
75
69
  }
76
-
77
70
  async addChildRelation(parentId, childId) {
78
71
  var _parentNode$children;
79
72
  if (parentId === null || parentId === undefined) {
@@ -83,7 +76,6 @@ export default class NodePages {
83
76
  (_parentNode$children = parentNode.children) === null || _parentNode$children === void 0 ? void 0 : _parentNode$children.push(childId);
84
77
  await this.saveNode(parentNode);
85
78
  }
86
-
87
79
  async push(node, parentId) {
88
80
  node.index = this.nodesCounter++;
89
81
  if (!this.converter.options.instantNodeWriting) {
@@ -101,7 +93,6 @@ export default class NodePages {
101
93
  await this.saveNode(node);
102
94
  return node;
103
95
  }
104
-
105
96
  async saveNode(node) {
106
97
  if (!this.converter.options.instantNodeWriting) {
107
98
  return;
@@ -131,7 +122,6 @@ export default class NodePages {
131
122
  }
132
123
  }
133
124
  }
134
-
135
125
  async saveMetadata() {
136
126
  const metadata = transform({
137
127
  nodeCount: this.nodesCounter
@@ -142,7 +132,6 @@ export default class NodePages {
142
132
  writePromise: () => this.writeFile(this.converter.layers0Path, JSON.stringify(metadata), 'metadata.json', compress)
143
133
  });
144
134
  }
145
-
146
135
  async save() {
147
136
  if (this.converter.options.instantNodeWriting) {
148
137
  await this.saveMetadata();
@@ -168,13 +157,11 @@ export default class NodePages {
168
157
  }
169
158
  }
170
159
  }
171
-
172
160
  static updateResourceInMesh(node) {
173
161
  if (node.mesh && isFinite(node.index)) {
174
162
  node.mesh.geometry.resource = node.index;
175
163
  }
176
164
  }
177
-
178
165
  static updateAll(node, data) {
179
166
  Object.assign(node, data, {
180
167
  index: node.index
@@ -182,7 +169,6 @@ export default class NodePages {
182
169
  NodePages.updateResourceInMesh(node);
183
170
  return node;
184
171
  }
185
-
186
172
  static updateMaterialByNodeId(node, materialId) {
187
173
  if (!node.mesh) {
188
174
  return;
@@ -192,28 +178,24 @@ export default class NodePages {
192
178
  resource: node.index
193
179
  };
194
180
  }
195
-
196
181
  static updateVertexCountByNodeId(node, vertexCount) {
197
182
  if (!node.mesh) {
198
183
  return;
199
184
  }
200
185
  node.mesh.geometry.vertexCount = vertexCount;
201
186
  }
202
-
203
187
  static updateNodeAttributeByNodeId(node) {
204
188
  if (!node.mesh || !node.index) {
205
189
  return;
206
190
  }
207
191
  node.mesh.attribute.resource = node.index;
208
192
  }
209
-
210
193
  static updateFeatureCountByNodeId(node, featureCount) {
211
194
  if (!node.mesh) {
212
195
  return;
213
196
  }
214
197
  node.mesh.geometry.featureCount = featureCount;
215
198
  }
216
-
217
199
  static updateTexelCountHintByNodeId(node, texelCountHint) {
218
200
  if (!node.mesh || !node.mesh.material) {
219
201
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"node-pages.js","names":["join","transform","METADATA","metadataTemplate","isFileExists","openJson","NodePages","constructor","writeFileFunc","nodesPerPage","converter","nodesCounter","nodePages","nodes","writeFile","length","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","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":"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"}
1
+ {"version":3,"file":"node-pages.js","names":["join","transform","METADATA","metadataTemplate","isFileExists","openJson","NodePages","constructor","writeFileFunc","nodesPerPage","converter","_defineProperty","nodesCounter","nodePages","nodes","writeFile","length","useWriteFunction","func","getNodePageFileName","nodePageId","filePath","fileName","options","slpk","layers0Path","concat","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":"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"}