123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import defined from "../Core/defined.js";
- import ImageryState from "./ImageryState.js";
- /**
- * The assocation between a terrain tile and an imagery tile.
- *
- * @alias TileImagery
- * @private
- *
- * @param {Imagery} imagery The imagery tile.
- * @param {Cartesian4} textureCoordinateRectangle The texture rectangle of the tile that is covered
- * by the imagery, where X=west, Y=south, Z=east, W=north.
- * @param {Boolean} useWebMercatorT true to use the Web Mercator texture coordinates for this imagery tile.
- */
- function TileImagery(imagery, textureCoordinateRectangle, useWebMercatorT) {
- this.readyImagery = undefined;
- this.loadingImagery = imagery;
- this.textureCoordinateRectangle = textureCoordinateRectangle;
- this.textureTranslationAndScale = undefined;
- this.useWebMercatorT = useWebMercatorT;
- }
- /**
- * Frees the resources held by this instance.
- */
- TileImagery.prototype.freeResources = function () {
- if (defined(this.readyImagery)) {
- this.readyImagery.releaseReference();
- }
- if (defined(this.loadingImagery)) {
- this.loadingImagery.releaseReference();
- }
- };
- /**
- * Processes the load state machine for this instance.
- *
- * @param {Tile} tile The tile to which this instance belongs.
- * @param {FrameState} frameState The frameState.
- * @param {Boolean} skipLoading True to skip loading, e.g. new requests, creating textures. This function will
- * still synchronously process imagery that's already mostly ready to go, e.g. use textures
- * already loaded on ancestor tiles.
- * @returns {Boolean} True if this instance is done loading; otherwise, false.
- */
- TileImagery.prototype.processStateMachine = function (
- tile,
- frameState,
- skipLoading
- ) {
- const loadingImagery = this.loadingImagery;
- const imageryLayer = loadingImagery.imageryLayer;
- loadingImagery.processStateMachine(
- frameState,
- !this.useWebMercatorT,
- skipLoading
- );
- if (loadingImagery.state === ImageryState.READY) {
- if (defined(this.readyImagery)) {
- this.readyImagery.releaseReference();
- }
- this.readyImagery = this.loadingImagery;
- this.loadingImagery = undefined;
- this.textureTranslationAndScale = imageryLayer._calculateTextureTranslationAndScale(
- tile,
- this
- );
- return true; // done loading
- }
- // Find some ancestor imagery we can use while this imagery is still loading.
- let ancestor = loadingImagery.parent;
- let closestAncestorThatNeedsLoading;
- while (
- defined(ancestor) &&
- (ancestor.state !== ImageryState.READY ||
- (!this.useWebMercatorT && !defined(ancestor.texture)))
- ) {
- if (
- ancestor.state !== ImageryState.FAILED &&
- ancestor.state !== ImageryState.INVALID
- ) {
- // ancestor is still loading
- closestAncestorThatNeedsLoading =
- closestAncestorThatNeedsLoading || ancestor;
- }
- ancestor = ancestor.parent;
- }
- if (this.readyImagery !== ancestor) {
- if (defined(this.readyImagery)) {
- this.readyImagery.releaseReference();
- }
- this.readyImagery = ancestor;
- if (defined(ancestor)) {
- ancestor.addReference();
- this.textureTranslationAndScale = imageryLayer._calculateTextureTranslationAndScale(
- tile,
- this
- );
- }
- }
- if (
- loadingImagery.state === ImageryState.FAILED ||
- loadingImagery.state === ImageryState.INVALID
- ) {
- // The imagery tile is failed or invalid, so we'd like to use an ancestor instead.
- if (defined(closestAncestorThatNeedsLoading)) {
- // Push the ancestor's load process along a bit. This is necessary because some ancestor imagery
- // tiles may not be attached directly to a terrain tile. Such tiles will never load if
- // we don't do it here.
- closestAncestorThatNeedsLoading.processStateMachine(
- frameState,
- !this.useWebMercatorT,
- skipLoading
- );
- return false; // not done loading
- }
- // This imagery tile is failed or invalid, and we have the "best available" substitute.
- return true; // done loading
- }
- return false; // not done loading
- };
- export default TileImagery;
|