UNPKG

mapbox-gl

Version:
57 lines (47 loc) 1.96 kB
// @flow import type SourceCache from '../source/source_cache.js'; import {clamp} from '../util/util.js'; import browser from '../util/browser.js'; import Tile from '../source/tile.js'; import type Transform from '../geo/transform.js'; export type RasterFade = {| opacity: number, mix: number, |}; function rasterFade(tile: Tile, parentTile: ?Tile, sourceCache: SourceCache, transform: Transform, fadeDuration: number): RasterFade { if (fadeDuration > 0) { const now = browser.now(); const sinceTile = (now - tile.timeAdded) / fadeDuration; const sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; const source = sourceCache.getSource(); const idealZ = transform.coveringZoomLevel({ tileSize: source.tileSize, roundZoom: source.roundZoom }); // if no parent or parent is older, fade in; if parent is younger, fade out const fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ); const childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1); // we don't crossfade tiles that were just refreshed upon expiring: // once they're old enough to pass the crossfading threshold // (fadeDuration), unset the `refreshedUponExpiration` flag so we don't // incorrectly fail to crossfade them when zooming if (tile.refreshedUponExpiration && sinceTile >= 1) tile.refreshedUponExpiration = false; if (parentTile) { return { opacity: 1, mix: 1 - childOpacity }; } else { return { opacity: childOpacity, mix: 0 }; } } else { return { opacity: 1, mix: 0 }; } } export default rasterFade;