From c77395a90aadef8d1eeb0076dc8c2d7ec5d9a4e5 Mon Sep 17 00:00:00 2001 From: NathanMOlson Date: Mon, 4 Nov 2024 15:41:27 -0800 Subject: [PATCH] Make sure overscaledZ is at least as big as tile Z (#4988) * make sure overscaledZ is at least as big as tile Z * add unit test * fix lint --- src/geo/projection/covering_tiles.ts | 2 +- src/geo/projection/mercator_transform.test.ts | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/geo/projection/covering_tiles.ts b/src/geo/projection/covering_tiles.ts index 4988654a64..2c51a5d489 100644 --- a/src/geo/projection/covering_tiles.ts +++ b/src/geo/projection/covering_tiles.ts @@ -240,7 +240,7 @@ export function coveringTiles(transform: IReadonlyTransform, options: CoveringTi const dz = nominalZ - it.zoom; const dx = cameraPoint[0] - 0.5 - (x << dz); const dy = cameraPoint[1] - 0.5 - (y << dz); - const overscaledZ = options.reparseOverscaled ? thisTileDesiredZ : it.zoom; + const overscaledZ = options.reparseOverscaled ? Math.max(it.zoom, thisTileDesiredZ) : it.zoom; result.push({ tileID: new OverscaledTileID(it.zoom === maxZoom ? overscaledZ : it.zoom, it.wrap, it.zoom, x, y), distanceSq: vec2.sqrLen([centerPoint[0] - 0.5 - x, centerPoint[1] - 0.5 - y]), diff --git a/src/geo/projection/mercator_transform.test.ts b/src/geo/projection/mercator_transform.test.ts index 4b7e6f4205..995e71fc83 100644 --- a/src/geo/projection/mercator_transform.test.ts +++ b/src/geo/projection/mercator_transform.test.ts @@ -374,6 +374,28 @@ describe('transform', () => { }); + test('coveringTiles: overscaledZ', () => { + const options = { + minzoom: 1, + maxzoom: 10, + tileSize: 256, + reparseOverscaled: true + }; + + const transform = new MercatorTransform(0, 10, 0, 85, true); + transform.resize(10, 400); + // make slightly off center so that sort order is not subject to precision issues + transform.setCenter(new LngLat(-0.01, 0.01)); + transform.setPitch(85); + transform.setFov(10); + + transform.setZoom(10); + const tiles = coveringTiles(transform, options); + for (const tile of tiles) { + expect(tile.overscaledZ).toBeGreaterThanOrEqual(tile.canonical.z); + } + }); + test('maxzoom-0', () => { const options = { minzoom: 0,