UNPKG

mapbox-gl

Version:
42 lines (31 loc) 1.73 kB
'use strict'; 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); };