UNPKG

@cesium/engine

Version:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.

246 lines (232 loc) 7.39 kB
import Check from "../Core/Check.js"; import Event from "../Core/Event.js"; import createWorldBathymetryAsync from "../Core/createWorldBathymetryAsync.js"; import createWorldTerrainAsync from "../Core/createWorldTerrainAsync.js"; /** * A helper to manage async operations of a terrain provider. * * @alias Terrain * @constructor * * @see Terrain.fromWorldTerrain * @see CesiumTerrainProvider * @see VRTheWorldTerrainProvider * @see GoogleEarthEnterpriseTerrainProvider * * @example * // Create * const viewer = new Cesium.Viewer("cesiumContainer", { * terrain: new Cesium.Terrain(Cesium.CesiumTerrainProvider.fromUrl("https://myTestTerrain.com")); * }); * * @example * // Handle loading events * const terrain = new Cesium.Terrain(Cesium.CesiumTerrainProvider.fromUrl("https://myTestTerrain.com")); * * scene.setTerrain(terrain); * * terrain.readyEvent.addEventListener(provider => { * scene.globe.enableLighting = true; * * terrain.provider.errorEvent.addEventListener(error => { * alert(`Encountered an error while loading terrain tiles! ${error}`); * }); * }); * * terrain.errorEvent.addEventListener(error => { * alert(`Encountered an error while creating terrain! ${error}`); * }); * * @param {Promise<TerrainProvider>} terrainProviderPromise A promise which resolves to a terrain provider */ function Terrain(terrainProviderPromise) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object("terrainProviderPromise", terrainProviderPromise); //>>includeEnd('debug'); this._ready = false; this._provider = undefined; this._errorEvent = new Event(); this._readyEvent = new Event(); handlePromise(this, terrainProviderPromise); } Object.defineProperties(Terrain.prototype, { /** * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing * to the event, you will be notified of the error and can potentially recover from it. Event listeners * are passed an instance of the thrown error. * @memberof Terrain.prototype * @type {Event<Terrain.ErrorEventCallback>} * @readonly */ errorEvent: { get: function () { return this._errorEvent; }, }, /** * Gets an event that is raised when the terrain provider has been successfully created. Event listeners * are passed the created instance of {@link TerrainProvider}. * @memberof Terrain.prototype * @type {Event<Terrain.ReadyEventCallback>} * @readonly */ readyEvent: { get: function () { return this._readyEvent; }, }, /** * Returns true when the terrain provider has been successfully created. Otherwise, returns false. * @memberof Terrain.prototype * * @type {boolean} * @readonly */ ready: { get: function () { return this._ready; }, }, /** * The terrain provider providing surface geometry to a globe. Do not use until {@link Terrain.readyEvent} is raised. * @memberof Terrain.prototype * * @type {TerrainProvider} * @readonly */ provider: { get: function () { return this._provider; }, }, }); /** * Creates a {@link Terrain} instance for {@link https://cesium.com/content/#cesium-world-terrain|Cesium World Terrain}. * * @function * * @param {object} [options] Object with the following properties: * @param {boolean} [options.requestVertexNormals=false] Flag that indicates if the client should request additional lighting information from the server if available. * @param {boolean} [options.requestWaterMask=false] Flag that indicates if the client should request per tile water masks from the server if available. * @returns {Terrain} An asynchronous helper object for a CesiumTerrainProvider * * @see Ion * @see createWorldTerrainAsync * * @example * // Create Cesium World Terrain with default settings * const viewer = new Cesium.Viewer("cesiumContainer", { * terrain: Cesium.Terrain.fromWorldTerrain() * }); * * @example * // Create Cesium World Terrain with water and normals. * const viewer1 = new Cesium.Viewer("cesiumContainer", { * terrain: Cesium.Terrain.fromWorldTerrain({ * requestWaterMask: true, * requestVertexNormals: true * }); * }); * * @example * // Handle loading events * const terrain = Cesium.Terrain.fromWorldTerrain(); * * scene.setTerrain(terrain); * * terrain.readyEvent.addEventListener(provider => { * scene.globe.enableLighting = true; * * terrain.provider.errorEvent.addEventListener(error => { * alert(`Encountered an error while loading terrain tiles! ${error}`); * }); * }); * * terrain.errorEvent.addEventListener(error => { * alert(`Encountered an error while creating terrain! ${error}`); * }); */ Terrain.fromWorldTerrain = function (options) { return new Terrain(createWorldTerrainAsync(options)); }; /** * Creates a {@link Terrain} instance for {@link https://cesium.com/content/#cesium-world-bathymetry|Cesium World Bathymetry}. * * @function * * @param {object} [options] Object with the following properties: * @param {boolean} [options.requestVertexNormals=false] Flag that indicates if the client should request additional lighting information from the server if available. * @returns {Terrain} An asynchronous helper object for a CesiumTerrainProvider * * @see Ion * @see createWorldBathymetryAsync * * @example * // Create Cesium World Bathymetry with default settings * const viewer = new Cesium.Viewer("cesiumContainer", { * terrain: Cesium.Terrain.fromWorldBathymetry) * }); * * @example * // Create Cesium World Terrain with normals. * const viewer1 = new Cesium.Viewer("cesiumContainer", { * terrain: Cesium.Terrain.fromWorldBathymetry({ * requestVertexNormals: true * }); * }); * * @example * // Handle loading events * const bathymetry = Cesium.Terrain.fromWorldBathymetry(); * * scene.setTerrain(bathymetry); * * bathymetry.readyEvent.addEventListener(provider => { * scene.globe.enableLighting = true; * * bathymetry.provider.errorEvent.addEventListener(error => { * alert(`Encountered an error while loading bathymetric terrain tiles! ${error}`); * }); * }); * * bathymetry.errorEvent.addEventListener(error => { * alert(`Encountered an error while creating bathymetric terrain! ${error}`); * }); */ Terrain.fromWorldBathymetry = function (options) { return new Terrain(createWorldBathymetryAsync(options)); }; function handleError(errorEvent, error) { if (errorEvent.numberOfListeners > 0) { errorEvent.raiseEvent(error); } else { // Default handler is to log to the console console.error(error); } } async function handlePromise(instance, promise) { let provider; try { provider = await Promise.resolve(promise); instance._provider = provider; instance._ready = true; instance._readyEvent.raiseEvent(provider); } catch (error) { handleError(instance._errorEvent, error); } } export default Terrain; /** * A function that is called when an error occurs. * @callback Terrain.ErrorEventCallback * * @this Terrain * @param {Error} err An object holding details about the error that occurred. */ /** * A function that is called when the provider has been created * @callback Terrain.ReadyEventCallback * * @this Terrain * @param {TerrainProvider} provider The created terrain provider. */