@loaders.gl/i3s 3.3.0-alpha.4 → 3.3.0-alpha.6
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 +984 -1291
- package/dist/es5/arcgis-webscene-loader.js +2 -8
- package/dist/es5/arcgis-webscene-loader.js.map +1 -1
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/i3s-attribute-loader.js +19 -60
- package/dist/es5/i3s-attribute-loader.js.map +1 -1
- package/dist/es5/i3s-building-scene-layer-loader.js +1 -10
- package/dist/es5/i3s-building-scene-layer-loader.js.map +1 -1
- package/dist/es5/i3s-content-loader.js +1 -14
- package/dist/es5/i3s-content-loader.js.map +1 -1
- package/dist/es5/i3s-loader.js +7 -45
- package/dist/es5/i3s-loader.js.map +1 -1
- package/dist/es5/i3s-node-page-loader.js +1 -12
- package/dist/es5/i3s-node-page-loader.js.map +1 -1
- package/dist/es5/index.js +12 -18
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +18 -78
- package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/es5/lib/parsers/constants.js +2 -18
- package/dist/es5/lib/parsers/constants.js.map +1 -1
- package/dist/es5/lib/parsers/parse-arcgis-webscene.js +128 -30
- package/dist/es5/lib/parsers/parse-arcgis-webscene.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s-attribute.js +1 -23
- package/dist/es5/lib/parsers/parse-i3s-attribute.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js +8 -25
- package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s-tile-content.js +10 -124
- package/dist/es5/lib/parsers/parse-i3s-tile-content.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s.js +5 -36
- package/dist/es5/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js +0 -7
- package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -1
- package/dist/es5/lib/utils/customizeColors.js +4 -53
- package/dist/es5/lib/utils/customizeColors.js.map +1 -1
- package/dist/es5/lib/utils/url-utils.js +3 -8
- package/dist/es5/lib/utils/url-utils.js.map +1 -1
- package/dist/es5/types.js +0 -3
- package/dist/es5/types.js.map +1 -1
- package/dist/es5/workers/i3s-content-nodejs-worker.js +0 -3
- package/dist/es5/workers/i3s-content-nodejs-worker.js.map +1 -1
- package/dist/es5/workers/i3s-content-worker.js +0 -2
- package/dist/es5/workers/i3s-content-worker.js.map +1 -1
- package/dist/esm/arcgis-webscene-loader.js +3 -1
- package/dist/esm/arcgis-webscene-loader.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/i3s-attribute-loader.js +8 -25
- package/dist/esm/i3s-attribute-loader.js.map +1 -1
- package/dist/esm/i3s-building-scene-layer-loader.js +2 -3
- package/dist/esm/i3s-building-scene-layer-loader.js.map +1 -1
- package/dist/esm/i3s-content-loader.js +2 -4
- package/dist/esm/i3s-content-loader.js.map +1 -1
- package/dist/esm/i3s-loader.js +4 -13
- package/dist/esm/i3s-loader.js.map +1 -1
- package/dist/esm/i3s-node-page-loader.js +1 -2
- package/dist/esm/i3s-node-page-loader.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +2 -45
- package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/esm/lib/parsers/constants.js +1 -10
- package/dist/esm/lib/parsers/constants.js.map +1 -1
- package/dist/esm/lib/parsers/parse-arcgis-webscene.js +50 -11
- package/dist/esm/lib/parsers/parse-arcgis-webscene.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s-attribute.js +1 -8
- package/dist/esm/lib/parsers/parse-i3s-attribute.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js +1 -4
- package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s-tile-content.js +23 -71
- package/dist/esm/lib/parsers/parse-i3s-tile-content.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s.js +15 -17
- package/dist/esm/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/esm/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -1
- package/dist/esm/lib/utils/customizeColors.js +24 -36
- package/dist/esm/lib/utils/customizeColors.js.map +1 -1
- package/dist/esm/lib/utils/url-utils.js +5 -5
- package/dist/esm/lib/utils/url-utils.js.map +1 -1
- package/dist/esm/types.js +0 -3
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/workers/i3s-content-nodejs-worker.js.map +1 -1
- package/dist/esm/workers/i3s-content-worker.js.map +1 -1
- package/dist/i3s-content-nodejs-worker.js +61 -60
- package/dist/i3s-content-nodejs-worker.js.map +3 -3
- package/dist/i3s-content-worker.js +490 -1020
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/parsers/parse-arcgis-webscene.d.ts.map +1 -1
- package/dist/lib/parsers/parse-arcgis-webscene.js +49 -7
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/index.ts +6 -1
- package/src/lib/parsers/parse-arcgis-webscene.ts +57 -7
- package/src/types.ts +2 -1
|
@@ -1,35 +1,74 @@
|
|
|
1
|
+
import { JSONLoader, load } from '@loaders.gl/core';
|
|
2
|
+
const SUPPORTED_WKID = 4326;
|
|
1
3
|
const ARCGIS_SCENE_SERVER_LAYER_TYPE = 'ArcGISSceneServiceLayer';
|
|
2
4
|
const BUILDING_SCENE_LAYER = 'BuildingSceneLayer';
|
|
3
5
|
const INTEGRATED_MESH_LAYER = 'IntegratedMeshLayer';
|
|
4
|
-
const
|
|
6
|
+
const GROUP_LAYER = 'GroupLayer';
|
|
7
|
+
|
|
8
|
+
const SUPPORTED_LAYERS_TYPES = [ARCGIS_SCENE_SERVER_LAYER_TYPE, INTEGRATED_MESH_LAYER, BUILDING_SCENE_LAYER, GROUP_LAYER];
|
|
9
|
+
const NO_AVAILABLE_SUPPORTED_LAYERS_ERROR = 'NO_AVAILABLE_SUPPORTED_LAYERS_ERROR';
|
|
10
|
+
const NOT_SUPPORTED_CRS_ERROR = 'NOT_SUPPORTED_CRS_ERROR';
|
|
11
|
+
|
|
5
12
|
export async function parseWebscene(data) {
|
|
6
13
|
const layer0 = JSON.parse(new TextDecoder().decode(data));
|
|
7
14
|
const {
|
|
8
15
|
operationalLayers
|
|
9
16
|
} = layer0;
|
|
17
|
+
const {
|
|
18
|
+
layers,
|
|
19
|
+
unsupportedLayers
|
|
20
|
+
} = await parseOperationalLayers(operationalLayers, true);
|
|
21
|
+
if (!layers.length) {
|
|
22
|
+
throw new Error(NO_AVAILABLE_SUPPORTED_LAYERS_ERROR);
|
|
23
|
+
}
|
|
10
24
|
return {
|
|
11
25
|
header: layer0,
|
|
12
|
-
layers
|
|
26
|
+
layers,
|
|
27
|
+
unsupportedLayers
|
|
13
28
|
};
|
|
14
29
|
}
|
|
15
30
|
|
|
16
|
-
function parseOperationalLayers(layersList) {
|
|
17
|
-
|
|
18
|
-
|
|
31
|
+
async function parseOperationalLayers(layersList, needToCheckCRS) {
|
|
32
|
+
const layers = [];
|
|
33
|
+
let unsupportedLayers = [];
|
|
19
34
|
for (let index = 0; index < layersList.length; index++) {
|
|
20
35
|
var _layer$layers;
|
|
21
|
-
|
|
22
36
|
const layer = layersList[index];
|
|
23
|
-
|
|
24
|
-
if (
|
|
37
|
+
const isLayerSupported = SUPPORTED_LAYERS_TYPES.includes(layer.layerType);
|
|
38
|
+
if (isLayerSupported) {
|
|
39
|
+
if (needToCheckCRS && layer.layerType !== GROUP_LAYER) {
|
|
40
|
+
await checkSupportedIndexCRS(layer);
|
|
41
|
+
needToCheckCRS = false;
|
|
42
|
+
}
|
|
25
43
|
layers.push(layer);
|
|
44
|
+
} else {
|
|
45
|
+
unsupportedLayers.push(layer);
|
|
26
46
|
}
|
|
27
|
-
|
|
28
47
|
if ((_layer$layers = layer.layers) !== null && _layer$layers !== void 0 && _layer$layers.length) {
|
|
29
|
-
|
|
48
|
+
const {
|
|
49
|
+
layers: childLayers,
|
|
50
|
+
unsupportedLayers: childUnsupportedLayers
|
|
51
|
+
} = await parseOperationalLayers(layer.layers, needToCheckCRS);
|
|
52
|
+
layer.layers = childLayers;
|
|
53
|
+
unsupportedLayers = [...unsupportedLayers, ...childUnsupportedLayers];
|
|
30
54
|
}
|
|
31
55
|
}
|
|
56
|
+
return {
|
|
57
|
+
layers,
|
|
58
|
+
unsupportedLayers
|
|
59
|
+
};
|
|
60
|
+
}
|
|
32
61
|
|
|
33
|
-
|
|
62
|
+
async function checkSupportedIndexCRS(layer) {
|
|
63
|
+
try {
|
|
64
|
+
var _layerJson$spatialRef;
|
|
65
|
+
const layerJson = await load(layer.url, JSONLoader);
|
|
66
|
+
const wkid = layerJson === null || layerJson === void 0 ? void 0 : (_layerJson$spatialRef = layerJson.spatialReference) === null || _layerJson$spatialRef === void 0 ? void 0 : _layerJson$spatialRef.wkid;
|
|
67
|
+
if (wkid !== SUPPORTED_WKID) {
|
|
68
|
+
throw new Error(NOT_SUPPORTED_CRS_ERROR);
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
34
73
|
}
|
|
35
74
|
//# sourceMappingURL=parse-arcgis-webscene.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"parse-arcgis-webscene.js","names":["JSONLoader","load","SUPPORTED_WKID","ARCGIS_SCENE_SERVER_LAYER_TYPE","BUILDING_SCENE_LAYER","INTEGRATED_MESH_LAYER","GROUP_LAYER","SUPPORTED_LAYERS_TYPES","NO_AVAILABLE_SUPPORTED_LAYERS_ERROR","NOT_SUPPORTED_CRS_ERROR","parseWebscene","data","layer0","JSON","parse","TextDecoder","decode","operationalLayers","layers","unsupportedLayers","parseOperationalLayers","length","Error","header","layersList","needToCheckCRS","index","layer","isLayerSupported","includes","layerType","checkSupportedIndexCRS","push","childLayers","childUnsupportedLayers","layerJson","url","wkid","spatialReference","error"],"sources":["../../../../src/lib/parsers/parse-arcgis-webscene.ts"],"sourcesContent":["import {JSONLoader, load} from '@loaders.gl/core';\nimport type {ArcGisWebSceneData, OperationalLayer} from '../../types';\n\n/**\n * WKID, or Well-Known ID, of the CRS. Specify either WKID or WKT of the CRS.\n * Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/spatialReference.cmn.md\n */\nconst SUPPORTED_WKID = 4326;\n\nconst ARCGIS_SCENE_SERVER_LAYER_TYPE = 'ArcGISSceneServiceLayer';\nconst BUILDING_SCENE_LAYER = 'BuildingSceneLayer';\nconst INTEGRATED_MESH_LAYER = 'IntegratedMeshLayer';\nconst GROUP_LAYER = 'GroupLayer';\n\n/**\n * Supported layers list\n * Possible operational layers in WebScene: https://developers.arcgis.com/web-scene-specification/objects/operationalLayers/\n */\nconst SUPPORTED_LAYERS_TYPES = [\n ARCGIS_SCENE_SERVER_LAYER_TYPE,\n INTEGRATED_MESH_LAYER,\n BUILDING_SCENE_LAYER,\n GROUP_LAYER\n];\n\nconst NO_AVAILABLE_SUPPORTED_LAYERS_ERROR = 'NO_AVAILABLE_SUPPORTED_LAYERS_ERROR';\nconst NOT_SUPPORTED_CRS_ERROR = 'NOT_SUPPORTED_CRS_ERROR';\n\n/**\n * Parses ArcGIS WebScene\n * @param data\n */\nexport async function parseWebscene(data: ArrayBuffer): Promise<ArcGisWebSceneData> {\n const layer0 = JSON.parse(new TextDecoder().decode(data));\n const {operationalLayers} = layer0;\n const {layers, unsupportedLayers} = await parseOperationalLayers(operationalLayers, true);\n\n if (!layers.length) {\n throw new Error(NO_AVAILABLE_SUPPORTED_LAYERS_ERROR);\n }\n\n return {\n header: layer0,\n layers,\n unsupportedLayers\n };\n}\n\n/**\n * Recursively parses WebScene operational layers.\n * @param layersList\n */\nasync function parseOperationalLayers(\n layersList: OperationalLayer[],\n needToCheckCRS: boolean\n): Promise<{layers: OperationalLayer[]; unsupportedLayers: OperationalLayer[]}> {\n const layers: OperationalLayer[] = [];\n let unsupportedLayers: OperationalLayer[] = [];\n\n for (let index = 0; index < layersList.length; index++) {\n const layer = layersList[index];\n const isLayerSupported = SUPPORTED_LAYERS_TYPES.includes(layer.layerType);\n\n if (isLayerSupported) {\n if (needToCheckCRS && layer.layerType !== GROUP_LAYER) {\n await checkSupportedIndexCRS(layer);\n needToCheckCRS = false;\n }\n\n layers.push(layer);\n } else {\n unsupportedLayers.push(layer);\n }\n\n if (layer.layers?.length) {\n const {layers: childLayers, unsupportedLayers: childUnsupportedLayers} =\n await parseOperationalLayers(layer.layers, needToCheckCRS);\n layer.layers = childLayers;\n unsupportedLayers = [...unsupportedLayers, ...childUnsupportedLayers];\n }\n }\n\n return {layers, unsupportedLayers};\n}\n\n/**\n * Check if layer has supported CRS\n * @param layer\n */\nasync function checkSupportedIndexCRS(layer: OperationalLayer) {\n try {\n const layerJson = await load(layer.url, JSONLoader);\n const wkid = layerJson?.spatialReference?.wkid;\n\n if (wkid !== SUPPORTED_WKID) {\n throw new Error(NOT_SUPPORTED_CRS_ERROR);\n }\n } catch (error) {\n throw error;\n }\n}\n"],"mappings":"AAAA,SAAQA,UAAU,EAAEC,IAAI,QAAO,kBAAkB;AAOjD,MAAMC,cAAc,GAAG,IAAI;AAE3B,MAAMC,8BAA8B,GAAG,yBAAyB;AAChE,MAAMC,oBAAoB,GAAG,oBAAoB;AACjD,MAAMC,qBAAqB,GAAG,qBAAqB;AACnD,MAAMC,WAAW,GAAG,YAAY;;AAMhC,MAAMC,sBAAsB,GAAG,CAC7BJ,8BAA8B,EAC9BE,qBAAqB,EACrBD,oBAAoB,EACpBE,WAAW,CACZ;AAED,MAAME,mCAAmC,GAAG,qCAAqC;AACjF,MAAMC,uBAAuB,GAAG,yBAAyB;;AAMzD,OAAO,eAAeC,aAAa,CAACC,IAAiB,EAA+B;EAClF,MAAMC,MAAM,GAAGC,IAAI,CAACC,KAAK,CAAC,IAAIC,WAAW,EAAE,CAACC,MAAM,CAACL,IAAI,CAAC,CAAC;EACzD,MAAM;IAACM;EAAiB,CAAC,GAAGL,MAAM;EAClC,MAAM;IAACM,MAAM;IAAEC;EAAiB,CAAC,GAAG,MAAMC,sBAAsB,CAACH,iBAAiB,EAAE,IAAI,CAAC;EAEzF,IAAI,CAACC,MAAM,CAACG,MAAM,EAAE;IAClB,MAAM,IAAIC,KAAK,CAACd,mCAAmC,CAAC;EACtD;EAEA,OAAO;IACLe,MAAM,EAAEX,MAAM;IACdM,MAAM;IACNC;EACF,CAAC;AACH;;AAMA,eAAeC,sBAAsB,CACnCI,UAA8B,EAC9BC,cAAuB,EACuD;EAC9E,MAAMP,MAA0B,GAAG,EAAE;EACrC,IAAIC,iBAAqC,GAAG,EAAE;EAE9C,KAAK,IAAIO,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGF,UAAU,CAACH,MAAM,EAAEK,KAAK,EAAE,EAAE;IAAA;IACtD,MAAMC,KAAK,GAAGH,UAAU,CAACE,KAAK,CAAC;IAC/B,MAAME,gBAAgB,GAAGrB,sBAAsB,CAACsB,QAAQ,CAACF,KAAK,CAACG,SAAS,CAAC;IAEzE,IAAIF,gBAAgB,EAAE;MACpB,IAAIH,cAAc,IAAIE,KAAK,CAACG,SAAS,KAAKxB,WAAW,EAAE;QACrD,MAAMyB,sBAAsB,CAACJ,KAAK,CAAC;QACnCF,cAAc,GAAG,KAAK;MACxB;MAEAP,MAAM,CAACc,IAAI,CAACL,KAAK,CAAC;IACpB,CAAC,MAAM;MACLR,iBAAiB,CAACa,IAAI,CAACL,KAAK,CAAC;IAC/B;IAEA,qBAAIA,KAAK,CAACT,MAAM,0CAAZ,cAAcG,MAAM,EAAE;MACxB,MAAM;QAACH,MAAM,EAAEe,WAAW;QAAEd,iBAAiB,EAAEe;MAAsB,CAAC,GACpE,MAAMd,sBAAsB,CAACO,KAAK,CAACT,MAAM,EAAEO,cAAc,CAAC;MAC5DE,KAAK,CAACT,MAAM,GAAGe,WAAW;MAC1Bd,iBAAiB,GAAG,CAAC,GAAGA,iBAAiB,EAAE,GAAGe,sBAAsB,CAAC;IACvE;EACF;EAEA,OAAO;IAAChB,MAAM;IAAEC;EAAiB,CAAC;AACpC;;AAMA,eAAeY,sBAAsB,CAACJ,KAAuB,EAAE;EAC7D,IAAI;IAAA;IACF,MAAMQ,SAAS,GAAG,MAAMlC,IAAI,CAAC0B,KAAK,CAACS,GAAG,EAAEpC,UAAU,CAAC;IACnD,MAAMqC,IAAI,GAAGF,SAAS,aAATA,SAAS,gDAATA,SAAS,CAAEG,gBAAgB,0DAA3B,sBAA6BD,IAAI;IAE9C,IAAIA,IAAI,KAAKnC,cAAc,EAAE;MAC3B,MAAM,IAAIoB,KAAK,CAACb,uBAAuB,CAAC;IAC1C;EACF,CAAC,CAAC,OAAO8B,KAAK,EAAE;IACd,MAAMA,KAAK;EACb;AACF"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { STRING_ATTRIBUTE_TYPE, OBJECT_ID_ATTRIBUTE_TYPE, FLOAT_64_TYPE, INT_16_ATTRIBUTE_TYPE } from './constants';
|
|
2
|
+
|
|
2
3
|
export async function parseI3STileAttribute(arrayBuffer, options) {
|
|
3
4
|
const {
|
|
4
5
|
attributeName,
|
|
5
6
|
attributeType
|
|
6
7
|
} = options;
|
|
7
|
-
|
|
8
8
|
if (!attributeName) {
|
|
9
9
|
return {};
|
|
10
10
|
}
|
|
11
|
-
|
|
12
11
|
return {
|
|
13
12
|
[attributeName]: attributeType ? parseAttribute(attributeType, arrayBuffer) : null
|
|
14
13
|
};
|
|
@@ -18,16 +17,12 @@ function parseAttribute(attributeType, arrayBuffer) {
|
|
|
18
17
|
switch (attributeType) {
|
|
19
18
|
case STRING_ATTRIBUTE_TYPE:
|
|
20
19
|
return parseStringsAttribute(arrayBuffer);
|
|
21
|
-
|
|
22
20
|
case OBJECT_ID_ATTRIBUTE_TYPE:
|
|
23
21
|
return parseShortNumberAttribute(arrayBuffer);
|
|
24
|
-
|
|
25
22
|
case FLOAT_64_TYPE:
|
|
26
23
|
return parseFloatAttribute(arrayBuffer);
|
|
27
|
-
|
|
28
24
|
case INT_16_ATTRIBUTE_TYPE:
|
|
29
25
|
return parseInt16ShortNumberAttribute(arrayBuffer);
|
|
30
|
-
|
|
31
26
|
default:
|
|
32
27
|
return parseShortNumberAttribute(arrayBuffer);
|
|
33
28
|
}
|
|
@@ -53,12 +48,10 @@ function parseStringsAttribute(arrayBuffer) {
|
|
|
53
48
|
const dataOffset = 8;
|
|
54
49
|
const bytesPerStringSize = 4;
|
|
55
50
|
const stringsArray = [];
|
|
56
|
-
|
|
57
51
|
try {
|
|
58
52
|
const stringsCount = new DataView(arrayBuffer, stringsCountOffset, bytesPerStringSize).getUint32(stringsCountOffset, true);
|
|
59
53
|
const stringSizes = new Uint32Array(arrayBuffer, dataOffset, stringsCount);
|
|
60
54
|
let stringOffset = dataOffset + stringsCount * bytesPerStringSize;
|
|
61
|
-
|
|
62
55
|
for (const stringByteSize of stringSizes) {
|
|
63
56
|
const textDecoder = new TextDecoder('utf-8');
|
|
64
57
|
const stringAttribute = new Uint8Array(arrayBuffer, stringOffset, stringByteSize);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"parse-i3s-attribute.js","names":["STRING_ATTRIBUTE_TYPE","OBJECT_ID_ATTRIBUTE_TYPE","FLOAT_64_TYPE","INT_16_ATTRIBUTE_TYPE","parseI3STileAttribute","arrayBuffer","options","attributeName","attributeType","parseAttribute","parseStringsAttribute","parseShortNumberAttribute","parseFloatAttribute","parseInt16ShortNumberAttribute","countOffset","Uint32Array","Int16Array","Float64Array","stringsCountOffset","dataOffset","bytesPerStringSize","stringsArray","stringsCount","DataView","getUint32","stringSizes","stringOffset","stringByteSize","textDecoder","TextDecoder","stringAttribute","Uint8Array","push","decode","error","console","message"],"sources":["../../../../src/lib/parsers/parse-i3s-attribute.ts"],"sourcesContent":["import {\n STRING_ATTRIBUTE_TYPE,\n OBJECT_ID_ATTRIBUTE_TYPE,\n FLOAT_64_TYPE,\n INT_16_ATTRIBUTE_TYPE\n} from './constants';\n\n/**\n * Get particular tile and creates attribute object inside.\n * @param {ArrayBuffer} arrayBuffer\n * @param {Object} options\n * @returns {Promise<object>}\n */\nexport async function parseI3STileAttribute(arrayBuffer, options) {\n const {attributeName, attributeType} = options;\n\n if (!attributeName) {\n return {};\n }\n return {\n [attributeName]: attributeType ? parseAttribute(attributeType, arrayBuffer) : null\n };\n}\n\n/**\n * Parse attributes based on attribute type.\n * @param {String} attributeType\n * @param {ArrayBuffer} arrayBuffer\n * @returns {any}\n */\nfunction parseAttribute(attributeType, arrayBuffer) {\n switch (attributeType) {\n case STRING_ATTRIBUTE_TYPE:\n return parseStringsAttribute(arrayBuffer);\n case OBJECT_ID_ATTRIBUTE_TYPE:\n return parseShortNumberAttribute(arrayBuffer);\n case FLOAT_64_TYPE:\n return parseFloatAttribute(arrayBuffer);\n case INT_16_ATTRIBUTE_TYPE:\n return parseInt16ShortNumberAttribute(arrayBuffer);\n default:\n return parseShortNumberAttribute(arrayBuffer);\n }\n}\n\n/**\n * Parse short number attribute.\n * Short Integer spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param {ArrayBuffer} arrayBuffer\n * @returns {Uint32Array}\n */\nfunction parseShortNumberAttribute(arrayBuffer) {\n const countOffset = 4;\n return new Uint32Array(arrayBuffer, countOffset);\n}\n\n/**\n * Parse Int16 short number attribute.\n * Parsing of such data is not documented. Added to handle Building Scene Layer Tileset attributes data.\n * @param {ArrayBuffer} arrayBuffer\n * @returns {Int16Array}\n */\nfunction parseInt16ShortNumberAttribute(arrayBuffer) {\n const countOffset = 4;\n return new Int16Array(arrayBuffer, countOffset);\n}\n\n/**\n * Parse float attribute.\n * Double Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param {ArrayBuffer} arrayBuffer\n * @returns {Float64Array}\n */\nfunction parseFloatAttribute(arrayBuffer) {\n const countOffset = 8;\n return new Float64Array(arrayBuffer, countOffset);\n}\n\n/**\n * Parse string attribute.\n * String spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param arrayBuffer\n * @returns list of strings\n */\nfunction parseStringsAttribute(arrayBuffer: ArrayBuffer): string[] {\n const stringsCountOffset = 0;\n const dataOffset = 8;\n const bytesPerStringSize = 4;\n const stringsArray: string[] = [];\n\n try {\n // Use DataView to avoid multiple of 4 error on Uint32Array constructor\n const stringsCount = new DataView(\n arrayBuffer,\n stringsCountOffset,\n bytesPerStringSize\n ).getUint32(stringsCountOffset, true);\n const stringSizes = new Uint32Array(arrayBuffer, dataOffset, stringsCount);\n let stringOffset = dataOffset + stringsCount * bytesPerStringSize;\n\n for (const stringByteSize of stringSizes) {\n const textDecoder = new TextDecoder('utf-8');\n const stringAttribute = new Uint8Array(arrayBuffer, stringOffset, stringByteSize);\n stringsArray.push(textDecoder.decode(stringAttribute));\n stringOffset += stringByteSize;\n }\n } catch (error) {\n console.error('Parse string attribute error: ', (error as Error).message); // eslint-disable-line\n }\n\n return stringsArray;\n}\n"],"mappings":"AAAA,SACEA,qBAAqB,EACrBC,wBAAwB,EACxBC,aAAa,EACbC,qBAAqB,QAChB,aAAa;;AAQpB,OAAO,eAAeC,qBAAqB,CAACC,WAAW,EAAEC,OAAO,EAAE;EAChE,MAAM;IAACC,aAAa;IAAEC;EAAa,CAAC,GAAGF,OAAO;EAE9C,IAAI,CAACC,aAAa,EAAE;IAClB,OAAO,CAAC,CAAC;EACX;EACA,OAAO;IACL,CAACA,aAAa,GAAGC,aAAa,GAAGC,cAAc,CAACD,aAAa,EAAEH,WAAW,CAAC,GAAG;EAChF,CAAC;AACH;;AAQA,SAASI,cAAc,CAACD,aAAa,EAAEH,WAAW,EAAE;EAClD,QAAQG,aAAa;IACnB,KAAKR,qBAAqB;MACxB,OAAOU,qBAAqB,CAACL,WAAW,CAAC;IAC3C,KAAKJ,wBAAwB;MAC3B,OAAOU,yBAAyB,CAACN,WAAW,CAAC;IAC/C,KAAKH,aAAa;MAChB,OAAOU,mBAAmB,CAACP,WAAW,CAAC;IACzC,KAAKF,qBAAqB;MACxB,OAAOU,8BAA8B,CAACR,WAAW,CAAC;IACpD;MACE,OAAOM,yBAAyB,CAACN,WAAW,CAAC;EAAC;AAEpD;;AAQA,SAASM,yBAAyB,CAACN,WAAW,EAAE;EAC9C,MAAMS,WAAW,GAAG,CAAC;EACrB,OAAO,IAAIC,WAAW,CAACV,WAAW,EAAES,WAAW,CAAC;AAClD;;AAQA,SAASD,8BAA8B,CAACR,WAAW,EAAE;EACnD,MAAMS,WAAW,GAAG,CAAC;EACrB,OAAO,IAAIE,UAAU,CAACX,WAAW,EAAES,WAAW,CAAC;AACjD;;AAQA,SAASF,mBAAmB,CAACP,WAAW,EAAE;EACxC,MAAMS,WAAW,GAAG,CAAC;EACrB,OAAO,IAAIG,YAAY,CAACZ,WAAW,EAAES,WAAW,CAAC;AACnD;;AAQA,SAASJ,qBAAqB,CAACL,WAAwB,EAAY;EACjE,MAAMa,kBAAkB,GAAG,CAAC;EAC5B,MAAMC,UAAU,GAAG,CAAC;EACpB,MAAMC,kBAAkB,GAAG,CAAC;EAC5B,MAAMC,YAAsB,GAAG,EAAE;EAEjC,IAAI;IAEF,MAAMC,YAAY,GAAG,IAAIC,QAAQ,CAC/BlB,WAAW,EACXa,kBAAkB,EAClBE,kBAAkB,CACnB,CAACI,SAAS,CAACN,kBAAkB,EAAE,IAAI,CAAC;IACrC,MAAMO,WAAW,GAAG,IAAIV,WAAW,CAACV,WAAW,EAAEc,UAAU,EAAEG,YAAY,CAAC;IAC1E,IAAII,YAAY,GAAGP,UAAU,GAAGG,YAAY,GAAGF,kBAAkB;IAEjE,KAAK,MAAMO,cAAc,IAAIF,WAAW,EAAE;MACxC,MAAMG,WAAW,GAAG,IAAIC,WAAW,CAAC,OAAO,CAAC;MAC5C,MAAMC,eAAe,GAAG,IAAIC,UAAU,CAAC1B,WAAW,EAAEqB,YAAY,EAAEC,cAAc,CAAC;MACjFN,YAAY,CAACW,IAAI,CAACJ,WAAW,CAACK,MAAM,CAACH,eAAe,CAAC,CAAC;MACtDJ,YAAY,IAAIC,cAAc;IAChC;EACF,CAAC,CAAC,OAAOO,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,gCAAgC,EAAGA,KAAK,CAAWE,OAAO,CAAC;EAC3E;;EAEA,OAAOf,YAAY;AACrB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const OBJECT_3D_LAYER_TYPE = '3DObject';
|
|
2
|
+
|
|
2
3
|
export async function parseBuildingSceneLayer(data, url) {
|
|
3
4
|
const layer0 = JSON.parse(new TextDecoder().decode(data));
|
|
4
5
|
const {
|
|
@@ -12,10 +13,8 @@ export async function parseBuildingSceneLayer(data, url) {
|
|
|
12
13
|
|
|
13
14
|
function parseSublayersTree(sublayers, url) {
|
|
14
15
|
let layers = [];
|
|
15
|
-
|
|
16
16
|
for (let index = 0; index < sublayers.length; index++) {
|
|
17
17
|
var _subLayer$sublayers;
|
|
18
|
-
|
|
19
18
|
const subLayer = sublayers[index];
|
|
20
19
|
const {
|
|
21
20
|
id,
|
|
@@ -34,12 +33,10 @@ function parseSublayersTree(sublayers, url) {
|
|
|
34
33
|
...rest
|
|
35
34
|
});
|
|
36
35
|
}
|
|
37
|
-
|
|
38
36
|
if (subLayer !== null && subLayer !== void 0 && (_subLayer$sublayers = subLayer.sublayers) !== null && _subLayer$sublayers !== void 0 && _subLayer$sublayers.length) {
|
|
39
37
|
layers = [...layers, ...parseSublayersTree(subLayer.sublayers, url)];
|
|
40
38
|
}
|
|
41
39
|
}
|
|
42
|
-
|
|
43
40
|
return layers;
|
|
44
41
|
}
|
|
45
42
|
//# sourceMappingURL=parse-i3s-building-scene-layer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"parse-i3s-building-scene-layer.js","names":["OBJECT_3D_LAYER_TYPE","parseBuildingSceneLayer","data","url","layer0","JSON","parse","TextDecoder","decode","sublayers","header","parseSublayersTree","layers","index","length","subLayer","id","layerType","visibility","rest","sublayerUrl","push"],"sources":["../../../../src/lib/parsers/parse-i3s-building-scene-layer.ts"],"sourcesContent":["import type {BuildingSceneLayerTileset, BuildingSceneSublayer} from '../../types';\n\nconst OBJECT_3D_LAYER_TYPE = '3DObject';\n\n/**\n * Parses Builiding Scene Layer and creates tileset\n * @param data\n * @param options\n * @param context\n */\nexport async function parseBuildingSceneLayer(\n data: ArrayBuffer,\n url: string\n): Promise<BuildingSceneLayerTileset> {\n const layer0 = JSON.parse(new TextDecoder().decode(data));\n const {sublayers} = layer0;\n\n return {\n header: layer0,\n sublayers: parseSublayersTree(sublayers, url)\n };\n}\n\n/**\n * Recursively parses Building Scene Layer sublayers.\n * @param sublayers\n * @param url\n */\nfunction parseSublayersTree(\n sublayers: BuildingSceneSublayer[],\n url: string\n): BuildingSceneSublayer[] {\n let layers: BuildingSceneSublayer[] = [];\n\n for (let index = 0; index < sublayers.length; index++) {\n const subLayer = sublayers[index];\n const {id, layerType, visibility = true, ...rest} = subLayer;\n\n // Add support only for 3DObject layer type for I3S purposes.\n if (layerType === OBJECT_3D_LAYER_TYPE) {\n const sublayerUrl = `${url}/sublayers/${id}`;\n\n layers.push({\n url: sublayerUrl,\n id,\n layerType,\n visibility,\n ...rest\n });\n }\n\n if (subLayer?.sublayers?.length) {\n layers = [...layers, ...parseSublayersTree(subLayer.sublayers, url)];\n }\n }\n\n return layers;\n}\n"],"mappings":"AAEA,MAAMA,oBAAoB,GAAG,UAAU;;AAQvC,OAAO,eAAeC,uBAAuB,CAC3CC,IAAiB,EACjBC,GAAW,EACyB;EACpC,MAAMC,MAAM,GAAGC,IAAI,CAACC,KAAK,CAAC,IAAIC,WAAW,EAAE,CAACC,MAAM,CAACN,IAAI,CAAC,CAAC;EACzD,MAAM;IAACO;EAAS,CAAC,GAAGL,MAAM;EAE1B,OAAO;IACLM,MAAM,EAAEN,MAAM;IACdK,SAAS,EAAEE,kBAAkB,CAACF,SAAS,EAAEN,GAAG;EAC9C,CAAC;AACH;;AAOA,SAASQ,kBAAkB,CACzBF,SAAkC,EAClCN,GAAW,EACc;EACzB,IAAIS,MAA+B,GAAG,EAAE;EAExC,KAAK,IAAIC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGJ,SAAS,CAACK,MAAM,EAAED,KAAK,EAAE,EAAE;IAAA;IACrD,MAAME,QAAQ,GAAGN,SAAS,CAACI,KAAK,CAAC;IACjC,MAAM;MAACG,EAAE;MAAEC,SAAS;MAAEC,UAAU,GAAG,IAAI;MAAE,GAAGC;IAAI,CAAC,GAAGJ,QAAQ;;IAG5D,IAAIE,SAAS,KAAKjB,oBAAoB,EAAE;MACtC,MAAMoB,WAAW,aAAMjB,GAAG,wBAAca,EAAE,CAAE;MAE5CJ,MAAM,CAACS,IAAI,CAAC;QACVlB,GAAG,EAAEiB,WAAW;QAChBJ,EAAE;QACFC,SAAS;QACTC,UAAU;QACV,GAAGC;MACL,CAAC,CAAC;IACJ;IAEA,IAAIJ,QAAQ,aAARA,QAAQ,sCAARA,QAAQ,CAAEN,SAAS,gDAAnB,oBAAqBK,MAAM,EAAE;MAC/BF,MAAM,GAAG,CAAC,GAAGA,MAAM,EAAE,GAAGD,kBAAkB,CAACI,QAAQ,CAACN,SAAS,EAAEN,GAAG,CAAC,CAAC;IACtE;EACF;EAEA,OAAOS,MAAM;AACf"}
|
|
@@ -9,23 +9,19 @@ import { getUrlWithToken } from '../utils/url-utils';
|
|
|
9
9
|
import { GL_TYPE_MAP, getConstructorForDataFormat, sizeOf, COORDINATE_SYSTEM } from './constants';
|
|
10
10
|
import { customizeColors } from '../utils/customizeColors';
|
|
11
11
|
const scratchVector = new Vector3([0, 0, 0]);
|
|
12
|
-
|
|
13
12
|
function getLoaderForTextureFormat(textureFormat) {
|
|
14
13
|
switch (textureFormat) {
|
|
15
14
|
case 'ktx-etc2':
|
|
16
15
|
case 'dds':
|
|
17
16
|
return CompressedTextureLoader;
|
|
18
|
-
|
|
19
17
|
case 'ktx2':
|
|
20
18
|
return BasisLoader;
|
|
21
|
-
|
|
22
19
|
case 'jpg':
|
|
23
20
|
case 'png':
|
|
24
21
|
default:
|
|
25
22
|
return ImageLoader;
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
|
-
|
|
29
25
|
const I3S_ATTRIBUTE_TYPE = 'i3s-attribute-type';
|
|
30
26
|
export async function parseI3STileContent(arrayBuffer, tileOptions, tilesetOptions, options, context) {
|
|
31
27
|
const content = {
|
|
@@ -38,23 +34,20 @@ export async function parseI3STileContent(arrayBuffer, tileOptions, tilesetOptio
|
|
|
38
34
|
byteLength: 0,
|
|
39
35
|
texture: null
|
|
40
36
|
};
|
|
41
|
-
|
|
42
37
|
if (tileOptions.textureUrl) {
|
|
43
38
|
var _options$i3s;
|
|
44
|
-
|
|
45
39
|
const url = getUrlWithToken(tileOptions.textureUrl, options === null || options === void 0 ? void 0 : (_options$i3s = options.i3s) === null || _options$i3s === void 0 ? void 0 : _options$i3s.token);
|
|
46
40
|
const loader = getLoaderForTextureFormat(tileOptions.textureFormat);
|
|
47
41
|
const response = await fetch(url, options === null || options === void 0 ? void 0 : options.fetch);
|
|
48
42
|
const arrayBuffer = await response.arrayBuffer();
|
|
49
|
-
|
|
50
43
|
if (options !== null && options !== void 0 && options.i3s.decodeTextures) {
|
|
51
44
|
if (loader === ImageLoader) {
|
|
52
|
-
const options = {
|
|
45
|
+
const options = {
|
|
46
|
+
...tileOptions.textureLoaderOptions,
|
|
53
47
|
image: {
|
|
54
48
|
type: 'data'
|
|
55
49
|
}
|
|
56
50
|
};
|
|
57
|
-
|
|
58
51
|
try {
|
|
59
52
|
content.texture = await context.parse(arrayBuffer, options);
|
|
60
53
|
} catch (e) {
|
|
@@ -62,11 +55,9 @@ export async function parseI3STileContent(arrayBuffer, tileOptions, tilesetOptio
|
|
|
62
55
|
}
|
|
63
56
|
} else if (loader === CompressedTextureLoader || loader === BasisLoader) {
|
|
64
57
|
let texture = await load(arrayBuffer, loader, tileOptions.textureLoaderOptions);
|
|
65
|
-
|
|
66
58
|
if (loader === BasisLoader) {
|
|
67
59
|
texture = texture[0];
|
|
68
60
|
}
|
|
69
|
-
|
|
70
61
|
content.texture = {
|
|
71
62
|
compressed: true,
|
|
72
63
|
mipmaps: false,
|
|
@@ -79,29 +70,23 @@ export async function parseI3STileContent(arrayBuffer, tileOptions, tilesetOptio
|
|
|
79
70
|
content.texture = arrayBuffer;
|
|
80
71
|
}
|
|
81
72
|
}
|
|
82
|
-
|
|
83
73
|
content.material = makePbrMaterial(tileOptions.materialDefinition, content.texture);
|
|
84
|
-
|
|
85
74
|
if (content.material) {
|
|
86
75
|
content.texture = null;
|
|
87
76
|
}
|
|
88
|
-
|
|
89
77
|
return await parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOptions, options);
|
|
90
78
|
}
|
|
91
79
|
|
|
92
80
|
async function parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOptions, options) {
|
|
93
81
|
var _options$i3s2;
|
|
94
|
-
|
|
95
82
|
const contentByteLength = arrayBuffer.byteLength;
|
|
96
83
|
let attributes;
|
|
97
84
|
let vertexCount;
|
|
98
85
|
let byteOffset = 0;
|
|
99
86
|
let featureCount = 0;
|
|
100
87
|
let indices;
|
|
101
|
-
|
|
102
88
|
if (tileOptions.isDracoGeometry) {
|
|
103
89
|
var _decompressedGeometry;
|
|
104
|
-
|
|
105
90
|
const decompressedGeometry = await parse(arrayBuffer, DracoLoader, {
|
|
106
91
|
draco: {
|
|
107
92
|
attributeNameEntry: I3S_ATTRIBUTE_TYPE
|
|
@@ -127,7 +112,6 @@ async function parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOp
|
|
|
127
112
|
};
|
|
128
113
|
updateAttributesMetadata(attributes, decompressedGeometry);
|
|
129
114
|
const featureIds = getFeatureIdsFromFeatureIndexMetadata(featureIndex);
|
|
130
|
-
|
|
131
115
|
if (featureIds) {
|
|
132
116
|
flattenFeatureIdsByFeatureIndices(attributes, featureIds);
|
|
133
117
|
}
|
|
@@ -146,13 +130,13 @@ async function parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOp
|
|
|
146
130
|
attributes: normalizedVertexAttributes,
|
|
147
131
|
byteOffset: offset
|
|
148
132
|
} = normalizeAttributes(arrayBuffer, byteOffset, vertexAttributes, vertexCount, attributesOrder);
|
|
133
|
+
|
|
149
134
|
const {
|
|
150
135
|
attributes: normalizedFeatureAttributes
|
|
151
136
|
} = normalizeAttributes(arrayBuffer, offset, featureAttributes, featureCount, featureAttributeOrder);
|
|
152
137
|
flattenFeatureIdsByFaceRanges(normalizedFeatureAttributes);
|
|
153
138
|
attributes = concatAttributes(normalizedVertexAttributes, normalizedFeatureAttributes);
|
|
154
139
|
}
|
|
155
|
-
|
|
156
140
|
if (!(options !== null && options !== void 0 && (_options$i3s2 = options.i3s) !== null && _options$i3s2 !== void 0 && _options$i3s2.coordinateSystem) || options.i3s.coordinateSystem === COORDINATE_SYSTEM.METER_OFFSETS) {
|
|
157
141
|
const enuMatrix = parsePositions(attributes.position, tileOptions);
|
|
158
142
|
content.modelMatrix = enuMatrix.invert();
|
|
@@ -161,7 +145,6 @@ async function parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOp
|
|
|
161
145
|
content.modelMatrix = getModelMatrix(attributes.position);
|
|
162
146
|
content.coordinateSystem = COORDINATE_SYSTEM.LNGLAT_OFFSETS;
|
|
163
147
|
}
|
|
164
|
-
|
|
165
148
|
attributes.color = await customizeColors(attributes.color, attributes.id, tileOptions, tilesetOptions, options);
|
|
166
149
|
content.attributes = {
|
|
167
150
|
positions: attributes.position,
|
|
@@ -170,8 +153,8 @@ async function parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOp
|
|
|
170
153
|
texCoords: attributes.uv0,
|
|
171
154
|
uvRegions: normalizeAttribute(attributes.uvRegion)
|
|
172
155
|
};
|
|
173
|
-
content.indices = indices || null;
|
|
174
156
|
|
|
157
|
+
content.indices = indices || null;
|
|
175
158
|
if (attributes.id && attributes.id.value) {
|
|
176
159
|
content.featureIds = attributes.id.value;
|
|
177
160
|
}
|
|
@@ -181,7 +164,6 @@ async function parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOp
|
|
|
181
164
|
delete content.attributes[attributeIndex];
|
|
182
165
|
}
|
|
183
166
|
}
|
|
184
|
-
|
|
185
167
|
content.vertexCount = vertexCount;
|
|
186
168
|
content.byteLength = contentByteLength;
|
|
187
169
|
return content;
|
|
@@ -190,16 +172,13 @@ async function parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOp
|
|
|
190
172
|
function updateAttributesMetadata(attributes, decompressedGeometry) {
|
|
191
173
|
for (const key in decompressedGeometry.loaderData.attributes) {
|
|
192
174
|
const dracoAttribute = decompressedGeometry.loaderData.attributes[key];
|
|
193
|
-
|
|
194
175
|
switch (dracoAttribute.name) {
|
|
195
176
|
case 'POSITION':
|
|
196
177
|
attributes.position.metadata = dracoAttribute.metadata;
|
|
197
178
|
break;
|
|
198
|
-
|
|
199
179
|
case 'feature-index':
|
|
200
180
|
attributes.id.metadata = dracoAttribute.metadata;
|
|
201
181
|
break;
|
|
202
|
-
|
|
203
182
|
default:
|
|
204
183
|
break;
|
|
205
184
|
}
|
|
@@ -207,7 +186,8 @@ function updateAttributesMetadata(attributes, decompressedGeometry) {
|
|
|
207
186
|
}
|
|
208
187
|
|
|
209
188
|
function concatAttributes(normalizedVertexAttributes, normalizedFeatureAttributes) {
|
|
210
|
-
return {
|
|
189
|
+
return {
|
|
190
|
+
...normalizedVertexAttributes,
|
|
211
191
|
...normalizedFeatureAttributes
|
|
212
192
|
};
|
|
213
193
|
}
|
|
@@ -216,38 +196,31 @@ function normalizeAttribute(attribute) {
|
|
|
216
196
|
if (!attribute) {
|
|
217
197
|
return attribute;
|
|
218
198
|
}
|
|
219
|
-
|
|
220
199
|
attribute.normalized = true;
|
|
221
200
|
return attribute;
|
|
222
201
|
}
|
|
223
|
-
|
|
224
202
|
function parseHeaders(arrayBuffer, options) {
|
|
225
203
|
let byteOffset = 0;
|
|
226
204
|
let vertexCount = 0;
|
|
227
205
|
let featureCount = 0;
|
|
228
|
-
|
|
229
206
|
for (const {
|
|
230
207
|
property,
|
|
231
208
|
type
|
|
232
209
|
} of options.store.defaultGeometrySchema.header) {
|
|
233
210
|
const TypedArrayTypeHeader = getConstructorForDataFormat(type);
|
|
234
|
-
|
|
235
211
|
switch (property) {
|
|
236
212
|
case HeaderAttributeProperty.vertexCount:
|
|
237
213
|
vertexCount = new TypedArrayTypeHeader(arrayBuffer, 0, 4)[0];
|
|
238
214
|
byteOffset += sizeOf(type);
|
|
239
215
|
break;
|
|
240
|
-
|
|
241
216
|
case HeaderAttributeProperty.featureCount:
|
|
242
217
|
featureCount = new TypedArrayTypeHeader(arrayBuffer, 4, 4)[0];
|
|
243
218
|
byteOffset += sizeOf(type);
|
|
244
219
|
break;
|
|
245
|
-
|
|
246
220
|
default:
|
|
247
221
|
break;
|
|
248
222
|
}
|
|
249
223
|
}
|
|
250
|
-
|
|
251
224
|
return {
|
|
252
225
|
vertexCount,
|
|
253
226
|
featureCount,
|
|
@@ -264,42 +237,35 @@ function normalizeAttributes(arrayBuffer, byteOffset, vertexAttributes, attribut
|
|
|
264
237
|
valueType,
|
|
265
238
|
valuesPerElement
|
|
266
239
|
} = vertexAttributes[attribute];
|
|
267
|
-
|
|
268
240
|
if (byteOffset + attributeCount * valuesPerElement * sizeOf(valueType) <= arrayBuffer.byteLength) {
|
|
269
241
|
const buffer = arrayBuffer.slice(byteOffset);
|
|
270
242
|
let value;
|
|
271
|
-
|
|
272
243
|
if (valueType === 'UInt64') {
|
|
273
244
|
value = parseUint64Values(buffer, attributeCount * valuesPerElement, sizeOf(valueType));
|
|
274
245
|
} else {
|
|
275
246
|
const TypedArrayType = getConstructorForDataFormat(valueType);
|
|
276
247
|
value = new TypedArrayType(buffer, 0, attributeCount * valuesPerElement);
|
|
277
248
|
}
|
|
278
|
-
|
|
279
249
|
attributes[attribute] = {
|
|
280
250
|
value,
|
|
281
251
|
type: GL_TYPE_MAP[valueType],
|
|
282
252
|
size: valuesPerElement
|
|
283
253
|
};
|
|
284
|
-
|
|
285
254
|
switch (attribute) {
|
|
286
255
|
case 'color':
|
|
287
256
|
attributes.color.normalized = true;
|
|
288
257
|
break;
|
|
289
|
-
|
|
290
258
|
case 'position':
|
|
291
259
|
case 'region':
|
|
292
260
|
case 'normal':
|
|
293
261
|
default:
|
|
294
262
|
}
|
|
295
|
-
|
|
296
263
|
byteOffset = byteOffset + attributeCount * valuesPerElement * sizeOf(valueType);
|
|
297
264
|
} else if (attribute !== 'uv0') {
|
|
298
265
|
break;
|
|
299
266
|
}
|
|
300
267
|
}
|
|
301
268
|
}
|
|
302
|
-
|
|
303
269
|
return {
|
|
304
270
|
attributes,
|
|
305
271
|
byteOffset
|
|
@@ -310,7 +276,6 @@ function parseUint64Values(buffer, elementsCount, attributeSize) {
|
|
|
310
276
|
const values = [];
|
|
311
277
|
const dataView = new DataView(buffer);
|
|
312
278
|
let offset = 0;
|
|
313
|
-
|
|
314
279
|
for (let index = 0; index < elementsCount; index++) {
|
|
315
280
|
const left = dataView.getUint32(offset, true);
|
|
316
281
|
const right = dataView.getUint32(offset + 4, true);
|
|
@@ -318,10 +283,8 @@ function parseUint64Values(buffer, elementsCount, attributeSize) {
|
|
|
318
283
|
values.push(value);
|
|
319
284
|
offset += attributeSize;
|
|
320
285
|
}
|
|
321
|
-
|
|
322
286
|
return new Uint32Array(values);
|
|
323
287
|
}
|
|
324
|
-
|
|
325
288
|
function parsePositions(attribute, options) {
|
|
326
289
|
const mbs = options.mbs;
|
|
327
290
|
const value = attribute.value;
|
|
@@ -335,30 +298,28 @@ function parsePositions(attribute, options) {
|
|
|
335
298
|
return enuMatrix;
|
|
336
299
|
}
|
|
337
300
|
|
|
338
|
-
function offsetsToCartesians(vertices
|
|
301
|
+
function offsetsToCartesians(vertices) {
|
|
302
|
+
let metadata = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
303
|
+
let cartographicOrigin = arguments.length > 2 ? arguments[2] : undefined;
|
|
339
304
|
const positions = new Float64Array(vertices.length);
|
|
340
305
|
const scaleX = metadata['i3s-scale_x'] && metadata['i3s-scale_x'].double || 1;
|
|
341
306
|
const scaleY = metadata['i3s-scale_y'] && metadata['i3s-scale_y'].double || 1;
|
|
342
|
-
|
|
343
307
|
for (let i = 0; i < positions.length; i += 3) {
|
|
344
308
|
positions[i] = vertices[i] * scaleX + cartographicOrigin.x;
|
|
345
309
|
positions[i + 1] = vertices[i + 1] * scaleY + cartographicOrigin.y;
|
|
346
310
|
positions[i + 2] = vertices[i + 2] + cartographicOrigin.z;
|
|
347
311
|
}
|
|
348
|
-
|
|
349
312
|
for (let i = 0; i < positions.length; i += 3) {
|
|
350
313
|
Ellipsoid.WGS84.cartographicToCartesian(positions.subarray(i, i + 3), scratchVector);
|
|
351
314
|
positions[i] = scratchVector.x;
|
|
352
315
|
positions[i + 1] = scratchVector.y;
|
|
353
316
|
positions[i + 2] = scratchVector.z;
|
|
354
317
|
}
|
|
355
|
-
|
|
356
318
|
return positions;
|
|
357
319
|
}
|
|
358
320
|
|
|
359
321
|
function getModelMatrix(positions) {
|
|
360
322
|
var _metadata$i3sScale_x, _metadata$i3sScale_y;
|
|
361
|
-
|
|
362
323
|
const metadata = positions.metadata;
|
|
363
324
|
const scaleX = (metadata === null || metadata === void 0 ? void 0 : (_metadata$i3sScale_x = metadata['i3s-scale_x']) === null || _metadata$i3sScale_x === void 0 ? void 0 : _metadata$i3sScale_x.double) || 1;
|
|
364
325
|
const scaleY = (metadata === null || metadata === void 0 ? void 0 : (_metadata$i3sScale_y = metadata['i3s-scale_y']) === null || _metadata$i3sScale_y === void 0 ? void 0 : _metadata$i3sScale_y.double) || 1;
|
|
@@ -370,10 +331,11 @@ function getModelMatrix(positions) {
|
|
|
370
331
|
|
|
371
332
|
function makePbrMaterial(materialDefinition, texture) {
|
|
372
333
|
let pbrMaterial;
|
|
373
|
-
|
|
374
334
|
if (materialDefinition) {
|
|
375
|
-
pbrMaterial = {
|
|
376
|
-
|
|
335
|
+
pbrMaterial = {
|
|
336
|
+
...materialDefinition,
|
|
337
|
+
pbrMetallicRoughness: materialDefinition.pbrMetallicRoughness ? {
|
|
338
|
+
...materialDefinition.pbrMetallicRoughness
|
|
377
339
|
} : {
|
|
378
340
|
baseColorFactor: [255, 255, 255, 255]
|
|
379
341
|
}
|
|
@@ -382,7 +344,6 @@ function makePbrMaterial(materialDefinition, texture) {
|
|
|
382
344
|
pbrMaterial = {
|
|
383
345
|
pbrMetallicRoughness: {}
|
|
384
346
|
};
|
|
385
|
-
|
|
386
347
|
if (texture) {
|
|
387
348
|
pbrMaterial.pbrMetallicRoughness.baseColorTexture = {
|
|
388
349
|
texCoord: 0
|
|
@@ -393,7 +354,6 @@ function makePbrMaterial(materialDefinition, texture) {
|
|
|
393
354
|
}
|
|
394
355
|
|
|
395
356
|
pbrMaterial.alphaCutoff = pbrMaterial.alphaCutoff || 0.25;
|
|
396
|
-
|
|
397
357
|
if (pbrMaterial.alphaMode) {
|
|
398
358
|
pbrMaterial.alphaMode = pbrMaterial.alphaMode.toUpperCase();
|
|
399
359
|
}
|
|
@@ -401,25 +361,20 @@ function makePbrMaterial(materialDefinition, texture) {
|
|
|
401
361
|
if (pbrMaterial.emissiveFactor) {
|
|
402
362
|
pbrMaterial.emissiveFactor = convertColorFormat(pbrMaterial.emissiveFactor);
|
|
403
363
|
}
|
|
404
|
-
|
|
405
364
|
if (pbrMaterial.pbrMetallicRoughness && pbrMaterial.pbrMetallicRoughness.baseColorFactor) {
|
|
406
365
|
pbrMaterial.pbrMetallicRoughness.baseColorFactor = convertColorFormat(pbrMaterial.pbrMetallicRoughness.baseColorFactor);
|
|
407
366
|
}
|
|
408
|
-
|
|
409
367
|
if (texture) {
|
|
410
368
|
setMaterialTexture(pbrMaterial, texture);
|
|
411
369
|
}
|
|
412
|
-
|
|
413
370
|
return pbrMaterial;
|
|
414
371
|
}
|
|
415
372
|
|
|
416
373
|
function convertColorFormat(colorFactor) {
|
|
417
374
|
const normalizedColor = [...colorFactor];
|
|
418
|
-
|
|
419
375
|
for (let index = 0; index < colorFactor.length; index++) {
|
|
420
376
|
normalizedColor[index] = colorFactor[index] / 255;
|
|
421
377
|
}
|
|
422
|
-
|
|
423
378
|
return normalizedColor;
|
|
424
379
|
}
|
|
425
380
|
|
|
@@ -429,25 +384,29 @@ function setMaterialTexture(material, image) {
|
|
|
429
384
|
image
|
|
430
385
|
}
|
|
431
386
|
};
|
|
432
|
-
|
|
433
387
|
if (material.pbrMetallicRoughness && material.pbrMetallicRoughness.baseColorTexture) {
|
|
434
|
-
material.pbrMetallicRoughness.baseColorTexture = {
|
|
388
|
+
material.pbrMetallicRoughness.baseColorTexture = {
|
|
389
|
+
...material.pbrMetallicRoughness.baseColorTexture,
|
|
435
390
|
texture
|
|
436
391
|
};
|
|
437
392
|
} else if (material.emissiveTexture) {
|
|
438
|
-
material.emissiveTexture = {
|
|
393
|
+
material.emissiveTexture = {
|
|
394
|
+
...material.emissiveTexture,
|
|
439
395
|
texture
|
|
440
396
|
};
|
|
441
397
|
} else if (material.pbrMetallicRoughness && material.pbrMetallicRoughness.metallicRoughnessTexture) {
|
|
442
|
-
material.pbrMetallicRoughness.metallicRoughnessTexture = {
|
|
398
|
+
material.pbrMetallicRoughness.metallicRoughnessTexture = {
|
|
399
|
+
...material.pbrMetallicRoughness.metallicRoughnessTexture,
|
|
443
400
|
texture
|
|
444
401
|
};
|
|
445
402
|
} else if (material.normalTexture) {
|
|
446
|
-
material.normalTexture = {
|
|
403
|
+
material.normalTexture = {
|
|
404
|
+
...material.normalTexture,
|
|
447
405
|
texture
|
|
448
406
|
};
|
|
449
407
|
} else if (material.occlusionTexture) {
|
|
450
|
-
material.occlusionTexture = {
|
|
408
|
+
material.occlusionTexture = {
|
|
409
|
+
...material.occlusionTexture,
|
|
451
410
|
texture
|
|
452
411
|
};
|
|
453
412
|
}
|
|
@@ -458,18 +417,15 @@ function flattenFeatureIdsByFaceRanges(normalizedFeatureAttributes) {
|
|
|
458
417
|
id,
|
|
459
418
|
faceRange
|
|
460
419
|
} = normalizedFeatureAttributes;
|
|
461
|
-
|
|
462
420
|
if (!id || !faceRange) {
|
|
463
421
|
return;
|
|
464
422
|
}
|
|
465
|
-
|
|
466
423
|
const featureIds = id.value;
|
|
467
424
|
const range = faceRange.value;
|
|
468
425
|
const featureIdsLength = range[range.length - 1] + 1;
|
|
469
426
|
const orderedFeatureIndices = new Uint32Array(featureIdsLength * 3);
|
|
470
427
|
let featureIndex = 0;
|
|
471
428
|
let startIndex = 0;
|
|
472
|
-
|
|
473
429
|
for (let index = 1; index < range.length; index += 2) {
|
|
474
430
|
const fillId = Number(featureIds[featureIndex]);
|
|
475
431
|
const endValue = range[index];
|
|
@@ -480,24 +436,20 @@ function flattenFeatureIdsByFaceRanges(normalizedFeatureAttributes) {
|
|
|
480
436
|
featureIndex++;
|
|
481
437
|
startIndex = endIndex;
|
|
482
438
|
}
|
|
483
|
-
|
|
484
439
|
normalizedFeatureAttributes.id.value = orderedFeatureIndices;
|
|
485
440
|
}
|
|
486
441
|
|
|
487
442
|
function flattenFeatureIdsByFeatureIndices(attributes, featureIds) {
|
|
488
443
|
const featureIndices = attributes.id.value;
|
|
489
444
|
const result = new Float32Array(featureIndices.length);
|
|
490
|
-
|
|
491
445
|
for (let index = 0; index < featureIndices.length; index++) {
|
|
492
446
|
result[index] = featureIds[featureIndices[index]];
|
|
493
447
|
}
|
|
494
|
-
|
|
495
448
|
attributes.id.value = result;
|
|
496
449
|
}
|
|
497
450
|
|
|
498
451
|
function getFeatureIdsFromFeatureIndexMetadata(featureIndex) {
|
|
499
452
|
var _featureIndex$metadat, _featureIndex$metadat2;
|
|
500
|
-
|
|
501
453
|
return featureIndex === null || featureIndex === void 0 ? void 0 : (_featureIndex$metadat = featureIndex.metadata) === null || _featureIndex$metadat === void 0 ? void 0 : (_featureIndex$metadat2 = _featureIndex$metadat['i3s-feature-ids']) === null || _featureIndex$metadat2 === void 0 ? void 0 : _featureIndex$metadat2.intArray;
|
|
502
454
|
}
|
|
503
455
|
//# sourceMappingURL=parse-i3s-tile-content.js.map
|