@loaders.gl/i3s 3.3.0-alpha.5 → 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.
Files changed (94) hide show
  1. package/dist/dist.min.js +984 -1291
  2. package/dist/es5/arcgis-webscene-loader.js +2 -8
  3. package/dist/es5/arcgis-webscene-loader.js.map +1 -1
  4. package/dist/es5/bundle.js +0 -1
  5. package/dist/es5/bundle.js.map +1 -1
  6. package/dist/es5/i3s-attribute-loader.js +19 -60
  7. package/dist/es5/i3s-attribute-loader.js.map +1 -1
  8. package/dist/es5/i3s-building-scene-layer-loader.js +1 -10
  9. package/dist/es5/i3s-building-scene-layer-loader.js.map +1 -1
  10. package/dist/es5/i3s-content-loader.js +1 -14
  11. package/dist/es5/i3s-content-loader.js.map +1 -1
  12. package/dist/es5/i3s-loader.js +7 -45
  13. package/dist/es5/i3s-loader.js.map +1 -1
  14. package/dist/es5/i3s-node-page-loader.js +1 -12
  15. package/dist/es5/i3s-node-page-loader.js.map +1 -1
  16. package/dist/es5/index.js +12 -18
  17. package/dist/es5/index.js.map +1 -1
  18. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +18 -78
  19. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  20. package/dist/es5/lib/parsers/constants.js +2 -18
  21. package/dist/es5/lib/parsers/constants.js.map +1 -1
  22. package/dist/es5/lib/parsers/parse-arcgis-webscene.js +128 -30
  23. package/dist/es5/lib/parsers/parse-arcgis-webscene.js.map +1 -1
  24. package/dist/es5/lib/parsers/parse-i3s-attribute.js +1 -23
  25. package/dist/es5/lib/parsers/parse-i3s-attribute.js.map +1 -1
  26. package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js +8 -25
  27. package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -1
  28. package/dist/es5/lib/parsers/parse-i3s-tile-content.js +10 -124
  29. package/dist/es5/lib/parsers/parse-i3s-tile-content.js.map +1 -1
  30. package/dist/es5/lib/parsers/parse-i3s.js +5 -36
  31. package/dist/es5/lib/parsers/parse-i3s.js.map +1 -1
  32. package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js +0 -7
  33. package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -1
  34. package/dist/es5/lib/utils/customizeColors.js +4 -53
  35. package/dist/es5/lib/utils/customizeColors.js.map +1 -1
  36. package/dist/es5/lib/utils/url-utils.js +3 -8
  37. package/dist/es5/lib/utils/url-utils.js.map +1 -1
  38. package/dist/es5/types.js +0 -3
  39. package/dist/es5/types.js.map +1 -1
  40. package/dist/es5/workers/i3s-content-nodejs-worker.js +0 -3
  41. package/dist/es5/workers/i3s-content-nodejs-worker.js.map +1 -1
  42. package/dist/es5/workers/i3s-content-worker.js +0 -2
  43. package/dist/es5/workers/i3s-content-worker.js.map +1 -1
  44. package/dist/esm/arcgis-webscene-loader.js +3 -1
  45. package/dist/esm/arcgis-webscene-loader.js.map +1 -1
  46. package/dist/esm/bundle.js +1 -1
  47. package/dist/esm/bundle.js.map +1 -1
  48. package/dist/esm/i3s-attribute-loader.js +8 -25
  49. package/dist/esm/i3s-attribute-loader.js.map +1 -1
  50. package/dist/esm/i3s-building-scene-layer-loader.js +2 -3
  51. package/dist/esm/i3s-building-scene-layer-loader.js.map +1 -1
  52. package/dist/esm/i3s-content-loader.js +2 -4
  53. package/dist/esm/i3s-content-loader.js.map +1 -1
  54. package/dist/esm/i3s-loader.js +4 -13
  55. package/dist/esm/i3s-loader.js.map +1 -1
  56. package/dist/esm/i3s-node-page-loader.js +1 -2
  57. package/dist/esm/i3s-node-page-loader.js.map +1 -1
  58. package/dist/esm/index.js.map +1 -1
  59. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +2 -45
  60. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  61. package/dist/esm/lib/parsers/constants.js +1 -10
  62. package/dist/esm/lib/parsers/constants.js.map +1 -1
  63. package/dist/esm/lib/parsers/parse-arcgis-webscene.js +50 -11
  64. package/dist/esm/lib/parsers/parse-arcgis-webscene.js.map +1 -1
  65. package/dist/esm/lib/parsers/parse-i3s-attribute.js +1 -8
  66. package/dist/esm/lib/parsers/parse-i3s-attribute.js.map +1 -1
  67. package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js +1 -4
  68. package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -1
  69. package/dist/esm/lib/parsers/parse-i3s-tile-content.js +23 -71
  70. package/dist/esm/lib/parsers/parse-i3s-tile-content.js.map +1 -1
  71. package/dist/esm/lib/parsers/parse-i3s.js +15 -17
  72. package/dist/esm/lib/parsers/parse-i3s.js.map +1 -1
  73. package/dist/esm/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -1
  74. package/dist/esm/lib/utils/customizeColors.js +24 -36
  75. package/dist/esm/lib/utils/customizeColors.js.map +1 -1
  76. package/dist/esm/lib/utils/url-utils.js +5 -5
  77. package/dist/esm/lib/utils/url-utils.js.map +1 -1
  78. package/dist/esm/types.js +0 -3
  79. package/dist/esm/types.js.map +1 -1
  80. package/dist/esm/workers/i3s-content-nodejs-worker.js.map +1 -1
  81. package/dist/esm/workers/i3s-content-worker.js.map +1 -1
  82. package/dist/i3s-content-nodejs-worker.js +61 -60
  83. package/dist/i3s-content-nodejs-worker.js.map +3 -3
  84. package/dist/i3s-content-worker.js +490 -1020
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/lib/parsers/parse-arcgis-webscene.d.ts.map +1 -1
  88. package/dist/lib/parsers/parse-arcgis-webscene.js +49 -7
  89. package/dist/types.d.ts +1 -0
  90. package/dist/types.d.ts.map +1 -1
  91. package/package.json +8 -8
  92. package/src/index.ts +2 -1
  93. package/src/lib/parsers/parse-arcgis-webscene.ts +57 -7
  94. package/src/types.ts +1 -0
@@ -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 SUPPORTED_LAYERS_TYPES = [ARCGIS_SCENE_SERVER_LAYER_TYPE, INTEGRATED_MESH_LAYER, BUILDING_SCENE_LAYER];
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: parseOperationalLayers(operationalLayers)
26
+ layers,
27
+ unsupportedLayers
13
28
  };
14
29
  }
15
30
 
16
- function parseOperationalLayers(layersList) {
17
- let layers = [];
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 (SUPPORTED_LAYERS_TYPES.includes(layer.layerType)) {
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
- layers = [...layers, ...parseOperationalLayers(layer.layers)];
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
- return layers;
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,"sources":["../../../../src/lib/parsers/parse-arcgis-webscene.ts"],"names":["ARCGIS_SCENE_SERVER_LAYER_TYPE","BUILDING_SCENE_LAYER","INTEGRATED_MESH_LAYER","SUPPORTED_LAYERS_TYPES","parseWebscene","data","layer0","JSON","parse","TextDecoder","decode","operationalLayers","header","layers","parseOperationalLayers","layersList","index","length","layer","includes","layerType","push"],"mappings":"AAEA,MAAMA,8BAA8B,GAAG,yBAAvC;AACA,MAAMC,oBAAoB,GAAG,oBAA7B;AACA,MAAMC,qBAAqB,GAAG,qBAA9B;AAMA,MAAMC,sBAAsB,GAAG,CAC7BH,8BAD6B,EAE7BE,qBAF6B,EAG7BD,oBAH6B,CAA/B;AAUA,OAAO,eAAeG,aAAf,CAA6BC,IAA7B,EAA6E;AAClF,QAAMC,MAAM,GAAGC,IAAI,CAACC,KAAL,CAAW,IAAIC,WAAJ,GAAkBC,MAAlB,CAAyBL,IAAzB,CAAX,CAAf;AACA,QAAM;AAACM,IAAAA;AAAD,MAAsBL,MAA5B;AAEA,SAAO;AACLM,IAAAA,MAAM,EAAEN,MADH;AAELO,IAAAA,MAAM,EAAEC,sBAAsB,CAACH,iBAAD;AAFzB,GAAP;AAID;;AAMD,SAASG,sBAAT,CAAgCC,UAAhC,EAAoF;AAClF,MAAIF,MAA0B,GAAG,EAAjC;;AAEA,OAAK,IAAIG,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAGD,UAAU,CAACE,MAAvC,EAA+CD,KAAK,EAApD,EAAwD;AAAA;;AACtD,UAAME,KAAK,GAAGH,UAAU,CAACC,KAAD,CAAxB;;AAEA,QAAIb,sBAAsB,CAACgB,QAAvB,CAAgCD,KAAK,CAACE,SAAtC,CAAJ,EAAsD;AACpDP,MAAAA,MAAM,CAACQ,IAAP,CAAYH,KAAZ;AACD;;AAED,yBAAIA,KAAK,CAACL,MAAV,0CAAI,cAAcI,MAAlB,EAA0B;AACxBJ,MAAAA,MAAM,GAAG,CAAC,GAAGA,MAAJ,EAAY,GAAGC,sBAAsB,CAACI,KAAK,CAACL,MAAP,CAArC,CAAT;AACD;AACF;;AAED,SAAOA,MAAP;AACD","sourcesContent":["import type {ArcGisWebSceneData, OperationalLayer} from '../../types';\n\nconst ARCGIS_SCENE_SERVER_LAYER_TYPE = 'ArcGISSceneServiceLayer';\nconst BUILDING_SCENE_LAYER = 'BuildingSceneLayer';\nconst INTEGRATED_MESH_LAYER = 'IntegratedMeshLayer';\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];\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\n return {\n header: layer0,\n layers: parseOperationalLayers(operationalLayers)\n };\n}\n\n/**\n * Recursively parses WebScene operational layers.\n * @param layersList\n */\nfunction parseOperationalLayers(layersList: OperationalLayer[]): OperationalLayer[] {\n let layers: OperationalLayer[] = [];\n\n for (let index = 0; index < layersList.length; index++) {\n const layer = layersList[index];\n\n if (SUPPORTED_LAYERS_TYPES.includes(layer.layerType)) {\n layers.push(layer);\n }\n\n if (layer.layers?.length) {\n layers = [...layers, ...parseOperationalLayers(layer.layers)];\n }\n }\n\n return layers;\n}\n"],"file":"parse-arcgis-webscene.js"}
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,"sources":["../../../../src/lib/parsers/parse-i3s-attribute.ts"],"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"],"mappings":"AAAA,SACEA,qBADF,EAEEC,wBAFF,EAGEC,aAHF,EAIEC,qBAJF,QAKO,aALP;AAaA,OAAO,eAAeC,qBAAf,CAAqCC,WAArC,EAAkDC,OAAlD,EAA2D;AAChE,QAAM;AAACC,IAAAA,aAAD;AAAgBC,IAAAA;AAAhB,MAAiCF,OAAvC;;AAEA,MAAI,CAACC,aAAL,EAAoB;AAClB,WAAO,EAAP;AACD;;AACD,SAAO;AACL,KAACA,aAAD,GAAiBC,aAAa,GAAGC,cAAc,CAACD,aAAD,EAAgBH,WAAhB,CAAjB,GAAgD;AADzE,GAAP;AAGD;;AAQD,SAASI,cAAT,CAAwBD,aAAxB,EAAuCH,WAAvC,EAAoD;AAClD,UAAQG,aAAR;AACE,SAAKR,qBAAL;AACE,aAAOU,qBAAqB,CAACL,WAAD,CAA5B;;AACF,SAAKJ,wBAAL;AACE,aAAOU,yBAAyB,CAACN,WAAD,CAAhC;;AACF,SAAKH,aAAL;AACE,aAAOU,mBAAmB,CAACP,WAAD,CAA1B;;AACF,SAAKF,qBAAL;AACE,aAAOU,8BAA8B,CAACR,WAAD,CAArC;;AACF;AACE,aAAOM,yBAAyB,CAACN,WAAD,CAAhC;AAVJ;AAYD;;AAQD,SAASM,yBAAT,CAAmCN,WAAnC,EAAgD;AAC9C,QAAMS,WAAW,GAAG,CAApB;AACA,SAAO,IAAIC,WAAJ,CAAgBV,WAAhB,EAA6BS,WAA7B,CAAP;AACD;;AAQD,SAASD,8BAAT,CAAwCR,WAAxC,EAAqD;AACnD,QAAMS,WAAW,GAAG,CAApB;AACA,SAAO,IAAIE,UAAJ,CAAeX,WAAf,EAA4BS,WAA5B,CAAP;AACD;;AAQD,SAASF,mBAAT,CAA6BP,WAA7B,EAA0C;AACxC,QAAMS,WAAW,GAAG,CAApB;AACA,SAAO,IAAIG,YAAJ,CAAiBZ,WAAjB,EAA8BS,WAA9B,CAAP;AACD;;AAQD,SAASJ,qBAAT,CAA+BL,WAA/B,EAAmE;AACjE,QAAMa,kBAAkB,GAAG,CAA3B;AACA,QAAMC,UAAU,GAAG,CAAnB;AACA,QAAMC,kBAAkB,GAAG,CAA3B;AACA,QAAMC,YAAsB,GAAG,EAA/B;;AAEA,MAAI;AAEF,UAAMC,YAAY,GAAG,IAAIC,QAAJ,CACnBlB,WADmB,EAEnBa,kBAFmB,EAGnBE,kBAHmB,EAInBI,SAJmB,CAITN,kBAJS,EAIW,IAJX,CAArB;AAKA,UAAMO,WAAW,GAAG,IAAIV,WAAJ,CAAgBV,WAAhB,EAA6Bc,UAA7B,EAAyCG,YAAzC,CAApB;AACA,QAAII,YAAY,GAAGP,UAAU,GAAGG,YAAY,GAAGF,kBAA/C;;AAEA,SAAK,MAAMO,cAAX,IAA6BF,WAA7B,EAA0C;AACxC,YAAMG,WAAW,GAAG,IAAIC,WAAJ,CAAgB,OAAhB,CAApB;AACA,YAAMC,eAAe,GAAG,IAAIC,UAAJ,CAAe1B,WAAf,EAA4BqB,YAA5B,EAA0CC,cAA1C,CAAxB;AACAN,MAAAA,YAAY,CAACW,IAAb,CAAkBJ,WAAW,CAACK,MAAZ,CAAmBH,eAAnB,CAAlB;AACAJ,MAAAA,YAAY,IAAIC,cAAhB;AACD;AACF,GAhBD,CAgBE,OAAOO,KAAP,EAAc;AACdC,IAAAA,OAAO,CAACD,KAAR,CAAc,gCAAd,EAAiDA,KAAD,CAAiBE,OAAjE;AACD;;AAED,SAAOf,YAAP;AACD","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"],"file":"parse-i3s-attribute.js"}
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,"sources":["../../../../src/lib/parsers/parse-i3s-building-scene-layer.ts"],"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"],"mappings":"AAEA,MAAMA,oBAAoB,GAAG,UAA7B;AAQA,OAAO,eAAeC,uBAAf,CACLC,IADK,EAELC,GAFK,EAG+B;AACpC,QAAMC,MAAM,GAAGC,IAAI,CAACC,KAAL,CAAW,IAAIC,WAAJ,GAAkBC,MAAlB,CAAyBN,IAAzB,CAAX,CAAf;AACA,QAAM;AAACO,IAAAA;AAAD,MAAcL,MAApB;AAEA,SAAO;AACLM,IAAAA,MAAM,EAAEN,MADH;AAELK,IAAAA,SAAS,EAAEE,kBAAkB,CAACF,SAAD,EAAYN,GAAZ;AAFxB,GAAP;AAID;;AAOD,SAASQ,kBAAT,CACEF,SADF,EAEEN,GAFF,EAG2B;AACzB,MAAIS,MAA+B,GAAG,EAAtC;;AAEA,OAAK,IAAIC,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAGJ,SAAS,CAACK,MAAtC,EAA8CD,KAAK,EAAnD,EAAuD;AAAA;;AACrD,UAAME,QAAQ,GAAGN,SAAS,CAACI,KAAD,CAA1B;AACA,UAAM;AAACG,MAAAA,EAAD;AAAKC,MAAAA,SAAL;AAAgBC,MAAAA,UAAU,GAAG,IAA7B;AAAmC,SAAGC;AAAtC,QAA8CJ,QAApD;;AAGA,QAAIE,SAAS,KAAKjB,oBAAlB,EAAwC;AACtC,YAAMoB,WAAW,aAAMjB,GAAN,wBAAuBa,EAAvB,CAAjB;AAEAJ,MAAAA,MAAM,CAACS,IAAP,CAAY;AACVlB,QAAAA,GAAG,EAAEiB,WADK;AAEVJ,QAAAA,EAFU;AAGVC,QAAAA,SAHU;AAIVC,QAAAA,UAJU;AAKV,WAAGC;AALO,OAAZ;AAOD;;AAED,QAAIJ,QAAJ,aAAIA,QAAJ,sCAAIA,QAAQ,CAAEN,SAAd,gDAAI,oBAAqBK,MAAzB,EAAiC;AAC/BF,MAAAA,MAAM,GAAG,CAAC,GAAGA,MAAJ,EAAY,GAAGD,kBAAkB,CAACI,QAAQ,CAACN,SAAV,EAAqBN,GAArB,CAAjC,CAAT;AACD;AACF;;AAED,SAAOS,MAAP;AACD","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"],"file":"parse-i3s-building-scene-layer.js"}
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 = { ...tileOptions.textureLoaderOptions,
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 { ...normalizedVertexAttributes,
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, metadata = {}, cartographicOrigin) {
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 = { ...materialDefinition,
376
- pbrMetallicRoughness: materialDefinition.pbrMetallicRoughness ? { ...materialDefinition.pbrMetallicRoughness
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 = { ...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 = { ...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 = { ...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 = { ...material.normalTexture,
403
+ material.normalTexture = {
404
+ ...material.normalTexture,
447
405
  texture
448
406
  };
449
407
  } else if (material.occlusionTexture) {
450
- material.occlusionTexture = { ...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