123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533 |
- import Cartesian2 from "../Core/Cartesian2.js";
- import Cartesian4 from "../Core/Cartesian4.js";
- import defaultValue from "../Core/defaultValue.js";
- import defined from "../Core/defined.js";
- import destroyObject from "../Core/destroyObject.js";
- import DeveloperError from "../Core/DeveloperError.js";
- import FeatureDetection from "../Core/FeatureDetection.js";
- import GeographicProjection from "../Core/GeographicProjection.js";
- import IndexDatatype from "../Core/IndexDatatype.js";
- import CesiumMath from "../Core/Math.js";
- import PixelFormat from "../Core/PixelFormat.js";
- import Rectangle from "../Core/Rectangle.js";
- import Request from "../Core/Request.js";
- import RequestState from "../Core/RequestState.js";
- import RequestType from "../Core/RequestType.js";
- import TerrainProvider from "../Core/TerrainProvider.js";
- import TileProviderError from "../Core/TileProviderError.js";
- import WebMercatorProjection from "../Core/WebMercatorProjection.js";
- import Buffer from "../Renderer/Buffer.js";
- import BufferUsage from "../Renderer/BufferUsage.js";
- import ComputeCommand from "../Renderer/ComputeCommand.js";
- import ContextLimits from "../Renderer/ContextLimits.js";
- import MipmapHint from "../Renderer/MipmapHint.js";
- import Sampler from "../Renderer/Sampler.js";
- import ShaderProgram from "../Renderer/ShaderProgram.js";
- import ShaderSource from "../Renderer/ShaderSource.js";
- import Texture from "../Renderer/Texture.js";
- import TextureMagnificationFilter from "../Renderer/TextureMagnificationFilter.js";
- import TextureMinificationFilter from "../Renderer/TextureMinificationFilter.js";
- import TextureWrap from "../Renderer/TextureWrap.js";
- import VertexArray from "../Renderer/VertexArray.js";
- import ReprojectWebMercatorFS from "../Shaders/ReprojectWebMercatorFS.js";
- import ReprojectWebMercatorVS from "../Shaders/ReprojectWebMercatorVS.js";
- import when from "../ThirdParty/when.js";
- import Imagery from "./Imagery.js";
- import ImagerySplitDirection from "./ImagerySplitDirection.js";
- import ImageryState from "./ImageryState.js";
- import TileImagery from "./TileImagery.js";
- function ImageryLayer(imageryProvider, options) {
- this._imageryProvider = imageryProvider;
- options = defaultValue(options, defaultValue.EMPTY_OBJECT);
-
- this.alpha = defaultValue(
- options.alpha,
- defaultValue(imageryProvider.defaultAlpha, 1.0)
- );
-
- this.nightAlpha = defaultValue(
- options.nightAlpha,
- defaultValue(imageryProvider.defaultNightAlpha, 1.0)
- );
-
- this.dayAlpha = defaultValue(
- options.dayAlpha,
- defaultValue(imageryProvider.defaultDayAlpha, 1.0)
- );
-
- this.brightness = defaultValue(
- options.brightness,
- defaultValue(
- imageryProvider.defaultBrightness,
- ImageryLayer.DEFAULT_BRIGHTNESS
- )
- );
-
- this.contrast = defaultValue(
- options.contrast,
- defaultValue(imageryProvider.defaultContrast, ImageryLayer.DEFAULT_CONTRAST)
- );
-
- this.hue = defaultValue(
- options.hue,
- defaultValue(imageryProvider.defaultHue, ImageryLayer.DEFAULT_HUE)
- );
-
- this.saturation = defaultValue(
- options.saturation,
- defaultValue(
- imageryProvider.defaultSaturation,
- ImageryLayer.DEFAULT_SATURATION
- )
- );
-
- this.gamma = defaultValue(
- options.gamma,
- defaultValue(imageryProvider.defaultGamma, ImageryLayer.DEFAULT_GAMMA)
- );
-
- this.splitDirection = defaultValue(
- options.splitDirection,
- defaultValue(imageryProvider.defaultSplit, ImageryLayer.DEFAULT_SPLIT)
- );
-
- this.minificationFilter = defaultValue(
- options.minificationFilter,
- defaultValue(
- imageryProvider.defaultMinificationFilter,
- ImageryLayer.DEFAULT_MINIFICATION_FILTER
- )
- );
-
- this.magnificationFilter = defaultValue(
- options.magnificationFilter,
- defaultValue(
- imageryProvider.defaultMagnificationFilter,
- ImageryLayer.DEFAULT_MAGNIFICATION_FILTER
- )
- );
-
- this.show = defaultValue(options.show, true);
- this._minimumTerrainLevel = options.minimumTerrainLevel;
- this._maximumTerrainLevel = options.maximumTerrainLevel;
- this._rectangle = defaultValue(options.rectangle, Rectangle.MAX_VALUE);
- this._maximumAnisotropy = options.maximumAnisotropy;
- this._imageryCache = {};
- this._skeletonPlaceholder = new TileImagery(Imagery.createPlaceholder(this));
-
- this._show = true;
-
- this._layerIndex = -1;
-
- this._isBaseLayer = false;
- this._requestImageError = undefined;
- this._reprojectComputeCommands = [];
-
- this.cutoutRectangle = options.cutoutRectangle;
-
- this.colorToAlpha = options.colorToAlpha;
-
- this.colorToAlphaThreshold = defaultValue(
- options.colorToAlphaThreshold,
- ImageryLayer.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD
- );
- }
- Object.defineProperties(ImageryLayer.prototype, {
-
- imageryProvider: {
- get: function () {
- return this._imageryProvider;
- },
- },
-
- rectangle: {
- get: function () {
- return this._rectangle;
- },
- },
- });
- ImageryLayer.DEFAULT_BRIGHTNESS = 1.0;
- ImageryLayer.DEFAULT_CONTRAST = 1.0;
- ImageryLayer.DEFAULT_HUE = 0.0;
- ImageryLayer.DEFAULT_SATURATION = 1.0;
- ImageryLayer.DEFAULT_GAMMA = 1.0;
- ImageryLayer.DEFAULT_SPLIT = ImagerySplitDirection.NONE;
- ImageryLayer.DEFAULT_MINIFICATION_FILTER = TextureMinificationFilter.LINEAR;
- ImageryLayer.DEFAULT_MAGNIFICATION_FILTER = TextureMagnificationFilter.LINEAR;
- ImageryLayer.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD = 0.004;
- ImageryLayer.prototype.isBaseLayer = function () {
- return this._isBaseLayer;
- };
- ImageryLayer.prototype.isDestroyed = function () {
- return false;
- };
- ImageryLayer.prototype.destroy = function () {
- return destroyObject(this);
- };
- var imageryBoundsScratch = new Rectangle();
- var tileImageryBoundsScratch = new Rectangle();
- var clippedRectangleScratch = new Rectangle();
- var terrainRectangleScratch = new Rectangle();
- ImageryLayer.prototype.getViewableRectangle = function () {
- var imageryProvider = this._imageryProvider;
- var rectangle = this._rectangle;
- return imageryProvider.readyPromise.then(function () {
- return Rectangle.intersection(imageryProvider.rectangle, rectangle);
- });
- };
- ImageryLayer.prototype._createTileImagerySkeletons = function (
- tile,
- terrainProvider,
- insertionPoint
- ) {
- var surfaceTile = tile.data;
- if (
- defined(this._minimumTerrainLevel) &&
- tile.level < this._minimumTerrainLevel
- ) {
- return false;
- }
- if (
- defined(this._maximumTerrainLevel) &&
- tile.level > this._maximumTerrainLevel
- ) {
- return false;
- }
- var imageryProvider = this._imageryProvider;
- if (!defined(insertionPoint)) {
- insertionPoint = surfaceTile.imagery.length;
- }
- if (!imageryProvider.ready) {
-
-
-
- this._skeletonPlaceholder.loadingImagery.addReference();
- surfaceTile.imagery.splice(insertionPoint, 0, this._skeletonPlaceholder);
- return true;
- }
-
-
-
- var useWebMercatorT =
- imageryProvider.tilingScheme.projection instanceof WebMercatorProjection &&
- tile.rectangle.north < WebMercatorProjection.MaximumLatitude &&
- tile.rectangle.south > -WebMercatorProjection.MaximumLatitude;
-
-
-
-
- var imageryBounds = Rectangle.intersection(
- imageryProvider.rectangle,
- this._rectangle,
- imageryBoundsScratch
- );
- var rectangle = Rectangle.intersection(
- tile.rectangle,
- imageryBounds,
- tileImageryBoundsScratch
- );
- if (!defined(rectangle)) {
-
-
-
- if (!this.isBaseLayer()) {
- return false;
- }
- var baseImageryRectangle = imageryBounds;
- var baseTerrainRectangle = tile.rectangle;
- rectangle = tileImageryBoundsScratch;
- if (baseTerrainRectangle.south >= baseImageryRectangle.north) {
- rectangle.north = rectangle.south = baseImageryRectangle.north;
- } else if (baseTerrainRectangle.north <= baseImageryRectangle.south) {
- rectangle.north = rectangle.south = baseImageryRectangle.south;
- } else {
- rectangle.south = Math.max(
- baseTerrainRectangle.south,
- baseImageryRectangle.south
- );
- rectangle.north = Math.min(
- baseTerrainRectangle.north,
- baseImageryRectangle.north
- );
- }
- if (baseTerrainRectangle.west >= baseImageryRectangle.east) {
- rectangle.west = rectangle.east = baseImageryRectangle.east;
- } else if (baseTerrainRectangle.east <= baseImageryRectangle.west) {
- rectangle.west = rectangle.east = baseImageryRectangle.west;
- } else {
- rectangle.west = Math.max(
- baseTerrainRectangle.west,
- baseImageryRectangle.west
- );
- rectangle.east = Math.min(
- baseTerrainRectangle.east,
- baseImageryRectangle.east
- );
- }
- }
- var latitudeClosestToEquator = 0.0;
- if (rectangle.south > 0.0) {
- latitudeClosestToEquator = rectangle.south;
- } else if (rectangle.north < 0.0) {
- latitudeClosestToEquator = rectangle.north;
- }
-
-
-
-
- var errorRatio = 1.0;
- var targetGeometricError =
- errorRatio * terrainProvider.getLevelMaximumGeometricError(tile.level);
- var imageryLevel = getLevelWithMaximumTexelSpacing(
- this,
- targetGeometricError,
- latitudeClosestToEquator
- );
- imageryLevel = Math.max(0, imageryLevel);
- var maximumLevel = imageryProvider.maximumLevel;
- if (imageryLevel > maximumLevel) {
- imageryLevel = maximumLevel;
- }
- if (defined(imageryProvider.minimumLevel)) {
- var minimumLevel = imageryProvider.minimumLevel;
- if (imageryLevel < minimumLevel) {
- imageryLevel = minimumLevel;
- }
- }
- var imageryTilingScheme = imageryProvider.tilingScheme;
- var northwestTileCoordinates = imageryTilingScheme.positionToTileXY(
- Rectangle.northwest(rectangle),
- imageryLevel
- );
- var southeastTileCoordinates = imageryTilingScheme.positionToTileXY(
- Rectangle.southeast(rectangle),
- imageryLevel
- );
-
-
-
-
-
-
- var veryCloseX = tile.rectangle.width / 512.0;
- var veryCloseY = tile.rectangle.height / 512.0;
- var northwestTileRectangle = imageryTilingScheme.tileXYToRectangle(
- northwestTileCoordinates.x,
- northwestTileCoordinates.y,
- imageryLevel
- );
- if (
- Math.abs(northwestTileRectangle.south - tile.rectangle.north) <
- veryCloseY &&
- northwestTileCoordinates.y < southeastTileCoordinates.y
- ) {
- ++northwestTileCoordinates.y;
- }
- if (
- Math.abs(northwestTileRectangle.east - tile.rectangle.west) < veryCloseX &&
- northwestTileCoordinates.x < southeastTileCoordinates.x
- ) {
- ++northwestTileCoordinates.x;
- }
- var southeastTileRectangle = imageryTilingScheme.tileXYToRectangle(
- southeastTileCoordinates.x,
- southeastTileCoordinates.y,
- imageryLevel
- );
- if (
- Math.abs(southeastTileRectangle.north - tile.rectangle.south) <
- veryCloseY &&
- southeastTileCoordinates.y > northwestTileCoordinates.y
- ) {
- --southeastTileCoordinates.y;
- }
- if (
- Math.abs(southeastTileRectangle.west - tile.rectangle.east) < veryCloseX &&
- southeastTileCoordinates.x > northwestTileCoordinates.x
- ) {
- --southeastTileCoordinates.x;
- }
-
-
- var terrainRectangle = Rectangle.clone(
- tile.rectangle,
- terrainRectangleScratch
- );
- var imageryRectangle = imageryTilingScheme.tileXYToRectangle(
- northwestTileCoordinates.x,
- northwestTileCoordinates.y,
- imageryLevel
- );
- var clippedImageryRectangle = Rectangle.intersection(
- imageryRectangle,
- imageryBounds,
- clippedRectangleScratch
- );
- var imageryTileXYToRectangle;
- if (useWebMercatorT) {
- imageryTilingScheme.rectangleToNativeRectangle(
- terrainRectangle,
- terrainRectangle
- );
- imageryTilingScheme.rectangleToNativeRectangle(
- imageryRectangle,
- imageryRectangle
- );
- imageryTilingScheme.rectangleToNativeRectangle(
- clippedImageryRectangle,
- clippedImageryRectangle
- );
- imageryTilingScheme.rectangleToNativeRectangle(
- imageryBounds,
- imageryBounds
- );
- imageryTileXYToRectangle = imageryTilingScheme.tileXYToNativeRectangle.bind(
- imageryTilingScheme
- );
- veryCloseX = terrainRectangle.width / 512.0;
- veryCloseY = terrainRectangle.height / 512.0;
- } else {
- imageryTileXYToRectangle = imageryTilingScheme.tileXYToRectangle.bind(
- imageryTilingScheme
- );
- }
- var minU;
- var maxU = 0.0;
- var minV = 1.0;
- var maxV;
-
-
-
- if (
- !this.isBaseLayer() &&
- Math.abs(clippedImageryRectangle.west - terrainRectangle.west) >= veryCloseX
- ) {
- maxU = Math.min(
- 1.0,
- (clippedImageryRectangle.west - terrainRectangle.west) /
- terrainRectangle.width
- );
- }
- if (
- !this.isBaseLayer() &&
- Math.abs(clippedImageryRectangle.north - terrainRectangle.north) >=
- veryCloseY
- ) {
- minV = Math.max(
- 0.0,
- (clippedImageryRectangle.north - terrainRectangle.south) /
- terrainRectangle.height
- );
- }
- var initialMinV = minV;
- for (
- var i = northwestTileCoordinates.x;
- i <= southeastTileCoordinates.x;
- i++
- ) {
- minU = maxU;
- imageryRectangle = imageryTileXYToRectangle(
- i,
- northwestTileCoordinates.y,
- imageryLevel
- );
- clippedImageryRectangle = Rectangle.simpleIntersection(
- imageryRectangle,
- imageryBounds,
- clippedRectangleScratch
- );
- if (!defined(clippedImageryRectangle)) {
- continue;
- }
- maxU = Math.min(
- 1.0,
- (clippedImageryRectangle.east - terrainRectangle.west) /
- terrainRectangle.width
- );
-
-
-
-
- if (
- i === southeastTileCoordinates.x &&
- (this.isBaseLayer() ||
- Math.abs(clippedImageryRectangle.east - terrainRectangle.east) <
- veryCloseX)
- ) {
- maxU = 1.0;
- }
- minV = initialMinV;
- for (
- var j = northwestTileCoordinates.y;
- j <= southeastTileCoordinates.y;
- j++
- ) {
- maxV = minV;
- imageryRectangle = imageryTileXYToRectangle(i, j, imageryLevel);
- clippedImageryRectangle = Rectangle.simpleIntersection(
- imageryRectangle,
- imageryBounds,
- clippedRectangleScratch
- );
- if (!defined(clippedImageryRectangle)) {
- continue;
- }
- minV = Math.max(
- 0.0,
- (clippedImageryRectangle.south - terrainRectangle.south) /
- terrainRectangle.height
- );
-
-
-
-
- if (
- j === southeastTileCoordinates.y &&
- (this.isBaseLayer() ||
- Math.abs(clippedImageryRectangle.south - terrainRectangle.south) <
- veryCloseY)
- ) {
- minV = 0.0;
- }
- var texCoordsRectangle = new Cartesian4(minU, minV, maxU, maxV);
- var imagery = this.getImageryFromCache(i, j, imageryLevel);
- surfaceTile.imagery.splice(
- insertionPoint,
- 0,
- new TileImagery(imagery, texCoordsRectangle, useWebMercatorT)
- );
- ++insertionPoint;
- }
- }
- return true;
- };
- ImageryLayer.prototype._calculateTextureTranslationAndScale = function (
- tile,
- tileImagery
- ) {
- var imageryRectangle = tileImagery.readyImagery.rectangle;
- var terrainRectangle = tile.rectangle;
- if (tileImagery.useWebMercatorT) {
- var tilingScheme =
- tileImagery.readyImagery.imageryLayer.imageryProvider.tilingScheme;
- imageryRectangle = tilingScheme.rectangleToNativeRectangle(
- imageryRectangle,
- imageryBoundsScratch
- );
- terrainRectangle = tilingScheme.rectangleToNativeRectangle(
- terrainRectangle,
- terrainRectangleScratch
- );
- }
- var terrainWidth = terrainRectangle.width;
- var terrainHeight = terrainRectangle.height;
- var scaleX = terrainWidth / imageryRectangle.width;
- var scaleY = terrainHeight / imageryRectangle.height;
- return new Cartesian4(
- (scaleX * (terrainRectangle.west - imageryRectangle.west)) / terrainWidth,
- (scaleY * (terrainRectangle.south - imageryRectangle.south)) /
- terrainHeight,
- scaleX,
- scaleY
- );
- };
- ImageryLayer.prototype._requestImagery = function (imagery) {
- var imageryProvider = this._imageryProvider;
- var that = this;
- function success(image) {
- if (!defined(image)) {
- return failure();
- }
- imagery.image = image;
- imagery.state = ImageryState.RECEIVED;
- imagery.request = undefined;
- TileProviderError.handleSuccess(that._requestImageError);
- }
- function failure(e) {
- if (imagery.request.state === RequestState.CANCELLED) {
-
- imagery.state = ImageryState.UNLOADED;
- imagery.request = undefined;
- return;
- }
-
-
- imagery.state = ImageryState.FAILED;
- imagery.request = undefined;
- var message =
- "Failed to obtain image tile X: " +
- imagery.x +
- " Y: " +
- imagery.y +
- " Level: " +
- imagery.level +
- ".";
- that._requestImageError = TileProviderError.handleError(
- that._requestImageError,
- imageryProvider,
- imageryProvider.errorEvent,
- message,
- imagery.x,
- imagery.y,
- imagery.level,
- doRequest,
- e
- );
- }
- function doRequest() {
- var request = new Request({
- throttle: false,
- throttleByServer: true,
- type: RequestType.IMAGERY,
- });
- imagery.request = request;
- imagery.state = ImageryState.TRANSITIONING;
- var imagePromise = imageryProvider.requestImage(
- imagery.x,
- imagery.y,
- imagery.level,
- request
- );
- if (!defined(imagePromise)) {
-
- imagery.state = ImageryState.UNLOADED;
- imagery.request = undefined;
- return;
- }
- if (defined(imageryProvider.getTileCredits)) {
- imagery.credits = imageryProvider.getTileCredits(
- imagery.x,
- imagery.y,
- imagery.level
- );
- }
- when(imagePromise, success, failure);
- }
- doRequest();
- };
- ImageryLayer.prototype._createTextureWebGL = function (context, imagery) {
- var sampler = new Sampler({
- minificationFilter: this.minificationFilter,
- magnificationFilter: this.magnificationFilter,
- });
- var image = imagery.image;
- if (defined(image.internalFormat)) {
- return new Texture({
- context: context,
- pixelFormat: image.internalFormat,
- width: image.width,
- height: image.height,
- source: {
- arrayBufferView: image.bufferView,
- },
- sampler: sampler,
- });
- }
- return new Texture({
- context: context,
- source: image,
- pixelFormat: this._imageryProvider.hasAlphaChannel
- ? PixelFormat.RGBA
- : PixelFormat.RGB,
- sampler: sampler,
- });
- };
- ImageryLayer.prototype._createTexture = function (context, imagery) {
- var imageryProvider = this._imageryProvider;
- var image = imagery.image;
-
-
- if (defined(imageryProvider.tileDiscardPolicy)) {
- var discardPolicy = imageryProvider.tileDiscardPolicy;
- if (defined(discardPolicy)) {
-
-
- if (!discardPolicy.isReady()) {
- imagery.state = ImageryState.RECEIVED;
- return;
- }
-
- if (discardPolicy.shouldDiscardImage(image)) {
- imagery.state = ImageryState.INVALID;
- return;
- }
- }
- }
-
- if (
- this.minificationFilter !== TextureMinificationFilter.NEAREST &&
- this.minificationFilter !== TextureMinificationFilter.LINEAR
- ) {
- throw new DeveloperError(
- "ImageryLayer minification filter must be NEAREST or LINEAR"
- );
- }
-
-
- var texture = this._createTextureWebGL(context, imagery);
- if (
- imageryProvider.tilingScheme.projection instanceof WebMercatorProjection
- ) {
- imagery.textureWebMercator = texture;
- } else {
- imagery.texture = texture;
- }
- imagery.image = undefined;
- imagery.state = ImageryState.TEXTURE_LOADED;
- };
- function getSamplerKey(
- minificationFilter,
- magnificationFilter,
- maximumAnisotropy
- ) {
- return (
- minificationFilter + ":" + magnificationFilter + ":" + maximumAnisotropy
- );
- }
- ImageryLayer.prototype._finalizeReprojectTexture = function (context, texture) {
- var minificationFilter = this.minificationFilter;
- var magnificationFilter = this.magnificationFilter;
- var usesLinearTextureFilter =
- minificationFilter === TextureMinificationFilter.LINEAR &&
- magnificationFilter === TextureMagnificationFilter.LINEAR;
-
-
- if (
- usesLinearTextureFilter &&
- !PixelFormat.isCompressedFormat(texture.pixelFormat) &&
- CesiumMath.isPowerOfTwo(texture.width) &&
- CesiumMath.isPowerOfTwo(texture.height)
- ) {
- minificationFilter = TextureMinificationFilter.LINEAR_MIPMAP_LINEAR;
- var maximumSupportedAnisotropy =
- ContextLimits.maximumTextureFilterAnisotropy;
- var maximumAnisotropy = Math.min(
- maximumSupportedAnisotropy,
- defaultValue(this._maximumAnisotropy, maximumSupportedAnisotropy)
- );
- var mipmapSamplerKey = getSamplerKey(
- minificationFilter,
- magnificationFilter,
- maximumAnisotropy
- );
- var mipmapSamplers = context.cache.imageryLayerMipmapSamplers;
- if (!defined(mipmapSamplers)) {
- mipmapSamplers = {};
- context.cache.imageryLayerMipmapSamplers = mipmapSamplers;
- }
- var mipmapSampler = mipmapSamplers[mipmapSamplerKey];
- if (!defined(mipmapSampler)) {
- mipmapSampler = mipmapSamplers[mipmapSamplerKey] = new Sampler({
- wrapS: TextureWrap.CLAMP_TO_EDGE,
- wrapT: TextureWrap.CLAMP_TO_EDGE,
- minificationFilter: minificationFilter,
- magnificationFilter: magnificationFilter,
- maximumAnisotropy: maximumAnisotropy,
- });
- }
- texture.generateMipmap(MipmapHint.NICEST);
- texture.sampler = mipmapSampler;
- } else {
- var nonMipmapSamplerKey = getSamplerKey(
- minificationFilter,
- magnificationFilter,
- 0
- );
- var nonMipmapSamplers = context.cache.imageryLayerNonMipmapSamplers;
- if (!defined(nonMipmapSamplers)) {
- nonMipmapSamplers = {};
- context.cache.imageryLayerNonMipmapSamplers = nonMipmapSamplers;
- }
- var nonMipmapSampler = nonMipmapSamplers[nonMipmapSamplerKey];
- if (!defined(nonMipmapSampler)) {
- nonMipmapSampler = nonMipmapSamplers[nonMipmapSamplerKey] = new Sampler({
- wrapS: TextureWrap.CLAMP_TO_EDGE,
- wrapT: TextureWrap.CLAMP_TO_EDGE,
- minificationFilter: minificationFilter,
- magnificationFilter: magnificationFilter,
- });
- }
- texture.sampler = nonMipmapSampler;
- }
- };
- ImageryLayer.prototype._reprojectTexture = function (
- frameState,
- imagery,
- needGeographicProjection
- ) {
- var texture = imagery.textureWebMercator || imagery.texture;
- var rectangle = imagery.rectangle;
- var context = frameState.context;
- needGeographicProjection = defaultValue(needGeographicProjection, true);
-
-
-
-
- if (
- needGeographicProjection &&
- !(
- this._imageryProvider.tilingScheme.projection instanceof
- GeographicProjection
- ) &&
- rectangle.width / texture.width > 1e-5
- ) {
- var that = this;
- imagery.addReference();
- var computeCommand = new ComputeCommand({
- persists: true,
- owner: this,
-
-
- preExecute: function (command) {
- reprojectToGeographic(command, context, texture, imagery.rectangle);
- },
- postExecute: function (outputTexture) {
- imagery.texture = outputTexture;
- that._finalizeReprojectTexture(context, outputTexture);
- imagery.state = ImageryState.READY;
- imagery.releaseReference();
- },
- });
- this._reprojectComputeCommands.push(computeCommand);
- } else {
- if (needGeographicProjection) {
- imagery.texture = texture;
- }
- this._finalizeReprojectTexture(context, texture);
- imagery.state = ImageryState.READY;
- }
- };
- ImageryLayer.prototype.queueReprojectionCommands = function (frameState) {
- var computeCommands = this._reprojectComputeCommands;
- var length = computeCommands.length;
- for (var i = 0; i < length; ++i) {
- frameState.commandList.push(computeCommands[i]);
- }
- computeCommands.length = 0;
- };
- ImageryLayer.prototype.cancelReprojections = function () {
- this._reprojectComputeCommands.length = 0;
- };
- ImageryLayer.prototype.getImageryFromCache = function (
- x,
- y,
- level,
- imageryRectangle
- ) {
- var cacheKey = getImageryCacheKey(x, y, level);
- var imagery = this._imageryCache[cacheKey];
- if (!defined(imagery)) {
- imagery = new Imagery(this, x, y, level, imageryRectangle);
- this._imageryCache[cacheKey] = imagery;
- }
- imagery.addReference();
- return imagery;
- };
- ImageryLayer.prototype.removeImageryFromCache = function (imagery) {
- var cacheKey = getImageryCacheKey(imagery.x, imagery.y, imagery.level);
- delete this._imageryCache[cacheKey];
- };
- function getImageryCacheKey(x, y, level) {
- return JSON.stringify([x, y, level]);
- }
- var uniformMap = {
- u_textureDimensions: function () {
- return this.textureDimensions;
- },
- u_texture: function () {
- return this.texture;
- },
- textureDimensions: new Cartesian2(),
- texture: undefined,
- };
- var float32ArrayScratch = FeatureDetection.supportsTypedArrays()
- ? new Float32Array(2 * 64)
- : undefined;
- function reprojectToGeographic(command, context, texture, rectangle) {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var reproject = context.cache.imageryLayer_reproject;
- if (!defined(reproject)) {
- reproject = context.cache.imageryLayer_reproject = {
- vertexArray: undefined,
- shaderProgram: undefined,
- sampler: undefined,
- destroy: function () {
- if (defined(this.framebuffer)) {
- this.framebuffer.destroy();
- }
- if (defined(this.vertexArray)) {
- this.vertexArray.destroy();
- }
- if (defined(this.shaderProgram)) {
- this.shaderProgram.destroy();
- }
- },
- };
- var positions = new Float32Array(2 * 64 * 2);
- var index = 0;
- for (var j = 0; j < 64; ++j) {
- var y = j / 63.0;
- positions[index++] = 0.0;
- positions[index++] = y;
- positions[index++] = 1.0;
- positions[index++] = y;
- }
- var reprojectAttributeIndices = {
- position: 0,
- webMercatorT: 1,
- };
- var indices = TerrainProvider.getRegularGridIndices(2, 64);
- var indexBuffer = Buffer.createIndexBuffer({
- context: context,
- typedArray: indices,
- usage: BufferUsage.STATIC_DRAW,
- indexDatatype: IndexDatatype.UNSIGNED_SHORT,
- });
- reproject.vertexArray = new VertexArray({
- context: context,
- attributes: [
- {
- index: reprojectAttributeIndices.position,
- vertexBuffer: Buffer.createVertexBuffer({
- context: context,
- typedArray: positions,
- usage: BufferUsage.STATIC_DRAW,
- }),
- componentsPerAttribute: 2,
- },
- {
- index: reprojectAttributeIndices.webMercatorT,
- vertexBuffer: Buffer.createVertexBuffer({
- context: context,
- sizeInBytes: 64 * 2 * 4,
- usage: BufferUsage.STREAM_DRAW,
- }),
- componentsPerAttribute: 1,
- },
- ],
- indexBuffer: indexBuffer,
- });
- var vs = new ShaderSource({
- sources: [ReprojectWebMercatorVS],
- });
- reproject.shaderProgram = ShaderProgram.fromCache({
- context: context,
- vertexShaderSource: vs,
- fragmentShaderSource: ReprojectWebMercatorFS,
- attributeLocations: reprojectAttributeIndices,
- });
- reproject.sampler = new Sampler({
- wrapS: TextureWrap.CLAMP_TO_EDGE,
- wrapT: TextureWrap.CLAMP_TO_EDGE,
- minificationFilter: TextureMinificationFilter.LINEAR,
- magnificationFilter: TextureMagnificationFilter.LINEAR,
- });
- }
- texture.sampler = reproject.sampler;
- var width = texture.width;
- var height = texture.height;
- uniformMap.textureDimensions.x = width;
- uniformMap.textureDimensions.y = height;
- uniformMap.texture = texture;
- var sinLatitude = Math.sin(rectangle.south);
- var southMercatorY = 0.5 * Math.log((1 + sinLatitude) / (1 - sinLatitude));
- sinLatitude = Math.sin(rectangle.north);
- var northMercatorY = 0.5 * Math.log((1 + sinLatitude) / (1 - sinLatitude));
- var oneOverMercatorHeight = 1.0 / (northMercatorY - southMercatorY);
- var outputTexture = new Texture({
- context: context,
- width: width,
- height: height,
- pixelFormat: texture.pixelFormat,
- pixelDatatype: texture.pixelDatatype,
- preMultiplyAlpha: texture.preMultiplyAlpha,
- });
-
-
-
-
- if (CesiumMath.isPowerOfTwo(width) && CesiumMath.isPowerOfTwo(height)) {
- outputTexture.generateMipmap(MipmapHint.NICEST);
- }
- var south = rectangle.south;
- var north = rectangle.north;
- var webMercatorT = float32ArrayScratch;
- var outputIndex = 0;
- for (var webMercatorTIndex = 0; webMercatorTIndex < 64; ++webMercatorTIndex) {
- var fraction = webMercatorTIndex / 63.0;
- var latitude = CesiumMath.lerp(south, north, fraction);
- sinLatitude = Math.sin(latitude);
- var mercatorY = 0.5 * Math.log((1.0 + sinLatitude) / (1.0 - sinLatitude));
- var mercatorFraction = (mercatorY - southMercatorY) * oneOverMercatorHeight;
- webMercatorT[outputIndex++] = mercatorFraction;
- webMercatorT[outputIndex++] = mercatorFraction;
- }
- reproject.vertexArray
- .getAttribute(1)
- .vertexBuffer.copyFromArrayView(webMercatorT);
- command.shaderProgram = reproject.shaderProgram;
- command.outputTexture = outputTexture;
- command.uniformMap = uniformMap;
- command.vertexArray = reproject.vertexArray;
- }
- function getLevelWithMaximumTexelSpacing(
- layer,
- texelSpacing,
- latitudeClosestToEquator
- ) {
-
- var imageryProvider = layer._imageryProvider;
- var tilingScheme = imageryProvider.tilingScheme;
- var ellipsoid = tilingScheme.ellipsoid;
- var latitudeFactor = !(
- layer._imageryProvider.tilingScheme.projection instanceof
- GeographicProjection
- )
- ? Math.cos(latitudeClosestToEquator)
- : 1.0;
- var tilingSchemeRectangle = tilingScheme.rectangle;
- var levelZeroMaximumTexelSpacing =
- (ellipsoid.maximumRadius * tilingSchemeRectangle.width * latitudeFactor) /
- (imageryProvider.tileWidth * tilingScheme.getNumberOfXTilesAtLevel(0));
- var twoToTheLevelPower = levelZeroMaximumTexelSpacing / texelSpacing;
- var level = Math.log(twoToTheLevelPower) / Math.log(2);
- var rounded = Math.round(level);
- return rounded | 0;
- }
- export default ImageryLayer;
|