@loaders.gl/tile-converter 4.0.0-alpha.21 → 4.0.0-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/tile-converter",
3
- "version": "4.0.0-alpha.21",
3
+ "version": "4.0.0-alpha.22",
4
4
  "description": "Converter",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -45,18 +45,18 @@
45
45
  "build-i3s-server-bundle": "esbuild src/i3s-server/bin/www.ts --outfile=dist/esm/i3s-server/bin/i3s-server.min.js --platform=node --target=esnext,node14 --external:join-images --minify --bundle --define:__VERSION__=\\\"$npm_package_version\\\""
46
46
  },
47
47
  "dependencies": {
48
- "@loaders.gl/3d-tiles": "4.0.0-alpha.21",
49
- "@loaders.gl/crypto": "4.0.0-alpha.21",
50
- "@loaders.gl/draco": "4.0.0-alpha.21",
51
- "@loaders.gl/gltf": "4.0.0-alpha.21",
52
- "@loaders.gl/i3s": "4.0.0-alpha.21",
53
- "@loaders.gl/images": "4.0.0-alpha.21",
54
- "@loaders.gl/loader-utils": "4.0.0-alpha.21",
55
- "@loaders.gl/polyfills": "4.0.0-alpha.21",
56
- "@loaders.gl/textures": "4.0.0-alpha.21",
57
- "@loaders.gl/tiles": "4.0.0-alpha.21",
58
- "@loaders.gl/worker-utils": "4.0.0-alpha.21",
59
- "@loaders.gl/zip": "4.0.0-alpha.21",
48
+ "@loaders.gl/3d-tiles": "4.0.0-alpha.22",
49
+ "@loaders.gl/crypto": "4.0.0-alpha.22",
50
+ "@loaders.gl/draco": "4.0.0-alpha.22",
51
+ "@loaders.gl/gltf": "4.0.0-alpha.22",
52
+ "@loaders.gl/i3s": "4.0.0-alpha.22",
53
+ "@loaders.gl/images": "4.0.0-alpha.22",
54
+ "@loaders.gl/loader-utils": "4.0.0-alpha.22",
55
+ "@loaders.gl/polyfills": "4.0.0-alpha.22",
56
+ "@loaders.gl/textures": "4.0.0-alpha.22",
57
+ "@loaders.gl/tiles": "4.0.0-alpha.22",
58
+ "@loaders.gl/worker-utils": "4.0.0-alpha.22",
59
+ "@loaders.gl/zip": "4.0.0-alpha.22",
60
60
  "@math.gl/core": "^3.5.1",
61
61
  "@math.gl/culling": "^3.5.1",
62
62
  "@math.gl/geoid": "^3.5.1",
@@ -80,7 +80,7 @@
80
80
  "join-images": "^1.1.3",
81
81
  "sharp": "^0.31.3"
82
82
  },
83
- "gitHead": "df5d670b136192b26941396e944f9c46be788e83",
83
+ "gitHead": "0da838c506d1275383f2fd3d244d9c72b25397d2",
84
84
  "devDependencies": {
85
85
  "@types/express": "^4.17.17",
86
86
  "@types/node": "^20.4.2"
@@ -4,7 +4,8 @@ import type {
4
4
  Tiles3DTileJSONPostprocessed,
5
5
  Tiles3DTilesetJSONPostprocessed
6
6
  } from '@loaders.gl/3d-tiles';
7
- import {load} from '@loaders.gl/core';
7
+ import {Tiles3DArchiveFileSystem} from '@loaders.gl/3d-tiles';
8
+ import {LoaderWithParser, load} from '@loaders.gl/core';
8
9
 
9
10
  /**
10
11
  * Load nested 3DTiles tileset. If the sourceTile is not nested tileset - do nothing
@@ -18,7 +19,7 @@ export const loadNestedTileset = async (
18
19
  sourceTile: Tiles3DTileJSONPostprocessed,
19
20
  tilesetLoadOptions: Tiles3DLoaderOptions
20
21
  ): Promise<void> => {
21
- const isTileset = sourceTile.type === 'json';
22
+ const isTileset = isNestedTileset(sourceTile);
22
23
  if (!sourceTileset || !sourceTile.contentUrl || !isTileset) {
23
24
  return;
24
25
  }
@@ -30,7 +31,11 @@ export const loadNestedTileset = async (
30
31
  assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'
31
32
  }
32
33
  };
33
- const tileContent = await load(sourceTile.contentUrl, sourceTileset.loader, loadOptions);
34
+ const tileContent = await loadFromArchive(
35
+ sourceTile.contentUrl,
36
+ sourceTileset.loader,
37
+ loadOptions
38
+ );
34
39
 
35
40
  if (tileContent.root) {
36
41
  sourceTile.children = [tileContent.root];
@@ -49,7 +54,7 @@ export const loadTile3DContent = async (
49
54
  sourceTile: Tiles3DTileJSONPostprocessed,
50
55
  tilesetLoadOptions: Tiles3DLoaderOptions
51
56
  ): Promise<Tiles3DTileContent | null> => {
52
- const isTileset = sourceTile.type === 'json';
57
+ const isTileset = isNestedTileset(sourceTile);
53
58
  if (!sourceTileset || !sourceTile.contentUrl || isTileset) {
54
59
  return null;
55
60
  }
@@ -62,7 +67,58 @@ export const loadTile3DContent = async (
62
67
  assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'
63
68
  }
64
69
  };
65
- const tileContent = await load(sourceTile.contentUrl, sourceTileset.loader, loadOptions);
70
+ const tileContent = await loadFromArchive(
71
+ sourceTile.contentUrl,
72
+ sourceTileset.loader,
73
+ loadOptions
74
+ );
66
75
 
67
76
  return tileContent;
68
77
  };
78
+
79
+ /**
80
+ * Load a resource with load options and .3tz format support
81
+ * @param url - resource URL
82
+ * @param loader - loader to parse data (Tiles3DLoader / CesiumIonLoader)
83
+ * @param loadOptions - 3d-tiles loader options
84
+ * @returns 3d-tiles resource
85
+ */
86
+ export async function loadFromArchive(
87
+ url: string,
88
+ loader: LoaderWithParser,
89
+ loadOptions: Tiles3DLoaderOptions
90
+ ) {
91
+ const tz3UrlParts = url.split('.3tz');
92
+ let filename: string | null;
93
+ // No '.3tz'. The file will be loaded with global fetch function
94
+ if (tz3UrlParts.length === 1) {
95
+ filename = null;
96
+ } else if (tz3UrlParts.length === 2) {
97
+ filename = tz3UrlParts[1].slice(1);
98
+ if (filename === '') {
99
+ filename = 'tileset.json';
100
+ }
101
+ } else {
102
+ throw new Error('Unexpected URL format');
103
+ }
104
+ if (filename) {
105
+ const tz3Path = `${tz3UrlParts[0]}.3tz`;
106
+ const fileSystem = new Tiles3DArchiveFileSystem(tz3Path);
107
+ const content = await load(filename, loader, {
108
+ ...loadOptions,
109
+ fetch: fileSystem.fetch.bind(fileSystem)
110
+ });
111
+ await fileSystem.destroy();
112
+ return content;
113
+ }
114
+ return await load(url, loader, loadOptions);
115
+ }
116
+
117
+ /**
118
+ * Check if tile is nested tileset
119
+ * @param tile - 3DTiles header data
120
+ * @returns true if tile is nested tileset
121
+ */
122
+ export function isNestedTileset(tile: Tiles3DTileJSONPostprocessed) {
123
+ return tile?.type === 'json' || tile?.type === '3tz';
124
+ }
@@ -67,7 +67,12 @@ import {
67
67
  getFieldAttributeType
68
68
  } from './helpers/feature-attributes';
69
69
  import {NodeIndexDocument} from './helpers/node-index-document';
70
- import {loadNestedTileset, loadTile3DContent} from './helpers/load-3d-tiles';
70
+ import {
71
+ isNestedTileset,
72
+ loadNestedTileset,
73
+ loadTile3DContent,
74
+ loadFromArchive
75
+ } from './helpers/load-3d-tiles';
71
76
  import {Matrix4} from '@math.gl/core';
72
77
  import {BoundingSphere, OrientedBoundingBox} from '@math.gl/culling';
73
78
  import {createBoundingVolume} from '@loaders.gl/tiles';
@@ -251,7 +256,7 @@ export default class I3SConverter {
251
256
  if (preloadOptions.headers) {
252
257
  this.loadOptions.fetch = {headers: preloadOptions.headers};
253
258
  }
254
- this.sourceTileset = await load(tilesetUrl, this.Loader, this.loadOptions);
259
+ this.sourceTileset = await loadFromArchive(tilesetUrl, this.Loader, this.loadOptions);
255
260
 
256
261
  const preprocessResult = await this.preprocessConversion();
257
262
 
@@ -349,7 +354,8 @@ export default class I3SConverter {
349
354
  sourceTile: Tiles3DTileJSONPostprocessed,
350
355
  traversalProps: null
351
356
  ): Promise<null> {
352
- if (sourceTile.type === 'json') {
357
+ const isTileset = isNestedTileset(sourceTile);
358
+ if (isTileset) {
353
359
  await loadNestedTileset(this.sourceTileset, sourceTile, this.loadOptions);
354
360
  return null;
355
361
  }
@@ -562,8 +568,9 @@ export default class I3SConverter {
562
568
  sourceTile: Tiles3DTileJSONPostprocessed,
563
569
  traversalProps: TraversalConversionProps
564
570
  ): Promise<TraversalConversionProps> {
565
- if (sourceTile.type === 'json' || sourceTile.type === 'empty') {
566
- if (sourceTile.type === 'json') {
571
+ const isTileset = isNestedTileset(sourceTile);
572
+ if (isTileset || sourceTile.type === 'empty') {
573
+ if (isTileset) {
567
574
  if (sourceTile.id) {
568
575
  console.log(`[load]: ${sourceTile.id}`); // eslint-disable-line
569
576
  }