@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.
- package/dist/dist.min.js +317 -146
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js +4 -3
- package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js +2 -2
- package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-gltf-view.js +30 -18
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js +12 -12
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-batched-model.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-composite.js +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-composite.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-gltf.js +19 -4
- package/dist/es5/lib/parsers/parse-3d-tile-gltf.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-header.js +98 -80
- package/dist/es5/lib/parsers/parse-3d-tile-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js +12 -21
- package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js +29 -5
- package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile.js.map +1 -1
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/es5/tiles-3d-loader.js +26 -31
- package/dist/es5/tiles-3d-loader.js.map +1 -1
- package/dist/es5/types.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js +3 -3
- package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/normalize-3d-tile-normals.js +2 -2
- package/dist/esm/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-gltf-view.js +15 -9
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js +7 -7
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-batched-model.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-composite.js +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-composite.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-gltf.js +15 -7
- package/dist/esm/lib/parsers/parse-3d-tile-gltf.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-header.js +62 -45
- package/dist/esm/lib/parsers/parse-3d-tile-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-instanced-model.js +12 -21
- package/dist/esm/lib/parsers/parse-3d-tile-instanced-model.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js +23 -2
- package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile.js.map +1 -1
- package/dist/esm/lib/utils/version.js +1 -1
- package/dist/esm/tiles-3d-loader.js +18 -12
- package/dist/esm/tiles-3d-loader.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/normalize-3d-tile-colors.d.ts +4 -2
- package/dist/lib/parsers/helpers/normalize-3d-tile-colors.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/normalize-3d-tile-colors.js +3 -3
- package/dist/lib/parsers/helpers/normalize-3d-tile-normals.d.ts +3 -2
- package/dist/lib/parsers/helpers/normalize-3d-tile-normals.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/normalize-3d-tile-normals.js +2 -2
- package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.d.ts +5 -2
- package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.js +15 -9
- package/dist/lib/parsers/helpers/parse-3d-tile-header.d.ts +2 -1
- package/dist/lib/parsers/helpers/parse-3d-tile-header.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/parse-3d-tile-tables.d.ts +4 -2
- package/dist/lib/parsers/helpers/parse-3d-tile-tables.d.ts.map +1 -1
- package/dist/lib/parsers/helpers/parse-3d-tile-tables.js +7 -7
- package/dist/lib/parsers/parse-3d-tile-batched-model.d.ts +4 -1
- package/dist/lib/parsers/parse-3d-tile-batched-model.d.ts.map +1 -1
- package/dist/lib/parsers/parse-3d-tile-batched-model.js +1 -1
- package/dist/lib/parsers/parse-3d-tile-composite.d.ts +3 -2
- package/dist/lib/parsers/parse-3d-tile-composite.d.ts.map +1 -1
- package/dist/lib/parsers/parse-3d-tile-composite.js +1 -1
- package/dist/lib/parsers/parse-3d-tile-gltf.d.ts +2 -1
- package/dist/lib/parsers/parse-3d-tile-gltf.d.ts.map +1 -1
- package/dist/lib/parsers/parse-3d-tile-gltf.js +13 -5
- package/dist/lib/parsers/parse-3d-tile-header.d.ts +5 -6
- package/dist/lib/parsers/parse-3d-tile-header.d.ts.map +1 -1
- package/dist/lib/parsers/parse-3d-tile-header.js +57 -42
- package/dist/lib/parsers/parse-3d-tile-instanced-model.d.ts +2 -1
- package/dist/lib/parsers/parse-3d-tile-instanced-model.d.ts.map +1 -1
- package/dist/lib/parsers/parse-3d-tile-instanced-model.js +11 -25
- package/dist/lib/parsers/parse-3d-tile-point-cloud.d.ts +3 -2
- package/dist/lib/parsers/parse-3d-tile-point-cloud.d.ts.map +1 -1
- package/dist/lib/parsers/parse-3d-tile-point-cloud.js +23 -2
- package/dist/lib/parsers/parse-3d-tile.d.ts +4 -1
- package/dist/lib/parsers/parse-3d-tile.d.ts.map +1 -1
- package/dist/lib/parsers/parse-3d-tile.js +0 -4
- package/dist/tiles-3d-loader.d.ts.map +1 -1
- package/dist/tiles-3d-loader.js +18 -17
- package/dist/types.d.ts +257 -15
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/index.ts +12 -1
- package/src/lib/parsers/helpers/normalize-3d-tile-colors.ts +10 -4
- package/src/lib/parsers/helpers/normalize-3d-tile-normals.ts +7 -3
- package/src/lib/parsers/helpers/parse-3d-implicit-tiles.ts +4 -4
- package/src/lib/parsers/helpers/parse-3d-tile-gltf-view.ts +35 -13
- package/src/lib/parsers/helpers/parse-3d-tile-header.ts +7 -1
- package/src/lib/parsers/helpers/parse-3d-tile-tables.ts +32 -11
- package/src/lib/parsers/parse-3d-tile-batched-model.ts +18 -3
- package/src/lib/parsers/parse-3d-tile-composite.ts +7 -6
- package/src/lib/parsers/parse-3d-tile-gltf.ts +16 -8
- package/src/lib/parsers/parse-3d-tile-header.ts +84 -52
- package/src/lib/parsers/parse-3d-tile-instanced-model.ts +24 -33
- package/src/lib/parsers/parse-3d-tile-point-cloud.ts +51 -19
- package/src/lib/parsers/parse-3d-tile.ts +10 -5
- package/src/tiles-3d-loader.ts +21 -23
- 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(
|
|
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(
|
|
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(
|
|
68
|
-
|
|
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(
|
|
98
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
9
|
-
context
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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 {
|
|
6
|
-
import {
|
|
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 (!
|
|
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 =
|
|
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(
|
|
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
|
|
65
|
-
|
|
75
|
+
const contentUri = tile.content.uri || tile.content?.url;
|
|
76
|
+
tileContentUrl = resolveUri(contentUri, basePath);
|
|
66
77
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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:
|
|
94
|
+
tileset: Tiles3DTilesetJSON,
|
|
95
|
+
basePath: string,
|
|
80
96
|
options: LoaderOptions
|
|
81
|
-
): Promise<
|
|
82
|
-
|
|
83
|
-
let root: Tileset3D;
|
|
97
|
+
): Promise<Tiles3DTileJSONPostprocessed | null> {
|
|
98
|
+
let root: Tiles3DTileJSONPostprocessed | null = null;
|
|
84
99
|
|
|
85
|
-
const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
132
|
+
childHeaderPostprocessed = normalizeTileData(childHeader, basePath);
|
|
114
133
|
}
|
|
115
134
|
|
|
116
|
-
|
|
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:
|
|
130
|
-
tileset:
|
|
131
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
201
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
21
|
-
context
|
|
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
|
|
33
|
-
context
|
|
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(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
|
110
|
-
const
|
|
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;
|