@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
|
@@ -4,10 +4,11 @@ import { LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE } from '@loaders.gl/tiles';
|
|
|
4
4
|
import { parseImplicitTiles, replaceContentUrlTemplate } from './helpers/parse-3d-implicit-tiles';
|
|
5
5
|
import { convertS2BoundingVolumetoOBB } from '../utils/obb/s2-corners-to-obb';
|
|
6
6
|
function getTileType(tile) {
|
|
7
|
-
|
|
7
|
+
let tileContentUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
8
|
+
if (!tileContentUrl) {
|
|
8
9
|
return TILE_TYPE.EMPTY;
|
|
9
10
|
}
|
|
10
|
-
const contentUrl =
|
|
11
|
+
const contentUrl = tileContentUrl.split('?')[0];
|
|
11
12
|
const fileExtension = contentUrl.split('.').pop();
|
|
12
13
|
switch (fileExtension) {
|
|
13
14
|
case 'pnts':
|
|
@@ -18,7 +19,7 @@ function getTileType(tile) {
|
|
|
18
19
|
case 'gltf':
|
|
19
20
|
return TILE_TYPE.SCENEGRAPH;
|
|
20
21
|
default:
|
|
21
|
-
return fileExtension;
|
|
22
|
+
return fileExtension || TILE_TYPE.EMPTY;
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
function getRefine(refine) {
|
|
@@ -33,7 +34,9 @@ function getRefine(refine) {
|
|
|
33
34
|
return refine;
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
|
-
function resolveUri(
|
|
37
|
+
function resolveUri() {
|
|
38
|
+
let uri = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
39
|
+
let basePath = arguments.length > 1 ? arguments[1] : undefined;
|
|
37
40
|
const urlSchemeRegex = /^[a-z][0-9a-z+.-]*:/i;
|
|
38
41
|
if (urlSchemeRegex.test(basePath)) {
|
|
39
42
|
const url = new URL(uri, "".concat(basePath, "/"));
|
|
@@ -43,53 +46,61 @@ function resolveUri(uri, basePath) {
|
|
|
43
46
|
}
|
|
44
47
|
return "".concat(basePath, "/").concat(uri);
|
|
45
48
|
}
|
|
46
|
-
export function normalizeTileData(tile,
|
|
49
|
+
export function normalizeTileData(tile, basePath) {
|
|
47
50
|
if (!tile) {
|
|
48
51
|
return null;
|
|
49
52
|
}
|
|
53
|
+
let tileContentUrl;
|
|
50
54
|
if (tile.content) {
|
|
51
|
-
|
|
52
|
-
tile.
|
|
55
|
+
var _tile$content;
|
|
56
|
+
const contentUri = tile.content.uri || ((_tile$content = tile.content) === null || _tile$content === void 0 ? void 0 : _tile$content.url);
|
|
57
|
+
tileContentUrl = resolveUri(contentUri, basePath);
|
|
53
58
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
const tilePostprocessed = {
|
|
60
|
+
...tile,
|
|
61
|
+
id: tileContentUrl,
|
|
62
|
+
contentUrl: tileContentUrl,
|
|
63
|
+
lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,
|
|
64
|
+
lodMetricValue: tile.geometricError,
|
|
65
|
+
transformMatrix: tile.transform,
|
|
66
|
+
type: getTileType(tile, tileContentUrl),
|
|
67
|
+
refine: getRefine(tile.refine)
|
|
68
|
+
};
|
|
69
|
+
return tilePostprocessed;
|
|
61
70
|
}
|
|
62
|
-
export async function normalizeTileHeaders(tileset, options) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset === null || tileset === void 0 ? void 0 : tileset.root);
|
|
71
|
+
export async function normalizeTileHeaders(tileset, basePath, options) {
|
|
72
|
+
let root = null;
|
|
73
|
+
const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset.root);
|
|
66
74
|
if (rootImplicitTilingExtension && tileset.root) {
|
|
67
|
-
root = await normalizeImplicitTileHeaders(tileset.root, tileset, rootImplicitTilingExtension, options);
|
|
75
|
+
root = await normalizeImplicitTileHeaders(tileset.root, tileset, basePath, rootImplicitTilingExtension, options);
|
|
68
76
|
} else {
|
|
69
|
-
root = normalizeTileData(tileset.root,
|
|
77
|
+
root = normalizeTileData(tileset.root, basePath);
|
|
70
78
|
}
|
|
71
79
|
const stack = [];
|
|
72
80
|
stack.push(root);
|
|
73
81
|
while (stack.length > 0) {
|
|
74
82
|
const tile = stack.pop() || {};
|
|
75
83
|
const children = tile.children || [];
|
|
76
|
-
|
|
84
|
+
const childrenPostprocessed = [];
|
|
85
|
+
for (const childHeader of children) {
|
|
77
86
|
const childImplicitTilingExtension = getImplicitTilingExtensionData(childHeader);
|
|
87
|
+
let childHeaderPostprocessed;
|
|
78
88
|
if (childImplicitTilingExtension) {
|
|
79
|
-
|
|
89
|
+
childHeaderPostprocessed = await normalizeImplicitTileHeaders(childHeader, tileset, basePath, childImplicitTilingExtension, options);
|
|
80
90
|
} else {
|
|
81
|
-
normalizeTileData(childHeader,
|
|
82
|
-
|
|
83
|
-
|
|
91
|
+
childHeaderPostprocessed = normalizeTileData(childHeader, basePath);
|
|
92
|
+
}
|
|
93
|
+
if (childHeaderPostprocessed) {
|
|
94
|
+
childrenPostprocessed.push(childHeaderPostprocessed);
|
|
95
|
+
stack.push(childHeaderPostprocessed);
|
|
84
96
|
}
|
|
85
|
-
stack.push(childHeader);
|
|
86
97
|
}
|
|
98
|
+
tile.children = childrenPostprocessed;
|
|
87
99
|
}
|
|
88
100
|
return root;
|
|
89
101
|
}
|
|
90
|
-
export async function normalizeImplicitTileHeaders(tile, tileset, implicitTilingExtension, options) {
|
|
91
|
-
var _tileset$root, _tile$boundingVolume$;
|
|
92
|
-
const basePath = tileset.basePath;
|
|
102
|
+
export async function normalizeImplicitTileHeaders(tile, tileset, basePath, implicitTilingExtension, options) {
|
|
103
|
+
var _tile$content2, _tileset$root, _tile$boundingVolume$;
|
|
93
104
|
const {
|
|
94
105
|
subdivisionScheme,
|
|
95
106
|
maximumLevel,
|
|
@@ -101,7 +112,7 @@ export async function normalizeImplicitTileHeaders(tile, tileset, implicitTiling
|
|
|
101
112
|
const replacedUrlTemplate = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);
|
|
102
113
|
const subtreeUrl = resolveUri(replacedUrlTemplate, basePath);
|
|
103
114
|
const subtree = await load(subtreeUrl, Tile3DSubtreeLoader, options);
|
|
104
|
-
const contentUrlTemplate = resolveUri(tile.content.uri, basePath);
|
|
115
|
+
const contentUrlTemplate = resolveUri((_tile$content2 = tile.content) === null || _tile$content2 === void 0 ? void 0 : _tile$content2.uri, basePath);
|
|
105
116
|
const refine = tileset === null || tileset === void 0 ? void 0 : (_tileset$root = tileset.root) === null || _tileset$root === void 0 ? void 0 : _tileset$root.refine;
|
|
106
117
|
const rootLodMetricValue = tile.geometricError;
|
|
107
118
|
const s2VolumeInfo = (_tile$boundingVolume$ = tile.boundingVolume.extensions) === null || _tile$boundingVolume$ === void 0 ? void 0 : _tile$boundingVolume$['3DTILES_bounding_volume_S2'];
|
|
@@ -128,34 +139,40 @@ export async function normalizeImplicitTileHeaders(tile, tileset, implicitTiling
|
|
|
128
139
|
getTileType,
|
|
129
140
|
getRefine
|
|
130
141
|
};
|
|
131
|
-
return await normalizeImplicitTileData(tile, subtree, implicitOptions);
|
|
142
|
+
return await normalizeImplicitTileData(tile, basePath, subtree, implicitOptions);
|
|
132
143
|
}
|
|
133
|
-
export async function normalizeImplicitTileData(tile, rootSubtree, options) {
|
|
144
|
+
export async function normalizeImplicitTileData(tile, basePath, rootSubtree, options) {
|
|
134
145
|
if (!tile) {
|
|
135
146
|
return null;
|
|
136
147
|
}
|
|
137
|
-
tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;
|
|
138
|
-
tile.lodMetricValue = tile.geometricError;
|
|
139
|
-
tile.transformMatrix = tile.transform;
|
|
140
148
|
const {
|
|
141
149
|
children,
|
|
142
150
|
contentUrl
|
|
143
151
|
} = await parseImplicitTiles({
|
|
144
152
|
subtree: rootSubtree,
|
|
145
|
-
options
|
|
146
|
-
s2VolumeBox: tile
|
|
153
|
+
options
|
|
147
154
|
});
|
|
155
|
+
let tileContentUrl;
|
|
156
|
+
let tileContent = null;
|
|
148
157
|
if (contentUrl) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
uri: contentUrl.replace("".concat(
|
|
158
|
+
tileContentUrl = contentUrl;
|
|
159
|
+
tileContent = {
|
|
160
|
+
uri: contentUrl.replace("".concat(basePath, "/"), '')
|
|
152
161
|
};
|
|
153
162
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
163
|
+
const tilePostprocessed = {
|
|
164
|
+
...tile,
|
|
165
|
+
id: tileContentUrl,
|
|
166
|
+
contentUrl: tileContentUrl,
|
|
167
|
+
lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,
|
|
168
|
+
lodMetricValue: tile.geometricError,
|
|
169
|
+
transformMatrix: tile.transform,
|
|
170
|
+
type: getTileType(tile, tileContentUrl),
|
|
171
|
+
refine: getRefine(tile.refine),
|
|
172
|
+
content: tileContent || tile.content,
|
|
173
|
+
children
|
|
174
|
+
};
|
|
175
|
+
return tilePostprocessed;
|
|
159
176
|
}
|
|
160
177
|
function getImplicitTilingExtensionData(tile) {
|
|
161
178
|
var _tile$extensions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-3d-tile-header.js","names":["Tile3DSubtreeLoader","load","LOD_METRIC_TYPE","TILE_REFINEMENT","TILE_TYPE","parseImplicitTiles","replaceContentUrlTemplate","convertS2BoundingVolumetoOBB","getTileType","tile","contentUrl","EMPTY","split","fileExtension","pop","POINTCLOUD","SCENEGRAPH","getRefine","refine","REPLACE","ADD","resolveUri","uri","basePath","urlSchemeRegex","test","url","URL","concat","decodeURI","toString","startsWith","normalizeTileData","options","content","contentUri","id","lodMetricType","GEOMETRIC_ERROR","lodMetricValue","geometricError","transformMatrix","transform","type","normalizeTileHeaders","tileset","root","rootImplicitTilingExtension","getImplicitTilingExtensionData","normalizeImplicitTileHeaders","stack","push","length","children","childHeader","childImplicitTilingExtension","implicitTilingExtension","_tileset$root","_tile$boundingVolume$","subdivisionScheme","maximumLevel","subtreeLevels","subtrees","subtreesUriTemplate","replacedUrlTemplate","subtreeUrl","subtree","contentUrlTemplate","rootLodMetricValue","s2VolumeInfo","boundingVolume","extensions","box","s2VolumeBox","rootBoundingVolume","implicitOptions","normalizeImplicitTileData","rootSubtree","replace","_tile$extensions","implicitTiling"],"sources":["../../../../src/lib/parsers/parse-3d-tile-header.ts"],"sourcesContent":["import type {Tiles3DLoaderOptions} from '../../tiles-3d-loader';\nimport type {LoaderOptions} from '@loaders.gl/loader-utils';\nimport {Tile3DSubtreeLoader} from '../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\nimport {Tileset3D, LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE, Tile3D} from '@loaders.gl/tiles';\nimport {ImplicitTilingExtension, Subtree} from '../../types';\nimport type {S2VolumeBox} from './helpers/parse-3d-implicit-tiles';\nimport {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';\nimport type {S2VolumeInfo} from '../utils/obb/s2-corners-to-obb';\nimport {convertS2BoundingVolumetoOBB} from '../utils/obb/s2-corners-to-obb';\n\nfunction getTileType(tile) {\n if (!tile.contentUrl) {\n return TILE_TYPE.EMPTY;\n }\n\n const contentUrl = tile.contentUrl.split('?')[0]; // Discard query string\n const fileExtension = contentUrl.split('.').pop();\n switch (fileExtension) {\n case 'pnts':\n return TILE_TYPE.POINTCLOUD;\n case 'i3dm':\n case 'b3dm':\n case 'glb':\n case 'gltf':\n return TILE_TYPE.SCENEGRAPH;\n default:\n return fileExtension;\n }\n}\n\nfunction getRefine(refine) {\n switch (refine) {\n case 'REPLACE':\n case 'replace':\n return TILE_REFINEMENT.REPLACE;\n case 'ADD':\n case 'add':\n return TILE_REFINEMENT.ADD;\n default:\n return refine;\n }\n}\n\nfunction resolveUri(uri, basePath) {\n // url scheme per RFC3986\n const urlSchemeRegex = /^[a-z][0-9a-z+.-]*:/i;\n\n if (urlSchemeRegex.test(basePath)) {\n const url = new URL(uri, `${basePath}/`);\n return decodeURI(url.toString());\n } else if (uri.startsWith('/')) {\n return uri;\n }\n\n return `${basePath}/${uri}`;\n}\n\nexport function normalizeTileData(tile, options) {\n if (!tile) {\n return null;\n }\n if (tile.content) {\n const contentUri = tile.content.uri || tile.content.url;\n tile.contentUrl = resolveUri(contentUri, options.basePath);\n }\n tile.id = tile.contentUrl;\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n tile.type = getTileType(tile);\n tile.refine = getRefine(tile.refine);\n\n return tile;\n}\n\n// normalize tile headers\nexport async function normalizeTileHeaders(\n tileset: Tileset3D,\n options: LoaderOptions\n): Promise<Tileset3D> {\n const basePath = tileset.basePath;\n let root: Tileset3D;\n\n const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset?.root);\n if (rootImplicitTilingExtension && tileset.root) {\n root = await normalizeImplicitTileHeaders(\n tileset.root,\n tileset,\n rootImplicitTilingExtension,\n options\n );\n } else {\n root = normalizeTileData(tileset.root, tileset);\n }\n\n const stack: any[] = [];\n stack.push(root);\n\n while (stack.length > 0) {\n const tile = stack.pop() || {};\n const children = tile.children || [];\n for (let childHeader of children) {\n const childImplicitTilingExtension = getImplicitTilingExtensionData(childHeader);\n if (childImplicitTilingExtension) {\n childHeader = await normalizeImplicitTileHeaders(\n childHeader,\n tileset,\n childImplicitTilingExtension,\n options\n );\n } else {\n normalizeTileData(childHeader, {basePath});\n }\n\n stack.push(childHeader);\n }\n }\n\n return root;\n}\n\n/**\n * Do normalisation of implicit tile headers\n * TODO Check if Tile3D class can be a return type here.\n * @param tileset\n */\nexport async function normalizeImplicitTileHeaders(\n tile: Tile3D,\n tileset: Tileset3D,\n implicitTilingExtension: ImplicitTilingExtension,\n options: Tiles3DLoaderOptions\n) {\n const basePath = tileset.basePath;\n const {\n subdivisionScheme,\n maximumLevel,\n subtreeLevels,\n subtrees: {uri: subtreesUriTemplate}\n } = implicitTilingExtension;\n const replacedUrlTemplate = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);\n const subtreeUrl = resolveUri(replacedUrlTemplate, basePath);\n const subtree = await load(subtreeUrl, Tile3DSubtreeLoader, options);\n const contentUrlTemplate = resolveUri(tile.content.uri, basePath);\n const refine = tileset?.root?.refine;\n // @ts-ignore\n const rootLodMetricValue = tile.geometricError;\n\n // Replace tile.boundingVolume with the the bounding volume specified by the extensions['3DTILES_bounding_volume_S2']\n const s2VolumeInfo: S2VolumeInfo = tile.boundingVolume.extensions?.['3DTILES_bounding_volume_S2'];\n if (s2VolumeInfo) {\n const box = convertS2BoundingVolumetoOBB(s2VolumeInfo);\n const s2VolumeBox: S2VolumeBox = {box, s2VolumeInfo};\n tile.boundingVolume = s2VolumeBox;\n }\n\n const rootBoundingVolume = tile.boundingVolume;\n\n const implicitOptions = {\n contentUrlTemplate,\n subtreesUriTemplate,\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n refine,\n basePath,\n lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,\n rootLodMetricValue,\n rootBoundingVolume,\n getTileType,\n getRefine\n };\n\n return await normalizeImplicitTileData(tile, subtree, implicitOptions);\n}\n\n/**\n * Do implicit data normalisation to create hierarchical tile structure\n * @param tile\n * @param rootSubtree\n * @param options\n * @returns\n */\nexport async function normalizeImplicitTileData(tile, rootSubtree: Subtree, options: any) {\n if (!tile) {\n return null;\n }\n\n tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;\n tile.lodMetricValue = tile.geometricError;\n tile.transformMatrix = tile.transform;\n\n const {children, contentUrl} = await parseImplicitTiles({\n subtree: rootSubtree,\n options,\n s2VolumeBox: tile\n });\n\n if (contentUrl) {\n tile.contentUrl = contentUrl;\n tile.content = {uri: contentUrl.replace(`${options.basePath}/`, '')};\n }\n\n tile.refine = getRefine(tile.refine);\n tile.type = getTileType(tile);\n tile.children = children;\n tile.id = tile.contentUrl;\n\n return tile;\n}\n\n/**\n * Implicit Tiling data can be in 3DTILES_implicit_tiling for 3DTiles v.Next or directly in implicitTiling object for 3DTiles v1.1.\n * Spec 3DTiles v.Next - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling\n * Spec 3DTiles v.1.1 - https://github.com/CesiumGS/3d-tiles/tree/draft-1.1/specification/ImplicitTiling\n * @param tile\n * @returns\n */\nfunction getImplicitTilingExtensionData(tile: Tile3D | null): ImplicitTilingExtension {\n return tile?.extensions?.['3DTILES_implicit_tiling'] || tile?.implicitTiling;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse-3d-tile-header.js","names":["Tile3DSubtreeLoader","load","LOD_METRIC_TYPE","TILE_REFINEMENT","TILE_TYPE","parseImplicitTiles","replaceContentUrlTemplate","convertS2BoundingVolumetoOBB","getTileType","tile","tileContentUrl","arguments","length","undefined","EMPTY","contentUrl","split","fileExtension","pop","POINTCLOUD","SCENEGRAPH","getRefine","refine","REPLACE","ADD","resolveUri","uri","basePath","urlSchemeRegex","test","url","URL","concat","decodeURI","toString","startsWith","normalizeTileData","content","_tile$content","contentUri","tilePostprocessed","id","lodMetricType","GEOMETRIC_ERROR","lodMetricValue","geometricError","transformMatrix","transform","type","normalizeTileHeaders","tileset","options","root","rootImplicitTilingExtension","getImplicitTilingExtensionData","normalizeImplicitTileHeaders","stack","push","children","childrenPostprocessed","childHeader","childImplicitTilingExtension","childHeaderPostprocessed","implicitTilingExtension","_tile$content2","_tileset$root","_tile$boundingVolume$","subdivisionScheme","maximumLevel","subtreeLevels","subtrees","subtreesUriTemplate","replacedUrlTemplate","subtreeUrl","subtree","contentUrlTemplate","rootLodMetricValue","s2VolumeInfo","boundingVolume","extensions","box","s2VolumeBox","rootBoundingVolume","implicitOptions","normalizeImplicitTileData","rootSubtree","tileContent","replace","_tile$extensions","implicitTiling"],"sources":["../../../../src/lib/parsers/parse-3d-tile-header.ts"],"sourcesContent":["import type {Tiles3DLoaderOptions} from '../../tiles-3d-loader';\nimport type {LoaderOptions} from '@loaders.gl/loader-utils';\nimport {Tile3DSubtreeLoader} from '../../tile-3d-subtree-loader';\nimport {load} from '@loaders.gl/core';\nimport {LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE} from '@loaders.gl/tiles';\nimport {\n ImplicitTilingExensionData,\n Subtree,\n Tiles3DTileContentJSON,\n Tiles3DTileJSON,\n Tiles3DTileJSONPostprocessed,\n Tiles3DTilesetJSON\n} from '../../types';\nimport type {S2VolumeBox} from './helpers/parse-3d-implicit-tiles';\nimport {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';\nimport type {S2VolumeInfo} from '../utils/obb/s2-corners-to-obb';\nimport {convertS2BoundingVolumetoOBB} from '../utils/obb/s2-corners-to-obb';\n\nfunction getTileType(tile: Tiles3DTileJSON, tileContentUrl: string = ''): TILE_TYPE | string {\n if (!tileContentUrl) {\n return TILE_TYPE.EMPTY;\n }\n\n const contentUrl = tileContentUrl.split('?')[0]; // Discard query string\n const fileExtension = contentUrl.split('.').pop();\n switch (fileExtension) {\n case 'pnts':\n return TILE_TYPE.POINTCLOUD;\n case 'i3dm':\n case 'b3dm':\n case 'glb':\n case 'gltf':\n return TILE_TYPE.SCENEGRAPH;\n default:\n return fileExtension || TILE_TYPE.EMPTY;\n }\n}\n\nfunction getRefine(refine?: string): TILE_REFINEMENT | string | undefined {\n switch (refine) {\n case 'REPLACE':\n case 'replace':\n return TILE_REFINEMENT.REPLACE;\n case 'ADD':\n case 'add':\n return TILE_REFINEMENT.ADD;\n default:\n return refine;\n }\n}\n\nfunction resolveUri(uri: string = '', basePath: string): string {\n // url scheme per RFC3986\n const urlSchemeRegex = /^[a-z][0-9a-z+.-]*:/i;\n\n if (urlSchemeRegex.test(basePath)) {\n const url = new URL(uri, `${basePath}/`);\n return decodeURI(url.toString());\n } else if (uri.startsWith('/')) {\n return uri;\n }\n\n return `${basePath}/${uri}`;\n}\n\nexport function normalizeTileData(\n tile: Tiles3DTileJSON | null,\n basePath: string\n): Tiles3DTileJSONPostprocessed | null {\n if (!tile) {\n return null;\n }\n let tileContentUrl: string | undefined;\n if (tile.content) {\n const contentUri = tile.content.uri || tile.content?.url;\n tileContentUrl = resolveUri(contentUri, basePath);\n }\n const tilePostprocessed: Tiles3DTileJSONPostprocessed = {\n ...tile,\n id: tileContentUrl,\n contentUrl: tileContentUrl,\n lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,\n lodMetricValue: tile.geometricError,\n transformMatrix: tile.transform,\n type: getTileType(tile, tileContentUrl),\n refine: getRefine(tile.refine)\n };\n\n return tilePostprocessed;\n}\n\n// normalize tile headers\nexport async function normalizeTileHeaders(\n tileset: Tiles3DTilesetJSON,\n basePath: string,\n options: LoaderOptions\n): Promise<Tiles3DTileJSONPostprocessed | null> {\n let root: Tiles3DTileJSONPostprocessed | null = null;\n\n const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset.root);\n if (rootImplicitTilingExtension && tileset.root) {\n root = await normalizeImplicitTileHeaders(\n tileset.root,\n tileset,\n basePath,\n rootImplicitTilingExtension,\n options\n );\n } else {\n root = normalizeTileData(tileset.root, basePath);\n }\n\n const stack: any[] = [];\n stack.push(root);\n\n while (stack.length > 0) {\n const tile = stack.pop() || {};\n const children = tile.children || [];\n const childrenPostprocessed: Tiles3DTileJSONPostprocessed[] = [];\n for (const childHeader of children) {\n const childImplicitTilingExtension = getImplicitTilingExtensionData(childHeader);\n let childHeaderPostprocessed: Tiles3DTileJSONPostprocessed | null;\n if (childImplicitTilingExtension) {\n childHeaderPostprocessed = await normalizeImplicitTileHeaders(\n childHeader,\n tileset,\n basePath,\n childImplicitTilingExtension,\n options\n );\n } else {\n childHeaderPostprocessed = normalizeTileData(childHeader, basePath);\n }\n\n if (childHeaderPostprocessed) {\n childrenPostprocessed.push(childHeaderPostprocessed);\n stack.push(childHeaderPostprocessed);\n }\n }\n tile.children = childrenPostprocessed;\n }\n\n return root;\n}\n\n/**\n * Do normalisation of implicit tile headers\n * TODO Check if Tile3D class can be a return type here.\n * @param tileset\n */\nexport async function normalizeImplicitTileHeaders(\n tile: Tiles3DTileJSON,\n tileset: Tiles3DTilesetJSON,\n basePath: string,\n implicitTilingExtension: ImplicitTilingExensionData,\n options: Tiles3DLoaderOptions\n): Promise<Tiles3DTileJSONPostprocessed | null> {\n const {\n subdivisionScheme,\n maximumLevel,\n subtreeLevels,\n subtrees: {uri: subtreesUriTemplate}\n } = implicitTilingExtension;\n const replacedUrlTemplate = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);\n const subtreeUrl = resolveUri(replacedUrlTemplate, basePath);\n const subtree = await load(subtreeUrl, Tile3DSubtreeLoader, options);\n const contentUrlTemplate = resolveUri(tile.content?.uri, basePath);\n const refine = tileset?.root?.refine;\n // @ts-ignore\n const rootLodMetricValue = tile.geometricError;\n\n // Replace tile.boundingVolume with the the bounding volume specified by the extensions['3DTILES_bounding_volume_S2']\n const s2VolumeInfo: S2VolumeInfo = tile.boundingVolume.extensions?.['3DTILES_bounding_volume_S2'];\n if (s2VolumeInfo) {\n const box = convertS2BoundingVolumetoOBB(s2VolumeInfo);\n const s2VolumeBox: S2VolumeBox = {box, s2VolumeInfo};\n tile.boundingVolume = s2VolumeBox;\n }\n\n const rootBoundingVolume = tile.boundingVolume;\n\n const implicitOptions = {\n contentUrlTemplate,\n subtreesUriTemplate,\n subdivisionScheme,\n subtreeLevels,\n maximumLevel,\n refine,\n basePath,\n lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,\n rootLodMetricValue,\n rootBoundingVolume,\n getTileType,\n getRefine\n };\n\n return await normalizeImplicitTileData(tile, basePath, subtree, implicitOptions);\n}\n\n/**\n * Do implicit data normalisation to create hierarchical tile structure\n * @param tile\n * @param rootSubtree\n * @param options\n * @returns\n */\nexport async function normalizeImplicitTileData(\n tile: Tiles3DTileJSON,\n basePath: string,\n rootSubtree: Subtree,\n options: any\n): Promise<Tiles3DTileJSONPostprocessed | null> {\n if (!tile) {\n return null;\n }\n\n const {children, contentUrl} = await parseImplicitTiles({\n subtree: rootSubtree,\n options\n });\n\n let tileContentUrl: string | undefined;\n let tileContent: Tiles3DTileContentJSON | null = null;\n if (contentUrl) {\n tileContentUrl = contentUrl;\n tileContent = {uri: contentUrl.replace(`${basePath}/`, '')};\n }\n const tilePostprocessed: Tiles3DTileJSONPostprocessed = {\n ...tile,\n id: tileContentUrl,\n contentUrl: tileContentUrl,\n lodMetricType: LOD_METRIC_TYPE.GEOMETRIC_ERROR,\n lodMetricValue: tile.geometricError,\n transformMatrix: tile.transform,\n type: getTileType(tile, tileContentUrl),\n refine: getRefine(tile.refine),\n content: tileContent || tile.content,\n children\n };\n\n return tilePostprocessed;\n}\n\n/**\n * Implicit Tiling data can be in 3DTILES_implicit_tiling for 3DTiles v.Next or directly in implicitTiling object for 3DTiles v1.1.\n * Spec 3DTiles v.Next - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling\n * Spec 3DTiles v.1.1 - https://github.com/CesiumGS/3d-tiles/tree/draft-1.1/specification/ImplicitTiling\n * @param tile\n * @returns\n */\nfunction getImplicitTilingExtensionData(tile: Tiles3DTileJSON | null): ImplicitTilingExensionData {\n return tile?.extensions?.['3DTILES_implicit_tiling'] || tile?.implicitTiling;\n}\n"],"mappings":"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"}
|
|
@@ -8,10 +8,11 @@ import { parse3DTileTablesHeaderSync, parse3DTileTablesSync } from './helpers/pa
|
|
|
8
8
|
import { parse3DTileGLTFViewSync, extractGLTF } from './helpers/parse-3d-tile-gltf-view';
|
|
9
9
|
export async function parseInstancedModel3DTile(tile, arrayBuffer, byteOffset, options, context) {
|
|
10
10
|
byteOffset = parseInstancedModel(tile, arrayBuffer, byteOffset, options, context);
|
|
11
|
-
await extractGLTF(tile, tile.gltfFormat, options, context);
|
|
11
|
+
await extractGLTF(tile, tile.gltfFormat || 0, options, context);
|
|
12
12
|
return byteOffset;
|
|
13
13
|
}
|
|
14
14
|
function parseInstancedModel(tile, arrayBuffer, byteOffset, options, context) {
|
|
15
|
+
var _tile$header;
|
|
15
16
|
byteOffset = parse3DTileHeaderSync(tile, arrayBuffer, byteOffset);
|
|
16
17
|
if (tile.version !== 1) {
|
|
17
18
|
throw new Error("Instanced 3D Model version ".concat(tile.version, " is not supported"));
|
|
@@ -22,7 +23,7 @@ function parseInstancedModel(tile, arrayBuffer, byteOffset, options, context) {
|
|
|
22
23
|
byteOffset += 4;
|
|
23
24
|
byteOffset = parse3DTileTablesSync(tile, arrayBuffer, byteOffset, options);
|
|
24
25
|
byteOffset = parse3DTileGLTFViewSync(tile, arrayBuffer, byteOffset, options);
|
|
25
|
-
if (tile.featureTableJsonByteLength === 0) {
|
|
26
|
+
if (!(tile !== null && tile !== void 0 && (_tile$header = tile.header) !== null && _tile$header !== void 0 && _tile$header.featureTableJsonByteLength) || tile.header.featureTableJsonByteLength === 0) {
|
|
26
27
|
throw new Error('i3dm parser: featureTableJsonByteLength is zero.');
|
|
27
28
|
}
|
|
28
29
|
const featureTable = new Tile3DFeatureTable(tile.featureTableJson, tile.featureTableBinary);
|
|
@@ -38,17 +39,7 @@ function parseInstancedModel(tile, arrayBuffer, byteOffset, options, context) {
|
|
|
38
39
|
return byteOffset;
|
|
39
40
|
}
|
|
40
41
|
function extractInstancedAttributes(tile, featureTable, batchTable, instancesLength) {
|
|
41
|
-
const
|
|
42
|
-
instances: new Array(instancesLength),
|
|
43
|
-
batchTable: tile._batchTable,
|
|
44
|
-
cull: false,
|
|
45
|
-
url: undefined,
|
|
46
|
-
gltf: undefined,
|
|
47
|
-
basePath: undefined,
|
|
48
|
-
incrementallyLoadTextures: false,
|
|
49
|
-
forwardAxis: [1, 0, 0]
|
|
50
|
-
};
|
|
51
|
-
const instances = collectionOptions.instances;
|
|
42
|
+
const instances = new Array(instancesLength);
|
|
52
43
|
const instancePosition = new Vector3();
|
|
53
44
|
const instanceNormalRight = new Vector3();
|
|
54
45
|
const instanceNormalUp = new Vector3();
|
|
@@ -60,19 +51,19 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
|
|
|
60
51
|
const instanceTransform = new Matrix4();
|
|
61
52
|
const scratch1 = [];
|
|
62
53
|
const scratch2 = [];
|
|
63
|
-
const
|
|
64
|
-
const
|
|
54
|
+
const scratch3 = [];
|
|
55
|
+
const scratch4 = [];
|
|
65
56
|
for (let i = 0; i < instancesLength; i++) {
|
|
66
57
|
let position;
|
|
67
58
|
if (featureTable.hasProperty('POSITION')) {
|
|
68
59
|
position = featureTable.getProperty('POSITION', GL.FLOAT, 3, i, instancePosition);
|
|
69
60
|
} else if (featureTable.hasProperty('POSITION_QUANTIZED')) {
|
|
70
61
|
position = featureTable.getProperty('POSITION_QUANTIZED', GL.UNSIGNED_SHORT, 3, i, instancePosition);
|
|
71
|
-
const quantizedVolumeOffset = featureTable.getGlobalProperty('QUANTIZED_VOLUME_OFFSET', GL.FLOAT, 3
|
|
62
|
+
const quantizedVolumeOffset = featureTable.getGlobalProperty('QUANTIZED_VOLUME_OFFSET', GL.FLOAT, 3);
|
|
72
63
|
if (!quantizedVolumeOffset) {
|
|
73
64
|
throw new Error('i3dm parser: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.');
|
|
74
65
|
}
|
|
75
|
-
const quantizedVolumeScale = featureTable.getGlobalProperty('QUANTIZED_VOLUME_SCALE', GL.FLOAT, 3
|
|
66
|
+
const quantizedVolumeScale = featureTable.getGlobalProperty('QUANTIZED_VOLUME_SCALE', GL.FLOAT, 3);
|
|
76
67
|
if (!quantizedVolumeScale) {
|
|
77
68
|
throw new Error('i3dm parser: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.');
|
|
78
69
|
}
|
|
@@ -95,8 +86,8 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
|
|
|
95
86
|
}
|
|
96
87
|
tile.hasCustomOrientation = true;
|
|
97
88
|
} else {
|
|
98
|
-
tile.octNormalUp = featureTable.getProperty('NORMAL_UP_OCT32P', GL.UNSIGNED_SHORT, 2, scratch1);
|
|
99
|
-
tile.octNormalRight = featureTable.getProperty('NORMAL_RIGHT_OCT32P', GL.UNSIGNED_SHORT, 2, scratch2);
|
|
89
|
+
tile.octNormalUp = featureTable.getProperty('NORMAL_UP_OCT32P', GL.UNSIGNED_SHORT, 2, i, scratch1);
|
|
90
|
+
tile.octNormalRight = featureTable.getProperty('NORMAL_RIGHT_OCT32P', GL.UNSIGNED_SHORT, 2, i, scratch2);
|
|
100
91
|
if (tile.octNormalUp) {
|
|
101
92
|
if (!tile.octNormalRight) {
|
|
102
93
|
throw new Error('i3dm: oct-encoded orientation requires NORMAL_UP_OCT32P and NORMAL_RIGHT_OCT32P');
|
|
@@ -118,7 +109,7 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
|
|
|
118
109
|
instanceQuaternion.fromMatrix3(instanceRotation);
|
|
119
110
|
instanceTranslationRotationScale.rotation = instanceQuaternion;
|
|
120
111
|
instanceScale.set(1.0, 1.0, 1.0);
|
|
121
|
-
const scale = featureTable.getProperty('SCALE', GL.FLOAT, 1, i);
|
|
112
|
+
const scale = featureTable.getProperty('SCALE', GL.FLOAT, 1, i, scratch3);
|
|
122
113
|
if (Number.isFinite(scale)) {
|
|
123
114
|
instanceScale.multiplyByScalar(scale);
|
|
124
115
|
}
|
|
@@ -127,7 +118,7 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
|
|
|
127
118
|
instanceScale.scale(nonUniformScale);
|
|
128
119
|
}
|
|
129
120
|
instanceTranslationRotationScale.scale = instanceScale;
|
|
130
|
-
let batchId = featureTable.getProperty('BATCH_ID', GL.UNSIGNED_SHORT, 1, i);
|
|
121
|
+
let batchId = featureTable.getProperty('BATCH_ID', GL.UNSIGNED_SHORT, 1, i, scratch4);
|
|
131
122
|
if (batchId === undefined) {
|
|
132
123
|
batchId = i;
|
|
133
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-3d-tile-instanced-model.js","names":["Vector3","Matrix3","Matrix4","Quaternion","Ellipsoid","GL","Tile3DFeatureTable","Tile3DBatchTable","parse3DTileHeaderSync","parse3DTileTablesHeaderSync","parse3DTileTablesSync","parse3DTileGLTFViewSync","extractGLTF","parseInstancedModel3DTile","tile","arrayBuffer","byteOffset","options","context","parseInstancedModel","gltfFormat","version","Error","concat","view","DataView","getUint32","featureTableJsonByteLength","featureTable","featureTableJson","featureTableBinary","instancesLength","getGlobalProperty","featuresLength","Number","isFinite","eastNorthUp","rtcCenter","FLOAT","batchTable","batchTableJson","batchTableBinary","extractInstancedAttributes","collectionOptions","instances","Array","_batchTable","cull","url","undefined","gltf","basePath","incrementallyLoadTextures","forwardAxis","instancePosition","instanceNormalRight","instanceNormalUp","instanceNormalForward","instanceRotation","instanceQuaternion","instanceScale","instanceTranslationRotationScale","instanceTransform","scratch1","scratch2","scratchVector1","scratchVector2","i","position","hasProperty","getProperty","UNSIGNED_SHORT","quantizedVolumeOffset","quantizedVolumeScale","MAX_UNSIGNED_SHORT","j","copy","translation","normalUp","normalRight","hasCustomOrientation","octNormalUp","octNormalRight","WGS84","eastNorthUpToFixedFrame","getRotationMatrix3","identity","cross","normalize","setColumn","fromMatrix3","rotation","set","scale","multiplyByScalar","nonUniformScale","batchId","rotationMatrix","fromQuaternion","translate","multiplyRight","modelMatrix","clone"],"sources":["../../../../src/lib/parsers/parse-3d-tile-instanced-model.ts"],"sourcesContent":["// This file is derived from the Cesium code base under Apache 2 license\n// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md\n\nimport {Vector3, Matrix3, Matrix4, Quaternion} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {GL} from '@loaders.gl/math'; // 'math.gl/geometry';\nimport Tile3DFeatureTable from '../classes/tile-3d-feature-table';\nimport Tile3DBatchTable from '../classes/tile-3d-batch-table';\n\nimport {parse3DTileHeaderSync} from './helpers/parse-3d-tile-header';\nimport {parse3DTileTablesHeaderSync, parse3DTileTablesSync} from './helpers/parse-3d-tile-tables';\nimport {parse3DTileGLTFViewSync, extractGLTF} from './helpers/parse-3d-tile-gltf-view';\nimport {Tiles3DLoaderOptions} from '../../tiles-3d-loader';\nimport {LoaderContext} from '@loaders.gl/loader-utils';\n\nexport async function parseInstancedModel3DTile(\n tile,\n arrayBuffer: ArrayBuffer,\n byteOffset: number,\n options: Tiles3DLoaderOptions,\n context: LoaderContext\n): Promise<number> {\n byteOffset = parseInstancedModel(tile, arrayBuffer, byteOffset, options, context);\n await extractGLTF(tile, tile.gltfFormat, options, context);\n return byteOffset;\n}\n\nfunction parseInstancedModel(\n tile,\n arrayBuffer: ArrayBuffer,\n byteOffset: number,\n options: Tiles3DLoaderOptions,\n context: LoaderContext\n): number {\n byteOffset = parse3DTileHeaderSync(tile, arrayBuffer, byteOffset);\n if (tile.version !== 1) {\n throw new Error(`Instanced 3D Model version ${tile.version} is not supported`);\n }\n\n byteOffset = parse3DTileTablesHeaderSync(tile, arrayBuffer, byteOffset);\n\n const view = new DataView(arrayBuffer);\n\n tile.gltfFormat = view.getUint32(byteOffset, true);\n byteOffset += 4;\n\n // PARSE FEATURE TABLE\n byteOffset = parse3DTileTablesSync(tile, arrayBuffer, byteOffset, options);\n\n byteOffset = parse3DTileGLTFViewSync(tile, arrayBuffer, byteOffset, options);\n\n // TODO - Is the feature table sometimes optional or can check be moved into table header parser?\n if (tile.featureTableJsonByteLength === 0) {\n throw new Error('i3dm parser: featureTableJsonByteLength is zero.');\n }\n\n const featureTable = new Tile3DFeatureTable(tile.featureTableJson, tile.featureTableBinary);\n\n const instancesLength = featureTable.getGlobalProperty('INSTANCES_LENGTH');\n featureTable.featuresLength = instancesLength;\n\n if (!Number.isFinite(instancesLength)) {\n throw new Error('i3dm parser: INSTANCES_LENGTH must be defined');\n }\n\n tile.eastNorthUp = featureTable.getGlobalProperty('EAST_NORTH_UP');\n tile.rtcCenter = featureTable.getGlobalProperty('RTC_CENTER', GL.FLOAT, 3);\n\n const batchTable = new Tile3DBatchTable(\n tile.batchTableJson,\n tile.batchTableBinary,\n instancesLength\n );\n\n extractInstancedAttributes(tile, featureTable, batchTable, instancesLength);\n\n return byteOffset;\n}\n\n// eslint-disable-next-line max-statements, complexity\nfunction extractInstancedAttributes(tile, featureTable, batchTable, instancesLength) {\n // Create model instance collection\n const collectionOptions = {\n instances: new Array(instancesLength),\n batchTable: tile._batchTable,\n cull: false, // Already culled by 3D Tiles\n url: undefined,\n // requestType: RequestType.TILES3D,\n gltf: undefined,\n basePath: undefined,\n incrementallyLoadTextures: false,\n // TODO - tileset is not available at this stage, tile is parsed independently\n // upAxis: (tileset && tileset._gltfUpAxis) || [0, 1, 0],\n forwardAxis: [1, 0, 0]\n };\n\n const instances = collectionOptions.instances;\n const instancePosition = new Vector3();\n const instanceNormalRight = new Vector3();\n const instanceNormalUp = new Vector3();\n const instanceNormalForward = new Vector3();\n const instanceRotation = new Matrix3();\n const instanceQuaternion = new Quaternion();\n const instanceScale = new Vector3();\n const instanceTranslationRotationScale = {};\n const instanceTransform = new Matrix4();\n const scratch1 = [];\n const scratch2 = [];\n const scratchVector1 = new Vector3();\n const scratchVector2 = new Vector3();\n\n for (let i = 0; i < instancesLength; i++) {\n let position;\n\n // Get the instance position\n if (featureTable.hasProperty('POSITION')) {\n position = featureTable.getProperty('POSITION', GL.FLOAT, 3, i, instancePosition);\n } else if (featureTable.hasProperty('POSITION_QUANTIZED')) {\n position = featureTable.getProperty(\n 'POSITION_QUANTIZED',\n GL.UNSIGNED_SHORT,\n 3,\n i,\n instancePosition\n );\n\n const quantizedVolumeOffset = featureTable.getGlobalProperty(\n 'QUANTIZED_VOLUME_OFFSET',\n GL.FLOAT,\n 3,\n scratchVector1\n );\n if (!quantizedVolumeOffset) {\n throw new Error(\n 'i3dm parser: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.'\n );\n }\n\n const quantizedVolumeScale = featureTable.getGlobalProperty(\n 'QUANTIZED_VOLUME_SCALE',\n GL.FLOAT,\n 3,\n scratchVector2\n );\n if (!quantizedVolumeScale) {\n throw new Error(\n 'i3dm parser: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.'\n );\n }\n\n const MAX_UNSIGNED_SHORT = 65535.0;\n for (let j = 0; j < 3; j++) {\n position[j] =\n (position[j] / MAX_UNSIGNED_SHORT) * quantizedVolumeScale[j] + quantizedVolumeOffset[j];\n }\n }\n\n if (!position) {\n throw new Error('i3dm: POSITION or POSITION_QUANTIZED must be defined for each instance.');\n }\n\n instancePosition.copy(position);\n // @ts-expect-error\n instanceTranslationRotationScale.translation = instancePosition;\n\n // Get the instance rotation\n tile.normalUp = featureTable.getProperty('NORMAL_UP', GL.FLOAT, 3, i, scratch1);\n tile.normalRight = featureTable.getProperty('NORMAL_RIGHT', GL.FLOAT, 3, i, scratch2);\n\n const hasCustomOrientation = false;\n if (tile.normalUp) {\n if (!tile.normalRight) {\n throw new Error('i3dm: Custom orientation requires both NORMAL_UP and NORMAL_RIGHT.');\n }\n // Vector3.unpack(normalUp, 0, instanceNormalUp);\n // Vector3.unpack(normalRight, 0, instanceNormalRight);\n tile.hasCustomOrientation = true;\n } else {\n tile.octNormalUp = featureTable.getProperty(\n 'NORMAL_UP_OCT32P',\n GL.UNSIGNED_SHORT,\n 2,\n scratch1\n );\n tile.octNormalRight = featureTable.getProperty(\n 'NORMAL_RIGHT_OCT32P',\n GL.UNSIGNED_SHORT,\n 2,\n scratch2\n );\n\n if (tile.octNormalUp) {\n if (!tile.octNormalRight) {\n throw new Error(\n 'i3dm: oct-encoded orientation requires NORMAL_UP_OCT32P and NORMAL_RIGHT_OCT32P'\n );\n }\n\n throw new Error('i3dm: oct-encoded orientation not implemented');\n /*\n AttributeCompression.octDecodeInRange(octNormalUp[0], octNormalUp[1], 65535, instanceNormalUp);\n AttributeCompression.octDecodeInRange(octNormalRight[0], octNormalRight[1], 65535, instanceNormalRight);\n hasCustomOrientation = true;\n */\n } else if (tile.eastNorthUp) {\n Ellipsoid.WGS84.eastNorthUpToFixedFrame(instancePosition, instanceTransform);\n instanceTransform.getRotationMatrix3(instanceRotation);\n } else {\n instanceRotation.identity();\n }\n }\n\n if (hasCustomOrientation) {\n instanceNormalForward.copy(instanceNormalRight).cross(instanceNormalUp).normalize();\n instanceRotation.setColumn(0, instanceNormalRight);\n instanceRotation.setColumn(1, instanceNormalUp);\n instanceRotation.setColumn(2, instanceNormalForward);\n }\n\n instanceQuaternion.fromMatrix3(instanceRotation);\n // @ts-expect-error\n instanceTranslationRotationScale.rotation = instanceQuaternion;\n\n // Get the instance scale\n instanceScale.set(1.0, 1.0, 1.0);\n const scale = featureTable.getProperty('SCALE', GL.FLOAT, 1, i);\n if (Number.isFinite(scale)) {\n instanceScale.multiplyByScalar(scale);\n }\n const nonUniformScale = featureTable.getProperty('SCALE_NON_UNIFORM', GL.FLOAT, 3, i, scratch1);\n if (nonUniformScale) {\n instanceScale.scale(nonUniformScale);\n }\n\n // @ts-expect-error\n instanceTranslationRotationScale.scale = instanceScale;\n\n // Get the batchId\n let batchId = featureTable.getProperty('BATCH_ID', GL.UNSIGNED_SHORT, 1, i);\n if (batchId === undefined) {\n // If BATCH_ID semantic is undefined, batchId is just the instance number\n batchId = i;\n }\n\n // @ts-expect-error\n const rotationMatrix = new Matrix4().fromQuaternion(instanceTranslationRotationScale.rotation);\n\n // Create the model matrix and the instance\n instanceTransform.identity();\n // @ts-expect-error\n instanceTransform.translate(instanceTranslationRotationScale.translation);\n instanceTransform.multiplyRight(rotationMatrix);\n // @ts-expect-error\n instanceTransform.scale(instanceTranslationRotationScale.scale);\n\n const modelMatrix = instanceTransform.clone();\n instances[i] = {\n modelMatrix,\n batchId\n };\n }\n\n tile.instances = instances;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse-3d-tile-instanced-model.js","names":["Vector3","Matrix3","Matrix4","Quaternion","Ellipsoid","GL","Tile3DFeatureTable","Tile3DBatchTable","parse3DTileHeaderSync","parse3DTileTablesHeaderSync","parse3DTileTablesSync","parse3DTileGLTFViewSync","extractGLTF","parseInstancedModel3DTile","tile","arrayBuffer","byteOffset","options","context","parseInstancedModel","gltfFormat","_tile$header","version","Error","concat","view","DataView","getUint32","header","featureTableJsonByteLength","featureTable","featureTableJson","featureTableBinary","instancesLength","getGlobalProperty","featuresLength","Number","isFinite","eastNorthUp","rtcCenter","FLOAT","batchTable","batchTableJson","batchTableBinary","extractInstancedAttributes","instances","Array","instancePosition","instanceNormalRight","instanceNormalUp","instanceNormalForward","instanceRotation","instanceQuaternion","instanceScale","instanceTranslationRotationScale","instanceTransform","scratch1","scratch2","scratch3","scratch4","i","position","hasProperty","getProperty","UNSIGNED_SHORT","quantizedVolumeOffset","quantizedVolumeScale","MAX_UNSIGNED_SHORT","j","copy","translation","normalUp","normalRight","hasCustomOrientation","octNormalUp","octNormalRight","WGS84","eastNorthUpToFixedFrame","getRotationMatrix3","identity","cross","normalize","setColumn","fromMatrix3","rotation","set","scale","multiplyByScalar","nonUniformScale","batchId","undefined","rotationMatrix","fromQuaternion","translate","multiplyRight","modelMatrix","clone"],"sources":["../../../../src/lib/parsers/parse-3d-tile-instanced-model.ts"],"sourcesContent":["// This file is derived from the Cesium code base under Apache 2 license\n// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md\n\nimport {Vector3, Matrix3, Matrix4, Quaternion} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {GL} from '@loaders.gl/math'; // 'math.gl/geometry';\nimport Tile3DFeatureTable from '../classes/tile-3d-feature-table';\nimport Tile3DBatchTable from '../classes/tile-3d-batch-table';\n\nimport {parse3DTileHeaderSync} from './helpers/parse-3d-tile-header';\nimport {parse3DTileTablesHeaderSync, parse3DTileTablesSync} from './helpers/parse-3d-tile-tables';\nimport {parse3DTileGLTFViewSync, extractGLTF} from './helpers/parse-3d-tile-gltf-view';\nimport {Tiles3DLoaderOptions} from '../../tiles-3d-loader';\nimport {LoaderContext} from '@loaders.gl/loader-utils';\nimport {Tiles3DTileContent} from '../../types';\n\nexport async function parseInstancedModel3DTile(\n tile: Tiles3DTileContent,\n arrayBuffer: ArrayBuffer,\n byteOffset: number,\n options?: Tiles3DLoaderOptions,\n context?: LoaderContext\n): Promise<number> {\n byteOffset = parseInstancedModel(tile, arrayBuffer, byteOffset, options, context);\n await extractGLTF(tile, tile.gltfFormat || 0, options, context);\n return byteOffset;\n}\n\nfunction parseInstancedModel(\n tile: Tiles3DTileContent,\n arrayBuffer: ArrayBuffer,\n byteOffset: number,\n options?: Tiles3DLoaderOptions,\n context?: LoaderContext\n): number {\n byteOffset = parse3DTileHeaderSync(tile, arrayBuffer, byteOffset);\n if (tile.version !== 1) {\n throw new Error(`Instanced 3D Model version ${tile.version} is not supported`);\n }\n\n byteOffset = parse3DTileTablesHeaderSync(tile, arrayBuffer, byteOffset);\n\n const view = new DataView(arrayBuffer);\n\n tile.gltfFormat = view.getUint32(byteOffset, true);\n byteOffset += 4;\n\n // PARSE FEATURE TABLE\n byteOffset = parse3DTileTablesSync(tile, arrayBuffer, byteOffset, options);\n\n byteOffset = parse3DTileGLTFViewSync(tile, arrayBuffer, byteOffset, options);\n\n // TODO - Is the feature table sometimes optional or can check be moved into table header parser?\n if (!tile?.header?.featureTableJsonByteLength || tile.header.featureTableJsonByteLength === 0) {\n throw new Error('i3dm parser: featureTableJsonByteLength is zero.');\n }\n\n const featureTable = new Tile3DFeatureTable(tile.featureTableJson, tile.featureTableBinary);\n\n const instancesLength = featureTable.getGlobalProperty('INSTANCES_LENGTH');\n featureTable.featuresLength = instancesLength;\n\n if (!Number.isFinite(instancesLength)) {\n throw new Error('i3dm parser: INSTANCES_LENGTH must be defined');\n }\n\n tile.eastNorthUp = featureTable.getGlobalProperty('EAST_NORTH_UP');\n tile.rtcCenter = featureTable.getGlobalProperty('RTC_CENTER', GL.FLOAT, 3);\n\n const batchTable = new Tile3DBatchTable(\n tile.batchTableJson,\n tile.batchTableBinary,\n instancesLength\n );\n\n extractInstancedAttributes(tile, featureTable, batchTable, instancesLength);\n\n return byteOffset;\n}\n\n// eslint-disable-next-line max-statements, complexity\nfunction extractInstancedAttributes(\n tile: Tiles3DTileContent,\n featureTable: Tile3DFeatureTable,\n batchTable: Tile3DBatchTable,\n instancesLength: number\n) {\n const instances = new Array(instancesLength);\n const instancePosition = new Vector3();\n const instanceNormalRight = new Vector3();\n const instanceNormalUp = new Vector3();\n const instanceNormalForward = new Vector3();\n const instanceRotation = new Matrix3();\n const instanceQuaternion = new Quaternion();\n const instanceScale = new Vector3();\n const instanceTranslationRotationScale = {};\n const instanceTransform = new Matrix4();\n const scratch1 = [];\n const scratch2 = [];\n const scratch3 = [];\n const scratch4 = [];\n\n for (let i = 0; i < instancesLength; i++) {\n let position;\n\n // Get the instance position\n if (featureTable.hasProperty('POSITION')) {\n position = featureTable.getProperty('POSITION', GL.FLOAT, 3, i, instancePosition);\n } else if (featureTable.hasProperty('POSITION_QUANTIZED')) {\n position = featureTable.getProperty(\n 'POSITION_QUANTIZED',\n GL.UNSIGNED_SHORT,\n 3,\n i,\n instancePosition\n );\n\n const quantizedVolumeOffset = featureTable.getGlobalProperty(\n 'QUANTIZED_VOLUME_OFFSET',\n GL.FLOAT,\n 3\n );\n if (!quantizedVolumeOffset) {\n throw new Error(\n 'i3dm parser: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.'\n );\n }\n\n const quantizedVolumeScale = featureTable.getGlobalProperty(\n 'QUANTIZED_VOLUME_SCALE',\n GL.FLOAT,\n 3\n );\n if (!quantizedVolumeScale) {\n throw new Error(\n 'i3dm parser: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.'\n );\n }\n\n const MAX_UNSIGNED_SHORT = 65535.0;\n for (let j = 0; j < 3; j++) {\n position[j] =\n (position[j] / MAX_UNSIGNED_SHORT) * quantizedVolumeScale[j] + quantizedVolumeOffset[j];\n }\n }\n\n if (!position) {\n throw new Error('i3dm: POSITION or POSITION_QUANTIZED must be defined for each instance.');\n }\n\n instancePosition.copy(position);\n // @ts-expect-error\n instanceTranslationRotationScale.translation = instancePosition;\n\n // Get the instance rotation\n tile.normalUp = featureTable.getProperty('NORMAL_UP', GL.FLOAT, 3, i, scratch1);\n tile.normalRight = featureTable.getProperty('NORMAL_RIGHT', GL.FLOAT, 3, i, scratch2);\n\n const hasCustomOrientation = false;\n if (tile.normalUp) {\n if (!tile.normalRight) {\n throw new Error('i3dm: Custom orientation requires both NORMAL_UP and NORMAL_RIGHT.');\n }\n // Vector3.unpack(normalUp, 0, instanceNormalUp);\n // Vector3.unpack(normalRight, 0, instanceNormalRight);\n tile.hasCustomOrientation = true;\n } else {\n tile.octNormalUp = featureTable.getProperty(\n 'NORMAL_UP_OCT32P',\n GL.UNSIGNED_SHORT,\n 2,\n i,\n scratch1\n );\n tile.octNormalRight = featureTable.getProperty(\n 'NORMAL_RIGHT_OCT32P',\n GL.UNSIGNED_SHORT,\n 2,\n i,\n scratch2\n );\n\n if (tile.octNormalUp) {\n if (!tile.octNormalRight) {\n throw new Error(\n 'i3dm: oct-encoded orientation requires NORMAL_UP_OCT32P and NORMAL_RIGHT_OCT32P'\n );\n }\n\n throw new Error('i3dm: oct-encoded orientation not implemented');\n /*\n AttributeCompression.octDecodeInRange(octNormalUp[0], octNormalUp[1], 65535, instanceNormalUp);\n AttributeCompression.octDecodeInRange(octNormalRight[0], octNormalRight[1], 65535, instanceNormalRight);\n hasCustomOrientation = true;\n */\n } else if (tile.eastNorthUp) {\n Ellipsoid.WGS84.eastNorthUpToFixedFrame(instancePosition, instanceTransform);\n instanceTransform.getRotationMatrix3(instanceRotation);\n } else {\n instanceRotation.identity();\n }\n }\n\n if (hasCustomOrientation) {\n instanceNormalForward.copy(instanceNormalRight).cross(instanceNormalUp).normalize();\n instanceRotation.setColumn(0, instanceNormalRight);\n instanceRotation.setColumn(1, instanceNormalUp);\n instanceRotation.setColumn(2, instanceNormalForward);\n }\n\n instanceQuaternion.fromMatrix3(instanceRotation);\n // @ts-expect-error\n instanceTranslationRotationScale.rotation = instanceQuaternion;\n\n // Get the instance scale\n instanceScale.set(1.0, 1.0, 1.0);\n const scale = featureTable.getProperty('SCALE', GL.FLOAT, 1, i, scratch3);\n if (Number.isFinite(scale)) {\n instanceScale.multiplyByScalar(scale);\n }\n const nonUniformScale = featureTable.getProperty('SCALE_NON_UNIFORM', GL.FLOAT, 3, i, scratch1);\n if (nonUniformScale) {\n instanceScale.scale(nonUniformScale);\n }\n\n // @ts-expect-error\n instanceTranslationRotationScale.scale = instanceScale;\n\n // Get the batchId\n let batchId = featureTable.getProperty('BATCH_ID', GL.UNSIGNED_SHORT, 1, i, scratch4);\n if (batchId === undefined) {\n // If BATCH_ID semantic is undefined, batchId is just the instance number\n batchId = i;\n }\n\n // @ts-expect-error\n const rotationMatrix = new Matrix4().fromQuaternion(instanceTranslationRotationScale.rotation);\n\n // Create the model matrix and the instance\n instanceTransform.identity();\n // @ts-expect-error\n instanceTransform.translate(instanceTranslationRotationScale.translation);\n instanceTransform.multiplyRight(rotationMatrix);\n // @ts-expect-error\n instanceTransform.scale(instanceTranslationRotationScale.scale);\n\n const modelMatrix = instanceTransform.clone();\n instances[i] = {\n modelMatrix,\n batchId\n };\n }\n\n tile.instances = instances;\n}\n"],"mappings":"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"}
|
|
@@ -53,6 +53,12 @@ function parsePointCloudTables(tile) {
|
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
55
|
function parsePositions(tile, featureTable, options) {
|
|
56
|
+
tile.attributes = tile.attributes || {
|
|
57
|
+
positions: null,
|
|
58
|
+
colors: null,
|
|
59
|
+
normals: null,
|
|
60
|
+
batchIds: null
|
|
61
|
+
};
|
|
56
62
|
if (!tile.attributes.positions) {
|
|
57
63
|
if (featureTable.hasProperty('POSITION')) {
|
|
58
64
|
tile.attributes.positions = featureTable.getPropertyArray('POSITION', GL.FLOAT, 3);
|
|
@@ -76,6 +82,12 @@ function parsePositions(tile, featureTable, options) {
|
|
|
76
82
|
}
|
|
77
83
|
}
|
|
78
84
|
function parseColors(tile, featureTable, batchTable) {
|
|
85
|
+
tile.attributes = tile.attributes || {
|
|
86
|
+
positions: null,
|
|
87
|
+
colors: null,
|
|
88
|
+
normals: null,
|
|
89
|
+
batchIds: null
|
|
90
|
+
};
|
|
79
91
|
if (!tile.attributes.colors) {
|
|
80
92
|
let colors = null;
|
|
81
93
|
if (featureTable.hasProperty('RGBA')) {
|
|
@@ -94,6 +106,12 @@ function parseColors(tile, featureTable, batchTable) {
|
|
|
94
106
|
}
|
|
95
107
|
}
|
|
96
108
|
function parseNormals(tile, featureTable) {
|
|
109
|
+
tile.attributes = tile.attributes || {
|
|
110
|
+
positions: null,
|
|
111
|
+
colors: null,
|
|
112
|
+
normals: null,
|
|
113
|
+
batchIds: null
|
|
114
|
+
};
|
|
97
115
|
if (!tile.attributes.normals) {
|
|
98
116
|
let normals = null;
|
|
99
117
|
if (featureTable.hasProperty('NORMAL')) {
|
|
@@ -139,7 +157,7 @@ async function parseDraco(tile, featureTable, batchTable, options, context) {
|
|
|
139
157
|
if (!dracoFeatureTableProperties || !Number.isFinite(dracoByteOffset) || !dracoByteLength) {
|
|
140
158
|
throw new Error('Draco properties, byteOffset, and byteLength must be defined');
|
|
141
159
|
}
|
|
142
|
-
dracoBuffer = tile.featureTableBinary.slice(dracoByteOffset, dracoByteOffset + dracoByteLength);
|
|
160
|
+
dracoBuffer = (tile.featureTableBinary || []).slice(dracoByteOffset, dracoByteOffset + dracoByteLength);
|
|
143
161
|
tile.hasPositions = Number.isFinite(dracoFeatureTableProperties.POSITION);
|
|
144
162
|
tile.hasColors = Number.isFinite(dracoFeatureTableProperties.RGB) || Number.isFinite(dracoFeatureTableProperties.RGBA);
|
|
145
163
|
tile.hasNormals = Number.isFinite(dracoFeatureTableProperties.NORMAL);
|
|
@@ -162,13 +180,16 @@ async function parseDraco(tile, featureTable, batchTable, options, context) {
|
|
|
162
180
|
return await loadDraco(tile, dracoData, options, context);
|
|
163
181
|
}
|
|
164
182
|
export async function loadDraco(tile, dracoData, options, context) {
|
|
183
|
+
if (!context) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
165
186
|
const {
|
|
166
187
|
parse
|
|
167
188
|
} = context;
|
|
168
189
|
const dracoOptions = {
|
|
169
190
|
...options,
|
|
170
191
|
draco: {
|
|
171
|
-
...options.draco,
|
|
192
|
+
...(options === null || options === void 0 ? void 0 : options.draco),
|
|
172
193
|
extraAttributes: dracoData.batchTableProperties || {}
|
|
173
194
|
}
|
|
174
195
|
};
|