@cesium/engine 26.0.0 → 26.1.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 (160) hide show
  1. package/Build/Workers/{chunk-EF2QYXGA.js → chunk-2EFYUSUY.js} +14 -14
  2. package/Build/Workers/{chunk-KFSTQKNM.js → chunk-5LSOO2KD.js} +7 -7
  3. package/Build/Workers/{chunk-VQYETPWC.js → chunk-6HK6IXK2.js} +4 -4
  4. package/Build/Workers/{chunk-AYKR4VBR.js → chunk-6YR6JBMY.js} +2 -2
  5. package/Build/Workers/{chunk-DOBXCNC3.js → chunk-76FDC45O.js} +13 -13
  6. package/Build/Workers/{chunk-54I6Y66F.js → chunk-7D2HZKH7.js} +6 -6
  7. package/Build/Workers/{chunk-4MGMYHOO.js → chunk-7KVKHY7O.js} +6 -6
  8. package/Build/Workers/{chunk-IRBKFCEJ.js → chunk-A3O6EDBK.js} +2 -2
  9. package/Build/Workers/{chunk-V7VQKN6N.js → chunk-A6X24AZI.js} +5 -5
  10. package/Build/Workers/{chunk-ZP7JMQV4.js → chunk-AHWAZRBV.js} +6 -2
  11. package/Build/Workers/{chunk-YLY7NKAB.js → chunk-B4CQSLZJ.js} +4 -4
  12. package/Build/Workers/{chunk-J6BWOHUF.js → chunk-C7JQVRLM.js} +3 -3
  13. package/Build/Workers/{chunk-KSSWJIZW.js → chunk-CDJDJ5LK.js} +2 -2
  14. package/Build/Workers/{chunk-G7PXZRVF.js → chunk-CEEZE3YZ.js} +7 -7
  15. package/Build/Workers/{chunk-INUEEEQA.js → chunk-CLCTQVVL.js} +8 -8
  16. package/Build/Workers/{chunk-O3EA5HS7.js → chunk-DBD5WWG2.js} +10 -10
  17. package/Build/Workers/{chunk-E7VQ76KE.js → chunk-DIGUUD6G.js} +6 -6
  18. package/Build/Workers/{chunk-424RNO3D.js → chunk-E7NZJOK7.js} +196 -22
  19. package/Build/Workers/{chunk-ACXQXN46.js → chunk-EHTS2YPT.js} +16 -16
  20. package/Build/Workers/{chunk-VWV2IJRB.js → chunk-ENNFMWDW.js} +11 -11
  21. package/Build/Workers/{chunk-FRQZECAO.js → chunk-FCP2QY4G.js} +5 -5
  22. package/Build/Workers/{chunk-ZZ46LWL6.js → chunk-FDK4K5IA.js} +1 -1
  23. package/Build/Workers/{chunk-C6KNZ7T4.js → chunk-FGQFQHN5.js} +17 -17
  24. package/Build/Workers/{chunk-MYP774IS.js → chunk-GSWMAFTE.js} +8 -8
  25. package/Build/Workers/{chunk-Y5BF6AFU.js → chunk-GXWQZBAI.js} +2 -2
  26. package/Build/Workers/{chunk-DDWSZVMY.js → chunk-HHV3MCGV.js} +5 -5
  27. package/Build/Workers/{chunk-52JDLOEM.js → chunk-HS6AD4P2.js} +14 -14
  28. package/Build/Workers/{chunk-Q3PY526V.js → chunk-IGAZBTFZ.js} +6 -6
  29. package/Build/Workers/{chunk-EBSIOBXY.js → chunk-ILME5BXA.js} +8 -8
  30. package/Build/Workers/{chunk-C6J67V5A.js → chunk-JKXV6PG5.js} +1 -1
  31. package/Build/Workers/{chunk-SMQZZOW6.js → chunk-JW6OZT4R.js} +10 -10
  32. package/Build/Workers/{chunk-F6QDY6HU.js → chunk-KGXSYGBG.js} +13 -13
  33. package/Build/Workers/{chunk-UOOIQ3KX.js → chunk-LD64RPYV.js} +12 -12
  34. package/Build/Workers/{chunk-CFQP6LYM.js → chunk-LGNDTZVX.js} +4 -4
  35. package/Build/Workers/{chunk-U3ZA64U7.js → chunk-LNSQVXFH.js} +2 -2
  36. package/Build/Workers/{chunk-TKKIREQ6.js → chunk-N7CCOFLX.js} +1 -1
  37. package/Build/Workers/{chunk-UA25D5MX.js → chunk-NIWITKQK.js} +10 -10
  38. package/Build/Workers/{chunk-KKOSKAZB.js → chunk-OBEU25PI.js} +17 -17
  39. package/Build/Workers/{chunk-M3B5JKSM.js → chunk-QVLAFFJY.js} +1 -1
  40. package/Build/Workers/{chunk-6YEE6JDR.js → chunk-R4FPNAZ2.js} +6 -6
  41. package/Build/Workers/{chunk-7J2HKPRH.js → chunk-RG4F5R57.js} +9 -9
  42. package/Build/Workers/{chunk-CXOYE2WM.js → chunk-SF6K72D7.js} +5 -5
  43. package/Build/Workers/{chunk-CZEYZU4N.js → chunk-SGRGNDOD.js} +10 -10
  44. package/Build/Workers/{chunk-DBOEKL43.js → chunk-SM2CDCYF.js} +7 -7
  45. package/Build/Workers/{chunk-Y57HREW5.js → chunk-SS5ABQGY.js} +4 -4
  46. package/Build/Workers/{chunk-QRWGUWI6.js → chunk-T5QBPLE3.js} +11 -11
  47. package/Build/Workers/{chunk-ZK3CF7ZD.js → chunk-TVZD72WJ.js} +12 -12
  48. package/Build/Workers/{chunk-IYOUHCZB.js → chunk-UEY73NRN.js} +1 -1
  49. package/Build/Workers/{chunk-7WM2PX4V.js → chunk-UVO6COT2.js} +5 -5
  50. package/Build/Workers/{chunk-P3CK7MCY.js → chunk-VAL7DYNR.js} +4 -4
  51. package/Build/Workers/{chunk-EPYXRCDB.js → chunk-WBSY7HDY.js} +12 -12
  52. package/Build/Workers/{chunk-4S7IE3LB.js → chunk-XDWCTQCZ.js} +2 -2
  53. package/Build/Workers/{chunk-QN67VG36.js → chunk-XLXSDIP5.js} +6 -6
  54. package/Build/Workers/{chunk-S4MCOY6I.js → chunk-XQ3SKCMM.js} +5 -5
  55. package/Build/Workers/{chunk-XZMBNNDX.js → chunk-YKU2Q3A2.js} +9 -9
  56. package/Build/Workers/{chunk-3VFEWOBI.js → chunk-ZMBHFYOX.js} +7 -7
  57. package/Build/Workers/{chunk-MPZHGZU6.js → chunk-ZSGUV73H.js} +4 -4
  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 +987 -2320
  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/BoundingRectangle.js +6 -8
  112. package/Source/Core/Color.js +1 -0
  113. package/Source/Core/InterpolationAlgorithm.js +57 -50
  114. package/Source/Core/Ion.js +1 -1
  115. package/Source/Core/TerrainMesh.js +3 -3
  116. package/Source/Core/TerrainPicker.js +1 -0
  117. package/Source/Core/writeTextToCanvas.js +1 -0
  118. package/Source/DataSources/CzmlDataSource.js +12 -0
  119. package/Source/DataSources/KmlDataSource.js +528 -555
  120. package/Source/DataSources/PathGraphics.js +8 -1
  121. package/Source/DataSources/PathMode.js +27 -0
  122. package/Source/DataSources/PathVisualizer.js +298 -1
  123. package/Source/Renderer/Texture.js +1 -1
  124. package/Source/Renderer/VertexArray.js +1 -0
  125. package/Source/Scene/ArcGisMapService.js +1 -1
  126. package/Source/Scene/BillboardTexture.js +5 -3
  127. package/Source/Scene/Cesium3DTileOptimizations.js +4 -6
  128. package/Source/Scene/ClippingPlaneCollection.js +2 -2
  129. package/Source/Scene/ClippingPolygon.js +2 -0
  130. package/Source/Scene/ClippingPolygonCollection.js +2 -2
  131. package/Source/Scene/DerivedCommand.js +4 -0
  132. package/Source/Scene/Expression.js +6 -8
  133. package/Source/Scene/GlobeSurfaceShaderSet.js +501 -409
  134. package/Source/Scene/GlobeSurfaceTile.js +540 -401
  135. package/Source/Scene/GlobeSurfaceTileProvider.js +1259 -1146
  136. package/Source/Scene/GltfBufferViewLoader.js +3 -3
  137. package/Source/Scene/GltfLoader.js +1 -0
  138. package/Source/Scene/GltfLoaderUtil.js +20 -4
  139. package/Source/Scene/GltfPipeline/forEachTextureInMaterial.js +10 -0
  140. package/Source/Scene/GltfPipeline/removeUnusedElements.js +21 -11
  141. package/Source/Scene/ImageryLayer.js +2 -2
  142. package/Source/Scene/ImageryLayerCollection.js +2 -2
  143. package/Source/Scene/Material.js +1 -0
  144. package/Source/Scene/Model/Extensions/Gpm/GltfGpmLoader.js +4 -0
  145. package/Source/Scene/Model/Model.js +3 -0
  146. package/Source/Scene/Model/ModelUtility.js +1 -0
  147. package/Source/Scene/Picking.js +5 -0
  148. package/Source/Scene/PntsParser.js +1 -0
  149. package/Source/Scene/QuadtreePrimitive.js +3 -2
  150. package/Source/Scene/ResourceCacheKey.js +5 -5
  151. package/Source/Scene/Scene.js +1 -0
  152. package/Source/Scene/findMeshoptExtension.js +23 -0
  153. package/Source/Scene/renderBufferPointCollection.js +13 -8
  154. package/Source/Scene/renderBufferPolygonCollection.js +9 -13
  155. package/Source/Scene/renderBufferPolylineCollection.js +120 -192
  156. package/Source/Workers/decodeGoogleEarthEnterprisePacket.js +2 -2
  157. package/Source/Workers/incrementallyBuildTerrainPicker.js +2 -0
  158. package/index.d.ts +59 -254
  159. package/index.js +155 -153
  160. package/package.json +4 -4
@@ -22,83 +22,100 @@ import ImageryState from "./ImageryState.js";
22
22
  import QuadtreeTileLoadState from "./QuadtreeTileLoadState.js";
23
23
  import TerrainState from "./TerrainState.js";
24
24
 
25
+ /** @import Context from "../Renderer/Context.js"; */
26
+ /** @import Ellipsoid from "../Core/Ellipsoid.js"; */
27
+ /** @import FrameState from "./FrameState.js"; */
28
+ /** @import HeightmapTerrainData from "../Core/HeightmapTerrainData.js"; */
29
+ /** @import ImageryLayerCollection from "./ImageryLayerCollection.js"; */
30
+ /** @import MapProjection from "../Core/MapProjection.js"; */
31
+ /** @import QuadtreePrimitive from "./QuadtreePrimitive.js"; */
32
+ /** @import QuadtreeTile from "./QuadtreeTile.js"; */
33
+ /** @import Ray from "../Core/Ray.js"; */
34
+ /** @import SceneMode from "./SceneMode.js"; */
35
+ /** @import TerrainMesh from "../Core/TerrainMesh.js"; */
36
+ /** @import TerrainProvider from "../Core/TerrainProvider.js"; */
37
+ /** @import TileBoundingRegion from "./TileBoundingRegion.js"; */
38
+ /** @import TileImagery from "./TileImagery.js"; */
39
+
25
40
  /**
26
41
  * Contains additional information about a {@link QuadtreeTile} of the globe's surface, and
27
42
  * encapsulates state transition logic for loading tiles.
28
43
  *
29
- * @constructor
30
- * @alias GlobeSurfaceTile
31
44
  * @private
32
45
  */
33
- function GlobeSurfaceTile() {
34
- /**
35
- * The {@link TileImagery} attached to this tile.
36
- * @type {TileImagery[]}
37
- * @default []
38
- */
39
- this.imagery = [];
46
+ class GlobeSurfaceTile {
47
+ /** @type {Request} */
48
+ request;
49
+
50
+ constructor() {
51
+ /**
52
+ * The {@link TileImagery} attached to this tile.
53
+ * @type {TileImagery[]}
54
+ * @default []
55
+ */
56
+ this.imagery = [];
57
+
58
+ /** @type {Texture} */
59
+ this.waterMaskTexture = undefined;
60
+ this.waterMaskTranslationAndScale = new Cartesian4(0.0, 0.0, 1.0, 1.0);
40
61
 
41
- this.waterMaskTexture = undefined;
42
- this.waterMaskTranslationAndScale = new Cartesian4(0.0, 0.0, 1.0, 1.0);
62
+ /** @type {HeightmapTerrainData} */
63
+ this.terrainData = undefined;
43
64
 
44
- this.terrainData = undefined;
45
- this.vertexArray = undefined;
65
+ /** @type {VertexArray} */
66
+ this.vertexArray = undefined;
46
67
 
47
- /**
48
- * A bounding region used to estimate distance to the tile. The horizontal bounds are always tight-fitting,
49
- * but the `minimumHeight` and `maximumHeight` properties may be derived from the min/max of an ancestor tile
50
- * and be quite loose-fitting and thus very poor for estimating distance.
51
- * @type {TileBoundingRegion}
52
- */
53
- this.tileBoundingRegion = undefined;
54
- this.occludeePointInScaledSpace = new Cartesian3();
55
- this.boundingVolumeSourceTile = undefined;
56
- this.boundingVolumeIsFromMesh = false;
68
+ /**
69
+ * A bounding region used to estimate distance to the tile. The horizontal bounds are always tight-fitting,
70
+ * but the `minimumHeight` and `maximumHeight` properties may be derived from the min/max of an ancestor tile
71
+ * and be quite loose-fitting and thus very poor for estimating distance.
72
+ * @type {TileBoundingRegion}
73
+ */
74
+ this.tileBoundingRegion = undefined;
75
+ this.occludeePointInScaledSpace = new Cartesian3();
76
+ this.boundingVolumeSourceTile = undefined;
77
+ this.boundingVolumeIsFromMesh = false;
57
78
 
58
- this.terrainState = TerrainState.UNLOADED;
59
- this.mesh = undefined;
60
- this.fill = undefined;
79
+ this.terrainState = TerrainState.UNLOADED;
80
+ this.mesh = undefined;
81
+ this.fill = undefined;
61
82
 
62
- this.pickBoundingSphere = new BoundingSphere();
83
+ this.pickBoundingSphere = new BoundingSphere();
63
84
 
64
- this.surfaceShader = undefined;
65
- this.isClipped = true;
85
+ this.surfaceShader = undefined;
86
+ this.isClipped = true;
66
87
 
67
- this.clippedByBoundaries = false;
68
- }
88
+ this.clippedByBoundaries = false;
89
+ }
69
90
 
70
- Object.defineProperties(GlobeSurfaceTile.prototype, {
71
91
  /**
72
92
  * Gets a value indicating whether or not this tile is eligible to be unloaded.
73
93
  * Typically, a tile is ineligible to be unloaded while an asynchronous operation,
74
94
  * such as a request for data, is in progress on it. A tile will never be
75
95
  * unloaded while it is needed for rendering, regardless of the value of this
76
96
  * property.
77
- * @memberof GlobeSurfaceTile.prototype
78
97
  * @type {boolean}
79
98
  */
80
- eligibleForUnloading: {
81
- get: function () {
82
- // Do not remove tiles that are transitioning or that have
83
- // imagery that is transitioning.
84
- const terrainState = this.terrainState;
85
- const loadingIsTransitioning =
86
- terrainState === TerrainState.RECEIVING ||
87
- terrainState === TerrainState.TRANSFORMING;
88
-
89
- let shouldRemoveTile = !loadingIsTransitioning;
90
-
91
- const imagery = this.imagery;
92
- for (let i = 0, len = imagery.length; shouldRemoveTile && i < len; ++i) {
93
- const tileImagery = imagery[i];
94
- shouldRemoveTile =
95
- !defined(tileImagery.loadingImagery) ||
96
- tileImagery.loadingImagery.state !== ImageryState.TRANSITIONING;
97
- }
99
+ get eligibleForUnloading() {
100
+ // Do not remove tiles that are transitioning or that have
101
+ // imagery that is transitioning.
102
+ const terrainState = this.terrainState;
103
+ const loadingIsTransitioning =
104
+ terrainState === TerrainState.RECEIVING ||
105
+ terrainState === TerrainState.TRANSFORMING;
106
+
107
+ let shouldRemoveTile = !loadingIsTransitioning;
108
+
109
+ const imagery = this.imagery;
110
+ for (let i = 0, len = imagery.length; shouldRemoveTile && i < len; ++i) {
111
+ const tileImagery = imagery[i];
112
+ shouldRemoveTile =
113
+ !defined(tileImagery.loadingImagery) ||
114
+ tileImagery.loadingImagery.state !== ImageryState.TRANSITIONING;
115
+ }
98
116
 
99
- return shouldRemoveTile;
100
- },
101
- },
117
+ return shouldRemoveTile;
118
+ }
102
119
 
103
120
  /**
104
121
  * Gets the {@link TerrainMesh} that is used for rendering this tile, if any.
@@ -107,224 +124,432 @@ Object.defineProperties(GlobeSurfaceTile.prototype, {
107
124
  * {@link TerrainFillMesh#mesh} property of the {@link GlobeSurfaceTile#fill}.
108
125
  * If there is no fill, it returns undefined.
109
126
  *
110
- * @memberof GlobeSurfaceTile.prototype
111
127
  * @type {TerrainMesh}
112
128
  */
113
- renderedMesh: {
114
- get: function () {
115
- if (defined(this.vertexArray)) {
116
- return this.mesh;
117
- } else if (defined(this.fill)) {
118
- return this.fill.mesh;
119
- }
120
- return undefined;
121
- },
122
- },
123
- });
124
-
125
- GlobeSurfaceTile.prototype.pick = function (
126
- ray,
127
- mode,
128
- projection,
129
- cullBackFaces,
130
- result,
131
- ) {
132
- if (!defined(this.renderedMesh)) {
129
+ get renderedMesh() {
130
+ if (defined(this.vertexArray)) {
131
+ return this.mesh;
132
+ } else if (defined(this.fill)) {
133
+ return this.fill.mesh;
134
+ }
133
135
  return undefined;
134
136
  }
135
- const value = this.renderedMesh.pick(ray, cullBackFaces, mode, projection);
136
- return Cartesian3.clone(value, result);
137
- };
138
137
 
139
- GlobeSurfaceTile.prototype.freeResources = function () {
140
- if (defined(this.waterMaskTexture)) {
141
- --this.waterMaskTexture.referenceCount;
142
- if (this.waterMaskTexture.referenceCount === 0) {
143
- this.waterMaskTexture.destroy();
138
+ /**
139
+ * @param {Ray} ray
140
+ * @param {SceneMode} mode
141
+ * @param {MapProjection} projection
142
+ * @param {boolean} cullBackFaces
143
+ * @param {Cartesian3} result
144
+ */
145
+ pick(ray, mode, projection, cullBackFaces, result) {
146
+ if (!defined(this.renderedMesh)) {
147
+ return undefined;
144
148
  }
145
- this.waterMaskTexture = undefined;
149
+ const value = this.renderedMesh.pick(ray, cullBackFaces, mode, projection);
150
+ return Cartesian3.clone(value, result);
146
151
  }
147
152
 
148
- this.terrainData = undefined;
153
+ freeResources() {
154
+ if (defined(this.waterMaskTexture)) {
155
+ --this.waterMaskTexture.referenceCount;
156
+ if (this.waterMaskTexture.referenceCount === 0) {
157
+ this.waterMaskTexture.destroy();
158
+ }
159
+ this.waterMaskTexture = undefined;
160
+ }
149
161
 
150
- this.terrainState = TerrainState.UNLOADED;
151
- this.mesh = undefined;
152
- this.fill = this.fill && this.fill.destroy();
162
+ this.terrainData = undefined;
153
163
 
154
- const imageryList = this.imagery;
155
- for (let i = 0, len = imageryList.length; i < len; ++i) {
156
- imageryList[i].freeResources();
157
- }
158
- this.imagery.length = 0;
164
+ this.terrainState = TerrainState.UNLOADED;
165
+ this.mesh = undefined;
166
+ this.fill = this.fill && this.fill.destroy();
159
167
 
160
- this.freeVertexArray();
161
- };
168
+ const imageryList = this.imagery;
169
+ for (let i = 0, len = imageryList.length; i < len; ++i) {
170
+ imageryList[i].freeResources();
171
+ }
172
+ this.imagery.length = 0;
162
173
 
163
- GlobeSurfaceTile.prototype.freeVertexArray = function () {
164
- GlobeSurfaceTile._freeVertexArray(this.vertexArray);
165
- this.vertexArray = undefined;
166
- GlobeSurfaceTile._freeVertexArray(this.wireframeVertexArray);
167
- this.wireframeVertexArray = undefined;
168
- };
174
+ this.freeVertexArray();
175
+ }
169
176
 
170
- GlobeSurfaceTile.initialize = function (
171
- tile,
172
- terrainProvider,
173
- imageryLayerCollection,
174
- ) {
175
- let surfaceTile = tile.data;
176
- if (!defined(surfaceTile)) {
177
- surfaceTile = tile.data = new GlobeSurfaceTile();
177
+ freeVertexArray() {
178
+ GlobeSurfaceTile._freeVertexArray(this.vertexArray);
179
+ this.vertexArray = undefined;
180
+ GlobeSurfaceTile._freeVertexArray(this.wireframeVertexArray);
181
+ this.wireframeVertexArray = undefined;
178
182
  }
179
183
 
180
- if (tile.state === QuadtreeTileLoadState.START) {
181
- prepareNewTile(tile, terrainProvider, imageryLayerCollection);
182
- tile.state = QuadtreeTileLoadState.LOADING;
184
+ /**
185
+ * @param {QuadtreeTile} tile
186
+ * @param {TerrainProvider} terrainProvider
187
+ * @param {ImageryLayerCollection} imageryLayerCollection
188
+ */
189
+ static initialize(tile, terrainProvider, imageryLayerCollection) {
190
+ let surfaceTile = tile.data;
191
+ if (!defined(surfaceTile)) {
192
+ surfaceTile = tile.data = new GlobeSurfaceTile();
193
+ }
194
+
195
+ if (tile.state === QuadtreeTileLoadState.START) {
196
+ prepareNewTile(tile, terrainProvider, imageryLayerCollection);
197
+ tile.state = QuadtreeTileLoadState.LOADING;
198
+ }
183
199
  }
184
- };
185
200
 
186
- GlobeSurfaceTile.processStateMachine = function (
187
- tile,
188
- frameState,
189
- terrainProvider,
190
- imageryLayerCollection,
191
- quadtree,
192
- vertexArraysToDestroy,
193
- terrainOnly,
194
- ) {
195
- GlobeSurfaceTile.initialize(tile, terrainProvider, imageryLayerCollection);
201
+ /**
202
+ * @param {*} tile
203
+ * @param {FrameState} frameState
204
+ * @param {TerrainProvider} terrainProvider
205
+ * @param {ImageryLayerCollection} imageryLayerCollection
206
+ * @param {*} quadtree
207
+ * @param {*} vertexArraysToDestroy
208
+ * @param {*} terrainOnly
209
+ */
210
+ static processStateMachine(
211
+ tile,
212
+ frameState,
213
+ terrainProvider,
214
+ imageryLayerCollection,
215
+ quadtree,
216
+ vertexArraysToDestroy,
217
+ terrainOnly,
218
+ ) {
219
+ GlobeSurfaceTile.initialize(tile, terrainProvider, imageryLayerCollection);
220
+
221
+ const surfaceTile = tile.data;
196
222
 
197
- const surfaceTile = tile.data;
223
+ if (tile.state === QuadtreeTileLoadState.LOADING) {
224
+ processTerrainStateMachine(
225
+ tile,
226
+ frameState,
227
+ terrainProvider,
228
+ imageryLayerCollection,
229
+ quadtree,
230
+ vertexArraysToDestroy,
231
+ );
232
+ }
198
233
 
199
- if (tile.state === QuadtreeTileLoadState.LOADING) {
200
- processTerrainStateMachine(
234
+ // From here down we're loading imagery, not terrain. We don't want to load imagery until
235
+ // we're certain that the terrain tiles are actually visible, though. We'll load terrainOnly
236
+ // in these scenarios:
237
+ // * our bounding volume isn't accurate so we're not certain this tile is really visible (see GlobeSurfaceTileProvider#loadTile).
238
+ // * we want to upsample from this tile but don't plan to render it (see processTerrainStateMachine).
239
+ if (terrainOnly) {
240
+ return;
241
+ }
242
+
243
+ const wasAlreadyRenderable = tile.renderable;
244
+
245
+ // The terrain is renderable as soon as we have a valid vertex array.
246
+ tile.renderable = defined(surfaceTile.vertexArray);
247
+
248
+ // But it's not done loading until it's in the READY state.
249
+ const isTerrainDoneLoading =
250
+ surfaceTile.terrainState === TerrainState.READY;
251
+
252
+ // If this tile's terrain and imagery are just upsampled from its parent, mark the tile as
253
+ // upsampled only. We won't refine a tile if its four children are upsampled only.
254
+ tile.upsampledFromParent =
255
+ defined(surfaceTile.terrainData) &&
256
+ surfaceTile.terrainData.wasCreatedByUpsampling();
257
+
258
+ const isImageryDoneLoading = surfaceTile.processImagery(
201
259
  tile,
202
- frameState,
203
260
  terrainProvider,
204
- imageryLayerCollection,
205
- quadtree,
206
- vertexArraysToDestroy,
261
+ frameState,
207
262
  );
263
+
264
+ if (isTerrainDoneLoading && isImageryDoneLoading) {
265
+ const callbacks = tile._loadedCallbacks;
266
+ const newCallbacks = {};
267
+ for (const layerId in callbacks) {
268
+ if (callbacks.hasOwnProperty(layerId)) {
269
+ if (!callbacks[layerId](tile)) {
270
+ newCallbacks[layerId] = callbacks[layerId];
271
+ }
272
+ }
273
+ }
274
+ tile._loadedCallbacks = newCallbacks;
275
+
276
+ tile.state = QuadtreeTileLoadState.DONE;
277
+ }
278
+
279
+ // Once a tile is renderable, it stays renderable, because doing otherwise would
280
+ // cause detail (or maybe even the entire globe) to vanish when adding a new
281
+ // imagery layer. `GlobeSurfaceTileProvider._onLayerAdded` sets renderable to
282
+ // false for all affected tiles that are not currently being rendered.
283
+ if (wasAlreadyRenderable) {
284
+ tile.renderable = true;
285
+ }
208
286
  }
209
287
 
210
- // From here down we're loading imagery, not terrain. We don't want to load imagery until
211
- // we're certain that the terrain tiles are actually visible, though. We'll load terrainOnly
212
- // in these scenarios:
213
- // * our bounding volume isn't accurate so we're not certain this tile is really visible (see GlobeSurfaceTileProvider#loadTile).
214
- // * we want to upsample from this tile but don't plan to render it (see processTerrainStateMachine).
215
- if (terrainOnly) {
216
- return;
288
+ /**
289
+ * @param {QuadtreeTile} tile
290
+ * @param {TerrainProvider} terrainProvider
291
+ * @param {FrameState} frameState
292
+ * @param {boolean} skipLoading
293
+ */
294
+ processImagery(tile, terrainProvider, frameState, skipLoading) {
295
+ const surfaceTile = /** @type {GlobeSurfaceTile} */ (tile.data);
296
+ let isUpsampledOnly = tile.upsampledFromParent;
297
+ let isAnyTileLoaded = false;
298
+ let isDoneLoading = true;
299
+
300
+ // Transition imagery states
301
+ const tileImageryCollection = surfaceTile.imagery;
302
+ let i, len;
303
+ for (i = 0, len = tileImageryCollection.length; i < len; ++i) {
304
+ const tileImagery = tileImageryCollection[i];
305
+ if (!defined(tileImagery.loadingImagery)) {
306
+ isUpsampledOnly = false;
307
+ continue;
308
+ }
309
+
310
+ if (tileImagery.loadingImagery.state === ImageryState.PLACEHOLDER) {
311
+ const imageryLayer = tileImagery.loadingImagery.imageryLayer;
312
+ if (imageryLayer.ready) {
313
+ // Remove the placeholder and add the actual skeletons (if any)
314
+ // at the same position. Then continue the loop at the same index.
315
+ tileImagery.freeResources();
316
+ tileImageryCollection.splice(i, 1);
317
+ imageryLayer._createTileImagerySkeletons(tile, terrainProvider, i);
318
+ --i;
319
+ len = tileImageryCollection.length;
320
+ continue;
321
+ } else {
322
+ isUpsampledOnly = false;
323
+ }
324
+ }
325
+
326
+ const thisTileDoneLoading = tileImagery.processStateMachine(
327
+ tile,
328
+ frameState,
329
+ skipLoading,
330
+ );
331
+ isDoneLoading = isDoneLoading && thisTileDoneLoading;
332
+
333
+ // The imagery is renderable as soon as we have any renderable imagery for this region.
334
+ isAnyTileLoaded =
335
+ isAnyTileLoaded ||
336
+ thisTileDoneLoading ||
337
+ defined(tileImagery.readyImagery);
338
+
339
+ isUpsampledOnly =
340
+ isUpsampledOnly &&
341
+ defined(tileImagery.loadingImagery) &&
342
+ (tileImagery.loadingImagery.state === ImageryState.FAILED ||
343
+ tileImagery.loadingImagery.state === ImageryState.INVALID);
344
+ }
345
+
346
+ tile.upsampledFromParent = isUpsampledOnly;
347
+
348
+ // Allow rendering if any available layers are loaded
349
+ tile.renderable = tile.renderable && (isAnyTileLoaded || isDoneLoading);
350
+
351
+ return isDoneLoading;
217
352
  }
218
353
 
219
- const wasAlreadyRenderable = tile.renderable;
354
+ /**
355
+ * @param {Ellipsoid} ellipsoid
356
+ * @param {FrameState} frameState
357
+ */
358
+ addGeodeticSurfaceNormals(ellipsoid, frameState) {
359
+ toggleGeodeticSurfaceNormals(this, true, ellipsoid, frameState);
360
+ }
220
361
 
221
- // The terrain is renderable as soon as we have a valid vertex array.
222
- tile.renderable = defined(surfaceTile.vertexArray);
362
+ /**
363
+ * @param {FrameState} frameState
364
+ */
365
+ removeGeodeticSurfaceNormals(frameState) {
366
+ toggleGeodeticSurfaceNormals(this, false, undefined, frameState);
367
+ }
223
368
 
224
- // But it's not done loading until it's in the READY state.
225
- const isTerrainDoneLoading = surfaceTile.terrainState === TerrainState.READY;
369
+ /**
370
+ * @param {QuadtreeTile} tile
371
+ * @param {FrameState} frameState
372
+ * @param {QuadtreePrimitive} quadtree
373
+ */
374
+ updateExaggeration(tile, frameState, quadtree) {
375
+ const surfaceTile = this;
376
+ const mesh = surfaceTile.renderedMesh;
377
+ if (mesh === undefined) {
378
+ return;
379
+ }
226
380
 
227
- // If this tile's terrain and imagery are just upsampled from its parent, mark the tile as
228
- // upsampled only. We won't refine a tile if its four children are upsampled only.
229
- tile.upsampledFromParent =
230
- defined(surfaceTile.terrainData) &&
231
- surfaceTile.terrainData.wasCreatedByUpsampling();
381
+ // Check the tile's terrain encoding to see if it has been exaggerated yet
382
+ const exaggeration = frameState.verticalExaggeration;
383
+ const exaggerationRelativeHeight =
384
+ frameState.verticalExaggerationRelativeHeight;
385
+ const hasExaggerationScale = exaggeration !== 1.0;
386
+
387
+ const encoding = mesh.encoding;
388
+ const encodingExaggerationScaleChanged =
389
+ encoding.exaggeration !== exaggeration;
390
+ const encodingRelativeHeightChanged =
391
+ encoding.exaggerationRelativeHeight !== exaggerationRelativeHeight;
392
+ const exaggerationChanged =
393
+ encodingExaggerationScaleChanged || encodingRelativeHeightChanged;
394
+
395
+ if (exaggerationChanged) {
396
+ // Turning exaggeration scale on/off requires adding or removing geodetic surface normals
397
+ // Relative height only translates, so it has no effect on normals
398
+ if (encodingExaggerationScaleChanged) {
399
+ if (hasExaggerationScale && !encoding.hasGeodeticSurfaceNormals) {
400
+ const ellipsoid = tile.tilingScheme.ellipsoid;
401
+ surfaceTile.addGeodeticSurfaceNormals(ellipsoid, frameState);
402
+ } else if (
403
+ !hasExaggerationScale &&
404
+ encoding.hasGeodeticSurfaceNormals
405
+ ) {
406
+ surfaceTile.removeGeodeticSurfaceNormals(frameState);
407
+ }
408
+ }
232
409
 
233
- const isImageryDoneLoading = surfaceTile.processImagery(
234
- tile,
235
- terrainProvider,
236
- frameState,
237
- );
410
+ encoding.exaggeration = exaggeration;
411
+ encoding.exaggerationRelativeHeight = exaggerationRelativeHeight;
238
412
 
239
- if (isTerrainDoneLoading && isImageryDoneLoading) {
240
- const callbacks = tile._loadedCallbacks;
241
- const newCallbacks = {};
242
- for (const layerId in callbacks) {
243
- if (callbacks.hasOwnProperty(layerId)) {
244
- if (!callbacks[layerId](tile)) {
245
- newCallbacks[layerId] = callbacks[layerId];
413
+ // Notify the quadtree that this tile's height has changed
414
+ if (quadtree !== undefined) {
415
+ quadtree._tileToUpdateHeights.push(tile);
416
+ const customData = tile.customData;
417
+ for (const data of customData) {
418
+ // Restart the level so that a height update is triggered
419
+ data.level = -1;
246
420
  }
247
421
  }
248
- }
249
- tile._loadedCallbacks = newCallbacks;
250
422
 
251
- tile.state = QuadtreeTileLoadState.DONE;
423
+ mesh.updateExaggeration(exaggeration, exaggerationRelativeHeight);
424
+ }
252
425
  }
253
426
 
254
- // Once a tile is renderable, it stays renderable, because doing otherwise would
255
- // cause detail (or maybe even the entire globe) to vanish when adding a new
256
- // imagery layer. `GlobeSurfaceTileProvider._onLayerAdded` sets renderable to
257
- // false for all affected tiles that are not currently being rendered.
258
- if (wasAlreadyRenderable) {
259
- tile.renderable = true;
427
+ /**
428
+ * @param {SceneMode} mode
429
+ */
430
+ updateSceneMode(mode) {
431
+ const surfaceTile = this;
432
+ const mesh = surfaceTile.renderedMesh;
433
+ if (mesh === undefined) {
434
+ return;
435
+ }
436
+
437
+ mesh.updateSceneMode(mode);
260
438
  }
261
- };
262
439
 
263
- GlobeSurfaceTile.prototype.processImagery = function (
264
- tile,
265
- terrainProvider,
266
- frameState,
267
- skipLoading,
268
- ) {
269
- const surfaceTile = tile.data;
270
- let isUpsampledOnly = tile.upsampledFromParent;
271
- let isAnyTileLoaded = false;
272
- let isDoneLoading = true;
273
-
274
- // Transition imagery states
275
- const tileImageryCollection = surfaceTile.imagery;
276
- let i, len;
277
- for (i = 0, len = tileImageryCollection.length; i < len; ++i) {
278
- const tileImagery = tileImageryCollection[i];
279
- if (!defined(tileImagery.loadingImagery)) {
280
- isUpsampledOnly = false;
281
- continue;
440
+ /**
441
+ * @param {Context} context
442
+ * @param {TerrainMesh} mesh
443
+ */
444
+ static _createVertexArrayForMesh(context, mesh) {
445
+ const typedArray = mesh.vertices;
446
+ const buffer = Buffer.createVertexBuffer({
447
+ context: context,
448
+ typedArray: typedArray,
449
+ usage: BufferUsage.STATIC_DRAW,
450
+ });
451
+ const attributes = mesh.encoding.getAttributes(buffer);
452
+
453
+ const indexBuffers = mesh.indices.indexBuffers || {};
454
+ let indexBuffer = indexBuffers[context.id];
455
+ if (!defined(indexBuffer) || indexBuffer.isDestroyed()) {
456
+ const indices = mesh.indices;
457
+ indexBuffer = Buffer.createIndexBuffer({
458
+ context: context,
459
+ typedArray: indices,
460
+ usage: BufferUsage.STATIC_DRAW,
461
+ // @ts-expect-error https://github.com/CesiumGS/cesium/issues/13420
462
+ indexDatatype: IndexDatatype.fromSizeInBytes(indices.BYTES_PER_ELEMENT),
463
+ });
464
+ indexBuffer.vertexArrayDestroyable = false;
465
+ indexBuffer.referenceCount = 1;
466
+ indexBuffers[context.id] = indexBuffer;
467
+ mesh.indices.indexBuffers = indexBuffers;
468
+ } else {
469
+ ++indexBuffer.referenceCount;
282
470
  }
283
471
 
284
- if (tileImagery.loadingImagery.state === ImageryState.PLACEHOLDER) {
285
- const imageryLayer = tileImagery.loadingImagery.imageryLayer;
286
- if (imageryLayer.ready) {
287
- // Remove the placeholder and add the actual skeletons (if any)
288
- // at the same position. Then continue the loop at the same index.
289
- tileImagery.freeResources();
290
- tileImageryCollection.splice(i, 1);
291
- imageryLayer._createTileImagerySkeletons(tile, terrainProvider, i);
292
- --i;
293
- len = tileImageryCollection.length;
294
- continue;
295
- } else {
296
- isUpsampledOnly = false;
297
- }
298
- }
472
+ return new VertexArray({
473
+ context: context,
474
+ attributes: attributes,
475
+ indexBuffer: indexBuffer,
476
+ });
477
+ }
299
478
 
300
- const thisTileDoneLoading = tileImagery.processStateMachine(
301
- tile,
302
- frameState,
303
- skipLoading,
304
- );
305
- isDoneLoading = isDoneLoading && thisTileDoneLoading;
479
+ /**
480
+ * @param {VertexArray} vertexArray
481
+ */
482
+ static _freeVertexArray(vertexArray) {
483
+ if (defined(vertexArray)) {
484
+ // @ts-expect-error Missing types.
485
+ const indexBuffer = vertexArray.indexBuffer;
306
486
 
307
- // The imagery is renderable as soon as we have any renderable imagery for this region.
308
- isAnyTileLoaded =
309
- isAnyTileLoaded ||
310
- thisTileDoneLoading ||
311
- defined(tileImagery.readyImagery);
487
+ if (!vertexArray.isDestroyed()) {
488
+ vertexArray.destroy();
489
+ }
312
490
 
313
- isUpsampledOnly =
314
- isUpsampledOnly &&
315
- defined(tileImagery.loadingImagery) &&
316
- (tileImagery.loadingImagery.state === ImageryState.FAILED ||
317
- tileImagery.loadingImagery.state === ImageryState.INVALID);
491
+ if (
492
+ defined(indexBuffer) &&
493
+ !indexBuffer.isDestroyed() &&
494
+ defined(indexBuffer.referenceCount)
495
+ ) {
496
+ --indexBuffer.referenceCount;
497
+ if (indexBuffer.referenceCount === 0) {
498
+ indexBuffer.destroy();
499
+ }
500
+ }
501
+ }
318
502
  }
319
503
 
320
- tile.upsampledFromParent = isUpsampledOnly;
504
+ /**
505
+ * @param {QuadtreeTile} tile
506
+ */
507
+ _findAncestorTileWithTerrainData(tile) {
508
+ let sourceTile = tile.parent;
509
+
510
+ while (
511
+ defined(sourceTile) &&
512
+ (!defined(sourceTile.data) ||
513
+ !defined(sourceTile.data.terrainData) ||
514
+ sourceTile.data.terrainData.wasCreatedByUpsampling())
515
+ ) {
516
+ sourceTile = sourceTile.parent;
517
+ }
321
518
 
322
- // Allow rendering if any available layers are loaded
323
- tile.renderable = tile.renderable && (isAnyTileLoaded || isDoneLoading);
519
+ return sourceTile;
520
+ }
324
521
 
325
- return isDoneLoading;
326
- };
522
+ /**
523
+ * @param {QuadtreeTile} tile
524
+ * @param {QuadtreeTile} sourceTile
525
+ * @param {Cartesian4} result
526
+ */
527
+ _computeWaterMaskTranslationAndScale(tile, sourceTile, result) {
528
+ const sourceTileRectangle = sourceTile.rectangle;
529
+ const tileRectangle = tile.rectangle;
530
+ const tileWidth = tileRectangle.width;
531
+ const tileHeight = tileRectangle.height;
532
+
533
+ const scaleX = tileWidth / sourceTileRectangle.width;
534
+ const scaleY = tileHeight / sourceTileRectangle.height;
535
+ result.x =
536
+ (scaleX * (tileRectangle.west - sourceTileRectangle.west)) / tileWidth;
537
+ result.y =
538
+ (scaleY * (tileRectangle.south - sourceTileRectangle.south)) / tileHeight;
539
+ result.z = scaleX;
540
+ result.w = scaleY;
541
+
542
+ return result;
543
+ }
544
+ }
327
545
 
546
+ /**
547
+ * @param {GlobeSurfaceTile} surfaceTile
548
+ * @param {boolean} enabled
549
+ * @param {Ellipsoid} ellipsoid
550
+ * @param {FrameState} frameState
551
+ * @ignore
552
+ */
328
553
  function toggleGeodeticSurfaceNormals(
329
554
  surfaceTile,
330
555
  enabled,
@@ -376,85 +601,16 @@ function toggleGeodeticSurfaceNormals(
376
601
  surfaceTile.wireframeVertexArray = undefined;
377
602
  }
378
603
 
379
- GlobeSurfaceTile.prototype.addGeodeticSurfaceNormals = function (
380
- ellipsoid,
381
- frameState,
382
- ) {
383
- toggleGeodeticSurfaceNormals(this, true, ellipsoid, frameState);
384
- };
385
-
386
- GlobeSurfaceTile.prototype.removeGeodeticSurfaceNormals = function (
387
- frameState,
388
- ) {
389
- toggleGeodeticSurfaceNormals(this, false, undefined, frameState);
390
- };
391
-
392
- GlobeSurfaceTile.prototype.updateExaggeration = function (
393
- tile,
394
- frameState,
395
- quadtree,
396
- ) {
397
- const surfaceTile = this;
398
- const mesh = surfaceTile.renderedMesh;
399
- if (mesh === undefined) {
400
- return;
401
- }
402
-
403
- // Check the tile's terrain encoding to see if it has been exaggerated yet
404
- const exaggeration = frameState.verticalExaggeration;
405
- const exaggerationRelativeHeight =
406
- frameState.verticalExaggerationRelativeHeight;
407
- const hasExaggerationScale = exaggeration !== 1.0;
408
-
409
- const encoding = mesh.encoding;
410
- const encodingExaggerationScaleChanged =
411
- encoding.exaggeration !== exaggeration;
412
- const encodingRelativeHeightChanged =
413
- encoding.exaggerationRelativeHeight !== exaggerationRelativeHeight;
414
- const exaggerationChanged =
415
- encodingExaggerationScaleChanged || encodingRelativeHeightChanged;
416
-
417
- if (exaggerationChanged) {
418
- // Turning exaggeration scale on/off requires adding or removing geodetic surface normals
419
- // Relative height only translates, so it has no effect on normals
420
- if (encodingExaggerationScaleChanged) {
421
- if (hasExaggerationScale && !encoding.hasGeodeticSurfaceNormals) {
422
- const ellipsoid = tile.tilingScheme.ellipsoid;
423
- surfaceTile.addGeodeticSurfaceNormals(ellipsoid, frameState);
424
- } else if (!hasExaggerationScale && encoding.hasGeodeticSurfaceNormals) {
425
- surfaceTile.removeGeodeticSurfaceNormals(frameState);
426
- }
427
- }
428
-
429
- encoding.exaggeration = exaggeration;
430
- encoding.exaggerationRelativeHeight = exaggerationRelativeHeight;
431
-
432
- // Notify the quadtree that this tile's height has changed
433
- if (quadtree !== undefined) {
434
- quadtree._tileToUpdateHeights.push(tile);
435
- const customData = tile.customData;
436
- for (const data of customData) {
437
- // Restart the level so that a height update is triggered
438
- data.level = -1;
439
- }
440
- }
441
-
442
- mesh.updateExaggeration(exaggeration, exaggerationRelativeHeight);
443
- }
444
- };
445
-
446
- GlobeSurfaceTile.prototype.updateSceneMode = function (mode) {
447
- const surfaceTile = this;
448
- const mesh = surfaceTile.renderedMesh;
449
- if (mesh === undefined) {
450
- return;
451
- }
452
-
453
- mesh.updateSceneMode(mode);
454
- };
455
-
604
+ /**
605
+ * @param {QuadtreeTile} tile
606
+ * @param {TerrainProvider} terrainProvider
607
+ * @param {ImageryLayerCollection} imageryLayerCollection
608
+ * @ignore
609
+ */
456
610
  function prepareNewTile(tile, terrainProvider, imageryLayerCollection) {
611
+ /** @type {boolean} */
457
612
  let available = terrainProvider.getTileDataAvailable(
613
+ // @ts-expect-error Missing types.
458
614
  tile.x,
459
615
  tile.y,
460
616
  tile.level,
@@ -463,7 +619,7 @@ function prepareNewTile(tile, terrainProvider, imageryLayerCollection) {
463
619
  if (!defined(available) && defined(tile.parent)) {
464
620
  // Provider doesn't know if this tile is available. Does the parent tile know?
465
621
  const parent = tile.parent;
466
- const parentSurfaceTile = parent.data;
622
+ const parentSurfaceTile = /** @type {GlobeSurfaceTile} */ (parent.data);
467
623
  if (defined(parentSurfaceTile) && defined(parentSurfaceTile.terrainData)) {
468
624
  available = parentSurfaceTile.terrainData.isChildAvailable(
469
625
  parent.x,
@@ -475,11 +631,13 @@ function prepareNewTile(tile, terrainProvider, imageryLayerCollection) {
475
631
  }
476
632
 
477
633
  if (available === false) {
634
+ const surfaceTile = /** @type {GlobeSurfaceTile} */ (tile.data);
478
635
  // This tile is not available, so mark it failed so we start upsampling right away.
479
- tile.data.terrainState = TerrainState.FAILED;
636
+ surfaceTile.terrainState = TerrainState.FAILED;
480
637
  }
481
638
 
482
639
  // Map imagery tiles to this terrain tile
640
+ // @ts-expect-error Missing types.
483
641
  for (let i = 0, len = imageryLayerCollection.length; i < len; ++i) {
484
642
  const layer = imageryLayerCollection.get(i);
485
643
  if (layer.show) {
@@ -488,6 +646,15 @@ function prepareNewTile(tile, terrainProvider, imageryLayerCollection) {
488
646
  }
489
647
  }
490
648
 
649
+ /**
650
+ * @param {QuadtreeTile} tile
651
+ * @param {FrameState} frameState
652
+ * @param {TerrainProvider} terrainProvider
653
+ * @param {ImageryLayerCollection} imageryLayerCollection
654
+ * @param {QuadtreePrimitive} quadtree
655
+ * @param {*} vertexArraysToDestroy
656
+ * @ignore
657
+ */
491
658
  function processTerrainStateMachine(
492
659
  tile,
493
660
  frameState,
@@ -496,7 +663,7 @@ function processTerrainStateMachine(
496
663
  quadtree,
497
664
  vertexArraysToDestroy,
498
665
  ) {
499
- const surfaceTile = tile.data;
666
+ const surfaceTile = /** @type {GlobeSurfaceTile} */ (tile.data);
500
667
 
501
668
  // If this tile is FAILED, we'll need to upsample from the parent. If the parent isn't
502
669
  // ready for that, let's push it along.
@@ -505,10 +672,13 @@ function processTerrainStateMachine(
505
672
  surfaceTile.terrainState === TerrainState.FAILED &&
506
673
  parent !== undefined
507
674
  ) {
675
+ const parentSurfaceTile = /** @type {GlobeSurfaceTile|undefined} */ (
676
+ parent.data
677
+ );
508
678
  const parentReady =
509
- parent.data !== undefined &&
510
- parent.data.terrainData !== undefined &&
511
- parent.data.terrainData.canUpsample !== false;
679
+ parentSurfaceTile !== undefined &&
680
+ parentSurfaceTile.terrainData !== undefined &&
681
+ parentSurfaceTile.terrainData.canUpsample !== false;
512
682
  if (!parentReady) {
513
683
  GlobeSurfaceTile.processStateMachine(
514
684
  parent,
@@ -573,6 +743,7 @@ function processTerrainStateMachine(
573
743
  if (
574
744
  surfaceTile.terrainState >= TerrainState.RECEIVED &&
575
745
  surfaceTile.waterMaskTexture === undefined &&
746
+ // @ts-expect-error Missing types.
576
747
  terrainProvider.hasWaterMask
577
748
  ) {
578
749
  const terrainData = surfaceTile.terrainData;
@@ -580,8 +751,11 @@ function processTerrainStateMachine(
580
751
  createWaterMaskTextureIfNeeded(frameState.context, surfaceTile);
581
752
  } else {
582
753
  const sourceTile = surfaceTile._findAncestorTileWithTerrainData(tile);
583
- if (defined(sourceTile) && defined(sourceTile.data.waterMaskTexture)) {
584
- surfaceTile.waterMaskTexture = sourceTile.data.waterMaskTexture;
754
+ const sourceSurfaceTile = /** @type {GlobeSurfaceTile|undefined} */ (
755
+ sourceTile?.data
756
+ );
757
+ if (defined(sourceTile) && defined(sourceSurfaceTile.waterMaskTexture)) {
758
+ surfaceTile.waterMaskTexture = sourceSurfaceTile.waterMaskTexture;
585
759
  ++surfaceTile.waterMaskTexture.referenceCount;
586
760
  surfaceTile._computeWaterMaskTranslationAndScale(
587
761
  tile,
@@ -593,6 +767,16 @@ function processTerrainStateMachine(
593
767
  }
594
768
  }
595
769
 
770
+ /**
771
+ * @param {GlobeSurfaceTile} surfaceTile
772
+ * @param {QuadtreeTile} tile
773
+ * @param {FrameState} frameState
774
+ * @param {TerrainProvider} terrainProvider
775
+ * @param {number} x
776
+ * @param {number} y
777
+ * @param {number} level
778
+ * @ignore
779
+ */
596
780
  function upsample(surfaceTile, tile, frameState, terrainProvider, x, y, level) {
597
781
  const parent = tile.parent;
598
782
  if (!parent) {
@@ -601,7 +785,8 @@ function upsample(surfaceTile, tile, frameState, terrainProvider, x, y, level) {
601
785
  return;
602
786
  }
603
787
 
604
- const sourceData = parent.data.terrainData;
788
+ const parentSurfaceTile = /** @type {GlobeSurfaceTile} */ (parent.data);
789
+ const sourceData = parentSurfaceTile.terrainData;
605
790
  const sourceX = parent.x;
606
791
  const sourceY = parent.y;
607
792
  const sourceLevel = parent.level;
@@ -612,6 +797,7 @@ function upsample(surfaceTile, tile, frameState, terrainProvider, x, y, level) {
612
797
  }
613
798
 
614
799
  const terrainDataPromise = sourceData.upsample(
800
+ // @ts-expect-error Missing types.
615
801
  terrainProvider.tilingScheme,
616
802
  sourceX,
617
803
  sourceY,
@@ -642,7 +828,16 @@ function upsample(surfaceTile, tile, frameState, terrainProvider, x, y, level) {
642
828
  });
643
829
  }
644
830
 
831
+ /**
832
+ * @param {GlobeSurfaceTile} surfaceTile
833
+ * @param {TerrainProvider} terrainProvider
834
+ * @param {number} x
835
+ * @param {number} y
836
+ * @param {number} level
837
+ * @ignore
838
+ */
645
839
  function requestTileGeometry(surfaceTile, terrainProvider, x, y, level) {
840
+ /** @param {HeightmapTerrainData} terrainData */
646
841
  function success(terrainData) {
647
842
  if (!defined(terrainData)) {
648
843
  // Throttled due to low priority - try again later.
@@ -656,6 +851,7 @@ function requestTileGeometry(surfaceTile, terrainProvider, x, y, level) {
656
851
  surfaceTile.request = undefined;
657
852
  }
658
853
 
854
+ /** @param {Error} error */
659
855
  function failure(error) {
660
856
  if (surfaceTile.request.state === RequestState.CANCELLED) {
661
857
  // Cancelled due to low priority - try again later.
@@ -671,15 +867,19 @@ function requestTileGeometry(surfaceTile, terrainProvider, x, y, level) {
671
867
  surfaceTile.request = undefined;
672
868
 
673
869
  const message = `Failed to obtain terrain tile X: ${x} Y: ${y} Level: ${level}. Error message: "${error}"`;
870
+ // @ts-expect-error Missing types.
674
871
  terrainProvider._requestError = TileProviderError.reportError(
872
+ // @ts-expect-error Missing types.
675
873
  terrainProvider._requestError,
676
874
  terrainProvider,
875
+ // @ts-expect-error Missing types.
677
876
  terrainProvider.errorEvent,
678
877
  message,
679
878
  x,
680
879
  y,
681
880
  level,
682
881
  );
882
+ // @ts-expect-error Missing types.
683
883
  if (terrainProvider._requestError.retry) {
684
884
  doRequest();
685
885
  }
@@ -695,6 +895,7 @@ function requestTileGeometry(surfaceTile, terrainProvider, x, y, level) {
695
895
  surfaceTile.request = request;
696
896
 
697
897
  const requestPromise = terrainProvider.requestTileGeometry(
898
+ // @ts-expect-error Missing types.
698
899
  x,
699
900
  y,
700
901
  level,
@@ -732,7 +933,17 @@ const scratchCreateMeshOptions = {
732
933
  throttle: true,
733
934
  };
734
935
 
936
+ /**
937
+ * @param {GlobeSurfaceTile} surfaceTile
938
+ * @param {FrameState} frameState
939
+ * @param {TerrainProvider} terrainProvider
940
+ * @param {number} x
941
+ * @param {number} y
942
+ * @param {number} level
943
+ * @ignore
944
+ */
735
945
  function transform(surfaceTile, frameState, terrainProvider, x, y, level) {
946
+ // @ts-expect-error Missing types.
736
947
  const tilingScheme = terrainProvider.tilingScheme;
737
948
 
738
949
  const createMeshOptions = scratchCreateMeshOptions;
@@ -765,61 +976,16 @@ function transform(surfaceTile, frameState, terrainProvider, x, y, level) {
765
976
  });
766
977
  }
767
978
 
768
- GlobeSurfaceTile._createVertexArrayForMesh = function (context, mesh) {
769
- const typedArray = mesh.vertices;
770
- const buffer = Buffer.createVertexBuffer({
771
- context: context,
772
- typedArray: typedArray,
773
- usage: BufferUsage.STATIC_DRAW,
774
- });
775
- const attributes = mesh.encoding.getAttributes(buffer);
776
-
777
- const indexBuffers = mesh.indices.indexBuffers || {};
778
- let indexBuffer = indexBuffers[context.id];
779
- if (!defined(indexBuffer) || indexBuffer.isDestroyed()) {
780
- const indices = mesh.indices;
781
- indexBuffer = Buffer.createIndexBuffer({
782
- context: context,
783
- typedArray: indices,
784
- usage: BufferUsage.STATIC_DRAW,
785
- indexDatatype: IndexDatatype.fromSizeInBytes(indices.BYTES_PER_ELEMENT),
786
- });
787
- indexBuffer.vertexArrayDestroyable = false;
788
- indexBuffer.referenceCount = 1;
789
- indexBuffers[context.id] = indexBuffer;
790
- mesh.indices.indexBuffers = indexBuffers;
791
- } else {
792
- ++indexBuffer.referenceCount;
793
- }
794
-
795
- return new VertexArray({
796
- context: context,
797
- attributes: attributes,
798
- indexBuffer: indexBuffer,
799
- });
800
- };
801
-
802
- GlobeSurfaceTile._freeVertexArray = function (vertexArray) {
803
- if (defined(vertexArray)) {
804
- const indexBuffer = vertexArray.indexBuffer;
805
-
806
- if (!vertexArray.isDestroyed()) {
807
- vertexArray.destroy();
808
- }
809
-
810
- if (
811
- defined(indexBuffer) &&
812
- !indexBuffer.isDestroyed() &&
813
- defined(indexBuffer.referenceCount)
814
- ) {
815
- --indexBuffer.referenceCount;
816
- if (indexBuffer.referenceCount === 0) {
817
- indexBuffer.destroy();
818
- }
819
- }
820
- }
821
- };
822
-
979
+ /**
980
+ * @param {GlobeSurfaceTile} surfaceTile
981
+ * @param {Context} context
982
+ * @param {TerrainProvider} terrainProvider
983
+ * @param {number} x
984
+ * @param {number} y
985
+ * @param {number} level
986
+ * @param {*} vertexArraysToDestroy
987
+ * @ignore
988
+ */
823
989
  function createResources(
824
990
  surfaceTile,
825
991
  context,
@@ -838,6 +1004,10 @@ function createResources(
838
1004
  surfaceTile.fill && surfaceTile.fill.destroy(vertexArraysToDestroy);
839
1005
  }
840
1006
 
1007
+ /**
1008
+ * @param {Context} context
1009
+ * @ignore
1010
+ */
841
1011
  function getContextWaterMaskData(context) {
842
1012
  let data = context.cache.tile_waterMaskData;
843
1013
 
@@ -875,6 +1045,11 @@ function getContextWaterMaskData(context) {
875
1045
  return data;
876
1046
  }
877
1047
 
1048
+ /**
1049
+ * @param {Context} context
1050
+ * @param {GlobeSurfaceTile} surfaceTile
1051
+ * @ignore
1052
+ */
878
1053
  function createWaterMaskTextureIfNeeded(context, surfaceTile) {
879
1054
  const waterMask = surfaceTile.terrainData.waterMask;
880
1055
  const waterMaskData = getContextWaterMaskData(context);
@@ -928,40 +1103,4 @@ function createWaterMaskTextureIfNeeded(context, surfaceTile) {
928
1103
  );
929
1104
  }
930
1105
 
931
- GlobeSurfaceTile.prototype._findAncestorTileWithTerrainData = function (tile) {
932
- let sourceTile = tile.parent;
933
-
934
- while (
935
- defined(sourceTile) &&
936
- (!defined(sourceTile.data) ||
937
- !defined(sourceTile.data.terrainData) ||
938
- sourceTile.data.terrainData.wasCreatedByUpsampling())
939
- ) {
940
- sourceTile = sourceTile.parent;
941
- }
942
-
943
- return sourceTile;
944
- };
945
-
946
- GlobeSurfaceTile.prototype._computeWaterMaskTranslationAndScale = function (
947
- tile,
948
- sourceTile,
949
- result,
950
- ) {
951
- const sourceTileRectangle = sourceTile.rectangle;
952
- const tileRectangle = tile.rectangle;
953
- const tileWidth = tileRectangle.width;
954
- const tileHeight = tileRectangle.height;
955
-
956
- const scaleX = tileWidth / sourceTileRectangle.width;
957
- const scaleY = tileHeight / sourceTileRectangle.height;
958
- result.x =
959
- (scaleX * (tileRectangle.west - sourceTileRectangle.west)) / tileWidth;
960
- result.y =
961
- (scaleY * (tileRectangle.south - sourceTileRectangle.south)) / tileHeight;
962
- result.z = scaleX;
963
- result.w = scaleY;
964
-
965
- return result;
966
- };
967
1106
  export default GlobeSurfaceTile;