123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /*global define*/
- define([
- '../Core/defined',
- './ImageryState'
- ], function(
- defined,
- ImageryState) {
- "use strict";
- /**
- * 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.
- */
- var TileImagery = function(imagery, textureCoordinateRectangle) {
- this.readyImagery = undefined;
- this.loadingImagery = imagery;
- this.textureCoordinateRectangle = textureCoordinateRectangle;
- this.textureTranslationAndScale = undefined;
- };
- /**
- * 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 {Context} context The context.
- * @returns {Boolean} True if this instance is done loading; otherwise, false.
- */
- TileImagery.prototype.processStateMachine = function(tile, context) {
- var loadingImagery = this.loadingImagery;
- var imageryLayer = loadingImagery.imageryLayer;
- if (loadingImagery.state === ImageryState.UNLOADED) {
- loadingImagery.state = ImageryState.TRANSITIONING;
- imageryLayer._requestImagery(loadingImagery);
- }
- if (loadingImagery.state === ImageryState.RECEIVED) {
- loadingImagery.state = ImageryState.TRANSITIONING;
- imageryLayer._createTexture(context, loadingImagery);
- }
- if (loadingImagery.state === ImageryState.TEXTURE_LOADED) {
- loadingImagery.state = ImageryState.TRANSITIONING;
- imageryLayer._reprojectTexture(context, loadingImagery);
- }
- 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.
- var ancestor = loadingImagery.parent;
- var ancestorsAreStillLoading = false;
- while (defined(ancestor) && ancestor.state !== ImageryState.READY) {
- ancestorsAreStillLoading = ancestorsAreStillLoading || (ancestor.state !== ImageryState.FAILED && ancestor.state !== ImageryState.INVALID);
- 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 (!ancestorsAreStillLoading && (loadingImagery.state === ImageryState.FAILED || loadingImagery.state === ImageryState.INVALID)) {
- // This imagery tile is failed or invalid, and we have the "best available" substitute. So we're done loading.
- return true; // done loading
- }
- return false; // not done loading
- };
- return TileImagery;
- });
|