@loaders.gl/tile-converter 3.4.6 → 4.0.0-alpha.10
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/bin/converter.js +1 -1
- package/dist/3d-tiles-attributes-worker.js +2 -2
- package/dist/3d-tiles-attributes-worker.js.map +3 -3
- package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
- package/dist/3d-tiles-converter/3d-tiles-converter.js +4 -3
- package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts +0 -8
- package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -1
- package/dist/3d-tiles-converter/helpers/b3dm-converter.js +2 -15
- package/dist/converter.min.js +75 -76
- package/dist/deps-installer/deps-installer.js +4 -4
- package/dist/dist.min.js +2101 -2120
- package/dist/es5/3d-tiles-attributes-worker.js +1 -1
- package/dist/es5/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +0 -3
- package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +2 -10
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/es5/deps-installer/deps-installer.js +4 -4
- package/dist/es5/deps-installer/deps-installer.js.map +1 -1
- package/dist/es5/i3s-attributes-worker.js +1 -1
- package/dist/es5/i3s-attributes-worker.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +4 -4
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/coordinate-converter.js +6 -7
- package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-converter.js +49 -30
- package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/gltf-attributes.js +46 -16
- package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/load-3d-tiles.js +82 -0
- package/dist/es5/i3s-converter/helpers/load-3d-tiles.js.map +1 -0
- package/dist/es5/i3s-converter/helpers/node-index-document.js +74 -45
- package/dist/es5/i3s-converter/helpers/node-index-document.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js +111 -0
- package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -0
- package/dist/es5/i3s-converter/helpers/tileset-traversal.js +82 -0
- package/dist/es5/i3s-converter/helpers/tileset-traversal.js.map +1 -0
- package/dist/es5/i3s-converter/i3s-converter.js +545 -523
- package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/es5/i3s-converter/types.js +16 -0
- package/dist/es5/i3s-converter/types.js.map +1 -1
- package/dist/es5/i3s-server/README.md +19 -0
- package/dist/es5/i3s-server/app.js +10 -1
- package/dist/es5/i3s-server/app.js.map +1 -1
- package/dist/es5/i3s-server/controllers/slpk-controller.js +84 -0
- package/dist/es5/i3s-server/controllers/slpk-controller.js.map +1 -0
- package/dist/es5/i3s-server/routes/slpk-router.js +71 -0
- package/dist/es5/i3s-server/routes/slpk-router.js.map +1 -0
- package/dist/es5/i3s-server/utils/create-scene-server.js +17 -0
- package/dist/es5/i3s-server/utils/create-scene-server.js.map +1 -0
- package/dist/es5/lib/utils/file-utils.js +1 -1
- package/dist/es5/lib/utils/file-utils.js.map +1 -1
- package/dist/es5/lib/utils/geometry-utils.js +15 -0
- package/dist/es5/lib/utils/geometry-utils.js.map +1 -0
- package/dist/es5/lib/utils/lod-conversion-utils.js.map +1 -1
- package/dist/es5/pgm-loader.js +1 -1
- package/dist/es5/pgm-loader.js.map +1 -1
- package/dist/esm/3d-tiles-attributes-worker.js +1 -1
- package/dist/esm/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/esm/3d-tiles-converter/3d-tiles-converter.js +0 -3
- package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +2 -8
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/esm/deps-installer/deps-installer.js +4 -4
- package/dist/esm/deps-installer/deps-installer.js.map +1 -1
- package/dist/esm/i3s-attributes-worker.js +1 -1
- package/dist/esm/i3s-attributes-worker.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +4 -4
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/coordinate-converter.js +6 -7
- package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-converter.js +37 -18
- package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/gltf-attributes.js +50 -16
- package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/load-3d-tiles.js +35 -0
- package/dist/esm/i3s-converter/helpers/load-3d-tiles.js.map +1 -0
- package/dist/esm/i3s-converter/helpers/node-index-document.js +14 -1
- package/dist/esm/i3s-converter/helpers/node-index-document.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js +48 -0
- package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -0
- package/dist/esm/i3s-converter/helpers/tileset-traversal.js +14 -0
- package/dist/esm/i3s-converter/helpers/tileset-traversal.js.map +1 -0
- package/dist/esm/i3s-converter/i3s-converter.js +134 -127
- package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/esm/i3s-converter/types.js +10 -1
- package/dist/esm/i3s-converter/types.js.map +1 -1
- package/dist/esm/i3s-server/README.md +19 -0
- package/dist/esm/i3s-server/app.js +11 -1
- package/dist/esm/i3s-server/app.js.map +1 -1
- package/dist/esm/i3s-server/controllers/slpk-controller.js +36 -0
- package/dist/esm/i3s-server/controllers/slpk-controller.js.map +1 -0
- package/dist/esm/i3s-server/routes/slpk-router.js +33 -0
- package/dist/esm/i3s-server/routes/slpk-router.js.map +1 -0
- package/dist/esm/i3s-server/utils/create-scene-server.js +16 -0
- package/dist/esm/i3s-server/utils/create-scene-server.js.map +1 -0
- package/dist/esm/lib/utils/file-utils.js +1 -1
- package/dist/esm/lib/utils/file-utils.js.map +1 -1
- package/dist/esm/lib/utils/geometry-utils.js +8 -0
- package/dist/esm/lib/utils/geometry-utils.js.map +1 -0
- package/dist/esm/lib/utils/lod-conversion-utils.js.map +1 -1
- package/dist/esm/pgm-loader.js +1 -1
- package/dist/esm/pgm-loader.js.map +1 -1
- package/dist/i3s-attributes-worker.d.ts +10 -2
- package/dist/i3s-attributes-worker.d.ts.map +1 -1
- package/dist/i3s-attributes-worker.js +2 -2
- package/dist/i3s-attributes-worker.js.map +3 -3
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +4 -2
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.js +4 -7
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts +3 -4
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/coordinate-converter.js +8 -9
- package/dist/i3s-converter/helpers/geometry-converter.d.ts +9 -4
- package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-converter.js +84 -54
- package/dist/i3s-converter/helpers/gltf-attributes.d.ts +22 -3
- package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/gltf-attributes.js +62 -22
- package/dist/i3s-converter/helpers/load-3d-tiles.d.ts +18 -0
- package/dist/i3s-converter/helpers/load-3d-tiles.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/load-3d-tiles.js +53 -0
- package/dist/i3s-converter/helpers/node-index-document.d.ts +8 -0
- package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/node-index-document.js +20 -2
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts +23 -0
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +76 -0
- package/dist/i3s-converter/helpers/tileset-traversal.d.ts +25 -0
- package/dist/i3s-converter/helpers/tileset-traversal.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/tileset-traversal.js +29 -0
- package/dist/i3s-converter/i3s-converter.d.ts +40 -40
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
- package/dist/i3s-converter/i3s-converter.js +150 -125
- package/dist/i3s-converter/types.d.ts +18 -0
- package/dist/i3s-converter/types.d.ts.map +1 -1
- package/dist/i3s-converter/types.js +15 -0
- package/dist/i3s-server/app.d.ts.map +1 -1
- package/dist/i3s-server/app.js +9 -1
- package/dist/i3s-server/controllers/slpk-controller.d.ts +3 -0
- package/dist/i3s-server/controllers/slpk-controller.d.ts.map +1 -0
- package/dist/i3s-server/controllers/slpk-controller.js +32 -0
- package/dist/i3s-server/routes/slpk-router.d.ts +3 -0
- package/dist/i3s-server/routes/slpk-router.d.ts.map +1 -0
- package/dist/i3s-server/routes/slpk-router.js +33 -0
- package/dist/i3s-server/utils/create-scene-server.d.ts +11 -0
- package/dist/i3s-server/utils/create-scene-server.d.ts.map +1 -0
- package/dist/i3s-server/utils/create-scene-server.js +14 -0
- package/dist/lib/utils/file-utils.d.ts.map +1 -1
- package/dist/lib/utils/file-utils.js +2 -1
- package/dist/lib/utils/geometry-utils.d.ts +9 -0
- package/dist/lib/utils/geometry-utils.d.ts.map +1 -0
- package/dist/lib/utils/geometry-utils.js +18 -0
- package/dist/lib/utils/lod-conversion-utils.d.ts +3 -2
- package/dist/lib/utils/lod-conversion-utils.d.ts.map +1 -1
- package/dist/lib/utils/lod-conversion-utils.js +1 -1
- package/package.json +15 -16
- package/src/3d-tiles-converter/3d-tiles-converter.ts +9 -8
- package/src/3d-tiles-converter/helpers/b3dm-converter.ts +2 -16
- package/src/deps-installer/deps-installer.ts +4 -4
- package/src/i3s-attributes-worker.ts +11 -2
- package/src/i3s-converter/helpers/batch-ids-extensions.ts +15 -19
- package/src/i3s-converter/helpers/coordinate-converter.ts +11 -10
- package/src/i3s-converter/helpers/geometry-converter.ts +154 -95
- package/src/i3s-converter/helpers/gltf-attributes.ts +85 -25
- package/src/i3s-converter/helpers/load-3d-tiles.ts +68 -0
- package/src/i3s-converter/helpers/node-index-document.ts +22 -2
- package/src/i3s-converter/helpers/preprocess-3d-tiles.ts +81 -0
- package/src/i3s-converter/helpers/tileset-traversal.ts +51 -0
- package/src/i3s-converter/i3s-converter.ts +229 -178
- package/src/i3s-converter/types.ts +20 -0
- package/src/i3s-server/README.md +19 -0
- package/src/i3s-server/app.js +8 -1
- package/src/i3s-server/controllers/slpk-controller.js +38 -0
- package/src/i3s-server/routes/slpk-router.js +33 -0
- package/src/i3s-server/utils/create-scene-server.js +15 -0
- package/src/lib/utils/file-utils.ts +2 -1
- package/src/lib/utils/geometry-utils.ts +14 -0
- package/src/lib/utils/lod-conversion-utils.ts +6 -2
|
@@ -1,33 +1,27 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {Tiles3DTileContent} from '@loaders.gl/3d-tiles';
|
|
2
2
|
import type {GLTFAccessorPostprocessed, GLTFNodePostprocessed} from '@loaders.gl/gltf';
|
|
3
3
|
import type {B3DMAttributesData} from '../../i3s-attributes-worker';
|
|
4
|
+
import {Matrix4, Vector3} from '@math.gl/core';
|
|
5
|
+
import {BoundingSphere, OrientedBoundingBox} from '@math.gl/culling';
|
|
6
|
+
import {Ellipsoid} from '@math.gl/geospatial';
|
|
4
7
|
|
|
5
8
|
type AttributesObject = {
|
|
6
9
|
[k: string]: GLTFAccessorPostprocessed;
|
|
7
10
|
};
|
|
8
11
|
|
|
9
|
-
/**
|
|
10
|
-
* Keep only values for B3DM attributes to pass data to worker thread.
|
|
11
|
-
* @param attributes
|
|
12
|
-
*/
|
|
13
|
-
function getB3DMAttributesWithoutBufferView(attributes: AttributesObject): AttributesObject {
|
|
14
|
-
const attributesWithoutBufferView = {};
|
|
15
|
-
|
|
16
|
-
for (const attributeName in attributes) {
|
|
17
|
-
attributesWithoutBufferView[attributeName] = {
|
|
18
|
-
value: attributes[attributeName].value
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return attributesWithoutBufferView;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
12
|
/**
|
|
26
13
|
* Prepare attributes for conversion to avoid binary data breaking in worker thread.
|
|
27
|
-
* @param tileContent
|
|
14
|
+
* @param tileContent - 3DTiles tile content
|
|
15
|
+
* @param tileTransform - transformation matrix of the tile, calculated recursively multiplying
|
|
16
|
+
* transform of all parent tiles and transform of the current tile
|
|
17
|
+
* @param boundingVolume - initialized bounding volume of the source tile
|
|
28
18
|
* @returns
|
|
29
19
|
*/
|
|
30
|
-
export function prepareDataForAttributesConversion(
|
|
20
|
+
export function prepareDataForAttributesConversion(
|
|
21
|
+
tileContent: Tiles3DTileContent,
|
|
22
|
+
tileTransform: Matrix4,
|
|
23
|
+
boundingVolume: OrientedBoundingBox | BoundingSphere
|
|
24
|
+
): B3DMAttributesData {
|
|
31
25
|
let nodes =
|
|
32
26
|
tileContent.gltf?.scene?.nodes ||
|
|
33
27
|
tileContent.gltf?.scenes?.[0]?.nodes ||
|
|
@@ -38,10 +32,7 @@ export function prepareDataForAttributesConversion(tileContent: B3DMContent): B3
|
|
|
38
32
|
tileContent.gltf?.images?.map((imageObject) => {
|
|
39
33
|
// Need data only for uncompressed images because we can't get batchIds from compressed textures.
|
|
40
34
|
if (imageObject?.image?.compressed) {
|
|
41
|
-
return
|
|
42
|
-
data: null,
|
|
43
|
-
compressed: true
|
|
44
|
-
};
|
|
35
|
+
return null;
|
|
45
36
|
} else {
|
|
46
37
|
const data = imageObject?.image?.data;
|
|
47
38
|
const dataCopy = new Uint8Array(data.length);
|
|
@@ -59,8 +50,11 @@ export function prepareDataForAttributesConversion(tileContent: B3DMContent): B3
|
|
|
59
50
|
|
|
60
51
|
prepareNodes(nodes);
|
|
61
52
|
|
|
62
|
-
const cartographicOrigin =
|
|
63
|
-
|
|
53
|
+
const {cartographicOrigin, modelMatrix: cartesianModelMatrix} = calculateTransformProps(
|
|
54
|
+
tileContent,
|
|
55
|
+
tileTransform,
|
|
56
|
+
boundingVolume
|
|
57
|
+
);
|
|
64
58
|
|
|
65
59
|
return {
|
|
66
60
|
nodes,
|
|
@@ -70,6 +64,72 @@ export function prepareDataForAttributesConversion(tileContent: B3DMContent): B3
|
|
|
70
64
|
};
|
|
71
65
|
}
|
|
72
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Keep only values for glTF attributes to pass data to worker thread.
|
|
69
|
+
* @param attributes - geometry attributes
|
|
70
|
+
*/
|
|
71
|
+
function getB3DMAttributesWithoutBufferView(attributes: AttributesObject): AttributesObject {
|
|
72
|
+
const attributesWithoutBufferView = {};
|
|
73
|
+
|
|
74
|
+
for (const attributeName in attributes) {
|
|
75
|
+
attributesWithoutBufferView[attributeName] = {
|
|
76
|
+
value: attributes[attributeName].value
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return attributesWithoutBufferView;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Calculate transformation properties to transform vertex attributes (POSITION, NORMAL, etc.)
|
|
85
|
+
* from METER_OFFSET coorditantes to LNGLAT_OFFSET coordinates
|
|
86
|
+
* @param tileContent - 3DTiles tile content
|
|
87
|
+
* @param tileTransform - transformation matrix of the tile, calculated recursively multiplying
|
|
88
|
+
* transform of all parent tiles and transform of the current tile
|
|
89
|
+
* @param boundingVolume - initialized bounding volume of the source tile
|
|
90
|
+
* @returns modelMatrix - transformation matrix to transform coordinates to cartographic coordinates
|
|
91
|
+
* cartographicOrigin - tile origin coordinates to calculate offsets
|
|
92
|
+
*/
|
|
93
|
+
export function calculateTransformProps(
|
|
94
|
+
tileContent: Tiles3DTileContent,
|
|
95
|
+
tileTransform: Matrix4,
|
|
96
|
+
boundingVolume: OrientedBoundingBox | BoundingSphere
|
|
97
|
+
): {modelMatrix: Matrix4; cartographicOrigin: Vector3} {
|
|
98
|
+
const {rtcCenter, gltfUpAxis} = tileContent;
|
|
99
|
+
const {center} = boundingVolume;
|
|
100
|
+
|
|
101
|
+
let modelMatrix = new Matrix4(tileTransform);
|
|
102
|
+
|
|
103
|
+
// Translate if appropriate
|
|
104
|
+
if (rtcCenter) {
|
|
105
|
+
modelMatrix.translate(rtcCenter);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// glTF models need to be rotated from Y to Z up
|
|
109
|
+
// https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/specification#y-up-to-z-up
|
|
110
|
+
switch (gltfUpAxis) {
|
|
111
|
+
case 'Z':
|
|
112
|
+
break;
|
|
113
|
+
case 'Y':
|
|
114
|
+
const rotationY = new Matrix4().rotateX(Math.PI / 2);
|
|
115
|
+
modelMatrix = modelMatrix.multiplyRight(rotationY);
|
|
116
|
+
break;
|
|
117
|
+
case 'X':
|
|
118
|
+
const rotationX = new Matrix4().rotateY(-Math.PI / 2);
|
|
119
|
+
modelMatrix = modelMatrix.multiplyRight(rotationX);
|
|
120
|
+
break;
|
|
121
|
+
default:
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const cartesianOrigin = new Vector3(center);
|
|
126
|
+
const cartographicOrigin = Ellipsoid.WGS84.cartesianToCartographic(
|
|
127
|
+
cartesianOrigin,
|
|
128
|
+
new Vector3()
|
|
129
|
+
);
|
|
130
|
+
return {modelMatrix, cartographicOrigin};
|
|
131
|
+
}
|
|
132
|
+
|
|
73
133
|
/**
|
|
74
134
|
* Traverse all nodes to replace all sensible data with copy to avoid data corruption in worker.
|
|
75
135
|
* @param nodes
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Tiles3DLoaderOptions,
|
|
3
|
+
Tiles3DTileContent,
|
|
4
|
+
Tiles3DTileJSONPostprocessed,
|
|
5
|
+
Tiles3DTilesetJSONPostprocessed
|
|
6
|
+
} from '@loaders.gl/3d-tiles';
|
|
7
|
+
import {load} from '@loaders.gl/core';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Load nested 3DTiles tileset. If the sourceTile is not nested tileset - do nothing
|
|
11
|
+
* @param sourceTileset - source root tileset JSON
|
|
12
|
+
* @param sourceTile - source tile JSON that is supposed to has link to nested tileset
|
|
13
|
+
* @param tilesetLoadOptions - load options for Tiles3DLoader
|
|
14
|
+
* @returns nothing
|
|
15
|
+
*/
|
|
16
|
+
export const loadNestedTileset = async (
|
|
17
|
+
sourceTileset: Tiles3DTilesetJSONPostprocessed | null,
|
|
18
|
+
sourceTile: Tiles3DTileJSONPostprocessed,
|
|
19
|
+
tilesetLoadOptions: Tiles3DLoaderOptions
|
|
20
|
+
): Promise<void> => {
|
|
21
|
+
const isTileset = sourceTile.type === 'json';
|
|
22
|
+
if (!sourceTileset || !sourceTile.contentUrl || !isTileset) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const loadOptions = {
|
|
27
|
+
...tilesetLoadOptions,
|
|
28
|
+
[sourceTileset.loader.id]: {
|
|
29
|
+
isTileset,
|
|
30
|
+
assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const tileContent = await load(sourceTile.contentUrl, sourceTileset.loader, loadOptions);
|
|
34
|
+
|
|
35
|
+
if (tileContent.root) {
|
|
36
|
+
sourceTile.children = [tileContent.root];
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Load 3DTiles tile content, that includes glTF object
|
|
42
|
+
* @param sourceTileset - source root tileset JSON
|
|
43
|
+
* @param sourceTile - source tile JSON that has link to content data
|
|
44
|
+
* @param tilesetLoadOptions - load options for Tiles3DLoader
|
|
45
|
+
* @returns - 3DTiles tile content or null
|
|
46
|
+
*/
|
|
47
|
+
export const loadTile3DContent = async (
|
|
48
|
+
sourceTileset: Tiles3DTilesetJSONPostprocessed | null,
|
|
49
|
+
sourceTile: Tiles3DTileJSONPostprocessed,
|
|
50
|
+
tilesetLoadOptions: Tiles3DLoaderOptions
|
|
51
|
+
): Promise<Tiles3DTileContent | null> => {
|
|
52
|
+
const isTileset = sourceTile.type === 'json';
|
|
53
|
+
if (!sourceTileset || !sourceTile.contentUrl || isTileset) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const loadOptions = {
|
|
58
|
+
...tilesetLoadOptions,
|
|
59
|
+
[sourceTileset.loader.id]: {
|
|
60
|
+
...(tilesetLoadOptions[sourceTileset.loader.id] || {}),
|
|
61
|
+
isTileset,
|
|
62
|
+
assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const tileContent = await load(sourceTile.contentUrl, sourceTileset.loader, loadOptions);
|
|
66
|
+
|
|
67
|
+
return tileContent;
|
|
68
|
+
};
|
|
@@ -31,6 +31,15 @@ export class NodeIndexDocument {
|
|
|
31
31
|
/** converter instance */
|
|
32
32
|
private converter: I3SConverter;
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* Finalized property. It means that all child nodes are saved and their data
|
|
36
|
+
* is unloaded
|
|
37
|
+
*/
|
|
38
|
+
private _finalized: boolean = false;
|
|
39
|
+
get finalized(): boolean {
|
|
40
|
+
return this._finalized;
|
|
41
|
+
}
|
|
42
|
+
|
|
34
43
|
/**
|
|
35
44
|
* Constructor
|
|
36
45
|
* @param id - id of the node in node pages
|
|
@@ -90,6 +99,9 @@ export class NodeIndexDocument {
|
|
|
90
99
|
* Add neighbors to child nodes of this node
|
|
91
100
|
*/
|
|
92
101
|
public async addNeighbors(): Promise<void> {
|
|
102
|
+
if (this.finalized) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
93
105
|
const nodeData = await this.load();
|
|
94
106
|
for (const childNode of this.children) {
|
|
95
107
|
const childNodeData = await childNode.load();
|
|
@@ -116,9 +128,9 @@ export class NodeIndexDocument {
|
|
|
116
128
|
await childNode.write(childNodeData);
|
|
117
129
|
}
|
|
118
130
|
await childNode.save();
|
|
119
|
-
// The save after adding neighbors is the last one. Flush the the node
|
|
120
|
-
childNode.flush();
|
|
121
131
|
}
|
|
132
|
+
// The save after adding neighbors is the last one. Finalize the the node
|
|
133
|
+
this.finalize();
|
|
122
134
|
}
|
|
123
135
|
|
|
124
136
|
/** Save 3DNodeIndexDocument in file on disk */
|
|
@@ -128,6 +140,14 @@ export class NodeIndexDocument {
|
|
|
128
140
|
}
|
|
129
141
|
}
|
|
130
142
|
|
|
143
|
+
/** Finalize the node */
|
|
144
|
+
private finalize(): void {
|
|
145
|
+
this._finalized = true;
|
|
146
|
+
for (const child of this.children) {
|
|
147
|
+
child.flush();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
131
151
|
/**
|
|
132
152
|
* Write 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md
|
|
133
153
|
* @param node - Node3DIndexDocument object
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import {Tiles3DTileContent, Tiles3DTileJSONPostprocessed} from '@loaders.gl/3d-tiles';
|
|
2
|
+
import {GltfPrimitiveModeString, PreprocessData} from '../types';
|
|
3
|
+
import {GLTF, GLTFLoader} from '@loaders.gl/gltf';
|
|
4
|
+
import {parse} from '@loaders.gl/core';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* glTF primitive modes
|
|
8
|
+
* @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode
|
|
9
|
+
*/
|
|
10
|
+
export const GLTF_PRIMITIVE_MODES = [
|
|
11
|
+
GltfPrimitiveModeString.POINTS, // 0
|
|
12
|
+
GltfPrimitiveModeString.LINES, // 1
|
|
13
|
+
GltfPrimitiveModeString.LINE_LOOP, // 2
|
|
14
|
+
GltfPrimitiveModeString.LINE_STRIP, // 3
|
|
15
|
+
GltfPrimitiveModeString.TRIANGLES, // 4
|
|
16
|
+
GltfPrimitiveModeString.TRIANGLE_STRIP, // 5
|
|
17
|
+
GltfPrimitiveModeString.TRIANGLE_FAN // 6
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Analyze tile content. This function is used during preprocess stage of
|
|
22
|
+
* conversion
|
|
23
|
+
* @param tile - 3DTiles tile JSON metadata
|
|
24
|
+
* @param tileContent - 3DTiles tile content ArrayBuffer
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
export const analyzeTileContent = async (
|
|
28
|
+
tile: Tiles3DTileJSONPostprocessed,
|
|
29
|
+
tileContent: Tiles3DTileContent | null
|
|
30
|
+
): Promise<PreprocessData> => {
|
|
31
|
+
const result: PreprocessData = {
|
|
32
|
+
meshTopologyTypes: new Set()
|
|
33
|
+
};
|
|
34
|
+
if (!tileContent?.gltfArrayBuffer) {
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const gltfData = await parse(tileContent.gltfArrayBuffer, GLTFLoader, {
|
|
39
|
+
gltf: {normalize: false, loadBuffers: false, loadImages: false, decompressMeshes: false}
|
|
40
|
+
});
|
|
41
|
+
const gltf = gltfData.json;
|
|
42
|
+
|
|
43
|
+
if (!gltf) {
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
const meshTypes = getMeshTypesFromGltf(gltf);
|
|
47
|
+
result.meshTopologyTypes = meshTypes;
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get mesh topology types that the glb content has
|
|
53
|
+
* @param gltfJson - JSON part of GLB content
|
|
54
|
+
* @returns array of mesh types found
|
|
55
|
+
*/
|
|
56
|
+
const getMeshTypesFromGltf = (gltfJson: GLTF): Set<GltfPrimitiveModeString> => {
|
|
57
|
+
const result: Set<GltfPrimitiveModeString> = new Set();
|
|
58
|
+
for (const mesh of gltfJson.meshes || []) {
|
|
59
|
+
for (const primitive of mesh.primitives) {
|
|
60
|
+
let {mode} = primitive;
|
|
61
|
+
if (typeof mode !== 'number') {
|
|
62
|
+
mode = 4; // Default is 4 - TRIANGLES
|
|
63
|
+
}
|
|
64
|
+
result.add(GLTF_PRIMITIVE_MODES[mode]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Merge object2 into object1
|
|
72
|
+
* @param object1
|
|
73
|
+
* @param object2
|
|
74
|
+
* @returns nothing
|
|
75
|
+
*/
|
|
76
|
+
export const mergePreprocessData = (object1: PreprocessData, object2: PreprocessData): void => {
|
|
77
|
+
// Merge topology mesh types info
|
|
78
|
+
for (const type of object2.meshTopologyTypes) {
|
|
79
|
+
object1.meshTopologyTypes.add(type);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {Tiles3DTileJSONPostprocessed} from '@loaders.gl/3d-tiles';
|
|
2
|
+
import {NodeIndexDocument} from './node-index-document';
|
|
3
|
+
import {Matrix4} from '@math.gl/core';
|
|
4
|
+
|
|
5
|
+
/** Traversal props for the conversion stage */
|
|
6
|
+
export type TraversalConversionProps = {
|
|
7
|
+
/** Transformation matrix for the specific tile */
|
|
8
|
+
transform: Matrix4;
|
|
9
|
+
/** Parent nodes of the converted tile. Multiple nodes can be if one tile is converted to multiple nodes*/
|
|
10
|
+
parentNodes: NodeIndexDocument[];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Travesal of 3DTile tiles tree with making specific actions with each tile
|
|
15
|
+
* @param tile - 3DTiles tile JSON metadata
|
|
16
|
+
* @param traversalProps - traversal props used to pass data through recursive calls
|
|
17
|
+
* @param processTile - callback to make some actions with the current tile
|
|
18
|
+
* @param postprocessTile - callback to make some action after processing of the current tile and all the subtree
|
|
19
|
+
* @param maxDepth - max recursive calls number the travesal function will do. If not set, the traversal function will
|
|
20
|
+
* go through all the tree.
|
|
21
|
+
* This value is used to limit the convertion with only partial number of levels of the tileset
|
|
22
|
+
* @param level - counter to keep recursive calls number of the tiles tree. This value used to be able to break
|
|
23
|
+
* traversal at the some level of the tree
|
|
24
|
+
* @returns void
|
|
25
|
+
*/
|
|
26
|
+
export const traverseDatasetWith = async <TProps>(
|
|
27
|
+
tile: Tiles3DTileJSONPostprocessed,
|
|
28
|
+
traversalProps: TProps,
|
|
29
|
+
processTile: (tile: Tiles3DTileJSONPostprocessed, traversalProps: TProps) => Promise<TProps>,
|
|
30
|
+
postprocessTile?: (processResults: TProps[], currentTraversalProps: TProps) => Promise<void>,
|
|
31
|
+
maxDepth?: number,
|
|
32
|
+
level = 0
|
|
33
|
+
): Promise<void> => {
|
|
34
|
+
if (maxDepth && level > maxDepth) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const processResults: TProps[] = [];
|
|
38
|
+
const newTraversalProps: TProps = await processTile(tile, traversalProps);
|
|
39
|
+
processResults.push(newTraversalProps);
|
|
40
|
+
for (const childTile of tile.children) {
|
|
41
|
+
await traverseDatasetWith(
|
|
42
|
+
childTile,
|
|
43
|
+
newTraversalProps,
|
|
44
|
+
processTile,
|
|
45
|
+
postprocessTile,
|
|
46
|
+
maxDepth,
|
|
47
|
+
level + 1
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
postprocessTile && (await postprocessTile(processResults, traversalProps));
|
|
51
|
+
};
|