From 6c2819a89c273623f86f445742137975172d7e21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Stra=C3=9Fburger?= Date: Thu, 3 Nov 2016 04:29:50 +0100 Subject: [PATCH] :confetti_ball: multi tile support! endless left/right scroll, promise refactor --- src/Renderer.coffee | 60 ++++++++++++++++++++++++++++----------------- src/Termap.coffee | 2 ++ 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/Renderer.coffee b/src/Renderer.coffee index 643cbdc..3ce7680 100644 --- a/src/Renderer.coffee +++ b/src/Renderer.coffee @@ -8,6 +8,7 @@ x256 = require 'x256' mercator = new (require('sphericalmercator'))() tilebelt = require 'tilebelt' MBTiles = require 'mbtiles' +Promise = require 'bluebird' Canvas = require './Canvas' LabelBuffer = require './LabelBuffer' @@ -99,40 +100,52 @@ module.exports = class Renderer # TODO: tiles = @_tilesInBBox @_getBBox() - z = Math.max 0, Math.floor zoom - xyz = tilebelt.pointToTileFraction center.lon, center.lat, z - tile = - size: tileSize - x: Math.floor xyz[0] - y: Math.floor xyz[1] - z: z + Promise + .resolve @_visibleTiles center, zoom + .map (tile) => @_getTile tile.xyz, tile + .then (tiles) => + for tile in tiles + @_renderTile tile.data, zoom, tile.meta.position - tileSize = @config.tileSize / @_scaleAtZoom(zoom) - position = [ - @width/2-(xyz[0]-tile.x)*tileSize - @height/2-(xyz[1]-tile.y)*tileSize - ] - - @_getTile tile - .then (data) => - @_renderTile data, zoom, position @_writeFrame() @isDrawing = false @lastDrawAt = Date.now() - _getTile: (tile) -> - cacheKey = [tile.z, tile.x, tile.y].join "-" + _visibleTiles: (center, zoom) -> + z = Math.max 0, Math.floor zoom + xyz = tilebelt.pointToTileFraction center.lon, center.lat, z - # if data = @cache[cacheKey] - # console.log cacheKey - # console.log data - # return Promise.resolve data + tiles = [] + tileSize = @config.tileSize / @_scaleAtZoom(zoom) + for y in [Math.floor(xyz[1])-1..Math.floor(xyz[1])+1] + for x in [Math.floor(xyz[0])-1..Math.floor(xyz[0])+1] + tile = x: x, y: y, z: z + position = [ + @width/2-(xyz[0]-tile.x)*tileSize + @height/2-(xyz[1]-tile.y)*tileSize + ] + + tile.x %= Math.pow 2, z + tile.y %= Math.pow 2, z + + if position[0]+tileSize < 0 or + position[1]+tileSize < 0 or + position[0]>@width or + position[1]>@height + continue + + tiles.push xyz: tile, position: position + + tiles + + _getTile: (tile, meta = {}) -> @tileSource .getTile tile.z, tile.x, tile.y .then (data) => - @cache[cacheKey] = data + data: data + meta: meta _renderTile: (tile, zoom, position) -> @canvas.reset() @@ -160,6 +173,7 @@ module.exports = class Renderer if @config.layers[layer]?.minZoom and zoom > @config.layers[layer].minZoom continue + # TODO: reimplement tree based lookup #features = tile.layers[layer].tree.search box #@notify "rendering #{features.length} #{layer} features.." diff --git a/src/Termap.coffee b/src/Termap.coffee index 49f365d..373dfb3 100644 --- a/src/Termap.coffee +++ b/src/Termap.coffee @@ -174,6 +174,8 @@ module.exports = class Termap .draw @center, @zoom, @rotation .then => @renderer.notify @_getFooter() + .catch => + @renderer.notify "renderer is busy" _getFooter: -> # features = @renderer.featuresAt @mousePosition.x-1-(@view[0]>>1), @mousePosition.y-1-(@view[1]>>2)