@loaders.gl/i3s 4.0.0-alpha.1 → 4.0.0-alpha.11

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 (242) hide show
  1. package/dist/arcgis-webscene-loader.d.ts +7 -0
  2. package/dist/arcgis-webscene-loader.d.ts.map +1 -0
  3. package/dist/arcgis-webscene-loader.js +28 -0
  4. package/dist/bundle.d.ts +2 -0
  5. package/dist/bundle.d.ts.map +1 -0
  6. package/dist/bundle.js +2 -2
  7. package/dist/dist.min.js +15501 -0
  8. package/dist/es5/arcgis-webscene-loader.js +40 -0
  9. package/dist/es5/arcgis-webscene-loader.js.map +1 -0
  10. package/dist/es5/bundle.js +6 -0
  11. package/dist/es5/bundle.js.map +1 -0
  12. package/dist/es5/i3s-attribute-loader.js +195 -0
  13. package/dist/es5/i3s-attribute-loader.js.map +1 -0
  14. package/dist/es5/i3s-building-scene-layer-loader.js +46 -0
  15. package/dist/es5/i3s-building-scene-layer-loader.js.map +1 -0
  16. package/dist/es5/i3s-content-loader.js +56 -0
  17. package/dist/es5/i3s-content-loader.js.map +1 -0
  18. package/dist/es5/i3s-loader.js +193 -0
  19. package/dist/es5/i3s-loader.js.map +1 -0
  20. package/dist/es5/i3s-node-page-loader.js +39 -0
  21. package/dist/es5/i3s-node-page-loader.js.map +1 -0
  22. package/dist/es5/i3s-slpk-loader.js +20 -0
  23. package/dist/es5/i3s-slpk-loader.js.map +1 -0
  24. package/dist/es5/index.js +82 -0
  25. package/dist/es5/index.js.map +1 -0
  26. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +312 -0
  27. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -0
  28. package/dist/es5/lib/parsers/constants.js +72 -0
  29. package/dist/es5/lib/parsers/constants.js.map +1 -0
  30. package/dist/es5/lib/parsers/parse-arcgis-webscene.js +158 -0
  31. package/dist/es5/lib/parsers/parse-arcgis-webscene.js.map +1 -0
  32. package/dist/es5/lib/parsers/parse-i3s-attribute.js +76 -0
  33. package/dist/es5/lib/parsers/parse-i3s-attribute.js.map +1 -0
  34. package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js +65 -0
  35. package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -0
  36. package/dist/es5/lib/parsers/parse-i3s-tile-content.js +510 -0
  37. package/dist/es5/lib/parsers/parse-i3s-tile-content.js.map +1 -0
  38. package/dist/es5/lib/parsers/parse-i3s.js +116 -0
  39. package/dist/es5/lib/parsers/parse-i3s.js.map +1 -0
  40. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +107 -0
  41. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -0
  42. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +258 -0
  43. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -0
  44. package/dist/es5/lib/parsers/parse-zip/buffer-file-provider.js +46 -0
  45. package/dist/es5/lib/parsers/parse-zip/buffer-file-provider.js.map +1 -0
  46. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +84 -0
  47. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +1 -0
  48. package/dist/es5/lib/parsers/parse-zip/file-provider.js +2 -0
  49. package/dist/es5/lib/parsers/parse-zip/file-provider.js.map +1 -0
  50. package/dist/es5/lib/parsers/parse-zip/local-file-header.js +72 -0
  51. package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +1 -0
  52. package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js +17 -0
  53. package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -0
  54. package/dist/es5/lib/utils/customize-/321/201olors.js +184 -0
  55. package/dist/es5/lib/utils/customize-/321/201olors.js.map +1 -0
  56. package/dist/es5/lib/utils/url-utils.js +33 -0
  57. package/dist/es5/lib/utils/url-utils.js.map +1 -0
  58. package/dist/es5/types.js +26 -0
  59. package/dist/es5/types.js.map +1 -0
  60. package/dist/es5/workers/i3s-content-worker-node.js +7 -0
  61. package/dist/es5/workers/i3s-content-worker-node.js.map +1 -0
  62. package/dist/es5/workers/i3s-content-worker.js +6 -0
  63. package/dist/es5/workers/i3s-content-worker.js.map +1 -0
  64. package/dist/esm/arcgis-webscene-loader.js +16 -0
  65. package/dist/esm/arcgis-webscene-loader.js.map +1 -0
  66. package/dist/esm/bundle.js +4 -0
  67. package/dist/esm/bundle.js.map +1 -0
  68. package/dist/esm/i3s-attribute-loader.js +119 -0
  69. package/dist/esm/i3s-attribute-loader.js.map +1 -0
  70. package/dist/esm/i3s-building-scene-layer-loader.js +19 -0
  71. package/dist/esm/i3s-building-scene-layer-loader.js.map +1 -0
  72. package/dist/esm/i3s-content-loader.js +30 -0
  73. package/dist/esm/i3s-content-loader.js.map +1 -0
  74. package/dist/esm/i3s-loader.js +87 -0
  75. package/dist/esm/i3s-loader.js.map +1 -0
  76. package/dist/esm/i3s-node-page-loader.js +15 -0
  77. package/dist/esm/i3s-node-page-loader.js.map +1 -0
  78. package/dist/esm/i3s-slpk-loader.js +13 -0
  79. package/dist/esm/i3s-slpk-loader.js.map +1 -0
  80. package/dist/esm/index.js +11 -0
  81. package/dist/esm/index.js.map +1 -0
  82. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +198 -0
  83. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -0
  84. package/dist/esm/lib/parsers/constants.js +57 -0
  85. package/dist/esm/lib/parsers/constants.js.map +1 -0
  86. package/dist/esm/lib/parsers/parse-arcgis-webscene.js +70 -0
  87. package/dist/esm/lib/parsers/parse-arcgis-webscene.js.map +1 -0
  88. package/dist/esm/lib/parsers/parse-i3s-attribute.js +60 -0
  89. package/dist/esm/lib/parsers/parse-i3s-attribute.js.map +1 -0
  90. package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js +39 -0
  91. package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -0
  92. package/dist/esm/lib/parsers/parse-i3s-tile-content.js +435 -0
  93. package/dist/esm/lib/parsers/parse-i3s-tile-content.js.map +1 -0
  94. package/dist/esm/lib/parsers/parse-i3s.js +83 -0
  95. package/dist/esm/lib/parsers/parse-i3s.js.map +1 -0
  96. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +41 -0
  97. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -0
  98. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +107 -0
  99. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -0
  100. package/dist/esm/lib/parsers/parse-zip/buffer-file-provider.js +23 -0
  101. package/dist/esm/lib/parsers/parse-zip/buffer-file-provider.js.map +1 -0
  102. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +37 -0
  103. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +1 -0
  104. package/dist/esm/lib/parsers/parse-zip/file-provider.js +2 -0
  105. package/dist/esm/lib/parsers/parse-zip/file-provider.js.map +1 -0
  106. package/dist/esm/lib/parsers/parse-zip/local-file-header.js +25 -0
  107. package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +1 -0
  108. package/dist/esm/lib/utils/convert-i3s-obb-to-mbs.js +9 -0
  109. package/dist/esm/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -0
  110. package/dist/esm/lib/utils/customize-/321/201olors.js +98 -0
  111. package/dist/esm/lib/utils/customize-/321/201olors.js.map +1 -0
  112. package/dist/esm/lib/utils/url-utils.js +28 -0
  113. package/dist/esm/lib/utils/url-utils.js.map +1 -0
  114. package/dist/esm/types.js +18 -0
  115. package/dist/esm/types.js.map +1 -0
  116. package/dist/esm/workers/i3s-content-worker-node.js +5 -0
  117. package/dist/esm/workers/i3s-content-worker-node.js.map +1 -0
  118. package/dist/esm/workers/i3s-content-worker.js +4 -0
  119. package/dist/esm/workers/i3s-content-worker.js.map +1 -0
  120. package/dist/i3s-attribute-loader.d.ts +21 -0
  121. package/dist/i3s-attribute-loader.d.ts.map +1 -0
  122. package/dist/i3s-attribute-loader.js +155 -132
  123. package/dist/i3s-building-scene-layer-loader.d.ts +6 -0
  124. package/dist/i3s-building-scene-layer-loader.d.ts.map +1 -0
  125. package/dist/i3s-building-scene-layer-loader.js +23 -18
  126. package/dist/i3s-content-loader.d.ts +6 -0
  127. package/dist/i3s-content-loader.d.ts.map +1 -0
  128. package/dist/i3s-content-loader.js +29 -22
  129. package/dist/i3s-content-worker-node.js +197 -0
  130. package/dist/i3s-content-worker-node.js.map +7 -0
  131. package/dist/i3s-content-worker.js +2308 -1376
  132. package/dist/i3s-loader.d.ts +11 -0
  133. package/dist/i3s-loader.d.ts.map +1 -0
  134. package/dist/i3s-loader.js +88 -81
  135. package/dist/i3s-node-page-loader.d.ts +7 -0
  136. package/dist/i3s-node-page-loader.d.ts.map +1 -0
  137. package/dist/i3s-node-page-loader.js +20 -20
  138. package/dist/i3s-slpk-loader.d.ts +13 -0
  139. package/dist/i3s-slpk-loader.d.ts.map +1 -0
  140. package/dist/i3s-slpk-loader.js +20 -0
  141. package/dist/index.d.ts +12 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +23 -5
  144. package/dist/lib/helpers/i3s-nodepages-tiles.d.ts +74 -0
  145. package/dist/lib/helpers/i3s-nodepages-tiles.d.ts.map +1 -0
  146. package/dist/lib/helpers/i3s-nodepages-tiles.js +232 -219
  147. package/dist/lib/parsers/constants.d.ts +40 -0
  148. package/dist/lib/parsers/constants.d.ts.map +1 -0
  149. package/dist/lib/parsers/constants.js +87 -42
  150. package/dist/lib/parsers/parse-arcgis-webscene.d.ts +7 -0
  151. package/dist/lib/parsers/parse-arcgis-webscene.d.ts.map +1 -0
  152. package/dist/lib/parsers/parse-arcgis-webscene.js +88 -0
  153. package/dist/lib/parsers/parse-i3s-attribute.d.ts +12 -0
  154. package/dist/lib/parsers/parse-i3s-attribute.d.ts.map +1 -0
  155. package/dist/lib/parsers/parse-i3s-attribute.js +87 -62
  156. package/dist/lib/parsers/parse-i3s-building-scene-layer.d.ts +9 -0
  157. package/dist/lib/parsers/parse-i3s-building-scene-layer.d.ts.map +1 -0
  158. package/dist/lib/parsers/parse-i3s-building-scene-layer.js +41 -38
  159. package/dist/lib/parsers/parse-i3s-tile-content.d.ts +4 -0
  160. package/dist/lib/parsers/parse-i3s-tile-content.d.ts.map +1 -0
  161. package/dist/lib/parsers/parse-i3s-tile-content.js +460 -415
  162. package/dist/lib/parsers/parse-i3s.d.ts +6 -0
  163. package/dist/lib/parsers/parse-i3s.d.ts.map +1 -0
  164. package/dist/lib/parsers/parse-i3s.js +92 -73
  165. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +4 -0
  166. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -0
  167. package/dist/lib/parsers/parse-slpk/parse-slpk.js +54 -0
  168. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts +38 -0
  169. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -0
  170. package/dist/lib/parsers/parse-slpk/slpk-archieve.js +142 -0
  171. package/dist/lib/parsers/parse-zip/buffer-file-provider.d.ts +37 -0
  172. package/dist/lib/parsers/parse-zip/buffer-file-provider.d.ts.map +1 -0
  173. package/dist/lib/parsers/parse-zip/buffer-file-provider.js +47 -0
  174. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +27 -0
  175. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +1 -0
  176. package/dist/lib/parsers/parse-zip/cd-file-header.js +48 -0
  177. package/dist/lib/parsers/parse-zip/file-provider.d.ts +31 -0
  178. package/dist/lib/parsers/parse-zip/file-provider.d.ts.map +1 -0
  179. package/dist/lib/parsers/parse-zip/file-provider.js +2 -0
  180. package/dist/lib/parsers/parse-zip/local-file-header.d.ts +25 -0
  181. package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +1 -0
  182. package/dist/lib/parsers/parse-zip/local-file-header.js +34 -0
  183. package/dist/lib/utils/convert-i3s-obb-to-mbs.d.ts +2 -0
  184. package/dist/lib/utils/convert-i3s-obb-to-mbs.d.ts.map +1 -0
  185. package/dist/lib/utils/convert-i3s-obb-to-mbs.js +19 -8
  186. package/dist/lib/utils/customize-/321/201olors.d.ts +14 -0
  187. package/dist/lib/utils/customize-/321/201olors.d.ts.map +1 -0
  188. package/dist/lib/utils/customize-/321/201olors.js +104 -0
  189. package/dist/lib/utils/url-utils.d.ts +22 -0
  190. package/dist/lib/utils/url-utils.d.ts.map +1 -0
  191. package/dist/lib/utils/url-utils.js +41 -29
  192. package/dist/types.d.ts +1065 -0
  193. package/dist/types.d.ts.map +1 -0
  194. package/dist/types.js +20 -2
  195. package/dist/workers/i3s-content-worker-node.d.ts +2 -0
  196. package/dist/workers/i3s-content-worker-node.d.ts.map +1 -0
  197. package/dist/workers/i3s-content-worker-node.js +7 -0
  198. package/dist/workers/i3s-content-worker.d.ts +2 -0
  199. package/dist/workers/i3s-content-worker.d.ts.map +1 -0
  200. package/dist/workers/i3s-content-worker.js +5 -4
  201. package/package.json +18 -16
  202. package/src/arcgis-webscene-loader.ts +31 -0
  203. package/src/i3s-attribute-loader.ts +9 -9
  204. package/src/i3s-content-loader.ts +17 -5
  205. package/src/i3s-loader.ts +24 -13
  206. package/src/i3s-node-page-loader.ts +6 -10
  207. package/src/i3s-slpk-loader.ts +27 -0
  208. package/src/index.ts +28 -7
  209. package/src/lib/helpers/i3s-nodepages-tiles.ts +84 -57
  210. package/src/lib/parsers/constants.ts +71 -37
  211. package/src/lib/parsers/parse-arcgis-webscene.ts +102 -0
  212. package/src/lib/parsers/parse-i3s-attribute.ts +21 -14
  213. package/src/lib/parsers/parse-i3s-building-scene-layer.ts +2 -1
  214. package/src/lib/parsers/parse-i3s-tile-content.ts +278 -194
  215. package/src/lib/parsers/parse-i3s.ts +55 -39
  216. package/src/lib/parsers/parse-slpk/parse-slpk.ts +72 -0
  217. package/src/lib/parsers/parse-slpk/slpk-archieve.ts +173 -0
  218. package/src/lib/parsers/parse-zip/buffer-file-provider.ts +55 -0
  219. package/src/lib/parsers/parse-zip/cd-file-header.ts +86 -0
  220. package/src/lib/parsers/parse-zip/file-provider.ts +34 -0
  221. package/src/lib/parsers/parse-zip/local-file-header.ts +65 -0
  222. package/src/lib/utils/customize-/321/201olors.ts +144 -0
  223. package/src/lib/utils/url-utils.ts +7 -7
  224. package/src/types.ts +875 -86
  225. package/src/workers/i3s-content-worker-node.ts +6 -0
  226. package/dist/bundle.js.map +0 -1
  227. package/dist/i3s-attribute-loader.js.map +0 -1
  228. package/dist/i3s-building-scene-layer-loader.js.map +0 -1
  229. package/dist/i3s-content-loader.js.map +0 -1
  230. package/dist/i3s-loader.js.map +0 -1
  231. package/dist/i3s-node-page-loader.js.map +0 -1
  232. package/dist/index.js.map +0 -1
  233. package/dist/lib/helpers/i3s-nodepages-tiles.js.map +0 -1
  234. package/dist/lib/parsers/constants.js.map +0 -1
  235. package/dist/lib/parsers/parse-i3s-attribute.js.map +0 -1
  236. package/dist/lib/parsers/parse-i3s-building-scene-layer.js.map +0 -1
  237. package/dist/lib/parsers/parse-i3s-tile-content.js.map +0 -1
  238. package/dist/lib/parsers/parse-i3s.js.map +0 -1
  239. package/dist/lib/utils/convert-i3s-obb-to-mbs.js.map +0 -1
  240. package/dist/lib/utils/url-utils.js.map +0 -1
  241. package/dist/types.js.map +0 -1
  242. package/dist/workers/i3s-content-worker.js.map +0 -1
@@ -1,21 +1,34 @@
1
1
  import {load} from '@loaders.gl/core';
2
2
  import {getSupportedGPUTextureFormats, selectSupportedBasisFormat} from '@loaders.gl/textures';
3
- import {Tileset, NodePage} from '../../types';
4
3
  import {I3SNodePageLoader} from '../../i3s-node-page-loader';
5
4
  import {normalizeTileNonUrlData} from '../parsers/parse-i3s';
6
5
  import {getUrlWithToken, generateTilesetAttributeUrls} from '../utils/url-utils';
6
+ import type {LoaderOptions} from '@loaders.gl/loader-utils';
7
+ import {
8
+ I3STilesetHeader,
9
+ LodSelection,
10
+ NodePage,
11
+ NodeInPage,
12
+ Obb,
13
+ MeshMaterial,
14
+ I3SMaterialDefinition,
15
+ I3STextureFormat,
16
+ MeshGeometry,
17
+ I3STileHeader
18
+ } from '../../types';
7
19
 
8
20
  /**
9
21
  * class I3SNodePagesTiles - loads nodePages and form i3s tiles from them
10
22
  */
11
23
  export default class I3SNodePagesTiles {
12
- tileset: Tileset;
24
+ tileset: I3STilesetHeader;
13
25
  nodePages: NodePage[] = [];
14
26
  pendingNodePages: {promise: Promise<NodePage>; status: 'Pending' | 'Done'}[] = [];
15
27
  nodesPerPage: number;
16
- options: {[key: string]: any};
17
- lodSelectionMetricType: any;
18
- textureDefinitionsSelectedFormats: any[] = [];
28
+ options: LoaderOptions;
29
+ lodSelectionMetricType?: string;
30
+ textureDefinitionsSelectedFormats: ({format: I3STextureFormat; name: string} | null)[] = [];
31
+ nodesInNodePages: number;
19
32
  private textureLoaderOptions: {[key: string]: any} = {};
20
33
 
21
34
  /**
@@ -24,11 +37,12 @@ export default class I3SNodePagesTiles {
24
37
  * @param tileset - i3s tileset header ('layers/0')
25
38
  * @param options - i3s loader options
26
39
  */
27
- constructor(tileset: Tileset, options: object) {
40
+ constructor(tileset: I3STilesetHeader, options: LoaderOptions) {
28
41
  this.tileset = {...tileset}; // spread the tileset to avoid circular reference
29
- this.nodesPerPage = tileset.nodePages.nodesPerPage;
30
- this.lodSelectionMetricType = tileset.nodePages.lodSelectionMetricType;
42
+ this.nodesPerPage = tileset.nodePages?.nodesPerPage || 64;
43
+ this.lodSelectionMetricType = tileset.nodePages?.lodSelectionMetricType;
31
44
  this.options = options;
45
+ this.nodesInNodePages = 0;
32
46
 
33
47
  this.initSelectedFormatsForTextureDefinitions(tileset);
34
48
  }
@@ -37,11 +51,12 @@ export default class I3SNodePagesTiles {
37
51
  * Loads some nodePage and return a particular node from it
38
52
  * @param id - id of node through all node pages
39
53
  */
40
- async getNodeById(id: number) {
54
+ async getNodeById(id: number): Promise<NodeInPage> {
41
55
  const pageIndex = Math.floor(id / this.nodesPerPage);
42
56
  if (!this.nodePages[pageIndex] && !this.pendingNodePages[pageIndex]) {
43
57
  const nodePageUrl = getUrlWithToken(
44
58
  `${this.tileset.url}/nodepages/${pageIndex}`,
59
+ // @ts-expect-error this.options is not properly typed
45
60
  this.options.i3s?.token
46
61
  );
47
62
  this.pendingNodePages[pageIndex] = {
@@ -49,6 +64,7 @@ export default class I3SNodePagesTiles {
49
64
  promise: load(nodePageUrl, I3SNodePageLoader, this.options)
50
65
  };
51
66
  this.nodePages[pageIndex] = await this.pendingNodePages[pageIndex].promise;
67
+ this.nodesInNodePages += this.nodePages[pageIndex].nodes.length;
52
68
  this.pendingNodePages[pageIndex].status = 'Done';
53
69
  }
54
70
  if (this.pendingNodePages[pageIndex].status === 'Pending') {
@@ -62,35 +78,39 @@ export default class I3SNodePagesTiles {
62
78
  * Forms tile header using node and tileset data
63
79
  * @param id - id of node through all node pages
64
80
  */
65
- // eslint-disable-next-line complexity
66
- async formTileFromNodePages(id: number) {
67
- const node = await this.getNodeById(id);
68
- const children: any[] = [];
81
+ // eslint-disable-next-line complexity, max-statements
82
+ async formTileFromNodePages(id: number): Promise<I3STileHeader> {
83
+ const node: NodeInPage = await this.getNodeById(id);
84
+ const children: {id: string; obb: Obb}[] = [];
85
+ const childNodesPromises: Promise<NodeInPage>[] = [];
69
86
  for (const child of node.children || []) {
70
- const childNode = await this.getNodeById(child);
87
+ childNodesPromises.push(this.getNodeById(child));
88
+ }
89
+
90
+ const childNodes = await Promise.all(childNodesPromises);
91
+ for (const childNode of childNodes) {
71
92
  children.push({
72
- id: child,
93
+ id: childNode.index.toString(),
73
94
  obb: childNode.obb
74
95
  });
75
96
  }
76
97
 
77
- let contentUrl = null;
78
- let textureUrl: string | null = null;
79
- let materialDefinition = null;
80
- let textureFormat = 'jpeg';
98
+ let contentUrl: string | undefined;
99
+ let textureUrl: string | undefined;
100
+ let materialDefinition: I3SMaterialDefinition | undefined;
101
+ let textureFormat: I3STextureFormat = 'jpg';
81
102
  let attributeUrls: string[] = [];
82
- let isDracoGeometry = false;
103
+ let isDracoGeometry: boolean = false;
83
104
 
84
105
  if (node && node.mesh) {
85
106
  // Get geometry resource URL and type (compressed / non-compressed)
86
107
  const {url, isDracoGeometry: isDracoGeometryResult} = (node.mesh.geometry &&
87
- this.getContentUrl(node.mesh.geometry)) || {url: null, isDracoGeometry: null};
108
+ this.getContentUrl(node.mesh.geometry)) || {isDracoGeometry: false};
88
109
  contentUrl = url;
89
110
  isDracoGeometry = isDracoGeometryResult;
90
111
 
91
- const [textureData, nodeMaterialDefinition] = this.getInformationFromMaterial(
92
- node.mesh.material
93
- );
112
+ const {textureData, materialDefinition: nodeMaterialDefinition} =
113
+ this.getInformationFromMaterial(node.mesh.material);
94
114
  materialDefinition = nodeMaterialDefinition;
95
115
  textureFormat = textureData.format || textureFormat;
96
116
  if (textureData.name) {
@@ -105,7 +125,7 @@ export default class I3SNodePagesTiles {
105
125
  const lodSelection = this.getLodSelection(node);
106
126
 
107
127
  return normalizeTileNonUrlData({
108
- id,
128
+ id: id.toString(),
109
129
  lodSelection,
110
130
  obb: node.obb,
111
131
  contentUrl,
@@ -121,16 +141,18 @@ export default class I3SNodePagesTiles {
121
141
 
122
142
  /**
123
143
  * Forms url and type of geometry resource by nodepage's data and `geometryDefinitions` in the tileset
124
- * @param {Object} meshGeometryData - data about the node's mesh from the nodepage
125
- * @returns {Object} -
144
+ * @param - data about the node's mesh from the nodepage
145
+ * @returns -
126
146
  * {string} url - url to the geometry resource
127
147
  * {boolean} isDracoGeometry - whether the geometry resource contain DRACO compressed geometry
128
148
  */
129
- private getContentUrl(meshGeometryData) {
130
- let result = {};
149
+ private getContentUrl(meshGeometryData: MeshGeometry) {
150
+ let result: {url: string; isDracoGeometry: boolean} | null = null;
151
+ // @ts-ignore
131
152
  const geometryDefinition = this.tileset.geometryDefinitions[meshGeometryData.definition];
132
153
  let geometryIndex = -1;
133
154
  // Try to find DRACO geometryDefinition of `useDracoGeometry` option is set
155
+ // @ts-expect-error this.options is not properly typed
134
156
  if (this.options.i3s && this.options.i3s.useDracoGeometry) {
135
157
  geometryIndex = geometryDefinition.geometryBuffers.findIndex(
136
158
  (buffer) => buffer.compressedAttributes && buffer.compressedAttributes.encoding === 'draco'
@@ -156,21 +178,21 @@ export default class I3SNodePagesTiles {
156
178
 
157
179
  /**
158
180
  * Forms 1.6 compatible LOD selection object from a nodepage's node data
159
- * @param {Object} node - a node from nodepage
160
- * @returns {Object[]} - Array of object of following properties:
161
- * {string} metricType - the label of the LOD metric
162
- * {number} maxError - the value of the metric
181
+ * @param node - a node from nodepage
182
+ * @returns- Array of LodSelection
163
183
  */
164
- private getLodSelection(node): object[] {
165
- const lodSelection: object[] = [];
184
+ private getLodSelection(node: NodeInPage): LodSelection[] {
185
+ const lodSelection: LodSelection[] = [];
166
186
  if (this.lodSelectionMetricType === 'maxScreenThresholdSQ') {
167
187
  lodSelection.push({
168
188
  metricType: 'maxScreenThreshold',
189
+ // @ts-ignore
169
190
  maxError: Math.sqrt(node.lodThreshold / (Math.PI * 0.25))
170
191
  });
171
192
  }
172
193
  lodSelection.push({
173
194
  metricType: this.lodSelectionMetricType,
195
+ // @ts-ignore
174
196
  maxError: node.lodThreshold
175
197
  });
176
198
  return lodSelection;
@@ -178,43 +200,47 @@ export default class I3SNodePagesTiles {
178
200
 
179
201
  /**
180
202
  * Returns information about texture and material from `materialDefinitions`
181
- * @param {Object} material - material data from nodepage
182
- * @returns {Object[]} - Couple [textureData, materialDefinition]
203
+ * @param material - material data from nodepage
204
+ * @returns - Couple {textureData, materialDefinition}
183
205
  * {string} textureData.name - path name of the texture
184
206
  * {string} textureData.format - format of the texture
185
207
  * materialDefinition - PBR-like material definition from `materialDefinitions`
186
208
  */
187
- private getInformationFromMaterial(material) {
188
- const textureDataDefault = {name: null, format: null};
209
+ private getInformationFromMaterial(material: MeshMaterial) {
210
+ const informationFromMaterial: {
211
+ textureData: {name: string | null; format?: I3STextureFormat};
212
+ materialDefinition?: I3SMaterialDefinition;
213
+ } = {textureData: {name: null}};
214
+
189
215
  if (material) {
190
- const materialDefinition = this.tileset.materialDefinitions[material.definition];
191
- const textureSetDefinitionIndex =
192
- materialDefinition &&
193
- materialDefinition.pbrMetallicRoughness &&
194
- materialDefinition.pbrMetallicRoughness.baseColorTexture &&
195
- materialDefinition.pbrMetallicRoughness.baseColorTexture.textureSetDefinitionId;
196
- if (textureSetDefinitionIndex || textureSetDefinitionIndex === 0) {
197
- const textureData =
198
- this.textureDefinitionsSelectedFormats[textureSetDefinitionIndex] || textureDataDefault;
199
- return [textureData, materialDefinition];
216
+ const materialDefinition = this.tileset.materialDefinitions?.[material.definition];
217
+ if (materialDefinition) {
218
+ informationFromMaterial.materialDefinition = materialDefinition;
219
+ const textureSetDefinitionIndex =
220
+ materialDefinition?.pbrMetallicRoughness?.baseColorTexture?.textureSetDefinitionId;
221
+
222
+ if (typeof textureSetDefinitionIndex === 'number') {
223
+ informationFromMaterial.textureData =
224
+ this.textureDefinitionsSelectedFormats[textureSetDefinitionIndex] ||
225
+ informationFromMaterial.textureData;
226
+ }
200
227
  }
201
- return [textureDataDefault, materialDefinition];
202
228
  }
203
- return [textureDataDefault, null];
229
+ return informationFromMaterial;
204
230
  }
205
231
 
206
232
  /**
207
233
  * Sets preferable and supported format for each textureDefinition of the tileset
208
- * @param {Object} tileset - I3S layer data
209
- * @returns {void}
234
+ * @param tileset - I3S layer data
235
+ * @returns
210
236
  */
211
- private initSelectedFormatsForTextureDefinitions(tileset) {
237
+ private initSelectedFormatsForTextureDefinitions(tileset: I3STilesetHeader): void {
212
238
  this.textureDefinitionsSelectedFormats = [];
213
239
  const possibleI3sFormats = this.getSupportedTextureFormats();
214
240
  const textureSetDefinitions = tileset.textureSetDefinitions || [];
215
241
  for (const textureSetDefinition of textureSetDefinitions) {
216
242
  const formats = (textureSetDefinition && textureSetDefinition.formats) || [];
217
- let selectedFormat: {format: string; name: string} | null = null;
243
+ let selectedFormat: {name: string; format: I3STextureFormat} | null = null;
218
244
  for (const i3sFormat of possibleI3sFormats) {
219
245
  const format = formats.find((value) => value.format === i3sFormat);
220
246
  if (format) {
@@ -239,8 +265,9 @@ export default class I3SNodePagesTiles {
239
265
  * Returns the array of supported texture format
240
266
  * @returns list of format strings
241
267
  */
242
- private getSupportedTextureFormats(): string[] {
243
- const formats: string[] = [];
268
+ private getSupportedTextureFormats(): I3STextureFormat[] {
269
+ const formats: I3STextureFormat[] = [];
270
+ // @ts-expect-error this.options is not properly typed
244
271
  if (!this.options.i3s || this.options.i3s.useCompressedTextures) {
245
272
  // I3S 1.7 selection
246
273
  const supportedCompressedFormats = getSupportedGPUTextureFormats();
@@ -1,50 +1,84 @@
1
1
  import GL from '@luma.gl/constants';
2
+ import {DATA_TYPE} from '../../types';
2
3
 
3
- export const TYPE_ARRAY_MAP = {
4
- UInt8: Uint8Array,
5
- UInt16: Uint16Array,
6
- UInt32: Uint32Array,
7
- Float32: Float32Array,
8
- UInt64: Float64Array
9
- };
4
+ export function getConstructorForDataFormat(dataType: string) {
5
+ switch (dataType) {
6
+ case DATA_TYPE.UInt8:
7
+ return Uint8Array;
8
+ case DATA_TYPE.UInt16:
9
+ return Uint16Array;
10
+ case DATA_TYPE.UInt32:
11
+ return Uint32Array;
12
+ case DATA_TYPE.Float32:
13
+ return Float32Array;
14
+ case DATA_TYPE.UInt64:
15
+ return Float64Array;
16
+ default:
17
+ throw new Error(`parse i3s tile content: unknown type of data: ${dataType}`);
18
+ }
19
+ }
10
20
 
11
- export const GL_TYPE_MAP = {
21
+ export const GL_TYPE_MAP: {[key: string]: number} = {
12
22
  UInt8: GL.UNSIGNED_BYTE,
13
- UInt16: GL.UNSIGNED_INT,
23
+ UInt16: GL.UNSIGNED_SHORT,
14
24
  Float32: GL.FLOAT,
15
25
  UInt32: GL.UNSIGNED_INT,
16
26
  UInt64: GL.DOUBLE
17
27
  };
18
-
19
- export const I3S_NAMED_VERTEX_ATTRIBUTES = {
20
- position: 'position',
21
- normal: 'normal',
22
- uv0: 'uv0',
23
- color: 'color',
24
- region: 'region'
25
- };
26
-
27
- export const I3S_NAMED_GEOMETRY_ATTRIBUTES = {
28
- vertexAttributes: 'vertexAttributes',
29
- featureAttributeOrder: 'featureAttributeOrder',
30
- featureAttributes: 'featureAttributes'
31
- };
32
-
33
- export const I3S_NAMED_HEADER_ATTRIBUTES = {
34
- header: 'header',
35
- vertexCount: 'vertexCount',
36
- featureCount: 'featureCount'
37
- };
38
-
39
- export const SIZEOF = {
40
- UInt8: 1,
41
- UInt16: 2,
42
- UInt32: 4,
43
- Float32: 4,
44
- UInt64: 8
45
- };
28
+ /**
29
+ * Returns how many bytes a type occupies
30
+ * @param dataType
31
+ * @returns
32
+ */
33
+ export function sizeOf(dataType: string): number {
34
+ switch (dataType) {
35
+ case DATA_TYPE.UInt8:
36
+ return 1;
37
+ case DATA_TYPE.UInt16:
38
+ case DATA_TYPE.Int16:
39
+ return 2;
40
+ case DATA_TYPE.UInt32:
41
+ case DATA_TYPE.Int32:
42
+ case DATA_TYPE.Float32:
43
+ return 4;
44
+ case DATA_TYPE.UInt64:
45
+ case DATA_TYPE.Int64:
46
+ case DATA_TYPE.Float64:
47
+ return 8;
48
+ default:
49
+ throw new Error(`parse i3s tile content: unknown size of data: ${dataType}`);
50
+ }
51
+ }
46
52
 
47
53
  export const STRING_ATTRIBUTE_TYPE = 'String';
48
54
  export const OBJECT_ID_ATTRIBUTE_TYPE = 'Oid32';
49
55
  export const FLOAT_64_TYPE = 'Float64';
50
56
  export const INT_16_ATTRIBUTE_TYPE = 'Int16';
57
+
58
+ // https://github.com/visgl/deck.gl/blob/9548f43cba2234a1f4877b6b17f6c88eb35b2e08/modules/core/src/lib/constants.js#L27
59
+ // Describes the format of positions
60
+ export enum COORDINATE_SYSTEM {
61
+ /**
62
+ * `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise
63
+ */
64
+ DEFAULT = -1,
65
+ /**
66
+ * Positions are interpreted as [lng, lat, elevation]
67
+ * lng lat are degrees, elevation is meters. distances as meters.
68
+ */
69
+ LNGLAT = 1,
70
+ /**
71
+ * Positions are interpreted as meter offsets, distances as meters
72
+ */
73
+ METER_OFFSETS = 2,
74
+ /**
75
+ * Positions are interpreted as lng lat offsets: [deltaLng, deltaLat, elevation]
76
+ * deltaLng, deltaLat are delta degrees, elevation is meters.
77
+ * distances as meters.
78
+ */
79
+ LNGLAT_OFFSETS = 3,
80
+ /**
81
+ * Non-geospatial
82
+ */
83
+ CARTESIAN = 0
84
+ }
@@ -0,0 +1,102 @@
1
+ import {JSONLoader, load} from '@loaders.gl/core';
2
+ import type {ArcGisWebSceneData, OperationalLayer} from '../../types';
3
+
4
+ /**
5
+ * WKID, or Well-Known ID, of the CRS. Specify either WKID or WKT of the CRS.
6
+ * Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/spatialReference.cmn.md
7
+ */
8
+ const SUPPORTED_WKID = 4326;
9
+
10
+ const ARCGIS_SCENE_SERVER_LAYER_TYPE = 'ArcGISSceneServiceLayer';
11
+ const BUILDING_SCENE_LAYER = 'BuildingSceneLayer';
12
+ const INTEGRATED_MESH_LAYER = 'IntegratedMeshLayer';
13
+ const GROUP_LAYER = 'GroupLayer';
14
+
15
+ /**
16
+ * Supported layers list
17
+ * Possible operational layers in WebScene: https://developers.arcgis.com/web-scene-specification/objects/operationalLayers/
18
+ */
19
+ const SUPPORTED_LAYERS_TYPES = [
20
+ ARCGIS_SCENE_SERVER_LAYER_TYPE,
21
+ INTEGRATED_MESH_LAYER,
22
+ BUILDING_SCENE_LAYER,
23
+ GROUP_LAYER
24
+ ];
25
+
26
+ const NO_AVAILABLE_SUPPORTED_LAYERS_ERROR = 'NO_AVAILABLE_SUPPORTED_LAYERS_ERROR';
27
+ const NOT_SUPPORTED_CRS_ERROR = 'NOT_SUPPORTED_CRS_ERROR';
28
+
29
+ /**
30
+ * Parses ArcGIS WebScene
31
+ * @param data
32
+ */
33
+ export async function parseWebscene(data: ArrayBuffer): Promise<ArcGisWebSceneData> {
34
+ const layer0 = JSON.parse(new TextDecoder().decode(data));
35
+ const {operationalLayers} = layer0;
36
+ const {layers, unsupportedLayers} = await parseOperationalLayers(operationalLayers, true);
37
+
38
+ if (!layers.length) {
39
+ throw new Error(NO_AVAILABLE_SUPPORTED_LAYERS_ERROR);
40
+ }
41
+
42
+ return {
43
+ header: layer0,
44
+ layers,
45
+ unsupportedLayers
46
+ };
47
+ }
48
+
49
+ /**
50
+ * Recursively parses WebScene operational layers.
51
+ * @param layersList
52
+ */
53
+ async function parseOperationalLayers(
54
+ layersList: OperationalLayer[],
55
+ needToCheckCRS: boolean
56
+ ): Promise<{layers: OperationalLayer[]; unsupportedLayers: OperationalLayer[]}> {
57
+ const layers: OperationalLayer[] = [];
58
+ let unsupportedLayers: OperationalLayer[] = [];
59
+
60
+ for (let index = 0; index < layersList.length; index++) {
61
+ const layer = layersList[index];
62
+ const isLayerSupported = SUPPORTED_LAYERS_TYPES.includes(layer.layerType);
63
+
64
+ if (isLayerSupported) {
65
+ if (needToCheckCRS && layer.layerType !== GROUP_LAYER) {
66
+ await checkSupportedIndexCRS(layer);
67
+ needToCheckCRS = false;
68
+ }
69
+
70
+ layers.push(layer);
71
+ } else {
72
+ unsupportedLayers.push(layer);
73
+ }
74
+
75
+ if (layer.layers?.length) {
76
+ const {layers: childLayers, unsupportedLayers: childUnsupportedLayers} =
77
+ await parseOperationalLayers(layer.layers, needToCheckCRS);
78
+ layer.layers = childLayers;
79
+ unsupportedLayers = [...unsupportedLayers, ...childUnsupportedLayers];
80
+ }
81
+ }
82
+
83
+ return {layers, unsupportedLayers};
84
+ }
85
+
86
+ /**
87
+ * Check if layer has supported CRS
88
+ * @param layer
89
+ */
90
+ async function checkSupportedIndexCRS(layer: OperationalLayer) {
91
+ try {
92
+ const layerJson = await load(layer.url, JSONLoader);
93
+ // @ts-expect-error
94
+ const wkid = layerJson?.spatialReference?.wkid;
95
+
96
+ if (wkid !== SUPPORTED_WKID) {
97
+ throw new Error(NOT_SUPPORTED_CRS_ERROR);
98
+ }
99
+ } catch (error) {
100
+ throw error;
101
+ }
102
+ }
@@ -1,3 +1,7 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {TypedArray} from '@loaders.gl/schema';
4
+
1
5
  import {
2
6
  STRING_ATTRIBUTE_TYPE,
3
7
  OBJECT_ID_ATTRIBUTE_TYPE,
@@ -5,13 +9,16 @@ import {
5
9
  INT_16_ATTRIBUTE_TYPE
6
10
  } from './constants';
7
11
 
12
+ type Attribute = string[] | TypedArray | null;
13
+ export type I3STileAttributes = Record<string, Attribute>;
14
+
8
15
  /**
9
16
  * Get particular tile and creates attribute object inside.
10
- * @param {ArrayBuffer} arrayBuffer
17
+ * @param arrayBuffer
11
18
  * @param {Object} options
12
19
  * @returns {Promise<object>}
13
20
  */
14
- export async function parseI3STileAttribute(arrayBuffer, options) {
21
+ export function parseI3STileAttribute(arrayBuffer: ArrayBuffer, options): I3STileAttributes {
15
22
  const {attributeName, attributeType} = options;
16
23
 
17
24
  if (!attributeName) {
@@ -25,10 +32,10 @@ export async function parseI3STileAttribute(arrayBuffer, options) {
25
32
  /**
26
33
  * Parse attributes based on attribute type.
27
34
  * @param {String} attributeType
28
- * @param {ArrayBuffer} arrayBuffer
29
- * @returns {any}
35
+ * @param arrayBuffer
36
+ * @returns
30
37
  */
31
- function parseAttribute(attributeType, arrayBuffer) {
38
+ function parseAttribute(attributeType, arrayBuffer: ArrayBuffer): Attribute {
32
39
  switch (attributeType) {
33
40
  case STRING_ATTRIBUTE_TYPE:
34
41
  return parseStringsAttribute(arrayBuffer);
@@ -46,10 +53,10 @@ function parseAttribute(attributeType, arrayBuffer) {
46
53
  /**
47
54
  * Parse short number attribute.
48
55
  * Short Integer spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md
49
- * @param {ArrayBuffer} arrayBuffer
50
- * @returns {Uint32Array}
56
+ * @param arrayBuffer
57
+ * @returns
51
58
  */
52
- function parseShortNumberAttribute(arrayBuffer) {
59
+ function parseShortNumberAttribute(arrayBuffer: ArrayBuffer): Uint32Array {
53
60
  const countOffset = 4;
54
61
  return new Uint32Array(arrayBuffer, countOffset);
55
62
  }
@@ -57,10 +64,10 @@ function parseShortNumberAttribute(arrayBuffer) {
57
64
  /**
58
65
  * Parse Int16 short number attribute.
59
66
  * Parsing of such data is not documented. Added to handle Building Scene Layer Tileset attributes data.
60
- * @param {ArrayBuffer} arrayBuffer
61
- * @returns {Int16Array}
67
+ * @param arrayBuffer
68
+ * @returns
62
69
  */
63
- function parseInt16ShortNumberAttribute(arrayBuffer) {
70
+ function parseInt16ShortNumberAttribute(arrayBuffer: ArrayBuffer): Int16Array {
64
71
  const countOffset = 4;
65
72
  return new Int16Array(arrayBuffer, countOffset);
66
73
  }
@@ -68,10 +75,10 @@ function parseInt16ShortNumberAttribute(arrayBuffer) {
68
75
  /**
69
76
  * Parse float attribute.
70
77
  * Double Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md
71
- * @param {ArrayBuffer} arrayBuffer
72
- * @returns {Float64Array}
78
+ * @param arrayBuffer
79
+ * @returns
73
80
  */
74
- function parseFloatAttribute(arrayBuffer) {
81
+ function parseFloatAttribute(arrayBuffer: ArrayBuffer): Float64Array {
75
82
  const countOffset = 8;
76
83
  return new Float64Array(arrayBuffer, countOffset);
77
84
  }
@@ -34,7 +34,7 @@ function parseSublayersTree(
34
34
 
35
35
  for (let index = 0; index < sublayers.length; index++) {
36
36
  const subLayer = sublayers[index];
37
- const {id, layerType, ...rest} = subLayer;
37
+ const {id, layerType, visibility = true, ...rest} = subLayer;
38
38
 
39
39
  // Add support only for 3DObject layer type for I3S purposes.
40
40
  if (layerType === OBJECT_3D_LAYER_TYPE) {
@@ -44,6 +44,7 @@ function parseSublayersTree(
44
44
  url: sublayerUrl,
45
45
  id,
46
46
  layerType,
47
+ visibility,
47
48
  ...rest
48
49
  });
49
50
  }