@loaders.gl/3d-tiles 3.3.0-alpha.5 → 3.3.0-alpha.6
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 +924 -1372
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/cesium-ion-loader.js +7 -26
- package/dist/es5/cesium-ion-loader.js.map +1 -1
- package/dist/es5/index.js +14 -23
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/classes/helpers/tile-3d-accessor-utils.js +1 -5
- package/dist/es5/lib/classes/helpers/tile-3d-accessor-utils.js.map +1 -1
- package/dist/es5/lib/classes/tile-3d-batch-table-hierarchy.js +1 -40
- package/dist/es5/lib/classes/tile-3d-batch-table-hierarchy.js.map +1 -1
- package/dist/es5/lib/classes/tile-3d-batch-table.js +12 -59
- package/dist/es5/lib/classes/tile-3d-batch-table.js.map +1 -1
- package/dist/es5/lib/classes/tile-3d-feature-table.js +4 -23
- package/dist/es5/lib/classes/tile-3d-feature-table.js.map +1 -1
- package/dist/es5/lib/constants.js +3 -1
- package/dist/es5/lib/constants.js.map +1 -1
- package/dist/es5/lib/encoders/encode-3d-tile-batched-model.js +7 -16
- package/dist/es5/lib/encoders/encode-3d-tile-batched-model.js.map +1 -1
- package/dist/es5/lib/encoders/encode-3d-tile-composite.js +2 -11
- package/dist/es5/lib/encoders/encode-3d-tile-composite.js.map +1 -1
- package/dist/es5/lib/encoders/encode-3d-tile-instanced-model.js +10 -17
- package/dist/es5/lib/encoders/encode-3d-tile-instanced-model.js.map +1 -1
- package/dist/es5/lib/encoders/encode-3d-tile-point-cloud.js +8 -16
- package/dist/es5/lib/encoders/encode-3d-tile-point-cloud.js.map +1 -1
- package/dist/es5/lib/encoders/encode-3d-tile.js +0 -12
- package/dist/es5/lib/encoders/encode-3d-tile.js.map +1 -1
- package/dist/es5/lib/encoders/helpers/encode-3d-tile-header.js +6 -9
- package/dist/es5/lib/encoders/helpers/encode-3d-tile-header.js.map +1 -1
- package/dist/es5/lib/ion/ion.js +5 -46
- package/dist/es5/lib/ion/ion.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js +2 -11
- 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 +0 -8
- package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/normalize-3d-tile-positions.js +0 -5
- package/dist/es5/lib/parsers/helpers/normalize-3d-tile-positions.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js +17 -51
- 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 +6 -25
- 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 +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-subtree.js +0 -38
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js +6 -14
- package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -1
- package/dist/es5/lib/parsers/helpers/parse-utils.js +1 -3
- package/dist/es5/lib/parsers/helpers/parse-utils.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-batched-model.js +0 -16
- 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 -11
- package/dist/es5/lib/parsers/parse-3d-tile-composite.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-gltf.js +0 -8
- package/dist/es5/lib/parsers/parse-3d-tile-gltf.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-header.js +2 -70
- package/dist/es5/lib/parsers/parse-3d-tile-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js +5 -41
- 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 +4 -71
- package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -1
- package/dist/es5/lib/parsers/parse-3d-tile.js +5 -28
- package/dist/es5/lib/parsers/parse-3d-tile.js.map +1 -1
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/es5/lib/utils/version.js.map +1 -1
- package/dist/es5/tile-3d-subtree-loader.js +0 -4
- package/dist/es5/tile-3d-subtree-loader.js.map +1 -1
- package/dist/es5/tile-3d-writer.js +0 -6
- package/dist/es5/tile-3d-writer.js.map +1 -1
- package/dist/es5/tiles-3d-loader.js +0 -29
- package/dist/es5/tiles-3d-loader.js.map +1 -1
- package/dist/es5/types.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/cesium-ion-loader.js +9 -7
- package/dist/esm/cesium-ion-loader.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/classes/helpers/tile-3d-accessor-utils.js +1 -0
- package/dist/esm/lib/classes/helpers/tile-3d-accessor-utils.js.map +1 -1
- package/dist/esm/lib/classes/tile-3d-batch-table-hierarchy.js +3 -40
- package/dist/esm/lib/classes/tile-3d-batch-table-hierarchy.js.map +1 -1
- package/dist/esm/lib/classes/tile-3d-batch-table.js +7 -67
- package/dist/esm/lib/classes/tile-3d-batch-table.js.map +1 -1
- package/dist/esm/lib/classes/tile-3d-feature-table.js +5 -26
- package/dist/esm/lib/classes/tile-3d-feature-table.js.map +1 -1
- package/dist/esm/lib/constants.js +3 -0
- package/dist/esm/lib/constants.js.map +1 -1
- package/dist/esm/lib/encoders/encode-3d-tile-batched-model.js +5 -3
- package/dist/esm/lib/encoders/encode-3d-tile-batched-model.js.map +1 -1
- package/dist/esm/lib/encoders/encode-3d-tile-composite.js +2 -2
- package/dist/esm/lib/encoders/encode-3d-tile-composite.js.map +1 -1
- package/dist/esm/lib/encoders/encode-3d-tile-instanced-model.js +5 -1
- package/dist/esm/lib/encoders/encode-3d-tile-instanced-model.js.map +1 -1
- package/dist/esm/lib/encoders/encode-3d-tile-point-cloud.js +4 -1
- package/dist/esm/lib/encoders/encode-3d-tile-point-cloud.js.map +1 -1
- package/dist/esm/lib/encoders/encode-3d-tile.js +2 -6
- package/dist/esm/lib/encoders/encode-3d-tile.js.map +1 -1
- package/dist/esm/lib/encoders/helpers/encode-3d-tile-header.js +3 -3
- package/dist/esm/lib/encoders/helpers/encode-3d-tile-header.js.map +1 -1
- package/dist/esm/lib/ion/ion.js +10 -8
- package/dist/esm/lib/ion/ion.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js +1 -6
- 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 +0 -4
- package/dist/esm/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/normalize-3d-tile-positions.js +1 -2
- package/dist/esm/lib/parsers/helpers/normalize-3d-tile-positions.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js +2 -16
- 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 +6 -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 +5 -2
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js +1 -13
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js +4 -7
- package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -1
- package/dist/esm/lib/parsers/helpers/parse-utils.js +6 -1
- package/dist/esm/lib/parsers/helpers/parse-utils.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-batched-model.js +3 -4
- package/dist/esm/lib/parsers/parse-3d-tile-batched-model.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-composite.js +5 -1
- package/dist/esm/lib/parsers/parse-3d-tile-composite.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-gltf.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-header.js +3 -26
- package/dist/esm/lib/parsers/parse-3d-tile-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile-instanced-model.js +7 -25
- 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 +9 -37
- package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -1
- package/dist/esm/lib/parsers/parse-3d-tile.js +8 -6
- package/dist/esm/lib/parsers/parse-3d-tile.js.map +1 -1
- package/dist/esm/lib/utils/version.js +2 -1
- package/dist/esm/lib/utils/version.js.map +1 -1
- package/dist/esm/tile-3d-subtree-loader.js +1 -0
- package/dist/esm/tile-3d-subtree-loader.js.map +1 -1
- package/dist/esm/tile-3d-writer.js +1 -1
- package/dist/esm/tile-3d-writer.js.map +1 -1
- package/dist/esm/tiles-3d-loader.js +1 -8
- package/dist/esm/tiles-3d-loader.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/lib/classes/helpers/tile-3d-accessor-utils.d.ts +1 -1
- package/dist/lib/classes/tile-3d-batch-table.d.ts +1 -1
- package/package.json +7 -7
|
@@ -2,68 +2,54 @@ import { Tile3DSubtreeLoader } from '../../tile-3d-subtree-loader';
|
|
|
2
2
|
import { load } from '@loaders.gl/core';
|
|
3
3
|
import { LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE } from '@loaders.gl/tiles';
|
|
4
4
|
import { parseImplicitTiles, replaceContentUrlTemplate } from './helpers/parse-3d-implicit-tiles';
|
|
5
|
-
|
|
6
5
|
function getTileType(tile) {
|
|
7
6
|
if (!tile.contentUrl) {
|
|
8
7
|
return TILE_TYPE.EMPTY;
|
|
9
8
|
}
|
|
10
|
-
|
|
11
9
|
const contentUrl = tile.contentUrl;
|
|
12
10
|
const fileExtension = contentUrl.split('.').pop();
|
|
13
|
-
|
|
14
11
|
switch (fileExtension) {
|
|
15
12
|
case 'pnts':
|
|
16
13
|
return TILE_TYPE.POINTCLOUD;
|
|
17
|
-
|
|
18
14
|
case 'i3dm':
|
|
19
15
|
case 'b3dm':
|
|
20
16
|
case 'glb':
|
|
21
17
|
case 'gltf':
|
|
22
18
|
return TILE_TYPE.SCENEGRAPH;
|
|
23
|
-
|
|
24
19
|
default:
|
|
25
20
|
return fileExtension;
|
|
26
21
|
}
|
|
27
22
|
}
|
|
28
|
-
|
|
29
23
|
function getRefine(refine) {
|
|
30
24
|
switch (refine) {
|
|
31
25
|
case 'REPLACE':
|
|
32
26
|
case 'replace':
|
|
33
27
|
return TILE_REFINEMENT.REPLACE;
|
|
34
|
-
|
|
35
28
|
case 'ADD':
|
|
36
29
|
case 'add':
|
|
37
30
|
return TILE_REFINEMENT.ADD;
|
|
38
|
-
|
|
39
31
|
default:
|
|
40
32
|
return refine;
|
|
41
33
|
}
|
|
42
34
|
}
|
|
43
|
-
|
|
44
35
|
function resolveUri(uri, basePath) {
|
|
45
36
|
const urlSchemeRegex = /^[a-z][0-9a-z+.-]*:/i;
|
|
46
|
-
|
|
47
37
|
if (urlSchemeRegex.test(basePath)) {
|
|
48
38
|
const url = new URL(uri, "".concat(basePath, "/"));
|
|
49
39
|
return decodeURI(url.toString());
|
|
50
40
|
} else if (uri.startsWith('/')) {
|
|
51
41
|
return uri;
|
|
52
42
|
}
|
|
53
|
-
|
|
54
43
|
return "".concat(basePath, "/").concat(uri);
|
|
55
44
|
}
|
|
56
|
-
|
|
57
45
|
export function normalizeTileData(tile, options) {
|
|
58
46
|
if (!tile) {
|
|
59
47
|
return null;
|
|
60
48
|
}
|
|
61
|
-
|
|
62
49
|
if (tile.content) {
|
|
63
50
|
const contentUri = tile.content.uri || tile.content.url;
|
|
64
51
|
tile.contentUrl = resolveUri(contentUri, options.basePath);
|
|
65
52
|
}
|
|
66
|
-
|
|
67
53
|
tile.id = tile.contentUrl;
|
|
68
54
|
tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;
|
|
69
55
|
tile.lodMetricValue = tile.geometricError;
|
|
@@ -72,27 +58,23 @@ export function normalizeTileData(tile, options) {
|
|
|
72
58
|
tile.refine = getRefine(tile.refine);
|
|
73
59
|
return tile;
|
|
74
60
|
}
|
|
61
|
+
|
|
75
62
|
export async function normalizeTileHeaders(tileset, options) {
|
|
76
63
|
const basePath = tileset.basePath;
|
|
77
64
|
let root;
|
|
78
65
|
const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset === null || tileset === void 0 ? void 0 : tileset.root);
|
|
79
|
-
|
|
80
66
|
if (rootImplicitTilingExtension && tileset.root) {
|
|
81
67
|
root = await normalizeImplicitTileHeaders(tileset.root, tileset, rootImplicitTilingExtension, options);
|
|
82
68
|
} else {
|
|
83
69
|
root = normalizeTileData(tileset.root, tileset);
|
|
84
70
|
}
|
|
85
|
-
|
|
86
71
|
const stack = [];
|
|
87
72
|
stack.push(root);
|
|
88
|
-
|
|
89
73
|
while (stack.length > 0) {
|
|
90
74
|
const tile = stack.pop() || {};
|
|
91
75
|
const children = tile.children || [];
|
|
92
|
-
|
|
93
76
|
for (let childHeader of children) {
|
|
94
77
|
const childImplicitTilingExtension = getImplicitTilingExtensionData(childHeader);
|
|
95
|
-
|
|
96
78
|
if (childImplicitTilingExtension) {
|
|
97
79
|
childHeader = await normalizeImplicitTileHeaders(childHeader, tileset, childImplicitTilingExtension, options);
|
|
98
80
|
} else {
|
|
@@ -100,16 +82,14 @@ export async function normalizeTileHeaders(tileset, options) {
|
|
|
100
82
|
basePath
|
|
101
83
|
});
|
|
102
84
|
}
|
|
103
|
-
|
|
104
85
|
stack.push(childHeader);
|
|
105
86
|
}
|
|
106
87
|
}
|
|
107
|
-
|
|
108
88
|
return root;
|
|
109
89
|
}
|
|
90
|
+
|
|
110
91
|
export async function normalizeImplicitTileHeaders(tile, tileset, implicitTilingExtension, options) {
|
|
111
92
|
var _tileset$root;
|
|
112
|
-
|
|
113
93
|
const basePath = tileset.basePath;
|
|
114
94
|
const {
|
|
115
95
|
subdivisionScheme,
|
|
@@ -142,11 +122,11 @@ export async function normalizeImplicitTileHeaders(tile, tileset, implicitTiling
|
|
|
142
122
|
};
|
|
143
123
|
return await normalizeImplicitTileData(tile, subtree, implicitOptions);
|
|
144
124
|
}
|
|
125
|
+
|
|
145
126
|
export async function normalizeImplicitTileData(tile, rootSubtree, options) {
|
|
146
127
|
if (!tile) {
|
|
147
128
|
return null;
|
|
148
129
|
}
|
|
149
|
-
|
|
150
130
|
tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;
|
|
151
131
|
tile.lodMetricValue = tile.geometricError;
|
|
152
132
|
tile.transformMatrix = tile.transform;
|
|
@@ -157,14 +137,12 @@ export async function normalizeImplicitTileData(tile, rootSubtree, options) {
|
|
|
157
137
|
subtree: rootSubtree,
|
|
158
138
|
options
|
|
159
139
|
});
|
|
160
|
-
|
|
161
140
|
if (contentUrl) {
|
|
162
141
|
tile.contentUrl = contentUrl;
|
|
163
142
|
tile.content = {
|
|
164
143
|
uri: contentUrl.replace("".concat(options.basePath, "/"), '')
|
|
165
144
|
};
|
|
166
145
|
}
|
|
167
|
-
|
|
168
146
|
tile.refine = getRefine(tile.refine);
|
|
169
147
|
tile.type = getTileType(tile);
|
|
170
148
|
tile.children = children;
|
|
@@ -174,7 +152,6 @@ export async function normalizeImplicitTileData(tile, rootSubtree, options) {
|
|
|
174
152
|
|
|
175
153
|
function getImplicitTilingExtensionData(tile) {
|
|
176
154
|
var _tile$extensions;
|
|
177
|
-
|
|
178
155
|
return (tile === null || tile === void 0 ? void 0 : (_tile$extensions = tile.extensions) === null || _tile$extensions === void 0 ? void 0 : _tile$extensions['3DTILES_implicit_tiling']) || (tile === null || tile === void 0 ? void 0 : tile.implicitTiling);
|
|
179
156
|
}
|
|
180
157
|
//# sourceMappingURL=parse-3d-tile-header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/parsers/parse-3d-tile-header.ts"],"names":["Tile3DSubtreeLoader","load","LOD_METRIC_TYPE","TILE_REFINEMENT","TILE_TYPE","parseImplicitTiles","replaceContentUrlTemplate","getTileType","tile","contentUrl","EMPTY","fileExtension","split","pop","POINTCLOUD","SCENEGRAPH","getRefine","refine","REPLACE","ADD","resolveUri","uri","basePath","urlSchemeRegex","test","url","URL","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","subdivisionScheme","maximumLevel","subtreeLevels","subtrees","subtreesUriTemplate","replacedUrlTemplate","subtreeUrl","subtree","contentUrlTemplate","rootLodMetricValue","rootBoundingVolume","boundingVolume","implicitOptions","normalizeImplicitTileData","rootSubtree","replace","extensions","implicitTiling"],"mappings":"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","sourcesContent":["import 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 {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';\n\nfunction getTileType(tile) {\n if (!tile.contentUrl) {\n return TILE_TYPE.EMPTY;\n }\n\n const contentUrl = tile.contentUrl;\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: LoaderOptions\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 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({subtree: rootSubtree, options});\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"],"file":"parse-3d-tile-header.js"}
|
|
1
|
+
{"version":3,"file":"parse-3d-tile-header.js","names":["Tile3DSubtreeLoader","load","LOD_METRIC_TYPE","TILE_REFINEMENT","TILE_TYPE","parseImplicitTiles","replaceContentUrlTemplate","getTileType","tile","contentUrl","EMPTY","fileExtension","split","pop","POINTCLOUD","SCENEGRAPH","getRefine","refine","REPLACE","ADD","resolveUri","uri","basePath","urlSchemeRegex","test","url","URL","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","subdivisionScheme","maximumLevel","subtreeLevels","subtrees","subtreesUriTemplate","replacedUrlTemplate","subtreeUrl","subtree","contentUrlTemplate","rootLodMetricValue","rootBoundingVolume","boundingVolume","implicitOptions","normalizeImplicitTileData","rootSubtree","replace","extensions","implicitTiling"],"sources":["../../../../src/lib/parsers/parse-3d-tile-header.ts"],"sourcesContent":["import 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 {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';\n\nfunction getTileType(tile) {\n if (!tile.contentUrl) {\n return TILE_TYPE.EMPTY;\n }\n\n const contentUrl = tile.contentUrl;\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: LoaderOptions\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 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({subtree: rootSubtree, options});\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,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
1
3
|
import { Vector3, Matrix3, Matrix4, Quaternion } from '@math.gl/core';
|
|
2
4
|
import { Ellipsoid } from '@math.gl/geospatial';
|
|
3
5
|
import { GL } from '@loaders.gl/math';
|
|
@@ -11,33 +13,28 @@ export async function parseInstancedModel3DTile(tile, arrayBuffer, byteOffset, o
|
|
|
11
13
|
await extractGLTF(tile, tile.gltfFormat, options, context);
|
|
12
14
|
return byteOffset;
|
|
13
15
|
}
|
|
14
|
-
|
|
15
16
|
function parseInstancedModel(tile, arrayBuffer, byteOffset, options, context) {
|
|
16
17
|
byteOffset = parse3DTileHeaderSync(tile, arrayBuffer, byteOffset);
|
|
17
|
-
|
|
18
18
|
if (tile.version !== 1) {
|
|
19
19
|
throw new Error("Instanced 3D Model version ".concat(tile.version, " is not supported"));
|
|
20
20
|
}
|
|
21
|
-
|
|
22
21
|
byteOffset = parse3DTileTablesHeaderSync(tile, arrayBuffer, byteOffset);
|
|
23
22
|
const view = new DataView(arrayBuffer);
|
|
24
23
|
tile.gltfFormat = view.getUint32(byteOffset, true);
|
|
25
24
|
byteOffset += 4;
|
|
25
|
+
|
|
26
26
|
byteOffset = parse3DTileTablesSync(tile, arrayBuffer, byteOffset, options);
|
|
27
27
|
byteOffset = parse3DTileGLTFViewSync(tile, arrayBuffer, byteOffset, options);
|
|
28
28
|
|
|
29
29
|
if (tile.featureTableJsonByteLength === 0) {
|
|
30
30
|
throw new Error('i3dm parser: featureTableJsonByteLength is zero.');
|
|
31
31
|
}
|
|
32
|
-
|
|
33
32
|
const featureTable = new Tile3DFeatureTable(tile.featureTableJson, tile.featureTableBinary);
|
|
34
33
|
const instancesLength = featureTable.getGlobalProperty('INSTANCES_LENGTH');
|
|
35
34
|
featureTable.featuresLength = instancesLength;
|
|
36
|
-
|
|
37
35
|
if (!Number.isFinite(instancesLength)) {
|
|
38
36
|
throw new Error('i3dm parser: INSTANCES_LENGTH must be defined');
|
|
39
37
|
}
|
|
40
|
-
|
|
41
38
|
tile.eastNorthUp = featureTable.getGlobalProperty('EAST_NORTH_UP');
|
|
42
39
|
tile.rtcCenter = featureTable.getGlobalProperty('RTC_CENTER', GL.FLOAT, 3);
|
|
43
40
|
const batchTable = new Tile3DBatchTable(tile.batchTableJson, tile.batchTableBinary, instancesLength);
|
|
@@ -70,7 +67,6 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
|
|
|
70
67
|
const scratch2 = [];
|
|
71
68
|
const scratchVector1 = new Vector3();
|
|
72
69
|
const scratchVector2 = new Vector3();
|
|
73
|
-
|
|
74
70
|
for (let i = 0; i < instancesLength; i++) {
|
|
75
71
|
let position;
|
|
76
72
|
|
|
@@ -79,49 +75,39 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
|
|
|
79
75
|
} else if (featureTable.hasProperty('POSITION_QUANTIZED')) {
|
|
80
76
|
position = featureTable.getProperty('POSITION_QUANTIZED', GL.UNSIGNED_SHORT, 3, i, instancePosition);
|
|
81
77
|
const quantizedVolumeOffset = featureTable.getGlobalProperty('QUANTIZED_VOLUME_OFFSET', GL.FLOAT, 3, scratchVector1);
|
|
82
|
-
|
|
83
78
|
if (!quantizedVolumeOffset) {
|
|
84
79
|
throw new Error('i3dm parser: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.');
|
|
85
80
|
}
|
|
86
|
-
|
|
87
81
|
const quantizedVolumeScale = featureTable.getGlobalProperty('QUANTIZED_VOLUME_SCALE', GL.FLOAT, 3, scratchVector2);
|
|
88
|
-
|
|
89
82
|
if (!quantizedVolumeScale) {
|
|
90
83
|
throw new Error('i3dm parser: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.');
|
|
91
84
|
}
|
|
92
|
-
|
|
93
85
|
const MAX_UNSIGNED_SHORT = 65535.0;
|
|
94
|
-
|
|
95
86
|
for (let j = 0; j < 3; j++) {
|
|
96
87
|
position[j] = position[j] / MAX_UNSIGNED_SHORT * quantizedVolumeScale[j] + quantizedVolumeOffset[j];
|
|
97
88
|
}
|
|
98
89
|
}
|
|
99
|
-
|
|
100
90
|
if (!position) {
|
|
101
91
|
throw new Error('i3dm: POSITION or POSITION_QUANTIZED must be defined for each instance.');
|
|
102
92
|
}
|
|
103
|
-
|
|
104
93
|
instancePosition.copy(position);
|
|
105
94
|
instanceTranslationRotationScale.translation = instancePosition;
|
|
95
|
+
|
|
106
96
|
tile.normalUp = featureTable.getProperty('NORMAL_UP', GL.FLOAT, 3, i, scratch1);
|
|
107
97
|
tile.normalRight = featureTable.getProperty('NORMAL_RIGHT', GL.FLOAT, 3, i, scratch2);
|
|
108
98
|
const hasCustomOrientation = false;
|
|
109
|
-
|
|
110
99
|
if (tile.normalUp) {
|
|
111
100
|
if (!tile.normalRight) {
|
|
112
101
|
throw new Error('i3dm: Custom orientation requires both NORMAL_UP and NORMAL_RIGHT.');
|
|
113
102
|
}
|
|
114
|
-
|
|
115
103
|
tile.hasCustomOrientation = true;
|
|
116
104
|
} else {
|
|
117
105
|
tile.octNormalUp = featureTable.getProperty('NORMAL_UP_OCT32P', GL.UNSIGNED_SHORT, 2, scratch1);
|
|
118
106
|
tile.octNormalRight = featureTable.getProperty('NORMAL_RIGHT_OCT32P', GL.UNSIGNED_SHORT, 2, scratch2);
|
|
119
|
-
|
|
120
107
|
if (tile.octNormalUp) {
|
|
121
108
|
if (!tile.octNormalRight) {
|
|
122
109
|
throw new Error('i3dm: oct-encoded orientation requires NORMAL_UP_OCT32P and NORMAL_RIGHT_OCT32P');
|
|
123
110
|
}
|
|
124
|
-
|
|
125
111
|
throw new Error('i3dm: oct-encoded orientation not implemented');
|
|
126
112
|
} else if (tile.eastNorthUp) {
|
|
127
113
|
Ellipsoid.WGS84.eastNorthUpToFixedFrame(instancePosition, instanceTransform);
|
|
@@ -130,37 +116,34 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
|
|
|
130
116
|
instanceRotation.identity();
|
|
131
117
|
}
|
|
132
118
|
}
|
|
133
|
-
|
|
134
119
|
if (hasCustomOrientation) {
|
|
135
120
|
instanceNormalForward.copy(instanceNormalRight).cross(instanceNormalUp).normalize();
|
|
136
121
|
instanceRotation.setColumn(0, instanceNormalRight);
|
|
137
122
|
instanceRotation.setColumn(1, instanceNormalUp);
|
|
138
123
|
instanceRotation.setColumn(2, instanceNormalForward);
|
|
139
124
|
}
|
|
140
|
-
|
|
141
125
|
instanceQuaternion.fromMatrix3(instanceRotation);
|
|
142
126
|
instanceTranslationRotationScale.rotation = instanceQuaternion;
|
|
127
|
+
|
|
143
128
|
instanceScale.set(1.0, 1.0, 1.0);
|
|
144
129
|
const scale = featureTable.getProperty('SCALE', GL.FLOAT, 1, i);
|
|
145
|
-
|
|
146
130
|
if (Number.isFinite(scale)) {
|
|
147
131
|
instanceScale.multiplyByScalar(scale);
|
|
148
132
|
}
|
|
149
|
-
|
|
150
133
|
const nonUniformScale = featureTable.getProperty('SCALE_NON_UNIFORM', GL.FLOAT, 3, i, scratch1);
|
|
151
|
-
|
|
152
134
|
if (nonUniformScale) {
|
|
153
135
|
instanceScale.scale(nonUniformScale);
|
|
154
136
|
}
|
|
155
137
|
|
|
156
138
|
instanceTranslationRotationScale.scale = instanceScale;
|
|
157
|
-
let batchId = featureTable.getProperty('BATCH_ID', GL.UNSIGNED_SHORT, 1, i);
|
|
158
139
|
|
|
140
|
+
let batchId = featureTable.getProperty('BATCH_ID', GL.UNSIGNED_SHORT, 1, i);
|
|
159
141
|
if (batchId === undefined) {
|
|
160
142
|
batchId = i;
|
|
161
143
|
}
|
|
162
144
|
|
|
163
145
|
const rotationMatrix = new Matrix4().fromQuaternion(instanceTranslationRotationScale.rotation);
|
|
146
|
+
|
|
164
147
|
instanceTransform.identity();
|
|
165
148
|
instanceTransform.translate(instanceTranslationRotationScale.translation);
|
|
166
149
|
instanceTransform.multiplyRight(rotationMatrix);
|
|
@@ -171,7 +154,6 @@ function extractInstancedAttributes(tile, featureTable, batchTable, instancesLen
|
|
|
171
154
|
batchId
|
|
172
155
|
};
|
|
173
156
|
}
|
|
174
|
-
|
|
175
157
|
tile.instances = instances;
|
|
176
158
|
}
|
|
177
159
|
//# sourceMappingURL=parse-3d-tile-instanced-model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/parsers/parse-3d-tile-instanced-model.ts"],"names":["Vector3","Matrix3","Matrix4","Quaternion","Ellipsoid","GL","Tile3DFeatureTable","Tile3DBatchTable","parse3DTileHeaderSync","parse3DTileTablesHeaderSync","parse3DTileTablesSync","parse3DTileGLTFViewSync","extractGLTF","parseInstancedModel3DTile","tile","arrayBuffer","byteOffset","options","context","parseInstancedModel","gltfFormat","version","Error","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"],"mappings":"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","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';\n\nexport async function parseInstancedModel3DTile(tile, arrayBuffer, byteOffset, options, context) {\n byteOffset = parseInstancedModel(tile, arrayBuffer, byteOffset, options, context);\n await extractGLTF(tile, tile.gltfFormat, options, context);\n return byteOffset;\n}\n\nfunction parseInstancedModel(tile, arrayBuffer, byteOffset, options, context) {\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"],"file":"parse-3d-tile-instanced-model.js"}
|
|
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","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';\n\nexport async function parseInstancedModel3DTile(tile, arrayBuffer, byteOffset, options, context) {\n byteOffset = parseInstancedModel(tile, arrayBuffer, byteOffset, options, context);\n await extractGLTF(tile, tile.gltfFormat, options, context);\n return byteOffset;\n}\n\nfunction parseInstancedModel(tile, arrayBuffer, byteOffset, options, context) {\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,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
1
3
|
import { DracoLoader } from '@loaders.gl/draco';
|
|
2
4
|
import { GL } from '@loaders.gl/math';
|
|
3
5
|
import { Vector3 } from '@math.gl/core';
|
|
@@ -23,7 +25,6 @@ export async function parsePointCloud3DTile(tile, arrayBuffer, byteOffset, optio
|
|
|
23
25
|
parseNormals(tile, featureTable);
|
|
24
26
|
return byteOffset;
|
|
25
27
|
}
|
|
26
|
-
|
|
27
28
|
function initializeTile(tile) {
|
|
28
29
|
tile.attributes = {
|
|
29
30
|
positions: null,
|
|
@@ -36,15 +37,12 @@ function initializeTile(tile) {
|
|
|
36
37
|
tile.isRGB565 = false;
|
|
37
38
|
tile.isOctEncoded16P = false;
|
|
38
39
|
}
|
|
39
|
-
|
|
40
40
|
function parsePointCloudTables(tile) {
|
|
41
41
|
const featureTable = new Tile3DFeatureTable(tile.featureTableJson, tile.featureTableBinary);
|
|
42
42
|
const pointsLength = featureTable.getGlobalProperty('POINTS_LENGTH');
|
|
43
|
-
|
|
44
43
|
if (!Number.isFinite(pointsLength)) {
|
|
45
44
|
throw new Error('POINTS_LENGTH must be defined');
|
|
46
45
|
}
|
|
47
|
-
|
|
48
46
|
featureTable.featuresLength = pointsLength;
|
|
49
47
|
tile.featuresLength = pointsLength;
|
|
50
48
|
tile.pointsLength = pointsLength;
|
|
@@ -56,7 +54,6 @@ function parsePointCloudTables(tile) {
|
|
|
56
54
|
batchTable
|
|
57
55
|
};
|
|
58
56
|
}
|
|
59
|
-
|
|
60
57
|
function parsePositions(tile, featureTable, options) {
|
|
61
58
|
if (!tile.attributes.positions) {
|
|
62
59
|
if (featureTable.hasProperty('POSITION')) {
|
|
@@ -66,30 +63,23 @@ function parsePositions(tile, featureTable, options) {
|
|
|
66
63
|
tile.isQuantized = true;
|
|
67
64
|
tile.quantizedRange = (1 << 16) - 1;
|
|
68
65
|
tile.quantizedVolumeScale = featureTable.getGlobalProperty('QUANTIZED_VOLUME_SCALE', GL.FLOAT, 3);
|
|
69
|
-
|
|
70
66
|
if (!tile.quantizedVolumeScale) {
|
|
71
67
|
throw new Error('QUANTIZED_VOLUME_SCALE must be defined for quantized positions.');
|
|
72
68
|
}
|
|
73
|
-
|
|
74
69
|
tile.quantizedVolumeOffset = featureTable.getGlobalProperty('QUANTIZED_VOLUME_OFFSET', GL.FLOAT, 3);
|
|
75
|
-
|
|
76
70
|
if (!tile.quantizedVolumeOffset) {
|
|
77
71
|
throw new Error('QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.');
|
|
78
72
|
}
|
|
79
|
-
|
|
80
73
|
tile.attributes.positions = normalize3DTilePositionAttribute(tile, positions, options);
|
|
81
74
|
}
|
|
82
75
|
}
|
|
83
|
-
|
|
84
76
|
if (!tile.attributes.positions) {
|
|
85
77
|
throw new Error('Either POSITION or POSITION_QUANTIZED must be defined.');
|
|
86
78
|
}
|
|
87
79
|
}
|
|
88
|
-
|
|
89
80
|
function parseColors(tile, featureTable, batchTable) {
|
|
90
81
|
if (!tile.attributes.colors) {
|
|
91
82
|
let colors = null;
|
|
92
|
-
|
|
93
83
|
if (featureTable.hasProperty('RGBA')) {
|
|
94
84
|
colors = featureTable.getPropertyArray('RGBA', GL.UNSIGNED_BYTE, 4);
|
|
95
85
|
tile.isTranslucent = true;
|
|
@@ -99,43 +89,33 @@ function parseColors(tile, featureTable, batchTable) {
|
|
|
99
89
|
colors = featureTable.getPropertyArray('RGB565', GL.UNSIGNED_SHORT, 1);
|
|
100
90
|
tile.isRGB565 = true;
|
|
101
91
|
}
|
|
102
|
-
|
|
103
92
|
tile.attributes.colors = normalize3DTileColorAttribute(tile, colors, batchTable);
|
|
104
93
|
}
|
|
105
|
-
|
|
106
94
|
if (featureTable.hasProperty('CONSTANT_RGBA')) {
|
|
107
95
|
tile.constantRGBA = featureTable.getGlobalProperty('CONSTANT_RGBA', GL.UNSIGNED_BYTE, 4);
|
|
108
96
|
}
|
|
109
97
|
}
|
|
110
|
-
|
|
111
98
|
function parseNormals(tile, featureTable) {
|
|
112
99
|
if (!tile.attributes.normals) {
|
|
113
100
|
let normals = null;
|
|
114
|
-
|
|
115
101
|
if (featureTable.hasProperty('NORMAL')) {
|
|
116
102
|
normals = featureTable.getPropertyArray('NORMAL', GL.FLOAT, 3);
|
|
117
103
|
} else if (featureTable.hasProperty('NORMAL_OCT16P')) {
|
|
118
104
|
normals = featureTable.getPropertyArray('NORMAL_OCT16P', GL.UNSIGNED_BYTE, 2);
|
|
119
105
|
tile.isOctEncoded16P = true;
|
|
120
106
|
}
|
|
121
|
-
|
|
122
107
|
tile.attributes.normals = normalize3DTileNormalAttribute(tile, normals);
|
|
123
108
|
}
|
|
124
109
|
}
|
|
125
|
-
|
|
126
110
|
function parseBatchIds(tile, featureTable) {
|
|
127
111
|
let batchTable = null;
|
|
128
|
-
|
|
129
112
|
if (!tile.batchIds && featureTable.hasProperty('BATCH_ID')) {
|
|
130
113
|
tile.batchIds = featureTable.getPropertyArray('BATCH_ID', GL.UNSIGNED_SHORT, 1);
|
|
131
|
-
|
|
132
114
|
if (tile.batchIds) {
|
|
133
115
|
const batchFeatureLength = featureTable.getGlobalProperty('BATCH_LENGTH');
|
|
134
|
-
|
|
135
116
|
if (!batchFeatureLength) {
|
|
136
117
|
throw new Error('Global property: BATCH_LENGTH must be defined when BATCH_ID is defined.');
|
|
137
118
|
}
|
|
138
|
-
|
|
139
119
|
const {
|
|
140
120
|
batchTableJson,
|
|
141
121
|
batchTableBinary
|
|
@@ -143,7 +123,6 @@ function parseBatchIds(tile, featureTable) {
|
|
|
143
123
|
batchTable = new Tile3DBatchTable(batchTableJson, batchTableBinary, batchFeatureLength);
|
|
144
124
|
}
|
|
145
125
|
}
|
|
146
|
-
|
|
147
126
|
return batchTable;
|
|
148
127
|
}
|
|
149
128
|
|
|
@@ -152,22 +131,17 @@ async function parseDraco(tile, featureTable, batchTable, options, context) {
|
|
|
152
131
|
let dracoFeatureTableProperties;
|
|
153
132
|
let dracoBatchTableProperties;
|
|
154
133
|
const batchTableDraco = tile.batchTableJson && tile.batchTableJson.extensions && tile.batchTableJson.extensions['3DTILES_draco_point_compression'];
|
|
155
|
-
|
|
156
134
|
if (batchTableDraco) {
|
|
157
135
|
dracoBatchTableProperties = batchTableDraco.properties;
|
|
158
136
|
}
|
|
159
|
-
|
|
160
137
|
const featureTableDraco = featureTable.getExtension('3DTILES_draco_point_compression');
|
|
161
|
-
|
|
162
138
|
if (featureTableDraco) {
|
|
163
139
|
dracoFeatureTableProperties = featureTableDraco.properties;
|
|
164
140
|
const dracoByteOffset = featureTableDraco.byteOffset;
|
|
165
141
|
const dracoByteLength = featureTableDraco.byteLength;
|
|
166
|
-
|
|
167
142
|
if (!dracoFeatureTableProperties || !Number.isFinite(dracoByteOffset) || !dracoByteLength) {
|
|
168
143
|
throw new Error('Draco properties, byteOffset, and byteLength must be defined');
|
|
169
144
|
}
|
|
170
|
-
|
|
171
145
|
dracoBuffer = tile.featureTableBinary.slice(dracoByteOffset, dracoByteOffset + dracoByteLength);
|
|
172
146
|
tile.hasPositions = Number.isFinite(dracoFeatureTableProperties.POSITION);
|
|
173
147
|
tile.hasColors = Number.isFinite(dracoFeatureTableProperties.RGB) || Number.isFinite(dracoFeatureTableProperties.RGBA);
|
|
@@ -175,14 +149,13 @@ async function parseDraco(tile, featureTable, batchTable, options, context) {
|
|
|
175
149
|
tile.hasBatchIds = Number.isFinite(dracoFeatureTableProperties.BATCH_ID);
|
|
176
150
|
tile.isTranslucent = Number.isFinite(dracoFeatureTableProperties.RGBA);
|
|
177
151
|
}
|
|
178
|
-
|
|
179
152
|
if (!dracoBuffer) {
|
|
180
153
|
return true;
|
|
181
154
|
}
|
|
182
|
-
|
|
183
155
|
const dracoData = {
|
|
184
156
|
buffer: dracoBuffer,
|
|
185
|
-
properties: {
|
|
157
|
+
properties: {
|
|
158
|
+
...dracoFeatureTableProperties,
|
|
186
159
|
...dracoBatchTableProperties
|
|
187
160
|
},
|
|
188
161
|
featureTableProperties: dracoFeatureTableProperties,
|
|
@@ -196,11 +169,14 @@ export async function loadDraco(tile, dracoData, options, context) {
|
|
|
196
169
|
const {
|
|
197
170
|
parse
|
|
198
171
|
} = context;
|
|
199
|
-
const dracoOptions = {
|
|
200
|
-
|
|
172
|
+
const dracoOptions = {
|
|
173
|
+
...options,
|
|
174
|
+
draco: {
|
|
175
|
+
...options.draco,
|
|
201
176
|
extraAttributes: dracoData.batchTableProperties || {}
|
|
202
177
|
}
|
|
203
178
|
};
|
|
179
|
+
|
|
204
180
|
delete dracoOptions['3d-tiles'];
|
|
205
181
|
const data = await parse(dracoData.buffer, DracoLoader, dracoOptions);
|
|
206
182
|
const decodedPositions = data.attributes.POSITION && data.attributes.POSITION.value;
|
|
@@ -209,7 +185,6 @@ export async function loadDraco(tile, dracoData, options, context) {
|
|
|
209
185
|
const decodedBatchIds = data.attributes.BATCH_ID && data.attributes.BATCH_ID.value;
|
|
210
186
|
const isQuantizedDraco = decodedPositions && data.attributes.POSITION.value.quantization;
|
|
211
187
|
const isOctEncodedDraco = decodedNormals && data.attributes.NORMAL.value.quantization;
|
|
212
|
-
|
|
213
188
|
if (isQuantizedDraco) {
|
|
214
189
|
const quantization = data.POSITION.data.quantization;
|
|
215
190
|
const range = quantization.range;
|
|
@@ -218,14 +193,12 @@ export async function loadDraco(tile, dracoData, options, context) {
|
|
|
218
193
|
tile.quantizedRange = (1 << quantization.quantizationBits) - 1.0;
|
|
219
194
|
tile.isQuantizedDraco = true;
|
|
220
195
|
}
|
|
221
|
-
|
|
222
196
|
if (isOctEncodedDraco) {
|
|
223
197
|
tile.octEncodedRange = (1 << data.NORMAL.data.quantization.quantizationBits) - 1.0;
|
|
224
198
|
tile.isOctEncodedDraco = true;
|
|
225
199
|
}
|
|
226
200
|
|
|
227
201
|
const batchTableAttributes = {};
|
|
228
|
-
|
|
229
202
|
if (dracoData.batchTableProperties) {
|
|
230
203
|
for (const attributeName of Object.keys(dracoData.batchTableProperties)) {
|
|
231
204
|
if (data.attributes[attributeName] && data.attributes[attributeName].value) {
|
|
@@ -233,7 +206,6 @@ export async function loadDraco(tile, dracoData, options, context) {
|
|
|
233
206
|
}
|
|
234
207
|
}
|
|
235
208
|
}
|
|
236
|
-
|
|
237
209
|
tile.attributes = {
|
|
238
210
|
positions: decodedPositions,
|
|
239
211
|
colors: normalize3DTileColorAttribute(tile, decodedColors, undefined),
|