@loaders.gl/tile-converter 4.5.3 → 5.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/LICENSE +14 -3
- package/README.md +464 -0
- package/dist/converter.min.cjs +199 -260
- package/dist/i3s-server/bin/i3s-server.min.cjs +106 -341
- package/dist/index.cjs +38482 -0
- package/dist/index.js +38453 -0
- package/dist/v5/adapters.cjs +1992 -0
- package/dist/v5/adapters.d.ts +22 -0
- package/dist/v5/adapters.js +1972 -0
- package/dist/v5/browser-sink.d.ts +37 -0
- package/dist/v5/browser-source.d.ts +38 -0
- package/dist/v5/browser-tileset-source.d.ts +70 -0
- package/dist/v5/browser.cjs +64 -0
- package/dist/v5/browser.d.ts +34 -0
- package/dist/v5/browser.js +57 -0
- package/dist/v5/conversion-api.d.ts +122 -0
- package/dist/v5/conversion-archive.d.ts +32 -0
- package/dist/v5/core.cjs +863 -0
- package/dist/v5/core.d.ts +16 -0
- package/dist/v5/core.js +845 -0
- package/dist/v5/feature-arrow.d.ts +36 -0
- package/dist/v5/i3s-mesh-conversion.d.ts +26 -0
- package/dist/v5/index.cjs +63 -0
- package/dist/v5/index.d.ts +32 -0
- package/dist/v5/index.js +59 -0
- package/dist/v5/mesh-conversion.d.ts +62 -0
- package/dist/v5/mesh-draco.d.ts +8 -0
- package/dist/v5/mesh-source-features.d.ts +21 -0
- package/dist/v5/mesh-source-texture.d.ts +4 -0
- package/dist/v5/mesh-source.d.ts +34 -0
- package/dist/v5/mesh-tileset-archive.d.ts +18 -0
- package/dist/v5/mesh-tileset-sink.d.ts +51 -0
- package/dist/v5/mesh.d.ts +81 -0
- package/dist/v5/point-cloud-conversion.d.ts +31 -0
- package/dist/v5/point-cloud-source-encoder.d.ts +49 -0
- package/dist/v5/point-cloud-source.d.ts +25 -0
- package/dist/v5/point-cloud.d.ts +24 -0
- package/dist/v5/resource-manifest.d.ts +58 -0
- package/dist/v5/spatial-conversion.d.ts +59 -0
- package/dist/v5/tileset-source.d.ts +21 -0
- package/package.json +53 -27
- package/src/common/README.md +5 -0
- package/src/index.ts +1 -2
- package/src/{3d-tiles-converter → v4/3d-tiles-converter}/3d-tiles-converter.ts +14 -3
- package/src/{3d-tiles-converter → v4/3d-tiles-converter}/helpers/3d-tiles-content-converter.ts +2 -2
- package/src/v4/3d-tiles-converter/helpers/validate-i3s-spatial-reference.ts +124 -0
- package/src/{3d-tiles-converter → v4/3d-tiles-converter}/json-templates/tileset.ts +4 -4
- package/src/{converter-cli.ts → v4/converter-cli.ts} +4 -4
- package/src/{deps-installer → v4/deps-installer}/deps-installer.ts +10 -7
- package/src/{i3s-converter → v4/i3s-converter}/helpers/attribute-metadata-info.ts +1 -1
- package/src/{i3s-converter → v4/i3s-converter}/helpers/batch-ids-extensions.ts +1 -1
- package/src/v4/i3s-converter/helpers/encode-string-attribute.ts +23 -0
- package/src/{i3s-converter → v4/i3s-converter}/helpers/geometry-attributes.ts +1 -1
- package/src/{i3s-converter → v4/i3s-converter}/helpers/geometry-converter.ts +34 -59
- package/src/{i3s-converter → v4/i3s-converter}/helpers/gltf-attributes.ts +7 -6
- package/src/{i3s-converter → v4/i3s-converter}/helpers/load-3d-tiles.ts +5 -9
- package/src/{i3s-converter → v4/i3s-converter}/helpers/node-debug.ts +5 -6
- package/src/{i3s-converter → v4/i3s-converter}/i3s-converter.ts +16 -19
- package/src/{i3s-converter → v4/i3s-converter}/json-templates/geometry-definitions.ts +4 -4
- package/src/{i3s-converter → v4/i3s-converter}/json-templates/layers.ts +6 -6
- package/src/{i3s-converter → v4/i3s-converter}/json-templates/node.ts +1 -1
- package/src/{i3s-converter → v4/i3s-converter}/json-templates/scene-server.ts +1 -1
- package/src/{i3s-converter → v4/i3s-converter}/json-templates/shared-resources.ts +1 -1
- package/src/{i3s-converter → v4/i3s-converter}/json-templates/store.ts +1 -1
- package/src/{i3s-server → v4/i3s-server}/README.md +2 -2
- package/src/{i3s-server → v4/i3s-server}/controllers/slpk-controller.ts +1 -1
- package/src/{i3s-server → v4/i3s-server}/routes/slpk-router.ts +2 -1
- package/src/v4/index.ts +2 -0
- package/src/{lib → v4/lib}/utils/compress-util.ts +8 -7
- package/src/{lib → v4/lib}/utils/conversion-dump.ts +4 -4
- package/src/{lib → v4/lib}/utils/file-utils.ts +2 -2
- package/src/{lib → v4/lib}/utils/lod-conversion-utils.ts +2 -4
- package/src/v5/adapters.ts +56 -0
- package/src/v5/browser-sink.ts +130 -0
- package/src/v5/browser-source.ts +155 -0
- package/src/v5/browser-tileset-source.ts +328 -0
- package/src/v5/browser.ts +105 -0
- package/src/v5/conversion-api.ts +287 -0
- package/src/v5/conversion-archive.ts +85 -0
- package/src/v5/core.ts +61 -0
- package/src/v5/feature-arrow.ts +429 -0
- package/src/v5/i3s-mesh-conversion.ts +152 -0
- package/src/v5/index.ts +99 -0
- package/src/v5/mesh-conversion.ts +200 -0
- package/src/v5/mesh-draco.ts +138 -0
- package/src/v5/mesh-source-features.ts +232 -0
- package/src/v5/mesh-source-texture.ts +122 -0
- package/src/v5/mesh-source.ts +360 -0
- package/src/v5/mesh-tileset-archive.ts +50 -0
- package/src/v5/mesh-tileset-sink.ts +324 -0
- package/src/v5/mesh.ts +517 -0
- package/src/v5/point-cloud-conversion.ts +80 -0
- package/src/v5/point-cloud-source-encoder.ts +105 -0
- package/src/v5/point-cloud-source.ts +84 -0
- package/src/v5/point-cloud.ts +271 -0
- package/src/v5/resource-manifest.ts +213 -0
- package/src/v5/spatial-conversion.ts +305 -0
- package/src/v5/tileset-source.ts +54 -0
- /package/src/{3d-tiles-converter → v4/3d-tiles-converter}/helpers/i3s-obb-to-3d-tiles-obb.ts +0 -0
- /package/src/{3d-tiles-converter → v4/3d-tiles-converter}/helpers/load-i3s.ts +0 -0
- /package/src/{3d-tiles-converter → v4/3d-tiles-converter}/helpers/texture-atlas.ts +0 -0
- /package/src/{constants.ts → v4/constants.ts} +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/helpers/coordinate-converter.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/helpers/create-scene-server-path.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/helpers/feature-attributes.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/helpers/node-index-document.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/helpers/node-pages.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/helpers/preprocess-3d-tiles.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/helpers/progress.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/helpers/tileset-traversal.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/json-templates/metadata.ts +0 -0
- /package/src/{i3s-converter → v4/i3s-converter}/types.ts +0 -0
- /package/src/{i3s-server → v4/i3s-server}/app.ts +0 -0
- /package/src/{i3s-server → v4/i3s-server}/bin/www.ts +0 -0
- /package/src/{i3s-server → v4/i3s-server}/certs/cert.pem +0 -0
- /package/src/{i3s-server → v4/i3s-server}/certs/key.pem +0 -0
- /package/src/{i3s-server → v4/i3s-server}/utils/create-scene-server.ts +0 -0
- /package/src/{i3s-server → v4/i3s-server}/utils/server-utils.ts +0 -0
- /package/src/{lib → v4/lib}/json-schemas/conversion-dump-json-schema.ts +0 -0
- /package/src/{lib → v4/lib}/utils/cli-utils.ts +0 -0
- /package/src/{lib → v4/lib}/utils/geometry-utils.ts +0 -0
- /package/src/{lib → v4/lib}/utils/queue.ts +0 -0
- /package/src/{lib → v4/lib}/utils/statistic-utils.ts +0 -0
- /package/src/{lib → v4/lib}/utils/write-queue.ts +0 -0
- /package/src/{pgm-loader.ts → v4/pgm-loader.ts} +0 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
createTilesetSpatialReference,
|
|
7
|
+
I3SSpatialTransformer,
|
|
8
|
+
markTilesetSpatialReferenceTransformed,
|
|
9
|
+
Tiles3DSpatialTransformer
|
|
10
|
+
} from '@loaders.gl/tiles';
|
|
11
|
+
import {Matrix4} from '@math.gl/core';
|
|
12
|
+
import type {
|
|
13
|
+
CreateTilesetSpatialReferenceOptions,
|
|
14
|
+
I3SSpatialBounds,
|
|
15
|
+
I3STransformedPositions,
|
|
16
|
+
Tiles3DSpatialBoundingVolume,
|
|
17
|
+
TilesetSpatialOptions,
|
|
18
|
+
TilesetSpatialReference
|
|
19
|
+
} from '@loaders.gl/tiles';
|
|
20
|
+
import {TileConversionError} from './conversion-api.js';
|
|
21
|
+
import type {TileConversionDiagnostic} from './conversion-api.js';
|
|
22
|
+
|
|
23
|
+
/** Portable coordinate operations and output metadata for a 3D Tiles conversion. */
|
|
24
|
+
export interface Tiles3DConversionSpatialContext {
|
|
25
|
+
/** Source and selected target CRS, height reference, units, and transformation state. */
|
|
26
|
+
readonly spatialReference: TilesetSpatialReference;
|
|
27
|
+
/** Transform packed absolute xyz positions using double precision output. */
|
|
28
|
+
transformPositions(positions: ArrayLike<number>): Float64Array;
|
|
29
|
+
/** Transform packed normals using the corresponding source positions. */
|
|
30
|
+
transformNormals(normals: ArrayLike<number>, positions: ArrayLike<number>): Float32Array;
|
|
31
|
+
/** Rebuild a conservative bound in the selected target coordinate frame. */
|
|
32
|
+
transformBoundingVolume(
|
|
33
|
+
volume: Tiles3DSpatialBoundingVolume,
|
|
34
|
+
sourceTransform?: ArrayLike<number>
|
|
35
|
+
): Tiles3DSpatialBoundingVolume;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Portable coordinate operations and output metadata for an I3S conversion. */
|
|
39
|
+
export interface I3SConversionSpatialContext {
|
|
40
|
+
/** Source and selected target CRS, height reference, units, and transformation state. */
|
|
41
|
+
readonly spatialReference: TilesetSpatialReference;
|
|
42
|
+
/** Transform absolute I3S positions after applying declared height units and placement. */
|
|
43
|
+
transformPositions(
|
|
44
|
+
positions: ArrayLike<number>,
|
|
45
|
+
sourceOrigin: ArrayLike<number>
|
|
46
|
+
): I3STransformedPositions;
|
|
47
|
+
/** Transform absolute I3S positions when terrain or scene sampling is asynchronous. */
|
|
48
|
+
transformPositionsAsync(
|
|
49
|
+
positions: ArrayLike<number>,
|
|
50
|
+
sourceOrigin: ArrayLike<number>
|
|
51
|
+
): Promise<I3STransformedPositions>;
|
|
52
|
+
/** Transform packed normals using the corresponding source positions. */
|
|
53
|
+
transformNormals(
|
|
54
|
+
normals: ArrayLike<number>,
|
|
55
|
+
positions: ArrayLike<number>,
|
|
56
|
+
normalReferenceFrame?: string
|
|
57
|
+
): Float32Array;
|
|
58
|
+
/** Rebuild a conservative I3S bound in the selected target frame. */
|
|
59
|
+
transformBoundingVolume(
|
|
60
|
+
bounds: I3SSpatialBounds
|
|
61
|
+
): I3SSpatialBounds | {box?: number[]; region?: number[]};
|
|
62
|
+
/** Rebuild a bound when terrain or scene sampling is asynchronous. */
|
|
63
|
+
transformBoundingVolumeAsync(
|
|
64
|
+
bounds: I3SSpatialBounds
|
|
65
|
+
): Promise<I3SSpatialBounds | {box?: number[]; region?: number[]}>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Creates the shared spatial operations used to write 3D Tiles in a selected CRS and height frame.
|
|
70
|
+
*
|
|
71
|
+
* Source discovery remains format-specific and should use `get3DTilesSpatialReference` or the
|
|
72
|
+
* initialized source's spatial metadata. Target choices on a normalized, transformable reference
|
|
73
|
+
* are retained unless overridden in `options`. Do not reuse a reference already marked
|
|
74
|
+
* `transformed`; that would apply the operation twice. The returned reference is the metadata to
|
|
75
|
+
* publish with transformed output; unresolved requests fail instead of guessing a CRS or height datum.
|
|
76
|
+
*
|
|
77
|
+
* @param discovered - Source CRS, units, coordinate epoch, and height metadata.
|
|
78
|
+
* @param options - Target CRS, height reference, and explicitly supplied geoid resources.
|
|
79
|
+
* @returns Shared position, normal, and bound operations with matching output metadata.
|
|
80
|
+
*/
|
|
81
|
+
export function createTiles3DConversionSpatialContext(
|
|
82
|
+
discovered: CreateTilesetSpatialReferenceOptions | TilesetSpatialReference,
|
|
83
|
+
options: TilesetSpatialOptions = {}
|
|
84
|
+
): Tiles3DConversionSpatialContext {
|
|
85
|
+
const spatialReference = createConversionSpatialReference(discovered, options);
|
|
86
|
+
if (spatialReference.status === 'unresolved') {
|
|
87
|
+
throw createSpatialConversionError(spatialReference);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const transformer =
|
|
91
|
+
spatialReference.status === 'native'
|
|
92
|
+
? undefined
|
|
93
|
+
: createSpatialTransformer(
|
|
94
|
+
spatialReference,
|
|
95
|
+
() => new Tiles3DSpatialTransformer(spatialReference, options)
|
|
96
|
+
);
|
|
97
|
+
const outputSpatialReference = transformer
|
|
98
|
+
? markTilesetSpatialReferenceTransformed(spatialReference)
|
|
99
|
+
: spatialReference;
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
spatialReference: outputSpatialReference,
|
|
103
|
+
transformPositions: positions =>
|
|
104
|
+
transformer ? transformer.transformPositions(positions) : Float64Array.from(positions),
|
|
105
|
+
transformNormals: (normals, positions) =>
|
|
106
|
+
transformer ? transformer.transformNormals(normals, positions) : Float32Array.from(normals),
|
|
107
|
+
transformBoundingVolume: (volume, sourceTransform) =>
|
|
108
|
+
transformer
|
|
109
|
+
? transformer.transformBoundingVolume(volume, sourceTransform)
|
|
110
|
+
: cloneBoundingVolume(volume)
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Creates the shared spatial operations used to write I3S in a selected CRS and height frame.
|
|
116
|
+
*
|
|
117
|
+
* I3S height units, vertical datum, elevation placement, and bounds use the same transformer as
|
|
118
|
+
* the source-backed tile runtime. Terrain or scene elevation providers are explicit application
|
|
119
|
+
* inputs and may make position and bound operations asynchronous.
|
|
120
|
+
*
|
|
121
|
+
* @param discovered - Source CRS, vertical units, height reference, and elevation mode.
|
|
122
|
+
* @param options - Target CRS, height reference, geoid, or explicit elevation providers.
|
|
123
|
+
* @returns Shared position, normal, bound, and output-metadata operations.
|
|
124
|
+
*/
|
|
125
|
+
export function createI3SConversionSpatialContext(
|
|
126
|
+
discovered: CreateTilesetSpatialReferenceOptions | TilesetSpatialReference,
|
|
127
|
+
options: TilesetSpatialOptions = {}
|
|
128
|
+
): I3SConversionSpatialContext {
|
|
129
|
+
const spatialReference = createConversionSpatialReference(discovered, options);
|
|
130
|
+
if (spatialReference.status === 'unresolved') {
|
|
131
|
+
throw createSpatialConversionError(spatialReference);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const transformer =
|
|
135
|
+
spatialReference.status === 'native'
|
|
136
|
+
? undefined
|
|
137
|
+
: createSpatialTransformer(
|
|
138
|
+
spatialReference,
|
|
139
|
+
() => new I3SSpatialTransformer(spatialReference, options)
|
|
140
|
+
);
|
|
141
|
+
const outputSpatialReference = transformer ? transformer.spatialReference : spatialReference;
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
spatialReference: outputSpatialReference,
|
|
145
|
+
transformPositions: (positions, sourceOrigin) =>
|
|
146
|
+
transformer
|
|
147
|
+
? transformer.transformPositions(positions, sourceOrigin)
|
|
148
|
+
: createNativeI3SPositions(positions, sourceOrigin, spatialReference),
|
|
149
|
+
transformPositionsAsync: (positions, sourceOrigin) =>
|
|
150
|
+
transformer
|
|
151
|
+
? transformer.transformPositionsAsync(positions, sourceOrigin)
|
|
152
|
+
: Promise.resolve(createNativeI3SPositions(positions, sourceOrigin, spatialReference)),
|
|
153
|
+
transformNormals: (normals, positions, normalReferenceFrame) =>
|
|
154
|
+
transformer
|
|
155
|
+
? transformer.transformNormals(normals, positions, normalReferenceFrame)
|
|
156
|
+
: Float32Array.from(normals),
|
|
157
|
+
transformBoundingVolume: bounds =>
|
|
158
|
+
transformer ? transformer.transformBoundingVolume(bounds) : cloneI3SBounds(bounds),
|
|
159
|
+
transformBoundingVolumeAsync: bounds =>
|
|
160
|
+
transformer
|
|
161
|
+
? transformer.transformBoundingVolumeAsync(bounds)
|
|
162
|
+
: Promise.resolve(cloneI3SBounds(bounds))
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Raises a typed error and preserves discovery warnings for unresolved spatial operations. */
|
|
167
|
+
function createSpatialConversionError(
|
|
168
|
+
spatialReference: TilesetSpatialReference,
|
|
169
|
+
cause?: unknown
|
|
170
|
+
): TileConversionError {
|
|
171
|
+
const diagnostics: TileConversionDiagnostic[] = spatialReference.warnings.map(message => ({
|
|
172
|
+
code: 'SPATIAL_REFERENCE_WARNING',
|
|
173
|
+
message,
|
|
174
|
+
severity: 'warning' as const
|
|
175
|
+
}));
|
|
176
|
+
const causeMessage = cause instanceof Error ? `: ${cause.message}` : '';
|
|
177
|
+
const message = causeMessage
|
|
178
|
+
? `Spatial conversion could not be initialized${causeMessage}`
|
|
179
|
+
: 'The requested spatial conversion cannot be resolved from the available metadata';
|
|
180
|
+
diagnostics.push({
|
|
181
|
+
code: 'SPATIAL_REFERENCE_UNRESOLVED',
|
|
182
|
+
message,
|
|
183
|
+
severity: 'error'
|
|
184
|
+
});
|
|
185
|
+
return new TileConversionError('SPATIAL_REFERENCE_UNRESOLVED', message, diagnostics);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** Creates a conversion reference while retaining target choices from normalized source metadata. */
|
|
189
|
+
function createConversionSpatialReference(
|
|
190
|
+
discovered: CreateTilesetSpatialReferenceOptions | TilesetSpatialReference,
|
|
191
|
+
options: TilesetSpatialOptions
|
|
192
|
+
): TilesetSpatialReference {
|
|
193
|
+
if (!('status' in discovered)) {
|
|
194
|
+
return createTilesetSpatialReference(discovered, options);
|
|
195
|
+
}
|
|
196
|
+
if (discovered.status === 'transformed') {
|
|
197
|
+
throw createSpatialConversionError(
|
|
198
|
+
discovered,
|
|
199
|
+
new Error('coordinates are already transformed')
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const sourceMetadata: CreateTilesetSpatialReferenceOptions = {
|
|
204
|
+
sourceCrs: discovered.sourceCrs,
|
|
205
|
+
sourceCrsState: discovered.crs.state,
|
|
206
|
+
sourceCrsRepresentation:
|
|
207
|
+
discovered.crs.state === 'explicit' || discovered.crs.state === 'default'
|
|
208
|
+
? discovered.crs.representation
|
|
209
|
+
: undefined,
|
|
210
|
+
sourceCrsAlternatives:
|
|
211
|
+
discovered.crs.state === 'explicit' || discovered.crs.state === 'default'
|
|
212
|
+
? discovered.crs.alternatives
|
|
213
|
+
: undefined,
|
|
214
|
+
verticalCrs: discovered.verticalCrs,
|
|
215
|
+
units: discovered.units,
|
|
216
|
+
verticalUnitScale: discovered.verticalUnitScale,
|
|
217
|
+
coordinateEpoch: discovered.coordinateEpoch,
|
|
218
|
+
heightReference: discovered.heightReference,
|
|
219
|
+
elevationMode: discovered.elevationMode,
|
|
220
|
+
elevationOffset: discovered.elevationOffset,
|
|
221
|
+
elevationUnit: discovered.elevationUnit,
|
|
222
|
+
elevationUnitScale: discovered.elevationUnitScale,
|
|
223
|
+
coordinateFrame: discovered.coordinateFrame,
|
|
224
|
+
axisOrder: discovered.axisOrder,
|
|
225
|
+
provenance: discovered.provenance,
|
|
226
|
+
warnings: discovered.warnings
|
|
227
|
+
};
|
|
228
|
+
const retainedOptions: TilesetSpatialOptions = {
|
|
229
|
+
...options,
|
|
230
|
+
targetCrs: options.targetCrs ?? discovered.targetCrs,
|
|
231
|
+
targetHeightReference: options.targetHeightReference ?? discovered.targetHeightReference,
|
|
232
|
+
outputCoordinates: options.outputCoordinates ?? discovered.outputCoordinates
|
|
233
|
+
};
|
|
234
|
+
return createTilesetSpatialReference(sourceMetadata, retainedOptions);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Converts transformer initialization failures into the public typed diagnostic contract. */
|
|
238
|
+
function createSpatialTransformer<T>(
|
|
239
|
+
spatialReference: TilesetSpatialReference,
|
|
240
|
+
createTransformer: () => T
|
|
241
|
+
): T {
|
|
242
|
+
try {
|
|
243
|
+
return createTransformer();
|
|
244
|
+
} catch (error) {
|
|
245
|
+
throw createSpatialConversionError(spatialReference, error);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** Clones bounds for native-coordinate output without changing caller-owned arrays. */
|
|
250
|
+
function cloneBoundingVolume(volume: Tiles3DSpatialBoundingVolume): Tiles3DSpatialBoundingVolume {
|
|
251
|
+
return {
|
|
252
|
+
...volume,
|
|
253
|
+
box: volume.box ? [...volume.box] : undefined,
|
|
254
|
+
sphere: volume.sphere ? [...volume.sphere] : undefined,
|
|
255
|
+
region: volume.region ? [...volume.region] : undefined
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Clones I3S bounds for native-coordinate output without changing caller-owned arrays. */
|
|
260
|
+
function cloneI3SBounds(bounds: I3SSpatialBounds): I3SSpatialBounds {
|
|
261
|
+
return {
|
|
262
|
+
...bounds,
|
|
263
|
+
mbs: bounds.mbs ? Array.from(bounds.mbs) : undefined,
|
|
264
|
+
obb: bounds.obb
|
|
265
|
+
? {
|
|
266
|
+
center: Array.from(bounds.obb.center),
|
|
267
|
+
halfSize: Array.from(bounds.obb.halfSize),
|
|
268
|
+
quaternion: Array.from(bounds.obb.quaternion)
|
|
269
|
+
}
|
|
270
|
+
: undefined
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/** Build stable local offsets for native I3S coordinates without changing their frame. */
|
|
275
|
+
function createNativeI3SPositions(
|
|
276
|
+
sourcePositions: ArrayLike<number>,
|
|
277
|
+
sourceOrigin: ArrayLike<number>,
|
|
278
|
+
spatialReference: TilesetSpatialReference
|
|
279
|
+
): I3STransformedPositions {
|
|
280
|
+
if (sourcePositions.length % 3 !== 0 || sourceOrigin.length < 3) {
|
|
281
|
+
throw new Error('I3S positions and origin must contain complete xyz coordinates');
|
|
282
|
+
}
|
|
283
|
+
const origin: [number, number, number] = [
|
|
284
|
+
Number(sourceOrigin[0]),
|
|
285
|
+
Number(sourceOrigin[1]),
|
|
286
|
+
Number(sourceOrigin[2])
|
|
287
|
+
];
|
|
288
|
+
const sourcePositions64 = Float64Array.from(sourcePositions);
|
|
289
|
+
const positions = new Float32Array(sourcePositions.length);
|
|
290
|
+
for (let index = 0; index < sourcePositions.length; index += 3) {
|
|
291
|
+
positions[index] = Number(sourcePositions[index]) - origin[0];
|
|
292
|
+
positions[index + 1] = Number(sourcePositions[index + 1]) - origin[1];
|
|
293
|
+
positions[index + 2] = Number(sourcePositions[index + 2]) - origin[2];
|
|
294
|
+
}
|
|
295
|
+
const isGeographic = spatialReference.coordinateFrame === 'geographic';
|
|
296
|
+
const modelMatrix = isGeographic ? new Matrix4() : new Matrix4().translate(origin);
|
|
297
|
+
return {
|
|
298
|
+
positions,
|
|
299
|
+
sourcePositions: sourcePositions64,
|
|
300
|
+
origin,
|
|
301
|
+
cartographicOrigin: isGeographic ? origin : [0, 0, 0],
|
|
302
|
+
coordinateSystem: isGeographic ? 'lnglat-offsets' : 'cartesian',
|
|
303
|
+
modelMatrix
|
|
304
|
+
};
|
|
305
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import {traverseTilesetContents} from '@loaders.gl/tiles';
|
|
6
|
+
import type {
|
|
7
|
+
Tileset3D,
|
|
8
|
+
TilesetContentTraversalItem,
|
|
9
|
+
TilesetSourceMetadata,
|
|
10
|
+
TraverseTilesetContentsOptions
|
|
11
|
+
} from '@loaders.gl/tiles';
|
|
12
|
+
import {TileConversionError} from './conversion-api.js';
|
|
13
|
+
import type {TileConversionSource} from './conversion-api.js';
|
|
14
|
+
|
|
15
|
+
/** Decoded-content lifetime options for source-backed conversion. */
|
|
16
|
+
export type TilesetConversionSourceOptions = Pick<TraverseTilesetContentsOptions, 'unloadContent'>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Adapts a source-backed tileset to the portable v5 conversion source contract.
|
|
20
|
+
*
|
|
21
|
+
* Inspection waits for initialization and returns the source's normalized metadata. Reading uses
|
|
22
|
+
* camera-independent shared traversal, retaining each placement and its ordered decoded contents.
|
|
23
|
+
* Source adapters own content, subtree, node-page, nested tileset, and archive resolution.
|
|
24
|
+
*
|
|
25
|
+
* Enable `unloadContent` on a dedicated runtime to release newly loaded payloads after the codec
|
|
26
|
+
* and awaited writes finish, or iteration closes on failure. Preloaded payloads remain attached.
|
|
27
|
+
* Applications own tileset destruction, format codecs, byte accounting, and output packaging.
|
|
28
|
+
* This adapter does not impose an aggregate input memory limit or transform coordinates.
|
|
29
|
+
*
|
|
30
|
+
* @param tileset - An initializing or initialized runtime backed by a 3D Tiles or I3S source.
|
|
31
|
+
* @param options - Optional cleanup of content loaded during conversion.
|
|
32
|
+
* @returns A source accepted by `inspectTileset` and `convertTileset`.
|
|
33
|
+
*/
|
|
34
|
+
export function createTilesetConversionSource(
|
|
35
|
+
tileset: Tileset3D,
|
|
36
|
+
options: TilesetConversionSourceOptions = {}
|
|
37
|
+
): TileConversionSource<TilesetSourceMetadata, TilesetContentTraversalItem> {
|
|
38
|
+
return {
|
|
39
|
+
async inspect(signal) {
|
|
40
|
+
signal?.throwIfAborted();
|
|
41
|
+
await tileset.tilesetInitializationPromise;
|
|
42
|
+
signal?.throwIfAborted();
|
|
43
|
+
if (!tileset.root) {
|
|
44
|
+
throw new TileConversionError(
|
|
45
|
+
'TILESET_ROOT_REQUIRED',
|
|
46
|
+
'Tileset initialization completed without a root tile'
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
return tileset.source.getMetadata();
|
|
50
|
+
},
|
|
51
|
+
read: (_inspection, signal) =>
|
|
52
|
+
traverseTilesetContents(tileset, {unloadContent: options.unloadContent, signal})
|
|
53
|
+
};
|
|
54
|
+
}
|
/package/src/{3d-tiles-converter → v4/3d-tiles-converter}/helpers/i3s-obb-to-3d-tiles-obb.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|