@loaders.gl/tile-converter 3.3.0-alpha.1 → 3.3.0-alpha.10

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 (252) hide show
  1. package/dist/3d-tiles-attributes-worker.d.ts +3 -3
  2. package/dist/3d-tiles-attributes-worker.d.ts.map +1 -1
  3. package/dist/3d-tiles-attributes-worker.js +2 -3
  4. package/dist/3d-tiles-attributes-worker.js.map +3 -3
  5. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +8 -0
  6. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
  7. package/dist/3d-tiles-converter/3d-tiles-converter.js +57 -43
  8. package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts +5 -5
  9. package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -1
  10. package/dist/3d-tiles-converter/helpers/b3dm-converter.js +21 -17
  11. package/dist/converter-cli.js +29 -4
  12. package/dist/converter.min.js +24 -21
  13. package/dist/deps-installer/deps-installer.d.ts +5 -1
  14. package/dist/deps-installer/deps-installer.d.ts.map +1 -1
  15. package/dist/deps-installer/deps-installer.js +29 -1
  16. package/dist/dist.min.js +61034 -64112
  17. package/dist/es5/3d-tiles-attributes-worker.js +4 -7
  18. package/dist/es5/3d-tiles-attributes-worker.js.map +1 -1
  19. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +125 -210
  20. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  21. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +53 -85
  22. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
  23. package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +0 -8
  24. package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -1
  25. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js +0 -5
  26. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
  27. package/dist/es5/3d-tiles-converter/json-templates/tileset.js +0 -6
  28. package/dist/es5/3d-tiles-converter/json-templates/tileset.js.map +1 -1
  29. package/dist/es5/bundle.js +0 -1
  30. package/dist/es5/bundle.js.map +1 -1
  31. package/dist/es5/constants.js.map +1 -1
  32. package/dist/es5/converter-cli.js +25 -58
  33. package/dist/es5/converter-cli.js.map +1 -1
  34. package/dist/es5/deps-installer/deps-installer.js +73 -28
  35. package/dist/es5/deps-installer/deps-installer.js.map +1 -1
  36. package/dist/es5/i3s-attributes-worker.js +3 -6
  37. package/dist/es5/i3s-attributes-worker.js.map +1 -1
  38. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +18 -29
  39. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  40. package/dist/es5/i3s-converter/helpers/coordinate-converter.js +8 -25
  41. package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +1 -1
  42. package/dist/es5/i3s-converter/helpers/create-scene-server-path.js +0 -11
  43. package/dist/es5/i3s-converter/helpers/create-scene-server-path.js.map +1 -1
  44. package/dist/es5/i3s-converter/helpers/feature-attributes.js +184 -0
  45. package/dist/es5/i3s-converter/helpers/feature-attributes.js.map +1 -0
  46. package/dist/es5/i3s-converter/helpers/geometry-attributes.js +60 -51
  47. package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  48. package/dist/es5/i3s-converter/helpers/geometry-converter.js +504 -350
  49. package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
  50. package/dist/es5/i3s-converter/helpers/gltf-attributes.js +57 -57
  51. package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +1 -1
  52. package/dist/es5/i3s-converter/helpers/node-debug.js +4 -23
  53. package/dist/es5/i3s-converter/helpers/node-debug.js.map +1 -1
  54. package/dist/es5/i3s-converter/helpers/node-index-document.js +507 -0
  55. package/dist/es5/i3s-converter/helpers/node-index-document.js.map +1 -0
  56. package/dist/es5/i3s-converter/helpers/node-pages.js +478 -168
  57. package/dist/es5/i3s-converter/helpers/node-pages.js.map +1 -1
  58. package/dist/es5/i3s-converter/i3s-converter.js +794 -1125
  59. package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
  60. package/dist/es5/i3s-converter/json-templates/geometry-definitions.js +107 -0
  61. package/dist/es5/i3s-converter/json-templates/geometry-definitions.js.map +1 -0
  62. package/dist/es5/i3s-converter/json-templates/layers.js +2 -107
  63. package/dist/es5/i3s-converter/json-templates/layers.js.map +1 -1
  64. package/dist/es5/i3s-converter/json-templates/metadata.js +0 -2
  65. package/dist/es5/i3s-converter/json-templates/metadata.js.map +1 -1
  66. package/dist/es5/i3s-converter/json-templates/node.js +2 -12
  67. package/dist/es5/i3s-converter/json-templates/node.js.map +1 -1
  68. package/dist/es5/i3s-converter/json-templates/scene-server.js +0 -2
  69. package/dist/es5/i3s-converter/json-templates/scene-server.js.map +1 -1
  70. package/dist/es5/i3s-converter/json-templates/shared-resources.js +9 -32
  71. package/dist/es5/i3s-converter/json-templates/shared-resources.js.map +1 -1
  72. package/dist/es5/i3s-converter/json-templates/store.js.map +1 -1
  73. package/dist/es5/i3s-converter/types.js.map +1 -1
  74. package/dist/es5/i3s-server/app.js +0 -5
  75. package/dist/es5/i3s-server/app.js.map +1 -1
  76. package/dist/es5/i3s-server/controllers/index-controller.js +0 -16
  77. package/dist/es5/i3s-server/controllers/index-controller.js.map +1 -1
  78. package/dist/es5/i3s-server/routes/index.js +1 -10
  79. package/dist/es5/i3s-server/routes/index.js.map +1 -1
  80. package/dist/es5/index.js +0 -3
  81. package/dist/es5/index.js.map +1 -1
  82. package/dist/es5/lib/utils/compress-util.js +19 -74
  83. package/dist/es5/lib/utils/compress-util.js.map +1 -1
  84. package/dist/es5/lib/utils/file-utils.js +103 -47
  85. package/dist/es5/lib/utils/file-utils.js.map +1 -1
  86. package/dist/es5/lib/utils/lod-conversion-utils.js +0 -7
  87. package/dist/es5/lib/utils/lod-conversion-utils.js.map +1 -1
  88. package/dist/es5/lib/utils/queue.js +0 -14
  89. package/dist/es5/lib/utils/queue.js.map +1 -1
  90. package/dist/es5/lib/utils/statistic-utills.js +1 -46
  91. package/dist/es5/lib/utils/statistic-utills.js.map +1 -1
  92. package/dist/es5/lib/utils/write-queue.js +86 -87
  93. package/dist/es5/lib/utils/write-queue.js.map +1 -1
  94. package/dist/es5/pgm-loader.js +1 -8
  95. package/dist/es5/pgm-loader.js.map +1 -1
  96. package/dist/es5/workers/3d-tiles-attributes-worker.js +2 -9
  97. package/dist/es5/workers/3d-tiles-attributes-worker.js.map +1 -1
  98. package/dist/es5/workers/i3s-attributes-worker.js +2 -10
  99. package/dist/es5/workers/i3s-attributes-worker.js.map +1 -1
  100. package/dist/esm/3d-tiles-attributes-worker.js +4 -2
  101. package/dist/esm/3d-tiles-attributes-worker.js.map +1 -1
  102. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js +60 -77
  103. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  104. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +29 -50
  105. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
  106. package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +1 -0
  107. package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -1
  108. package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js +1 -4
  109. package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
  110. package/dist/esm/3d-tiles-converter/json-templates/tileset.js +0 -3
  111. package/dist/esm/3d-tiles-converter/json-templates/tileset.js.map +1 -1
  112. package/dist/esm/bundle.js +1 -1
  113. package/dist/esm/bundle.js.map +1 -1
  114. package/dist/esm/constants.js.map +1 -1
  115. package/dist/esm/converter-cli.js +26 -43
  116. package/dist/esm/converter-cli.js.map +1 -1
  117. package/dist/esm/deps-installer/deps-installer.js +30 -4
  118. package/dist/esm/deps-installer/deps-installer.js.map +1 -1
  119. package/dist/esm/i3s-attributes-worker.js +3 -1
  120. package/dist/esm/i3s-attributes-worker.js.map +1 -1
  121. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +20 -24
  122. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  123. package/dist/esm/i3s-converter/helpers/coordinate-converter.js +11 -12
  124. package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +1 -1
  125. package/dist/esm/i3s-converter/helpers/create-scene-server-path.js +1 -0
  126. package/dist/esm/i3s-converter/helpers/create-scene-server-path.js.map +1 -1
  127. package/dist/esm/i3s-converter/helpers/feature-attributes.js +158 -0
  128. package/dist/esm/i3s-converter/helpers/feature-attributes.js.map +1 -0
  129. package/dist/esm/i3s-converter/helpers/geometry-attributes.js +39 -33
  130. package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  131. package/dist/esm/i3s-converter/helpers/geometry-converter.js +286 -192
  132. package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
  133. package/dist/esm/i3s-converter/helpers/gltf-attributes.js +59 -48
  134. package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +1 -1
  135. package/dist/esm/i3s-converter/helpers/node-debug.js +3 -13
  136. package/dist/esm/i3s-converter/helpers/node-debug.js.map +1 -1
  137. package/dist/esm/i3s-converter/helpers/node-index-document.js +197 -0
  138. package/dist/esm/i3s-converter/helpers/node-index-document.js.map +1 -0
  139. package/dist/esm/i3s-converter/helpers/node-pages.js +161 -87
  140. package/dist/esm/i3s-converter/helpers/node-pages.js.map +1 -1
  141. package/dist/esm/i3s-converter/i3s-converter.js +235 -508
  142. package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
  143. package/dist/esm/i3s-converter/json-templates/geometry-definitions.js +89 -0
  144. package/dist/esm/i3s-converter/json-templates/geometry-definitions.js.map +1 -0
  145. package/dist/esm/i3s-converter/json-templates/layers.js +2 -95
  146. package/dist/esm/i3s-converter/json-templates/layers.js.map +1 -1
  147. package/dist/esm/i3s-converter/json-templates/metadata.js.map +1 -1
  148. package/dist/esm/i3s-converter/json-templates/node.js +0 -4
  149. package/dist/esm/i3s-converter/json-templates/node.js.map +1 -1
  150. package/dist/esm/i3s-converter/json-templates/scene-server.js.map +1 -1
  151. package/dist/esm/i3s-converter/json-templates/shared-resources.js +3 -15
  152. package/dist/esm/i3s-converter/json-templates/shared-resources.js.map +1 -1
  153. package/dist/esm/i3s-converter/json-templates/store.js.map +1 -1
  154. package/dist/esm/i3s-converter/types.js.map +1 -1
  155. package/dist/esm/i3s-server/app.js +0 -5
  156. package/dist/esm/i3s-server/app.js.map +1 -1
  157. package/dist/esm/i3s-server/controllers/index-controller.js +0 -5
  158. package/dist/esm/i3s-server/controllers/index-controller.js.map +1 -1
  159. package/dist/esm/i3s-server/routes/index.js +0 -3
  160. package/dist/esm/i3s-server/routes/index.js.map +1 -1
  161. package/dist/esm/index.js.map +1 -1
  162. package/dist/esm/lib/utils/compress-util.js +19 -12
  163. package/dist/esm/lib/utils/compress-util.js.map +1 -1
  164. package/dist/esm/lib/utils/file-utils.js +54 -11
  165. package/dist/esm/lib/utils/file-utils.js.map +1 -1
  166. package/dist/esm/lib/utils/lod-conversion-utils.js +2 -6
  167. package/dist/esm/lib/utils/lod-conversion-utils.js.map +1 -1
  168. package/dist/esm/lib/utils/queue.js +0 -4
  169. package/dist/esm/lib/utils/queue.js.map +1 -1
  170. package/dist/esm/lib/utils/statistic-utills.js +0 -11
  171. package/dist/esm/lib/utils/statistic-utills.js.map +1 -1
  172. package/dist/esm/lib/utils/write-queue.js +29 -28
  173. package/dist/esm/lib/utils/write-queue.js.map +1 -1
  174. package/dist/esm/pgm-loader.js +3 -1
  175. package/dist/esm/pgm-loader.js.map +1 -1
  176. package/dist/esm/workers/3d-tiles-attributes-worker.js +4 -1
  177. package/dist/esm/workers/3d-tiles-attributes-worker.js.map +1 -1
  178. package/dist/esm/workers/i3s-attributes-worker.js +4 -1
  179. package/dist/esm/workers/i3s-attributes-worker.js.map +1 -1
  180. package/dist/i3s-attributes-worker.d.ts +7 -3
  181. package/dist/i3s-attributes-worker.d.ts.map +1 -1
  182. package/dist/i3s-attributes-worker.js +2 -3
  183. package/dist/i3s-attributes-worker.js.map +3 -3
  184. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +5 -6
  185. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
  186. package/dist/i3s-converter/helpers/batch-ids-extensions.js +18 -4
  187. package/dist/i3s-converter/helpers/coordinate-converter.d.ts +2 -2
  188. package/dist/i3s-converter/helpers/coordinate-converter.d.ts.map +1 -1
  189. package/dist/i3s-converter/helpers/coordinate-converter.js +8 -6
  190. package/dist/i3s-converter/helpers/feature-attributes.d.ts +56 -0
  191. package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -0
  192. package/dist/i3s-converter/helpers/feature-attributes.js +216 -0
  193. package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
  194. package/dist/i3s-converter/helpers/geometry-attributes.js +42 -17
  195. package/dist/i3s-converter/helpers/geometry-converter.d.ts +18 -6
  196. package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
  197. package/dist/i3s-converter/helpers/geometry-converter.js +337 -92
  198. package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
  199. package/dist/i3s-converter/helpers/gltf-attributes.js +51 -32
  200. package/dist/i3s-converter/helpers/node-index-document.d.ts +91 -0
  201. package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -0
  202. package/dist/i3s-converter/helpers/node-index-document.js +242 -0
  203. package/dist/i3s-converter/helpers/node-pages.d.ts +81 -42
  204. package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
  205. package/dist/i3s-converter/helpers/node-pages.js +200 -92
  206. package/dist/i3s-converter/i3s-converter.d.ts +52 -108
  207. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  208. package/dist/i3s-converter/i3s-converter.js +234 -420
  209. package/dist/i3s-converter/json-templates/geometry-definitions.d.ts +7 -0
  210. package/dist/i3s-converter/json-templates/geometry-definitions.d.ts.map +1 -0
  211. package/dist/i3s-converter/json-templates/geometry-definitions.js +87 -0
  212. package/dist/i3s-converter/json-templates/layers.d.ts +1 -30
  213. package/dist/i3s-converter/json-templates/layers.d.ts.map +1 -1
  214. package/dist/i3s-converter/json-templates/layers.js +2 -86
  215. package/dist/i3s-converter/json-templates/shared-resources.js +3 -3
  216. package/dist/i3s-converter/types.d.ts +37 -55
  217. package/dist/i3s-converter/types.d.ts.map +1 -1
  218. package/dist/lib/utils/file-utils.d.ts +17 -1
  219. package/dist/lib/utils/file-utils.d.ts.map +1 -1
  220. package/dist/lib/utils/file-utils.js +64 -7
  221. package/dist/lib/utils/write-queue.d.ts +19 -2
  222. package/dist/lib/utils/write-queue.d.ts.map +1 -1
  223. package/dist/lib/utils/write-queue.js +26 -7
  224. package/dist/pgm-loader.d.ts.map +1 -1
  225. package/dist/pgm-loader.js +2 -1
  226. package/dist/workers/3d-tiles-attributes-worker.js +1 -1
  227. package/dist/workers/i3s-attributes-worker.js +1 -1
  228. package/package.json +18 -16
  229. package/src/3d-tiles-attributes-worker.ts +1 -1
  230. package/src/3d-tiles-converter/3d-tiles-converter.ts +71 -55
  231. package/src/3d-tiles-converter/helpers/b3dm-converter.ts +25 -18
  232. package/src/converter-cli.ts +38 -4
  233. package/src/deps-installer/deps-installer.ts +38 -2
  234. package/src/i3s-attributes-worker.ts +5 -1
  235. package/src/i3s-converter/helpers/batch-ids-extensions.ts +38 -14
  236. package/src/i3s-converter/helpers/coordinate-converter.ts +10 -8
  237. package/src/i3s-converter/helpers/feature-attributes.ts +247 -0
  238. package/src/i3s-converter/helpers/geometry-attributes.ts +46 -18
  239. package/src/i3s-converter/helpers/geometry-converter.ts +405 -108
  240. package/src/i3s-converter/helpers/gltf-attributes.ts +55 -35
  241. package/src/i3s-converter/helpers/node-index-document.ts +306 -0
  242. package/src/i3s-converter/helpers/node-pages.ts +222 -109
  243. package/src/i3s-converter/i3s-converter.ts +279 -499
  244. package/src/i3s-converter/json-templates/geometry-definitions.ts +83 -0
  245. package/src/i3s-converter/json-templates/layers.ts +2 -91
  246. package/src/i3s-converter/json-templates/shared-resources.ts +3 -3
  247. package/src/i3s-converter/types.ts +31 -51
  248. package/src/lib/utils/file-utils.ts +62 -7
  249. package/src/lib/utils/write-queue.ts +43 -10
  250. package/src/pgm-loader.ts +2 -2
  251. package/src/workers/3d-tiles-attributes-worker.ts +1 -1
  252. package/src/workers/i3s-attributes-worker.ts +2 -1
@@ -2,13 +2,12 @@ import { OrientedBoundingBox, BoundingSphere } from '@math.gl/culling';
2
2
  import { CubeGeometry } from '@luma.gl/engine';
3
3
  import { Vector3 } from '@math.gl/core';
4
4
  import { Ellipsoid } from '@math.gl/geospatial';
5
+
5
6
  export function validateNodeBoundingVolumes(node) {
6
7
  var _node$parentNode, _node$parentNode2;
7
-
8
8
  if (!(node !== null && node !== void 0 && (_node$parentNode = node.parentNode) !== null && _node$parentNode !== void 0 && _node$parentNode.obb) || !(node !== null && node !== void 0 && (_node$parentNode2 = node.parentNode) !== null && _node$parentNode2 !== void 0 && _node$parentNode2.mbs)) {
9
9
  return [];
10
10
  }
11
-
12
11
  const tileWarnings = [];
13
12
  validateObb(tileWarnings, node);
14
13
  validateMbs(tileWarnings, node);
@@ -17,15 +16,12 @@ export function validateNodeBoundingVolumes(node) {
17
16
 
18
17
  function validateObb(tileWarnings, node) {
19
18
  var _node$parentNode3;
20
-
21
19
  const parentObb = createBoundingBoxFromTileObb(node.parentNode.obb);
22
20
  const tileVertices = getTileObbVertices(node);
23
21
  const isTileObbInsideParentObb = isAllVerticesInsideBoundingVolume(parentObb, tileVertices);
24
-
25
22
  if (isTileObbInsideParentObb) {
26
23
  return;
27
24
  }
28
-
29
25
  const title = "OBB of Tile (".concat(node.id, ") doesn't fit into Parent (").concat((_node$parentNode3 = node.parentNode) === null || _node$parentNode3 === void 0 ? void 0 : _node$parentNode3.id, ") tile OBB");
30
26
  tileWarnings.push(title);
31
27
  }
@@ -34,10 +30,8 @@ function validateMbs(tileWarnings, node) {
34
30
  const tileMbs = createBoundingSphereFromTileMbs(node.mbs);
35
31
  const parentMbs = createBoundingSphereFromTileMbs(node.parentNode.mbs);
36
32
  const distanceBetweenCenters = tileMbs.center.distanceTo(parentMbs.center);
37
-
38
33
  if (distanceBetweenCenters + tileMbs.radius > parentMbs.radius) {
39
34
  var _node$parentNode4;
40
-
41
35
  const title = "MBS of Tile (".concat(node.id, ") doesn't fit into Parent (").concat((_node$parentNode4 = node.parentNode) === null || _node$parentNode4 === void 0 ? void 0 : _node$parentNode4.id, ") tile MBS");
42
36
  tileWarnings.push(title);
43
37
  }
@@ -63,30 +57,26 @@ function getTileObbVertices(node) {
63
57
  const positions = new Float32Array(attributes.POSITION.value);
64
58
  const obbCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(node.obb.center);
65
59
  let vertices = [];
66
-
67
60
  for (let i = 0; i < positions.length; i += 3) {
68
61
  const positionsVector = new Vector3(positions[i] *= halfSize[0], positions[i + 1] *= halfSize[1], positions[i + 2] *= halfSize[2]);
69
- const rotatedPositions = positionsVector.transformByQuaternion(node.obb.quaternion).add(obbCenterCartesian);
62
+ const rotatedPositions = positionsVector
63
+ .transformByQuaternion(node.obb.quaternion).add(obbCenterCartesian);
70
64
  vertices = vertices.concat(rotatedPositions);
71
65
  }
72
-
73
66
  return vertices;
74
67
  }
75
68
 
76
69
  function isAllVerticesInsideBoundingVolume(boundingVolume, positions) {
77
70
  let isVerticesInsideObb = true;
78
-
79
71
  for (let index = 0; index < positions.length / 3; index += 3) {
80
72
  const point = [positions[index], positions[index + 1], positions[index + 2]];
81
73
  const cartographicPoint = Ellipsoid.WGS84.cartesianToCartographic(point);
82
74
  const distance = boundingVolume.distanceTo(cartographicPoint);
83
-
84
75
  if (distance > 0) {
85
76
  isVerticesInsideObb = false;
86
77
  break;
87
78
  }
88
79
  }
89
-
90
80
  return isVerticesInsideObb;
91
81
  }
92
82
  //# sourceMappingURL=node-debug.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/i3s-converter/helpers/node-debug.ts"],"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"],"mappings":"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","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"],"file":"node-debug.js"}
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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"}
@@ -0,0 +1,197 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { join } from 'path';
3
+ import transform from 'json-map-transform';
4
+ import { v4 as uuidv4 } from 'uuid';
5
+ import { openJson, writeFile, writeFileForSlpk } from '../../lib/utils/file-utils';
6
+ import { NODE as nodeTemplate } from '../json-templates/node';
7
+ export class NodeIndexDocument {
8
+
9
+ constructor(id, converter) {
10
+ _defineProperty(this, "id", void 0);
11
+ _defineProperty(this, "inPageId", void 0);
12
+ _defineProperty(this, "data", null);
13
+ _defineProperty(this, "children", []);
14
+ _defineProperty(this, "converter", void 0);
15
+ this.inPageId = id;
16
+ this.id = id === 0 ? 'root' : id.toString();
17
+ this.converter = converter;
18
+ }
19
+
20
+ async addData(data) {
21
+ if (this.converter.options.instantNodeWriting) {
22
+ await this.write(data);
23
+ } else {
24
+ this.data = data;
25
+ }
26
+ return this;
27
+ }
28
+
29
+ async addChildren(childNodes) {
30
+ const newChildren = [];
31
+ for (const node of childNodes) {
32
+ const nodeData = await node.load();
33
+ newChildren.push({
34
+ id: node.id,
35
+ href: "../".concat(node.id),
36
+ obb: nodeData.obb,
37
+ mbs: nodeData.mbs
38
+ });
39
+ }
40
+ this.children = this.children.concat(childNodes);
41
+ let data = this.data;
42
+ if (this.converter.options.instantNodeWriting) {
43
+ data = await this.load();
44
+ }
45
+ if (data) {
46
+ var _data$children;
47
+ data.children = (_data$children = data.children) !== null && _data$children !== void 0 ? _data$children : [];
48
+ data.children = data.children.concat(newChildren);
49
+ }
50
+ if (this.converter.options.instantNodeWriting && data) {
51
+ await this.write(data);
52
+ }
53
+ }
54
+
55
+ async addNeighbors() {
56
+ const nodeData = await this.load();
57
+ for (const childNode of this.children) {
58
+ var _childNodeData$neighb, _nodeData$children;
59
+ const childNodeData = await childNode.load();
60
+ childNodeData.neighbors = (_childNodeData$neighb = childNodeData.neighbors) !== null && _childNodeData$neighb !== void 0 ? _childNodeData$neighb : [];
61
+
62
+ 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
+ for (const neighbor of nodeData.children || []) {
64
+ if (childNode.id === neighbor.id) {
65
+ continue;
66
+ }
67
+
68
+ childNodeData.neighbors.push({
69
+ ...neighbor
70
+ });
71
+ }
72
+ } else {
73
+ console.warn("Node ".concat(childNode.id, ": neighbors attribute is omited because of large number of neigbors"));
74
+ delete childNodeData.neighbors;
75
+ }
76
+ if (this.converter.options.instantNodeWriting && childNodeData) {
77
+ await childNode.write(childNodeData);
78
+ }
79
+ childNode.save();
80
+ }
81
+ }
82
+
83
+ async save() {
84
+ if (this.data) {
85
+ await this.write(this.data);
86
+ }
87
+ }
88
+
89
+ async write(node) {
90
+ const path = join(this.converter.layers0Path, 'nodes', this.id);
91
+ if (this.converter.options.slpk) {
92
+ await this.converter.writeQueue.enqueue({
93
+ archiveKey: "nodes/".concat(this.id, "/3dNodeIndexDocument.json.gz"),
94
+ writePromise: () => writeFileForSlpk(path, JSON.stringify(node), '3dNodeIndexDocument.json', true, this.converter.compressList)
95
+ }, true);
96
+ } else {
97
+ await this.converter.writeQueue.enqueue({
98
+ writePromise: () => writeFile(path, JSON.stringify(node))
99
+ }, true);
100
+ }
101
+ }
102
+
103
+ async load() {
104
+ if (this.data) {
105
+ return this.data;
106
+ }
107
+ const path = this.id;
108
+ const parentNodePath = join(this.converter.layers0Path, 'nodes', path);
109
+ let parentNodeFileName = 'index.json';
110
+ if (this.converter.options.slpk) {
111
+ parentNodeFileName = '3dNodeIndexDocument.json';
112
+ }
113
+ return await openJson(parentNodePath, parentNodeFileName);
114
+ }
115
+
116
+ static async createRootNode(boundingVolumes, converter) {
117
+ const rootData = NodeIndexDocument.createRootNodeIndexDocument(boundingVolumes);
118
+ const rootNode = await new NodeIndexDocument(0, converter).addData(rootData);
119
+ return rootNode;
120
+ }
121
+
122
+ static async createNode(parentNode, boundingVolumes, lodSelection, nodeInPage, resources, converter) {
123
+ const data = await NodeIndexDocument.createNodeIndexDocument(parentNode, boundingVolumes, lodSelection, nodeInPage, resources);
124
+ const node = await new NodeIndexDocument(nodeInPage.index, converter).addData(data);
125
+ return node;
126
+ }
127
+
128
+ static createRootNodeIndexDocument(boundingVolumes) {
129
+ const root0data = {
130
+ version: "{".concat(uuidv4().toUpperCase(), "}"),
131
+ id: 'root',
132
+ level: 0,
133
+ lodSelection: [{
134
+ metricType: 'maxScreenThresholdSQ',
135
+ maxError: 0
136
+ }, {
137
+ metricType: 'maxScreenThreshold',
138
+ maxError: 0
139
+ }],
140
+ ...boundingVolumes,
141
+ children: []
142
+ };
143
+ return transform(root0data, nodeTemplate());
144
+ }
145
+
146
+ static async createNodeIndexDocument(parentNode, boundingVolumes, lodSelection, nodeInPage, resources) {
147
+ const {
148
+ texture,
149
+ attributes
150
+ } = resources;
151
+ const nodeId = nodeInPage.index;
152
+ const parentNodeData = await parentNode.load();
153
+ const nodeData = {
154
+ version: parentNodeData.version,
155
+ id: nodeId.toString(),
156
+ level: parentNodeData.level + 1,
157
+ ...boundingVolumes,
158
+ lodSelection,
159
+ parentNode: {
160
+ id: parentNode.id,
161
+ href: "../".concat(parentNode.id),
162
+ mbs: parentNodeData.mbs,
163
+ obb: parentNodeData.obb
164
+ },
165
+ children: [],
166
+ neighbors: []
167
+ };
168
+ const node = transform(nodeData, nodeTemplate());
169
+ if (nodeInPage.mesh) {
170
+ var _parentNode$converter, _parentNode$converter2;
171
+ node.geometryData = [{
172
+ href: './geometries/0'
173
+ }];
174
+ node.sharedResource = {
175
+ href: './shared'
176
+ };
177
+ if (texture) {
178
+ node.textureData = [{
179
+ href: './textures/0'
180
+ }, {
181
+ href: './textures/1'
182
+ }];
183
+ }
184
+ if (attributes && attributes.length && (_parentNode$converter = parentNode.converter.layers0) !== null && _parentNode$converter !== void 0 && (_parentNode$converter2 = _parentNode$converter.attributeStorageInfo) !== null && _parentNode$converter2 !== void 0 && _parentNode$converter2.length) {
185
+ node.attributeData = [];
186
+ for (let index = 0; index < attributes.length; index++) {
187
+ const folderName = parentNode.converter.layers0.attributeStorageInfo[index].key;
188
+ node.attributeData.push({
189
+ href: "./attributes/".concat(folderName, "/0")
190
+ });
191
+ }
192
+ }
193
+ }
194
+ return node;
195
+ }
196
+ }
197
+ //# sourceMappingURL=node-index-document.js.map
@@ -0,0 +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","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 childNode.save();\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 * 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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"}
@@ -2,149 +2,223 @@ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import { join } from 'path';
3
3
  import transform from 'json-map-transform';
4
4
  import { METADATA as metadataTemplate } from '../json-templates/metadata';
5
+ import { isFileExists, openJson } from '../../lib/utils/file-utils';
5
6
  export default class NodePages {
6
- constructor(writeFileFunc, nodesPerPage) {
7
+ constructor(writeFileFunc, nodesPerPage, converter) {
7
8
  _defineProperty(this, "nodesPerPage", void 0);
8
-
9
9
  _defineProperty(this, "nodesCounter", void 0);
10
-
11
10
  _defineProperty(this, "writeFile", void 0);
12
-
11
+ _defineProperty(this, "converter", void 0);
13
12
  _defineProperty(this, "nodePages", void 0);
14
-
13
+ _defineProperty(this, "length", 0);
15
14
  this.nodesPerPage = nodesPerPage;
16
15
  this.nodesCounter = 0;
17
16
  this.nodePages = [{}];
18
17
  this.nodePages[0].nodes = [];
19
18
  this.writeFile = writeFileFunc;
19
+ this.converter = converter;
20
+ this.length = 0;
20
21
  }
21
22
 
22
23
  useWriteFunction(func) {
23
24
  this.writeFile = func;
24
25
  }
25
26
 
26
- getNodeById(id) {
27
- const pageIndex = Math.floor(id / this.nodesPerPage);
28
- const nodeIndex = id % this.nodesPerPage;
29
- return this.nodePages[pageIndex].nodes[nodeIndex];
30
- }
31
-
32
- updateMaterialByNodeId(id, materialId) {
33
- const node = this.getNodeById(id);
34
-
35
- if (!node.mesh) {
36
- return;
27
+ getNodePageFileName(nodePageId) {
28
+ let filePath;
29
+ let fileName;
30
+ if (this.converter.options.slpk) {
31
+ filePath = join(this.converter.layers0Path, 'nodepages');
32
+ fileName = "".concat(nodePageId.toString(), ".json");
33
+ } else {
34
+ filePath = join(this.converter.layers0Path, 'nodepages', nodePageId.toString());
35
+ fileName = 'index.json';
37
36
  }
38
-
39
- node.mesh.material = {
40
- definition: materialId,
41
- resource: node.index
37
+ return {
38
+ filePath,
39
+ fileName
42
40
  };
43
41
  }
44
42
 
45
- updateVertexCountByNodeId(id, vertexCount) {
46
- const node = this.getNodeById(id);
47
-
48
- if (!node.mesh) {
49
- return;
43
+ async loadNodePage(nodePageId) {
44
+ const {
45
+ filePath,
46
+ fileName
47
+ } = this.getNodePageFileName(nodePageId);
48
+ const fullName = join(filePath, fileName);
49
+ if (await isFileExists(fullName)) {
50
+ console.log("load ".concat(fullName, "."));
51
+ return await openJson(filePath, fileName);
52
+ } else {
53
+ return {
54
+ nodes: []
55
+ };
50
56
  }
51
-
52
- node.mesh.geometry.vertexCount = vertexCount;
53
57
  }
54
58
 
55
- updateNodeAttributeByNodeId(id) {
56
- const node = this.getNodeById(id);
57
-
58
- if (!node.mesh) {
59
- return;
60
- }
61
-
62
- node.mesh.attribute.resource = node.index;
59
+ getPageIndexByNodeId(id) {
60
+ return Math.floor(id / this.nodesPerPage);
63
61
  }
64
62
 
65
- updateFeatureCountByNodeId(id, featureCount) {
66
- const node = this.getNodeById(id);
67
-
68
- if (!node.mesh) {
69
- return;
63
+ async getPageByNodeId(id) {
64
+ const pageIndex = this.getPageIndexByNodeId(id);
65
+ if (this.converter.options.instantNodeWriting) {
66
+ return await this.loadNodePage(pageIndex);
70
67
  }
71
-
72
- node.mesh.geometry.featureCount = featureCount;
68
+ return this.nodePages[pageIndex];
73
69
  }
74
70
 
75
- updateTexelCountHintByNodeId(id, texelCountHint) {
76
- const node = this.getNodeById(id);
77
-
78
- if (!node.mesh || !node.mesh.material) {
79
- return;
80
- }
81
-
82
- node.mesh.material.texelCountHint = texelCountHint;
71
+ async getNodeById(id, nodePage) {
72
+ const nodeIndex = id % this.nodesPerPage;
73
+ nodePage = nodePage || (await this.getPageByNodeId(id));
74
+ return nodePage.nodes[nodeIndex];
83
75
  }
84
76
 
85
- addChildRelation(parentId, childId) {
77
+ async addChildRelation(parentId, childId) {
86
78
  var _parentNode$children;
87
-
88
79
  if (parentId === null || parentId === undefined) {
89
80
  return;
90
81
  }
91
-
92
- const parentNode = this.getNodeById(parentId);
82
+ const parentNode = await this.getNodeById(parentId);
93
83
  (_parentNode$children = parentNode.children) === null || _parentNode$children === void 0 ? void 0 : _parentNode$children.push(childId);
84
+ await this.saveNode(parentNode);
94
85
  }
95
86
 
96
- updateResourceInMesh(node) {
97
- if (node.mesh) {
98
- node.mesh.geometry.resource = node.index;
87
+ async push(node, parentId) {
88
+ node.index = this.nodesCounter++;
89
+ if (!this.converter.options.instantNodeWriting) {
90
+ let currentNodePage = this.nodePages[this.nodePages.length - 1];
91
+ if (currentNodePage.nodes.length === this.nodesPerPage) {
92
+ currentNodePage = {
93
+ nodes: []
94
+ };
95
+ this.nodePages.push(currentNodePage);
96
+ }
97
+ currentNodePage.nodes.push(node);
99
98
  }
99
+ await this.addChildRelation(parentId, node.index);
100
+ NodePages.updateResourceInMesh(node);
101
+ await this.saveNode(node);
102
+ return node;
100
103
  }
101
104
 
102
- push(node, parentId) {
103
- let currentNodePage = this.nodePages[this.nodePages.length - 1];
104
-
105
- if (currentNodePage.nodes.length === this.nodesPerPage) {
106
- currentNodePage = {
107
- nodes: []
108
- };
109
- this.nodePages.push(currentNodePage);
105
+ async saveNode(node) {
106
+ if (!this.converter.options.instantNodeWriting) {
107
+ return;
108
+ } else {
109
+ const nodePageIndex = this.getPageIndexByNodeId(node.index);
110
+ const nodePage = await this.getPageByNodeId(node.index);
111
+ const {
112
+ filePath,
113
+ fileName
114
+ } = this.getNodePageFileName(nodePageIndex);
115
+ const nodeToUpdate = await this.getNodeById(node.index, nodePage);
116
+ if (nodeToUpdate) {
117
+ NodePages.updateAll(nodeToUpdate, node);
118
+ } else {
119
+ nodePage.nodes.push(node);
120
+ }
121
+ const nodePageStr = JSON.stringify(nodePage);
122
+ if (this.converter.options.slpk) {
123
+ await this.converter.writeQueue.enqueue({
124
+ archiveKey: "nodePages/".concat(nodePageIndex.toString(), ".json.gz"),
125
+ writePromise: () => this.writeFile(filePath, nodePageStr, fileName, true, this.converter.compressList)
126
+ }, true);
127
+ } else {
128
+ await this.converter.writeQueue.enqueue({
129
+ writePromise: () => this.writeFile(filePath, nodePageStr)
130
+ }, true);
131
+ }
110
132
  }
133
+ }
111
134
 
112
- node.index = this.nodesCounter++;
113
- currentNodePage.nodes.push(node);
114
- this.addChildRelation(parentId, node.index);
115
- this.updateResourceInMesh(node);
116
- return node.index;
135
+ async saveMetadata() {
136
+ const metadata = transform({
137
+ nodeCount: this.nodesCounter
138
+ }, metadataTemplate());
139
+ const compress = false;
140
+ await this.converter.writeQueue.enqueue({
141
+ archiveKey: 'metadata.json',
142
+ writePromise: () => this.writeFile(this.converter.layers0Path, JSON.stringify(metadata), 'metadata.json', compress)
143
+ });
117
144
  }
118
145
 
119
- async save(layers0Path, writeQueue, slpk = false) {
120
- if (slpk) {
146
+ async save() {
147
+ if (this.converter.options.instantNodeWriting) {
148
+ await this.saveMetadata();
149
+ return;
150
+ }
151
+ if (this.converter.options.slpk) {
121
152
  for (const [index, nodePage] of this.nodePages.entries()) {
122
153
  const nodePageStr = JSON.stringify(nodePage);
123
- const slpkPath = join(layers0Path, 'nodepages');
124
- writeQueue.enqueue({
154
+ const slpkPath = join(this.converter.layers0Path, 'nodepages');
155
+ await this.converter.writeQueue.enqueue({
125
156
  archiveKey: "nodePages/".concat(index.toString(), ".json.gz"),
126
- writePromise: this.writeFile(slpkPath, nodePageStr, "".concat(index.toString(), ".json"))
157
+ writePromise: () => this.writeFile(slpkPath, nodePageStr, "".concat(index.toString(), ".json"))
127
158
  });
128
159
  }
129
-
130
- const metadata = transform({
131
- nodeCount: this.nodesCounter
132
- }, metadataTemplate());
133
- const compress = false;
134
- writeQueue.enqueue({
135
- archiveKey: 'metadata.json',
136
- writePromise: this.writeFile(layers0Path, JSON.stringify(metadata), 'metadata.json', compress)
137
- });
160
+ await this.saveMetadata();
138
161
  } else {
139
162
  for (const [index, nodePage] of this.nodePages.entries()) {
140
163
  const nodePageStr = JSON.stringify(nodePage);
141
- const nodePagePath = join(layers0Path, 'nodepages', index.toString());
142
- writeQueue.enqueue({
143
- writePromise: this.writeFile(nodePagePath, nodePageStr)
164
+ const nodePagePath = join(this.converter.layers0Path, 'nodepages', index.toString());
165
+ await this.converter.writeQueue.enqueue({
166
+ writePromise: () => this.writeFile(nodePagePath, nodePageStr)
144
167
  });
145
168
  }
146
169
  }
147
170
  }
148
171
 
172
+ static updateResourceInMesh(node) {
173
+ if (node.mesh && isFinite(node.index)) {
174
+ node.mesh.geometry.resource = node.index;
175
+ }
176
+ }
177
+
178
+ static updateAll(node, data) {
179
+ Object.assign(node, data, {
180
+ index: node.index
181
+ });
182
+ NodePages.updateResourceInMesh(node);
183
+ return node;
184
+ }
185
+
186
+ static updateMaterialByNodeId(node, materialId) {
187
+ if (!node.mesh) {
188
+ return;
189
+ }
190
+ node.mesh.material = {
191
+ definition: materialId,
192
+ resource: node.index
193
+ };
194
+ }
195
+
196
+ static updateVertexCountByNodeId(node, vertexCount) {
197
+ if (!node.mesh) {
198
+ return;
199
+ }
200
+ node.mesh.geometry.vertexCount = vertexCount;
201
+ }
202
+
203
+ static updateNodeAttributeByNodeId(node) {
204
+ if (!node.mesh || !node.index) {
205
+ return;
206
+ }
207
+ node.mesh.attribute.resource = node.index;
208
+ }
209
+
210
+ static updateFeatureCountByNodeId(node, featureCount) {
211
+ if (!node.mesh) {
212
+ return;
213
+ }
214
+ node.mesh.geometry.featureCount = featureCount;
215
+ }
216
+
217
+ static updateTexelCountHintByNodeId(node, texelCountHint) {
218
+ if (!node.mesh || !node.mesh.material) {
219
+ return;
220
+ }
221
+ node.mesh.material.texelCountHint = texelCountHint;
222
+ }
149
223
  }
150
224
  //# sourceMappingURL=node-pages.js.map