@loaders.gl/i3s 4.0.0-alpha.8 → 4.0.0-beta.1

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 (213) hide show
  1. package/dist/dist.min.js +4925 -445
  2. package/dist/es5/arcgis-webscene-loader.js +4 -4
  3. package/dist/es5/arcgis-webscene-loader.js.map +1 -1
  4. package/dist/es5/i3s-attribute-loader.js +1 -1
  5. package/dist/es5/i3s-attribute-loader.js.map +1 -1
  6. package/dist/es5/i3s-building-scene-layer-loader.js +1 -1
  7. package/dist/es5/i3s-building-scene-layer-loader.js.map +1 -1
  8. package/dist/es5/i3s-content-loader.js +1 -1
  9. package/dist/es5/i3s-content-loader.js.map +1 -1
  10. package/dist/es5/i3s-loader.js +6 -6
  11. package/dist/es5/i3s-loader.js.map +1 -1
  12. package/dist/es5/i3s-node-page-loader.js +14 -12
  13. package/dist/es5/i3s-node-page-loader.js.map +1 -1
  14. package/dist/es5/i3s-slpk-loader.js +30 -2
  15. package/dist/es5/i3s-slpk-loader.js.map +1 -1
  16. package/dist/es5/index.js +9 -2
  17. package/dist/es5/index.js.map +1 -1
  18. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +9 -5
  19. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  20. package/dist/es5/lib/parsers/constants.js +14 -15
  21. package/dist/es5/lib/parsers/constants.js.map +1 -1
  22. package/dist/es5/lib/parsers/parse-arcgis-webscene.js.map +1 -1
  23. package/dist/es5/lib/parsers/parse-i3s-tile-content.js +34 -31
  24. package/dist/es5/lib/parsers/parse-i3s-tile-content.js.map +1 -1
  25. package/dist/es5/lib/parsers/parse-i3s.js +31 -19
  26. package/dist/es5/lib/parsers/parse-i3s.js.map +1 -1
  27. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +42 -67
  28. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
  29. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +76 -51
  30. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
  31. package/dist/es5/lib/utils/customize-/321/201olors.js.map +1 -1
  32. package/dist/es5/lib/utils/url-utils.js +3 -3
  33. package/dist/es5/lib/utils/url-utils.js.map +1 -1
  34. package/dist/es5/types.js +1 -14
  35. package/dist/es5/types.js.map +1 -1
  36. package/dist/esm/arcgis-webscene-loader.js +2 -2
  37. package/dist/esm/arcgis-webscene-loader.js.map +1 -1
  38. package/dist/esm/i3s-attribute-loader.js +1 -1
  39. package/dist/esm/i3s-attribute-loader.js.map +1 -1
  40. package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
  41. package/dist/esm/i3s-building-scene-layer-loader.js.map +1 -1
  42. package/dist/esm/i3s-content-loader.js +1 -1
  43. package/dist/esm/i3s-content-loader.js.map +1 -1
  44. package/dist/esm/i3s-loader.js +3 -4
  45. package/dist/esm/i3s-loader.js.map +1 -1
  46. package/dist/esm/i3s-node-page-loader.js +7 -5
  47. package/dist/esm/i3s-node-page-loader.js.map +1 -1
  48. package/dist/esm/i3s-slpk-loader.js +8 -2
  49. package/dist/esm/i3s-slpk-loader.js.map +1 -1
  50. package/dist/esm/index.js +2 -1
  51. package/dist/esm/index.js.map +1 -1
  52. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +9 -5
  53. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  54. package/dist/esm/lib/parsers/constants.js +14 -15
  55. package/dist/esm/lib/parsers/constants.js.map +1 -1
  56. package/dist/esm/lib/parsers/parse-arcgis-webscene.js.map +1 -1
  57. package/dist/esm/lib/parsers/parse-i3s-tile-content.js +5 -2
  58. package/dist/esm/lib/parsers/parse-i3s-tile-content.js.map +1 -1
  59. package/dist/esm/lib/parsers/parse-i3s.js +23 -12
  60. package/dist/esm/lib/parsers/parse-i3s.js.map +1 -1
  61. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +19 -33
  62. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
  63. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +23 -32
  64. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
  65. package/dist/esm/lib/utils/customize-/321/201olors.js.map +1 -1
  66. package/dist/esm/lib/utils/url-utils.js +2 -3
  67. package/dist/esm/lib/utils/url-utils.js.map +1 -1
  68. package/dist/esm/types.js +0 -12
  69. package/dist/esm/types.js.map +1 -1
  70. package/dist/i3s-content-worker-node.js +47 -47
  71. package/dist/i3s-content-worker-node.js.map +3 -3
  72. package/dist/i3s-content-worker.js +191 -126
  73. package/dist/src/arcgis-webscene-loader.d.ts +9 -0
  74. package/dist/src/arcgis-webscene-loader.d.ts.map +1 -0
  75. package/dist/src/bundle.d.ts.map +1 -0
  76. package/dist/{i3s-attribute-loader.d.ts → src/i3s-attribute-loader.d.ts} +3 -2
  77. package/dist/src/i3s-attribute-loader.d.ts.map +1 -0
  78. package/dist/src/i3s-building-scene-layer-loader.d.ts +8 -0
  79. package/dist/src/i3s-building-scene-layer-loader.d.ts.map +1 -0
  80. package/dist/src/i3s-content-loader.d.ts +8 -0
  81. package/dist/src/i3s-content-loader.d.ts.map +1 -0
  82. package/dist/src/i3s-loader.d.ts +11 -0
  83. package/dist/src/i3s-loader.d.ts.map +1 -0
  84. package/dist/src/i3s-node-page-loader.d.ts +8 -0
  85. package/dist/src/i3s-node-page-loader.d.ts.map +1 -0
  86. package/dist/src/i3s-slpk-loader.d.ts +15 -0
  87. package/dist/src/i3s-slpk-loader.d.ts.map +1 -0
  88. package/dist/src/index.d.ts +12 -0
  89. package/dist/src/index.d.ts.map +1 -0
  90. package/dist/{lib → src/lib}/helpers/i3s-nodepages-tiles.d.ts +5 -3
  91. package/dist/src/lib/helpers/i3s-nodepages-tiles.d.ts.map +1 -0
  92. package/dist/src/lib/parsers/constants.d.ts.map +1 -0
  93. package/dist/src/lib/parsers/parse-arcgis-webscene.d.ts +7 -0
  94. package/dist/src/lib/parsers/parse-arcgis-webscene.d.ts.map +1 -0
  95. package/dist/src/lib/parsers/parse-i3s-attribute.d.ts.map +1 -0
  96. package/dist/src/lib/parsers/parse-i3s-building-scene-layer.d.ts.map +1 -0
  97. package/dist/{lib → src/lib}/parsers/parse-i3s-tile-content.d.ts +1 -1
  98. package/dist/src/lib/parsers/parse-i3s-tile-content.d.ts.map +1 -0
  99. package/dist/{lib → src/lib}/parsers/parse-i3s.d.ts +2 -2
  100. package/dist/src/lib/parsers/parse-i3s.d.ts.map +1 -0
  101. package/dist/src/lib/parsers/parse-slpk/parse-slpk.d.ts +10 -0
  102. package/dist/src/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -0
  103. package/dist/{lib → src/lib}/parsers/parse-slpk/slpk-archieve.d.ts +6 -12
  104. package/dist/src/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -0
  105. package/dist/src/lib/utils/convert-i3s-obb-to-mbs.d.ts.map +1 -0
  106. package/dist/src/lib/utils/customize-/321/201olors.d.ts.map +1 -0
  107. package/dist/{lib → src/lib}/utils/url-utils.d.ts +5 -4
  108. package/dist/src/lib/utils/url-utils.d.ts.map +1 -0
  109. package/dist/{types.d.ts → src/types.d.ts} +138 -74
  110. package/dist/src/types.d.ts.map +1 -0
  111. package/dist/src/workers/i3s-content-worker-node.d.ts.map +1 -0
  112. package/dist/src/workers/i3s-content-worker.d.ts.map +1 -0
  113. package/dist/tsconfig.tsbuildinfo +1 -0
  114. package/package.json +10 -10
  115. package/src/arcgis-webscene-loader.ts +12 -6
  116. package/src/i3s-attribute-loader.ts +2 -1
  117. package/src/i3s-building-scene-layer-loader.ts +6 -1
  118. package/src/i3s-content-loader.ts +3 -2
  119. package/src/i3s-loader.ts +6 -8
  120. package/src/i3s-node-page-loader.ts +9 -6
  121. package/src/i3s-slpk-loader.ts +21 -3
  122. package/src/index.ts +6 -2
  123. package/src/lib/helpers/i3s-nodepages-tiles.ts +16 -9
  124. package/src/lib/parsers/constants.ts +14 -15
  125. package/src/lib/parsers/parse-arcgis-webscene.ts +2 -2
  126. package/src/lib/parsers/parse-i3s-tile-content.ts +7 -9
  127. package/src/lib/parsers/parse-i3s.ts +30 -18
  128. package/src/lib/parsers/parse-slpk/parse-slpk.ts +43 -55
  129. package/src/lib/parsers/parse-slpk/slpk-archieve.ts +30 -62
  130. package/src/lib/utils/customize-/321/201olors.ts +2 -2
  131. package/src/lib/utils/url-utils.ts +6 -5
  132. package/src/types.ts +143 -91
  133. package/dist/arcgis-webscene-loader.d.ts +0 -7
  134. package/dist/arcgis-webscene-loader.d.ts.map +0 -1
  135. package/dist/arcgis-webscene-loader.js +0 -28
  136. package/dist/bundle.d.ts.map +0 -1
  137. package/dist/bundle.js +0 -5
  138. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +0 -44
  139. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +0 -1
  140. package/dist/es5/lib/parsers/parse-zip/local-file-header.js +0 -26
  141. package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +0 -1
  142. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +0 -37
  143. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +0 -1
  144. package/dist/esm/lib/parsers/parse-zip/local-file-header.js +0 -19
  145. package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +0 -1
  146. package/dist/i3s-attribute-loader.d.ts.map +0 -1
  147. package/dist/i3s-attribute-loader.js +0 -175
  148. package/dist/i3s-building-scene-layer-loader.d.ts +0 -6
  149. package/dist/i3s-building-scene-layer-loader.d.ts.map +0 -1
  150. package/dist/i3s-building-scene-layer-loader.js +0 -26
  151. package/dist/i3s-content-loader.d.ts +0 -6
  152. package/dist/i3s-content-loader.d.ts.map +0 -1
  153. package/dist/i3s-content-loader.js +0 -32
  154. package/dist/i3s-loader.d.ts +0 -11
  155. package/dist/i3s-loader.d.ts.map +0 -1
  156. package/dist/i3s-loader.js +0 -102
  157. package/dist/i3s-node-page-loader.d.ts +0 -7
  158. package/dist/i3s-node-page-loader.d.ts.map +0 -1
  159. package/dist/i3s-node-page-loader.js +0 -22
  160. package/dist/i3s-slpk-loader.d.ts +0 -13
  161. package/dist/i3s-slpk-loader.d.ts.map +0 -1
  162. package/dist/i3s-slpk-loader.js +0 -20
  163. package/dist/index.d.ts +0 -10
  164. package/dist/index.d.ts.map +0 -1
  165. package/dist/index.js +0 -21
  166. package/dist/lib/helpers/i3s-nodepages-tiles.d.ts.map +0 -1
  167. package/dist/lib/helpers/i3s-nodepages-tiles.js +0 -242
  168. package/dist/lib/parsers/constants.d.ts.map +0 -1
  169. package/dist/lib/parsers/constants.js +0 -89
  170. package/dist/lib/parsers/parse-arcgis-webscene.d.ts +0 -7
  171. package/dist/lib/parsers/parse-arcgis-webscene.d.ts.map +0 -1
  172. package/dist/lib/parsers/parse-arcgis-webscene.js +0 -88
  173. package/dist/lib/parsers/parse-i3s-attribute.d.ts.map +0 -1
  174. package/dist/lib/parsers/parse-i3s-attribute.js +0 -99
  175. package/dist/lib/parsers/parse-i3s-building-scene-layer.d.ts.map +0 -1
  176. package/dist/lib/parsers/parse-i3s-building-scene-layer.js +0 -46
  177. package/dist/lib/parsers/parse-i3s-tile-content.d.ts.map +0 -1
  178. package/dist/lib/parsers/parse-i3s-tile-content.js +0 -499
  179. package/dist/lib/parsers/parse-i3s.d.ts.map +0 -1
  180. package/dist/lib/parsers/parse-i3s.js +0 -95
  181. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +0 -4
  182. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +0 -1
  183. package/dist/lib/parsers/parse-slpk/parse-slpk.js +0 -50
  184. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +0 -1
  185. package/dist/lib/parsers/parse-slpk/slpk-archieve.js +0 -142
  186. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +0 -38
  187. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +0 -1
  188. package/dist/lib/parsers/parse-zip/cd-file-header.js +0 -48
  189. package/dist/lib/parsers/parse-zip/local-file-header.d.ts +0 -30
  190. package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +0 -1
  191. package/dist/lib/parsers/parse-zip/local-file-header.js +0 -28
  192. package/dist/lib/utils/convert-i3s-obb-to-mbs.d.ts.map +0 -1
  193. package/dist/lib/utils/convert-i3s-obb-to-mbs.js +0 -20
  194. package/dist/lib/utils/customize-/321/201olors.d.ts.map +0 -1
  195. package/dist/lib/utils/customize-/321/201olors.js +0 -104
  196. package/dist/lib/utils/url-utils.d.ts.map +0 -1
  197. package/dist/lib/utils/url-utils.js +0 -44
  198. package/dist/types.d.ts.map +0 -1
  199. package/dist/types.js +0 -20
  200. package/dist/workers/i3s-content-worker-node.d.ts.map +0 -1
  201. package/dist/workers/i3s-content-worker-node.js +0 -7
  202. package/dist/workers/i3s-content-worker.d.ts.map +0 -1
  203. package/dist/workers/i3s-content-worker.js +0 -5
  204. package/src/lib/parsers/parse-zip/cd-file-header.ts +0 -93
  205. package/src/lib/parsers/parse-zip/local-file-header.ts +0 -56
  206. /package/dist/{bundle.d.ts → src/bundle.d.ts} +0 -0
  207. /package/dist/{lib → src/lib}/parsers/constants.d.ts +0 -0
  208. /package/dist/{lib → src/lib}/parsers/parse-i3s-attribute.d.ts +0 -0
  209. /package/dist/{lib → src/lib}/parsers/parse-i3s-building-scene-layer.d.ts +0 -0
  210. /package/dist/{lib → src/lib}/utils/convert-i3s-obb-to-mbs.d.ts +0 -0
  211. /package/dist/{lib → src/lib}/utils/customize-/321/201olors.d.ts" +0 -0
  212. /package/dist/{workers → src/workers}/i3s-content-worker-node.d.ts +0 -0
  213. /package/dist/{workers → src/workers}/i3s-content-worker.d.ts +0 -0
@@ -1,17 +1,16 @@
1
1
  import GL from '@luma.gl/constants';
2
- import {DATA_TYPE} from '../../types';
3
2
 
4
3
  export function getConstructorForDataFormat(dataType: string) {
5
4
  switch (dataType) {
6
- case DATA_TYPE.UInt8:
5
+ case 'UInt8':
7
6
  return Uint8Array;
8
- case DATA_TYPE.UInt16:
7
+ case 'UInt16':
9
8
  return Uint16Array;
10
- case DATA_TYPE.UInt32:
9
+ case 'UInt32':
11
10
  return Uint32Array;
12
- case DATA_TYPE.Float32:
11
+ case 'Float32':
13
12
  return Float32Array;
14
- case DATA_TYPE.UInt64:
13
+ case 'UInt64':
15
14
  return Float64Array;
16
15
  default:
17
16
  throw new Error(`parse i3s tile content: unknown type of data: ${dataType}`);
@@ -32,18 +31,18 @@ export const GL_TYPE_MAP: {[key: string]: number} = {
32
31
  */
33
32
  export function sizeOf(dataType: string): number {
34
33
  switch (dataType) {
35
- case DATA_TYPE.UInt8:
34
+ case 'UInt8':
36
35
  return 1;
37
- case DATA_TYPE.UInt16:
38
- case DATA_TYPE.Int16:
36
+ case 'UInt16':
37
+ case 'Int16':
39
38
  return 2;
40
- case DATA_TYPE.UInt32:
41
- case DATA_TYPE.Int32:
42
- case DATA_TYPE.Float32:
39
+ case 'UInt32':
40
+ case 'Int32':
41
+ case 'Float32':
43
42
  return 4;
44
- case DATA_TYPE.UInt64:
45
- case DATA_TYPE.Int64:
46
- case DATA_TYPE.Float64:
43
+ case 'UInt64':
44
+ case 'Int64':
45
+ case 'Float64':
47
46
  return 8;
48
47
  default:
49
48
  throw new Error(`parse i3s tile content: unknown size of data: ${dataType}`);
@@ -1,5 +1,5 @@
1
1
  import {JSONLoader, load} from '@loaders.gl/core';
2
- import type {ArcGisWebSceneData, OperationalLayer} from '../../types';
2
+ import type {ArcGISWebSceneData, OperationalLayer} from '../../types';
3
3
 
4
4
  /**
5
5
  * WKID, or Well-Known ID, of the CRS. Specify either WKID or WKT of the CRS.
@@ -30,7 +30,7 @@ const NOT_SUPPORTED_CRS_ERROR = 'NOT_SUPPORTED_CRS_ERROR';
30
30
  * Parses ArcGIS WebScene
31
31
  * @param data
32
32
  */
33
- export async function parseWebscene(data: ArrayBuffer): Promise<ArcGisWebSceneData> {
33
+ export async function parseWebscene(data: ArrayBuffer): Promise<ArcGISWebSceneData> {
34
34
  const layer0 = JSON.parse(new TextDecoder().decode(data));
35
35
  const {operationalLayers} = layer0;
36
36
  const {layers, unsupportedLayers} = await parseOperationalLayers(operationalLayers, true);
@@ -2,7 +2,7 @@ import type {TypedArray} from '@loaders.gl/schema';
2
2
  import {load, parse} from '@loaders.gl/core';
3
3
  import {Vector3, Matrix4} from '@math.gl/core';
4
4
  import {Ellipsoid} from '@math.gl/geospatial';
5
- import type {LoaderOptions, LoaderContext} from '@loaders.gl/loader-utils';
5
+ import {LoaderOptions, LoaderContext, parseFromContext} from '@loaders.gl/loader-utils';
6
6
  import {ImageLoader} from '@loaders.gl/images';
7
7
  import {DracoLoader, DracoMesh} from '@loaders.gl/draco';
8
8
  import {BasisLoader, CompressedTextureLoader} from '@loaders.gl/textures';
@@ -70,33 +70,31 @@ export async function parseI3STileContent(
70
70
 
71
71
  // @ts-expect-error options is not properly typed
72
72
  if (options?.i3s.decodeTextures) {
73
+ // TODO - replace with switch
73
74
  if (loader === ImageLoader) {
74
75
  const options = {...tileOptions.textureLoaderOptions, image: {type: 'data'}};
75
76
  try {
76
- // @ts-ignore context must be defined
77
77
  // Image constructor is not supported in worker thread.
78
78
  // Do parsing image data on the main thread by using context to avoid worker issues.
79
- content.texture = await context.parse(arrayBuffer, options);
79
+ const texture = await parseFromContext(arrayBuffer, [], options, context!);
80
+ // @ts-expect-error
81
+ content.texture = texture;
80
82
  } catch (e) {
81
83
  // context object is different between worker and node.js conversion script.
82
84
  // To prevent error we parse data in ordinary way if it is not parsed by using context.
83
- // @ts-expect-error
84
- content.texture = await parse(arrayBuffer, loader, options);
85
+ const texture = await parse(arrayBuffer, loader, options, context);
86
+ content.texture = texture;
85
87
  }
86
88
  } else if (loader === CompressedTextureLoader || loader === BasisLoader) {
87
89
  let texture = await load(arrayBuffer, loader, tileOptions.textureLoaderOptions);
88
90
  if (loader === BasisLoader) {
89
- // @ts-expect-error
90
91
  texture = texture[0];
91
92
  }
92
93
  content.texture = {
93
94
  compressed: true,
94
95
  mipmaps: false,
95
- // @ts-expect-error
96
96
  width: texture[0].width,
97
- // @ts-expect-error
98
97
  height: texture[0].height,
99
- // @ts-expect-error
100
98
  data: texture
101
99
  };
102
100
  }
@@ -9,9 +9,12 @@ import {
9
9
  I3STileHeader,
10
10
  Mbs,
11
11
  I3SMinimalNodeData,
12
- Node3DIndexDocument
12
+ Node3DIndexDocument,
13
+ SceneLayer3D,
14
+ I3SParseOptions
13
15
  } from '../../types';
14
16
  import type {LoaderOptions, LoaderContext} from '@loaders.gl/loader-utils';
17
+ import { I3SLoader } from '../../i3s-loader';
15
18
 
16
19
  export function normalizeTileData(tile : Node3DIndexDocument, context: LoaderContext): I3STileHeader {
17
20
  const url: string = context.url || '';
@@ -30,11 +33,15 @@ export function normalizeTileData(tile : Node3DIndexDocument, context: LoaderCon
30
33
  attributeUrls = generateTileAttributeUrls(url, tile);
31
34
  }
32
35
 
36
+ const children = tile.children || [];
37
+
33
38
  return normalizeTileNonUrlData({
34
39
  ...tile,
40
+ children,
35
41
  url,
36
42
  contentUrl,
37
43
  textureUrl,
44
+ textureFormat: 'jpg', // `jpg` format will cause `ImageLoader` usage that will be able to handle `png` as well
38
45
  attributeUrls,
39
46
  isDracoGeometry: false
40
47
  });
@@ -67,27 +74,27 @@ export function normalizeTileNonUrlData(tile : I3SMinimalNodeData): I3STileHeade
67
74
 
68
75
  const lodMetricType = tile.lodSelection?.[0].metricType;
69
76
  const lodMetricValue = tile.lodSelection?.[0].maxError;
70
- const transformMatrix = tile.transform;
71
77
  const type = TILE_TYPE.MESH;
72
78
  /**
73
79
  * I3S specification supports only REPLACE
74
80
  */
75
81
  const refine = TILE_REFINEMENT.REPLACE;
76
82
 
77
- return {...tile, mbs, boundingVolume, lodMetricType, lodMetricValue, transformMatrix, type, refine};
83
+ return {...tile, mbs, boundingVolume, lodMetricType, lodMetricValue, type, refine};
78
84
  }
79
85
 
80
- export async function normalizeTilesetData(tileset : I3STilesetHeader, options : LoaderOptions, context: LoaderContext) {
81
- tileset.url = context.url;
82
-
86
+ export async function normalizeTilesetData(tileset : SceneLayer3D, options : LoaderOptions, context: LoaderContext): Promise<I3STileHeader | I3STilesetHeader> {
87
+ const url = context.url;
88
+ let nodePagesTile: I3SNodePagesTiles | undefined;
89
+ let root: I3STileHeader | I3STilesetHeader;
83
90
  if (tileset.nodePages) {
84
- tileset.nodePagesTile = new I3SNodePagesTiles(tileset, options);
85
- tileset.root = tileset.nodePagesTile.formTileFromNodePages(0);
91
+ nodePagesTile = new I3SNodePagesTiles(tileset, url, options);
92
+ root = await nodePagesTile.formTileFromNodePages(0);
86
93
  } else {
87
- // @ts-expect-error options is not properly typed
88
- const rootNodeUrl = getUrlWithToken(`${tileset.url}/nodes/root`, options.i3s?.token);
94
+ const parseOptions = options.i3s as I3SParseOptions;
95
+ const rootNodeUrl = getUrlWithToken(`${url}/nodes/root`, parseOptions.token);
89
96
  // eslint-disable-next-line no-use-before-define
90
- tileset.root = await load(rootNodeUrl, tileset.loader, {
97
+ root = await load(rootNodeUrl, I3SLoader, {
91
98
  ...options,
92
99
  i3s: {
93
100
  // @ts-expect-error options is not properly typed
@@ -96,11 +103,16 @@ export async function normalizeTilesetData(tileset : I3STilesetHeader, options :
96
103
  });
97
104
  }
98
105
 
99
- // base path that non-absolute paths in tileset are relative to.
100
- tileset.basePath = tileset.url;
101
- tileset.type = TILESET_TYPE.I3S;
102
-
103
- // populate from root node
104
- tileset.lodMetricType = tileset.root.lodMetricType;
105
- tileset.lodMetricValue = tileset.root.lodMetricValue;
106
+ return {
107
+ ...tileset,
108
+ loader: I3SLoader,
109
+ url,
110
+ basePath: url,
111
+ type: TILESET_TYPE.I3S,
112
+ nodePagesTile,
113
+ // @ts-expect-error
114
+ root,
115
+ lodMetricType: root.lodMetricType,
116
+ lodMetricValue: root.lodMetricValue
117
+ }
106
118
  }
@@ -1,64 +1,52 @@
1
- import type {SLPKLoaderOptions} from '../../../i3s-slpk-loader';
2
- import {parseZipCDFileHeader} from '../parse-zip/cd-file-header';
3
- import {parseZipLocalFileHeader} from '../parse-zip/local-file-header';
1
+ import {FileProvider} from '@loaders.gl/loader-utils';
2
+ import {
3
+ parseZipCDFileHeader,
4
+ cdSignature as cdHeaderSignature,
5
+ parseZipLocalFileHeader,
6
+ searchFromTheEnd,
7
+ HashElement,
8
+ parseHashFile,
9
+ generateHashInfo
10
+ } from '@loaders.gl/zip';
4
11
  import {SLPKArchive} from './slpk-archieve';
5
12
 
6
13
  /**
7
- * Returns one byte from the provided buffer at the provided position
8
- * @param offset - position where to read
9
- * @param buffer - buffer to read
10
- * @returns one byte from the provided buffer at the provided position
14
+ * Creates slpk file handler from raw file
15
+ * @param fileProvider raw file data
16
+ * @param cb is called with information message during parsing
17
+ * @returns slpk file handler
11
18
  */
12
- const getByteAt = (offset: number, buffer: DataView): number => {
13
- return buffer.getUint8(buffer.byteOffset + offset);
14
- };
15
-
16
- export async function parseSLPK(data: ArrayBuffer, options: SLPKLoaderOptions = {}) {
17
- const archive = new DataView(data);
18
- const cdFileHeaderSignature = [80, 75, 1, 2];
19
-
20
- const searchWindow = [
21
- getByteAt(archive.byteLength - 1, archive),
22
- getByteAt(archive.byteLength - 2, archive),
23
- getByteAt(archive.byteLength - 3, archive),
24
- undefined
25
- ];
26
-
27
- let hashCDOffset = 0;
28
-
29
- // looking for the last record in the central directory
30
- for (let i = archive.byteLength - 4; i > -1; i--) {
31
- searchWindow[3] = searchWindow[2];
32
- searchWindow[2] = searchWindow[1];
33
- searchWindow[1] = searchWindow[0];
34
- searchWindow[0] = getByteAt(i, archive);
35
- if (searchWindow.every((val, index) => val === cdFileHeaderSignature[index])) {
36
- hashCDOffset = i;
37
- break;
19
+ export const parseSLPK = async (
20
+ fileProvider: FileProvider,
21
+ cb?: (msg: string) => void
22
+ ): Promise<SLPKArchive> => {
23
+ const hashCDOffset = await searchFromTheEnd(fileProvider, cdHeaderSignature);
24
+
25
+ const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider);
26
+
27
+ let hashData: HashElement[];
28
+ if (cdFileHeader?.fileName !== '@specialIndexFileHASH128@') {
29
+ cb?.('SLPK doesnt contain hash file');
30
+ hashData = await generateHashInfo(fileProvider);
31
+ cb?.('hash info has been composed according to central directory records');
32
+ } else {
33
+ cb?.('SLPK contains hash file');
34
+ const localFileHeader = await parseZipLocalFileHeader(
35
+ cdFileHeader.localHeaderOffset,
36
+ fileProvider
37
+ );
38
+ if (!localFileHeader) {
39
+ throw new Error('corrupted SLPK');
38
40
  }
39
- }
40
41
 
41
- const cdFileHeader = parseZipCDFileHeader(hashCDOffset, archive);
42
+ const fileDataOffset = localFileHeader.fileDataOffset;
43
+ const hashFile = await fileProvider.slice(
44
+ fileDataOffset,
45
+ fileDataOffset + localFileHeader.compressedSize
46
+ );
42
47
 
43
- const textDecoder = new TextDecoder();
44
- if (textDecoder.decode(cdFileHeader.fileName) !== '@specialIndexFileHASH128@') {
45
- throw new Error('No hash file in slpk');
48
+ hashData = parseHashFile(hashFile);
46
49
  }
47
50
 
48
- const localFileHeader = parseZipLocalFileHeader(cdFileHeader.localHeaderOffset, archive);
49
-
50
- const fileDataOffset = localFileHeader.fileDataOffset;
51
- const hashFile = archive.buffer.slice(
52
- fileDataOffset,
53
- fileDataOffset + localFileHeader.compressedSize
54
- );
55
-
56
- if (!hashFile) {
57
- throw new Error('No hash file in slpk');
58
- }
59
-
60
- return await new SLPKArchive(data, hashFile).getFile(
61
- options.slpk?.path ?? '',
62
- options.slpk?.pathMode
63
- );
64
- }
51
+ return new SLPKArchive(fileProvider, hashData);
52
+ };
@@ -1,20 +1,9 @@
1
- import {processOnWorker} from '@loaders.gl/worker-utils';
2
1
  import md5 from 'md5';
3
- import {CompressionWorker} from '@loaders.gl/compression';
4
- import {parseZipLocalFileHeader} from '../parse-zip/local-file-header';
5
-
6
- /** Element of hash array */
7
- type HashElement = {
8
- /**
9
- * File name hash
10
- */
11
- hash: Buffer;
12
- /**
13
- * File offset in the archive
14
- */
15
- offset: number;
16
- };
2
+ import {FileProvider} from '@loaders.gl/loader-utils';
3
+ import {parseZipLocalFileHeader, HashElement, findBin} from '@loaders.gl/zip';
4
+ import {GZipCompression} from '@loaders.gl/compression';
17
5
 
6
+ /** Description of real paths for different file types */
18
7
  const PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [
19
8
  {
20
9
  test: /^$/,
@@ -25,7 +14,7 @@ const PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [
25
14
  extensions: ['.json.gz']
26
15
  },
27
16
  {
28
- test: /^nodes\/\d+$/,
17
+ test: /^nodes\/(\d+|root)$/,
29
18
  extensions: ['/3dNodeIndexDocument.json.gz']
30
19
  },
31
20
  {
@@ -54,37 +43,11 @@ const PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [
54
43
  * Class for handling information about slpk file
55
44
  */
56
45
  export class SLPKArchive {
57
- slpkArchive: DataView;
58
- hashArray: {hash: Buffer; offset: number}[];
59
- constructor(slpkArchiveBuffer: ArrayBuffer, hashFile: ArrayBuffer) {
60
- this.slpkArchive = new DataView(slpkArchiveBuffer);
61
- this.hashArray = this.parseHashFile(hashFile);
62
- }
63
-
64
- /**
65
- * Reads hash file from buffer and returns it in ready-to-use form
66
- * @param hashFile - bufer containing hash file
67
- * @returns Array containing file info
68
- */
69
- private parseHashFile(hashFile: ArrayBuffer): HashElement[] {
70
- const hashFileBuffer = Buffer.from(hashFile);
71
- const hashArray: HashElement[] = [];
72
- for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
73
- const offsetBuffer = new DataView(
74
- hashFileBuffer.buffer.slice(
75
- hashFileBuffer.byteOffset + i + 16,
76
- hashFileBuffer.byteOffset + i + 24
77
- )
78
- );
79
- const offset = offsetBuffer.getUint32(offsetBuffer.byteOffset, true);
80
- hashArray.push({
81
- hash: Buffer.from(
82
- hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)
83
- ),
84
- offset
85
- });
86
- }
87
- return hashArray;
46
+ private slpkArchive: FileProvider;
47
+ private hashArray: HashElement[];
48
+ constructor(slpkArchive: FileProvider, hashFile: HashElement[]) {
49
+ this.slpkArchive = slpkArchive;
50
+ this.hashArray = hashFile;
88
51
  }
89
52
 
90
53
  /**
@@ -114,7 +77,7 @@ export class SLPKArchive {
114
77
  if (decompressedFile) {
115
78
  return Buffer.from(decompressedFile);
116
79
  }
117
- const fileWithoutCompression = this.getFileBytes(path);
80
+ const fileWithoutCompression = await this.getFileBytes(path);
118
81
  if (fileWithoutCompression) {
119
82
  return Buffer.from(fileWithoutCompression);
120
83
  }
@@ -129,17 +92,19 @@ export class SLPKArchive {
129
92
  * @returns buffer with the file data
130
93
  */
131
94
  private async getDataByPath(path: string): Promise<ArrayBuffer | undefined> {
132
- const data = this.getFileBytes(path);
95
+ // sometimes paths are not in lower case when hash file is created,
96
+ // so first we're looking for lower case file name and then for original one
97
+ let data = await this.getFileBytes(path.toLocaleLowerCase());
98
+ if (!data) {
99
+ data = await this.getFileBytes(path);
100
+ }
133
101
  if (!data) {
134
102
  return undefined;
135
103
  }
136
104
  if (/\.gz$/.test(path)) {
137
- const decompressedData = await processOnWorker(CompressionWorker, data, {
138
- compression: 'gzip',
139
- operation: 'decompress',
140
- _workerType: 'test',
141
- gzip: {}
142
- });
105
+ const compression = new GZipCompression();
106
+
107
+ const decompressedData = await compression.decompress(data);
143
108
  return decompressedData;
144
109
  }
145
110
  return Buffer.from(data);
@@ -150,23 +115,26 @@ export class SLPKArchive {
150
115
  * @param path - path inside the archive
151
116
  * @returns buffer with the raw file data
152
117
  */
153
- private getFileBytes(path: string): ArrayBuffer | undefined {
118
+ private async getFileBytes(path: string): Promise<ArrayBuffer | undefined> {
154
119
  const nameHash = Buffer.from(md5(path), 'hex');
155
- const fileInfo = this.hashArray.find((val) => Buffer.compare(val.hash, nameHash) === 0);
120
+ const fileInfo = findBin(nameHash, this.hashArray); // implement binary search
156
121
  if (!fileInfo) {
157
122
  return undefined;
158
123
  }
159
124
 
160
- const localFileHeader = parseZipLocalFileHeader(
161
- this.slpkArchive.byteOffset + fileInfo?.offset,
162
- this.slpkArchive
163
- );
125
+ const localFileHeader = await parseZipLocalFileHeader(fileInfo.offset, this.slpkArchive);
126
+ if (!localFileHeader) {
127
+ return undefined;
128
+ }
164
129
 
165
- const compressedFile = this.slpkArchive.buffer.slice(
130
+ const compressedFile = this.slpkArchive.slice(
166
131
  localFileHeader.fileDataOffset,
167
132
  localFileHeader.fileDataOffset + localFileHeader.compressedSize
168
133
  );
169
134
 
170
135
  return compressedFile;
171
136
  }
137
+ findBin(nameHash: Buffer) {
138
+ throw new Error('Method not implemented.');
139
+ }
172
140
  }
@@ -5,6 +5,7 @@ import {load} from '@loaders.gl/core';
5
5
  import {getAttributeValueType, I3SAttributeLoader} from '../../i3s-attribute-loader';
6
6
  import {I3SLoaderOptions} from '../../i3s-loader';
7
7
  import {getUrlWithToken} from './url-utils';
8
+ import {I3STileAttributes} from '../parsers/parse-i3s-attribute';
8
9
 
9
10
  /**
10
11
  * Modify vertex colors array to visualize 3D objects in a attribute driven way
@@ -127,7 +128,7 @@ async function loadFeatureAttributeData(
127
128
  {attributeUrls}: I3STileOptions,
128
129
  {attributeStorageInfo}: I3STilesetOptions,
129
130
  options?: I3SLoaderOptions
130
- ): Promise<{[key: string]: string[] | Uint32Array | Uint16Array | Float64Array | null} | null> {
131
+ ): Promise<I3STileAttributes | null> {
131
132
  const attributeIndex = attributeStorageInfo.findIndex(({name}) => attributeName === name);
132
133
  if (attributeIndex === -1) {
133
134
  return null;
@@ -139,6 +140,5 @@ async function loadFeatureAttributeData(
139
140
  attributeType
140
141
  });
141
142
 
142
- // @ts-expect-error TODO action engine
143
143
  return objectIdAttributeData;
144
144
  }
@@ -1,4 +1,4 @@
1
- import {Node3DIndexDocument} from '../../types';
1
+ import {Node3DIndexDocument, SceneLayer3D} from '../../types';
2
2
 
3
3
  /**
4
4
  * Generates url with token if it is exists.
@@ -29,13 +29,14 @@ export function generateTileAttributeUrls(url: string, tile: Node3DIndexDocument
29
29
 
30
30
  /**
31
31
  * Generates attribute urls for tileset based on tileset and resource
32
- * @param {Object} tileset
33
- * @param {number} resource
32
+ * @param tileset - tileset metadata
33
+ * @param url - tileset base url
34
+ * @param resource - resource id per I3S spec
34
35
  * @returns {Array}
35
36
  */
36
- export function generateTilesetAttributeUrls(tileset, resource) {
37
+ export function generateTilesetAttributeUrls(tileset: SceneLayer3D, url: string, resource: number) {
37
38
  const attributeUrls: string[] = [];
38
- const {attributeStorageInfo, url} = tileset;
39
+ const {attributeStorageInfo = []} = tileset;
39
40
 
40
41
  for (let index = 0; index < attributeStorageInfo.length; index++) {
41
42
  const fileName = attributeStorageInfo[index].key;