@cesium/engine 2.1.0 → 2.3.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 (240) hide show
  1. package/Build/Workers/{AttributeCompression-8a5a065e.js → AttributeCompression-f9f6c717.js} +1 -1
  2. package/Build/Workers/{AxisAlignedBoundingBox-a6f9f0e5.js → AxisAlignedBoundingBox-31fadcf0.js} +1 -1
  3. package/Build/Workers/{BoundingRectangle-b0a68595.js → BoundingRectangle-995f0079.js} +1 -1
  4. package/Build/Workers/{BoxGeometry-baedd794.js → BoxGeometry-7eb1af60.js} +1 -1
  5. package/Build/Workers/{Color-f85df1be.js → Color-2dc49658.js} +1 -1
  6. package/Build/Workers/{CoplanarPolygonGeometryLibrary-30516950.js → CoplanarPolygonGeometryLibrary-d7d972d6.js} +1 -1
  7. package/Build/Workers/{CorridorGeometryLibrary-5d5d3b3a.js → CorridorGeometryLibrary-1f5ef7b3.js} +1 -1
  8. package/Build/Workers/{CylinderGeometry-d899ae26.js → CylinderGeometry-23c67a6c.js} +1 -1
  9. package/Build/Workers/{CylinderGeometryLibrary-135b0858.js → CylinderGeometryLibrary-7bf291b4.js} +1 -1
  10. package/Build/Workers/{EllipseGeometry-a49f8449.js → EllipseGeometry-37014da4.js} +1 -1
  11. package/Build/Workers/{EllipseGeometryLibrary-cba7edde.js → EllipseGeometryLibrary-92ab6b1e.js} +1 -1
  12. package/Build/Workers/{EllipseOutlineGeometry-8095c8cb.js → EllipseOutlineGeometry-12b6fef5.js} +1 -1
  13. package/Build/Workers/{EllipsoidGeodesic-dcff5cbd.js → EllipsoidGeodesic-5b3623dc.js} +1 -1
  14. package/Build/Workers/{EllipsoidGeometry-ed93f571.js → EllipsoidGeometry-508da15c.js} +1 -1
  15. package/Build/Workers/{EllipsoidOutlineGeometry-e4854854.js → EllipsoidOutlineGeometry-40d97455.js} +1 -1
  16. package/Build/Workers/{EllipsoidRhumbLine-b672d507.js → EllipsoidRhumbLine-ef872433.js} +1 -1
  17. package/Build/Workers/{EllipsoidTangentPlane-7ae1aa9a.js → EllipsoidTangentPlane-46d4d9c2.js} +1 -1
  18. package/Build/Workers/{EncodedCartesian3-e8bbca36.js → EncodedCartesian3-57415c8a.js} +1 -1
  19. package/Build/Workers/{FrustumGeometry-b62db3e3.js → FrustumGeometry-38605e69.js} +32 -4
  20. package/Build/Workers/{GeometryAttribute-780af4fa.js → GeometryAttribute-a466e9c7.js} +1 -1
  21. package/Build/Workers/{GeometryInstance-3fb607b7.js → GeometryInstance-34d9e21e.js} +1 -1
  22. package/Build/Workers/{GeometryPipeline-36b61c99.js → GeometryPipeline-dcf79306.js} +1 -1
  23. package/Build/Workers/{IndexDatatype-b8f3e09d.js → IndexDatatype-2643aa47.js} +1 -1
  24. package/Build/Workers/{IntersectionTests-e889fcf0.js → IntersectionTests-88c49b2e.js} +1 -1
  25. package/Build/Workers/{Math-dad82b4d.js → Math-0a2ac845.js} +12 -2
  26. package/Build/Workers/{Matrix2-1e403d0e.js → Matrix2-e1298525.js} +1 -1
  27. package/Build/Workers/{Matrix3-fa806b97.js → Matrix3-41c58dde.js} +1 -1
  28. package/Build/Workers/{OrientedBoundingBox-43478ac8.js → OrientedBoundingBox-2dd47921.js} +5 -3
  29. package/Build/Workers/{Plane-c27e1ac6.js → Plane-4c3d403b.js} +1 -1
  30. package/Build/Workers/{PolygonGeometryLibrary-38a98276.js → PolygonGeometryLibrary-59126025.js} +1 -1
  31. package/Build/Workers/PolygonPipeline-1fe328c0.js +1344 -0
  32. package/Build/Workers/{PolylinePipeline-30e4cec9.js → PolylinePipeline-896735cc.js} +1 -1
  33. package/Build/Workers/{PolylineVolumeGeometryLibrary-90551d26.js → PolylineVolumeGeometryLibrary-9c0639f7.js} +1 -1
  34. package/Build/Workers/{PrimitivePipeline-558d9cb0.js → PrimitivePipeline-fc1a47ff.js} +1 -1
  35. package/Build/Workers/{RectangleGeometryLibrary-815c68df.js → RectangleGeometryLibrary-a23c9ebe.js} +1 -1
  36. package/Build/Workers/{TerrainEncoding-341ead52.js → TerrainEncoding-51b8b33b.js} +1 -1
  37. package/Build/Workers/Transforms-bc45e707.js +14699 -0
  38. package/Build/Workers/{WallGeometryLibrary-ccf90976.js → WallGeometryLibrary-007e9883.js} +1 -1
  39. package/Build/Workers/{WebMercatorProjection-76a3fcc0.js → WebMercatorProjection-13ed1a6e.js} +1 -1
  40. package/Build/Workers/{arrayRemoveDuplicates-fac118a8.js → arrayRemoveDuplicates-d2061e85.js} +1 -1
  41. package/Build/Workers/cesiumWorkerBootstrapper.js +1 -1
  42. package/Build/Workers/combineGeometry.js +1 -1
  43. package/Build/Workers/createBoxGeometry.js +1 -1
  44. package/Build/Workers/createBoxOutlineGeometry.js +1 -1
  45. package/Build/Workers/createCircleGeometry.js +1 -1
  46. package/Build/Workers/createCircleOutlineGeometry.js +1 -1
  47. package/Build/Workers/createCoplanarPolygonGeometry.js +1 -1
  48. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +1 -1
  49. package/Build/Workers/createCorridorGeometry.js +1 -1
  50. package/Build/Workers/createCorridorOutlineGeometry.js +1 -1
  51. package/Build/Workers/createCylinderGeometry.js +1 -1
  52. package/Build/Workers/createCylinderOutlineGeometry.js +1 -1
  53. package/Build/Workers/createEllipseGeometry.js +1 -1
  54. package/Build/Workers/createEllipseOutlineGeometry.js +1 -1
  55. package/Build/Workers/createEllipsoidGeometry.js +1 -1
  56. package/Build/Workers/createEllipsoidOutlineGeometry.js +1 -1
  57. package/Build/Workers/createFrustumGeometry.js +1 -1
  58. package/Build/Workers/createFrustumOutlineGeometry.js +1 -1
  59. package/Build/Workers/createGeometry.js +1 -1
  60. package/Build/Workers/createGroundPolylineGeometry.js +1 -1
  61. package/Build/Workers/createPlaneGeometry.js +1 -1
  62. package/Build/Workers/createPlaneOutlineGeometry.js +1 -1
  63. package/Build/Workers/createPolygonGeometry.js +1 -1
  64. package/Build/Workers/createPolygonOutlineGeometry.js +1 -1
  65. package/Build/Workers/createPolylineGeometry.js +1 -1
  66. package/Build/Workers/createPolylineVolumeGeometry.js +1 -1
  67. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +1 -1
  68. package/Build/Workers/createRectangleGeometry.js +1 -1
  69. package/Build/Workers/createRectangleOutlineGeometry.js +1 -1
  70. package/Build/Workers/createSimplePolylineGeometry.js +1 -1
  71. package/Build/Workers/createSphereGeometry.js +1 -1
  72. package/Build/Workers/createSphereOutlineGeometry.js +1 -1
  73. package/Build/Workers/createVectorTileClampedPolylines.js +1 -1
  74. package/Build/Workers/createVectorTileGeometries.js +1 -1
  75. package/Build/Workers/createVectorTilePoints.js +1 -1
  76. package/Build/Workers/createVectorTilePolygons.js +1 -1
  77. package/Build/Workers/createVectorTilePolylines.js +1 -1
  78. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +1 -1
  79. package/Build/Workers/createVerticesFromHeightmap.js +5 -8
  80. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +10 -15
  81. package/Build/Workers/createWallGeometry.js +1 -1
  82. package/Build/Workers/createWallOutlineGeometry.js +1 -1
  83. package/Build/Workers/decodeDraco.js +1 -1
  84. package/Build/Workers/decodeI3S.js +1 -1
  85. package/Build/Workers/package.js +1 -1
  86. package/Build/Workers/transferTypedArrayTest.js +1 -1
  87. package/Build/Workers/upsampleQuantizedTerrainMesh.js +1 -1
  88. package/Source/Core/ArcGISTiledElevationTerrainProvider.js +291 -191
  89. package/Source/Core/BingMapsGeocoderService.js +19 -1
  90. package/Source/Core/CartographicGeocoderService.js +15 -0
  91. package/Source/Core/CesiumTerrainProvider.js +571 -434
  92. package/Source/Core/Credit.js +1 -1
  93. package/Source/Core/CustomHeightmapTerrainProvider.js +12 -0
  94. package/Source/Core/EllipsoidTerrainProvider.js +17 -10
  95. package/Source/Core/FrustumGeometry.js +4 -3
  96. package/Source/Core/GeocoderService.js +32 -1
  97. package/Source/Core/GoogleEarthEnterpriseMetadata.js +86 -34
  98. package/Source/Core/GoogleEarthEnterpriseTerrainProvider.js +119 -82
  99. package/Source/Core/Ion.js +1 -1
  100. package/Source/Core/IonGeocoderService.js +17 -2
  101. package/Source/Core/IonResource.js +14 -3
  102. package/Source/Core/OpenCageGeocoderService.js +18 -1
  103. package/Source/Core/OrientedBoundingBox.js +4 -2
  104. package/Source/Core/OrthographicFrustum.js +13 -0
  105. package/Source/Core/PeliasGeocoderService.js +14 -1
  106. package/Source/Core/PerspectiveFrustum.js +14 -0
  107. package/Source/Core/Request.js +3 -2
  108. package/Source/Core/RequestScheduler.js +10 -5
  109. package/Source/Core/Resource.js +230 -236
  110. package/Source/Core/TerrainProvider.js +9 -14
  111. package/Source/Core/TileProviderError.js +8 -8
  112. package/Source/Core/VRTheWorldTerrainProvider.js +193 -124
  113. package/Source/Core/buildModuleUrl.js +4 -3
  114. package/Source/Core/createWorldTerrain.js +20 -2
  115. package/Source/Core/createWorldTerrainAsync.js +48 -0
  116. package/Source/Core/sampleTerrain.js +9 -10
  117. package/Source/Core/sampleTerrainMostDetailed.js +66 -72
  118. package/Source/DataSources/Cesium3DTilesetVisualizer.js +37 -26
  119. package/Source/DataSources/DataSourceDisplay.js +2 -2
  120. package/Source/DataSources/Entity.js +6 -1
  121. package/Source/DataSources/EntityCluster.js +126 -128
  122. package/Source/DataSources/ModelVisualizer.js +104 -34
  123. package/Source/DataSources/PolygonGraphics.js +1 -1
  124. package/Source/Renderer/UniformState.js +3 -2
  125. package/Source/Renderer/demodernizeShader.js +5 -5
  126. package/Source/Scene/ArcGisBaseMapType.js +12 -0
  127. package/Source/Scene/ArcGisMapServerImageryProvider.js +694 -376
  128. package/Source/Scene/ArcGisMapService.js +83 -0
  129. package/Source/Scene/BingMapsImageryProvider.js +511 -305
  130. package/Source/Scene/BufferLoader.js +29 -34
  131. package/Source/Scene/Camera.js +8 -7
  132. package/Source/Scene/Cesium3DTile.js +392 -254
  133. package/Source/Scene/Cesium3DTileBatchTable.js +2 -2
  134. package/Source/Scene/Cesium3DTileContent.js +16 -0
  135. package/Source/Scene/Cesium3DTileContentFactory.js +4 -4
  136. package/Source/Scene/Cesium3DTilePass.js +8 -11
  137. package/Source/Scene/Cesium3DTileStyleEngine.js +1 -1
  138. package/Source/Scene/Cesium3DTilesVoxelProvider.js +225 -117
  139. package/Source/Scene/Cesium3DTileset.js +756 -482
  140. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +301 -0
  141. package/Source/Scene/Cesium3DTilesetMostDetailedTraversal.js +33 -46
  142. package/Source/Scene/Cesium3DTilesetSkipTraversal.js +421 -0
  143. package/Source/Scene/Cesium3DTilesetTraversal.js +219 -671
  144. package/Source/Scene/ClassificationPrimitive.js +7 -0
  145. package/Source/Scene/Composite3DTileContent.js +69 -26
  146. package/Source/Scene/CreditDisplay.js +132 -20
  147. package/Source/Scene/DepthPlane.js +1 -1
  148. package/Source/Scene/Empty3DTileContent.js +31 -1
  149. package/Source/Scene/Geometry3DTileContent.js +47 -7
  150. package/Source/Scene/Globe.js +5 -1
  151. package/Source/Scene/GlobeSurfaceTile.js +2 -1
  152. package/Source/Scene/GlobeSurfaceTileProvider.js +53 -30
  153. package/Source/Scene/GltfBufferViewLoader.js +47 -91
  154. package/Source/Scene/GltfDracoLoader.js +110 -112
  155. package/Source/Scene/GltfImageLoader.js +71 -78
  156. package/Source/Scene/GltfIndexBufferLoader.js +108 -121
  157. package/Source/Scene/GltfJsonLoader.js +87 -74
  158. package/Source/Scene/GltfLoader.js +381 -300
  159. package/Source/Scene/GltfStructuralMetadataLoader.js +109 -110
  160. package/Source/Scene/GltfTextureLoader.js +97 -96
  161. package/Source/Scene/GltfVertexBufferLoader.js +128 -133
  162. package/Source/Scene/GoogleEarthEnterpriseImageryProvider.js +353 -225
  163. package/Source/Scene/GoogleEarthEnterpriseMapsProvider.js +491 -331
  164. package/Source/Scene/GridImageryProvider.js +267 -104
  165. package/Source/Scene/GroundPolylinePrimitive.js +12 -1
  166. package/Source/Scene/GroundPrimitive.js +8 -1
  167. package/Source/Scene/I3SDataProvider.js +214 -113
  168. package/Source/Scene/I3SFeature.js +7 -6
  169. package/Source/Scene/I3SLayer.js +26 -37
  170. package/Source/Scene/I3SNode.js +59 -66
  171. package/Source/Scene/Imagery.js +6 -1
  172. package/Source/Scene/ImageryLayer.js +299 -48
  173. package/Source/Scene/ImageryLayerCollection.js +26 -0
  174. package/Source/Scene/ImageryProvider.js +129 -111
  175. package/Source/Scene/Implicit3DTileContent.js +72 -23
  176. package/Source/Scene/ImplicitSubtree.js +66 -45
  177. package/Source/Scene/IonImageryProvider.js +482 -275
  178. package/Source/Scene/MapboxImageryProvider.js +272 -112
  179. package/Source/Scene/MapboxStyleImageryProvider.js +270 -111
  180. package/Source/Scene/MetadataSchemaLoader.js +26 -36
  181. package/Source/Scene/Model/B3dmLoader.js +42 -46
  182. package/Source/Scene/Model/GeoJsonLoader.js +8 -32
  183. package/Source/Scene/Model/I3dmLoader.js +48 -74
  184. package/Source/Scene/Model/MaterialPipelineStage.js +12 -12
  185. package/Source/Scene/Model/Model.js +514 -135
  186. package/Source/Scene/Model/Model3DTileContent.js +83 -31
  187. package/Source/Scene/Model/ModelAnimationCollection.js +3 -3
  188. package/Source/Scene/Model/ModelDrawCommand.js +15 -26
  189. package/Source/Scene/Model/ModelUtility.js +16 -16
  190. package/Source/Scene/Model/PntsLoader.js +27 -32
  191. package/Source/Scene/Model/UniformType.js +1 -1
  192. package/Source/Scene/Multiple3DTileContent.js +134 -115
  193. package/Source/Scene/Picking.js +3 -2
  194. package/Source/Scene/PointCloud.js +11 -19
  195. package/Source/Scene/Primitive.js +20 -0
  196. package/Source/Scene/QuadtreePrimitive.js +5 -2
  197. package/Source/Scene/QuadtreeTileProvider.js +4 -8
  198. package/Source/Scene/ResourceCache.js +47 -105
  199. package/Source/Scene/ResourceCacheStatistics.js +24 -58
  200. package/Source/Scene/ResourceLoader.js +5 -17
  201. package/Source/Scene/ResourceLoaderState.js +12 -4
  202. package/Source/Scene/Scene.js +65 -0
  203. package/Source/Scene/SceneTransforms.js +3 -2
  204. package/Source/Scene/ScreenSpaceCameraController.js +2 -2
  205. package/Source/Scene/SingleTileImageryProvider.js +382 -209
  206. package/Source/Scene/Terrain.js +196 -0
  207. package/Source/Scene/TileCoordinatesImageryProvider.js +267 -104
  208. package/Source/Scene/TileMapServiceImageryProvider.js +177 -85
  209. package/Source/Scene/Tileset3DTileContent.js +47 -5
  210. package/Source/Scene/TimeDynamicPointCloud.js +15 -2
  211. package/Source/Scene/UrlTemplateImageryProvider.js +343 -215
  212. package/Source/Scene/Vector3DTileClampedPolylines.js +96 -84
  213. package/Source/Scene/Vector3DTileContent.js +47 -22
  214. package/Source/Scene/Vector3DTileGeometry.js +57 -52
  215. package/Source/Scene/Vector3DTilePoints.js +97 -81
  216. package/Source/Scene/Vector3DTilePolygons.js +118 -117
  217. package/Source/Scene/Vector3DTilePolylines.js +86 -82
  218. package/Source/Scene/Vector3DTilePrimitive.js +0 -1
  219. package/Source/Scene/VoxelContent.js +61 -63
  220. package/Source/Scene/VoxelPrimitive.js +39 -91
  221. package/Source/Scene/VoxelProvider.js +2 -2
  222. package/Source/Scene/WebMapServiceImageryProvider.js +272 -111
  223. package/Source/Scene/WebMapTileServiceImageryProvider.js +270 -107
  224. package/Source/Scene/computeFlyToLocationForRectangle.js +33 -37
  225. package/Source/Scene/createOsmBuildings.js +6 -0
  226. package/Source/Scene/createOsmBuildingsAsync.js +82 -0
  227. package/Source/Scene/createWorldImagery.js +14 -5
  228. package/Source/Scene/createWorldImageryAsync.js +39 -0
  229. package/Source/Shaders/AtmosphereCommon.glsl +51 -8
  230. package/Source/Shaders/AtmosphereCommon.js +51 -8
  231. package/Source/Shaders/PostProcessStages/AmbientOcclusionGenerate.glsl +1 -1
  232. package/Source/Shaders/PostProcessStages/AmbientOcclusionGenerate.js +1 -1
  233. package/Source/Shaders/PostProcessStages/AmbientOcclusionModulate.glsl +3 -3
  234. package/Source/Shaders/PostProcessStages/AmbientOcclusionModulate.js +3 -3
  235. package/Source/Widget/CesiumWidget.js +67 -27
  236. package/index.d.ts +2429 -1475
  237. package/index.js +324 -315
  238. package/package.json +4 -4
  239. package/Build/Workers/PolygonPipeline-d31ff61c.js +0 -1345
  240. package/Build/Workers/Transforms-9e9df299.js +0 -14714
@@ -1,16 +1,18 @@
1
1
  import AttributeCompression from "./AttributeCompression.js";
2
2
  import BoundingSphere from "./BoundingSphere.js";
3
3
  import Cartesian3 from "./Cartesian3.js";
4
+ import Check from "./Check.js";
4
5
  import Credit from "./Credit.js";
5
6
  import defaultValue from "./defaultValue.js";
6
7
  import defined from "./defined.js";
7
- import DeveloperError from "./DeveloperError.js";
8
+ import deprecationWarning from "./deprecationWarning.js";
8
9
  import Event from "./Event.js";
9
10
  import GeographicTilingScheme from "./GeographicTilingScheme.js";
10
11
  import WebMercatorTilingScheme from "./WebMercatorTilingScheme.js";
11
12
  import getJsonFromTypedArray from "./getJsonFromTypedArray.js";
12
13
  import HeightmapTerrainData from "./HeightmapTerrainData.js";
13
14
  import IndexDatatype from "./IndexDatatype.js";
15
+ import IonResource from "./IonResource.js";
14
16
  import OrientedBoundingBox from "./OrientedBoundingBox.js";
15
17
  import QuantizedMeshTerrainData from "./QuantizedMeshTerrainData.js";
16
18
  import Request from "./Request.js";
@@ -37,6 +39,415 @@ function LayerInformation(layer) {
37
39
  }
38
40
 
39
41
  /**
42
+ * @typedef {Object} CesiumTerrainProvider.ConstructorOptions
43
+ *
44
+ * Initialization options for the CesiumTerrainProvider constructor
45
+ *
46
+ * @property {boolean} [requestVertexNormals=false] Flag that indicates if the client should request additional lighting information from the server, in the form of per vertex normals if available.
47
+ * @property {boolean} [requestWaterMask=false] Flag that indicates if the client should request per tile water masks from the server, if available.
48
+ * @property {boolean} [requestMetadata=true] Flag that indicates if the client should request per tile metadata from the server, if available.
49
+ * @property {Ellipsoid} [ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used.
50
+ * @property {Credit|string} [credit] A credit for the data source, which is displayed on the canvas.
51
+ * @property {Resource|string|Promise<Resource>|Promise<string>} [url] The URL of the Cesium terrain server. Deprecated.
52
+ */
53
+
54
+ /**
55
+ * Used to track creation details while fetching initial metadata
56
+ *
57
+ * @constructor
58
+ * @private
59
+ *
60
+ * @param {CesiumTerrainProvider.ConstructorOptions} options An object describing initialization options
61
+ */
62
+ function TerrainProviderBuilder(options) {
63
+ this.requestVertexNormals = defaultValue(options.requestVertexNormals, false);
64
+ this.requestWaterMask = defaultValue(options.requestWaterMask, false);
65
+ this.requestMetadata = defaultValue(options.requestMetadata, true);
66
+ this.ellipsoid = options.ellipsoid;
67
+
68
+ this.heightmapWidth = 65;
69
+ this.heightmapStructure = undefined;
70
+ this.hasWaterMask = false;
71
+ this.hasMetadata = false;
72
+ this.hasVertexNormals = false;
73
+ this.scheme = undefined;
74
+
75
+ this.lastResource = undefined;
76
+ this.layerJsonResource = undefined;
77
+ this.previousError = undefined;
78
+ this.availability = undefined;
79
+ this.tilingScheme = undefined;
80
+ this.levelZeroMaximumGeometricError = undefined;
81
+ this.heightmapStructure = undefined;
82
+ this.layers = [];
83
+ this.attribution = "";
84
+ this.overallAvailability = [];
85
+ this.overallMaxZoom = 0;
86
+ this.tileCredits = [];
87
+ }
88
+
89
+ /**
90
+ * Complete CesiumTerrainProvider creation based on builder values.
91
+ *
92
+ * @private
93
+ *
94
+ * @param {CesiumTerrainProvider} provider
95
+ */
96
+ TerrainProviderBuilder.prototype.build = function (provider) {
97
+ provider._heightmapWidth = this.heightmapWidth;
98
+ provider._scheme = this.scheme;
99
+
100
+ // ion resources have a credits property we can use for additional attribution.
101
+ const credits = defined(this.lastResource.credits)
102
+ ? this.lastResource.credits
103
+ : [];
104
+ provider._tileCredits = credits.concat(this.tileCredits);
105
+ provider._availability = this.availability;
106
+ provider._tilingScheme = this.tilingScheme;
107
+ provider._requestWaterMask = this.requestWaterMask;
108
+ provider._levelZeroMaximumGeometricError = this.levelZeroMaximumGeometricError;
109
+ provider._heightmapStructure = this.heightmapStructure;
110
+ provider._layers = this.layers;
111
+
112
+ provider._hasWaterMask = this.hasWaterMask;
113
+ provider._hasVertexNormals = this.hasVertexNormals;
114
+ provider._hasMetadata = this.hasMetadata;
115
+
116
+ provider._ready = true;
117
+ };
118
+
119
+ async function parseMetadataSuccess(terrainProviderBuilder, data, provider) {
120
+ if (!data.format) {
121
+ const message = "The tile format is not specified in the layer.json file.";
122
+ terrainProviderBuilder.previousError = TileProviderError.reportError(
123
+ terrainProviderBuilder.previousError,
124
+ provider,
125
+ defined(provider) ? provider._errorEvent : undefined,
126
+ message
127
+ );
128
+
129
+ throw new RuntimeError(message);
130
+ }
131
+
132
+ if (!data.tiles || data.tiles.length === 0) {
133
+ const message =
134
+ "The layer.json file does not specify any tile URL templates.";
135
+ terrainProviderBuilder.previousError = TileProviderError.reportError(
136
+ terrainProviderBuilder.previousError,
137
+ provider,
138
+ defined(provider) ? provider._errorEvent : undefined,
139
+ message
140
+ );
141
+
142
+ throw new RuntimeError(message);
143
+ }
144
+
145
+ let hasVertexNormals = false;
146
+ let hasWaterMask = false;
147
+ let hasMetadata = false;
148
+ let littleEndianExtensionSize = true;
149
+ let isHeightmap = false;
150
+ if (data.format === "heightmap-1.0") {
151
+ isHeightmap = true;
152
+ if (!defined(terrainProviderBuilder.heightmapStructure)) {
153
+ terrainProviderBuilder.heightmapStructure = {
154
+ heightScale: 1.0 / 5.0,
155
+ heightOffset: -1000.0,
156
+ elementsPerHeight: 1,
157
+ stride: 1,
158
+ elementMultiplier: 256.0,
159
+ isBigEndian: false,
160
+ lowestEncodedHeight: 0,
161
+ highestEncodedHeight: 256 * 256 - 1,
162
+ };
163
+ }
164
+ hasWaterMask = true;
165
+ terrainProviderBuilder.requestWaterMask = true;
166
+ } else if (data.format.indexOf("quantized-mesh-1.") !== 0) {
167
+ const message = `The tile format "${data.format}" is invalid or not supported.`;
168
+ terrainProviderBuilder.previousError = TileProviderError.reportError(
169
+ terrainProviderBuilder.previousError,
170
+ provider,
171
+ defined(provider) ? provider._errorEvent : undefined,
172
+ message
173
+ );
174
+
175
+ throw new RuntimeError(message);
176
+ }
177
+
178
+ const tileUrlTemplates = data.tiles;
179
+
180
+ const maxZoom = data.maxzoom;
181
+ terrainProviderBuilder.overallMaxZoom = Math.max(
182
+ terrainProviderBuilder.overallMaxZoom,
183
+ maxZoom
184
+ );
185
+
186
+ // Keeps track of which of the availability containing tiles have been loaded
187
+ if (!data.projection || data.projection === "EPSG:4326") {
188
+ terrainProviderBuilder.tilingScheme = new GeographicTilingScheme({
189
+ numberOfLevelZeroTilesX: 2,
190
+ numberOfLevelZeroTilesY: 1,
191
+ ellipsoid: terrainProviderBuilder.ellipsoid,
192
+ });
193
+ } else if (data.projection === "EPSG:3857") {
194
+ terrainProviderBuilder.tilingScheme = new WebMercatorTilingScheme({
195
+ numberOfLevelZeroTilesX: 1,
196
+ numberOfLevelZeroTilesY: 1,
197
+ ellipsoid: terrainProviderBuilder.ellipsoid,
198
+ });
199
+ } else {
200
+ const message = `The projection "${data.projection}" is invalid or not supported.`;
201
+ terrainProviderBuilder.previousError = TileProviderError.reportError(
202
+ terrainProviderBuilder.previousError,
203
+ provider,
204
+ defined(provider) ? provider._errorEvent : undefined,
205
+ message
206
+ );
207
+
208
+ throw new RuntimeError(message);
209
+ }
210
+
211
+ terrainProviderBuilder.levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(
212
+ terrainProviderBuilder.tilingScheme.ellipsoid,
213
+ terrainProviderBuilder.heightmapWidth,
214
+ terrainProviderBuilder.tilingScheme.getNumberOfXTilesAtLevel(0)
215
+ );
216
+ if (!data.scheme || data.scheme === "tms" || data.scheme === "slippyMap") {
217
+ terrainProviderBuilder.scheme = data.scheme;
218
+ } else {
219
+ const message = `The scheme "${data.scheme}" is invalid or not supported.`;
220
+ terrainProviderBuilder.previousError = TileProviderError.reportError(
221
+ terrainProviderBuilder.previousError,
222
+ provider,
223
+ defined(provider) ? provider._errorEvent : undefined,
224
+ message
225
+ );
226
+
227
+ throw new RuntimeError(message);
228
+ }
229
+
230
+ let availabilityTilesLoaded;
231
+
232
+ // The vertex normals defined in the 'octvertexnormals' extension is identical to the original
233
+ // contents of the original 'vertexnormals' extension. 'vertexnormals' extension is now
234
+ // deprecated, as the extensionLength for this extension was incorrectly using big endian.
235
+ // We maintain backwards compatibility with the legacy 'vertexnormal' implementation
236
+ // by setting the _littleEndianExtensionSize to false. Always prefer 'octvertexnormals'
237
+ // over 'vertexnormals' if both extensions are supported by the server.
238
+ if (
239
+ defined(data.extensions) &&
240
+ data.extensions.indexOf("octvertexnormals") !== -1
241
+ ) {
242
+ hasVertexNormals = true;
243
+ } else if (
244
+ defined(data.extensions) &&
245
+ data.extensions.indexOf("vertexnormals") !== -1
246
+ ) {
247
+ hasVertexNormals = true;
248
+ littleEndianExtensionSize = false;
249
+ }
250
+ if (defined(data.extensions) && data.extensions.indexOf("watermask") !== -1) {
251
+ hasWaterMask = true;
252
+ }
253
+ if (defined(data.extensions) && data.extensions.indexOf("metadata") !== -1) {
254
+ hasMetadata = true;
255
+ }
256
+
257
+ const availabilityLevels = data.metadataAvailability;
258
+ const availableTiles = data.available;
259
+ let availability;
260
+ if (defined(availableTiles) && !defined(availabilityLevels)) {
261
+ availability = new TileAvailability(
262
+ terrainProviderBuilder.tilingScheme,
263
+ availableTiles.length
264
+ );
265
+ for (let level = 0; level < availableTiles.length; ++level) {
266
+ const rangesAtLevel = availableTiles[level];
267
+ const yTiles = terrainProviderBuilder.tilingScheme.getNumberOfYTilesAtLevel(
268
+ level
269
+ );
270
+ if (!defined(terrainProviderBuilder.overallAvailability[level])) {
271
+ terrainProviderBuilder.overallAvailability[level] = [];
272
+ }
273
+
274
+ for (
275
+ let rangeIndex = 0;
276
+ rangeIndex < rangesAtLevel.length;
277
+ ++rangeIndex
278
+ ) {
279
+ const range = rangesAtLevel[rangeIndex];
280
+ const yStart = yTiles - range.endY - 1;
281
+ const yEnd = yTiles - range.startY - 1;
282
+ terrainProviderBuilder.overallAvailability[level].push([
283
+ range.startX,
284
+ yStart,
285
+ range.endX,
286
+ yEnd,
287
+ ]);
288
+ availability.addAvailableTileRange(
289
+ level,
290
+ range.startX,
291
+ yStart,
292
+ range.endX,
293
+ yEnd
294
+ );
295
+ }
296
+ }
297
+ } else if (defined(availabilityLevels)) {
298
+ availabilityTilesLoaded = new TileAvailability(
299
+ terrainProviderBuilder.tilingScheme,
300
+ maxZoom
301
+ );
302
+ availability = new TileAvailability(
303
+ terrainProviderBuilder.tilingScheme,
304
+ maxZoom
305
+ );
306
+ terrainProviderBuilder.overallAvailability[0] = [[0, 0, 1, 0]];
307
+ availability.addAvailableTileRange(0, 0, 0, 1, 0);
308
+ }
309
+
310
+ terrainProviderBuilder.hasWaterMask =
311
+ terrainProviderBuilder.hasWaterMask || hasWaterMask;
312
+ terrainProviderBuilder.hasVertexNormals =
313
+ terrainProviderBuilder.hasVertexNormals || hasVertexNormals;
314
+ terrainProviderBuilder.hasMetadata =
315
+ terrainProviderBuilder.hasMetadata || hasMetadata;
316
+
317
+ if (defined(data.attribution)) {
318
+ if (terrainProviderBuilder.attribution.length > 0) {
319
+ terrainProviderBuilder.attribution += " ";
320
+ }
321
+ terrainProviderBuilder.attribution += data.attribution;
322
+ }
323
+
324
+ terrainProviderBuilder.layers.push(
325
+ new LayerInformation({
326
+ resource: terrainProviderBuilder.lastResource,
327
+ version: data.version,
328
+ isHeightmap: isHeightmap,
329
+ tileUrlTemplates: tileUrlTemplates,
330
+ availability: availability,
331
+ hasVertexNormals: hasVertexNormals,
332
+ hasWaterMask: hasWaterMask,
333
+ hasMetadata: hasMetadata,
334
+ availabilityLevels: availabilityLevels,
335
+ availabilityTilesLoaded: availabilityTilesLoaded,
336
+ littleEndianExtensionSize: littleEndianExtensionSize,
337
+ })
338
+ );
339
+
340
+ const parentUrl = data.parentUrl;
341
+ if (defined(parentUrl)) {
342
+ if (!defined(availability)) {
343
+ console.log(
344
+ "A layer.json can't have a parentUrl if it does't have an available array."
345
+ );
346
+ return true;
347
+ }
348
+
349
+ terrainProviderBuilder.lastResource = terrainProviderBuilder.lastResource.getDerivedResource(
350
+ {
351
+ url: parentUrl,
352
+ }
353
+ );
354
+ terrainProviderBuilder.lastResource.appendForwardSlash(); // Terrain always expects a directory
355
+ terrainProviderBuilder.layerJsonResource = terrainProviderBuilder.lastResource.getDerivedResource(
356
+ {
357
+ url: "layer.json",
358
+ }
359
+ );
360
+ await requestLayerJson(terrainProviderBuilder);
361
+ return true;
362
+ }
363
+
364
+ return true;
365
+ }
366
+
367
+ function parseMetadataFailure(terrainProviderBuilder, error, provider) {
368
+ let message = `An error occurred while accessing ${terrainProviderBuilder.layerJsonResource.url}.`;
369
+ if (defined(error)) {
370
+ message += `\n${error.message}`;
371
+ }
372
+
373
+ terrainProviderBuilder.previousError = TileProviderError.reportError(
374
+ terrainProviderBuilder.previousError,
375
+ provider,
376
+ defined(provider) ? provider._errorEvent : undefined,
377
+ message
378
+ );
379
+
380
+ // If we can retry, do so. Otherwise throw the error.
381
+ if (terrainProviderBuilder.previousError.retry) {
382
+ return requestLayerJson(terrainProviderBuilder, provider);
383
+ }
384
+
385
+ throw new RuntimeError(message);
386
+ }
387
+
388
+ async function metadataSuccess(terrainProviderBuilder, data, provider) {
389
+ await parseMetadataSuccess(terrainProviderBuilder, data, provider);
390
+
391
+ const length = terrainProviderBuilder.overallAvailability.length;
392
+ if (length > 0) {
393
+ const availability = (terrainProviderBuilder.availability = new TileAvailability(
394
+ terrainProviderBuilder.tilingScheme,
395
+ terrainProviderBuilder.overallMaxZoom
396
+ ));
397
+ for (let level = 0; level < length; ++level) {
398
+ const levelRanges = terrainProviderBuilder.overallAvailability[level];
399
+ for (let i = 0; i < levelRanges.length; ++i) {
400
+ const range = levelRanges[i];
401
+ availability.addAvailableTileRange(
402
+ level,
403
+ range[0],
404
+ range[1],
405
+ range[2],
406
+ range[3]
407
+ );
408
+ }
409
+ }
410
+ }
411
+
412
+ if (terrainProviderBuilder.attribution.length > 0) {
413
+ const layerJsonCredit = new Credit(terrainProviderBuilder.attribution);
414
+ terrainProviderBuilder.tileCredits.push(layerJsonCredit);
415
+ }
416
+
417
+ return true;
418
+ }
419
+
420
+ async function requestLayerJson(terrainProviderBuilder, provider) {
421
+ try {
422
+ const data = await terrainProviderBuilder.layerJsonResource.fetchJson();
423
+ return metadataSuccess(terrainProviderBuilder, data, provider);
424
+ } catch (error) {
425
+ // If the metadata is not found, assume this is a pre-metadata heightmap tileset.
426
+ if (defined(error) && error.statusCode === 404) {
427
+ await parseMetadataSuccess(
428
+ terrainProviderBuilder,
429
+ {
430
+ tilejson: "2.1.0",
431
+ format: "heightmap-1.0",
432
+ version: "1.0.0",
433
+ scheme: "tms",
434
+ tiles: ["{z}/{x}/{y}.terrain?v={version}"],
435
+ },
436
+ provider
437
+ );
438
+
439
+ return true;
440
+ }
441
+
442
+ return parseMetadataFailure(terrainProviderBuilder, error, provider);
443
+ }
444
+ }
445
+
446
+ /**
447
+ * <div class="notice">
448
+ * To construct a CesiumTerrainProvider, call {@link CesiumTerrainProvider.fromIonAssetId} or {@link CesiumTerrainProvider.fromUrl}. Do not call the constructor directly.
449
+ * </div>
450
+ *
40
451
  * A {@link TerrainProvider} that accesses terrain data in a Cesium terrain format.
41
452
  * Terrain formats can be one of the following:
42
453
  * <ul>
@@ -47,38 +458,34 @@ function LayerInformation(layer) {
47
458
  * @alias CesiumTerrainProvider
48
459
  * @constructor
49
460
  *
50
- * @param {object} options Object with the following properties:
51
- * @param {Resource|string|Promise<Resource>|Promise<string>} options.url The URL of the Cesium terrain server.
52
- * @param {boolean} [options.requestVertexNormals=false] Flag that indicates if the client should request additional lighting information from the server, in the form of per vertex normals if available.
53
- * @param {boolean} [options.requestWaterMask=false] Flag that indicates if the client should request per tile water masks from the server, if available.
54
- * @param {boolean} [options.requestMetadata=true] Flag that indicates if the client should request per tile metadata from the server, if available.
55
- * @param {Ellipsoid} [options.ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used.
56
- * @param {Credit|string} [options.credit] A credit for the data source, which is displayed on the canvas.
57
- *
461
+ * @param {CesiumTerrainProvider.ConstructorOptions} [options] An object describing initialization options
58
462
  *
59
463
  * @example
60
464
  * // Create Arctic DEM terrain with normals.
61
- * const viewer = new Cesium.Viewer('cesiumContainer', {
62
- * terrainProvider : new Cesium.CesiumTerrainProvider({
63
- * url : Cesium.IonResource.fromAssetId(3956),
64
- * requestVertexNormals : true
465
+ * try {
466
+ * const viewer = new Cesium.Viewer("cesiumContainer", {
467
+ * terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(3956, {
468
+ * requestVertexNormals: true
65
469
  * })
66
- * });
470
+ * });
471
+ * } catch (error) {
472
+ * console.log(error);
473
+ * }
67
474
  *
68
475
  * @see createWorldTerrain
476
+ * @see CesiumTerrainProvider.fromUrl
477
+ * @see CesiumTerrainProvider.fromIonAssetId
69
478
  * @see TerrainProvider
70
479
  */
71
480
  function CesiumTerrainProvider(options) {
72
- //>>includeStart('debug', pragmas.debug)
73
- if (!defined(options) || !defined(options.url)) {
74
- throw new DeveloperError("options.url is required.");
75
- }
76
- //>>includeEnd('debug');
481
+ options = defaultValue(options, defaultValue.EMPTY_OBJECT);
77
482
 
78
- this._heightmapWidth = 65;
483
+ this._heightmapWidth = undefined;
79
484
  this._heightmapStructure = undefined;
80
485
  this._hasWaterMask = false;
81
486
  this._hasVertexNormals = false;
487
+ this._hasMetadata = false;
488
+ this._scheme = undefined;
82
489
  this._ellipsoid = options.ellipsoid;
83
490
 
84
491
  /**
@@ -117,359 +524,48 @@ function CesiumTerrainProvider(options) {
117
524
  this._credit = credit;
118
525
 
119
526
  this._availability = undefined;
527
+ this._tilingScheme = undefined;
528
+ this._levelZeroMaximumGeometricError = undefined;
529
+ this._layers = undefined;
120
530
 
121
531
  this._ready = false;
122
532
  this._tileCredits = undefined;
123
533
 
124
- const that = this;
125
- let lastResource;
126
- let layerJsonResource;
127
- let metadataError;
128
-
129
- const layers = (this._layers = []);
130
- let attribution = "";
131
- const overallAvailability = [];
132
- let overallMaxZoom = 0;
133
- this._readyPromise = Promise.resolve(options.url).then(function (url) {
134
- const resource = Resource.createIfNeeded(url);
135
- resource.appendForwardSlash();
136
- lastResource = resource;
137
- layerJsonResource = lastResource.getDerivedResource({
138
- url: "layer.json",
139
- });
140
-
141
- // ion resources have a credits property we can use for additional attribution.
142
- that._tileCredits = resource.credits;
143
-
144
- return requestLayerJson();
145
- });
146
-
147
- function parseMetadataSuccess(data) {
148
- let message;
149
-
150
- if (!data.format) {
151
- message = "The tile format is not specified in the layer.json file.";
152
- metadataError = TileProviderError.reportError(
153
- metadataError,
154
- that,
155
- that._errorEvent,
156
- message
157
- );
158
- if (metadataError.retry) {
159
- return requestLayerJson();
160
- }
161
- return Promise.reject(new RuntimeError(message));
162
- }
163
-
164
- if (!data.tiles || data.tiles.length === 0) {
165
- message = "The layer.json file does not specify any tile URL templates.";
166
- metadataError = TileProviderError.reportError(
167
- metadataError,
168
- that,
169
- that._errorEvent,
170
- message
171
- );
172
- if (metadataError.retry) {
173
- return requestLayerJson();
174
- }
175
- return Promise.reject(new RuntimeError(message));
176
- }
177
-
178
- let hasVertexNormals = false;
179
- let hasWaterMask = false;
180
- let hasMetadata = false;
181
- let littleEndianExtensionSize = true;
182
- let isHeightmap = false;
183
- if (data.format === "heightmap-1.0") {
184
- isHeightmap = true;
185
- if (!defined(that._heightmapStructure)) {
186
- that._heightmapStructure = {
187
- heightScale: 1.0 / 5.0,
188
- heightOffset: -1000.0,
189
- elementsPerHeight: 1,
190
- stride: 1,
191
- elementMultiplier: 256.0,
192
- isBigEndian: false,
193
- lowestEncodedHeight: 0,
194
- highestEncodedHeight: 256 * 256 - 1,
195
- };
196
- }
197
- hasWaterMask = true;
198
- that._requestWaterMask = true;
199
- } else if (data.format.indexOf("quantized-mesh-1.") !== 0) {
200
- message = `The tile format "${data.format}" is invalid or not supported.`;
201
- metadataError = TileProviderError.reportError(
202
- metadataError,
203
- that,
204
- that._errorEvent,
205
- message
206
- );
207
- if (metadataError.retry) {
208
- return requestLayerJson();
209
- }
210
- return Promise.reject(new RuntimeError(message));
211
- }
212
-
213
- const tileUrlTemplates = data.tiles;
214
-
215
- const maxZoom = data.maxzoom;
216
- overallMaxZoom = Math.max(overallMaxZoom, maxZoom);
217
- // Keeps track of which of the availablity containing tiles have been loaded
218
-
219
- if (!data.projection || data.projection === "EPSG:4326") {
220
- that._tilingScheme = new GeographicTilingScheme({
221
- numberOfLevelZeroTilesX: 2,
222
- numberOfLevelZeroTilesY: 1,
223
- ellipsoid: that._ellipsoid,
224
- });
225
- } else if (data.projection === "EPSG:3857") {
226
- that._tilingScheme = new WebMercatorTilingScheme({
227
- numberOfLevelZeroTilesX: 1,
228
- numberOfLevelZeroTilesY: 1,
229
- ellipsoid: that._ellipsoid,
230
- });
231
- } else {
232
- message = `The projection "${data.projection}" is invalid or not supported.`;
233
- metadataError = TileProviderError.reportError(
234
- metadataError,
235
- that,
236
- that._errorEvent,
237
- message
238
- );
239
- if (metadataError.retry) {
240
- return requestLayerJson();
241
- }
242
- return Promise.reject(new RuntimeError(message));
243
- }
244
-
245
- that._levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(
246
- that._tilingScheme.ellipsoid,
247
- that._heightmapWidth,
248
- that._tilingScheme.getNumberOfXTilesAtLevel(0)
534
+ this._readyPromise = Promise.resolve(true);
535
+ if (defined(options.url)) {
536
+ deprecationWarning(
537
+ "CesiumTerrainProvider options.url",
538
+ "options.url was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use CesiumTerrainProvider.fromIonAssetId or CesiumTerrainProvider.fromUrl instead."
249
539
  );
250
- if (!data.scheme || data.scheme === "tms" || data.scheme === "slippyMap") {
251
- that._scheme = data.scheme;
252
- } else {
253
- message = `The scheme "${data.scheme}" is invalid or not supported.`;
254
- metadataError = TileProviderError.reportError(
255
- metadataError,
256
- that,
257
- that._errorEvent,
258
- message
259
- );
260
- if (metadataError.retry) {
261
- return requestLayerJson();
262
- }
263
- return Promise.reject(new RuntimeError(message));
264
- }
265
-
266
- let availabilityTilesLoaded;
267
-
268
- // The vertex normals defined in the 'octvertexnormals' extension is identical to the original
269
- // contents of the original 'vertexnormals' extension. 'vertexnormals' extension is now
270
- // deprecated, as the extensionLength for this extension was incorrectly using big endian.
271
- // We maintain backwards compatibility with the legacy 'vertexnormal' implementation
272
- // by setting the _littleEndianExtensionSize to false. Always prefer 'octvertexnormals'
273
- // over 'vertexnormals' if both extensions are supported by the server.
274
- if (
275
- defined(data.extensions) &&
276
- data.extensions.indexOf("octvertexnormals") !== -1
277
- ) {
278
- hasVertexNormals = true;
279
- } else if (
280
- defined(data.extensions) &&
281
- data.extensions.indexOf("vertexnormals") !== -1
282
- ) {
283
- hasVertexNormals = true;
284
- littleEndianExtensionSize = false;
285
- }
286
- if (
287
- defined(data.extensions) &&
288
- data.extensions.indexOf("watermask") !== -1
289
- ) {
290
- hasWaterMask = true;
291
- }
292
- if (
293
- defined(data.extensions) &&
294
- data.extensions.indexOf("metadata") !== -1
295
- ) {
296
- hasMetadata = true;
297
- }
298
-
299
- const availabilityLevels = data.metadataAvailability;
300
- const availableTiles = data.available;
301
- let availability;
302
- if (defined(availableTiles) && !defined(availabilityLevels)) {
303
- availability = new TileAvailability(
304
- that._tilingScheme,
305
- availableTiles.length
306
- );
307
- for (let level = 0; level < availableTiles.length; ++level) {
308
- const rangesAtLevel = availableTiles[level];
309
- const yTiles = that._tilingScheme.getNumberOfYTilesAtLevel(level);
310
- if (!defined(overallAvailability[level])) {
311
- overallAvailability[level] = [];
312
- }
313
-
314
- for (
315
- let rangeIndex = 0;
316
- rangeIndex < rangesAtLevel.length;
317
- ++rangeIndex
318
- ) {
319
- const range = rangesAtLevel[rangeIndex];
320
- const yStart = yTiles - range.endY - 1;
321
- const yEnd = yTiles - range.startY - 1;
322
- overallAvailability[level].push([
323
- range.startX,
324
- yStart,
325
- range.endX,
326
- yEnd,
327
- ]);
328
- availability.addAvailableTileRange(
329
- level,
330
- range.startX,
331
- yStart,
332
- range.endX,
333
- yEnd
334
- );
335
- }
336
- }
337
- } else if (defined(availabilityLevels)) {
338
- availabilityTilesLoaded = new TileAvailability(
339
- that._tilingScheme,
340
- maxZoom
341
- );
342
- availability = new TileAvailability(that._tilingScheme, maxZoom);
343
- overallAvailability[0] = [[0, 0, 1, 0]];
344
- availability.addAvailableTileRange(0, 0, 0, 1, 0);
345
- }
346
-
347
- that._hasWaterMask = that._hasWaterMask || hasWaterMask;
348
- that._hasVertexNormals = that._hasVertexNormals || hasVertexNormals;
349
- that._hasMetadata = that._hasMetadata || hasMetadata;
350
- if (defined(data.attribution)) {
351
- if (attribution.length > 0) {
352
- attribution += " ";
353
- }
354
- attribution += data.attribution;
355
- }
356
-
357
- layers.push(
358
- new LayerInformation({
359
- resource: lastResource,
360
- version: data.version,
361
- isHeightmap: isHeightmap,
362
- tileUrlTemplates: tileUrlTemplates,
363
- availability: availability,
364
- hasVertexNormals: hasVertexNormals,
365
- hasWaterMask: hasWaterMask,
366
- hasMetadata: hasMetadata,
367
- availabilityLevels: availabilityLevels,
368
- availabilityTilesLoaded: availabilityTilesLoaded,
369
- littleEndianExtensionSize: littleEndianExtensionSize,
370
- })
540
+ this._readyPromise = CesiumTerrainProvider._initializeReadyPromise(
541
+ options,
542
+ this
371
543
  );
372
-
373
- const parentUrl = data.parentUrl;
374
- if (defined(parentUrl)) {
375
- if (!defined(availability)) {
376
- console.log(
377
- "A layer.json can't have a parentUrl if it does't have an available array."
378
- );
379
- return Promise.resolve(true);
380
- }
381
- lastResource = lastResource.getDerivedResource({
382
- url: parentUrl,
383
- });
384
- lastResource.appendForwardSlash(); // Terrain always expects a directory
385
- layerJsonResource = lastResource.getDerivedResource({
386
- url: "layer.json",
387
- });
388
- const parentMetadata = layerJsonResource.fetchJson();
389
- return Promise.resolve(parentMetadata)
390
- .then(parseMetadataSuccess)
391
- .catch(parseMetadataFailure);
392
- }
393
-
394
- return Promise.resolve(true);
395
544
  }
545
+ }
396
546
 
397
- function parseMetadataFailure(data) {
398
- const message = `An error occurred while accessing ${layerJsonResource.url}.`;
399
- metadataError = TileProviderError.reportError(
400
- metadataError,
401
- that,
402
- that._errorEvent,
403
- message
404
- );
405
- if (metadataError.retry) {
406
- return requestLayerJson();
547
+ // Exposed for deprecation
548
+ CesiumTerrainProvider._initializeReadyPromise = async function (
549
+ options,
550
+ provider
551
+ ) {
552
+ const url = await Promise.resolve(options.url);
553
+
554
+ const terrainProviderBuilder = new TerrainProviderBuilder(options);
555
+ const resource = Resource.createIfNeeded(url);
556
+ resource.appendForwardSlash();
557
+ terrainProviderBuilder.lastResource = resource;
558
+ terrainProviderBuilder.layerJsonResource = terrainProviderBuilder.lastResource.getDerivedResource(
559
+ {
560
+ url: "layer.json",
407
561
  }
408
- return Promise.reject(new RuntimeError(message));
409
- }
410
-
411
- function metadataSuccess(data) {
412
- return parseMetadataSuccess(data).then(function () {
413
- if (defined(metadataError)) {
414
- return;
415
- }
416
-
417
- const length = overallAvailability.length;
418
- if (length > 0) {
419
- const availability = (that._availability = new TileAvailability(
420
- that._tilingScheme,
421
- overallMaxZoom
422
- ));
423
- for (let level = 0; level < length; ++level) {
424
- const levelRanges = overallAvailability[level];
425
- for (let i = 0; i < levelRanges.length; ++i) {
426
- const range = levelRanges[i];
427
- availability.addAvailableTileRange(
428
- level,
429
- range[0],
430
- range[1],
431
- range[2],
432
- range[3]
433
- );
434
- }
435
- }
436
- }
437
-
438
- if (attribution.length > 0) {
439
- const layerJsonCredit = new Credit(attribution);
440
-
441
- if (defined(that._tileCredits)) {
442
- that._tileCredits.push(layerJsonCredit);
443
- } else {
444
- that._tileCredits = [layerJsonCredit];
445
- }
446
- }
562
+ );
447
563
 
448
- that._ready = true;
449
- return Promise.resolve(true);
450
- });
451
- }
564
+ await requestLayerJson(terrainProviderBuilder, provider);
565
+ terrainProviderBuilder.build(provider);
452
566
 
453
- function metadataFailure(data) {
454
- // If the metadata is not found, assume this is a pre-metadata heightmap tileset.
455
- if (defined(data) && data.statusCode === 404) {
456
- return metadataSuccess({
457
- tilejson: "2.1.0",
458
- format: "heightmap-1.0",
459
- version: "1.0.0",
460
- scheme: "tms",
461
- tiles: ["{z}/{x}/{y}.terrain?v={version}"],
462
- });
463
- }
464
- return parseMetadataFailure(data);
465
- }
466
-
467
- function requestLayerJson() {
468
- return Promise.resolve(layerJsonResource.fetchJson())
469
- .then(metadataSuccess)
470
- .catch(metadataFailure);
471
- }
472
- }
567
+ return true;
568
+ };
473
569
 
474
570
  /**
475
571
  * When using the Quantized-Mesh format, a tile may be returned that includes additional extensions, such as PerVertexNormals, watermask, etc.
@@ -783,8 +879,7 @@ function createQuantizedMeshTerrainData(provider, buffer, level, x, y, layer) {
783
879
  }
784
880
 
785
881
  /**
786
- * Requests the geometry for a given tile. This function should not be called before
787
- * {@link CesiumTerrainProvider#ready} returns true. The result must include terrain data and
882
+ * Requests the geometry for a given tile. The result must include terrain data and
788
883
  * may optionally include a water mask and an indication of which child tiles are available.
789
884
  *
790
885
  * @param {number} x The X coordinate of the tile for which to request geometry.
@@ -796,8 +891,6 @@ function createQuantizedMeshTerrainData(provider, buffer, level, x, y, layer) {
796
891
  * returns undefined instead of a promise, it is an indication that too many requests are already
797
892
  * pending and the request will be retried later.
798
893
  *
799
- * @exception {DeveloperError} This function must not be called before {@link CesiumTerrainProvider#ready}
800
- * returns true.
801
894
  */
802
895
  CesiumTerrainProvider.prototype.requestTileGeometry = function (
803
896
  x,
@@ -805,14 +898,6 @@ CesiumTerrainProvider.prototype.requestTileGeometry = function (
805
898
  level,
806
899
  request
807
900
  ) {
808
- //>>includeStart('debug', pragmas.debug)
809
- if (!this._ready) {
810
- throw new DeveloperError(
811
- "requestTileGeometry must not be called before the terrain provider is ready."
812
- );
813
- }
814
- //>>includeEnd('debug');
815
-
816
901
  const layers = this._layers;
817
902
  let layerToUse;
818
903
  const layerCount = layers.length;
@@ -879,7 +964,7 @@ function requestTileGeometry(provider, x, y, level, layerToUse, request) {
879
964
  defined(resource._ionEndpoint) &&
880
965
  !defined(resource._ionEndpoint.externalType)
881
966
  ) {
882
- // ion uses query paremeters to request extensions
967
+ // ion uses query parameters to request extensions
883
968
  if (extensionList.length !== 0) {
884
969
  query = { extensions: extensionList.join("-") };
885
970
  }
@@ -943,42 +1028,25 @@ Object.defineProperties(CesiumTerrainProvider.prototype, {
943
1028
 
944
1029
  /**
945
1030
  * Gets the credit to display when this terrain provider is active. Typically this is used to credit
946
- * the source of the terrain. This function should not be called before {@link CesiumTerrainProvider#ready} returns true.
1031
+ * the source of the terrain.
947
1032
  * @memberof CesiumTerrainProvider.prototype
948
1033
  * @type {Credit}
949
1034
  * @readonly
950
1035
  */
951
1036
  credit: {
952
1037
  get: function () {
953
- //>>includeStart('debug', pragmas.debug)
954
- if (!this._ready) {
955
- throw new DeveloperError(
956
- "credit must not be called before the terrain provider is ready."
957
- );
958
- }
959
- //>>includeEnd('debug');
960
-
961
1038
  return this._credit;
962
1039
  },
963
1040
  },
964
1041
 
965
1042
  /**
966
- * Gets the tiling scheme used by this provider. This function should
967
- * not be called before {@link CesiumTerrainProvider#ready} returns true.
1043
+ * Gets the tiling scheme used by this provider.
968
1044
  * @memberof CesiumTerrainProvider.prototype
969
1045
  * @type {GeographicTilingScheme}
970
1046
  * @readonly
971
1047
  */
972
1048
  tilingScheme: {
973
1049
  get: function () {
974
- //>>includeStart('debug', pragmas.debug)
975
- if (!this._ready) {
976
- throw new DeveloperError(
977
- "tilingScheme must not be called before the terrain provider is ready."
978
- );
979
- }
980
- //>>includeEnd('debug');
981
-
982
1050
  return this._tilingScheme;
983
1051
  },
984
1052
  },
@@ -988,9 +1056,14 @@ Object.defineProperties(CesiumTerrainProvider.prototype, {
988
1056
  * @memberof CesiumTerrainProvider.prototype
989
1057
  * @type {boolean}
990
1058
  * @readonly
1059
+ * @deprecated
991
1060
  */
992
1061
  ready: {
993
1062
  get: function () {
1063
+ deprecationWarning(
1064
+ "CesiumTerrainProvider.ready",
1065
+ "CesiumTerrainProvider.ready was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use CesiumTerrainProvider.fromIonAssetId or CesiumTerrainProvider.fromUrl instead."
1066
+ );
994
1067
  return this._ready;
995
1068
  },
996
1069
  },
@@ -1000,9 +1073,14 @@ Object.defineProperties(CesiumTerrainProvider.prototype, {
1000
1073
  * @memberof CesiumTerrainProvider.prototype
1001
1074
  * @type {Promise<boolean>}
1002
1075
  * @readonly
1076
+ * @deprecated
1003
1077
  */
1004
1078
  readyPromise: {
1005
1079
  get: function () {
1080
+ deprecationWarning(
1081
+ "CesiumTerrainProvider.readyPromise",
1082
+ "CesiumTerrainProvider.readyPromise was deprecated in CesiumJS 1.104. It will be in CesiumJS 1.107. Use CesiumTerrainProvider.fromIonAssetId or CesiumTerrainProvider.fromUrl instead."
1083
+ );
1006
1084
  return this._readyPromise;
1007
1085
  },
1008
1086
  },
@@ -1010,45 +1088,25 @@ Object.defineProperties(CesiumTerrainProvider.prototype, {
1010
1088
  /**
1011
1089
  * Gets a value indicating whether or not the provider includes a water mask. The water mask
1012
1090
  * indicates which areas of the globe are water rather than land, so they can be rendered
1013
- * as a reflective surface with animated waves. This function should not be
1014
- * called before {@link CesiumTerrainProvider#ready} returns true.
1091
+ * as a reflective surface with animated waves.
1015
1092
  * @memberof CesiumTerrainProvider.prototype
1016
1093
  * @type {boolean}
1017
1094
  * @readonly
1018
- * @exception {DeveloperError} This property must not be called before {@link CesiumTerrainProvider#ready}
1019
1095
  */
1020
1096
  hasWaterMask: {
1021
1097
  get: function () {
1022
- //>>includeStart('debug', pragmas.debug)
1023
- if (!this._ready) {
1024
- throw new DeveloperError(
1025
- "hasWaterMask must not be called before the terrain provider is ready."
1026
- );
1027
- }
1028
- //>>includeEnd('debug');
1029
-
1030
1098
  return this._hasWaterMask && this._requestWaterMask;
1031
1099
  },
1032
1100
  },
1033
1101
 
1034
1102
  /**
1035
1103
  * Gets a value indicating whether or not the requested tiles include vertex normals.
1036
- * This function should not be called before {@link CesiumTerrainProvider#ready} returns true.
1037
1104
  * @memberof CesiumTerrainProvider.prototype
1038
1105
  * @type {boolean}
1039
1106
  * @readonly
1040
- * @exception {DeveloperError} This property must not be called before {@link CesiumTerrainProvider#ready}
1041
1107
  */
1042
1108
  hasVertexNormals: {
1043
1109
  get: function () {
1044
- //>>includeStart('debug', pragmas.debug)
1045
- if (!this._ready) {
1046
- throw new DeveloperError(
1047
- "hasVertexNormals must not be called before the terrain provider is ready."
1048
- );
1049
- }
1050
- //>>includeEnd('debug');
1051
-
1052
1110
  // returns true if we can request vertex normals from the server
1053
1111
  return this._hasVertexNormals && this._requestVertexNormals;
1054
1112
  },
@@ -1056,22 +1114,12 @@ Object.defineProperties(CesiumTerrainProvider.prototype, {
1056
1114
 
1057
1115
  /**
1058
1116
  * Gets a value indicating whether or not the requested tiles include metadata.
1059
- * This function should not be called before {@link CesiumTerrainProvider#ready} returns true.
1060
1117
  * @memberof CesiumTerrainProvider.prototype
1061
1118
  * @type {boolean}
1062
1119
  * @readonly
1063
- * @exception {DeveloperError} This property must not be called before {@link CesiumTerrainProvider#ready}
1064
1120
  */
1065
1121
  hasMetadata: {
1066
1122
  get: function () {
1067
- //>>includeStart('debug', pragmas.debug)
1068
- if (!this._ready) {
1069
- throw new DeveloperError(
1070
- "hasMetadata must not be called before the terrain provider is ready."
1071
- );
1072
- }
1073
- //>>includeEnd('debug');
1074
-
1075
1123
  // returns true if we can request metadata from the server
1076
1124
  return this._hasMetadata && this._requestMetadata;
1077
1125
  },
@@ -1121,8 +1169,7 @@ Object.defineProperties(CesiumTerrainProvider.prototype, {
1121
1169
 
1122
1170
  /**
1123
1171
  * Gets an object that can be used to determine availability of terrain from this provider, such as
1124
- * at points and in rectangles. This function should not be called before
1125
- * {@link CesiumTerrainProvider#ready} returns true. This property may be undefined if availability
1172
+ * at points and in rectangles. This property may be undefined if availability
1126
1173
  * information is not available. Note that this reflects tiles that are known to be available currently.
1127
1174
  * Additional tiles may be discovered to be available in the future, e.g. if availability information
1128
1175
  * exists deeper in the tree rather than it all being discoverable at the root. However, a tile that
@@ -1133,13 +1180,6 @@ Object.defineProperties(CesiumTerrainProvider.prototype, {
1133
1180
  */
1134
1181
  availability: {
1135
1182
  get: function () {
1136
- //>>includeStart('debug', pragmas.debug)
1137
- if (!this._ready) {
1138
- throw new DeveloperError(
1139
- "availability must not be called before the terrain provider is ready."
1140
- );
1141
- }
1142
- //>>includeEnd('debug');
1143
1183
  return this._availability;
1144
1184
  },
1145
1185
  },
@@ -1157,6 +1197,103 @@ CesiumTerrainProvider.prototype.getLevelMaximumGeometricError = function (
1157
1197
  return this._levelZeroMaximumGeometricError / (1 << level);
1158
1198
  };
1159
1199
 
1200
+ /**
1201
+ * Creates a {@link TerrainProvider} from a Cesium ion asset ID that accesses terrain data in a Cesium terrain format
1202
+ * Terrain formats can be one of the following:
1203
+ * <ul>
1204
+ * <li> {@link https://github.com/AnalyticalGraphicsInc/quantized-mesh Quantized Mesh} </li>
1205
+ * <li> {@link https://github.com/AnalyticalGraphicsInc/cesium/wiki/heightmap-1.0 Height Map} </li>
1206
+ * </ul>
1207
+ *
1208
+ * @param {number} assetId The Cesium ion asset id.
1209
+ * @param {CesiumTerrainProvider.ConstructorOptions} [options] An object describing initialization options.
1210
+ * @returns {Promise<CesiumTerrainProvider>}
1211
+ *
1212
+ * @example
1213
+ * // Create Arctic DEM terrain with normals.
1214
+ * try {
1215
+ * const viewer = new Cesium.Viewer("cesiumContainer", {
1216
+ * terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(3956, {
1217
+ * requestVertexNormals: true
1218
+ * })
1219
+ * });
1220
+ * } catch (error) {
1221
+ * console.log(error);
1222
+ * }
1223
+ *
1224
+ * @exception {RuntimeError} layer.json does not specify a format
1225
+ * @exception {RuntimeError} layer.json specifies an unknown format
1226
+ * @exception {RuntimeError} layer.json specifies an unsupported quantized-mesh version
1227
+ * @exception {RuntimeError} layer.json does not specify a tiles property, or specifies an empty array
1228
+ * @exception {RuntimeError} layer.json does not specify any tile URL templates
1229
+ */
1230
+ CesiumTerrainProvider.fromIonAssetId = async function (assetId, options) {
1231
+ //>>includeStart('debug', pragmas.debug);
1232
+ Check.defined("assetId", assetId);
1233
+ //>>includeEnd('debug');
1234
+
1235
+ const resource = await IonResource.fromAssetId(assetId);
1236
+ return CesiumTerrainProvider.fromUrl(resource, options);
1237
+ };
1238
+
1239
+ /**
1240
+ * Creates a {@link TerrainProvider} that accesses terrain data in a Cesium terrain format.
1241
+ * Terrain formats can be one of the following:
1242
+ * <ul>
1243
+ * <li> {@link https://github.com/AnalyticalGraphicsInc/quantized-mesh Quantized Mesh} </li>
1244
+ * <li> {@link https://github.com/AnalyticalGraphicsInc/cesium/wiki/heightmap-1.0 Height Map} </li>
1245
+ * </ul>
1246
+ *
1247
+ * @param {Resource|String|Promise<Resource>|Promise<String>} url The URL of the Cesium terrain server.
1248
+ * @param {CesiumTerrainProvider.ConstructorOptions} [options] An object describing initialization options.
1249
+ * @returns {Promise<CesiumTerrainProvider>}
1250
+ *
1251
+ * @example
1252
+ * // Create Arctic DEM terrain with normals.
1253
+ * try {
1254
+ * const viewer = new Cesium.Viewer("cesiumContainer", {
1255
+ * terrainProvider: await Cesium.CesiumTerrainProvider.fromUrl(
1256
+ * Cesium.IonResource.fromAssetId(3956), {
1257
+ * requestVertexNormals: true
1258
+ * })
1259
+ * });
1260
+ * } catch (error) {
1261
+ * console.log(error);
1262
+ * }
1263
+ *
1264
+ * @exception {RuntimeError} layer.json does not specify a format
1265
+ * @exception {RuntimeError} layer.json specifies an unknown format
1266
+ * @exception {RuntimeError} layer.json specifies an unsupported quantized-mesh version
1267
+ * @exception {RuntimeError} layer.json does not specify a tiles property, or specifies an empty array
1268
+ * @exception {RuntimeError} layer.json does not specify any tile URL templates
1269
+ */
1270
+ CesiumTerrainProvider.fromUrl = async function (url, options) {
1271
+ //>>includeStart('debug', pragmas.debug);
1272
+ Check.defined("url", url);
1273
+ //>>includeEnd('debug');
1274
+
1275
+ options = defaultValue(options, defaultValue.EMPTY_OBJECT);
1276
+
1277
+ url = await Promise.resolve(url);
1278
+ const resource = Resource.createIfNeeded(url);
1279
+ resource.appendForwardSlash();
1280
+
1281
+ const terrainProviderBuilder = new TerrainProviderBuilder(options);
1282
+ terrainProviderBuilder.lastResource = resource;
1283
+ terrainProviderBuilder.layerJsonResource = terrainProviderBuilder.lastResource.getDerivedResource(
1284
+ {
1285
+ url: "layer.json",
1286
+ }
1287
+ );
1288
+
1289
+ await requestLayerJson(terrainProviderBuilder);
1290
+
1291
+ const provider = new CesiumTerrainProvider(options);
1292
+ terrainProviderBuilder.build(provider);
1293
+
1294
+ return provider;
1295
+ };
1296
+
1160
1297
  /**
1161
1298
  * Determines whether data for a tile is available to be loaded.
1162
1299
  *