From 36caf148eab952fdfa492332ab0c646dfc447ad0 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Wed, 13 Sep 2017 15:16:16 -0700 Subject: [PATCH] Fix issue #5248: don't redo placement for zoom changes of low-pitch maps. --- src/source/tile.js | 7 ++++--- test/unit/source/tile.test.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/source/tile.js b/src/source/tile.js index 7db95ab8586..1ff912b5a31 100644 --- a/src/source/tile.js +++ b/src/source/tile.js @@ -226,17 +226,18 @@ class Tile { const cameraToTileDistance = source.map.transform.cameraToTileDistance(this); if (this.angle === source.map.transform.angle && this.pitch === source.map.transform.pitch && - this.cameraToCenterDistance === source.map.transform.cameraToCenterDistance && this.showCollisionBoxes === source.map.showCollisionBoxes) { - if (this.cameraToTileDistance === cameraToTileDistance) { + if (this.cameraToTileDistance === cameraToTileDistance && + this.cameraToCenterDistance === source.map.transform.cameraToCenterDistance) { return; } else if (this.pitch < 25) { // At low pitch tile distance doesn't affect placement very // much, so we skip the cost of redoPlacement // However, we might as well store the latest value of - // cameraToTileDistance in case a redoPlacement request + // cameraToTileDistance and cameraToCenterDistance in case a redoPlacement request // is already queued. this.cameraToTileDistance = cameraToTileDistance; + this.cameraToCenterDistance = source.map.transform.cameraToCenterDistance; return; } } diff --git a/test/unit/source/tile.test.js b/test/unit/source/tile.test.js index c08cf4302ca..aa9b7d3586f 100644 --- a/test/unit/source/tile.test.js +++ b/test/unit/source/tile.test.js @@ -194,6 +194,41 @@ test('Tile#redoPlacement', (t) => { }); }); + test('changing cameraToCenterDistance does not trigger placement for low pitch', (t)=>{ + const tile = new Tile(new TileCoord(1, 1, 1)); + tile.loadVectorData(createVectorData(), createPainter()); + t.stub(tile, 'reloadSymbolData').returns(null); + const source1 = util.extend(new Evented(), { + type: 'vector', + dispatcher: { + send: (name, data, cb) => { + cb(); + } + }, + map: { + transform: { cameraToCenterDistance: 1, pitch: 10, cameraToTileDistance: () => { return 1; } }, + painter: { tileExtentVAO: {vao: 0}} + } + }); + + const source2 = util.extend(new Evented(), { + type: 'vector', + dispatcher: { + send: () => {} + }, + map: { + transform: { cameraToCenterDistance: 2, pitch: 10, cameraToTileDistance: () => { return 1; } }, + painter: { tileExtentVAO: {vao: 0}} + } + }); + + tile.redoPlacement(source1); + tile.redoPlacement(source2); + + t.ok(tile.state === 'loaded'); + t.end(); + }); + t.end(); });