import ApproximateTerrainHeights from "../Core/ApproximateTerrainHeights.js";
import BoundingSphere from "../Core/BoundingSphere.js";
import Cartesian2 from "../Core/Cartesian2.js";
import Cartesian3 from "../Core/Cartesian3.js";
import Cartographic from "../Core/Cartographic.js";
import Check from "../Core/Check.js";
import clone from "../Core/clone.js";
import Color from "../Core/Color.js";
import Credit from "../Core/Credit.js";
import defaultValue from "../Core/defaultValue.js";
import defined from "../Core/defined.js";
import deprecationWarning from "../Core/deprecationWarning.js";
import destroyObject from "../Core/destroyObject.js";
import Ellipsoid from "../Core/Ellipsoid.js";
import Event from "../Core/Event.js";
import ImageBasedLighting from "./ImageBasedLighting.js";
import Interval from "../Core/Interval.js";
import IntersectionTests from "../Core/IntersectionTests.js";
import IonResource from "../Core/IonResource.js";
import JulianDate from "../Core/JulianDate.js";
import ManagedArray from "../Core/ManagedArray.js";
import CesiumMath from "../Core/Math.js";
import Matrix3 from "../Core/Matrix3.js";
import Matrix4 from "../Core/Matrix4.js";
import Resource from "../Core/Resource.js";
import RuntimeError from "../Core/RuntimeError.js";
import Transforms from "../Core/Transforms.js";
import ClearCommand from "../Renderer/ClearCommand.js";
import Pass from "../Renderer/Pass.js";
import RenderState from "../Renderer/RenderState.js";
import Axis from "./Axis.js";
import Cesium3DTile from "./Cesium3DTile.js";
import Cesium3DTileColorBlendMode from "./Cesium3DTileColorBlendMode.js";
import Cesium3DTileContentState from "./Cesium3DTileContentState.js";
import Cesium3DTilesetMetadata from "./Cesium3DTilesetMetadata.js";
import Cesium3DTileOptimizations from "./Cesium3DTileOptimizations.js";
import Cesium3DTilePass from "./Cesium3DTilePass.js";
import Cesium3DTileRefine from "./Cesium3DTileRefine.js";
import Cesium3DTilesetCache from "./Cesium3DTilesetCache.js";
import Cesium3DTilesetHeatmap from "./Cesium3DTilesetHeatmap.js";
import Cesium3DTilesetStatistics from "./Cesium3DTilesetStatistics.js";
import Cesium3DTileStyleEngine from "./Cesium3DTileStyleEngine.js";
import ClippingPlaneCollection from "./ClippingPlaneCollection.js";
import ClippingPolygonCollection from "./ClippingPolygonCollection.js";
import hasExtension from "./hasExtension.js";
import ImplicitTileset from "./ImplicitTileset.js";
import ImplicitTileCoordinates from "./ImplicitTileCoordinates.js";
import LabelCollection from "./LabelCollection.js";
import oneTimeWarning from "../Core/oneTimeWarning.js";
import PointCloudEyeDomeLighting from "./PointCloudEyeDomeLighting.js";
import PointCloudShading from "./PointCloudShading.js";
import ResourceCache from "./ResourceCache.js";
import SceneMode from "./SceneMode.js";
import ShadowMode from "./ShadowMode.js";
import SplitDirection from "./SplitDirection.js";
import StencilConstants from "./StencilConstants.js";
import TileBoundingRegion from "./TileBoundingRegion.js";
import TileBoundingSphere from "./TileBoundingSphere.js";
import TileOrientedBoundingBox from "./TileOrientedBoundingBox.js";
import Cesium3DTilesetMostDetailedTraversal from "./Cesium3DTilesetMostDetailedTraversal.js";
import Cesium3DTilesetBaseTraversal from "./Cesium3DTilesetBaseTraversal.js";
import Cesium3DTilesetSkipTraversal from "./Cesium3DTilesetSkipTraversal.js";
import Ray from "../Core/Ray.js";
/**
* @typedef {Object} Cesium3DTileset.ConstructorOptions
*
* Initialization options for the Cesium3DTileset constructor
*
* @property {boolean} [show=true] Determines if the tileset will be shown.
* @property {Matrix4} [modelMatrix=Matrix4.IDENTITY] A 4x4 transformation matrix that transforms the tileset's root tile.
* @property {Axis} [modelUpAxis=Axis.Y] Which axis is considered up when loading models for tile contents.
* @property {Axis} [modelForwardAxis=Axis.X] Which axis is considered forward when loading models for tile contents.
* @property {ShadowMode} [shadows=ShadowMode.ENABLED] Determines whether the tileset casts or receives shadows from light sources.
* @property {number} [maximumScreenSpaceError=16] The maximum screen space error used to drive level of detail refinement.
* @property {number} [cacheBytes=536870912] The size (in bytes) to which the tile cache will be trimmed, if the cache contains tiles not needed for the current view.
* @property {number} [maximumCacheOverflowBytes=536870912] The maximum additional memory (in bytes) to allow for cache headroom, if more than {@link Cesium3DTileset#cacheBytes} are needed for the current view.
* @property {boolean} [cullWithChildrenBounds=true] Optimization option. Whether to cull tiles using the union of their children bounding volumes.
* @property {boolean} [cullRequestsWhileMoving=true] Optimization option. Don't request tiles that will likely be unused when they come back because of the camera's movement. This optimization only applies to stationary tilesets.
* @property {number} [cullRequestsWhileMovingMultiplier=60.0] Optimization option. Multiplier used in culling requests while moving. Larger is more aggressive culling, smaller less aggressive culling.
* @property {boolean} [preloadWhenHidden=false] Preload tiles when tileset.show is false. Loads tiles as if the tileset is visible but does not render them.
* @property {boolean} [preloadFlightDestinations=true] Optimization option. Preload tiles at the camera's flight destination while the camera is in flight.
* @property {boolean} [preferLeaves=false] Optimization option. Prefer loading of leaves first.
* @property {boolean} [dynamicScreenSpaceError=true] Optimization option. For street-level horizon views, use lower resolution tiles far from the camera. This reduces the amount of data loaded and improves tileset loading time with a slight drop in visual quality in the distance.
* @property {number} [dynamicScreenSpaceErrorDensity=2.0e-4] Similar to {@link Fog#density}, this option controls the camera distance at which the {@link Cesium3DTileset#dynamicScreenSpaceError} optimization applies. Larger values will cause tiles closer to the camera to be affected.
* @property {number} [dynamicScreenSpaceErrorFactor=24.0] A parameter that controls the intensity of the {@link Cesium3DTileset#dynamicScreenSpaceError} optimization for tiles on the horizon. Larger values cause lower resolution tiles to load, improving runtime performance at a slight reduction of visual quality.
* @property {number} [dynamicScreenSpaceErrorHeightFalloff=0.25] A ratio of the tileset's height that determines where "street level" camera views occur. When the camera is below this height, the {@link Cesium3DTileset#dynamicScreenSpaceError} optimization will have the maximum effect, and it will roll off above this value.
* @property {number} [progressiveResolutionHeightFraction=0.3] Optimization option. If between (0.0, 0.5], tiles at or above the screen space error for the reduced screen resolution of progressiveResolutionHeightFraction*screenHeight will be prioritized first. This can help get a quick layer of tiles down while full resolution tiles continue to load.
* @property {boolean} [foveatedScreenSpaceError=true] Optimization option. Prioritize loading tiles in the center of the screen by temporarily raising the screen space error for tiles around the edge of the screen. Screen space error returns to normal once all the tiles in the center of the screen as determined by the {@link Cesium3DTileset#foveatedConeSize} are loaded.
* @property {number} [foveatedConeSize=0.1] Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the cone size that determines which tiles are deferred. Tiles that are inside this cone are loaded immediately. Tiles outside the cone are potentially deferred based on how far outside the cone they are and their screen space error. This is controlled by {@link Cesium3DTileset#foveatedInterpolationCallback} and {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation}. Setting this to 0.0 means the cone will be the line formed by the camera position and its view direction. Setting this to 1.0 means the cone encompasses the entire field of view of the camera, disabling the effect.
* @property {number} [foveatedMinimumScreenSpaceErrorRelaxation=0.0] Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the starting screen space error relaxation for tiles outside the foveated cone. The screen space error will be raised starting with tileset value up to {@link Cesium3DTileset#maximumScreenSpaceError} based on the provided {@link Cesium3DTileset#foveatedInterpolationCallback}.
* @property {Cesium3DTileset.foveatedInterpolationCallback} [foveatedInterpolationCallback=Math.lerp] Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control how much to raise the screen space error for tiles outside the foveated cone, interpolating between {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation} and {@link Cesium3DTileset#maximumScreenSpaceError}
* @property {number} [foveatedTimeDelay=0.2] Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control how long in seconds to wait after the camera stops moving before deferred tiles start loading in. This time delay prevents requesting tiles around the edges of the screen when the camera is moving. Setting this to 0.0 will immediately request all tiles in any given view.
* @property {boolean} [skipLevelOfDetail=false] Optimization option. Determines if level of detail skipping should be applied during the traversal.
* @property {number} [baseScreenSpaceError=1024] When skipLevelOfDetail is true, the screen space error that must be reached before skipping levels of detail.
* @property {number} [skipScreenSpaceErrorFactor=16] When skipLevelOfDetail is true, a multiplier defining the minimum screen space error to skip. Used in conjunction with skipLevels to determine which tiles to load.
* @property {number} [skipLevels=1] When skipLevelOfDetail is true, a constant defining the minimum number of levels to skip when loading tiles. When it is 0, no levels are skipped. Used in conjunction with skipScreenSpaceErrorFactor to determine which tiles to load.
* @property {boolean} [immediatelyLoadDesiredLevelOfDetail=false] When skipLevelOfDetail is true, only tiles that meet the maximum screen space error will ever be downloaded. Skipping factors are ignored and just the desired tiles are loaded.
* @property {boolean} [loadSiblings=false] When skipLevelOfDetail is true, determines whether siblings of visible tiles are always downloaded during traversal.
* @property {ClippingPlaneCollection} [clippingPlanes] The {@link ClippingPlaneCollection} used to selectively disable rendering the tileset.
* @property {ClippingPolygonCollection} [clippingPolygons] The {@link ClippingPolygonCollection} used to selectively disable rendering the tileset.
* @property {ClassificationType} [classificationType] Determines whether terrain, 3D Tiles or both will be classified by this tileset. See {@link Cesium3DTileset#classificationType} for details about restrictions and limitations.
* @property {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid determining the size and shape of the globe.
* @property {object} [pointCloudShading] Options for constructing a {@link PointCloudShading} object to control point attenuation based on geometric error and lighting.
* @property {Cartesian3} [lightColor] The light color when shading models. When undefined the scene's light color is used instead.
* @property {ImageBasedLighting} [imageBasedLighting] The properties for managing image-based lighting for this tileset.
* @property {boolean} [backFaceCulling=true] Whether to cull back-facing geometry. When true, back face culling is determined by the glTF material's doubleSided property; when false, back face culling is disabled.
* @property {boolean} [enableShowOutline=true] Whether to enable outlines for models using the {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} extension. This can be set to false to avoid the additional processing of geometry at load time. When false, the showOutlines and outlineColor options are ignored.
* @property {boolean} [showOutline=true] Whether to display the outline for models using the {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} extension. When true, outlines are displayed. When false, outlines are not displayed.
* @property {Color} [outlineColor=Color.BLACK] The color to use when rendering outlines.
* @property {boolean} [vectorClassificationOnly=false] Indicates that only the tileset's vector tiles should be used for classification.
* @property {boolean} [vectorKeepDecodedPositions=false] Whether vector tiles should keep decoded positions in memory. This is used with {@link Cesium3DTileFeature.getPolylinePositions}.
* @property {string|number} [featureIdLabel="featureId_0"] Label of the feature ID set to use for picking and styling. For EXT_mesh_features, this is the feature ID's label property, or "featureId_N" (where N is the index in the featureIds array) when not specified. EXT_feature_metadata did not have a label field, so such feature ID sets are always labeled "featureId_N" where N is the index in the list of all feature Ids, where feature ID attributes are listed before feature ID textures. If featureIdLabel is an integer N, it is converted to the string "featureId_N" automatically. If both per-primitive and per-instance feature IDs are present, the instance feature IDs take priority.
* @property {string|number} [instanceFeatureIdLabel="instanceFeatureId_0"] Label of the instance feature ID set used for picking and styling. If instanceFeatureIdLabel is set to an integer N, it is converted to the string "instanceFeatureId_N" automatically. If both per-primitive and per-instance feature IDs are present, the instance feature IDs take priority.
* @property {boolean} [showCreditsOnScreen=false] Whether to display the credits of this tileset on screen.
* @property {SplitDirection} [splitDirection=SplitDirection.NONE] The {@link SplitDirection} split to apply to this tileset.
* @property {boolean} [enableCollision=false] When true, enables collisions for camera or CPU picking. While this is true the camera will be prevented from going below the tileset surface if {@link ScreenSpaceCameraController#enableCollisionDetection} is true.
* @property {boolean} [projectTo2D=false] Whether to accurately project the tileset to 2D. If this is true, the tileset will be projected accurately to 2D, but it will use more memory to do so. If this is false, the tileset will use less memory and will still render in 2D / CV mode, but its projected positions may be inaccurate. This cannot be set after the tileset has been created.
* @property {boolean} [enablePick=false] Whether to allow collision and CPU picking with pick when using WebGL 1. If using WebGL 2 or above, this option will be ignored. If using WebGL 1 and this is true, the pick operation will work correctly, but it will use more memory to do so. If running with WebGL 1 and this is false, the model will use less memory, but pick will always return undefined. This cannot be set after the tileset has loaded.
* @property {string} [debugHeatmapTilePropertyName] The tile variable to colorize as a heatmap. All rendered tiles will be colorized relative to each other's specified variable value.
* @property {boolean} [debugFreezeFrame=false] For debugging only. Determines if only the tiles from last frame should be used for rendering.
* @property {boolean} [debugColorizeTiles=false] For debugging only. When true, assigns a random color to each tile.
* @property {boolean} [enableDebugWireframe=false] For debugging only. This must be true for debugWireframe to work in WebGL1. This cannot be set after the tileset has been created.
* @property {boolean} [debugWireframe=false] For debugging only. When true, render's each tile's content as a wireframe.
* @property {boolean} [debugShowBoundingVolume=false] For debugging only. When true, renders the bounding volume for each tile.
* @property {boolean} [debugShowContentBoundingVolume=false] For debugging only. When true, renders the bounding volume for each tile's content.
* @property {boolean} [debugShowViewerRequestVolume=false] For debugging only. When true, renders the viewer request volume for each tile.
* @property {boolean} [debugShowGeometricError=false] For debugging only. When true, draws labels to indicate the geometric error of each tile.
* @property {boolean} [debugShowRenderingStatistics=false] For debugging only. When true, draws labels to indicate the number of commands, points, triangles and features for each tile.
* @property {boolean} [debugShowMemoryUsage=false] For debugging only. When true, draws labels to indicate the texture and geometry memory in megabytes used by each tile.
* @property {boolean} [debugShowUrl=false] For debugging only. When true, draws labels to indicate the url of each tile.
*/
/**
* A {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification|3D Tiles tileset},
* used for streaming massive heterogeneous 3D geospatial datasets.
*
*
progressiveResolutionHeightFraction*screenHeight will be prioritized first. This can help get a quick layer of tiles down while full resolution tiles continue to load.
*
* @type {number}
* @default 0.3
*/
this.progressiveResolutionHeightFraction = CesiumMath.clamp(
defaultValue(options.progressiveResolutionHeightFraction, 0.3),
0.0,
0.5
);
/**
* Optimization option. Prefer loading of leaves first.
*
* @type {boolean}
* @default false
*/
this.preferLeaves = defaultValue(options.preferLeaves, false);
this._tilesLoaded = false;
this._initialTilesLoaded = false;
this._tileDebugLabels = undefined;
this._classificationType = options.classificationType;
this._ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.WGS84);
this._initialClippingPlanesOriginMatrix = Matrix4.IDENTITY; // Computed from the tileset JSON.
this._clippingPlanesOriginMatrix = undefined; // Combines the above with any run-time transforms.
this._clippingPlanesOriginMatrixDirty = true;
this._vectorClassificationOnly = defaultValue(
options.vectorClassificationOnly,
false
);
this._vectorKeepDecodedPositions = defaultValue(
options.vectorKeepDecodedPositions,
false
);
/**
* Preload tiles when tileset.show is false. Loads tiles as if the tileset is visible but does not render them.
*
* @type {boolean}
* @default false
*/
this.preloadWhenHidden = defaultValue(options.preloadWhenHidden, false);
/**
* Optimization option. Fetch tiles at the camera's flight destination while the camera is in flight.
*
* @type {boolean}
* @default true
*/
this.preloadFlightDestinations = defaultValue(
options.preloadFlightDestinations,
true
);
this._pass = undefined; // Cesium3DTilePass
/**
* Optimization option. For street-level horizon views, use lower resolution tiles far from the camera. This reduces
* the amount of data loaded and improves tileset loading time with a slight drop in visual quality in the distance.
* * This optimization is strongest when the camera is close to the ground plane of the tileset and looking at the * horizon. Furthermore, the results are more accurate for tightly fitting bounding volumes like box and region. * * @type {boolean} * @default true */ this.dynamicScreenSpaceError = defaultValue( options.dynamicScreenSpaceError, true ); /** * Optimization option. Prioritize loading tiles in the center of the screen by temporarily raising the * screen space error for tiles around the edge of the screen. Screen space error returns to normal once all * the tiles in the center of the screen as determined by the {@link Cesium3DTileset#foveatedConeSize} are loaded. * * @type {boolean} * @default true */ this.foveatedScreenSpaceError = defaultValue( options.foveatedScreenSpaceError, true ); this._foveatedConeSize = defaultValue(options.foveatedConeSize, 0.1); this._foveatedMinimumScreenSpaceErrorRelaxation = defaultValue( options.foveatedMinimumScreenSpaceErrorRelaxation, 0.0 ); /** * Gets or sets a callback to control how much to raise the screen space error for tiles outside the foveated cone, * interpolating between {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation} and {@link Cesium3DTileset#maximumScreenSpaceError}. * * @type {Cesium3DTileset.foveatedInterpolationCallback} */ this.foveatedInterpolationCallback = defaultValue( options.foveatedInterpolationCallback, CesiumMath.lerp ); /** * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control * how long in seconds to wait after the camera stops moving before deferred tiles start loading in. * This time delay prevents requesting tiles around the edges of the screen when the camera is moving. * Setting this to 0.0 will immediately request all tiles in any given view. * * @type {number} * @default 0.2 */ this.foveatedTimeDelay = defaultValue(options.foveatedTimeDelay, 0.2); /** * Similar to {@link Fog#density}, this option controls the camera distance at which the {@link Cesium3DTileset#dynamicScreenSpaceError} * optimization applies. Larger values will cause tiles closer to the camera to be affected. This value must be * non-negative. *
* This optimization works by rolling off the tile screen space error (SSE) with camera distance like a bell curve. * This has the effect of selecting lower resolution tiles far from the camera. Near the camera, no adjustment is * made. For tiles further away, the SSE is reduced by up to {@link Cesium3DTileset#dynamicScreenSpaceErrorFactor} * (measured in pixels of error). *
** Increasing the density makes the bell curve narrower so tiles closer to the camera are affected. This is analagous * to moving fog closer to the camera. *
** When the density is 0, the optimization will have no effect on the tileset. *
* * @type {number} * @default 2.0e-4 */ this.dynamicScreenSpaceErrorDensity = defaultValue( options.dynamicScreenSpaceErrorDensity, 2.0e-4 ); /** * A parameter that controls the intensity of the {@link Cesium3DTileset#dynamicScreenSpaceError} optimization for * tiles on the horizon. Larger values cause lower resolution tiles to load, improving runtime performance at a slight * reduction of visual quality. The value must be non-negative. ** More specifically, this parameter represents the maximum adjustment to screen space error (SSE) in pixels for tiles * far away from the camera. See {@link Cesium3DTileset#dynamicScreenSpaceErrorDensity} for more details about how * this optimization works. *
** When the SSE factor is set to 0, the optimization will have no effect on the tileset. *
* * @type {number} * @default 24.0 */ this.dynamicScreenSpaceErrorFactor = defaultValue( options.dynamicScreenSpaceErrorFactor, 24.0 ); /** * A ratio of the tileset's height that determines "street level" for the {@link Cesium3DTileset#dynamicScreenSpaceError} * optimization. When the camera is below this height, the dynamic screen space error optimization will have the maximum * effect, and it will roll off above this value. Valid values are between 0.0 and 1.0. ** * @type {number} * @default 0.25 */ this.dynamicScreenSpaceErrorHeightFalloff = defaultValue( options.dynamicScreenSpaceErrorHeightFalloff, 0.25 ); // Updated based on the camera position and direction this._dynamicScreenSpaceErrorComputedDensity = 0.0; /** * Determines whether the tileset casts or receives shadows from light sources. *
* Enabling shadows has a performance impact. A tileset that casts shadows must be rendered twice, once from the camera and again from the light's point of view. *
*
* Shadows are rendered only when {@link Viewer#shadows} is true.
*
MIX.
* A value of 0.0 results in the source color while a value of 1.0 results in the feature color, with any value in-between
* resulting in a mix of the source color and feature color.
*
* @type {number}
* @default 0.5
*/
this.colorBlendAmount = 0.5;
this._pointCloudShading = new PointCloudShading(options.pointCloudShading);
this._pointCloudEyeDomeLighting = new PointCloudEyeDomeLighting();
/**
* The event fired to indicate progress of loading new tiles. This event is fired when a new tile
* is requested, when a requested tile is finished downloading, and when a downloaded tile has been
* processed and is ready to render.
*
* The number of pending tile requests, numberOfPendingRequests, and number of tiles
* processing, numberOfTilesProcessing are passed to the event listener.
*
* This event is fired at the end of the frame after the scene is rendered. *
* * @type {Event} * @default new Event() * * @example * tileset.loadProgress.addEventListener(function(numberOfPendingRequests, numberOfTilesProcessing) { * if ((numberOfPendingRequests === 0) && (numberOfTilesProcessing === 0)) { * console.log('Stopped loading'); * return; * } * * console.log(`Loading: requests: ${numberOfPendingRequests}, processing: ${numberOfTilesProcessing}`); * }); */ this.loadProgress = new Event(); /** * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. The tileset * is completely loaded for this view. ** This event is fired at the end of the frame after the scene is rendered. *
* * @type {Event} * @default new Event() * * @example * tileset.allTilesLoaded.addEventListener(function() { * console.log('All tiles are loaded'); * }); * * @see Cesium3DTileset#tilesLoaded */ this.allTilesLoaded = new Event(); /** * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. This event * is fired once when all tiles in the initial view are loaded. ** This event is fired at the end of the frame after the scene is rendered. *
* * @type {Event} * @default new Event() * * @example * tileset.initialTilesLoaded.addEventListener(function() { * console.log('Initial tiles are loaded'); * }); * * @see Cesium3DTileset#allTilesLoaded */ this.initialTilesLoaded = new Event(); /** * The event fired to indicate that a tile's content was loaded. ** The loaded {@link Cesium3DTile} is passed to the event listener. *
** This event is fired during the tileset traversal while the frame is being rendered * so that updates to the tile take effect in the same frame. Do not create or modify * Cesium entities or primitives during the event listener. *
* * @type {Event} * @default new Event() * * @example * tileset.tileLoad.addEventListener(function(tile) { * console.log('A tile was loaded.'); * }); */ this.tileLoad = new Event(); /** * The event fired to indicate that a tile's content was unloaded. ** The unloaded {@link Cesium3DTile} is passed to the event listener. *
** This event is fired immediately before the tile's content is unloaded while the frame is being * rendered so that the event listener has access to the tile's content. Do not create * or modify Cesium entities or primitives during the event listener. *
* * @type {Event} * @default new Event() * * @example * tileset.tileUnload.addEventListener(function(tile) { * console.log('A tile was unloaded from the cache.'); * }); * * @see Cesium3DTileset#cacheBytes * @see Cesium3DTileset#trimLoadedTiles */ this.tileUnload = new Event(); /** * The event fired to indicate that a tile's content failed to load. ** If there are no event listeners, error messages will be logged to the console. *
** The error object passed to the listener contains two properties: *
url: the url of the failed tile.message: the error message.* If multiple contents are present, this event is raised once per inner content with errors. *
* * @type {Event} * @default new Event() * * @example * tileset.tileFailed.addEventListener(function(error) { * console.log(`An error occurred loading tile: ${error.url}`); * console.log(`Error: ${error.message}`); * }); */ this.tileFailed = new Event(); /** * This event fires once for each visible tile in a frame. This can be used to manually * style a tileset. ** The visible {@link Cesium3DTile} is passed to the event listener. *
** This event is fired during the tileset traversal while the frame is being rendered * so that updates to the tile take effect in the same frame. Do not create or modify * Cesium entities or primitives during the event listener. *
* * @type {Event} * @default new Event() * * @example * tileset.tileVisible.addEventListener(function(tile) { * if (tile.content instanceof Cesium.Model3DTileContent) { * console.log('A 3D model tile is visible.'); * } * }); * * @example * // Apply a red style and then manually set random colors for every other feature when the tile becomes visible. * tileset.style = new Cesium.Cesium3DTileStyle({ * color : 'color("red")' * }); * tileset.tileVisible.addEventListener(function(tile) { * const content = tile.content; * const featuresLength = content.featuresLength; * for (let i = 0; i < featuresLength; i+=2) { * content.getFeature(i).color = Cesium.Color.fromRandom(); * } * }); */ this.tileVisible = new Event(); /** * Optimization option. Determines if level of detail skipping should be applied during the traversal. ** The common strategy for replacement-refinement traversal is to store all levels of the tree in memory and require * all children to be loaded before the parent can refine. With this optimization levels of the tree can be skipped * entirely and children can be rendered alongside their parents. The tileset requires significantly less memory when * using this optimization. *
* * @type {boolean} * @default false */ this.skipLevelOfDetail = defaultValue(options.skipLevelOfDetail, false); this._disableSkipLevelOfDetail = false; /** * The screen space error that must be reached before skipping levels of detail. *
* Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true.
*
<= 100 / skipScreenSpaceErrorFactor.
*
* Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true.
*
* Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true.
*
* Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true.
*
* Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true.
*
undefined the scene's light color is used instead.
*
* For example, disabling additional light sources by setting
* tileset.imageBasedLighting.imageBasedLightingFactor = new Cartesian2(0.0, 0.0)
* will make the tileset much darker. Here, increasing the intensity of the light source will make the tileset brighter.
*
true, allows collisions for camera collisions or picking. While this is true the camera will be prevented from going in or below the tileset surface if {@link ScreenSpaceCameraController#enableCollisionDetection} is true. This can have performance implecations if the tileset contains tile with a larger number of vertices.
*
* @type {boolean}
* @default false
*/
this.enableCollision = defaultValue(options.enableCollision, false);
this._projectTo2D = defaultValue(options.projectTo2D, false);
this._enablePick = defaultValue(options.enablePick, false);
/**
* This property is for debugging only; it is not optimized for production use.
* * Determines if only the tiles from last frame should be used for rendering. This * effectively "freezes" the tileset to the previous frame so it is possible to zoom * out and see what was rendered. *
* * @type {boolean} * @default false */ this.debugFreezeFrame = defaultValue(options.debugFreezeFrame, false); /** * This property is for debugging only; it is not optimized for production use. ** When true, assigns a random color to each tile. This is useful for visualizing * what features belong to what tiles, especially with additive refinement where features * from parent tiles may be interleaved with features from child tiles. *
* * @type {boolean} * @default false */ this.debugColorizeTiles = defaultValue(options.debugColorizeTiles, false); this._enableDebugWireframe = defaultValue( options.enableDebugWireframe, false ); /** * This property is for debugging only; it is not optimized for production use. ** When true, renders each tile's content as a wireframe. *
* * @type {boolean} * @default false */ this.debugWireframe = defaultValue(options.debugWireframe, false); // Warning for improper setup of debug wireframe if (this.debugWireframe === true && this._enableDebugWireframe === false) { oneTimeWarning( "tileset-debug-wireframe-ignored", "enableDebugWireframe must be set to true in the Cesium3DTileset constructor, otherwise debugWireframe will be ignored." ); } /** * This property is for debugging only; it is not optimized for production use. ** When true, renders the bounding volume for each visible tile. The bounding volume is * white if the tile has a content bounding volume or is empty; otherwise, it is red. Tiles that don't meet the * screen space error and are still refining to their descendants are yellow. *
* * @type {boolean} * @default false */ this.debugShowBoundingVolume = defaultValue( options.debugShowBoundingVolume, false ); /** * This property is for debugging only; it is not optimized for production use. ** When true, renders the bounding volume for each visible tile's content. The bounding volume is * blue if the tile has a content bounding volume; otherwise it is red. *
* * @type {boolean} * @default false */ this.debugShowContentBoundingVolume = defaultValue( options.debugShowContentBoundingVolume, false ); /** * This property is for debugging only; it is not optimized for production use. ** When true, renders the viewer request volume for each tile. *
* * @type {boolean} * @default false */ this.debugShowViewerRequestVolume = defaultValue( options.debugShowViewerRequestVolume, false ); /** * @private * @type {LabelCollection|undefined} */ this._tileDebugLabels = undefined; this.debugPickedTileLabelOnly = false; this.debugPickedTile = undefined; this.debugPickPosition = undefined; /** * This property is for debugging only; it is not optimized for production use. ** When true, draws labels to indicate the geometric error of each tile. *
* * @type {boolean} * @default false */ this.debugShowGeometricError = defaultValue( options.debugShowGeometricError, false ); /** * This property is for debugging only; it is not optimized for production use. ** When true, draws labels to indicate the number of commands, points, triangles and features of each tile. *
* * @type {boolean} * @default false */ this.debugShowRenderingStatistics = defaultValue( options.debugShowRenderingStatistics, false ); /** * This property is for debugging only; it is not optimized for production use. ** When true, draws labels to indicate the geometry and texture memory usage of each tile. *
* * @type {boolean} * @default false */ this.debugShowMemoryUsage = defaultValue(options.debugShowMemoryUsage, false); /** * This property is for debugging only; it is not optimized for production use. ** When true, draws labels to indicate the url of each tile. *
* * @type {boolean} * @default false */ this.debugShowUrl = defaultValue(options.debugShowUrl, false); /** * Function for examining vector lines as they are being streamed. * * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. * * @type {Function} */ this.examineVectorLinesFunction = undefined; // this is the underlying Cesium3DTileMetadata object, whether it came from // the 3DTILES_metadata extension or a 3D Tiles 1.1 tileset JSON. Getters // like tileset.metadata and tileset.schema will delegate to this object. this._metadataExtension = undefined; this._customShader = options.customShader; let featureIdLabel = defaultValue(options.featureIdLabel, "featureId_0"); if (typeof featureIdLabel === "number") { featureIdLabel = `featureId_${featureIdLabel}`; } this._featureIdLabel = featureIdLabel; let instanceFeatureIdLabel = defaultValue( options.instanceFeatureIdLabel, "instanceFeatureId_0" ); if (typeof instanceFeatureIdLabel === "number") { instanceFeatureIdLabel = `instanceFeatureId_${instanceFeatureIdLabel}`; } this._instanceFeatureIdLabel = instanceFeatureIdLabel; } Object.defineProperties(Cesium3DTileset.prototype, { /** * NOTE: This getter exists so that `Picking.js` can differentiate between * PrimitiveCollection and Cesium3DTileset objects without inflating * the size of the module via `instanceof Cesium3DTileset` * @private */ isCesium3DTileset: { get: function () { return true; }, }, /** * Gets the tileset's asset object property, which contains metadata about the tileset. ** See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#reference-asset|asset schema reference} * in the 3D Tiles spec for the full set of properties. *
* * @memberof Cesium3DTileset.prototype * * @type {object} * @readonly */ asset: { get: function () { return this._asset; }, }, /** * Gets the tileset's extensions object property. * * @memberof Cesium3DTileset.prototype * * @type {object} * @readonly */ extensions: { get: function () { return this._extensions; }, }, /** * The {@link ClippingPlaneCollection} used to selectively disable rendering the tileset. * * @memberof Cesium3DTileset.prototype * * @type {ClippingPlaneCollection} */ clippingPlanes: { get: function () { return this._clippingPlanes; }, set: function (value) { ClippingPlaneCollection.setOwner(value, this, "_clippingPlanes"); }, }, /** * The {@link ClippingPolygonCollection} used to selectively disable rendering the tileset. * * @memberof Cesium3DTileset.prototype * * @type {ClippingPolygonCollection} */ clippingPolygons: { get: function () { return this._clippingPolygons; }, set: function (value) { ClippingPolygonCollection.setOwner(value, this, "_clippingPolygons"); }, }, /** * Gets the tileset's properties dictionary object, which contains metadata about per-feature properties. ** See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#reference-properties|properties schema reference} * in the 3D Tiles spec for the full set of properties. *
* * @memberof Cesium3DTileset.prototype * * @type {object} * @readonly * * @example * console.log(`Maximum building height: ${tileset.properties.height.maximum}`); * console.log(`Minimum building height: ${tileset.properties.height.minimum}`); * * @see Cesium3DTileFeature#getProperty * @see Cesium3DTileFeature#setProperty */ properties: { get: function () { return this._properties; }, }, /** * Whentrue, all tiles that meet the screen space error this frame are loaded. The tileset is
* completely loaded for this view.
*
* @memberof Cesium3DTileset.prototype
*
* @type {boolean}
* @readonly
*
* @default false
*
* @see Cesium3DTileset#allTilesLoaded
*/
tilesLoaded: {
get: function () {
return this._tilesLoaded;
},
},
/**
* The resource used to fetch the tileset JSON file
*
* @memberof Cesium3DTileset.prototype
*
* @type {Resource}
* @readonly
*/
resource: {
get: function () {
return this._resource;
},
},
/**
* The base path that non-absolute paths in tileset JSON file are relative to.
*
* @memberof Cesium3DTileset.prototype
*
* @type {string}
* @readonly
* @deprecated
*/
basePath: {
get: function () {
deprecationWarning(
"Cesium3DTileset.basePath",
"Cesium3DTileset.basePath has been deprecated. All tiles are relative to the url of the tileset JSON file that contains them. Use the url property instead."
);
return this._basePath;
},
},
/**
* The style, defined using the
* {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language},
* applied to each feature in the tileset.
*
* Assign undefined to remove the style, which will restore the visual
* appearance of the tileset to its default when no style was applied.
*
* The style is applied to a tile before the {@link Cesium3DTileset#tileVisible}
* event is raised, so code in tileVisible can manually set a feature's
* properties (e.g. color and show) after the style is applied. When
* a new style is assigned any manually set properties are overwritten.
*
* Use an always "true" condition to specify the Color for all objects that are not * overridden by pre-existing conditions. Otherwise, the default color Cesium.Color.White * will be used. Similarly, use an always "true" condition to specify the show property * for all objects that are not overridden by pre-existing conditions. Otherwise, the * default show value true will be used. *
* * @memberof Cesium3DTileset.prototype * * @type {Cesium3DTileStyle|undefined} * * @default undefined * * @example * tileset.style = new Cesium.Cesium3DTileStyle({ * color : { * conditions : [ * ['${Height} >= 100', 'color("purple", 0.5)'], * ['${Height} >= 50', 'color("red")'], * ['true', 'color("blue")'] * ] * }, * show : '${Height} > 0', * meta : { * description : '"Building id ${id} has height ${Height}."' * } * }); * * @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language} */ style: { get: function () { return this._styleEngine.style; }, set: function (value) { this._styleEngine.style = value; }, }, /** * A custom shader to apply to all tiles in the tileset. Only used for * contents that use {@link Model}. Using custom shaders with a * {@link Cesium3DTileStyle} may lead to undefined behavior. * * @memberof Cesium3DTileset.prototype * * @type {CustomShader|undefined} * * @default undefined * * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. */ customShader: { get: function () { return this._customShader; }, set: function (value) { this._customShader = value; }, }, /** * Whether the tileset is rendering different levels of detail in the same view. * Only relevant if {@link Cesium3DTileset.isSkippingLevelOfDetail} is true. * * @memberof Cesium3DTileset.prototype * * @type {boolean} * @private */ hasMixedContent: { get: function () { return this._hasMixedContent; }, set: function (value) { //>>includeStart('debug', pragmas.debug); Check.typeOf.bool("value", value); //>>includeEnd('debug'); this._hasMixedContent = value; }, }, /** * Whether this tileset is actually skipping levels of detail. * The user option may have been disabled if all tiles are using additive refinement, * or if some tiles have a content type for which rendering does not support skipping * * @memberof Cesium3DTileset.prototype * * @type {boolean} * @private * @readonly */ isSkippingLevelOfDetail: { get: function () { return ( this.skipLevelOfDetail && !defined(this._classificationType) && !this._disableSkipLevelOfDetail && !this._allTilesAdditive ); }, }, /** * The tileset's schema, groups, tileset metadata and other details from the * 3DTILES_metadata extension or a 3D Tiles 1.1 tileset JSON. This getter is * for internal use by other classes. * * @memberof Cesium3DTileset.prototype * @type {Cesium3DTilesetMetadata} * @private * @readonly * * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. */ metadataExtension: { get: function () { return this._metadataExtension; }, }, /** * The metadata properties attached to the tileset as a whole. * * @memberof Cesium3DTileset.prototype * * @type {TilesetMetadata} * @private * @readonly * * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. */ metadata: { get: function () { if (defined(this._metadataExtension)) { return this._metadataExtension.tileset; } return undefined; }, }, /** * The metadata schema used in this tileset. Shorthand for *tileset.metadataExtension.schema
*
* @memberof Cesium3DTileset.prototype
*
* @type {MetadataSchema}
* @private
* @readonly
*
* @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy.
*/
schema: {
get: function () {
if (defined(this._metadataExtension)) {
return this._metadataExtension.schema;
}
return undefined;
},
},
/**
* The maximum screen space error used to drive level of detail refinement. This value helps determine when a tile
* refines to its descendants, and therefore plays a major role in balancing performance with visual quality.
*
* A tile's screen space error is roughly equivalent to the number of pixels wide that would be drawn if a sphere with a
* radius equal to the tile's geometric error were rendered at the tile's position. If this value exceeds
* maximumScreenSpaceError the tile refines to its descendants.
*
* Depending on the tileset, maximumScreenSpaceError may need to be tweaked to achieve the right balance.
* Higher values provide better performance but lower visual quality.
*
maximumScreenSpaceError must be greater than or equal to zero.
*/
maximumScreenSpaceError: {
get: function () {
return this._maximumScreenSpaceError;
},
set: function (value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number.greaterThanOrEquals(
"maximumScreenSpaceError",
value,
0
);
//>>includeEnd('debug');
this._maximumScreenSpaceError = value;
this._memoryAdjustedScreenSpaceError = value;
},
},
/**
* The amount of GPU memory (in bytes) used to cache tiles. This memory usage is estimated from
* geometry, textures, and batch table textures of loaded tiles. For point clouds, this value also
* includes per-point metadata.
* * Tiles not in view are unloaded to enforce this. *
** If decreasing this value results in unloading tiles, the tiles are unloaded the next frame. *
*
* If tiles sized more than cacheBytes are needed to meet the
* desired screen space error, determined by {@link Cesium3DTileset#maximumScreenSpaceError},
* for the current view, then the memory usage of the tiles loaded will exceed
* cacheBytes by up to maximumCacheOverflowBytes.
* For example, if cacheBytes is 500000, but 600000 bytes
* of tiles are needed to meet the screen space error, then 600000 bytes of tiles
* may be loaded (if maximumCacheOverflowBytes is at least 100000).
* When these tiles go out of view, they will be unloaded.
*
cacheBytes must be typeof 'number' and greater than or equal to 0
* @see Cesium3DTileset#totalMemoryUsageInBytes
*/
cacheBytes: {
get: function () {
return this._cacheBytes;
},
set: function (value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number.greaterThanOrEquals("value", value, 0);
//>>includeEnd('debug');
this._cacheBytes = value;
},
},
/**
* The maximum additional amount of GPU memory (in bytes) that will be used to cache tiles.
*
* If tiles sized more than cacheBytes plus maximumCacheOverflowBytes
* are needed to meet the desired screen space error, determined by
* {@link Cesium3DTileset#maximumScreenSpaceError} for the current view, then
* {@link Cesium3DTileset#memoryAdjustedScreenSpaceError} will be adjusted
* until the tiles required to meet the adjusted screen space error use less
* than cacheBytes plus maximumCacheOverflowBytes.
*
maximumCacheOverflowBytes must be typeof 'number' and greater than or equal to 0
* @see Cesium3DTileset#totalMemoryUsageInBytes
*/
maximumCacheOverflowBytes: {
get: function () {
return this._maximumCacheOverflowBytes;
},
set: function (value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number.greaterThanOrEquals("value", value, 0);
//>>includeEnd('debug');
this._maximumCacheOverflowBytes = value;
},
},
/**
* If loading the level of detail required by @{link Cesium3DTileset#maximumScreenSpaceError}
* results in the memory usage exceeding @{link Cesium3DTileset#cacheBytes}
* plus @{link Cesium3DTileset#maximumCacheOverflowBytes}, level of detail refinement
* will instead use this (larger) adjusted screen space error to achieve the
* best possible visual quality within the available memory
*
* @memberof Cesium3DTileset.prototype
*
* @type {number}
* @readonly
*
* @private
*/
memoryAdjustedScreenSpaceError: {
get: function () {
return this._memoryAdjustedScreenSpaceError;
},
},
/**
* Options for controlling point size based on geometric error and eye dome lighting.
*
* @memberof Cesium3DTileset.prototype
*
* @type {PointCloudShading}
*/
pointCloudShading: {
get: function () {
return this._pointCloudShading;
},
set: function (value) {
//>>includeStart('debug', pragmas.debug);
Check.defined("pointCloudShading", value);
//>>includeEnd('debug');
this._pointCloudShading = value;
},
},
/**
* The root tile.
*
* @memberOf Cesium3DTileset.prototype
*
* @type {Cesium3DTile}
* @readonly
*/
root: {
get: function () {
return this._root;
},
},
/**
* The tileset's bounding sphere.
*
* @memberof Cesium3DTileset.prototype
*
* @type {BoundingSphere}
* @readonly
*
* @example
* const tileset = await Cesium.Cesium3DTileset.fromUrl("http://localhost:8002/tilesets/Seattle/tileset.json");
*
* viewer.scene.primitives.add(tileset);
*
* // Set the camera to view the newly added tileset
* viewer.camera.viewBoundingSphere(tileset.boundingSphere, new Cesium.HeadingPitchRange(0, -0.5, 0));
*/
boundingSphere: {
get: function () {
this._root.updateTransform(this._modelMatrix);
return this._root.boundingSphere;
},
},
/**
* A 4x4 transformation matrix that transforms the entire tileset.
*
* @memberof Cesium3DTileset.prototype
*
* @type {Matrix4}
* @default Matrix4.IDENTITY
*
* @example
* // Adjust a tileset's height from the globe's surface.
* const heightOffset = 20.0;
* const boundingSphere = tileset.boundingSphere;
* const cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
* const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
* const offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);
* const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
* tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
*/
modelMatrix: {
get: function () {
return this._modelMatrix;
},
set: function (value) {
this._modelMatrix = Matrix4.clone(value, this._modelMatrix);
},
},
/**
* Returns the time, in milliseconds, since the tileset was loaded and first updated.
*
* @memberof Cesium3DTileset.prototype
*
* @type {number}
* @readonly
*/
timeSinceLoad: {
get: function () {
return this._timeSinceLoad;
},
},
/**
* The total amount of GPU memory in bytes used by the tileset. This value is estimated from
* geometry, texture, batch table textures, and binary metadata of loaded tiles.
*
* @memberof Cesium3DTileset.prototype
*
* @type {number}
* @readonly
*
* @see Cesium3DTileset#cacheBytes
*/
totalMemoryUsageInBytes: {
get: function () {
const statistics = this._statistics;
return (
statistics.texturesByteLength +
statistics.geometryByteLength +
statistics.batchTableByteLength
);
},
},
/**
* @private
*/
clippingPlanesOriginMatrix: {
get: function () {
if (!defined(this._clippingPlanesOriginMatrix)) {
return Matrix4.IDENTITY;
}
if (this._clippingPlanesOriginMatrixDirty) {
Matrix4.multiply(
this.root.computedTransform,
this._initialClippingPlanesOriginMatrix,
this._clippingPlanesOriginMatrix
);
this._clippingPlanesOriginMatrixDirty = false;
}
return this._clippingPlanesOriginMatrix;
},
},
/**
* @private
*/
styleEngine: {
get: function () {
return this._styleEngine;
},
},
/**
* @private
*/
statistics: {
get: function () {
return this._statistics;
},
},
/**
* Determines whether terrain, 3D Tiles, or both will be classified by this tileset.
* * This option is only applied to tilesets containing batched 3D models, * glTF content, geometry data, or vector data. Even when undefined, vector * and geometry data must render as classifications and will default to * rendering on both terrain and other 3D Tiles tilesets. *
** When enabled for batched 3D model and glTF tilesets, there are a few * requirements/limitations on the glTF: *
EXT_mesh_gpu_instancing extension.POSITION semantic is required._BATCHIDs and an index buffer are both present, all indices with the same batch id must occupy contiguous sections of the index buffer._BATCHIDs are present with no index buffer, all positions with the same batch id must occupy contiguous sections of the position buffer.* Additionally, classification is not supported for points or instanced 3D * models. *
** The 3D Tiles or terrain receiving the classification must be opaque. *
* * @memberof Cesium3DTileset.prototype * * @type {ClassificationType} * @default undefined * * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. * @readonly */ classificationType: { get: function () { return this._classificationType; }, }, /** * Gets an ellipsoid describing the shape of the globe. * * @memberof Cesium3DTileset.prototype * * @type {Ellipsoid} * @readonly */ ellipsoid: { get: function () { return this._ellipsoid; }, }, /** * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the cone size that determines which tiles are deferred. * Tiles that are inside this cone are loaded immediately. Tiles outside the cone are potentially deferred based on how far outside the cone they are and {@link Cesium3DTileset#foveatedInterpolationCallback} and {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation}. * Setting this to 0.0 means the cone will be the line formed by the camera position and its view direction. Setting this to 1.0 means the cone encompasses the entire field of view of the camera, essentially disabling the effect. * * @memberof Cesium3DTileset.prototype * * @type {number} * @default 0.3 */ foveatedConeSize: { get: function () { return this._foveatedConeSize; }, set: function (value) { //>>includeStart('debug', pragmas.debug); Check.typeOf.number.greaterThanOrEquals("foveatedConeSize", value, 0.0); Check.typeOf.number.lessThanOrEquals("foveatedConeSize", value, 1.0); //>>includeEnd('debug'); this._foveatedConeSize = value; }, }, /** * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the starting screen space error relaxation for tiles outside the foveated cone. * The screen space error will be raised starting with this value up to {@link Cesium3DTileset#maximumScreenSpaceError} based on the provided {@link Cesium3DTileset#foveatedInterpolationCallback}. * * @memberof Cesium3DTileset.prototype * * @type {number} * @default 0.0 */ foveatedMinimumScreenSpaceErrorRelaxation: { get: function () { return this._foveatedMinimumScreenSpaceErrorRelaxation; }, set: function (value) { //>>includeStart('debug', pragmas.debug); Check.typeOf.number.greaterThanOrEquals( "foveatedMinimumScreenSpaceErrorRelaxation", value, 0.0 ); Check.typeOf.number.lessThanOrEquals( "foveatedMinimumScreenSpaceErrorRelaxation", value, this.maximumScreenSpaceError ); //>>includeEnd('debug'); this._foveatedMinimumScreenSpaceErrorRelaxation = value; }, }, /** * Returns theextras property at the top-level of the tileset JSON, which contains application specific metadata.
* Returns undefined if extras does not exist.
*
* @memberof Cesium3DTileset.prototype
*
* @type {*}
* @readonly
*
* @see {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#specifying-extensions-and-application-specific-extras|Extras in the 3D Tiles specification.}
*/
extras: {
get: function () {
return this._extras;
},
},
/**
* The properties for managing image-based lighting on this tileset.
*
* @memberof Cesium3DTileset.prototype
*
* @type {ImageBasedLighting}
*/
imageBasedLighting: {
get: function () {
return this._imageBasedLighting;
},
set: function (value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.object("imageBasedLighting", this._imageBasedLighting);
//>>includeEnd('debug');
if (value !== this._imageBasedLighting) {
if (
this._shouldDestroyImageBasedLighting &&
!this._imageBasedLighting.isDestroyed()
) {
this._imageBasedLighting.destroy();
}
this._imageBasedLighting = value;
this._shouldDestroyImageBasedLighting = false;
}
},
},
/**
* Indicates that only the tileset's vector tiles should be used for classification.
*
* @memberof Cesium3DTileset.prototype
*
* @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy.
*
* @type {boolean}
* @default false
*/
vectorClassificationOnly: {
get: function () {
return this._vectorClassificationOnly;
},
},
/**
* Whether vector tiles should keep decoded positions in memory.
* This is used with {@link Cesium3DTileFeature.getPolylinePositions}.
*
* @memberof Cesium3DTileset.prototype
*
* @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy.
*
* @type {boolean}
* @default false
*/
vectorKeepDecodedPositions: {
get: function () {
return this._vectorKeepDecodedPositions;
},
},
/**
* Determines whether the credits of the tileset will be displayed on the screen
*
* @memberof Cesium3DTileset.prototype
*
* @type {boolean}
* @default false
*/
showCreditsOnScreen: {
get: function () {
return this._showCreditsOnScreen;
},
set: function (value) {
this._showCreditsOnScreen = value;
createCredits(this);
},
},
/**
* Label of the feature ID set to use for picking and styling.
* * For EXT_mesh_features, this is the feature ID's label property, or * "featureId_N" (where N is the index in the featureIds array) when not * specified. EXT_feature_metadata did not have a label field, so such * feature ID sets are always labeled "featureId_N" where N is the index in * the list of all feature Ids, where feature ID attributes are listed before * feature ID textures. *
** If featureIdLabel is set to an integer N, it is converted to * the string "featureId_N" automatically. If both per-primitive and * per-instance feature IDs are present, the instance feature IDs take * priority. *
* * @memberof Cesium3DTileset.prototype * * @type {string} * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. */ featureIdLabel: { get: function () { return this._featureIdLabel; }, set: function (value) { // indices get converted into featureId_N if (typeof value === "number") { value = `featureId_${value}`; } //>>includeStart('debug', pragmas.debug); Check.typeOf.string("value", value); //>>includeEnd('debug'); this._featureIdLabel = value; }, }, /** * Label of the instance feature ID set used for picking and styling. ** If instanceFeatureIdLabel is set to an integer N, it is converted to * the string "instanceFeatureId_N" automatically. * If both per-primitive and per-instance feature IDs are present, the * instance feature IDs take priority. *
* * @memberof Cesium3DTileset.prototype * * @type {string} * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. */ instanceFeatureIdLabel: { get: function () { return this._instanceFeatureIdLabel; }, set: function (value) { // indices get converted into instanceFeatureId_N if (typeof value === "number") { value = `instanceFeatureId_${value}`; } //>>includeStart('debug', pragmas.debug); Check.typeOf.string("value", value); //>>includeEnd('debug'); this._instanceFeatureIdLabel = value; }, }, }); /** * Creates a {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification|3D Tiles tileset}, * used for streaming massive heterogeneous 3D geospatial datasets, from a Cesium ion asset ID. * * @param {number} assetId The Cesium ion asset id. * @param {Cesium3DTileset.ConstructorOptions} [options] An object describing initialization options * @returns {Promise