@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.
Files changed (187) hide show
  1. package/Build/Workers/{chunk-GPIGURCG.js → chunk-3VFEWOBI.js} +7 -7
  2. package/Build/Workers/{chunk-BTX2NL3P.js → chunk-424RNO3D.js} +18 -18
  3. package/Build/Workers/{chunk-HSVQATK2.js → chunk-4MGMYHOO.js} +6 -6
  4. package/Build/Workers/{chunk-FIBS5S7R.js → chunk-4S7IE3LB.js} +2 -2
  5. package/Build/Workers/{chunk-A7ZBMVFS.js → chunk-52JDLOEM.js} +14 -14
  6. package/Build/Workers/{chunk-ZCCIIBZT.js → chunk-54I6Y66F.js} +6 -6
  7. package/Build/Workers/{chunk-J647NNZW.js → chunk-6YEE6JDR.js} +6 -6
  8. package/Build/Workers/{chunk-HVMG6AG4.js → chunk-7J2HKPRH.js} +9 -9
  9. package/Build/Workers/{chunk-K6NFIRFB.js → chunk-7WM2PX4V.js} +5 -5
  10. package/Build/Workers/{chunk-3LSD7OOA.js → chunk-ACXQXN46.js} +16 -16
  11. package/Build/Workers/{chunk-CZ23Y3RM.js → chunk-AYKR4VBR.js} +2 -2
  12. package/Build/Workers/{chunk-4MTRQFJP.js → chunk-C6J67V5A.js} +1 -1
  13. package/Build/Workers/{chunk-WTQGE7Q6.js → chunk-C6KNZ7T4.js} +17 -17
  14. package/Build/Workers/{chunk-AWFZHD2B.js → chunk-CFQP6LYM.js} +4 -4
  15. package/Build/Workers/{chunk-ST2UWDUU.js → chunk-CXOYE2WM.js} +5 -5
  16. package/Build/Workers/{chunk-H2A4USJR.js → chunk-CZEYZU4N.js} +10 -10
  17. package/Build/Workers/{chunk-DFEI5MAV.js → chunk-DBOEKL43.js} +7 -7
  18. package/Build/Workers/{chunk-A7A433MD.js → chunk-DDWSZVMY.js} +5 -5
  19. package/Build/Workers/{chunk-J7KQEKPK.js → chunk-DOBXCNC3.js} +13 -13
  20. package/Build/Workers/{chunk-URUCCIPS.js → chunk-E7VQ76KE.js} +6 -6
  21. package/Build/Workers/{chunk-ZAPOS52G.js → chunk-EBSIOBXY.js} +8 -8
  22. package/Build/Workers/{chunk-3VDDRF2E.js → chunk-EF2QYXGA.js} +14 -14
  23. package/Build/Workers/{chunk-WN6P5UDH.js → chunk-EPYXRCDB.js} +12 -12
  24. package/Build/Workers/{chunk-EZARA5FJ.js → chunk-F6QDY6HU.js} +13 -13
  25. package/Build/Workers/{chunk-GL7DNVUS.js → chunk-FRQZECAO.js} +5 -5
  26. package/Build/Workers/{chunk-VQKLRBIK.js → chunk-G7PXZRVF.js} +7 -7
  27. package/Build/Workers/{chunk-4QQXGTCE.js → chunk-INUEEEQA.js} +8 -8
  28. package/Build/Workers/{chunk-ITD2IN7N.js → chunk-IRBKFCEJ.js} +2 -2
  29. package/Build/Workers/{chunk-6SDGQI27.js → chunk-IYOUHCZB.js} +1 -1
  30. package/Build/Workers/{chunk-DYT5NR6P.js → chunk-J6BWOHUF.js} +3 -3
  31. package/Build/Workers/{chunk-4GF4MVPY.js → chunk-KFSTQKNM.js} +7 -7
  32. package/Build/Workers/{chunk-4XXHJI6Y.js → chunk-KKOSKAZB.js} +17 -17
  33. package/Build/Workers/{chunk-WC57YYBN.js → chunk-KSSWJIZW.js} +2 -2
  34. package/Build/Workers/{chunk-5T6QQAJW.js → chunk-M3B5JKSM.js} +1 -1
  35. package/Build/Workers/{chunk-QO2CGXMP.js → chunk-MPZHGZU6.js} +6 -6
  36. package/Build/Workers/{chunk-WUBKZFF6.js → chunk-MYP774IS.js} +9 -9
  37. package/Build/Workers/{chunk-WNN5D4W3.js → chunk-O3EA5HS7.js} +10 -10
  38. package/Build/Workers/{chunk-77RL3MBD.js → chunk-P3CK7MCY.js} +25 -4
  39. package/Build/Workers/{chunk-QXNQQYPV.js → chunk-Q3PY526V.js} +8 -8
  40. package/Build/Workers/{chunk-CKQP3DSS.js → chunk-QN67VG36.js} +6 -6
  41. package/Build/Workers/{chunk-ACFFCHHZ.js → chunk-QRWGUWI6.js} +11 -11
  42. package/Build/Workers/{chunk-LH5SF3XV.js → chunk-S4MCOY6I.js} +5 -5
  43. package/Build/Workers/{chunk-FVLVVOBQ.js → chunk-SMQZZOW6.js} +10 -10
  44. package/Build/Workers/{chunk-TA777BGS.js → chunk-TKKIREQ6.js} +1 -1
  45. package/Build/Workers/{chunk-AEAVLYPS.js → chunk-U3ZA64U7.js} +2 -2
  46. package/Build/Workers/{chunk-7LSFAEWF.js → chunk-UA25D5MX.js} +10 -10
  47. package/Build/Workers/{chunk-J3OFS2RD.js → chunk-UOOIQ3KX.js} +12 -12
  48. package/Build/Workers/{chunk-ND3NTTOF.js → chunk-V7VQKN6N.js} +6 -6
  49. package/Build/Workers/{chunk-I3A6DXYZ.js → chunk-VQYETPWC.js} +4 -4
  50. package/Build/Workers/{chunk-35H3UBIO.js → chunk-VWV2IJRB.js} +11 -11
  51. package/Build/Workers/{chunk-QSDY4NS7.js → chunk-XZMBNNDX.js} +9 -9
  52. package/Build/Workers/{chunk-TAI4HLII.js → chunk-Y57HREW5.js} +4 -4
  53. package/Build/Workers/{chunk-3TKLDHV3.js → chunk-Y5BF6AFU.js} +2 -2
  54. package/Build/Workers/{chunk-3XY3MVPG.js → chunk-YLY7NKAB.js} +4 -4
  55. package/Build/Workers/{chunk-BVAIWR7O.js → chunk-ZK3CF7ZD.js} +12 -12
  56. package/Build/Workers/{chunk-DH26SNAB.js → chunk-ZP7JMQV4.js} +1 -1
  57. package/Build/Workers/{chunk-3RFFPH4M.js → chunk-ZZ46LWL6.js} +1 -1
  58. package/Build/Workers/combineGeometry.js +24 -24
  59. package/Build/Workers/createBoxGeometry.js +18 -18
  60. package/Build/Workers/createBoxOutlineGeometry.js +16 -16
  61. package/Build/Workers/createCircleGeometry.js +26 -26
  62. package/Build/Workers/createCircleOutlineGeometry.js +19 -19
  63. package/Build/Workers/createCoplanarPolygonGeometry.js +33 -33
  64. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -31
  65. package/Build/Workers/createCorridorGeometry.js +29 -29
  66. package/Build/Workers/createCorridorOutlineGeometry.js +28 -28
  67. package/Build/Workers/createCylinderGeometry.js +20 -20
  68. package/Build/Workers/createCylinderOutlineGeometry.js +18 -18
  69. package/Build/Workers/createEllipseGeometry.js +26 -26
  70. package/Build/Workers/createEllipseOutlineGeometry.js +19 -19
  71. package/Build/Workers/createEllipsoidGeometry.js +19 -19
  72. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -18
  73. package/Build/Workers/createFrustumGeometry.js +18 -18
  74. package/Build/Workers/createFrustumOutlineGeometry.js +18 -18
  75. package/Build/Workers/createGeometry.js +24 -24
  76. package/Build/Workers/createGroundPolylineGeometry.js +22 -22
  77. package/Build/Workers/createPlaneGeometry.js +16 -16
  78. package/Build/Workers/createPlaneOutlineGeometry.js +15 -15
  79. package/Build/Workers/createPolygonGeometry.js +32 -32
  80. package/Build/Workers/createPolygonOutlineGeometry.js +30 -30
  81. package/Build/Workers/createPolylineGeometry.js +25 -25
  82. package/Build/Workers/createPolylineVolumeGeometry.js +31 -31
  83. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -27
  84. package/Build/Workers/createRectangleGeometry.js +27 -27
  85. package/Build/Workers/createRectangleOutlineGeometry.js +20 -20
  86. package/Build/Workers/createSimplePolylineGeometry.js +23 -23
  87. package/Build/Workers/createSphereGeometry.js +19 -19
  88. package/Build/Workers/createSphereOutlineGeometry.js +18 -18
  89. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  90. package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
  91. package/Build/Workers/createVectorTileGeometries.js +24 -24
  92. package/Build/Workers/createVectorTilePoints.js +13 -13
  93. package/Build/Workers/createVectorTilePolygons.js +22 -22
  94. package/Build/Workers/createVectorTilePolylines.js +14 -14
  95. package/Build/Workers/createVerticesFromCesium3DTilesTerrain.js +25 -25
  96. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -22
  97. package/Build/Workers/createVerticesFromHeightmap.js +22 -22
  98. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +20 -20
  99. package/Build/Workers/createWallGeometry.js +24 -24
  100. package/Build/Workers/createWallOutlineGeometry.js +23 -23
  101. package/Build/Workers/decodeDraco.js +10 -10
  102. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  103. package/Build/Workers/decodeI3S.js +10 -10
  104. package/Build/Workers/gaussianSplatSorter.js +4 -4
  105. package/Build/Workers/gaussianSplatTextureGenerator.js +4 -4
  106. package/Build/Workers/incrementallyBuildTerrainPicker.js +10 -10
  107. package/Build/Workers/transcodeKTX2.js +6 -6
  108. package/Build/Workers/transferTypedArrayTest.js +1 -1
  109. package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -22
  110. package/Build/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +25 -25
  111. package/Source/Core/Cartesian2.js +1 -1
  112. package/Source/Core/Cartesian3.js +1 -1
  113. package/Source/Core/Cartesian4.js +1 -1
  114. package/Source/Core/ComponentDatatype.js +35 -0
  115. package/Source/Core/Ion.js +1 -1
  116. package/Source/Core/MapProjection.js +1 -0
  117. package/Source/Core/Matrix2.js +1 -1
  118. package/Source/Core/Matrix3.js +1 -1
  119. package/Source/Core/Matrix4.js +1 -1
  120. package/Source/Core/Resource.js +1 -1
  121. package/Source/Core/ScreenSpaceEventHandler.js +51 -41
  122. package/Source/Core/createColorRamp.js +37 -0
  123. package/Source/Core/globalTypes.js +25 -0
  124. package/Source/Renderer/Pass.js +3 -2
  125. package/Source/Renderer/createUniform.js +346 -239
  126. package/Source/Renderer/createUniformArray.js +494 -381
  127. package/Source/Scene/ArcGisMapService.js +1 -1
  128. package/Source/Scene/BufferPoint.js +1 -0
  129. package/Source/Scene/BufferPointCollection.js +14 -1
  130. package/Source/Scene/BufferPolygon.js +3 -2
  131. package/Source/Scene/BufferPolygonCollection.js +10 -0
  132. package/Source/Scene/BufferPolyline.js +1 -0
  133. package/Source/Scene/BufferPolylineCollection.js +2 -0
  134. package/Source/Scene/BufferPrimitiveCollection.js +79 -28
  135. package/Source/Scene/CameraEventAggregator.js +30 -18
  136. package/Source/Scene/Cesium3DTile.js +54 -1
  137. package/Source/Scene/Cesium3DTileContent.js +195 -254
  138. package/Source/Scene/Cesium3DTileContentFactory.js +10 -2
  139. package/Source/Scene/Cesium3DTileset.js +45 -5
  140. package/Source/Scene/Composite3DTileContent.js +254 -292
  141. package/Source/Scene/EdgeDisplayMode.js +50 -0
  142. package/Source/Scene/Empty3DTileContent.js +100 -132
  143. package/Source/Scene/GaussianSplat3DTileContent.js +436 -478
  144. package/Source/Scene/GeoJsonPrimitive.js +874 -0
  145. package/Source/Scene/Geometry3DTileContent.js +151 -185
  146. package/Source/Scene/GltfLoader.js +109 -0
  147. package/Source/Scene/Implicit3DTileContent.js +179 -214
  148. package/Source/Scene/MVTDataProvider.js +147 -0
  149. package/Source/Scene/Model/EdgeVisibilityPipelineStage.js +79 -311
  150. package/Source/Scene/Model/Model.js +34 -0
  151. package/Source/Scene/Model/Model3DTileContent.js +424 -458
  152. package/Source/Scene/Model/ModelDrawCommand.js +31 -3
  153. package/Source/Scene/Model/ModelUtility.js +4 -0
  154. package/Source/Scene/Model/createVectorTileBuffersFromModelComponents.js +466 -150
  155. package/Source/Scene/ModelComponents.js +39 -1
  156. package/Source/Scene/Multiple3DTileContent.js +291 -334
  157. package/Source/Scene/Scene.js +26 -0
  158. package/Source/Scene/Tileset3DTileContent.js +113 -146
  159. package/Source/Scene/UrlTemplate3DTilesDataProvider.js +499 -0
  160. package/Source/Scene/Vector3DTileContent.js +205 -234
  161. package/Source/Scene/VectorGltf3DTileContent.js +85 -36
  162. package/Source/Scene/VoxelPrimitive.js +159 -175
  163. package/Source/Scene/VoxelProvider.js +64 -91
  164. package/Source/Scene/buildVectorGltfFromMVT.js +1059 -0
  165. package/Source/Scene/buildVoxelCustomShader.js +199 -0
  166. package/Source/Scene/decodeMVT.js +634 -0
  167. package/Source/Scene/renderBufferPointCollection.js +110 -64
  168. package/Source/Scene/renderBufferPolygonCollection.js +102 -55
  169. package/Source/Scene/renderBufferPolylineCollection.js +365 -166
  170. package/Source/Shaders/BufferPointMaterialFS.glsl +1 -0
  171. package/Source/Shaders/BufferPointMaterialFS.js +1 -0
  172. package/Source/Shaders/BufferPointMaterialVS.glsl +19 -9
  173. package/Source/Shaders/BufferPointMaterialVS.js +20 -10
  174. package/Source/Shaders/BufferPolygonMaterialVS.glsl +13 -4
  175. package/Source/Shaders/BufferPolygonMaterialVS.js +14 -5
  176. package/Source/Shaders/BufferPolylineMaterialVS.glsl +16 -2
  177. package/Source/Shaders/BufferPolylineMaterialVS.js +17 -3
  178. package/Source/Shaders/Builtin/Constants/passCesium3DTileEdgesDirect.glsl +9 -0
  179. package/Source/Shaders/Builtin/Constants/passCesium3DTileEdgesDirect.js +11 -0
  180. package/Source/Shaders/Builtin/Constants/passOverlay.glsl +1 -1
  181. package/Source/Shaders/Builtin/Constants/passOverlay.js +1 -1
  182. package/Source/Shaders/Builtin/CzmBuiltins.js +2 -0
  183. package/Source/Shaders/Model/EdgeVisibilityStageVS.glsl +0 -1
  184. package/Source/Shaders/Model/EdgeVisibilityStageVS.js +0 -1
  185. package/index.d.ts +253 -35
  186. package/index.js +71 -62
  187. 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;