diff --git a/src/ol/renderer/canvas/canvasvectortilelayerrenderer.js b/src/ol/renderer/canvas/canvasvectortilelayerrenderer.js index 169641285b..76987cf96c 100644 --- a/src/ol/renderer/canvas/canvasvectortilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectortilelayerrenderer.js @@ -7,6 +7,7 @@ goog.require('goog.object'); goog.require('goog.vec.Mat4'); goog.require('ol.TileRange'); goog.require('ol.TileState'); +goog.require('ol.VectorTile'); goog.require('ol.ViewHint'); goog.require('ol.dom'); goog.require('ol.extent'); @@ -155,12 +156,10 @@ ol.renderer.canvas.VectorTileLayer.prototype.composeFrame = /** * @param {ol.VectorTile} tile Tile. * @param {ol.layer.VectorTile} layer Vector tile layer. - * @param {number} resolution Resolution. * @param {number} pixelRatio Pixel ratio. - * @return {boolean} Success. */ ol.renderer.canvas.VectorTileLayer.prototype.createReplayGroup = function(tile, - layer, resolution, pixelRatio) { + layer, pixelRatio) { var revision = layer.getRevision(); var renderOrder = layer.getRenderOrder(); if (!goog.isDef(renderOrder)) { @@ -168,33 +167,30 @@ ol.renderer.canvas.VectorTileLayer.prototype.createReplayGroup = function(tile, } var replayState = tile.getReplayState(); - if (!replayState.dirty && - replayState.renderedResolution == resolution && - replayState.renderedRevision == revision && + if (replayState.renderedRevision == revision && replayState.renderedRenderOrder == renderOrder) { - return false; + return; } // FIXME dispose of old replayGroup in post render goog.dispose(replayState.replayGroup); replayState.replayGroup = null; - replayState.dirty = false; var source = layer.getSource(); goog.asserts.assertInstanceof(source, ol.source.VectorTile, 'Source is an ol.source.VectorTile'); var tileGrid = source.getTileGrid(); + var tileCoord = tile.getTileCoord(); + var resolution = tileGrid.getTileCoordResolution(tileCoord); var pixelSpace = tile.getProjection().getUnits() == ol.proj.Units.TILE_PIXELS; var extent = pixelSpace ? - [0, 0].concat(source.getTilePixelSize( - tileGrid.getZForResolution(resolution), pixelRatio, + [0, 0].concat(source.getTilePixelSize(tileCoord[0], pixelRatio, tile.getProjection())) : - tileGrid.getTileCoordExtent(tile.getTileCoord()); + tileGrid.getTileCoordExtent(tileCoord); var tileResolution = pixelSpace ? source.getTilePixelRatio() : resolution; var replayGroup = new ol.render.canvas.ReplayGroup(pixelSpace ? 0 : ol.renderer.vector.getTolerance(tileResolution, pixelRatio), extent, - tileResolution, layer.getRenderBuffer(), - source.getRightHandedPolygons()); + tileResolution, layer.getRenderBuffer(), source.getRightHandedPolygons()); /** * @param {ol.Feature} feature Feature. @@ -212,8 +208,7 @@ ol.renderer.canvas.VectorTileLayer.prototype.createReplayGroup = function(tile, if (goog.isDefAndNotNull(styles)) { var dirty = this.renderFeature(feature, squaredTolerance, styles, replayGroup); - replayState.dirty = replayState.dirty || dirty; - this.dirty_ = this.dirty_ || replayState.dirty; + this.dirty_ = this.dirty_ || dirty; } } @@ -226,12 +221,9 @@ ol.renderer.canvas.VectorTileLayer.prototype.createReplayGroup = function(tile, replayGroup.finish(); - replayState.renderedResolution = resolution; replayState.renderedRevision = revision; replayState.renderedRenderOrder = renderOrder; replayState.replayGroup = replayGroup; - - return true; }; @@ -248,13 +240,14 @@ ol.renderer.canvas.VectorTileLayer.prototype.forEachFeatureAtCoordinate = var features = {}; var replayables = this.renderedTiles_; + var source = layer.getSource(); + var tileGrid = source.getTileGrid(); var found, tileSpaceCoordinate; - var i, ii, origin, replayGroup, source; + var i, ii, origin, replayGroup; var tile, tileCoord, tileExtent, tilePixelRatio, tileResolution, tileSize; for (i = 0, ii = replayables.length; i < ii; ++i) { tile = replayables[i]; tileCoord = tile.getTileCoord(); - source = layer.getSource(); goog.asserts.assertInstanceof(source, ol.source.VectorTile, 'Source is an ol.source.VectorTile'); tileExtent = source.getTileGrid().getTileCoordExtent(tileCoord); @@ -265,9 +258,8 @@ ol.renderer.canvas.VectorTileLayer.prototype.forEachFeatureAtCoordinate = origin = ol.extent.getTopLeft( source.getTileGrid().getTileCoordExtent(tileCoord)); tilePixelRatio = source.getTilePixelRatio(); - tileResolution = resolution / tilePixelRatio; - tileSize = ol.size.toSize( - source.getTileGrid().getTileSize(tileCoord[0])); + tileResolution = tileGrid.getResolution(tileCoord[0]) / tilePixelRatio; + tileSize = ol.size.toSize(tileGrid.getTileSize(tileCoord[0])); tileSpaceCoordinate = [ (coordinate[0] - origin[0]) / tileResolution, (origin[1] - coordinate[1]) / tileResolution @@ -358,7 +350,7 @@ ol.renderer.canvas.VectorTileLayer.prototype.prepareFrame = this.scheduleExpireCache(frameState, source); /** - * @type {Object.>} + * @type {Object.>} */ var tilesToDrawByZ = {}; tilesToDrawByZ[z] = {}; @@ -374,6 +366,8 @@ ol.renderer.canvas.VectorTileLayer.prototype.prepareFrame = for (y = tileRange.minY; y <= tileRange.maxY; ++y) { tile = source.getTile(z, x, y, pixelRatio, projection); + goog.asserts.assertInstanceof(tile, ol.VectorTile, + 'Tile is an ol.VectorTile'); tileState = tile.getState(); if (tileState == ol.TileState.LOADED || tileState == ol.TileState.EMPTY || @@ -407,16 +401,11 @@ ol.renderer.canvas.VectorTileLayer.prototype.prepareFrame = tile = tilesToDraw[tileCoordKey]; if (tile.getState() == ol.TileState.LOADED) { replayables.push(tile); + this.createReplayGroup(tile, layer, pixelRatio); } } } - for (i = 0, ii = replayables.length; i < ii; ++i) { - tile = replayables[i]; - this.dirty_ = this.createReplayGroup(tile, layer, resolution, pixelRatio) || - this.dirty_; - } - this.renderedTiles_ = replayables; return true; diff --git a/src/ol/vectortile.js b/src/ol/vectortile.js index 551fa70788..b89b68b527 100644 --- a/src/ol/vectortile.js +++ b/src/ol/vectortile.js @@ -7,10 +7,9 @@ goog.require('ol.TileState'); /** - * @typedef {{dirty: boolean, + * @typedef {{ * renderedRenderOrder: (null|function(ol.Feature, ol.Feature):number), * renderedRevision: number, - * renderedResolution: number, * replayGroup: ol.render.IReplayGroup}} */ ol.TileReplayState; @@ -59,10 +58,8 @@ ol.VectorTile = function(tileCoord, state, src, format, tileLoadFunction) { * @type {ol.TileReplayState} */ this.replayState_ = { - dirty: true, renderedRenderOrder: null, renderedRevision: -1, - renderedResolution: NaN, replayGroup: null };