@loaders.gl/i3s 3.1.0-alpha.3 → 4.0.0-alpha.4

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 (39) hide show
  1. package/dist/i3s-attribute-loader.js +44 -14
  2. package/dist/i3s-attribute-loader.js.map +1 -1
  3. package/dist/i3s-building-scene-layer-loader.js +21 -0
  4. package/dist/i3s-building-scene-layer-loader.js.map +1 -0
  5. package/dist/i3s-content-loader.js +1 -1
  6. package/dist/i3s-content-worker.js +7549 -2
  7. package/dist/i3s-loader.js +5 -2
  8. package/dist/i3s-loader.js.map +1 -1
  9. package/dist/i3s-node-page-loader.js +1 -1
  10. package/dist/index.js +2 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/lib/helpers/i3s-nodepages-tiles.js +27 -20
  13. package/dist/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  14. package/dist/lib/parsers/constants.js +8 -0
  15. package/dist/lib/parsers/constants.js.map +1 -1
  16. package/dist/lib/parsers/parse-i3s-attribute.js +9 -1
  17. package/dist/lib/parsers/parse-i3s-attribute.js.map +1 -1
  18. package/dist/lib/parsers/parse-i3s-building-scene-layer.js +43 -0
  19. package/dist/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -0
  20. package/dist/lib/parsers/parse-i3s-tile-content.js +49 -32
  21. package/dist/lib/parsers/parse-i3s-tile-content.js.map +1 -1
  22. package/dist/lib/parsers/parse-i3s.js +4 -4
  23. package/dist/lib/parsers/parse-i3s.js.map +1 -1
  24. package/dist/lib/utils/url-utils.js +3 -3
  25. package/dist/lib/utils/url-utils.js.map +1 -1
  26. package/package.json +13 -11
  27. package/src/i3s-attribute-loader.ts +56 -19
  28. package/src/i3s-building-scene-layer-loader.ts +34 -0
  29. package/src/i3s-loader.ts +4 -1
  30. package/src/index.ts +2 -0
  31. package/src/lib/helpers/i3s-nodepages-tiles.ts +28 -12
  32. package/src/lib/parsers/constants.ts +22 -0
  33. package/src/lib/parsers/parse-i3s-attribute.ts +19 -1
  34. package/src/lib/parsers/parse-i3s-building-scene-layer.ts +57 -0
  35. package/src/lib/parsers/parse-i3s-tile-content.ts +51 -31
  36. package/src/types.ts +102 -6
  37. package/dist/dist.min.js +0 -2
  38. package/dist/dist.min.js.map +0 -1
  39. package/dist/i3s-content-worker.js.map +0 -1
@@ -1,7 +1,8 @@
1
1
  import { load, parse } from '@loaders.gl/core';
2
2
  import { I3SContentLoader } from './i3s-content-loader';
3
3
  import { normalizeTileData, normalizeTilesetData } from './lib/parsers/parse-i3s';
4
- const VERSION = typeof "3.1.0-alpha.3" !== 'undefined' ? "3.1.0-alpha.3" : 'latest';
4
+ import { COORDINATE_SYSTEM } from './lib/parsers/constants';
5
+ const VERSION = typeof "4.0.0-alpha.4" !== 'undefined' ? "4.0.0-alpha.4" : 'latest';
5
6
  const TILESET_REGEX = /layers\/[0-9]+$/;
6
7
  const TILE_HEADER_REGEX = /nodes\/([0-9-]+|root)$/;
7
8
  const SLPK_HEX = '504b0304';
@@ -22,7 +23,9 @@ export const I3SLoader = {
22
23
  tile: null,
23
24
  tileset: null,
24
25
  useDracoGeometry: true,
25
- useCompressedTextures: true
26
+ useCompressedTextures: true,
27
+ decodeTextures: true,
28
+ coordinateSystem: COORDINATE_SYSTEM.METER_OFFSETS
26
29
  }
27
30
  }
28
31
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i3s-loader.ts"],"names":["load","parse","I3SContentLoader","normalizeTileData","normalizeTilesetData","VERSION","TILESET_REGEX","TILE_HEADER_REGEX","SLPK_HEX","I3SLoader","name","id","module","version","mimeTypes","parseI3S","extensions","options","i3s","loadContent","token","isTileset","isTileHeader","tile","tileset","useDracoGeometry","useCompressedTextures","data","context","url","magicNumber","getMagicNumber","Error","test","parseTileset","parseTile","contentUrl","parseTileContent","arrayBuffer","tilesetJson","JSON","TextDecoder","decode","loader","ArrayBuffer","Uint8Array","map","value","toString","padStart","join"],"mappings":"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","sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {load, parse} from '@loaders.gl/core';\nimport {I3SContentLoader} from './i3s-content-loader';\nimport {normalizeTileData, normalizeTilesetData} from './lib/parsers/parse-i3s';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nconst TILESET_REGEX = /layers\\/[0-9]+$/;\nconst TILE_HEADER_REGEX = /nodes\\/([0-9-]+|root)$/;\nconst SLPK_HEX = '504b0304';\n\n/**\n * Loader for I3S - Indexed 3D Scene Layer\n */\nexport const I3SLoader: LoaderWithParser = {\n name: 'I3S (Indexed Scene Layers)',\n id: 'i3s',\n module: 'i3s',\n version: VERSION,\n mimeTypes: ['application/octet-stream'],\n parse: parseI3S,\n extensions: ['bin'],\n options: {\n i3s: {\n loadContent: true,\n token: null,\n isTileset: 'auto',\n isTileHeader: 'auto',\n tile: null,\n tileset: null,\n useDracoGeometry: true,\n useCompressedTextures: true\n }\n }\n};\n\nasync function parseI3S(data, options, context) {\n const url = context.url;\n options.i3s = options.i3s || {};\n const magicNumber = getMagicNumber(data);\n\n // check if file is slpk\n if (magicNumber === SLPK_HEX) {\n throw new Error('Files with .slpk extention currently are not supported by I3SLoader');\n }\n\n // auto detect file type based on url\n let isTileset;\n if (options.i3s.isTileset === 'auto') {\n isTileset = TILESET_REGEX.test(url);\n } else {\n isTileset = options.i3s.isTileset;\n }\n\n let isTileHeader;\n if (options.isTileHeader === 'auto') {\n isTileHeader = TILE_HEADER_REGEX.test(url);\n } else {\n isTileHeader = options.i3s.isTileHeader;\n }\n\n if (isTileset) {\n data = await parseTileset(data, options, context);\n } else if (isTileHeader) {\n data = await parseTile(data, options, context);\n if (options.i3s.loadContent) {\n options.i3s.tile = data;\n await load(data.contentUrl, I3SLoader, options);\n }\n } else {\n data = await parseTileContent(data, options);\n }\n\n return data;\n}\n\nasync function parseTileContent(arrayBuffer, options) {\n return await parse(arrayBuffer, I3SContentLoader, options);\n}\n\nasync function parseTileset(data, options, context) {\n const tilesetJson = JSON.parse(new TextDecoder().decode(data));\n // eslint-disable-next-line no-use-before-define\n tilesetJson.loader = I3SLoader;\n await normalizeTilesetData(tilesetJson, options, context);\n\n return tilesetJson;\n}\n\nasync function parseTile(data, options, context) {\n data = JSON.parse(new TextDecoder().decode(data));\n return normalizeTileData(data, options, context);\n}\n\nfunction getMagicNumber(data) {\n if (data instanceof ArrayBuffer) {\n // slice binary data (4 bytes from the beginning) and transform it to hexadecimal numeral system\n return [...new Uint8Array(data, 0, 4)]\n .map((value) => value.toString(16).padStart(2, '0'))\n .join('');\n }\n return null;\n}\n"],"file":"i3s-loader.js"}
1
+ {"version":3,"sources":["../src/i3s-loader.ts"],"names":["load","parse","I3SContentLoader","normalizeTileData","normalizeTilesetData","COORDINATE_SYSTEM","VERSION","TILESET_REGEX","TILE_HEADER_REGEX","SLPK_HEX","I3SLoader","name","id","module","version","mimeTypes","parseI3S","extensions","options","i3s","loadContent","token","isTileset","isTileHeader","tile","tileset","useDracoGeometry","useCompressedTextures","decodeTextures","coordinateSystem","METER_OFFSETS","data","context","url","magicNumber","getMagicNumber","Error","test","parseTileset","parseTile","contentUrl","parseTileContent","arrayBuffer","tilesetJson","JSON","TextDecoder","decode","loader","ArrayBuffer","Uint8Array","map","value","toString","padStart","join"],"mappings":"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","sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {load, parse} from '@loaders.gl/core';\nimport {I3SContentLoader} from './i3s-content-loader';\nimport {normalizeTileData, normalizeTilesetData} from './lib/parsers/parse-i3s';\nimport {COORDINATE_SYSTEM} from './lib/parsers/constants';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nconst TILESET_REGEX = /layers\\/[0-9]+$/;\nconst TILE_HEADER_REGEX = /nodes\\/([0-9-]+|root)$/;\nconst SLPK_HEX = '504b0304';\n\n/**\n * Loader for I3S - Indexed 3D Scene Layer\n */\nexport const I3SLoader: LoaderWithParser = {\n name: 'I3S (Indexed Scene Layers)',\n id: 'i3s',\n module: 'i3s',\n version: VERSION,\n mimeTypes: ['application/octet-stream'],\n parse: parseI3S,\n extensions: ['bin'],\n options: {\n i3s: {\n loadContent: true,\n token: null,\n isTileset: 'auto',\n isTileHeader: 'auto',\n tile: null,\n tileset: null,\n useDracoGeometry: true,\n useCompressedTextures: true,\n decodeTextures: true,\n coordinateSystem: COORDINATE_SYSTEM.METER_OFFSETS\n }\n }\n};\n\nasync function parseI3S(data, options, context) {\n const url = context.url;\n options.i3s = options.i3s || {};\n const magicNumber = getMagicNumber(data);\n\n // check if file is slpk\n if (magicNumber === SLPK_HEX) {\n throw new Error('Files with .slpk extention currently are not supported by I3SLoader');\n }\n\n // auto detect file type based on url\n let isTileset;\n if (options.i3s.isTileset === 'auto') {\n isTileset = TILESET_REGEX.test(url);\n } else {\n isTileset = options.i3s.isTileset;\n }\n\n let isTileHeader;\n if (options.isTileHeader === 'auto') {\n isTileHeader = TILE_HEADER_REGEX.test(url);\n } else {\n isTileHeader = options.i3s.isTileHeader;\n }\n\n if (isTileset) {\n data = await parseTileset(data, options, context);\n } else if (isTileHeader) {\n data = await parseTile(data, options, context);\n if (options.i3s.loadContent) {\n options.i3s.tile = data;\n await load(data.contentUrl, I3SLoader, options);\n }\n } else {\n data = await parseTileContent(data, options);\n }\n\n return data;\n}\n\nasync function parseTileContent(arrayBuffer, options) {\n return await parse(arrayBuffer, I3SContentLoader, options);\n}\n\nasync function parseTileset(data, options, context) {\n const tilesetJson = JSON.parse(new TextDecoder().decode(data));\n // eslint-disable-next-line no-use-before-define\n tilesetJson.loader = I3SLoader;\n await normalizeTilesetData(tilesetJson, options, context);\n\n return tilesetJson;\n}\n\nasync function parseTile(data, options, context) {\n data = JSON.parse(new TextDecoder().decode(data));\n return normalizeTileData(data, options, context);\n}\n\nfunction getMagicNumber(data) {\n if (data instanceof ArrayBuffer) {\n // slice binary data (4 bytes from the beginning) and transform it to hexadecimal numeral system\n return [...new Uint8Array(data, 0, 4)]\n .map((value) => value.toString(16).padStart(2, '0'))\n .join('');\n }\n return null;\n}\n"],"file":"i3s-loader.js"}
@@ -1,4 +1,4 @@
1
- const VERSION = typeof "3.1.0-alpha.3" !== 'undefined' ? "3.1.0-alpha.3" : 'latest';
1
+ const VERSION = typeof "4.0.0-alpha.4" !== 'undefined' ? "4.0.0-alpha.4" : 'latest';
2
2
 
3
3
  async function parseNodePage(data) {
4
4
  return JSON.parse(new TextDecoder().decode(data));
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export { I3SLoader } from './i3s-loader';
2
2
  export { I3SContentLoader } from './i3s-content-loader';
3
3
  export { I3SAttributeLoader, loadFeatureAttributes } from './i3s-attribute-loader';
4
+ export { I3SBuildingSceneLayerLoader } from './i3s-building-scene-layer-loader';
5
+ export { COORDINATE_SYSTEM } from './lib/parsers/constants';
4
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["I3SLoader","I3SContentLoader","I3SAttributeLoader","loadFeatureAttributes"],"mappings":"AAAA,SAAQA,SAAR,QAAwB,cAAxB;AACA,SAAQC,gBAAR,QAA+B,sBAA/B;AACA,SAAQC,kBAAR,EAA4BC,qBAA5B,QAAwD,wBAAxD","sourcesContent":["export {I3SLoader} from './i3s-loader';\nexport {I3SContentLoader} from './i3s-content-loader';\nexport {I3SAttributeLoader, loadFeatureAttributes} from './i3s-attribute-loader';\nexport type {\n BoundingVolumes,\n Mbs,\n Obb,\n SceneLayer3D,\n AttributeStorageInfo,\n Field,\n ESRIField,\n PopupInfo,\n Node3DIndexDocument,\n LodSelection,\n NodeReference,\n Resource,\n I3SGeometry,\n MaxScreenThresholdSQ,\n NodeInPage,\n SharedResources,\n TextureImage,\n Attribute,\n Extent,\n FeatureAttribute\n} from './types';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["I3SLoader","I3SContentLoader","I3SAttributeLoader","loadFeatureAttributes","I3SBuildingSceneLayerLoader","COORDINATE_SYSTEM"],"mappings":"AAAA,SAAQA,SAAR,QAAwB,cAAxB;AACA,SAAQC,gBAAR,QAA+B,sBAA/B;AACA,SAAQC,kBAAR,EAA4BC,qBAA5B,QAAwD,wBAAxD;AACA,SAAQC,2BAAR,QAA0C,mCAA1C;AAuBA,SAAQC,iBAAR,QAAgC,yBAAhC","sourcesContent":["export {I3SLoader} from './i3s-loader';\nexport {I3SContentLoader} from './i3s-content-loader';\nexport {I3SAttributeLoader, loadFeatureAttributes} from './i3s-attribute-loader';\nexport {I3SBuildingSceneLayerLoader} from './i3s-building-scene-layer-loader';\nexport type {\n BoundingVolumes,\n Mbs,\n Obb,\n SceneLayer3D,\n AttributeStorageInfo,\n Field,\n ESRIField,\n PopupInfo,\n Node3DIndexDocument,\n LodSelection,\n NodeReference,\n Resource,\n I3SGeometry,\n MaxScreenThresholdSQ,\n NodeInPage,\n SharedResources,\n TextureImage,\n Attribute,\n Extent,\n FeatureAttribute\n} from './types';\nexport {COORDINATE_SYSTEM} from './lib/parsers/constants';\n"],"file":"index.js"}
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import { load } from '@loaders.gl/core';
3
- import { getSupportedGPUTextureFormats } from '@loaders.gl/textures';
3
+ import { getSupportedGPUTextureFormats, selectSupportedBasisFormat } from '@loaders.gl/textures';
4
4
  import { I3SNodePageLoader } from '../../i3s-node-page-loader';
5
5
  import { normalizeTileNonUrlData } from '../parsers/parse-i3s';
6
6
  import { getUrlWithToken, generateTilesetAttributeUrls } from '../utils/url-utils';
@@ -20,13 +20,14 @@ export default class I3SNodePagesTiles {
20
20
 
21
21
  _defineProperty(this, "textureDefinitionsSelectedFormats", []);
22
22
 
23
+ _defineProperty(this, "textureLoaderOptions", {});
24
+
23
25
  this.tileset = { ...tileset
24
26
  };
25
27
  this.nodesPerPage = tileset.nodePages.nodesPerPage;
26
28
  this.lodSelectionMetricType = tileset.nodePages.lodSelectionMetricType;
27
29
  this.options = options;
28
-
29
- this._initSelectedFormatsForTextureDefinitions(tileset);
30
+ this.initSelectedFormatsForTextureDefinitions(tileset);
30
31
  }
31
32
 
32
33
  async getNodeById(id) {
@@ -35,7 +36,7 @@ export default class I3SNodePagesTiles {
35
36
  if (!this.nodePages[pageIndex] && !this.pendingNodePages[pageIndex]) {
36
37
  var _this$options$i3s;
37
38
 
38
- const nodePageUrl = getUrlWithToken(`${this.tileset.url}/nodepages/${pageIndex}`, (_this$options$i3s = this.options.i3s) === null || _this$options$i3s === void 0 ? void 0 : _this$options$i3s.token);
39
+ const nodePageUrl = getUrlWithToken("".concat(this.tileset.url, "/nodepages/").concat(pageIndex), (_this$options$i3s = this.options.i3s) === null || _this$options$i3s === void 0 ? void 0 : _this$options$i3s.token);
39
40
  this.pendingNodePages[pageIndex] = {
40
41
  status: 'Pending',
41
42
  promise: load(nodePageUrl, I3SNodePageLoader, this.options)
@@ -75,20 +76,18 @@ export default class I3SNodePagesTiles {
75
76
  const {
76
77
  url,
77
78
  isDracoGeometry: isDracoGeometryResult
78
- } = node.mesh.geometry && this._getContentUrl(node.mesh.geometry) || {
79
+ } = node.mesh.geometry && this.getContentUrl(node.mesh.geometry) || {
79
80
  url: null,
80
81
  isDracoGeometry: null
81
82
  };
82
83
  contentUrl = url;
83
84
  isDracoGeometry = isDracoGeometryResult;
84
-
85
- const [textureData, nodeMaterialDefinition] = this._getInformationFromMaterial(node.mesh.material);
86
-
85
+ const [textureData, nodeMaterialDefinition] = this.getInformationFromMaterial(node.mesh.material);
87
86
  materialDefinition = nodeMaterialDefinition;
88
87
  textureFormat = textureData.format || textureFormat;
89
88
 
90
89
  if (textureData.name) {
91
- textureUrl = `${this.tileset.url}/nodes/${node.mesh.material.resource}/textures/${textureData.name}`;
90
+ textureUrl = "".concat(this.tileset.url, "/nodes/").concat(node.mesh.material.resource, "/textures/").concat(textureData.name);
92
91
  }
93
92
 
94
93
  if (this.tileset.attributeStorageInfo) {
@@ -96,8 +95,7 @@ export default class I3SNodePagesTiles {
96
95
  }
97
96
  }
98
97
 
99
- const lodSelection = this._getLodSelection(node);
100
-
98
+ const lodSelection = this.getLodSelection(node);
101
99
  return normalizeTileNonUrlData({
102
100
  id,
103
101
  lodSelection,
@@ -107,12 +105,13 @@ export default class I3SNodePagesTiles {
107
105
  attributeUrls,
108
106
  materialDefinition,
109
107
  textureFormat,
108
+ textureLoaderOptions: this.textureLoaderOptions,
110
109
  children,
111
110
  isDracoGeometry
112
111
  });
113
112
  }
114
113
 
115
- _getContentUrl(meshGeometryData) {
114
+ getContentUrl(meshGeometryData) {
116
115
  let result = {};
117
116
  const geometryDefinition = this.tileset.geometryDefinitions[meshGeometryData.definition];
118
117
  let geometryIndex = -1;
@@ -128,7 +127,7 @@ export default class I3SNodePagesTiles {
128
127
  if (geometryIndex !== -1) {
129
128
  const isDracoGeometry = Boolean(geometryDefinition.geometryBuffers[geometryIndex].compressedAttributes);
130
129
  result = {
131
- url: `${this.tileset.url}/nodes/${meshGeometryData.resource}/geometries/${geometryIndex}`,
130
+ url: "".concat(this.tileset.url, "/nodes/").concat(meshGeometryData.resource, "/geometries/").concat(geometryIndex),
132
131
  isDracoGeometry
133
132
  };
134
133
  }
@@ -136,7 +135,7 @@ export default class I3SNodePagesTiles {
136
135
  return result;
137
136
  }
138
137
 
139
- _getLodSelection(node) {
138
+ getLodSelection(node) {
140
139
  const lodSelection = [];
141
140
 
142
141
  if (this.lodSelectionMetricType === 'maxScreenThresholdSQ') {
@@ -153,7 +152,7 @@ export default class I3SNodePagesTiles {
153
152
  return lodSelection;
154
153
  }
155
154
 
156
- _getInformationFromMaterial(material) {
155
+ getInformationFromMaterial(material) {
157
156
  const textureDataDefault = {
158
157
  name: null,
159
158
  format: null
@@ -174,11 +173,9 @@ export default class I3SNodePagesTiles {
174
173
  return [textureDataDefault, null];
175
174
  }
176
175
 
177
- _initSelectedFormatsForTextureDefinitions(tileset) {
176
+ initSelectedFormatsForTextureDefinitions(tileset) {
178
177
  this.textureDefinitionsSelectedFormats = [];
179
-
180
- const possibleI3sFormats = this._getSupportedTextureFormats();
181
-
178
+ const possibleI3sFormats = this.getSupportedTextureFormats();
182
179
  const textureSetDefinitions = tileset.textureSetDefinitions || [];
183
180
 
184
181
  for (const textureSetDefinition of textureSetDefinitions) {
@@ -194,11 +191,19 @@ export default class I3SNodePagesTiles {
194
191
  }
195
192
  }
196
193
 
194
+ if (selectedFormat && selectedFormat.format === 'ktx2') {
195
+ this.textureLoaderOptions.basis = {
196
+ format: selectSupportedBasisFormat(),
197
+ containerFormat: 'ktx2',
198
+ module: 'encoder'
199
+ };
200
+ }
201
+
197
202
  this.textureDefinitionsSelectedFormats.push(selectedFormat);
198
203
  }
199
204
  }
200
205
 
201
- _getSupportedTextureFormats() {
206
+ getSupportedTextureFormats() {
202
207
  const formats = [];
203
208
 
204
209
  if (!this.options.i3s || this.options.i3s.useCompressedTextures) {
@@ -211,6 +216,8 @@ export default class I3SNodePagesTiles {
211
216
  if (supportedCompressedFormats.has('dxt')) {
212
217
  formats.push('dds');
213
218
  }
219
+
220
+ formats.push('ktx2');
214
221
  }
215
222
 
216
223
  formats.push('jpg');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/helpers/i3s-nodepages-tiles.ts"],"names":["load","getSupportedGPUTextureFormats","I3SNodePageLoader","normalizeTileNonUrlData","getUrlWithToken","generateTilesetAttributeUrls","I3SNodePagesTiles","constructor","tileset","options","nodesPerPage","nodePages","lodSelectionMetricType","_initSelectedFormatsForTextureDefinitions","getNodeById","id","pageIndex","Math","floor","pendingNodePages","nodePageUrl","url","i3s","token","status","promise","nodeIndex","nodes","formTileFromNodePages","node","children","child","childNode","push","obb","contentUrl","textureUrl","materialDefinition","textureFormat","attributeUrls","isDracoGeometry","mesh","isDracoGeometryResult","geometry","_getContentUrl","textureData","nodeMaterialDefinition","_getInformationFromMaterial","material","format","name","resource","attributeStorageInfo","attribute","lodSelection","_getLodSelection","meshGeometryData","result","geometryDefinition","geometryDefinitions","definition","geometryIndex","useDracoGeometry","geometryBuffers","findIndex","buffer","compressedAttributes","encoding","Boolean","metricType","maxError","sqrt","lodThreshold","PI","textureDataDefault","materialDefinitions","textureSetDefinitionIndex","pbrMetallicRoughness","baseColorTexture","textureSetDefinitionId","textureDefinitionsSelectedFormats","possibleI3sFormats","_getSupportedTextureFormats","textureSetDefinitions","textureSetDefinition","formats","selectedFormat","i3sFormat","find","value","useCompressedTextures","supportedCompressedFormats","has"],"mappings":"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","sourcesContent":["import {load} from '@loaders.gl/core';\nimport {getSupportedGPUTextureFormats} from '@loaders.gl/textures';\nimport {Tileset, NodePage} from '../../types';\nimport {I3SNodePageLoader} from '../../i3s-node-page-loader';\nimport {normalizeTileNonUrlData} from '../parsers/parse-i3s';\nimport {getUrlWithToken, generateTilesetAttributeUrls} from '../utils/url-utils';\n\n/**\n * class I3SNodePagesTiles - loads nodePages and form i3s tiles from them\n */\nexport default class I3SNodePagesTiles {\n tileset: Tileset;\n nodePages: NodePage[] = [];\n pendingNodePages: {promise: Promise<NodePage>; status: 'Pending' | 'Done'}[] = [];\n nodesPerPage: number;\n options: {[key: string]: any};\n lodSelectionMetricType: any;\n textureDefinitionsSelectedFormats: any[] = [];\n\n /**\n * @constructs\n * Create a I3SNodePagesTiles instance.\n * @param tileset - i3s tileset header ('layers/0')\n * @param options - i3s loader options\n */\n constructor(tileset: Tileset, options: object) {\n this.tileset = {...tileset}; // spread the tileset to avoid circular reference\n this.nodesPerPage = tileset.nodePages.nodesPerPage;\n this.lodSelectionMetricType = tileset.nodePages.lodSelectionMetricType;\n this.options = options;\n\n this._initSelectedFormatsForTextureDefinitions(tileset);\n }\n\n /**\n * Loads some nodePage and return a particular node from it\n * @param id - id of node through all node pages\n */\n async getNodeById(id: number) {\n const pageIndex = Math.floor(id / this.nodesPerPage);\n if (!this.nodePages[pageIndex] && !this.pendingNodePages[pageIndex]) {\n const nodePageUrl = getUrlWithToken(\n `${this.tileset.url}/nodepages/${pageIndex}`,\n this.options.i3s?.token\n );\n this.pendingNodePages[pageIndex] = {\n status: 'Pending',\n promise: load(nodePageUrl, I3SNodePageLoader, this.options)\n };\n this.nodePages[pageIndex] = await this.pendingNodePages[pageIndex].promise;\n this.pendingNodePages[pageIndex].status = 'Done';\n }\n if (this.pendingNodePages[pageIndex].status === 'Pending') {\n this.nodePages[pageIndex] = await this.pendingNodePages[pageIndex].promise;\n }\n const nodeIndex = id % this.nodesPerPage;\n return this.nodePages[pageIndex].nodes[nodeIndex];\n }\n\n /**\n * Forms tile header using node and tileset data\n * @param id - id of node through all node pages\n */\n // eslint-disable-next-line complexity\n async formTileFromNodePages(id: number) {\n const node = await this.getNodeById(id);\n const children: any[] = [];\n for (const child of node.children || []) {\n const childNode = await this.getNodeById(child);\n children.push({\n id: child,\n obb: childNode.obb\n });\n }\n\n let contentUrl = null;\n let textureUrl: string | null = null;\n let materialDefinition = null;\n let textureFormat = 'jpeg';\n let attributeUrls: string[] = [];\n let isDracoGeometry = false;\n\n if (node && node.mesh) {\n // Get geometry resource URL and type (compressed / non-compressed)\n const {url, isDracoGeometry: isDracoGeometryResult} = (node.mesh.geometry &&\n this._getContentUrl(node.mesh.geometry)) || {url: null, isDracoGeometry: null};\n contentUrl = url;\n isDracoGeometry = isDracoGeometryResult;\n\n const [textureData, nodeMaterialDefinition] = this._getInformationFromMaterial(\n node.mesh.material\n );\n materialDefinition = nodeMaterialDefinition;\n textureFormat = textureData.format || textureFormat;\n if (textureData.name) {\n textureUrl = `${this.tileset.url}/nodes/${node.mesh.material.resource}/textures/${textureData.name}`;\n }\n\n if (this.tileset.attributeStorageInfo) {\n attributeUrls = generateTilesetAttributeUrls(this.tileset, node.mesh.attribute.resource);\n }\n }\n\n const lodSelection = this._getLodSelection(node);\n\n return normalizeTileNonUrlData({\n id,\n lodSelection,\n obb: node.obb,\n contentUrl,\n textureUrl,\n attributeUrls,\n materialDefinition,\n textureFormat,\n children,\n isDracoGeometry\n });\n }\n\n /**\n * Forms url and type of geometry resource by nodepage's data and `geometryDefinitions` in the tileset\n * @param {Object} meshGeometryData - data about the node's mesh from the nodepage\n * @returns {Object} -\n * {string} url - url to the geometry resource\n * {boolean} isDracoGeometry - whether the geometry resource contain DRACO compressed geometry\n */\n _getContentUrl(meshGeometryData) {\n let result = {};\n const geometryDefinition = this.tileset.geometryDefinitions[meshGeometryData.definition];\n let geometryIndex = -1;\n // Try to find DRACO geometryDefinition of `useDracoGeometry` option is set\n if (this.options.i3s && this.options.i3s.useDracoGeometry) {\n geometryIndex = geometryDefinition.geometryBuffers.findIndex(\n (buffer) => buffer.compressedAttributes && buffer.compressedAttributes.encoding === 'draco'\n );\n }\n // If DRACO geometry is not applicable try to select non-compressed geometry\n if (geometryIndex === -1) {\n geometryIndex = geometryDefinition.geometryBuffers.findIndex(\n (buffer) => !buffer.compressedAttributes\n );\n }\n if (geometryIndex !== -1) {\n const isDracoGeometry = Boolean(\n geometryDefinition.geometryBuffers[geometryIndex].compressedAttributes\n );\n result = {\n url: `${this.tileset.url}/nodes/${meshGeometryData.resource}/geometries/${geometryIndex}`,\n isDracoGeometry\n };\n }\n return result;\n }\n\n /**\n * Forms 1.6 compatible LOD selection object from a nodepage's node data\n * @param {Object} node - a node from nodepage\n * @returns {Object[]} - Array of object of following properties:\n * {string} metricType - the label of the LOD metric\n * {number} maxError - the value of the metric\n */\n _getLodSelection(node): object[] {\n const lodSelection: object[] = [];\n if (this.lodSelectionMetricType === 'maxScreenThresholdSQ') {\n lodSelection.push({\n metricType: 'maxScreenThreshold',\n maxError: Math.sqrt(node.lodThreshold / (Math.PI * 0.25))\n });\n }\n lodSelection.push({\n metricType: this.lodSelectionMetricType,\n maxError: node.lodThreshold\n });\n return lodSelection;\n }\n\n /**\n * Returns information about texture and material from `materialDefinitions`\n * @param {Object} material - material data from nodepage\n * @returns {Object[]} - Couple [textureData, materialDefinition]\n * {string} textureData.name - path name of the texture\n * {string} textureData.format - format of the texture\n * materialDefinition - PBR-like material definition from `materialDefinitions`\n */\n _getInformationFromMaterial(material) {\n const textureDataDefault = {name: null, format: null};\n if (material) {\n const materialDefinition = this.tileset.materialDefinitions[material.definition];\n const textureSetDefinitionIndex =\n materialDefinition &&\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.baseColorTexture &&\n materialDefinition.pbrMetallicRoughness.baseColorTexture.textureSetDefinitionId;\n if (textureSetDefinitionIndex || textureSetDefinitionIndex === 0) {\n const textureData =\n this.textureDefinitionsSelectedFormats[textureSetDefinitionIndex] || textureDataDefault;\n return [textureData, materialDefinition];\n }\n return [textureDataDefault, materialDefinition];\n }\n return [textureDataDefault, null];\n }\n\n /**\n * Sets preferable and supported format for each textureDefinition of the tileset\n * @param {Object} tileset - I3S layer data\n * @returns {void}\n */\n _initSelectedFormatsForTextureDefinitions(tileset) {\n this.textureDefinitionsSelectedFormats = [];\n const possibleI3sFormats = this._getSupportedTextureFormats();\n const textureSetDefinitions = tileset.textureSetDefinitions || [];\n for (const textureSetDefinition of textureSetDefinitions) {\n const formats = (textureSetDefinition && textureSetDefinition.formats) || [];\n let selectedFormat = null;\n for (const i3sFormat of possibleI3sFormats) {\n const format = formats.find((value) => value.format === i3sFormat);\n if (format) {\n selectedFormat = format;\n break;\n }\n }\n this.textureDefinitionsSelectedFormats.push(selectedFormat);\n }\n }\n\n /**\n * Returns the array of supported texture format\n * @returns list of format strings\n */\n _getSupportedTextureFormats(): string[] {\n const formats: string[] = [];\n if (!this.options.i3s || this.options.i3s.useCompressedTextures) {\n const supportedCompressedFormats = getSupportedGPUTextureFormats();\n // List of possible in i3s formats:\n // https://github.com/Esri/i3s-spec/blob/master/docs/1.7/textureSetDefinitionFormat.cmn.md\n if (supportedCompressedFormats.has('etc2')) {\n formats.push('ktx-etc2');\n }\n if (supportedCompressedFormats.has('dxt')) {\n formats.push('dds');\n }\n }\n\n formats.push('jpg');\n formats.push('png');\n return formats;\n }\n}\n"],"file":"i3s-nodepages-tiles.js"}
1
+ {"version":3,"sources":["../../../src/lib/helpers/i3s-nodepages-tiles.ts"],"names":["load","getSupportedGPUTextureFormats","selectSupportedBasisFormat","I3SNodePageLoader","normalizeTileNonUrlData","getUrlWithToken","generateTilesetAttributeUrls","I3SNodePagesTiles","constructor","tileset","options","nodesPerPage","nodePages","lodSelectionMetricType","initSelectedFormatsForTextureDefinitions","getNodeById","id","pageIndex","Math","floor","pendingNodePages","nodePageUrl","url","i3s","token","status","promise","nodeIndex","nodes","formTileFromNodePages","node","children","child","childNode","push","obb","contentUrl","textureUrl","materialDefinition","textureFormat","attributeUrls","isDracoGeometry","mesh","isDracoGeometryResult","geometry","getContentUrl","textureData","nodeMaterialDefinition","getInformationFromMaterial","material","format","name","resource","attributeStorageInfo","attribute","lodSelection","getLodSelection","textureLoaderOptions","meshGeometryData","result","geometryDefinition","geometryDefinitions","definition","geometryIndex","useDracoGeometry","geometryBuffers","findIndex","buffer","compressedAttributes","encoding","Boolean","metricType","maxError","sqrt","lodThreshold","PI","textureDataDefault","materialDefinitions","textureSetDefinitionIndex","pbrMetallicRoughness","baseColorTexture","textureSetDefinitionId","textureDefinitionsSelectedFormats","possibleI3sFormats","getSupportedTextureFormats","textureSetDefinitions","textureSetDefinition","formats","selectedFormat","i3sFormat","find","value","basis","containerFormat","module","useCompressedTextures","supportedCompressedFormats","has"],"mappings":"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","sourcesContent":["import {load} from '@loaders.gl/core';\nimport {getSupportedGPUTextureFormats, selectSupportedBasisFormat} from '@loaders.gl/textures';\nimport {Tileset, NodePage} from '../../types';\nimport {I3SNodePageLoader} from '../../i3s-node-page-loader';\nimport {normalizeTileNonUrlData} from '../parsers/parse-i3s';\nimport {getUrlWithToken, generateTilesetAttributeUrls} from '../utils/url-utils';\n\n/**\n * class I3SNodePagesTiles - loads nodePages and form i3s tiles from them\n */\nexport default class I3SNodePagesTiles {\n tileset: Tileset;\n nodePages: NodePage[] = [];\n pendingNodePages: {promise: Promise<NodePage>; status: 'Pending' | 'Done'}[] = [];\n nodesPerPage: number;\n options: {[key: string]: any};\n lodSelectionMetricType: any;\n textureDefinitionsSelectedFormats: any[] = [];\n private textureLoaderOptions: {[key: string]: any} = {};\n\n /**\n * @constructs\n * Create a I3SNodePagesTiles instance.\n * @param tileset - i3s tileset header ('layers/0')\n * @param options - i3s loader options\n */\n constructor(tileset: Tileset, options: object) {\n this.tileset = {...tileset}; // spread the tileset to avoid circular reference\n this.nodesPerPage = tileset.nodePages.nodesPerPage;\n this.lodSelectionMetricType = tileset.nodePages.lodSelectionMetricType;\n this.options = options;\n\n this.initSelectedFormatsForTextureDefinitions(tileset);\n }\n\n /**\n * Loads some nodePage and return a particular node from it\n * @param id - id of node through all node pages\n */\n async getNodeById(id: number) {\n const pageIndex = Math.floor(id / this.nodesPerPage);\n if (!this.nodePages[pageIndex] && !this.pendingNodePages[pageIndex]) {\n const nodePageUrl = getUrlWithToken(\n `${this.tileset.url}/nodepages/${pageIndex}`,\n this.options.i3s?.token\n );\n this.pendingNodePages[pageIndex] = {\n status: 'Pending',\n promise: load(nodePageUrl, I3SNodePageLoader, this.options)\n };\n this.nodePages[pageIndex] = await this.pendingNodePages[pageIndex].promise;\n this.pendingNodePages[pageIndex].status = 'Done';\n }\n if (this.pendingNodePages[pageIndex].status === 'Pending') {\n this.nodePages[pageIndex] = await this.pendingNodePages[pageIndex].promise;\n }\n const nodeIndex = id % this.nodesPerPage;\n return this.nodePages[pageIndex].nodes[nodeIndex];\n }\n\n /**\n * Forms tile header using node and tileset data\n * @param id - id of node through all node pages\n */\n // eslint-disable-next-line complexity\n async formTileFromNodePages(id: number) {\n const node = await this.getNodeById(id);\n const children: any[] = [];\n for (const child of node.children || []) {\n const childNode = await this.getNodeById(child);\n children.push({\n id: child,\n obb: childNode.obb\n });\n }\n\n let contentUrl = null;\n let textureUrl: string | null = null;\n let materialDefinition = null;\n let textureFormat = 'jpeg';\n let attributeUrls: string[] = [];\n let isDracoGeometry = false;\n\n if (node && node.mesh) {\n // Get geometry resource URL and type (compressed / non-compressed)\n const {url, isDracoGeometry: isDracoGeometryResult} = (node.mesh.geometry &&\n this.getContentUrl(node.mesh.geometry)) || {url: null, isDracoGeometry: null};\n contentUrl = url;\n isDracoGeometry = isDracoGeometryResult;\n\n const [textureData, nodeMaterialDefinition] = this.getInformationFromMaterial(\n node.mesh.material\n );\n materialDefinition = nodeMaterialDefinition;\n textureFormat = textureData.format || textureFormat;\n if (textureData.name) {\n textureUrl = `${this.tileset.url}/nodes/${node.mesh.material.resource}/textures/${textureData.name}`;\n }\n\n if (this.tileset.attributeStorageInfo) {\n attributeUrls = generateTilesetAttributeUrls(this.tileset, node.mesh.attribute.resource);\n }\n }\n\n const lodSelection = this.getLodSelection(node);\n\n return normalizeTileNonUrlData({\n id,\n lodSelection,\n obb: node.obb,\n contentUrl,\n textureUrl,\n attributeUrls,\n materialDefinition,\n textureFormat,\n textureLoaderOptions: this.textureLoaderOptions,\n children,\n isDracoGeometry\n });\n }\n\n /**\n * Forms url and type of geometry resource by nodepage's data and `geometryDefinitions` in the tileset\n * @param {Object} meshGeometryData - data about the node's mesh from the nodepage\n * @returns {Object} -\n * {string} url - url to the geometry resource\n * {boolean} isDracoGeometry - whether the geometry resource contain DRACO compressed geometry\n */\n private getContentUrl(meshGeometryData) {\n let result = {};\n const geometryDefinition = this.tileset.geometryDefinitions[meshGeometryData.definition];\n let geometryIndex = -1;\n // Try to find DRACO geometryDefinition of `useDracoGeometry` option is set\n if (this.options.i3s && this.options.i3s.useDracoGeometry) {\n geometryIndex = geometryDefinition.geometryBuffers.findIndex(\n (buffer) => buffer.compressedAttributes && buffer.compressedAttributes.encoding === 'draco'\n );\n }\n // If DRACO geometry is not applicable try to select non-compressed geometry\n if (geometryIndex === -1) {\n geometryIndex = geometryDefinition.geometryBuffers.findIndex(\n (buffer) => !buffer.compressedAttributes\n );\n }\n if (geometryIndex !== -1) {\n const isDracoGeometry = Boolean(\n geometryDefinition.geometryBuffers[geometryIndex].compressedAttributes\n );\n result = {\n url: `${this.tileset.url}/nodes/${meshGeometryData.resource}/geometries/${geometryIndex}`,\n isDracoGeometry\n };\n }\n return result;\n }\n\n /**\n * Forms 1.6 compatible LOD selection object from a nodepage's node data\n * @param {Object} node - a node from nodepage\n * @returns {Object[]} - Array of object of following properties:\n * {string} metricType - the label of the LOD metric\n * {number} maxError - the value of the metric\n */\n private getLodSelection(node): object[] {\n const lodSelection: object[] = [];\n if (this.lodSelectionMetricType === 'maxScreenThresholdSQ') {\n lodSelection.push({\n metricType: 'maxScreenThreshold',\n maxError: Math.sqrt(node.lodThreshold / (Math.PI * 0.25))\n });\n }\n lodSelection.push({\n metricType: this.lodSelectionMetricType,\n maxError: node.lodThreshold\n });\n return lodSelection;\n }\n\n /**\n * Returns information about texture and material from `materialDefinitions`\n * @param {Object} material - material data from nodepage\n * @returns {Object[]} - Couple [textureData, materialDefinition]\n * {string} textureData.name - path name of the texture\n * {string} textureData.format - format of the texture\n * materialDefinition - PBR-like material definition from `materialDefinitions`\n */\n private getInformationFromMaterial(material) {\n const textureDataDefault = {name: null, format: null};\n if (material) {\n const materialDefinition = this.tileset.materialDefinitions[material.definition];\n const textureSetDefinitionIndex =\n materialDefinition &&\n materialDefinition.pbrMetallicRoughness &&\n materialDefinition.pbrMetallicRoughness.baseColorTexture &&\n materialDefinition.pbrMetallicRoughness.baseColorTexture.textureSetDefinitionId;\n if (textureSetDefinitionIndex || textureSetDefinitionIndex === 0) {\n const textureData =\n this.textureDefinitionsSelectedFormats[textureSetDefinitionIndex] || textureDataDefault;\n return [textureData, materialDefinition];\n }\n return [textureDataDefault, materialDefinition];\n }\n return [textureDataDefault, null];\n }\n\n /**\n * Sets preferable and supported format for each textureDefinition of the tileset\n * @param {Object} tileset - I3S layer data\n * @returns {void}\n */\n private initSelectedFormatsForTextureDefinitions(tileset) {\n this.textureDefinitionsSelectedFormats = [];\n const possibleI3sFormats = this.getSupportedTextureFormats();\n const textureSetDefinitions = tileset.textureSetDefinitions || [];\n for (const textureSetDefinition of textureSetDefinitions) {\n const formats = (textureSetDefinition && textureSetDefinition.formats) || [];\n let selectedFormat: {format: string; name: string} | null = null;\n for (const i3sFormat of possibleI3sFormats) {\n const format = formats.find((value) => value.format === i3sFormat);\n if (format) {\n selectedFormat = format;\n break;\n }\n }\n // For I3S 1.8 need to define basis target format to decode\n if (selectedFormat && selectedFormat.format === 'ktx2') {\n this.textureLoaderOptions.basis = {\n format: selectSupportedBasisFormat(),\n containerFormat: 'ktx2',\n module: 'encoder'\n };\n }\n\n this.textureDefinitionsSelectedFormats.push(selectedFormat);\n }\n }\n\n /**\n * Returns the array of supported texture format\n * @returns list of format strings\n */\n private getSupportedTextureFormats(): string[] {\n const formats: string[] = [];\n if (!this.options.i3s || this.options.i3s.useCompressedTextures) {\n // I3S 1.7 selection\n const supportedCompressedFormats = getSupportedGPUTextureFormats();\n // List of possible in i3s formats:\n // https://github.com/Esri/i3s-spec/blob/master/docs/1.7/textureSetDefinitionFormat.cmn.md\n if (supportedCompressedFormats.has('etc2')) {\n formats.push('ktx-etc2');\n }\n if (supportedCompressedFormats.has('dxt')) {\n formats.push('dds');\n }\n\n // I3S 1.8 selection\n // ktx2 wraps basis texture which at the edge case can be decoded as uncompressed image\n formats.push('ktx2');\n }\n\n formats.push('jpg');\n formats.push('png');\n return formats;\n }\n}\n"],"file":"i3s-nodepages-tiles.js"}
@@ -40,4 +40,12 @@ export const SIZEOF = {
40
40
  export const STRING_ATTRIBUTE_TYPE = 'String';
41
41
  export const OBJECT_ID_ATTRIBUTE_TYPE = 'Oid32';
42
42
  export const FLOAT_64_TYPE = 'Float64';
43
+ export const INT_16_ATTRIBUTE_TYPE = 'Int16';
44
+ export const COORDINATE_SYSTEM = {
45
+ DEFAULT: -1,
46
+ LNGLAT: 1,
47
+ METER_OFFSETS: 2,
48
+ LNGLAT_OFFSETS: 3,
49
+ CARTESIAN: 0
50
+ };
43
51
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/parsers/constants.ts"],"names":["GL","TYPE_ARRAY_MAP","UInt8","Uint8Array","UInt16","Uint16Array","UInt32","Uint32Array","Float32","Float32Array","UInt64","Float64Array","GL_TYPE_MAP","UNSIGNED_BYTE","UNSIGNED_INT","FLOAT","DOUBLE","I3S_NAMED_VERTEX_ATTRIBUTES","position","normal","uv0","color","region","I3S_NAMED_GEOMETRY_ATTRIBUTES","vertexAttributes","featureAttributeOrder","featureAttributes","I3S_NAMED_HEADER_ATTRIBUTES","header","vertexCount","featureCount","SIZEOF","STRING_ATTRIBUTE_TYPE","OBJECT_ID_ATTRIBUTE_TYPE","FLOAT_64_TYPE"],"mappings":"AAAA,OAAOA,EAAP,MAAe,oBAAf;AAEA,OAAO,MAAMC,cAAc,GAAG;AAC5BC,EAAAA,KAAK,EAAEC,UADqB;AAE5BC,EAAAA,MAAM,EAAEC,WAFoB;AAG5BC,EAAAA,MAAM,EAAEC,WAHoB;AAI5BC,EAAAA,OAAO,EAAEC,YAJmB;AAK5BC,EAAAA,MAAM,EAAEC;AALoB,CAAvB;AAQP,OAAO,MAAMC,WAAW,GAAG;AACzBV,EAAAA,KAAK,EAAEF,EAAE,CAACa,aADe;AAEzBT,EAAAA,MAAM,EAAEJ,EAAE,CAACc,YAFc;AAGzBN,EAAAA,OAAO,EAAER,EAAE,CAACe,KAHa;AAIzBT,EAAAA,MAAM,EAAEN,EAAE,CAACc,YAJc;AAKzBJ,EAAAA,MAAM,EAAEV,EAAE,CAACgB;AALc,CAApB;AAQP,OAAO,MAAMC,2BAA2B,GAAG;AACzCC,EAAAA,QAAQ,EAAE,UAD+B;AAEzCC,EAAAA,MAAM,EAAE,QAFiC;AAGzCC,EAAAA,GAAG,EAAE,KAHoC;AAIzCC,EAAAA,KAAK,EAAE,OAJkC;AAKzCC,EAAAA,MAAM,EAAE;AALiC,CAApC;AAQP,OAAO,MAAMC,6BAA6B,GAAG;AAC3CC,EAAAA,gBAAgB,EAAE,kBADyB;AAE3CC,EAAAA,qBAAqB,EAAE,uBAFoB;AAG3CC,EAAAA,iBAAiB,EAAE;AAHwB,CAAtC;AAMP,OAAO,MAAMC,2BAA2B,GAAG;AACzCC,EAAAA,MAAM,EAAE,QADiC;AAEzCC,EAAAA,WAAW,EAAE,aAF4B;AAGzCC,EAAAA,YAAY,EAAE;AAH2B,CAApC;AAMP,OAAO,MAAMC,MAAM,GAAG;AACpB7B,EAAAA,KAAK,EAAE,CADa;AAEpBE,EAAAA,MAAM,EAAE,CAFY;AAGpBE,EAAAA,MAAM,EAAE,CAHY;AAIpBE,EAAAA,OAAO,EAAE,CAJW;AAKpBE,EAAAA,MAAM,EAAE;AALY,CAAf;AAQP,OAAO,MAAMsB,qBAAqB,GAAG,QAA9B;AACP,OAAO,MAAMC,wBAAwB,GAAG,OAAjC;AACP,OAAO,MAAMC,aAAa,GAAG,SAAtB","sourcesContent":["import GL from '@luma.gl/constants';\n\nexport const TYPE_ARRAY_MAP = {\n UInt8: Uint8Array,\n UInt16: Uint16Array,\n UInt32: Uint32Array,\n Float32: Float32Array,\n UInt64: Float64Array\n};\n\nexport const GL_TYPE_MAP = {\n UInt8: GL.UNSIGNED_BYTE,\n UInt16: GL.UNSIGNED_INT,\n Float32: GL.FLOAT,\n UInt32: GL.UNSIGNED_INT,\n UInt64: GL.DOUBLE\n};\n\nexport const I3S_NAMED_VERTEX_ATTRIBUTES = {\n position: 'position',\n normal: 'normal',\n uv0: 'uv0',\n color: 'color',\n region: 'region'\n};\n\nexport const I3S_NAMED_GEOMETRY_ATTRIBUTES = {\n vertexAttributes: 'vertexAttributes',\n featureAttributeOrder: 'featureAttributeOrder',\n featureAttributes: 'featureAttributes'\n};\n\nexport const I3S_NAMED_HEADER_ATTRIBUTES = {\n header: 'header',\n vertexCount: 'vertexCount',\n featureCount: 'featureCount'\n};\n\nexport const SIZEOF = {\n UInt8: 1,\n UInt16: 2,\n UInt32: 4,\n Float32: 4,\n UInt64: 8\n};\n\nexport const STRING_ATTRIBUTE_TYPE = 'String';\nexport const OBJECT_ID_ATTRIBUTE_TYPE = 'Oid32';\nexport const FLOAT_64_TYPE = 'Float64';\n"],"file":"constants.js"}
1
+ {"version":3,"sources":["../../../src/lib/parsers/constants.ts"],"names":["GL","TYPE_ARRAY_MAP","UInt8","Uint8Array","UInt16","Uint16Array","UInt32","Uint32Array","Float32","Float32Array","UInt64","Float64Array","GL_TYPE_MAP","UNSIGNED_BYTE","UNSIGNED_INT","FLOAT","DOUBLE","I3S_NAMED_VERTEX_ATTRIBUTES","position","normal","uv0","color","region","I3S_NAMED_GEOMETRY_ATTRIBUTES","vertexAttributes","featureAttributeOrder","featureAttributes","I3S_NAMED_HEADER_ATTRIBUTES","header","vertexCount","featureCount","SIZEOF","STRING_ATTRIBUTE_TYPE","OBJECT_ID_ATTRIBUTE_TYPE","FLOAT_64_TYPE","INT_16_ATTRIBUTE_TYPE","COORDINATE_SYSTEM","DEFAULT","LNGLAT","METER_OFFSETS","LNGLAT_OFFSETS","CARTESIAN"],"mappings":"AAAA,OAAOA,EAAP,MAAe,oBAAf;AAEA,OAAO,MAAMC,cAAc,GAAG;AAC5BC,EAAAA,KAAK,EAAEC,UADqB;AAE5BC,EAAAA,MAAM,EAAEC,WAFoB;AAG5BC,EAAAA,MAAM,EAAEC,WAHoB;AAI5BC,EAAAA,OAAO,EAAEC,YAJmB;AAK5BC,EAAAA,MAAM,EAAEC;AALoB,CAAvB;AAQP,OAAO,MAAMC,WAAW,GAAG;AACzBV,EAAAA,KAAK,EAAEF,EAAE,CAACa,aADe;AAEzBT,EAAAA,MAAM,EAAEJ,EAAE,CAACc,YAFc;AAGzBN,EAAAA,OAAO,EAAER,EAAE,CAACe,KAHa;AAIzBT,EAAAA,MAAM,EAAEN,EAAE,CAACc,YAJc;AAKzBJ,EAAAA,MAAM,EAAEV,EAAE,CAACgB;AALc,CAApB;AAQP,OAAO,MAAMC,2BAA2B,GAAG;AACzCC,EAAAA,QAAQ,EAAE,UAD+B;AAEzCC,EAAAA,MAAM,EAAE,QAFiC;AAGzCC,EAAAA,GAAG,EAAE,KAHoC;AAIzCC,EAAAA,KAAK,EAAE,OAJkC;AAKzCC,EAAAA,MAAM,EAAE;AALiC,CAApC;AAQP,OAAO,MAAMC,6BAA6B,GAAG;AAC3CC,EAAAA,gBAAgB,EAAE,kBADyB;AAE3CC,EAAAA,qBAAqB,EAAE,uBAFoB;AAG3CC,EAAAA,iBAAiB,EAAE;AAHwB,CAAtC;AAMP,OAAO,MAAMC,2BAA2B,GAAG;AACzCC,EAAAA,MAAM,EAAE,QADiC;AAEzCC,EAAAA,WAAW,EAAE,aAF4B;AAGzCC,EAAAA,YAAY,EAAE;AAH2B,CAApC;AAMP,OAAO,MAAMC,MAAM,GAAG;AACpB7B,EAAAA,KAAK,EAAE,CADa;AAEpBE,EAAAA,MAAM,EAAE,CAFY;AAGpBE,EAAAA,MAAM,EAAE,CAHY;AAIpBE,EAAAA,OAAO,EAAE,CAJW;AAKpBE,EAAAA,MAAM,EAAE;AALY,CAAf;AAQP,OAAO,MAAMsB,qBAAqB,GAAG,QAA9B;AACP,OAAO,MAAMC,wBAAwB,GAAG,OAAjC;AACP,OAAO,MAAMC,aAAa,GAAG,SAAtB;AACP,OAAO,MAAMC,qBAAqB,GAAG,OAA9B;AAIP,OAAO,MAAMC,iBAAiB,GAAG;AAE/BC,EAAAA,OAAO,EAAE,CAAC,CAFqB;AAK/BC,EAAAA,MAAM,EAAE,CALuB;AAQ/BC,EAAAA,aAAa,EAAE,CARgB;AAa/BC,EAAAA,cAAc,EAAE,CAbe;AAgB/BC,EAAAA,SAAS,EAAE;AAhBoB,CAA1B","sourcesContent":["import GL from '@luma.gl/constants';\n\nexport const TYPE_ARRAY_MAP = {\n UInt8: Uint8Array,\n UInt16: Uint16Array,\n UInt32: Uint32Array,\n Float32: Float32Array,\n UInt64: Float64Array\n};\n\nexport const GL_TYPE_MAP = {\n UInt8: GL.UNSIGNED_BYTE,\n UInt16: GL.UNSIGNED_INT,\n Float32: GL.FLOAT,\n UInt32: GL.UNSIGNED_INT,\n UInt64: GL.DOUBLE\n};\n\nexport const I3S_NAMED_VERTEX_ATTRIBUTES = {\n position: 'position',\n normal: 'normal',\n uv0: 'uv0',\n color: 'color',\n region: 'region'\n};\n\nexport const I3S_NAMED_GEOMETRY_ATTRIBUTES = {\n vertexAttributes: 'vertexAttributes',\n featureAttributeOrder: 'featureAttributeOrder',\n featureAttributes: 'featureAttributes'\n};\n\nexport const I3S_NAMED_HEADER_ATTRIBUTES = {\n header: 'header',\n vertexCount: 'vertexCount',\n featureCount: 'featureCount'\n};\n\nexport const SIZEOF = {\n UInt8: 1,\n UInt16: 2,\n UInt32: 4,\n Float32: 4,\n UInt64: 8\n};\n\nexport const STRING_ATTRIBUTE_TYPE = 'String';\nexport const OBJECT_ID_ATTRIBUTE_TYPE = 'Oid32';\nexport const FLOAT_64_TYPE = 'Float64';\nexport const INT_16_ATTRIBUTE_TYPE = 'Int16';\n\n// https://github.com/visgl/deck.gl/blob/9548f43cba2234a1f4877b6b17f6c88eb35b2e08/modules/core/src/lib/constants.js#L27\n// Describes the format of positions\nexport const COORDINATE_SYSTEM = {\n // `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise\n DEFAULT: -1,\n // Positions are interpreted as [lng, lat, elevation]\n // lng lat are degrees, elevation is meters. distances as meters.\n LNGLAT: 1,\n\n // Positions are interpreted as meter offsets, distances as meters\n METER_OFFSETS: 2,\n\n // Positions are interpreted as lng lat offsets: [deltaLng, deltaLat, elevation]\n // deltaLng, deltaLat are delta degrees, elevation is meters.\n // distances as meters.\n LNGLAT_OFFSETS: 3,\n\n // Non-geospatial\n CARTESIAN: 0\n};\n"],"file":"constants.js"}
@@ -1,4 +1,4 @@
1
- import { STRING_ATTRIBUTE_TYPE, OBJECT_ID_ATTRIBUTE_TYPE, FLOAT_64_TYPE } from './constants';
1
+ import { STRING_ATTRIBUTE_TYPE, OBJECT_ID_ATTRIBUTE_TYPE, FLOAT_64_TYPE, INT_16_ATTRIBUTE_TYPE } from './constants';
2
2
  export async function parseI3STileAttribute(arrayBuffer, options) {
3
3
  const {
4
4
  attributeName,
@@ -25,6 +25,9 @@ function parseAttribute(attributeType, arrayBuffer) {
25
25
  case FLOAT_64_TYPE:
26
26
  return parseFloatAttribute(arrayBuffer);
27
27
 
28
+ case INT_16_ATTRIBUTE_TYPE:
29
+ return parseInt16ShortNumberAttribute(arrayBuffer);
30
+
28
31
  default:
29
32
  return parseShortNumberAttribute(arrayBuffer);
30
33
  }
@@ -35,6 +38,11 @@ function parseShortNumberAttribute(arrayBuffer) {
35
38
  return new Uint32Array(arrayBuffer, countOffset);
36
39
  }
37
40
 
41
+ function parseInt16ShortNumberAttribute(arrayBuffer) {
42
+ const countOffset = 4;
43
+ return new Int16Array(arrayBuffer, countOffset);
44
+ }
45
+
38
46
  function parseFloatAttribute(arrayBuffer) {
39
47
  const countOffset = 8;
40
48
  return new Float64Array(arrayBuffer, countOffset);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/parsers/parse-i3s-attribute.ts"],"names":["STRING_ATTRIBUTE_TYPE","OBJECT_ID_ATTRIBUTE_TYPE","FLOAT_64_TYPE","parseI3STileAttribute","arrayBuffer","options","attributeName","attributeType","parseAttribute","parseStringsAttribute","parseShortNumberAttribute","parseFloatAttribute","countOffset","Uint32Array","Float64Array","stringsCountOffset","dataOffset","bytesPerStringSize","stringsArray","stringsCount","DataView","getUint32","stringSizes","stringOffset","stringByteSize","textDecoder","TextDecoder","stringAttribute","Uint8Array","push","decode","error","console","message"],"mappings":"AAAA,SAAQA,qBAAR,EAA+BC,wBAA/B,EAAyDC,aAAzD,QAA6E,aAA7E;AAQA,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,SAAKP,qBAAL;AACE,aAAOS,qBAAqB,CAACL,WAAD,CAA5B;;AACF,SAAKH,wBAAL;AACE,aAAOS,yBAAyB,CAACN,WAAD,CAAhC;;AACF,SAAKF,aAAL;AACE,aAAOS,mBAAmB,CAACP,WAAD,CAA1B;;AACF;AACE,aAAOM,yBAAyB,CAACN,WAAD,CAAhC;AARJ;AAUD;;AAQD,SAASM,yBAAT,CAAmCN,WAAnC,EAAgD;AAC9C,QAAMQ,WAAW,GAAG,CAApB;AACA,SAAO,IAAIC,WAAJ,CAAgBT,WAAhB,EAA6BQ,WAA7B,CAAP;AACD;;AAQD,SAASD,mBAAT,CAA6BP,WAA7B,EAA0C;AACxC,QAAMQ,WAAW,GAAG,CAApB;AACA,SAAO,IAAIE,YAAJ,CAAiBV,WAAjB,EAA8BQ,WAA9B,CAAP;AACD;;AAQD,SAASH,qBAAT,CAA+BL,WAA/B,EAAmE;AACjE,QAAMW,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,CACnBhB,WADmB,EAEnBW,kBAFmB,EAGnBE,kBAHmB,EAInBI,SAJmB,CAITN,kBAJS,EAIW,IAJX,CAArB;AAKA,UAAMO,WAAW,GAAG,IAAIT,WAAJ,CAAgBT,WAAhB,EAA6BY,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,CAAexB,WAAf,EAA4BmB,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 {STRING_ATTRIBUTE_TYPE, OBJECT_ID_ATTRIBUTE_TYPE, FLOAT_64_TYPE} 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 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 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,"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"}
@@ -0,0 +1,43 @@
1
+ const OBJECT_3D_LAYER_TYPE = '3DObject';
2
+ export async function parseBuildingSceneLayer(data, url) {
3
+ const layer0 = JSON.parse(new TextDecoder().decode(data));
4
+ const {
5
+ sublayers
6
+ } = layer0;
7
+ return {
8
+ header: layer0,
9
+ sublayers: parseSublayersTree(sublayers, url)
10
+ };
11
+ }
12
+
13
+ function parseSublayersTree(sublayers, url) {
14
+ let layers = [];
15
+
16
+ for (let index = 0; index < sublayers.length; index++) {
17
+ var _subLayer$sublayers;
18
+
19
+ const subLayer = sublayers[index];
20
+ const {
21
+ id,
22
+ layerType,
23
+ ...rest
24
+ } = subLayer;
25
+
26
+ if (layerType === OBJECT_3D_LAYER_TYPE) {
27
+ const sublayerUrl = "".concat(url, "/sublayers/").concat(id);
28
+ layers.push({
29
+ url: sublayerUrl,
30
+ id,
31
+ layerType,
32
+ ...rest
33
+ });
34
+ }
35
+
36
+ if (subLayer !== null && subLayer !== void 0 && (_subLayer$sublayers = subLayer.sublayers) !== null && _subLayer$sublayers !== void 0 && _subLayer$sublayers.length) {
37
+ layers = [...layers, ...parseSublayersTree(subLayer.sublayers, url)];
38
+ }
39
+ }
40
+
41
+ return layers;
42
+ }
43
+ //# sourceMappingURL=parse-i3s-building-scene-layer.js.map
@@ -0,0 +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","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;AAAgB,SAAGC;AAAnB,QAA2BH,QAAjC;;AAGA,QAAIE,SAAS,KAAKjB,oBAAlB,EAAwC;AACtC,YAAMmB,WAAW,aAAMhB,GAAN,wBAAuBa,EAAvB,CAAjB;AAEAJ,MAAAA,MAAM,CAACQ,IAAP,CAAY;AACVjB,QAAAA,GAAG,EAAEgB,WADK;AAEVH,QAAAA,EAFU;AAGVC,QAAAA,SAHU;AAIV,WAAGC;AAJO,OAAZ;AAMD;;AAED,QAAIH,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, ...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 ...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"}
@@ -5,7 +5,7 @@ import { ImageLoader } from '@loaders.gl/images';
5
5
  import { DracoLoader } from '@loaders.gl/draco';
6
6
  import { BasisLoader, CompressedTextureLoader } from '@loaders.gl/textures';
7
7
  import { getUrlWithToken } from '../utils/url-utils';
8
- import { GL_TYPE_MAP, TYPE_ARRAY_MAP, SIZEOF, I3S_NAMED_HEADER_ATTRIBUTES, I3S_NAMED_VERTEX_ATTRIBUTES, I3S_NAMED_GEOMETRY_ATTRIBUTES } from './constants';
8
+ import { GL_TYPE_MAP, TYPE_ARRAY_MAP, SIZEOF, I3S_NAMED_HEADER_ATTRIBUTES, I3S_NAMED_VERTEX_ATTRIBUTES, I3S_NAMED_GEOMETRY_ATTRIBUTES, COORDINATE_SYSTEM } from './constants';
9
9
  const scratchVector = new Vector3([0, 0, 0]);
10
10
  const FORMAT_LOADER_MAP = {
11
11
  jpeg: ImageLoader,
@@ -29,22 +29,26 @@ export async function parseI3STileContent(arrayBuffer, tile, tileset, options, c
29
29
  const response = await fetch(url);
30
30
  const arrayBuffer = await response.arrayBuffer();
31
31
 
32
- if (loader === ImageLoader) {
33
- const options = { ...tile.textureLoaderOptions,
34
- image: {
35
- type: 'data'
36
- }
37
- };
38
- tile.content.texture = await context.parse(arrayBuffer, options);
39
- } else if (loader === CompressedTextureLoader || loader === BasisLoader) {
40
- const texture = await load(arrayBuffer, loader, tile.textureLoaderOptions);
41
- tile.content.texture = {
42
- compressed: true,
43
- mipmaps: false,
44
- width: texture[0].width,
45
- height: texture[0].height,
46
- data: texture
47
- };
32
+ if (options !== null && options !== void 0 && options.i3s.decodeTextures) {
33
+ if (loader === ImageLoader) {
34
+ const options = { ...tile.textureLoaderOptions,
35
+ image: {
36
+ type: 'data'
37
+ }
38
+ };
39
+ tile.content.texture = await context.parse(arrayBuffer, options);
40
+ } else if (loader === CompressedTextureLoader || loader === BasisLoader) {
41
+ const texture = await load(arrayBuffer, loader, tile.textureLoaderOptions);
42
+ tile.content.texture = {
43
+ compressed: true,
44
+ mipmaps: false,
45
+ width: texture[0].width,
46
+ height: texture[0].height,
47
+ data: texture
48
+ };
49
+ }
50
+ } else {
51
+ tile.content.texture = arrayBuffer;
48
52
  }
49
53
  }
50
54
 
@@ -54,10 +58,12 @@ export async function parseI3STileContent(arrayBuffer, tile, tileset, options, c
54
58
  tile.content.texture = null;
55
59
  }
56
60
 
57
- return await parseI3SNodeGeometry(arrayBuffer, tile, context);
61
+ return await parseI3SNodeGeometry(arrayBuffer, tile, options, context);
58
62
  }
59
63
 
60
- async function parseI3SNodeGeometry(arrayBuffer, tile = {}, context) {
64
+ async function parseI3SNodeGeometry(arrayBuffer, tile = {}, options, context) {
65
+ var _options$i3s2;
66
+
61
67
  if (!tile.content) {
62
68
  return tile;
63
69
  }
@@ -121,12 +127,17 @@ async function parseI3SNodeGeometry(arrayBuffer, tile = {}, context) {
121
127
  attributes = concatAttributes(normalizedVertexAttributes, normalizedFeatureAttributes);
122
128
  }
123
129
 
124
- const {
125
- enuMatrix,
126
- cartographicOrigin,
127
- cartesianOrigin
128
- } = parsePositions(attributes.position, tile);
129
- const matrix = new Matrix4().multiplyRight(enuMatrix);
130
+ 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) {
131
+ const {
132
+ enuMatrix
133
+ } = parsePositions(attributes.position, tile);
134
+ content.modelMatrix = enuMatrix.invert();
135
+ content.coordinateSystem = COORDINATE_SYSTEM.METER_OFFSETS;
136
+ } else {
137
+ content.modelMatrix = getModelMatrix(attributes.position);
138
+ content.coordinateSystem = COORDINATE_SYSTEM.LNGLAT_OFFSETS;
139
+ }
140
+
130
141
  content.attributes = {
131
142
  positions: attributes.position,
132
143
  normals: attributes.normal,
@@ -147,9 +158,6 @@ async function parseI3SNodeGeometry(arrayBuffer, tile = {}, context) {
147
158
  }
148
159
 
149
160
  content.vertexCount = vertexCount;
150
- content.cartographicCenter = cartographicOrigin;
151
- content.cartesianOrigin = cartesianOrigin;
152
- content.modelMatrix = matrix.invert();
153
161
  content.byteLength = arrayBuffer.byteLength;
154
162
  return tile;
155
163
  }
@@ -327,10 +335,7 @@ function parsePositions(attribute, tile) {
327
335
  Ellipsoid.WGS84.eastNorthUpToFixedFrame(cartesianOrigin, enuMatrix);
328
336
  attribute.value = offsetsToCartesians(value, metadata, cartographicOrigin);
329
337
  return {
330
- enuMatrix,
331
- fixedFrameToENUMatrix: enuMatrix.invert(),
332
- cartographicOrigin,
333
- cartesianOrigin
338
+ enuMatrix
334
339
  };
335
340
  }
336
341
 
@@ -355,6 +360,18 @@ function offsetsToCartesians(vertices, metadata = {}, cartographicOrigin) {
355
360
  return positions;
356
361
  }
357
362
 
363
+ function getModelMatrix(positions) {
364
+ var _metadata$i3sScale_x, _metadata$i3sScale_y;
365
+
366
+ const metadata = positions.metadata;
367
+ 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;
368
+ 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;
369
+ const modelMatrix = new Matrix4();
370
+ modelMatrix[0] = scaleX;
371
+ modelMatrix[5] = scaleY;
372
+ return modelMatrix;
373
+ }
374
+
358
375
  function makePbrMaterial(materialDefinition, texture) {
359
376
  let pbrMaterial;
360
377