maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
110 lines (105 loc) • 5.29 kB
text/typescript
import {describe, test, expect, vi} from 'vitest';
import {OverscaledTileID} from '../../tile/tile_id.ts';
import {TileManager} from '../../tile/tile_manager.ts';
import {Tile} from '../../tile/tile.ts';
import {Painter, type RenderOptions} from '../../render/painter.ts';
import type {Map} from '../../ui/map.ts';
import {drawCustom} from './draw_custom.ts';
import {CustomStyleLayer} from '../../style/style_layer/custom_style_layer.ts';
import {MercatorTransform} from '../../geo/projection/mercator_transform.ts';
import {MercatorProjection} from '../../geo/projection/mercator_projection.ts';
import {type CustomRenderMethodInput} from '../../style/style_layer/custom_style_layer.ts';
import {expectToBeCloseToArray} from '../../util/test/util.ts';
vi.mock(import('../../render/painter'));
vi.mock(import('../program'));
vi.mock(import('../../tile/tile_manager'));
vi.mock(import('../../tile/tile'));
vi.mock(import('../../data/bucket/symbol_bucket'), () => {
return {
SymbolBucket: vi.fn()
} as any;
});
vi.mock(import('../../symbol/projection'));
describe('drawCustom', () => {
test('should return custom render method inputs', () => {
// same transform setup as in transform.test.ts 'creates a transform', so matrices of transform should be the same
const transform = new MercatorTransform({minZoom: 0, maxZoom: 22, minPitch: 0, maxPitch: 60, renderWorldCopies: true});
transform.resize(500, 500);
transform.setMinPitch(10);
transform.setMaxPitch(10);
const mockPainter = new Painter(null, null);
mockPainter.style = {
projection: new MercatorProjection(),
} as any;
mockPainter.renderPass = 'translucent';
mockPainter.transform = transform;
mockPainter.context = {
gl: {},
setColorMode: () => {},
setStencilMode: () => {},
setDepthMode: () => {},
setDirty: () => {},
bindFramebuffer: {
set: () => {}
}
} as any;
const tileId = new OverscaledTileID(1, 0, 1, 0, 0);
const tile = new Tile(tileId, 256);
tile.tileID = tileId;
tile.imageAtlasTexture = {
bind: () => { }
} as any;
const tileManagerMock = new TileManager(null, null, null);
(vi.mocked(tileManagerMock.getTile)).mockReturnValue(tile);
tileManagerMock.map = {showCollisionBoxes: false} as any as Map;
let result: {
gl: WebGLRenderingContext | WebGL2RenderingContext;
args: CustomRenderMethodInput;
};
const mockLayer = new CustomStyleLayer({
id: 'custom-layer',
type: 'custom',
render(gl, args) {
result = {
gl,
args
};
},
}, {});
const renderOptions: RenderOptions = {isRenderingToTexture: false, isRenderingGlobe: false};
drawCustom(mockPainter, tileManagerMock, mockLayer, renderOptions);
expect(result.gl).toBeDefined();
expect(result.args.farZ).toBeCloseTo(804.8028169246645, 6);
expect(result.args.farZ).toBe(mockPainter.transform.farZ);
expect(result.args.nearZ).toBe(mockPainter.transform.nearZ);
expect(result.args.fov).toBe(mockPainter.transform.fov * Math.PI / 180);
expect(result.args.modelViewProjectionMatrix).toEqual(mockPainter.transform.modelViewProjectionMatrix);
expect(result.args.projectionMatrix).toEqual(mockPainter.transform.projectionMatrix);
expectToBeCloseToArray(result.args.defaultProjectionData.tileMercatorCoords, [0, 0, 1, 1]);
expect(result.args.defaultProjectionData.mainMatrix).toBeInstanceOf(Float64Array);
expect(result.args.defaultProjectionData.fallbackMatrix).toBeInstanceOf(Float64Array);
expect(result.args.defaultProjectionData.mainMatrix[0]).toBe(1536);
expect(result.args.defaultProjectionData.mainMatrix[5]).toBe(-1512.6647086267515);
expect(result.args.defaultProjectionData.mainMatrix[15]).toEqual(794.4539334827342);
expect(result.args.defaultProjectionData.projectionTransition).toBe(0);
expect(result.args.defaultProjectionData.mainMatrix).toEqual(result.args.defaultProjectionData.fallbackMatrix);
const tileProjectionData = result.args.getProjectionData({
tileID: {
wrap: 1,
canonical: {
z: 1,
x: 1,
y: 0,
}
}
});
expectToBeCloseToArray(tileProjectionData.tileMercatorCoords, [0.5, 0, 0.00006103515625, 0.00006103515625]);
expect(tileProjectionData.mainMatrix).toBeInstanceOf(Float32Array);
expect(tileProjectionData.fallbackMatrix).toBeInstanceOf(Float32Array);
expect(tileProjectionData.mainMatrix[0]).toBeCloseTo(0.09375, 6);
expect(tileProjectionData.mainMatrix[5]).toBeCloseTo(-0.09232572466135025, 6);
expect(tileProjectionData.mainMatrix[15]).toBeCloseTo(794.4539184570312, 6);
expect(tileProjectionData.projectionTransition).toBe(0);
expect(tileProjectionData.mainMatrix).toEqual(tileProjectionData.fallbackMatrix);
});
});