@cesium/engine 25.0.0 → 26.0.0
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/Build/Workers/{chunk-GPIGURCG.js → chunk-3VFEWOBI.js} +7 -7
- package/Build/Workers/{chunk-BTX2NL3P.js → chunk-424RNO3D.js} +18 -18
- package/Build/Workers/{chunk-HSVQATK2.js → chunk-4MGMYHOO.js} +6 -6
- package/Build/Workers/{chunk-FIBS5S7R.js → chunk-4S7IE3LB.js} +2 -2
- package/Build/Workers/{chunk-A7ZBMVFS.js → chunk-52JDLOEM.js} +14 -14
- package/Build/Workers/{chunk-ZCCIIBZT.js → chunk-54I6Y66F.js} +6 -6
- package/Build/Workers/{chunk-J647NNZW.js → chunk-6YEE6JDR.js} +6 -6
- package/Build/Workers/{chunk-HVMG6AG4.js → chunk-7J2HKPRH.js} +9 -9
- package/Build/Workers/{chunk-K6NFIRFB.js → chunk-7WM2PX4V.js} +5 -5
- package/Build/Workers/{chunk-3LSD7OOA.js → chunk-ACXQXN46.js} +16 -16
- package/Build/Workers/{chunk-CZ23Y3RM.js → chunk-AYKR4VBR.js} +2 -2
- package/Build/Workers/{chunk-4MTRQFJP.js → chunk-C6J67V5A.js} +1 -1
- package/Build/Workers/{chunk-WTQGE7Q6.js → chunk-C6KNZ7T4.js} +17 -17
- package/Build/Workers/{chunk-AWFZHD2B.js → chunk-CFQP6LYM.js} +4 -4
- package/Build/Workers/{chunk-ST2UWDUU.js → chunk-CXOYE2WM.js} +5 -5
- package/Build/Workers/{chunk-H2A4USJR.js → chunk-CZEYZU4N.js} +10 -10
- package/Build/Workers/{chunk-DFEI5MAV.js → chunk-DBOEKL43.js} +7 -7
- package/Build/Workers/{chunk-A7A433MD.js → chunk-DDWSZVMY.js} +5 -5
- package/Build/Workers/{chunk-J7KQEKPK.js → chunk-DOBXCNC3.js} +13 -13
- package/Build/Workers/{chunk-URUCCIPS.js → chunk-E7VQ76KE.js} +6 -6
- package/Build/Workers/{chunk-ZAPOS52G.js → chunk-EBSIOBXY.js} +8 -8
- package/Build/Workers/{chunk-3VDDRF2E.js → chunk-EF2QYXGA.js} +14 -14
- package/Build/Workers/{chunk-WN6P5UDH.js → chunk-EPYXRCDB.js} +12 -12
- package/Build/Workers/{chunk-EZARA5FJ.js → chunk-F6QDY6HU.js} +13 -13
- package/Build/Workers/{chunk-GL7DNVUS.js → chunk-FRQZECAO.js} +5 -5
- package/Build/Workers/{chunk-VQKLRBIK.js → chunk-G7PXZRVF.js} +7 -7
- package/Build/Workers/{chunk-4QQXGTCE.js → chunk-INUEEEQA.js} +8 -8
- package/Build/Workers/{chunk-ITD2IN7N.js → chunk-IRBKFCEJ.js} +2 -2
- package/Build/Workers/{chunk-6SDGQI27.js → chunk-IYOUHCZB.js} +1 -1
- package/Build/Workers/{chunk-DYT5NR6P.js → chunk-J6BWOHUF.js} +3 -3
- package/Build/Workers/{chunk-4GF4MVPY.js → chunk-KFSTQKNM.js} +7 -7
- package/Build/Workers/{chunk-4XXHJI6Y.js → chunk-KKOSKAZB.js} +17 -17
- package/Build/Workers/{chunk-WC57YYBN.js → chunk-KSSWJIZW.js} +2 -2
- package/Build/Workers/{chunk-5T6QQAJW.js → chunk-M3B5JKSM.js} +1 -1
- package/Build/Workers/{chunk-QO2CGXMP.js → chunk-MPZHGZU6.js} +6 -6
- package/Build/Workers/{chunk-WUBKZFF6.js → chunk-MYP774IS.js} +9 -9
- package/Build/Workers/{chunk-WNN5D4W3.js → chunk-O3EA5HS7.js} +10 -10
- package/Build/Workers/{chunk-77RL3MBD.js → chunk-P3CK7MCY.js} +25 -4
- package/Build/Workers/{chunk-QXNQQYPV.js → chunk-Q3PY526V.js} +8 -8
- package/Build/Workers/{chunk-CKQP3DSS.js → chunk-QN67VG36.js} +6 -6
- package/Build/Workers/{chunk-ACFFCHHZ.js → chunk-QRWGUWI6.js} +11 -11
- package/Build/Workers/{chunk-LH5SF3XV.js → chunk-S4MCOY6I.js} +5 -5
- package/Build/Workers/{chunk-FVLVVOBQ.js → chunk-SMQZZOW6.js} +10 -10
- package/Build/Workers/{chunk-TA777BGS.js → chunk-TKKIREQ6.js} +1 -1
- package/Build/Workers/{chunk-AEAVLYPS.js → chunk-U3ZA64U7.js} +2 -2
- package/Build/Workers/{chunk-7LSFAEWF.js → chunk-UA25D5MX.js} +10 -10
- package/Build/Workers/{chunk-J3OFS2RD.js → chunk-UOOIQ3KX.js} +12 -12
- package/Build/Workers/{chunk-ND3NTTOF.js → chunk-V7VQKN6N.js} +6 -6
- package/Build/Workers/{chunk-I3A6DXYZ.js → chunk-VQYETPWC.js} +4 -4
- package/Build/Workers/{chunk-35H3UBIO.js → chunk-VWV2IJRB.js} +11 -11
- package/Build/Workers/{chunk-QSDY4NS7.js → chunk-XZMBNNDX.js} +9 -9
- package/Build/Workers/{chunk-TAI4HLII.js → chunk-Y57HREW5.js} +4 -4
- package/Build/Workers/{chunk-3TKLDHV3.js → chunk-Y5BF6AFU.js} +2 -2
- package/Build/Workers/{chunk-3XY3MVPG.js → chunk-YLY7NKAB.js} +4 -4
- package/Build/Workers/{chunk-BVAIWR7O.js → chunk-ZK3CF7ZD.js} +12 -12
- package/Build/Workers/{chunk-DH26SNAB.js → chunk-ZP7JMQV4.js} +1 -1
- package/Build/Workers/{chunk-3RFFPH4M.js → chunk-ZZ46LWL6.js} +1 -1
- package/Build/Workers/combineGeometry.js +24 -24
- package/Build/Workers/createBoxGeometry.js +18 -18
- package/Build/Workers/createBoxOutlineGeometry.js +16 -16
- package/Build/Workers/createCircleGeometry.js +26 -26
- package/Build/Workers/createCircleOutlineGeometry.js +19 -19
- package/Build/Workers/createCoplanarPolygonGeometry.js +33 -33
- package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -31
- package/Build/Workers/createCorridorGeometry.js +29 -29
- package/Build/Workers/createCorridorOutlineGeometry.js +28 -28
- package/Build/Workers/createCylinderGeometry.js +20 -20
- package/Build/Workers/createCylinderOutlineGeometry.js +18 -18
- package/Build/Workers/createEllipseGeometry.js +26 -26
- package/Build/Workers/createEllipseOutlineGeometry.js +19 -19
- package/Build/Workers/createEllipsoidGeometry.js +19 -19
- package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -18
- package/Build/Workers/createFrustumGeometry.js +18 -18
- package/Build/Workers/createFrustumOutlineGeometry.js +18 -18
- package/Build/Workers/createGeometry.js +24 -24
- package/Build/Workers/createGroundPolylineGeometry.js +22 -22
- package/Build/Workers/createPlaneGeometry.js +16 -16
- package/Build/Workers/createPlaneOutlineGeometry.js +15 -15
- package/Build/Workers/createPolygonGeometry.js +32 -32
- package/Build/Workers/createPolygonOutlineGeometry.js +30 -30
- package/Build/Workers/createPolylineGeometry.js +25 -25
- package/Build/Workers/createPolylineVolumeGeometry.js +31 -31
- package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -27
- package/Build/Workers/createRectangleGeometry.js +27 -27
- package/Build/Workers/createRectangleOutlineGeometry.js +20 -20
- package/Build/Workers/createSimplePolylineGeometry.js +23 -23
- package/Build/Workers/createSphereGeometry.js +19 -19
- package/Build/Workers/createSphereOutlineGeometry.js +18 -18
- package/Build/Workers/createTaskProcessorWorker.js +3 -3
- package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
- package/Build/Workers/createVectorTileGeometries.js +24 -24
- package/Build/Workers/createVectorTilePoints.js +13 -13
- package/Build/Workers/createVectorTilePolygons.js +22 -22
- package/Build/Workers/createVectorTilePolylines.js +14 -14
- package/Build/Workers/createVerticesFromCesium3DTilesTerrain.js +25 -25
- package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -22
- package/Build/Workers/createVerticesFromHeightmap.js +22 -22
- package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +20 -20
- package/Build/Workers/createWallGeometry.js +24 -24
- package/Build/Workers/createWallOutlineGeometry.js +23 -23
- package/Build/Workers/decodeDraco.js +10 -10
- package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
- package/Build/Workers/decodeI3S.js +10 -10
- package/Build/Workers/gaussianSplatSorter.js +4 -4
- package/Build/Workers/gaussianSplatTextureGenerator.js +4 -4
- package/Build/Workers/incrementallyBuildTerrainPicker.js +10 -10
- package/Build/Workers/transcodeKTX2.js +6 -6
- package/Build/Workers/transferTypedArrayTest.js +1 -1
- package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -22
- package/Build/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +25 -25
- package/Source/Core/Cartesian2.js +1 -1
- package/Source/Core/Cartesian3.js +1 -1
- package/Source/Core/Cartesian4.js +1 -1
- package/Source/Core/ComponentDatatype.js +35 -0
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/MapProjection.js +1 -0
- package/Source/Core/Matrix2.js +1 -1
- package/Source/Core/Matrix3.js +1 -1
- package/Source/Core/Matrix4.js +1 -1
- package/Source/Core/Resource.js +1 -1
- package/Source/Core/ScreenSpaceEventHandler.js +51 -41
- package/Source/Core/createColorRamp.js +37 -0
- package/Source/Core/globalTypes.js +25 -0
- package/Source/Renderer/Pass.js +3 -2
- package/Source/Renderer/createUniform.js +346 -239
- package/Source/Renderer/createUniformArray.js +494 -381
- package/Source/Scene/ArcGisMapService.js +1 -1
- package/Source/Scene/BufferPoint.js +1 -0
- package/Source/Scene/BufferPointCollection.js +14 -1
- package/Source/Scene/BufferPolygon.js +3 -2
- package/Source/Scene/BufferPolygonCollection.js +10 -0
- package/Source/Scene/BufferPolyline.js +1 -0
- package/Source/Scene/BufferPolylineCollection.js +2 -0
- package/Source/Scene/BufferPrimitiveCollection.js +79 -28
- package/Source/Scene/CameraEventAggregator.js +30 -18
- package/Source/Scene/Cesium3DTile.js +54 -1
- package/Source/Scene/Cesium3DTileContent.js +195 -254
- package/Source/Scene/Cesium3DTileContentFactory.js +10 -2
- package/Source/Scene/Cesium3DTileset.js +45 -5
- package/Source/Scene/Composite3DTileContent.js +254 -292
- package/Source/Scene/EdgeDisplayMode.js +50 -0
- package/Source/Scene/Empty3DTileContent.js +100 -132
- package/Source/Scene/GaussianSplat3DTileContent.js +436 -478
- package/Source/Scene/GeoJsonPrimitive.js +874 -0
- package/Source/Scene/Geometry3DTileContent.js +151 -185
- package/Source/Scene/GltfLoader.js +109 -0
- package/Source/Scene/Implicit3DTileContent.js +179 -214
- package/Source/Scene/MVTDataProvider.js +147 -0
- package/Source/Scene/Model/EdgeVisibilityPipelineStage.js +79 -311
- package/Source/Scene/Model/Model.js +34 -0
- package/Source/Scene/Model/Model3DTileContent.js +424 -458
- package/Source/Scene/Model/ModelDrawCommand.js +31 -3
- package/Source/Scene/Model/ModelUtility.js +4 -0
- package/Source/Scene/Model/createVectorTileBuffersFromModelComponents.js +466 -150
- package/Source/Scene/ModelComponents.js +39 -1
- package/Source/Scene/Multiple3DTileContent.js +291 -334
- package/Source/Scene/Scene.js +26 -0
- package/Source/Scene/Tileset3DTileContent.js +113 -146
- package/Source/Scene/UrlTemplate3DTilesDataProvider.js +499 -0
- package/Source/Scene/Vector3DTileContent.js +205 -234
- package/Source/Scene/VectorGltf3DTileContent.js +85 -36
- package/Source/Scene/VoxelPrimitive.js +159 -175
- package/Source/Scene/VoxelProvider.js +64 -91
- package/Source/Scene/buildVectorGltfFromMVT.js +1059 -0
- package/Source/Scene/buildVoxelCustomShader.js +199 -0
- package/Source/Scene/decodeMVT.js +634 -0
- package/Source/Scene/renderBufferPointCollection.js +110 -64
- package/Source/Scene/renderBufferPolygonCollection.js +102 -55
- package/Source/Scene/renderBufferPolylineCollection.js +365 -166
- package/Source/Shaders/BufferPointMaterialFS.glsl +1 -0
- package/Source/Shaders/BufferPointMaterialFS.js +1 -0
- package/Source/Shaders/BufferPointMaterialVS.glsl +19 -9
- package/Source/Shaders/BufferPointMaterialVS.js +20 -10
- package/Source/Shaders/BufferPolygonMaterialVS.glsl +13 -4
- package/Source/Shaders/BufferPolygonMaterialVS.js +14 -5
- package/Source/Shaders/BufferPolylineMaterialVS.glsl +16 -2
- package/Source/Shaders/BufferPolylineMaterialVS.js +17 -3
- package/Source/Shaders/Builtin/Constants/passCesium3DTileEdgesDirect.glsl +9 -0
- package/Source/Shaders/Builtin/Constants/passCesium3DTileEdgesDirect.js +11 -0
- package/Source/Shaders/Builtin/Constants/passOverlay.glsl +1 -1
- package/Source/Shaders/Builtin/Constants/passOverlay.js +1 -1
- package/Source/Shaders/Builtin/CzmBuiltins.js +2 -0
- package/Source/Shaders/Model/EdgeVisibilityStageVS.glsl +0 -1
- package/Source/Shaders/Model/EdgeVisibilityStageVS.js +0 -1
- package/index.d.ts +253 -35
- package/index.js +71 -62
- package/package.json +2 -2
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import Cartographic from "../Core/Cartographic.js";
|
|
4
|
+
import Cesium3DTileset from "./Cesium3DTileset.js";
|
|
5
|
+
import DeveloperError from "../Core/DeveloperError.js";
|
|
6
|
+
import Ellipsoid from "../Core/Ellipsoid.js";
|
|
7
|
+
import Rectangle from "../Core/Rectangle.js";
|
|
8
|
+
import Resource from "../Core/Resource.js";
|
|
9
|
+
import getAbsoluteUri from "../Core/getAbsoluteUri.js";
|
|
10
|
+
import WebMercatorTilingScheme from "../Core/WebMercatorTilingScheme.js";
|
|
11
|
+
import defined from "../Core/defined.js";
|
|
12
|
+
import destroyObject from "../Core/destroyObject.js";
|
|
13
|
+
import CesiumMath from "../Core/Math.js";
|
|
14
|
+
|
|
15
|
+
/** @import FrameState from "./FrameState.js"; */
|
|
16
|
+
/** @import PassState from "../Renderer/PassState.js"; */
|
|
17
|
+
/** @import TilingScheme from "../Core/TilingScheme.js"; */
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {object} TilesetJsonRoot
|
|
21
|
+
* @property {object} [boundingVolume]
|
|
22
|
+
* @property {number} [geometricError]
|
|
23
|
+
* @property {"REPLACE"|"ADD"} [refine]
|
|
24
|
+
* @property {unknown} [content]
|
|
25
|
+
* @property {unknown[]} [children]
|
|
26
|
+
* @ignore
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const DEFAULT_MIN_ZOOM = 0;
|
|
30
|
+
const DEFAULT_MAX_ZOOM = 14;
|
|
31
|
+
const DEFAULT_REGION_MINIMUM_HEIGHT = -1000.0;
|
|
32
|
+
const DEFAULT_REGION_MAXIMUM_HEIGHT = 10000.0;
|
|
33
|
+
const EARTH_CIRCUMFERENCE_METERS =
|
|
34
|
+
2.0 * Math.PI * Ellipsoid.WGS84.maximumRadius;
|
|
35
|
+
const WEB_MERCATOR_TILE_SIZE = 256.0;
|
|
36
|
+
|
|
37
|
+
const scratchTileRectangle = new Rectangle();
|
|
38
|
+
const scratchIntersectionRectangle = new Rectangle();
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Base provider for URL-template vector sources that are rendered through a
|
|
42
|
+
* runtime-generated 3D Tiles tileset.
|
|
43
|
+
*
|
|
44
|
+
* @private
|
|
45
|
+
*/
|
|
46
|
+
class UrlTemplate3DTilesDataProvider {
|
|
47
|
+
/**
|
|
48
|
+
* @param {Resource|string} urlTemplate URL template containing {z}, {x}, and {y} placeholders.
|
|
49
|
+
* @param {object} [options] Provider options.
|
|
50
|
+
* @param {number} [options.minZoom=0] Minimum zoom level represented in the generated tileset.
|
|
51
|
+
* @param {number} [options.maxZoom=14] Maximum zoom level represented in the generated tileset.
|
|
52
|
+
* @param {Rectangle} [options.extent] Optional geographic extent in radians to constrain the generated tile tree.
|
|
53
|
+
* @param {string} [options.featureIdProperty] Feature property name to use as feature ID when supported by content decoding.
|
|
54
|
+
*/
|
|
55
|
+
constructor(urlTemplate, options) {
|
|
56
|
+
options = options ?? {};
|
|
57
|
+
this._resource = Resource.createIfNeeded(urlTemplate);
|
|
58
|
+
// @ts-expect-error Missing types.
|
|
59
|
+
this._urlTemplate = this._resource.url;
|
|
60
|
+
this._extent = Rectangle.clone(options.extent);
|
|
61
|
+
this._minZoom = options.minZoom ?? DEFAULT_MIN_ZOOM;
|
|
62
|
+
this._maxZoom = options.maxZoom ?? DEFAULT_MAX_ZOOM;
|
|
63
|
+
this._featureIdProperty = options.featureIdProperty;
|
|
64
|
+
this._show = true;
|
|
65
|
+
this._tileset = undefined;
|
|
66
|
+
this._tilesetJsonUrl = undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Creates a provider from a URL template.
|
|
71
|
+
*
|
|
72
|
+
* @param {Resource|string} url URL template containing {z}, {x}, and {y} placeholders.
|
|
73
|
+
* @param {object} [options] Provider options.
|
|
74
|
+
* @returns {Promise<UrlTemplate3DTilesDataProvider>}
|
|
75
|
+
*/
|
|
76
|
+
static async fromUrl(url, options) {
|
|
77
|
+
const provider = new this(url, options);
|
|
78
|
+
await provider._initializeTileset();
|
|
79
|
+
return provider;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* URL template containing {z}/{x}/{y}.
|
|
84
|
+
*
|
|
85
|
+
* @type {string}
|
|
86
|
+
* @readonly
|
|
87
|
+
*/
|
|
88
|
+
get urlTemplate() {
|
|
89
|
+
return this._urlTemplate;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Resource derived from the URL template.
|
|
94
|
+
*
|
|
95
|
+
* @type {Resource}
|
|
96
|
+
* @readonly
|
|
97
|
+
*/
|
|
98
|
+
get resource() {
|
|
99
|
+
return this._resource;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Optional geographic extent in radians used to generate tile headers.
|
|
104
|
+
*
|
|
105
|
+
* @type {Rectangle|undefined}
|
|
106
|
+
* @readonly
|
|
107
|
+
*/
|
|
108
|
+
get extent() {
|
|
109
|
+
return this._extent;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Backing 3D Tileset.
|
|
114
|
+
*
|
|
115
|
+
* @type {Cesium3DTileset|undefined}
|
|
116
|
+
* @readonly
|
|
117
|
+
*/
|
|
118
|
+
get tileset() {
|
|
119
|
+
return this._tileset;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Determines if the generated tileset is shown.
|
|
124
|
+
*
|
|
125
|
+
* @type {boolean}
|
|
126
|
+
*/
|
|
127
|
+
get show() {
|
|
128
|
+
return this._show;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
set show(value) {
|
|
132
|
+
this._show = value;
|
|
133
|
+
if (defined(this._tileset)) {
|
|
134
|
+
this._tileset.show = value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** @protected */
|
|
139
|
+
_createRuntimeTilesetOptions() {
|
|
140
|
+
return {
|
|
141
|
+
minZoom: this._minZoom,
|
|
142
|
+
maxZoom: this._maxZoom,
|
|
143
|
+
extent: this._extent,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @protected
|
|
149
|
+
* @returns {object}
|
|
150
|
+
*/
|
|
151
|
+
_createTilesetLoadOptions() {
|
|
152
|
+
return {};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @protected
|
|
157
|
+
* @param {Cesium3DTileset} _tileset
|
|
158
|
+
*/
|
|
159
|
+
_configureTileset(_tileset) {}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Subclasses must return a runtime content codec describing how to turn
|
|
163
|
+
* a downloaded tile payload into a {@link Cesium3DTileContent}. See
|
|
164
|
+
* {@link Cesium3DTileset#_runtimeContentCodec} for the expected shape.
|
|
165
|
+
*
|
|
166
|
+
* @protected
|
|
167
|
+
* @returns {object}
|
|
168
|
+
*/
|
|
169
|
+
_createCodec() {
|
|
170
|
+
//>>includeStart('debug', pragmas.debug);
|
|
171
|
+
throw new DeveloperError(
|
|
172
|
+
"UrlTemplate3DTilesDataProvider subclasses must implement _createCodec().",
|
|
173
|
+
);
|
|
174
|
+
//>>includeEnd('debug');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @private
|
|
179
|
+
*/
|
|
180
|
+
async _initializeTileset() {
|
|
181
|
+
const tilesetJson = buildRuntimeTilesetJson(
|
|
182
|
+
this._resource,
|
|
183
|
+
this._createRuntimeTilesetOptions(),
|
|
184
|
+
);
|
|
185
|
+
const tilesetBlob = new Blob([JSON.stringify(tilesetJson)], {
|
|
186
|
+
type: "application/json",
|
|
187
|
+
});
|
|
188
|
+
const tilesetUrl = URL.createObjectURL(tilesetBlob);
|
|
189
|
+
this._tilesetJsonUrl = tilesetUrl;
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
this._tileset = await Cesium3DTileset.fromUrl(
|
|
193
|
+
tilesetUrl,
|
|
194
|
+
this._createTilesetLoadOptions(),
|
|
195
|
+
);
|
|
196
|
+
} catch (error) {
|
|
197
|
+
URL.revokeObjectURL(tilesetUrl);
|
|
198
|
+
this._tilesetJsonUrl = undefined;
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
201
|
+
URL.revokeObjectURL(tilesetUrl);
|
|
202
|
+
this._tilesetJsonUrl = undefined;
|
|
203
|
+
|
|
204
|
+
this._configureTileset(this._tileset);
|
|
205
|
+
this._tileset._runtimeContentCodec = this._createCodec();
|
|
206
|
+
this._tileset.show = this._show;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @private
|
|
211
|
+
* @param {FrameState} frameState
|
|
212
|
+
*/
|
|
213
|
+
update(frameState) {
|
|
214
|
+
if (defined(this._tileset)) {
|
|
215
|
+
this._tileset.update(frameState);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* @private
|
|
221
|
+
* @param {FrameState} frameState
|
|
222
|
+
*/
|
|
223
|
+
prePassesUpdate(frameState) {
|
|
224
|
+
if (defined(this._tileset)) {
|
|
225
|
+
this._tileset.prePassesUpdate(frameState);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* @private
|
|
231
|
+
* @param {FrameState} frameState
|
|
232
|
+
*/
|
|
233
|
+
postPassesUpdate(frameState) {
|
|
234
|
+
if (defined(this._tileset)) {
|
|
235
|
+
this._tileset.postPassesUpdate(frameState);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @private
|
|
241
|
+
* @param {FrameState} frameState
|
|
242
|
+
* @param {PassState} passState
|
|
243
|
+
*/
|
|
244
|
+
updateForPass(frameState, passState) {
|
|
245
|
+
if (defined(this._tileset)) {
|
|
246
|
+
this._tileset.updateForPass(frameState, passState);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
isDestroyed() {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
destroy() {
|
|
255
|
+
if (defined(this._tileset)) {
|
|
256
|
+
this._tileset.destroy();
|
|
257
|
+
this._tileset = undefined;
|
|
258
|
+
}
|
|
259
|
+
if (defined(this._tilesetJsonUrl)) {
|
|
260
|
+
URL.revokeObjectURL(this._tilesetJsonUrl);
|
|
261
|
+
this._tilesetJsonUrl = undefined;
|
|
262
|
+
}
|
|
263
|
+
this._resource = undefined;
|
|
264
|
+
this._extent = undefined;
|
|
265
|
+
this._featureIdProperty = undefined;
|
|
266
|
+
return destroyObject(this);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* @param {Resource} resource
|
|
272
|
+
* @param {object} options
|
|
273
|
+
* @param {number} options.minZoom
|
|
274
|
+
* @param {number} options.maxZoom
|
|
275
|
+
* @param {Rectangle} [options.extent]
|
|
276
|
+
* @returns {object}
|
|
277
|
+
* @ignore
|
|
278
|
+
*/
|
|
279
|
+
function buildRuntimeTilesetJson(resource, options) {
|
|
280
|
+
const tilingScheme = new WebMercatorTilingScheme();
|
|
281
|
+
const extent = defined(options.extent)
|
|
282
|
+
? Rectangle.clone(options.extent)
|
|
283
|
+
: Rectangle.clone(tilingScheme.rectangle);
|
|
284
|
+
const minLevelRange = computeTileRangeForExtent(
|
|
285
|
+
tilingScheme,
|
|
286
|
+
extent,
|
|
287
|
+
options.minZoom,
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
/** @type {TilesetJsonRoot} */
|
|
291
|
+
const root = {
|
|
292
|
+
boundingVolume: {
|
|
293
|
+
region: rectangleToRegion(extent),
|
|
294
|
+
},
|
|
295
|
+
// Root has no renderable content, so keep a coarse error to ensure
|
|
296
|
+
// refinement reaches the first renderable zoom even when minZoom is high.
|
|
297
|
+
geometricError: computeGeometricError(0),
|
|
298
|
+
refine: "REPLACE",
|
|
299
|
+
children: [],
|
|
300
|
+
};
|
|
301
|
+
for (let y = minLevelRange.minY; y <= minLevelRange.maxY; y++) {
|
|
302
|
+
for (let x = minLevelRange.minX; x <= minLevelRange.maxX; x++) {
|
|
303
|
+
const child = buildTileNode(
|
|
304
|
+
tilingScheme,
|
|
305
|
+
resource,
|
|
306
|
+
extent,
|
|
307
|
+
options.minZoom,
|
|
308
|
+
options.maxZoom,
|
|
309
|
+
x,
|
|
310
|
+
y,
|
|
311
|
+
);
|
|
312
|
+
if (defined(child)) {
|
|
313
|
+
root.children.push(child);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (root.children.length === 0) {
|
|
318
|
+
root.geometricError = 0.0;
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
asset: {
|
|
322
|
+
version: "1.1",
|
|
323
|
+
},
|
|
324
|
+
geometricError: root.geometricError,
|
|
325
|
+
root: root,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* @param {TilingScheme} tilingScheme
|
|
331
|
+
* @param {Resource} resource
|
|
332
|
+
* @param {Rectangle} extent
|
|
333
|
+
* @param {number} level
|
|
334
|
+
* @param {number} maxZoom
|
|
335
|
+
* @param {number} x
|
|
336
|
+
* @param {number} y
|
|
337
|
+
* @ignore
|
|
338
|
+
*/
|
|
339
|
+
function buildTileNode(tilingScheme, resource, extent, level, maxZoom, x, y) {
|
|
340
|
+
if (
|
|
341
|
+
!tileIntersectsExtent(
|
|
342
|
+
tilingScheme,
|
|
343
|
+
level,
|
|
344
|
+
x,
|
|
345
|
+
y,
|
|
346
|
+
extent,
|
|
347
|
+
scratchTileRectangle,
|
|
348
|
+
scratchIntersectionRectangle,
|
|
349
|
+
)
|
|
350
|
+
) {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
const tileRectangle = tilingScheme.tileXYToRectangle(
|
|
354
|
+
x,
|
|
355
|
+
y,
|
|
356
|
+
level,
|
|
357
|
+
new Rectangle(),
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
/** @type {TilesetJsonRoot} */
|
|
361
|
+
const node = {
|
|
362
|
+
boundingVolume: {
|
|
363
|
+
region: rectangleToRegion(tileRectangle),
|
|
364
|
+
},
|
|
365
|
+
geometricError: level < maxZoom ? computeGeometricError(level) : 0.0,
|
|
366
|
+
refine: "REPLACE",
|
|
367
|
+
content: {
|
|
368
|
+
uri: resolveTileUrl(resource, level, x, y),
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
if (level >= maxZoom) {
|
|
372
|
+
return node;
|
|
373
|
+
}
|
|
374
|
+
const childLevel = level + 1;
|
|
375
|
+
const children = [];
|
|
376
|
+
for (let childY = y * 2; childY <= y * 2 + 1; childY++) {
|
|
377
|
+
for (let childX = x * 2; childX <= x * 2 + 1; childX++) {
|
|
378
|
+
const child = buildTileNode(
|
|
379
|
+
tilingScheme,
|
|
380
|
+
resource,
|
|
381
|
+
extent,
|
|
382
|
+
childLevel,
|
|
383
|
+
maxZoom,
|
|
384
|
+
childX,
|
|
385
|
+
childY,
|
|
386
|
+
);
|
|
387
|
+
if (defined(child)) {
|
|
388
|
+
children.push(child);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
if (children.length > 0) {
|
|
393
|
+
node.children = children;
|
|
394
|
+
} else {
|
|
395
|
+
node.geometricError = 0.0;
|
|
396
|
+
}
|
|
397
|
+
return node;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* @param {Resource} resource
|
|
402
|
+
* @param {number} level
|
|
403
|
+
* @param {number} x
|
|
404
|
+
* @param {number} y
|
|
405
|
+
* @ignore
|
|
406
|
+
*/
|
|
407
|
+
function resolveTileUrl(resource, level, x, y) {
|
|
408
|
+
// @ts-expect-error Missing types.
|
|
409
|
+
const template = resource.url;
|
|
410
|
+
const tileUrl = template
|
|
411
|
+
.replace(/\{z\}/gi, `${level}`)
|
|
412
|
+
.replace(/\{x\}/gi, `${x}`)
|
|
413
|
+
.replace(/\{y\}/gi, `${y}`);
|
|
414
|
+
return getAbsoluteUri(tileUrl);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* @param {number} level
|
|
419
|
+
* @ignore
|
|
420
|
+
*/
|
|
421
|
+
function computeGeometricError(level) {
|
|
422
|
+
return EARTH_CIRCUMFERENCE_METERS / ((1 << level) * WEB_MERCATOR_TILE_SIZE);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* @param {Rectangle} rectangle
|
|
427
|
+
* @returns {number[]}
|
|
428
|
+
* @ignore
|
|
429
|
+
*/
|
|
430
|
+
function rectangleToRegion(rectangle) {
|
|
431
|
+
return [
|
|
432
|
+
rectangle.west,
|
|
433
|
+
rectangle.south,
|
|
434
|
+
rectangle.east,
|
|
435
|
+
rectangle.north,
|
|
436
|
+
DEFAULT_REGION_MINIMUM_HEIGHT,
|
|
437
|
+
DEFAULT_REGION_MAXIMUM_HEIGHT,
|
|
438
|
+
];
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* @param {TilingScheme} tilingScheme
|
|
443
|
+
* @param {Rectangle} extent
|
|
444
|
+
* @param {number} level
|
|
445
|
+
* @ignore
|
|
446
|
+
*/
|
|
447
|
+
function computeTileRangeForExtent(tilingScheme, extent, level) {
|
|
448
|
+
const maxIndex = (1 << level) - 1;
|
|
449
|
+
const nw = Cartographic.fromRadians(extent.west, extent.north);
|
|
450
|
+
const se = Cartographic.fromRadians(extent.east, extent.south);
|
|
451
|
+
const nwTile = tilingScheme.positionToTileXY(nw, level);
|
|
452
|
+
const seTile = tilingScheme.positionToTileXY(se, level);
|
|
453
|
+
if (!defined(nwTile) || !defined(seTile) || extent.west > extent.east) {
|
|
454
|
+
return {
|
|
455
|
+
minX: 0,
|
|
456
|
+
maxX: maxIndex,
|
|
457
|
+
minY: 0,
|
|
458
|
+
maxY: maxIndex,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
return {
|
|
462
|
+
minX: CesiumMath.clamp(Math.min(nwTile.x, seTile.x), 0, maxIndex),
|
|
463
|
+
maxX: CesiumMath.clamp(Math.max(nwTile.x, seTile.x), 0, maxIndex),
|
|
464
|
+
minY: CesiumMath.clamp(Math.min(nwTile.y, seTile.y), 0, maxIndex),
|
|
465
|
+
maxY: CesiumMath.clamp(Math.max(nwTile.y, seTile.y), 0, maxIndex),
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* @param {TilingScheme} tilingScheme
|
|
471
|
+
* @param {number} level
|
|
472
|
+
* @param {number} x
|
|
473
|
+
* @param {number} y
|
|
474
|
+
* @param {Rectangle} extent
|
|
475
|
+
* @param {Rectangle} tileRectangleScratch
|
|
476
|
+
* @param {Rectangle} intersectionScratch
|
|
477
|
+
* @ignore
|
|
478
|
+
*/
|
|
479
|
+
function tileIntersectsExtent(
|
|
480
|
+
tilingScheme,
|
|
481
|
+
level,
|
|
482
|
+
x,
|
|
483
|
+
y,
|
|
484
|
+
extent,
|
|
485
|
+
tileRectangleScratch,
|
|
486
|
+
intersectionScratch,
|
|
487
|
+
) {
|
|
488
|
+
const tileRectangle = tilingScheme.tileXYToRectangle(
|
|
489
|
+
x,
|
|
490
|
+
y,
|
|
491
|
+
level,
|
|
492
|
+
tileRectangleScratch,
|
|
493
|
+
);
|
|
494
|
+
return defined(
|
|
495
|
+
Rectangle.intersection(tileRectangle, extent, intersectionScratch),
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
export default UrlTemplate3DTilesDataProvider;
|