@loaders.gl/i3s 4.0.0-alpha.9 → 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.
- package/dist/dist.min.js +4925 -445
- package/dist/es5/arcgis-webscene-loader.js +4 -4
- package/dist/es5/arcgis-webscene-loader.js.map +1 -1
- package/dist/es5/i3s-attribute-loader.js +1 -1
- package/dist/es5/i3s-attribute-loader.js.map +1 -1
- package/dist/es5/i3s-building-scene-layer-loader.js +1 -1
- package/dist/es5/i3s-building-scene-layer-loader.js.map +1 -1
- package/dist/es5/i3s-content-loader.js +1 -1
- package/dist/es5/i3s-content-loader.js.map +1 -1
- package/dist/es5/i3s-loader.js +6 -6
- package/dist/es5/i3s-loader.js.map +1 -1
- package/dist/es5/i3s-node-page-loader.js +14 -12
- package/dist/es5/i3s-node-page-loader.js.map +1 -1
- package/dist/es5/i3s-slpk-loader.js +30 -2
- package/dist/es5/i3s-slpk-loader.js.map +1 -1
- package/dist/es5/index.js +9 -2
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +9 -5
- package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/es5/lib/parsers/constants.js +14 -15
- package/dist/es5/lib/parsers/constants.js.map +1 -1
- package/dist/es5/lib/parsers/parse-arcgis-webscene.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s-tile-content.js +34 -31
- package/dist/es5/lib/parsers/parse-i3s-tile-content.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s.js +31 -19
- package/dist/es5/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +42 -67
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +76 -51
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/es5/lib/utils/customize-/321/201olors.js.map +1 -1
- package/dist/es5/lib/utils/url-utils.js +3 -3
- package/dist/es5/lib/utils/url-utils.js.map +1 -1
- package/dist/es5/types.js +1 -14
- package/dist/es5/types.js.map +1 -1
- package/dist/esm/arcgis-webscene-loader.js +2 -2
- package/dist/esm/arcgis-webscene-loader.js.map +1 -1
- package/dist/esm/i3s-attribute-loader.js +1 -1
- package/dist/esm/i3s-attribute-loader.js.map +1 -1
- package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
- package/dist/esm/i3s-building-scene-layer-loader.js.map +1 -1
- package/dist/esm/i3s-content-loader.js +1 -1
- package/dist/esm/i3s-content-loader.js.map +1 -1
- package/dist/esm/i3s-loader.js +3 -4
- package/dist/esm/i3s-loader.js.map +1 -1
- package/dist/esm/i3s-node-page-loader.js +7 -5
- package/dist/esm/i3s-node-page-loader.js.map +1 -1
- package/dist/esm/i3s-slpk-loader.js +8 -2
- package/dist/esm/i3s-slpk-loader.js.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +9 -5
- package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/esm/lib/parsers/constants.js +14 -15
- package/dist/esm/lib/parsers/constants.js.map +1 -1
- package/dist/esm/lib/parsers/parse-arcgis-webscene.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s-tile-content.js +5 -2
- package/dist/esm/lib/parsers/parse-i3s-tile-content.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s.js +23 -12
- package/dist/esm/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +19 -33
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +23 -32
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/esm/lib/utils/customize-/321/201olors.js.map +1 -1
- package/dist/esm/lib/utils/url-utils.js +2 -3
- package/dist/esm/lib/utils/url-utils.js.map +1 -1
- package/dist/esm/types.js +0 -12
- package/dist/esm/types.js.map +1 -1
- package/dist/i3s-content-worker-node.js +47 -47
- package/dist/i3s-content-worker-node.js.map +3 -3
- package/dist/i3s-content-worker.js +191 -126
- package/dist/src/arcgis-webscene-loader.d.ts +9 -0
- package/dist/src/arcgis-webscene-loader.d.ts.map +1 -0
- package/dist/src/bundle.d.ts.map +1 -0
- package/dist/{i3s-attribute-loader.d.ts → src/i3s-attribute-loader.d.ts} +3 -2
- package/dist/src/i3s-attribute-loader.d.ts.map +1 -0
- package/dist/src/i3s-building-scene-layer-loader.d.ts +8 -0
- package/dist/src/i3s-building-scene-layer-loader.d.ts.map +1 -0
- package/dist/src/i3s-content-loader.d.ts +8 -0
- package/dist/src/i3s-content-loader.d.ts.map +1 -0
- package/dist/src/i3s-loader.d.ts +11 -0
- package/dist/src/i3s-loader.d.ts.map +1 -0
- package/dist/src/i3s-node-page-loader.d.ts +8 -0
- package/dist/src/i3s-node-page-loader.d.ts.map +1 -0
- package/dist/src/i3s-slpk-loader.d.ts +15 -0
- package/dist/src/i3s-slpk-loader.d.ts.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{lib → src/lib}/helpers/i3s-nodepages-tiles.d.ts +5 -3
- package/dist/src/lib/helpers/i3s-nodepages-tiles.d.ts.map +1 -0
- package/dist/src/lib/parsers/constants.d.ts.map +1 -0
- package/dist/src/lib/parsers/parse-arcgis-webscene.d.ts +7 -0
- package/dist/src/lib/parsers/parse-arcgis-webscene.d.ts.map +1 -0
- package/dist/src/lib/parsers/parse-i3s-attribute.d.ts.map +1 -0
- package/dist/src/lib/parsers/parse-i3s-building-scene-layer.d.ts.map +1 -0
- package/dist/{lib → src/lib}/parsers/parse-i3s-tile-content.d.ts +1 -1
- package/dist/src/lib/parsers/parse-i3s-tile-content.d.ts.map +1 -0
- package/dist/{lib → src/lib}/parsers/parse-i3s.d.ts +2 -2
- package/dist/src/lib/parsers/parse-i3s.d.ts.map +1 -0
- package/dist/src/lib/parsers/parse-slpk/parse-slpk.d.ts +10 -0
- package/dist/src/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -0
- package/dist/{lib → src/lib}/parsers/parse-slpk/slpk-archieve.d.ts +6 -12
- package/dist/src/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -0
- package/dist/src/lib/utils/convert-i3s-obb-to-mbs.d.ts.map +1 -0
- package/dist/src/lib/utils/customize-/321/201olors.d.ts.map +1 -0
- package/dist/{lib → src/lib}/utils/url-utils.d.ts +5 -4
- package/dist/src/lib/utils/url-utils.d.ts.map +1 -0
- package/dist/{types.d.ts → src/types.d.ts} +138 -74
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/workers/i3s-content-worker-node.d.ts.map +1 -0
- package/dist/src/workers/i3s-content-worker.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +9 -9
- package/src/arcgis-webscene-loader.ts +12 -6
- package/src/i3s-attribute-loader.ts +2 -1
- package/src/i3s-building-scene-layer-loader.ts +6 -1
- package/src/i3s-content-loader.ts +3 -2
- package/src/i3s-loader.ts +6 -8
- package/src/i3s-node-page-loader.ts +9 -6
- package/src/i3s-slpk-loader.ts +21 -3
- package/src/index.ts +6 -2
- package/src/lib/helpers/i3s-nodepages-tiles.ts +16 -9
- package/src/lib/parsers/constants.ts +14 -15
- package/src/lib/parsers/parse-arcgis-webscene.ts +2 -2
- package/src/lib/parsers/parse-i3s-tile-content.ts +7 -9
- package/src/lib/parsers/parse-i3s.ts +30 -18
- package/src/lib/parsers/parse-slpk/parse-slpk.ts +43 -55
- package/src/lib/parsers/parse-slpk/slpk-archieve.ts +30 -62
- package/src/lib/utils/customize-/321/201olors.ts +2 -2
- package/src/lib/utils/url-utils.ts +6 -5
- package/src/types.ts +143 -91
- package/dist/arcgis-webscene-loader.d.ts +0 -7
- package/dist/arcgis-webscene-loader.d.ts.map +0 -1
- package/dist/arcgis-webscene-loader.js +0 -28
- package/dist/bundle.d.ts.map +0 -1
- package/dist/bundle.js +0 -5
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +0 -44
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +0 -1
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js +0 -26
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +0 -37
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js +0 -19
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +0 -1
- package/dist/i3s-attribute-loader.d.ts.map +0 -1
- package/dist/i3s-attribute-loader.js +0 -175
- package/dist/i3s-building-scene-layer-loader.d.ts +0 -6
- package/dist/i3s-building-scene-layer-loader.d.ts.map +0 -1
- package/dist/i3s-building-scene-layer-loader.js +0 -26
- package/dist/i3s-content-loader.d.ts +0 -6
- package/dist/i3s-content-loader.d.ts.map +0 -1
- package/dist/i3s-content-loader.js +0 -32
- package/dist/i3s-loader.d.ts +0 -11
- package/dist/i3s-loader.d.ts.map +0 -1
- package/dist/i3s-loader.js +0 -102
- package/dist/i3s-node-page-loader.d.ts +0 -7
- package/dist/i3s-node-page-loader.d.ts.map +0 -1
- package/dist/i3s-node-page-loader.js +0 -22
- package/dist/i3s-slpk-loader.d.ts +0 -13
- package/dist/i3s-slpk-loader.d.ts.map +0 -1
- package/dist/i3s-slpk-loader.js +0 -20
- package/dist/index.d.ts +0 -10
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -21
- package/dist/lib/helpers/i3s-nodepages-tiles.d.ts.map +0 -1
- package/dist/lib/helpers/i3s-nodepages-tiles.js +0 -242
- package/dist/lib/parsers/constants.d.ts.map +0 -1
- package/dist/lib/parsers/constants.js +0 -89
- package/dist/lib/parsers/parse-arcgis-webscene.d.ts +0 -7
- package/dist/lib/parsers/parse-arcgis-webscene.d.ts.map +0 -1
- package/dist/lib/parsers/parse-arcgis-webscene.js +0 -88
- package/dist/lib/parsers/parse-i3s-attribute.d.ts.map +0 -1
- package/dist/lib/parsers/parse-i3s-attribute.js +0 -99
- package/dist/lib/parsers/parse-i3s-building-scene-layer.d.ts.map +0 -1
- package/dist/lib/parsers/parse-i3s-building-scene-layer.js +0 -46
- package/dist/lib/parsers/parse-i3s-tile-content.d.ts.map +0 -1
- package/dist/lib/parsers/parse-i3s-tile-content.js +0 -499
- package/dist/lib/parsers/parse-i3s.d.ts.map +0 -1
- package/dist/lib/parsers/parse-i3s.js +0 -95
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +0 -4
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +0 -1
- package/dist/lib/parsers/parse-slpk/parse-slpk.js +0 -50
- package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +0 -1
- package/dist/lib/parsers/parse-slpk/slpk-archieve.js +0 -142
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +0 -38
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +0 -1
- package/dist/lib/parsers/parse-zip/cd-file-header.js +0 -48
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts +0 -30
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +0 -1
- package/dist/lib/parsers/parse-zip/local-file-header.js +0 -28
- package/dist/lib/utils/convert-i3s-obb-to-mbs.d.ts.map +0 -1
- package/dist/lib/utils/convert-i3s-obb-to-mbs.js +0 -20
- package/dist/lib/utils/customize-/321/201olors.d.ts.map +0 -1
- package/dist/lib/utils/customize-/321/201olors.js +0 -104
- package/dist/lib/utils/url-utils.d.ts.map +0 -1
- package/dist/lib/utils/url-utils.js +0 -44
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -20
- package/dist/workers/i3s-content-worker-node.d.ts.map +0 -1
- package/dist/workers/i3s-content-worker-node.js +0 -7
- package/dist/workers/i3s-content-worker.d.ts.map +0 -1
- package/dist/workers/i3s-content-worker.js +0 -5
- package/src/lib/parsers/parse-zip/cd-file-header.ts +0 -93
- package/src/lib/parsers/parse-zip/local-file-header.ts +0 -56
- /package/dist/{bundle.d.ts → src/bundle.d.ts} +0 -0
- /package/dist/{lib → src/lib}/parsers/constants.d.ts +0 -0
- /package/dist/{lib → src/lib}/parsers/parse-i3s-attribute.d.ts +0 -0
- /package/dist/{lib → src/lib}/parsers/parse-i3s-building-scene-layer.d.ts +0 -0
- /package/dist/{lib → src/lib}/utils/convert-i3s-obb-to-mbs.d.ts +0 -0
- /package/dist/{lib → src/lib}/utils/customize-/321/201olors.d.ts" +0 -0
- /package/dist/{workers → src/workers}/i3s-content-worker-node.d.ts +0 -0
- /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
|
|
5
|
+
case 'UInt8':
|
|
7
6
|
return Uint8Array;
|
|
8
|
-
case
|
|
7
|
+
case 'UInt16':
|
|
9
8
|
return Uint16Array;
|
|
10
|
-
case
|
|
9
|
+
case 'UInt32':
|
|
11
10
|
return Uint32Array;
|
|
12
|
-
case
|
|
11
|
+
case 'Float32':
|
|
13
12
|
return Float32Array;
|
|
14
|
-
case
|
|
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
|
|
34
|
+
case 'UInt8':
|
|
36
35
|
return 1;
|
|
37
|
-
case
|
|
38
|
-
case
|
|
36
|
+
case 'UInt16':
|
|
37
|
+
case 'Int16':
|
|
39
38
|
return 2;
|
|
40
|
-
case
|
|
41
|
-
case
|
|
42
|
-
case
|
|
39
|
+
case 'UInt32':
|
|
40
|
+
case 'Int32':
|
|
41
|
+
case 'Float32':
|
|
43
42
|
return 4;
|
|
44
|
-
case
|
|
45
|
-
case
|
|
46
|
-
case
|
|
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 {
|
|
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<
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
content.texture =
|
|
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,
|
|
83
|
+
return {...tile, mbs, boundingVolume, lodMetricType, lodMetricValue, type, refine};
|
|
78
84
|
}
|
|
79
85
|
|
|
80
|
-
export async function normalizeTilesetData(tileset :
|
|
81
|
-
|
|
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
|
-
|
|
85
|
-
|
|
91
|
+
nodePagesTile = new I3SNodePagesTiles(tileset, url, options);
|
|
92
|
+
root = await nodePagesTile.formTileFromNodePages(0);
|
|
86
93
|
} else {
|
|
87
|
-
|
|
88
|
-
const rootNodeUrl = getUrlWithToken(`${
|
|
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
|
-
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
2
|
-
import {
|
|
3
|
-
|
|
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
|
-
*
|
|
8
|
-
* @param
|
|
9
|
-
* @param
|
|
10
|
-
* @returns
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
42
|
+
const fileDataOffset = localFileHeader.fileDataOffset;
|
|
43
|
+
const hashFile = await fileProvider.slice(
|
|
44
|
+
fileDataOffset,
|
|
45
|
+
fileDataOffset + localFileHeader.compressedSize
|
|
46
|
+
);
|
|
42
47
|
|
|
43
|
-
|
|
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
|
-
|
|
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 {
|
|
4
|
-
import {parseZipLocalFileHeader} from '
|
|
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
|
|
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:
|
|
58
|
-
hashArray:
|
|
59
|
-
constructor(
|
|
60
|
-
this.slpkArchive =
|
|
61
|
-
this.hashArray =
|
|
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
|
-
|
|
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
|
|
138
|
-
|
|
139
|
-
|
|
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
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
125
|
+
const localFileHeader = await parseZipLocalFileHeader(fileInfo.offset, this.slpkArchive);
|
|
126
|
+
if (!localFileHeader) {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
164
129
|
|
|
165
|
-
const compressedFile = this.slpkArchive.
|
|
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<
|
|
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
|
|
33
|
-
* @param
|
|
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
|
|
39
|
+
const {attributeStorageInfo = []} = tileset;
|
|
39
40
|
|
|
40
41
|
for (let index = 0; index < attributeStorageInfo.length; index++) {
|
|
41
42
|
const fileName = attributeStorageInfo[index].key;
|