mapbox-gl
Version:
A WebGL interactive maps library
57 lines (47 loc) • 1.96 kB
JavaScript
// @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;