@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.
- package/Build/Workers/{chunk-EF2QYXGA.js → chunk-2EFYUSUY.js} +14 -14
- package/Build/Workers/{chunk-KFSTQKNM.js → chunk-5LSOO2KD.js} +7 -7
- package/Build/Workers/{chunk-VQYETPWC.js → chunk-6HK6IXK2.js} +4 -4
- package/Build/Workers/{chunk-AYKR4VBR.js → chunk-6YR6JBMY.js} +2 -2
- package/Build/Workers/{chunk-DOBXCNC3.js → chunk-76FDC45O.js} +13 -13
- package/Build/Workers/{chunk-54I6Y66F.js → chunk-7D2HZKH7.js} +6 -6
- package/Build/Workers/{chunk-4MGMYHOO.js → chunk-7KVKHY7O.js} +6 -6
- package/Build/Workers/{chunk-IRBKFCEJ.js → chunk-A3O6EDBK.js} +2 -2
- package/Build/Workers/{chunk-V7VQKN6N.js → chunk-A6X24AZI.js} +5 -5
- package/Build/Workers/{chunk-ZP7JMQV4.js → chunk-AHWAZRBV.js} +6 -2
- package/Build/Workers/{chunk-YLY7NKAB.js → chunk-B4CQSLZJ.js} +4 -4
- package/Build/Workers/{chunk-J6BWOHUF.js → chunk-C7JQVRLM.js} +3 -3
- package/Build/Workers/{chunk-KSSWJIZW.js → chunk-CDJDJ5LK.js} +2 -2
- package/Build/Workers/{chunk-G7PXZRVF.js → chunk-CEEZE3YZ.js} +7 -7
- package/Build/Workers/{chunk-INUEEEQA.js → chunk-CLCTQVVL.js} +8 -8
- package/Build/Workers/{chunk-O3EA5HS7.js → chunk-DBD5WWG2.js} +10 -10
- package/Build/Workers/{chunk-E7VQ76KE.js → chunk-DIGUUD6G.js} +6 -6
- package/Build/Workers/{chunk-424RNO3D.js → chunk-E7NZJOK7.js} +196 -22
- package/Build/Workers/{chunk-ACXQXN46.js → chunk-EHTS2YPT.js} +16 -16
- package/Build/Workers/{chunk-VWV2IJRB.js → chunk-ENNFMWDW.js} +11 -11
- package/Build/Workers/{chunk-FRQZECAO.js → chunk-FCP2QY4G.js} +5 -5
- package/Build/Workers/{chunk-ZZ46LWL6.js → chunk-FDK4K5IA.js} +1 -1
- package/Build/Workers/{chunk-C6KNZ7T4.js → chunk-FGQFQHN5.js} +17 -17
- package/Build/Workers/{chunk-MYP774IS.js → chunk-GSWMAFTE.js} +8 -8
- package/Build/Workers/{chunk-Y5BF6AFU.js → chunk-GXWQZBAI.js} +2 -2
- package/Build/Workers/{chunk-DDWSZVMY.js → chunk-HHV3MCGV.js} +5 -5
- package/Build/Workers/{chunk-52JDLOEM.js → chunk-HS6AD4P2.js} +14 -14
- package/Build/Workers/{chunk-Q3PY526V.js → chunk-IGAZBTFZ.js} +6 -6
- package/Build/Workers/{chunk-EBSIOBXY.js → chunk-ILME5BXA.js} +8 -8
- package/Build/Workers/{chunk-C6J67V5A.js → chunk-JKXV6PG5.js} +1 -1
- package/Build/Workers/{chunk-SMQZZOW6.js → chunk-JW6OZT4R.js} +10 -10
- package/Build/Workers/{chunk-F6QDY6HU.js → chunk-KGXSYGBG.js} +13 -13
- package/Build/Workers/{chunk-UOOIQ3KX.js → chunk-LD64RPYV.js} +12 -12
- package/Build/Workers/{chunk-CFQP6LYM.js → chunk-LGNDTZVX.js} +4 -4
- package/Build/Workers/{chunk-U3ZA64U7.js → chunk-LNSQVXFH.js} +2 -2
- package/Build/Workers/{chunk-TKKIREQ6.js → chunk-N7CCOFLX.js} +1 -1
- package/Build/Workers/{chunk-UA25D5MX.js → chunk-NIWITKQK.js} +10 -10
- package/Build/Workers/{chunk-KKOSKAZB.js → chunk-OBEU25PI.js} +17 -17
- package/Build/Workers/{chunk-M3B5JKSM.js → chunk-QVLAFFJY.js} +1 -1
- package/Build/Workers/{chunk-6YEE6JDR.js → chunk-R4FPNAZ2.js} +6 -6
- package/Build/Workers/{chunk-7J2HKPRH.js → chunk-RG4F5R57.js} +9 -9
- package/Build/Workers/{chunk-CXOYE2WM.js → chunk-SF6K72D7.js} +5 -5
- package/Build/Workers/{chunk-CZEYZU4N.js → chunk-SGRGNDOD.js} +10 -10
- package/Build/Workers/{chunk-DBOEKL43.js → chunk-SM2CDCYF.js} +7 -7
- package/Build/Workers/{chunk-Y57HREW5.js → chunk-SS5ABQGY.js} +4 -4
- package/Build/Workers/{chunk-QRWGUWI6.js → chunk-T5QBPLE3.js} +11 -11
- package/Build/Workers/{chunk-ZK3CF7ZD.js → chunk-TVZD72WJ.js} +12 -12
- package/Build/Workers/{chunk-IYOUHCZB.js → chunk-UEY73NRN.js} +1 -1
- package/Build/Workers/{chunk-7WM2PX4V.js → chunk-UVO6COT2.js} +5 -5
- package/Build/Workers/{chunk-P3CK7MCY.js → chunk-VAL7DYNR.js} +4 -4
- package/Build/Workers/{chunk-EPYXRCDB.js → chunk-WBSY7HDY.js} +12 -12
- package/Build/Workers/{chunk-4S7IE3LB.js → chunk-XDWCTQCZ.js} +2 -2
- package/Build/Workers/{chunk-QN67VG36.js → chunk-XLXSDIP5.js} +6 -6
- package/Build/Workers/{chunk-S4MCOY6I.js → chunk-XQ3SKCMM.js} +5 -5
- package/Build/Workers/{chunk-XZMBNNDX.js → chunk-YKU2Q3A2.js} +9 -9
- package/Build/Workers/{chunk-3VFEWOBI.js → chunk-ZMBHFYOX.js} +7 -7
- package/Build/Workers/{chunk-MPZHGZU6.js → chunk-ZSGUV73H.js} +4 -4
- 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 +987 -2320
- 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/BoundingRectangle.js +6 -8
- package/Source/Core/Color.js +1 -0
- package/Source/Core/InterpolationAlgorithm.js +57 -50
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/TerrainMesh.js +3 -3
- package/Source/Core/TerrainPicker.js +1 -0
- package/Source/Core/writeTextToCanvas.js +1 -0
- package/Source/DataSources/CzmlDataSource.js +12 -0
- package/Source/DataSources/KmlDataSource.js +528 -555
- package/Source/DataSources/PathGraphics.js +8 -1
- package/Source/DataSources/PathMode.js +27 -0
- package/Source/DataSources/PathVisualizer.js +298 -1
- package/Source/Renderer/Texture.js +1 -1
- package/Source/Renderer/VertexArray.js +1 -0
- package/Source/Scene/ArcGisMapService.js +1 -1
- package/Source/Scene/BillboardTexture.js +5 -3
- package/Source/Scene/Cesium3DTileOptimizations.js +4 -6
- package/Source/Scene/ClippingPlaneCollection.js +2 -2
- package/Source/Scene/ClippingPolygon.js +2 -0
- package/Source/Scene/ClippingPolygonCollection.js +2 -2
- package/Source/Scene/DerivedCommand.js +4 -0
- package/Source/Scene/Expression.js +6 -8
- package/Source/Scene/GlobeSurfaceShaderSet.js +501 -409
- package/Source/Scene/GlobeSurfaceTile.js +540 -401
- package/Source/Scene/GlobeSurfaceTileProvider.js +1259 -1146
- package/Source/Scene/GltfBufferViewLoader.js +3 -3
- package/Source/Scene/GltfLoader.js +1 -0
- package/Source/Scene/GltfLoaderUtil.js +20 -4
- package/Source/Scene/GltfPipeline/forEachTextureInMaterial.js +10 -0
- package/Source/Scene/GltfPipeline/removeUnusedElements.js +21 -11
- package/Source/Scene/ImageryLayer.js +2 -2
- package/Source/Scene/ImageryLayerCollection.js +2 -2
- package/Source/Scene/Material.js +1 -0
- package/Source/Scene/Model/Extensions/Gpm/GltfGpmLoader.js +4 -0
- package/Source/Scene/Model/Model.js +3 -0
- package/Source/Scene/Model/ModelUtility.js +1 -0
- package/Source/Scene/Picking.js +5 -0
- package/Source/Scene/PntsParser.js +1 -0
- package/Source/Scene/QuadtreePrimitive.js +3 -2
- package/Source/Scene/ResourceCacheKey.js +5 -5
- package/Source/Scene/Scene.js +1 -0
- package/Source/Scene/findMeshoptExtension.js +23 -0
- package/Source/Scene/renderBufferPointCollection.js +13 -8
- package/Source/Scene/renderBufferPolygonCollection.js +9 -13
- package/Source/Scene/renderBufferPolylineCollection.js +120 -192
- package/Source/Workers/decodeGoogleEarthEnterprisePacket.js +2 -2
- package/Source/Workers/incrementallyBuildTerrainPicker.js +2 -0
- package/index.d.ts +59 -254
- package/index.js +155 -153
- 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
|
-
|
|
34
|
-
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
42
|
-
|
|
62
|
+
/** @type {HeightmapTerrainData} */
|
|
63
|
+
this.terrainData = undefined;
|
|
43
64
|
|
|
44
|
-
|
|
45
|
-
|
|
65
|
+
/** @type {VertexArray} */
|
|
66
|
+
this.vertexArray = undefined;
|
|
46
67
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
79
|
+
this.terrainState = TerrainState.UNLOADED;
|
|
80
|
+
this.mesh = undefined;
|
|
81
|
+
this.fill = undefined;
|
|
61
82
|
|
|
62
|
-
|
|
83
|
+
this.pickBoundingSphere = new BoundingSphere();
|
|
63
84
|
|
|
64
|
-
|
|
65
|
-
|
|
85
|
+
this.surfaceShader = undefined;
|
|
86
|
+
this.isClipped = true;
|
|
66
87
|
|
|
67
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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.
|
|
149
|
+
const value = this.renderedMesh.pick(ray, cullBackFaces, mode, projection);
|
|
150
|
+
return Cartesian3.clone(value, result);
|
|
146
151
|
}
|
|
147
152
|
|
|
148
|
-
|
|
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
|
-
|
|
151
|
-
this.mesh = undefined;
|
|
152
|
-
this.fill = this.fill && this.fill.destroy();
|
|
162
|
+
this.terrainData = undefined;
|
|
153
163
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
this.vertexArray = undefined;
|
|
166
|
-
GlobeSurfaceTile._freeVertexArray(this.wireframeVertexArray);
|
|
167
|
-
this.wireframeVertexArray = undefined;
|
|
168
|
-
};
|
|
174
|
+
this.freeVertexArray();
|
|
175
|
+
}
|
|
169
176
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
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
|
-
|
|
200
|
-
|
|
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
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
354
|
+
/**
|
|
355
|
+
* @param {Ellipsoid} ellipsoid
|
|
356
|
+
* @param {FrameState} frameState
|
|
357
|
+
*/
|
|
358
|
+
addGeodeticSurfaceNormals(ellipsoid, frameState) {
|
|
359
|
+
toggleGeodeticSurfaceNormals(this, true, ellipsoid, frameState);
|
|
360
|
+
}
|
|
220
361
|
|
|
221
|
-
|
|
222
|
-
|
|
362
|
+
/**
|
|
363
|
+
* @param {FrameState} frameState
|
|
364
|
+
*/
|
|
365
|
+
removeGeodeticSurfaceNormals(frameState) {
|
|
366
|
+
toggleGeodeticSurfaceNormals(this, false, undefined, frameState);
|
|
367
|
+
}
|
|
223
368
|
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
terrainProvider,
|
|
236
|
-
frameState,
|
|
237
|
-
);
|
|
410
|
+
encoding.exaggeration = exaggeration;
|
|
411
|
+
encoding.exaggerationRelativeHeight = exaggerationRelativeHeight;
|
|
238
412
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
|
|
423
|
+
mesh.updateExaggeration(exaggeration, exaggerationRelativeHeight);
|
|
424
|
+
}
|
|
252
425
|
}
|
|
253
426
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
)
|
|
305
|
-
|
|
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
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
thisTileDoneLoading ||
|
|
311
|
-
defined(tileImagery.readyImagery);
|
|
487
|
+
if (!vertexArray.isDestroyed()) {
|
|
488
|
+
vertexArray.destroy();
|
|
489
|
+
}
|
|
312
490
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
-
|
|
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
|
-
|
|
323
|
-
|
|
519
|
+
return sourceTile;
|
|
520
|
+
}
|
|
324
521
|
|
|
325
|
-
|
|
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
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
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
|
-
|
|
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
|
-
|
|
510
|
-
|
|
511
|
-
|
|
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
|
-
|
|
584
|
-
|
|
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
|
|
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
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
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;
|