mapbox-gl
Version:
A WebGL interactive maps library
42 lines (31 loc) • 1.73 kB
JavaScript
;
const pixelsToTileUnits = require('../source/pixels_to_tile_units');
exports.prepare = function (image, painter, program) {
const gl = painter.gl;
const imagePosA = painter.spriteAtlas.getPosition(image.from, true);
const imagePosB = painter.spriteAtlas.getPosition(image.to, true);
if (!imagePosA || !imagePosB) return;
gl.uniform1i(program.u_image, 0);
gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);
gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);
gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);
gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);
gl.uniform1f(program.u_mix, image.t);
gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);
gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);
gl.uniform1f(program.u_scale_a, image.fromScale);
gl.uniform1f(program.u_scale_b, image.toScale);
gl.activeTexture(gl.TEXTURE0);
painter.spriteAtlas.bind(gl, true);
};
exports.setTile = function (tile, painter, program) {
const gl = painter.gl;
gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));
const numTiles = Math.pow(2, tile.coord.z);
const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles;
const pixelX = tileSizeAtNearestZoom * (tile.coord.x + tile.coord.w * numTiles);
const pixelY = tileSizeAtNearestZoom * tile.coord.y;
// split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.
gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);
gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);
};