Skip to content

Commit 3173405

Browse files
committed
fix: ProjectionDataParams no longer requires OverscaledTileID instance
1 parent 0b9b3bd commit 3173405

File tree

7 files changed

+88
-9
lines changed

7 files changed

+88
-9
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### 🐞 Bug fixes
66
- Fix `Popup` not updating its position when switching between terrain/globe projections ([#7468](https://github.com/maplibre/maplibre-gl-js/pull/7468)) (by [@CommanderStorm](https://github.com/CommanderStorm))
7+
- Fix `ProjectionDataParams` requiring an `OverscaledTileID` instance, even though the class is only exported as a type ([#7471](https://github.com/maplibre/maplibre-gl-js/pull/7471))
78

89
## 5.23.0
910

src/geo/projection/globe_transform.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ describe('GlobeTransform', () => {
5454
const projectionData = globeTransform.getProjectionData({overscaledTileID: new OverscaledTileID(1, 0, 1, 1, 0), applyGlobeMatrix: true});
5555
expect(projectionData.projectionTransition).not.toBe(0);
5656
});
57+
58+
test('OverscaledTileID instance is not required', () => {
59+
const projectionData = globeTransform.getProjectionData({overscaledTileID: {
60+
canonical: {
61+
x: 1,
62+
y: 0,
63+
z: 1,
64+
},
65+
}});
66+
expectToBeCloseToArray(projectionData.tileMercatorCoords, [0.5, 0, 0.5 / EXTENT, 0.5 / EXTENT]);
67+
});
5768
});
5869

5970
describe('clipping plane', () => {

src/geo/projection/mercator_transform.test.ts

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import {describe, test, expect} from 'vitest';
22
import Point from '@mapbox/point-geometry';
33
import {LngLat} from '../lng_lat';
4-
import {CanonicalTileID, UnwrappedTileID} from '../../tile/tile_id';
4+
import {CanonicalTileID, OverscaledTileID, UnwrappedTileID} from '../../tile/tile_id';
55
import {fixedLngLat, fixedCoord} from '../../../test/unit/lib/fixed';
66
import type {Terrain} from '../../render/terrain';
77
import {MercatorTransform} from './mercator_transform';
88
import {LngLatBounds} from '../lng_lat_bounds';
99
import {getMercatorHorizon} from './mercator_utils';
1010
import {mat4} from 'gl-matrix';
1111
import {expectToBeCloseToArray} from '../../util/test/util';
12+
import {EXTENT} from '../../data/extent';
1213

1314
describe('transform', () => {
1415
test('creates a transform', () => {
@@ -616,4 +617,49 @@ describe('transform', () => {
616617
expect(transform.getCameraLngLat().lng).toBeCloseTo(camLngLat.lng, 10);
617618
expect(transform.getCameraLngLat().lat).toBeCloseTo(camLngLat.lat, 10);
618619
});
620+
621+
describe('getProjectionData', () => {
622+
const transform = new MercatorTransform({minZoom: 0, maxZoom: 22, minPitch: 0, maxPitch: 180, renderWorldCopies: true});
623+
transform.resize(512, 512);
624+
test('parses a custom object', () => {
625+
const projectionData = transform.getProjectionData({overscaledTileID: {
626+
canonical: {
627+
x: 1,
628+
y: 0,
629+
z: 1,
630+
},
631+
}});
632+
expectToBeCloseToArray(projectionData.tileMercatorCoords, [0.5, 0, 0.5 / EXTENT, 0.5 / EXTENT]);
633+
expectToBeCloseToArray([...projectionData.mainMatrix], [
634+
0.09375,
635+
0,
636+
0,
637+
0,
638+
0,
639+
-0.09375,
640+
0,
641+
0,
642+
0,
643+
0,
644+
-0.000013132550520822406,
645+
-0.000012790334039891604,
646+
0,
647+
768,
648+
767.7944946289062,
649+
768
650+
]);
651+
});
652+
test('parses OverscaledTileID', () => {
653+
const transform = new MercatorTransform({minZoom: 0, maxZoom: 22, minPitch: 0, maxPitch: 180, renderWorldCopies: true});
654+
transform.resize(512, 512);
655+
const projectionData = transform.getProjectionData({overscaledTileID: new OverscaledTileID(1, 0, 1, 1, 0)});
656+
expectToBeCloseToArray(projectionData.tileMercatorCoords, [0.5, 0, 0.5 / EXTENT, 0.5 / EXTENT]);
657+
});
658+
test('parses null', () => {
659+
const transform = new MercatorTransform({minZoom: 0, maxZoom: 22, minPitch: 0, maxPitch: 180, renderWorldCopies: true});
660+
transform.resize(512, 512);
661+
const projectionData = transform.getProjectionData({overscaledTileID: null});
662+
expectToBeCloseToArray(projectionData.tileMercatorCoords, [0, 0, 1, 1]);
663+
});
664+
});
619665
});

src/geo/projection/mercator_transform.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -728,12 +728,26 @@ export class MercatorTransform implements ITransform {
728728

729729
getProjectionData(params: ProjectionDataParams): ProjectionData {
730730
const {overscaledTileID, aligned, applyTerrainMatrix} = params;
731-
const mercatorTileCoordinates = this._helper.getMercatorTileCoordinates(overscaledTileID);
732-
const tilePosMatrix = overscaledTileID ? this.calculatePosMatrix(overscaledTileID, aligned, true) : null;
731+
let tile: OverscaledTileID;
732+
if (!overscaledTileID) {
733+
tile = null;
734+
} else if (overscaledTileID instanceof OverscaledTileID) {
735+
tile = overscaledTileID;
736+
} else {
737+
tile = new OverscaledTileID(
738+
overscaledTileID.overscaledZ ?? overscaledTileID.canonical.z,
739+
overscaledTileID.wrap ?? 0,
740+
overscaledTileID.canonical.z,
741+
overscaledTileID.canonical.x,
742+
overscaledTileID.canonical.y
743+
);
744+
}
745+
const mercatorTileCoordinates = this._helper.getMercatorTileCoordinates(tile);
746+
const tilePosMatrix = overscaledTileID ? this.calculatePosMatrix(tile, aligned, true) : null;
733747

734748
let mainMatrix: mat4;
735-
if (overscaledTileID?.terrainRttPosMatrix32f && applyTerrainMatrix) {
736-
mainMatrix = overscaledTileID.terrainRttPosMatrix32f;
749+
if (tile?.terrainRttPosMatrix32f && applyTerrainMatrix) {
750+
mainMatrix = tile.terrainRttPosMatrix32f;
737751
} else if (tilePosMatrix) {
738752
mainMatrix = tilePosMatrix; // This matrix should be float32
739753
} else {

src/geo/projection/projection_data.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,15 @@ export type ProjectionDataParams = {
5454
/**
5555
* The ID of the current tile
5656
*/
57-
overscaledTileID: OverscaledTileID | null;
57+
overscaledTileID: OverscaledTileID | null | {
58+
overscaledZ?: number;
59+
wrap?: number;
60+
canonical: {
61+
x: number;
62+
y: number;
63+
z: number;
64+
};
65+
};
5866
/**
5967
* Set to true if a pixel-aligned matrix should be used, if possible (mostly used for raster tiles under mercator projection)
6068
*/

src/geo/transform_helper.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {EXTENT} from '../data/extent';
1010

1111
import type {PaddingOptions} from './edge_insets';
1212
import type {IReadonlyTransform, ITransformGetters, TransformConstrainFunction} from './transform_interface';
13-
import type {OverscaledTileID} from '../tile/tile_id';
1413
import {Bounds} from './bounds';
1514
/**
1615
* If a path crossing the antimeridian would be shorter, extend the final coordinate so that
@@ -681,7 +680,7 @@ export class TransformHelper implements ITransformGetters {
681680
return camMercator.toLngLat();
682681
}
683682

684-
getMercatorTileCoordinates(overscaledTileID: OverscaledTileID): [number, number, number, number] {
683+
getMercatorTileCoordinates(overscaledTileID?: { canonical: {x: number; y: number; z: number}} | null): [number, number, number, number] {
685684
if (!overscaledTileID) {
686685
return [0, 0, 1, 1];
687686
}

test/build/bundle_size.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1053826
1+
1055028

0 commit comments

Comments
 (0)