@loaders.gl/3d-tiles 4.0.0-alpha.7 → 4.0.0-alpha.9

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 (114) hide show
  1. package/dist/dist.min.js +317 -146
  2. package/dist/es5/index.js.map +1 -1
  3. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js +4 -3
  4. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js.map +1 -1
  5. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js +2 -2
  6. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -1
  7. package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -1
  8. package/dist/es5/lib/parsers/helpers/parse-3d-tile-gltf-view.js +30 -18
  9. package/dist/es5/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +1 -1
  10. package/dist/es5/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -1
  11. package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js +12 -12
  12. package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -1
  13. package/dist/es5/lib/parsers/parse-3d-tile-batched-model.js.map +1 -1
  14. package/dist/es5/lib/parsers/parse-3d-tile-composite.js +1 -1
  15. package/dist/es5/lib/parsers/parse-3d-tile-composite.js.map +1 -1
  16. package/dist/es5/lib/parsers/parse-3d-tile-gltf.js +19 -4
  17. package/dist/es5/lib/parsers/parse-3d-tile-gltf.js.map +1 -1
  18. package/dist/es5/lib/parsers/parse-3d-tile-header.js +98 -80
  19. package/dist/es5/lib/parsers/parse-3d-tile-header.js.map +1 -1
  20. package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js +12 -21
  21. package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js.map +1 -1
  22. package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js +29 -5
  23. package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -1
  24. package/dist/es5/lib/parsers/parse-3d-tile.js.map +1 -1
  25. package/dist/es5/lib/utils/version.js +1 -1
  26. package/dist/es5/tiles-3d-loader.js +26 -31
  27. package/dist/es5/tiles-3d-loader.js.map +1 -1
  28. package/dist/es5/types.js.map +1 -1
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js +3 -3
  31. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js.map +1 -1
  32. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-normals.js +2 -2
  33. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -1
  34. package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -1
  35. package/dist/esm/lib/parsers/helpers/parse-3d-tile-gltf-view.js +15 -9
  36. package/dist/esm/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +1 -1
  37. package/dist/esm/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -1
  38. package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js +7 -7
  39. package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -1
  40. package/dist/esm/lib/parsers/parse-3d-tile-batched-model.js.map +1 -1
  41. package/dist/esm/lib/parsers/parse-3d-tile-composite.js +1 -1
  42. package/dist/esm/lib/parsers/parse-3d-tile-composite.js.map +1 -1
  43. package/dist/esm/lib/parsers/parse-3d-tile-gltf.js +15 -7
  44. package/dist/esm/lib/parsers/parse-3d-tile-gltf.js.map +1 -1
  45. package/dist/esm/lib/parsers/parse-3d-tile-header.js +62 -45
  46. package/dist/esm/lib/parsers/parse-3d-tile-header.js.map +1 -1
  47. package/dist/esm/lib/parsers/parse-3d-tile-instanced-model.js +12 -21
  48. package/dist/esm/lib/parsers/parse-3d-tile-instanced-model.js.map +1 -1
  49. package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js +23 -2
  50. package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -1
  51. package/dist/esm/lib/parsers/parse-3d-tile.js.map +1 -1
  52. package/dist/esm/lib/utils/version.js +1 -1
  53. package/dist/esm/tiles-3d-loader.js +18 -12
  54. package/dist/esm/tiles-3d-loader.js.map +1 -1
  55. package/dist/esm/types.js.map +1 -1
  56. package/dist/index.d.ts +2 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.d.ts +4 -2
  59. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.d.ts.map +1 -1
  60. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.js +3 -3
  61. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.d.ts +3 -2
  62. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.d.ts.map +1 -1
  63. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.js +2 -2
  64. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.d.ts.map +1 -1
  65. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.d.ts +5 -2
  66. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.d.ts.map +1 -1
  67. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.js +15 -9
  68. package/dist/lib/parsers/helpers/parse-3d-tile-header.d.ts +2 -1
  69. package/dist/lib/parsers/helpers/parse-3d-tile-header.d.ts.map +1 -1
  70. package/dist/lib/parsers/helpers/parse-3d-tile-tables.d.ts +4 -2
  71. package/dist/lib/parsers/helpers/parse-3d-tile-tables.d.ts.map +1 -1
  72. package/dist/lib/parsers/helpers/parse-3d-tile-tables.js +7 -7
  73. package/dist/lib/parsers/parse-3d-tile-batched-model.d.ts +4 -1
  74. package/dist/lib/parsers/parse-3d-tile-batched-model.d.ts.map +1 -1
  75. package/dist/lib/parsers/parse-3d-tile-batched-model.js +1 -1
  76. package/dist/lib/parsers/parse-3d-tile-composite.d.ts +3 -2
  77. package/dist/lib/parsers/parse-3d-tile-composite.d.ts.map +1 -1
  78. package/dist/lib/parsers/parse-3d-tile-composite.js +1 -1
  79. package/dist/lib/parsers/parse-3d-tile-gltf.d.ts +2 -1
  80. package/dist/lib/parsers/parse-3d-tile-gltf.d.ts.map +1 -1
  81. package/dist/lib/parsers/parse-3d-tile-gltf.js +13 -5
  82. package/dist/lib/parsers/parse-3d-tile-header.d.ts +5 -6
  83. package/dist/lib/parsers/parse-3d-tile-header.d.ts.map +1 -1
  84. package/dist/lib/parsers/parse-3d-tile-header.js +57 -42
  85. package/dist/lib/parsers/parse-3d-tile-instanced-model.d.ts +2 -1
  86. package/dist/lib/parsers/parse-3d-tile-instanced-model.d.ts.map +1 -1
  87. package/dist/lib/parsers/parse-3d-tile-instanced-model.js +11 -25
  88. package/dist/lib/parsers/parse-3d-tile-point-cloud.d.ts +3 -2
  89. package/dist/lib/parsers/parse-3d-tile-point-cloud.d.ts.map +1 -1
  90. package/dist/lib/parsers/parse-3d-tile-point-cloud.js +23 -2
  91. package/dist/lib/parsers/parse-3d-tile.d.ts +4 -1
  92. package/dist/lib/parsers/parse-3d-tile.d.ts.map +1 -1
  93. package/dist/lib/parsers/parse-3d-tile.js +0 -4
  94. package/dist/tiles-3d-loader.d.ts.map +1 -1
  95. package/dist/tiles-3d-loader.js +18 -17
  96. package/dist/types.d.ts +257 -15
  97. package/dist/types.d.ts.map +1 -1
  98. package/package.json +8 -8
  99. package/src/index.ts +12 -1
  100. package/src/lib/parsers/helpers/normalize-3d-tile-colors.ts +10 -4
  101. package/src/lib/parsers/helpers/normalize-3d-tile-normals.ts +7 -3
  102. package/src/lib/parsers/helpers/parse-3d-implicit-tiles.ts +4 -4
  103. package/src/lib/parsers/helpers/parse-3d-tile-gltf-view.ts +35 -13
  104. package/src/lib/parsers/helpers/parse-3d-tile-header.ts +7 -1
  105. package/src/lib/parsers/helpers/parse-3d-tile-tables.ts +32 -11
  106. package/src/lib/parsers/parse-3d-tile-batched-model.ts +18 -3
  107. package/src/lib/parsers/parse-3d-tile-composite.ts +7 -6
  108. package/src/lib/parsers/parse-3d-tile-gltf.ts +16 -8
  109. package/src/lib/parsers/parse-3d-tile-header.ts +84 -52
  110. package/src/lib/parsers/parse-3d-tile-instanced-model.ts +24 -33
  111. package/src/lib/parsers/parse-3d-tile-point-cloud.ts +51 -19
  112. package/src/lib/parsers/parse-3d-tile.ts +10 -5
  113. package/src/tiles-3d-loader.ts +21 -23
  114. package/src/types.ts +269 -15
@@ -2,12 +2,18 @@
2
2
  // See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
3
3
 
4
4
  import {getStringFromArrayBuffer} from './parse-utils';
5
+ import {Tiles3DLoaderOptions} from '../../../tiles-3d-loader';
6
+ import {Tiles3DTileContent} from '../../../types';
5
7
 
6
8
  const SIZEOF_UINT32 = 4;
7
9
  const DEPRECATION_WARNING = 'b3dm tile in legacy format.';
8
10
 
9
11
  // eslint-disable-next-line max-statements
10
- export function parse3DTileTablesHeaderSync(tile, arrayBuffer, byteOffset) {
12
+ export function parse3DTileTablesHeaderSync(
13
+ tile: Tiles3DTileContent,
14
+ arrayBuffer: ArrayBuffer,
15
+ byteOffset: number
16
+ ) {
11
17
  const view = new DataView(arrayBuffer);
12
18
  let batchLength;
13
19
 
@@ -58,20 +64,30 @@ export function parse3DTileTablesHeaderSync(tile, arrayBuffer, byteOffset) {
58
64
  return byteOffset;
59
65
  }
60
66
 
61
- export function parse3DTileTablesSync(tile, arrayBuffer, byteOffset, options) {
67
+ export function parse3DTileTablesSync(
68
+ tile: Tiles3DTileContent,
69
+ arrayBuffer: ArrayBuffer,
70
+ byteOffset: number,
71
+ options?: Tiles3DLoaderOptions
72
+ ) {
62
73
  byteOffset = parse3DTileFeatureTable(tile, arrayBuffer, byteOffset, options);
63
74
  byteOffset = parse3DTileBatchTable(tile, arrayBuffer, byteOffset, options);
64
75
  return byteOffset;
65
76
  }
66
77
 
67
- function parse3DTileFeatureTable(tile, arrayBuffer, byteOffset, options) {
68
- const {featureTableJsonByteLength, featureTableBinaryByteLength, batchLength} = tile.header;
78
+ function parse3DTileFeatureTable(
79
+ tile: Tiles3DTileContent,
80
+ arrayBuffer: ArrayBuffer,
81
+ byteOffset: number,
82
+ options?: Tiles3DLoaderOptions
83
+ ) {
84
+ const {featureTableJsonByteLength, featureTableBinaryByteLength, batchLength} = tile.header || {};
69
85
 
70
86
  tile.featureTableJson = {
71
87
  BATCH_LENGTH: batchLength || 0
72
88
  };
73
89
 
74
- if (featureTableJsonByteLength > 0) {
90
+ if (featureTableJsonByteLength && featureTableJsonByteLength > 0) {
75
91
  const featureTableString = getStringFromArrayBuffer(
76
92
  arrayBuffer,
77
93
  byteOffset,
@@ -79,10 +95,10 @@ function parse3DTileFeatureTable(tile, arrayBuffer, byteOffset, options) {
79
95
  );
80
96
  tile.featureTableJson = JSON.parse(featureTableString);
81
97
  }
82
- byteOffset += featureTableJsonByteLength;
98
+ byteOffset += featureTableJsonByteLength || 0;
83
99
 
84
100
  tile.featureTableBinary = new Uint8Array(arrayBuffer, byteOffset, featureTableBinaryByteLength);
85
- byteOffset += featureTableBinaryByteLength;
101
+ byteOffset += featureTableBinaryByteLength || 0;
86
102
 
87
103
  /*
88
104
  const featureTable = parseFeatureTable(featureTableJson, featureTableBinary);
@@ -94,10 +110,15 @@ function parse3DTileFeatureTable(tile, arrayBuffer, byteOffset, options) {
94
110
  return byteOffset;
95
111
  }
96
112
 
97
- function parse3DTileBatchTable(tile, arrayBuffer, byteOffset, options) {
98
- const {batchTableJsonByteLength, batchTableBinaryByteLength} = tile.header;
113
+ function parse3DTileBatchTable(
114
+ tile: Tiles3DTileContent,
115
+ arrayBuffer: ArrayBuffer,
116
+ byteOffset: number,
117
+ options?: Tiles3DLoaderOptions
118
+ ) {
119
+ const {batchTableJsonByteLength, batchTableBinaryByteLength} = tile.header || {};
99
120
 
100
- if (batchTableJsonByteLength > 0) {
121
+ if (batchTableJsonByteLength && batchTableJsonByteLength > 0) {
101
122
  const batchTableString = getStringFromArrayBuffer(
102
123
  arrayBuffer,
103
124
  byteOffset,
@@ -106,7 +127,7 @@ function parse3DTileBatchTable(tile, arrayBuffer, byteOffset, options) {
106
127
  tile.batchTableJson = JSON.parse(batchTableString);
107
128
  byteOffset += batchTableJsonByteLength;
108
129
 
109
- if (batchTableBinaryByteLength > 0) {
130
+ if (batchTableBinaryByteLength && batchTableBinaryByteLength > 0) {
110
131
  // Has a batch table binary
111
132
  tile.batchTableBinary = new Uint8Array(arrayBuffer, byteOffset, batchTableBinaryByteLength);
112
133
  // Copy the batchTableBinary section and let the underlying ArrayBuffer be freed
@@ -8,8 +8,17 @@ import Tile3DFeatureTable from '../classes/tile-3d-feature-table';
8
8
  import {parse3DTileHeaderSync} from './helpers/parse-3d-tile-header';
9
9
  import {parse3DTileTablesHeaderSync, parse3DTileTablesSync} from './helpers/parse-3d-tile-tables';
10
10
  import {parse3DTileGLTFViewSync, extractGLTF, GLTF_FORMAT} from './helpers/parse-3d-tile-gltf-view';
11
-
12
- export async function parseBatchedModel3DTile(tile, arrayBuffer, byteOffset, options, context) {
11
+ import {Tiles3DTileContent} from '../../types';
12
+ import {Tiles3DLoaderOptions} from '../../tiles-3d-loader';
13
+ import {LoaderContext} from '@loaders.gl/loader-utils';
14
+
15
+ export async function parseBatchedModel3DTile(
16
+ tile: Tiles3DTileContent,
17
+ arrayBuffer: ArrayBuffer,
18
+ byteOffset: number,
19
+ options?: Tiles3DLoaderOptions,
20
+ context?: LoaderContext
21
+ ) {
13
22
  byteOffset = parseBatchedModel(tile, arrayBuffer, byteOffset, options, context);
14
23
  await extractGLTF(tile, GLTF_FORMAT.EMBEDDED, options, context);
15
24
 
@@ -21,7 +30,13 @@ export async function parseBatchedModel3DTile(tile, arrayBuffer, byteOffset, opt
21
30
  return byteOffset;
22
31
  }
23
32
 
24
- function parseBatchedModel(tile, arrayBuffer, byteOffset, options, context) {
33
+ function parseBatchedModel(
34
+ tile: Tiles3DTileContent,
35
+ arrayBuffer: ArrayBuffer,
36
+ byteOffset: number,
37
+ options?: Tiles3DLoaderOptions,
38
+ context?: LoaderContext
39
+ ) {
25
40
  byteOffset = parse3DTileHeaderSync(tile, arrayBuffer, byteOffset);
26
41
 
27
42
  byteOffset = parse3DTileTablesHeaderSync(tile, arrayBuffer, byteOffset);
@@ -7,23 +7,24 @@
7
7
  import type {LoaderContext} from '@loaders.gl/loader-utils';
8
8
  import type {Tiles3DLoaderOptions} from '../../tiles-3d-loader';
9
9
  import {parse3DTileHeaderSync} from './helpers/parse-3d-tile-header';
10
+ import {Tiles3DTileContent} from '../../types';
10
11
 
11
12
  /** Resolve circulate dependency by passing in parsing function as argument */
12
13
  type Parse3DTile = (
13
14
  arrayBuffer: ArrayBuffer,
14
15
  byteOffset: number,
15
- options: Tiles3DLoaderOptions,
16
- context: LoaderContext,
16
+ options: Tiles3DLoaderOptions | undefined,
17
+ context: LoaderContext | undefined,
17
18
  subtile
18
19
  ) => Promise<number>;
19
20
 
20
21
  // eslint-disable-next-line max-params
21
22
  export async function parseComposite3DTile(
22
- tile,
23
+ tile: Tiles3DTileContent,
23
24
  arrayBuffer: ArrayBuffer,
24
25
  byteOffset: number,
25
- options: Tiles3DLoaderOptions,
26
- context: LoaderContext,
26
+ options: Tiles3DLoaderOptions | undefined,
27
+ context: LoaderContext | undefined,
27
28
  parse3DTile: Parse3DTile
28
29
  ): Promise<number> {
29
30
  byteOffset = parse3DTileHeaderSync(tile, arrayBuffer, byteOffset);
@@ -36,7 +37,7 @@ export async function parseComposite3DTile(
36
37
 
37
38
  // extract each tile from the byte stream
38
39
  tile.tiles = [];
39
- while (tile.tiles.length < tile.tilesLength && tile.byteLength - byteOffset > 12) {
40
+ while (tile.tiles.length < tile.tilesLength && (tile.byteLength || 0) - byteOffset > 12) {
40
41
  const subtile = {};
41
42
  tile.tiles.push(subtile);
42
43
  byteOffset = await parse3DTile(arrayBuffer, byteOffset, options, context, subtile);
@@ -1,12 +1,13 @@
1
1
  import type {LoaderContext} from '@loaders.gl/loader-utils';
2
2
  import type {Tiles3DLoaderOptions} from '../../tiles-3d-loader';
3
3
  import {_getMemoryUsageGLTF, GLTFLoader, postProcessGLTF} from '@loaders.gl/gltf';
4
+ import {Tiles3DTileContent} from '../../types';
4
5
 
5
6
  export async function parseGltf3DTile(
6
- tile,
7
+ tile: Tiles3DTileContent,
7
8
  arrayBuffer: ArrayBuffer,
8
- options: Tiles3DLoaderOptions,
9
- context: LoaderContext
9
+ options?: Tiles3DLoaderOptions,
10
+ context?: LoaderContext
10
11
  ): Promise<void> {
11
12
  // Set flags
12
13
  // glTF models need to be rotated from Y to Z up
@@ -14,12 +15,19 @@ export async function parseGltf3DTile(
14
15
  tile.rotateYtoZ = true;
15
16
  // Save gltf up axis
16
17
  tile.gltfUpAxis =
17
- options['3d-tiles'] && options['3d-tiles'].assetGltfUpAxis
18
+ options?.['3d-tiles'] && options['3d-tiles'].assetGltfUpAxis
18
19
  ? options['3d-tiles'].assetGltfUpAxis
19
20
  : 'Y';
20
21
 
21
- const {parse} = context;
22
- const gltfWithBuffers = await parse(arrayBuffer, GLTFLoader, options, context);
23
- tile.gltf = postProcessGLTF(gltfWithBuffers);
24
- tile.gpuMemoryUsageInBytes = _getMemoryUsageGLTF(tile.gltf);
22
+ if (options?.['3d-tiles']?.loadGLTF) {
23
+ if (!context) {
24
+ return;
25
+ }
26
+ const {parse} = context;
27
+ const gltfWithBuffers = await parse(arrayBuffer, GLTFLoader, options, context);
28
+ tile.gltf = postProcessGLTF(gltfWithBuffers);
29
+ tile.gpuMemoryUsageInBytes = _getMemoryUsageGLTF(tile.gltf);
30
+ } else {
31
+ tile.gltfArrayBuffer = arrayBuffer;
32
+ }
25
33
  }
@@ -2,19 +2,26 @@ import type {Tiles3DLoaderOptions} from '../../tiles-3d-loader';
2
2
  import type {LoaderOptions} from '@loaders.gl/loader-utils';
3
3
  import {Tile3DSubtreeLoader} from '../../tile-3d-subtree-loader';
4
4
  import {load} from '@loaders.gl/core';
5
- import {Tileset3D, LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE, Tile3D} from '@loaders.gl/tiles';
6
- import {ImplicitTilingExtension, Subtree} from '../../types';
5
+ import {LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE} from '@loaders.gl/tiles';
6
+ import {
7
+ ImplicitTilingExensionData,
8
+ Subtree,
9
+ Tiles3DTileContentJSON,
10
+ Tiles3DTileJSON,
11
+ Tiles3DTileJSONPostprocessed,
12
+ Tiles3DTilesetJSON
13
+ } from '../../types';
7
14
  import type {S2VolumeBox} from './helpers/parse-3d-implicit-tiles';
8
15
  import {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';
9
16
  import type {S2VolumeInfo} from '../utils/obb/s2-corners-to-obb';
10
17
  import {convertS2BoundingVolumetoOBB} from '../utils/obb/s2-corners-to-obb';
11
18
 
12
- function getTileType(tile) {
13
- if (!tile.contentUrl) {
19
+ function getTileType(tile: Tiles3DTileJSON, tileContentUrl: string = ''): TILE_TYPE | string {
20
+ if (!tileContentUrl) {
14
21
  return TILE_TYPE.EMPTY;
15
22
  }
16
23
 
17
- const contentUrl = tile.contentUrl.split('?')[0]; // Discard query string
24
+ const contentUrl = tileContentUrl.split('?')[0]; // Discard query string
18
25
  const fileExtension = contentUrl.split('.').pop();
19
26
  switch (fileExtension) {
20
27
  case 'pnts':
@@ -25,11 +32,11 @@ function getTileType(tile) {
25
32
  case 'gltf':
26
33
  return TILE_TYPE.SCENEGRAPH;
27
34
  default:
28
- return fileExtension;
35
+ return fileExtension || TILE_TYPE.EMPTY;
29
36
  }
30
37
  }
31
38
 
32
- function getRefine(refine) {
39
+ function getRefine(refine?: string): TILE_REFINEMENT | string | undefined {
33
40
  switch (refine) {
34
41
  case 'REPLACE':
35
42
  case 'replace':
@@ -42,7 +49,7 @@ function getRefine(refine) {
42
49
  }
43
50
  }
44
51
 
45
- function resolveUri(uri, basePath) {
52
+ function resolveUri(uri: string = '', basePath: string): string {
46
53
  // url scheme per RFC3986
47
54
  const urlSchemeRegex = /^[a-z][0-9a-z+.-]*:/i;
48
55
 
@@ -56,42 +63,51 @@ function resolveUri(uri, basePath) {
56
63
  return `${basePath}/${uri}`;
57
64
  }
58
65
 
59
- export function normalizeTileData(tile, options) {
66
+ export function normalizeTileData(
67
+ tile: Tiles3DTileJSON | null,
68
+ basePath: string
69
+ ): Tiles3DTileJSONPostprocessed | null {
60
70
  if (!tile) {
61
71
  return null;
62
72
  }
73
+ let tileContentUrl: string | undefined;
63
74
  if (tile.content) {
64
- const contentUri = tile.content.uri || tile.content.url;
65
- tile.contentUrl = resolveUri(contentUri, options.basePath);
75
+ const contentUri = tile.content.uri || tile.content?.url;
76
+ tileContentUrl = resolveUri(contentUri, basePath);
66
77
  }
67
- tile.id = tile.contentUrl;
68
- tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;
69
- tile.lodMetricValue = tile.geometricError;
70
- tile.transformMatrix = tile.transform;
71
- tile.type = getTileType(tile);
72
- tile.refine = getRefine(tile.refine);
73
-
74
- return tile;
78
+ const tilePostprocessed: Tiles3DTileJSONPostprocessed = {
79
+ ...tile,
80
+ id: tileContentUrl,
81
+ contentUrl: tileContentUrl,
82
+ lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,
83
+ lodMetricValue: tile.geometricError,
84
+ transformMatrix: tile.transform,
85
+ type: getTileType(tile, tileContentUrl),
86
+ refine: getRefine(tile.refine)
87
+ };
88
+
89
+ return tilePostprocessed;
75
90
  }
76
91
 
77
92
  // normalize tile headers
78
93
  export async function normalizeTileHeaders(
79
- tileset: Tileset3D,
94
+ tileset: Tiles3DTilesetJSON,
95
+ basePath: string,
80
96
  options: LoaderOptions
81
- ): Promise<Tileset3D> {
82
- const basePath = tileset.basePath;
83
- let root: Tileset3D;
97
+ ): Promise<Tiles3DTileJSONPostprocessed | null> {
98
+ let root: Tiles3DTileJSONPostprocessed | null = null;
84
99
 
85
- const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset?.root);
100
+ const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset.root);
86
101
  if (rootImplicitTilingExtension && tileset.root) {
87
102
  root = await normalizeImplicitTileHeaders(
88
103
  tileset.root,
89
104
  tileset,
105
+ basePath,
90
106
  rootImplicitTilingExtension,
91
107
  options
92
108
  );
93
109
  } else {
94
- root = normalizeTileData(tileset.root, tileset);
110
+ root = normalizeTileData(tileset.root, basePath);
95
111
  }
96
112
 
97
113
  const stack: any[] = [];
@@ -100,21 +116,28 @@ export async function normalizeTileHeaders(
100
116
  while (stack.length > 0) {
101
117
  const tile = stack.pop() || {};
102
118
  const children = tile.children || [];
103
- for (let childHeader of children) {
119
+ const childrenPostprocessed: Tiles3DTileJSONPostprocessed[] = [];
120
+ for (const childHeader of children) {
104
121
  const childImplicitTilingExtension = getImplicitTilingExtensionData(childHeader);
122
+ let childHeaderPostprocessed: Tiles3DTileJSONPostprocessed | null;
105
123
  if (childImplicitTilingExtension) {
106
- childHeader = await normalizeImplicitTileHeaders(
124
+ childHeaderPostprocessed = await normalizeImplicitTileHeaders(
107
125
  childHeader,
108
126
  tileset,
127
+ basePath,
109
128
  childImplicitTilingExtension,
110
129
  options
111
130
  );
112
131
  } else {
113
- normalizeTileData(childHeader, {basePath});
132
+ childHeaderPostprocessed = normalizeTileData(childHeader, basePath);
114
133
  }
115
134
 
116
- stack.push(childHeader);
135
+ if (childHeaderPostprocessed) {
136
+ childrenPostprocessed.push(childHeaderPostprocessed);
137
+ stack.push(childHeaderPostprocessed);
138
+ }
117
139
  }
140
+ tile.children = childrenPostprocessed;
118
141
  }
119
142
 
120
143
  return root;
@@ -126,12 +149,12 @@ export async function normalizeTileHeaders(
126
149
  * @param tileset
127
150
  */
128
151
  export async function normalizeImplicitTileHeaders(
129
- tile: Tile3D,
130
- tileset: Tileset3D,
131
- implicitTilingExtension: ImplicitTilingExtension,
152
+ tile: Tiles3DTileJSON,
153
+ tileset: Tiles3DTilesetJSON,
154
+ basePath: string,
155
+ implicitTilingExtension: ImplicitTilingExensionData,
132
156
  options: Tiles3DLoaderOptions
133
- ) {
134
- const basePath = tileset.basePath;
157
+ ): Promise<Tiles3DTileJSONPostprocessed | null> {
135
158
  const {
136
159
  subdivisionScheme,
137
160
  maximumLevel,
@@ -141,7 +164,7 @@ export async function normalizeImplicitTileHeaders(
141
164
  const replacedUrlTemplate = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);
142
165
  const subtreeUrl = resolveUri(replacedUrlTemplate, basePath);
143
166
  const subtree = await load(subtreeUrl, Tile3DSubtreeLoader, options);
144
- const contentUrlTemplate = resolveUri(tile.content.uri, basePath);
167
+ const contentUrlTemplate = resolveUri(tile.content?.uri, basePath);
145
168
  const refine = tileset?.root?.refine;
146
169
  // @ts-ignore
147
170
  const rootLodMetricValue = tile.geometricError;
@@ -171,7 +194,7 @@ export async function normalizeImplicitTileHeaders(
171
194
  getRefine
172
195
  };
173
196
 
174
- return await normalizeImplicitTileData(tile, subtree, implicitOptions);
197
+ return await normalizeImplicitTileData(tile, basePath, subtree, implicitOptions);
175
198
  }
176
199
 
177
200
  /**
@@ -181,32 +204,41 @@ export async function normalizeImplicitTileHeaders(
181
204
  * @param options
182
205
  * @returns
183
206
  */
184
- export async function normalizeImplicitTileData(tile, rootSubtree: Subtree, options: any) {
207
+ export async function normalizeImplicitTileData(
208
+ tile: Tiles3DTileJSON,
209
+ basePath: string,
210
+ rootSubtree: Subtree,
211
+ options: any
212
+ ): Promise<Tiles3DTileJSONPostprocessed | null> {
185
213
  if (!tile) {
186
214
  return null;
187
215
  }
188
216
 
189
- tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;
190
- tile.lodMetricValue = tile.geometricError;
191
- tile.transformMatrix = tile.transform;
192
-
193
217
  const {children, contentUrl} = await parseImplicitTiles({
194
218
  subtree: rootSubtree,
195
- options,
196
- s2VolumeBox: tile
219
+ options
197
220
  });
198
221
 
222
+ let tileContentUrl: string | undefined;
223
+ let tileContent: Tiles3DTileContentJSON | null = null;
199
224
  if (contentUrl) {
200
- tile.contentUrl = contentUrl;
201
- tile.content = {uri: contentUrl.replace(`${options.basePath}/`, '')};
225
+ tileContentUrl = contentUrl;
226
+ tileContent = {uri: contentUrl.replace(`${basePath}/`, '')};
202
227
  }
228
+ const tilePostprocessed: Tiles3DTileJSONPostprocessed = {
229
+ ...tile,
230
+ id: tileContentUrl,
231
+ contentUrl: tileContentUrl,
232
+ lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,
233
+ lodMetricValue: tile.geometricError,
234
+ transformMatrix: tile.transform,
235
+ type: getTileType(tile, tileContentUrl),
236
+ refine: getRefine(tile.refine),
237
+ content: tileContent || tile.content,
238
+ children
239
+ };
203
240
 
204
- tile.refine = getRefine(tile.refine);
205
- tile.type = getTileType(tile);
206
- tile.children = children;
207
- tile.id = tile.contentUrl;
208
-
209
- return tile;
241
+ return tilePostprocessed;
210
242
  }
211
243
 
212
244
  /**
@@ -216,6 +248,6 @@ export async function normalizeImplicitTileData(tile, rootSubtree: Subtree, opti
216
248
  * @param tile
217
249
  * @returns
218
250
  */
219
- function getImplicitTilingExtensionData(tile: Tile3D | null): ImplicitTilingExtension {
251
+ function getImplicitTilingExtensionData(tile: Tiles3DTileJSON | null): ImplicitTilingExensionData {
220
252
  return tile?.extensions?.['3DTILES_implicit_tiling'] || tile?.implicitTiling;
221
253
  }
@@ -12,25 +12,26 @@ import {parse3DTileTablesHeaderSync, parse3DTileTablesSync} from './helpers/pars
12
12
  import {parse3DTileGLTFViewSync, extractGLTF} from './helpers/parse-3d-tile-gltf-view';
13
13
  import {Tiles3DLoaderOptions} from '../../tiles-3d-loader';
14
14
  import {LoaderContext} from '@loaders.gl/loader-utils';
15
+ import {Tiles3DTileContent} from '../../types';
15
16
 
16
17
  export async function parseInstancedModel3DTile(
17
- tile,
18
+ tile: Tiles3DTileContent,
18
19
  arrayBuffer: ArrayBuffer,
19
20
  byteOffset: number,
20
- options: Tiles3DLoaderOptions,
21
- context: LoaderContext
21
+ options?: Tiles3DLoaderOptions,
22
+ context?: LoaderContext
22
23
  ): Promise<number> {
23
24
  byteOffset = parseInstancedModel(tile, arrayBuffer, byteOffset, options, context);
24
- await extractGLTF(tile, tile.gltfFormat, options, context);
25
+ await extractGLTF(tile, tile.gltfFormat || 0, options, context);
25
26
  return byteOffset;
26
27
  }
27
28
 
28
29
  function parseInstancedModel(
29
- tile,
30
+ tile: Tiles3DTileContent,
30
31
  arrayBuffer: ArrayBuffer,
31
32
  byteOffset: number,
32
- options: Tiles3DLoaderOptions,
33
- context: LoaderContext
33
+ options?: Tiles3DLoaderOptions,
34
+ context?: LoaderContext
34
35
  ): number {
35
36
  byteOffset = parse3DTileHeaderSync(tile, arrayBuffer, byteOffset);
36
37
  if (tile.version !== 1) {
@@ -50,7 +51,7 @@ function parseInstancedModel(
50
51
  byteOffset = parse3DTileGLTFViewSync(tile, arrayBuffer, byteOffset, options);
51
52
 
52
53
  // TODO - Is the feature table sometimes optional or can check be moved into table header parser?
53
- if (tile.featureTableJsonByteLength === 0) {
54
+ if (!tile?.header?.featureTableJsonByteLength || tile.header.featureTableJsonByteLength === 0) {
54
55
  throw new Error('i3dm parser: featureTableJsonByteLength is zero.');
55
56
  }
56
57
 
@@ -78,23 +79,13 @@ function parseInstancedModel(
78
79
  }
79
80
 
80
81
  // eslint-disable-next-line max-statements, complexity
81
- function extractInstancedAttributes(tile, featureTable, batchTable, instancesLength) {
82
- // Create model instance collection
83
- const collectionOptions = {
84
- instances: new Array(instancesLength),
85
- batchTable: tile._batchTable,
86
- cull: false, // Already culled by 3D Tiles
87
- url: undefined,
88
- // requestType: RequestType.TILES3D,
89
- gltf: undefined,
90
- basePath: undefined,
91
- incrementallyLoadTextures: false,
92
- // TODO - tileset is not available at this stage, tile is parsed independently
93
- // upAxis: (tileset && tileset._gltfUpAxis) || [0, 1, 0],
94
- forwardAxis: [1, 0, 0]
95
- };
96
-
97
- const instances = collectionOptions.instances;
82
+ function extractInstancedAttributes(
83
+ tile: Tiles3DTileContent,
84
+ featureTable: Tile3DFeatureTable,
85
+ batchTable: Tile3DBatchTable,
86
+ instancesLength: number
87
+ ) {
88
+ const instances = new Array(instancesLength);
98
89
  const instancePosition = new Vector3();
99
90
  const instanceNormalRight = new Vector3();
100
91
  const instanceNormalUp = new Vector3();
@@ -106,8 +97,8 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
106
97
  const instanceTransform = new Matrix4();
107
98
  const scratch1 = [];
108
99
  const scratch2 = [];
109
- const scratchVector1 = new Vector3();
110
- const scratchVector2 = new Vector3();
100
+ const scratch3 = [];
101
+ const scratch4 = [];
111
102
 
112
103
  for (let i = 0; i < instancesLength; i++) {
113
104
  let position;
@@ -127,8 +118,7 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
127
118
  const quantizedVolumeOffset = featureTable.getGlobalProperty(
128
119
  'QUANTIZED_VOLUME_OFFSET',
129
120
  GL.FLOAT,
130
- 3,
131
- scratchVector1
121
+ 3
132
122
  );
133
123
  if (!quantizedVolumeOffset) {
134
124
  throw new Error(
@@ -139,8 +129,7 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
139
129
  const quantizedVolumeScale = featureTable.getGlobalProperty(
140
130
  'QUANTIZED_VOLUME_SCALE',
141
131
  GL.FLOAT,
142
- 3,
143
- scratchVector2
132
+ 3
144
133
  );
145
134
  if (!quantizedVolumeScale) {
146
135
  throw new Error(
@@ -180,12 +169,14 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
180
169
  'NORMAL_UP_OCT32P',
181
170
  GL.UNSIGNED_SHORT,
182
171
  2,
172
+ i,
183
173
  scratch1
184
174
  );
185
175
  tile.octNormalRight = featureTable.getProperty(
186
176
  'NORMAL_RIGHT_OCT32P',
187
177
  GL.UNSIGNED_SHORT,
188
178
  2,
179
+ i,
189
180
  scratch2
190
181
  );
191
182
 
@@ -223,7 +214,7 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
223
214
 
224
215
  // Get the instance scale
225
216
  instanceScale.set(1.0, 1.0, 1.0);
226
- const scale = featureTable.getProperty('SCALE', GL.FLOAT, 1, i);
217
+ const scale = featureTable.getProperty('SCALE', GL.FLOAT, 1, i, scratch3);
227
218
  if (Number.isFinite(scale)) {
228
219
  instanceScale.multiplyByScalar(scale);
229
220
  }
@@ -236,7 +227,7 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
236
227
  instanceTranslationRotationScale.scale = instanceScale;
237
228
 
238
229
  // Get the batchId
239
- let batchId = featureTable.getProperty('BATCH_ID', GL.UNSIGNED_SHORT, 1, i);
230
+ let batchId = featureTable.getProperty('BATCH_ID', GL.UNSIGNED_SHORT, 1, i, scratch4);
240
231
  if (batchId === undefined) {
241
232
  // If BATCH_ID semantic is undefined, batchId is just the instance number
242
233
  batchId = i;