From ab63cf4fa18f8867ed219682dac311d038f71863 Mon Sep 17 00:00:00 2001 From: Jakub Pelc <57600346+kubapelc@users.noreply.github.com> Date: Tue, 17 Dec 2024 20:03:22 +0100 Subject: [PATCH] Fix globe terrain holes at poles (#5232) * Fix terrain pole holes * Fix unit test * Bring back globe/terrain/fill-planet-pole test * Update build size * Changelog update, _meshDict -> _meshCache * Do not use terrain pole meshes when globe is disabled * Add test for mercator terrain * Fix unit tests --- CHANGELOG.md | 2 + src/render/draw_terrain.ts | 6 +- src/render/render_to_texture.test.ts | 3 + src/render/terrain.test.ts | 11 +++- src/render/terrain.ts | 61 ++++++++++++------ src/shaders/_prelude.vertex.glsl | 5 ++ src/shaders/_projection_globe.vertex.glsl | 14 ++-- test/build/min.test.ts | 2 +- .../terrain/fill-planet-pole/expected.png | Bin 0 -> 43297 bytes .../globe/terrain/fill-planet-pole/style.json | 54 ++++++++++++++++ .../tests/terrain/pitched-world/expected.png | Bin 0 -> 33955 bytes .../tests/terrain/pitched-world/style.json | 50 ++++++++++++++ 12 files changed, 178 insertions(+), 30 deletions(-) create mode 100644 test/integration/render/tests/projection/globe/terrain/fill-planet-pole/expected.png create mode 100644 test/integration/render/tests/projection/globe/terrain/fill-planet-pole/style.json create mode 100644 test/integration/render/tests/terrain/pitched-world/expected.png create mode 100644 test/integration/render/tests/terrain/pitched-world/style.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 43173a788d..195c28799a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### 🐞 Bug fixes +- Fix holes at the poles when terrain is used with globe ([#5232](https://github.com/maplibre/maplibre-gl-js/pull/5232)) +- Fix geometry artifacts when globe terrain is zoomed out too much ([#5232](https://github.com/maplibre/maplibre-gl-js/pull/5232)) - _...Add new stuff here..._ ## 5.0.0-pre.10 diff --git a/src/render/draw_terrain.ts b/src/render/draw_terrain.ts index c66db651af..3bad5c25d3 100644 --- a/src/render/draw_terrain.ts +++ b/src/render/draw_terrain.ts @@ -19,13 +19,13 @@ function drawDepth(painter: Painter, terrain: Terrain) { const tr = painter.transform; const colorMode = ColorMode.unblended; const depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, [0, 1]); - const mesh = terrain.getTerrainMesh(); const tiles = terrain.sourceCache.getRenderableTiles(); const program = painter.useProgram('terrainDepth'); context.bindFramebuffer.set(terrain.getFramebuffer('depth').framebuffer); context.viewport.set([0, 0, painter.width / devicePixelRatio, painter.height / devicePixelRatio]); context.clear({color: Color.transparent, depth: 1}); for (const tile of tiles) { + const mesh = terrain.getTerrainMesh(tile.tileID); const terrainData = terrain.getTerrainData(tile.tileID); const projectionData = tr.getProjectionData({overscaledTileID: tile.tileID, applyTerrainMatrix: false, applyGlobeMatrix: true}); const uniformValues = terrainDepthUniformValues(terrain.getMeshFrameDelta(tr.zoom)); @@ -46,7 +46,6 @@ function drawCoords(painter: Painter, terrain: Terrain) { const tr = painter.transform; const colorMode = ColorMode.unblended; const depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, [0, 1]); - const mesh = terrain.getTerrainMesh(); const coords = terrain.getCoordsTexture(); const tiles = terrain.sourceCache.getRenderableTiles(); @@ -57,6 +56,7 @@ function drawCoords(painter: Painter, terrain: Terrain) { context.clear({color: Color.transparent, depth: 1}); terrain.coordsIndex = []; for (const tile of tiles) { + const mesh = terrain.getTerrainMesh(tile.tileID); const terrainData = terrain.getTerrainData(tile.tileID); context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, coords.texture); @@ -77,12 +77,12 @@ function drawTerrain(painter: Painter, terrain: Terrain, tiles: Array, ren const colorMode = painter.colorModeForRenderPass(); const depthMode = painter.getDepthModeFor3D(); const program = painter.useProgram('terrain'); - const mesh = terrain.getTerrainMesh(); context.bindFramebuffer.set(null); context.viewport.set([0, 0, painter.width, painter.height]); for (const tile of tiles) { + const mesh = terrain.getTerrainMesh(tile.tileID); const texture = painter.renderToTexture.getTexture(tile); const terrainData = terrain.getTerrainData(tile.tileID); context.activeTexture.set(gl.TEXTURE0); diff --git a/src/render/render_to_texture.test.ts b/src/render/render_to_texture.test.ts index 4c17ed7c09..9abd9d78af 100644 --- a/src/render/render_to_texture.test.ts +++ b/src/render/render_to_texture.test.ts @@ -92,6 +92,9 @@ describe('render to texture', () => { 'maine-hillshade': hillshadeLayer, 'maine-line': lineLayer, 'maine-symbol': symbolLayer + }, + projection: { + transitionState: 0, } } as any as Style; painter.style = style; diff --git a/src/render/terrain.test.ts b/src/render/terrain.test.ts index 1238831feb..af4b4a3f8f 100644 --- a/src/render/terrain.test.ts +++ b/src/render/terrain.test.ts @@ -238,6 +238,11 @@ describe('Terrain', () => { }, width: 1, height: 1, + style: { + projection: { + transitionState: 0, + } + } } as any as Painter; const sourceCache = { _source: {maxzoom: 12, tileSize: 512}, @@ -249,10 +254,10 @@ describe('Terrain', () => { {exaggeration: 1} as any as TerrainSpecification, ); terrain.meshSize = 4; - terrain.getTerrainMesh(); + terrain.getTerrainMesh(new OverscaledTileID(2, 0, 2, 1, 1)); expect(terrain.getMeshFrameDelta(16)).toBe(122.16256373312942); - expect(actualIndexArray).toStrictEqual([0, 5, 6, 0, 6, 1, 1, 6, 7, 1, 7, 2, 2, 7, 8, 2, 8, 3, 3, 8, 9, 3, 9, 4, 5, 10, 11, 5, 11, 6, 6, 11, 12, 6, 12, 7, 7, 12, 13, 7, 13, 8, 8, 13, 14, 8, 14, 9, 10, 15, 16, 10, 16, 11, 11, 16, 17, 11, 17, 12, 12, 17, 18, 12, 18, 13, 13, 18, 19, 13, 19, 14, 15, 20, 21, 15, 21, 16, 16, 21, 22, 16, 22, 17, 17, 22, 23, 17, 23, 18, 18, 23, 24, 18, 24, 19, 35, 36, 38, 35, 38, 37, 25, 28, 26, 25, 27, 28, 37, 38, 40, 37, 40, 39, 27, 30, 28, 27, 29, 30, 39, 40, 42, 39, 42, 41, 29, 32, 30, 29, 31, 32, 41, 42, 44, 41, 44, 43, 31, 34, 32, 31, 33, 34, 45, 46, 48, 45, 48, 47, 55, 58, 56, 55, 57, 58, 47, 48, 50, 47, 50, 49, 57, 60, 58, 57, 59, 60, 49, 50, 52, 49, 52, 51, 59, 62, 60, 59, 61, 62, 51, 52, 54, 51, 54, 53, 61, 64, 62, 61, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - expect(actualVertexArray).toStrictEqual([0, 0, 0, 2048, 0, 0, 4096, 0, 0, 6144, 0, 0, 8192, 0, 0, 0, 2048, 0, 2048, 2048, 0, 4096, 2048, 0, 6144, 2048, 0, 8192, 2048, 0, 0, 4096, 0, 2048, 4096, 0, 4096, 4096, 0, 6144, 4096, 0, 8192, 4096, 0, 0, 6144, 0, 2048, 6144, 0, 4096, 6144, 0, 6144, 6144, 0, 8192, 6144, 0, 0, 8192, 0, 2048, 8192, 0, 4096, 8192, 0, 6144, 8192, 0, 8192, 8192, 0, 0, 0, 0, 0, 0, 1, 2048, 0, 0, 2048, 0, 1, 4096, 0, 0, 4096, 0, 1, 6144, 0, 0, 6144, 0, 1, 8192, 0, 0, 8192, 0, 1, 0, 8192, 0, 0, 8192, 1, 2048, 8192, 0, 2048, 8192, 1, 4096, 8192, 0, 4096, 8192, 1, 6144, 8192, 0, 6144, 8192, 1, 8192, 8192, 0, 8192, 8192, 1, 0, 0, 0, 0, 0, 1, 0, 2048, 0, 0, 2048, 1, 0, 4096, 0, 0, 4096, 1, 0, 6144, 0, 0, 6144, 1, 0, 8192, 0, 0, 8192, 1, 8192, 0, 0, 8192, 0, 1, 8192, 2048, 0, 8192, 2048, 1, 8192, 4096, 0, 8192, 4096, 1, 8192, 6144, 0, 8192, 6144, 1, 8192, 8192, 0, 8192, 8192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + expect(actualIndexArray).toStrictEqual([0, 5, 6, 0, 6, 1, 1, 6, 7, 1, 7, 2, 2, 7, 8, 2, 8, 3, 3, 8, 9, 3, 9, 4, 5, 10, 11, 5, 11, 6, 6, 11, 12, 6, 12, 7, 7, 12, 13, 7, 13, 8, 8, 13, 14, 8, 14, 9, 10, 15, 16, 10, 16, 11, 11, 16, 17, 11, 17, 12, 12, 17, 18, 12, 18, 13, 13, 18, 19, 13, 19, 14, 15, 20, 21, 15, 21, 16, 16, 21, 22, 16, 22, 17, 17, 22, 23, 17, 23, 18, 18, 23, 24, 18, 24, 19, 20, 30, 31, 20, 31, 21, 0, 26, 25, 0, 1, 26, 21, 31, 32, 21, 32, 22, 1, 27, 26, 1, 2, 27, 22, 32, 33, 22, 33, 23, 2, 28, 27, 2, 3, 28, 23, 33, 34, 23, 34, 24, 3, 29, 28, 3, 4, 29, 35, 36, 38, 35, 38, 37, 45, 48, 46, 45, 47, 48, 37, 38, 40, 37, 40, 39, 47, 50, 48, 47, 49, 50, 39, 40, 42, 39, 42, 41, 49, 52, 50, 49, 51, 52, 41, 42, 44, 41, 44, 43, 51, 54, 52, 51, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + expect(actualVertexArray).toStrictEqual([0, 0, 0, 2048, 0, 0, 4096, 0, 0, 6144, 0, 0, 8192, 0, 0, 0, 2048, 0, 2048, 2048, 0, 4096, 2048, 0, 6144, 2048, 0, 8192, 2048, 0, 0, 4096, 0, 2048, 4096, 0, 4096, 4096, 0, 6144, 4096, 0, 8192, 4096, 0, 0, 6144, 0, 2048, 6144, 0, 4096, 6144, 0, 6144, 6144, 0, 8192, 6144, 0, 0, 8192, 0, 2048, 8192, 0, 4096, 8192, 0, 6144, 8192, 0, 8192, 8192, 0, 0, 0, 1, 2048, 0, 1, 4096, 0, 1, 6144, 0, 1, 8192, 0, 1, 0, 8192, 1, 2048, 8192, 1, 4096, 8192, 1, 6144, 8192, 1, 8192, 8192, 1, 0, 0, 0, 0, 0, 1, 0, 2048, 0, 0, 2048, 1, 0, 4096, 0, 0, 4096, 1, 0, 6144, 0, 0, 6144, 1, 0, 8192, 0, 0, 8192, 1, 8192, 0, 0, 8192, 0, 1, 8192, 2048, 0, 8192, 2048, 1, 8192, 4096, 0, 8192, 4096, 1, 8192, 6144, 0, 8192, 6144, 1, 8192, 8192, 0, 8192, 8192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); }); test('interpolation works', () => { diff --git a/src/render/terrain.ts b/src/render/terrain.ts index 4439c37bcd..bcfad0fedd 100644 --- a/src/render/terrain.ts +++ b/src/render/terrain.ts @@ -19,6 +19,7 @@ import type {TerrainSpecification} from '@maplibre/maplibre-gl-style-spec'; import {type LngLat, earthRadius} from '../geo/lng_lat'; import {Mesh} from './mesh'; import {isInBoundsForZoomLngLat} from '../util/world_bounds'; +import {NORTH_POLE_Y, SOUTH_POLE_Y} from './subdivision'; /** * @internal @@ -108,7 +109,7 @@ export class Terrain { * GL Objects for the terrain-mesh * The mesh is a regular mesh, which has the advantage that it can be reused for all tiles. */ - _mesh: Mesh; + _meshCache: { [key: string]: Mesh } = {}; /** * coords index contains a list of tileID.keys. This index is used to identify * the tile via the alpha-cannel in the coords-texture. @@ -376,46 +377,70 @@ export class Terrain { * create a regular mesh which will be used by all terrain-tiles * @returns the created regular mesh */ - getTerrainMesh(): Mesh { - if (this._mesh) return this._mesh; + getTerrainMesh(tileId: OverscaledTileID): Mesh { + const globeEnabled = this.painter.style.projection.transitionState > 0; + const northPole = globeEnabled && tileId.canonical.y === 0; + const southPole = globeEnabled && tileId.canonical.y === (1 << tileId.canonical.z) - 1; + const key = `m_${northPole ? 'n' : ''}_${southPole ? 's' : ''}`; + if (this._meshCache[key]) { + return this._meshCache[key]; + } const context = this.painter.context; + const vertexArray = new Pos3dArray(); const indexArray = new TriangleIndexArray(); const meshSize = this.meshSize; const delta = EXTENT / meshSize; const meshSize2 = meshSize * meshSize; - for (let y = 0; y <= meshSize; y++) for (let x = 0; x <= meshSize; x++) + for (let y = 0; y <= meshSize; y++) for (let x = 0; x <= meshSize; x++) { vertexArray.emplaceBack(x * delta, y * delta, 0); + } for (let y = 0; y < meshSize2; y += meshSize + 1) for (let x = 0; x < meshSize; x++) { indexArray.emplaceBack(x + y, meshSize + x + y + 1, meshSize + x + y + 2); indexArray.emplaceBack(x + y, meshSize + x + y + 2, x + y + 1); } // add an extra frame around the mesh to avoid stitching on tile boundaries with different zoomlevels - // first code-block is for top-bottom frame and second for left-right frame - const offsetTop = vertexArray.length, offsetBottom = offsetTop + (meshSize + 1) * 2; - for (const y of [0, 1]) for (let x = 0; x <= meshSize; x++) for (const z of [0, 1]) - vertexArray.emplaceBack(x * delta, y * EXTENT, z); - for (let x = 0; x < meshSize * 2; x += 2) { - indexArray.emplaceBack(offsetBottom + x, offsetBottom + x + 1, offsetBottom + x + 3); - indexArray.emplaceBack(offsetBottom + x, offsetBottom + x + 3, offsetBottom + x + 2); - indexArray.emplaceBack(offsetTop + x, offsetTop + x + 3, offsetTop + x + 1); - indexArray.emplaceBack(offsetTop + x, offsetTop + x + 2, offsetTop + x + 3); + // top-bottom frame + pole vertices, if needed + const offsetTop = vertexArray.length; + const offsetTopEdge = 0; + const offsetBottom = offsetTop + (meshSize + 1); + const offsetBottomEdge = (meshSize + 1) * meshSize; + const northY = northPole ? NORTH_POLE_Y : 0; + const northZ = northPole ? 0 : 1; + const southY = southPole ? SOUTH_POLE_Y : EXTENT; + const southZ = southPole ? 0 : 1; + for (let x = 0; x <= meshSize; x++) { + vertexArray.emplaceBack(x * delta, northY, northZ); + } + for (let x = 0; x <= meshSize; x++) { + vertexArray.emplaceBack(x * delta, southY, southZ); } - const offsetLeft = vertexArray.length, offsetRight = offsetLeft + (meshSize + 1) * 2; - for (const x of [0, 1]) for (let y = 0; y <= meshSize; y++) for (const z of [0, 1]) + for (let x = 0; x < meshSize; x++) { + indexArray.emplaceBack(offsetBottomEdge + x, offsetBottom + x, offsetBottom + x + 1); + indexArray.emplaceBack(offsetBottomEdge + x, offsetBottom + x + 1, offsetBottomEdge + x + 1); + indexArray.emplaceBack(offsetTopEdge + x, offsetTop + x + 1, offsetTop + x); + indexArray.emplaceBack(offsetTopEdge + x, offsetTopEdge + x + 1, offsetTop + x + 1); + } + // left-right frame + const offsetLeft = vertexArray.length; + const offsetRight = offsetLeft + (meshSize + 1) * 2; + for (const x of [0, 1]) for (let y = 0; y <= meshSize; y++) for (const z of [0, 1]) { vertexArray.emplaceBack(x * EXTENT, y * delta, z); + } for (let y = 0; y < meshSize * 2; y += 2) { indexArray.emplaceBack(offsetLeft + y, offsetLeft + y + 1, offsetLeft + y + 3); indexArray.emplaceBack(offsetLeft + y, offsetLeft + y + 3, offsetLeft + y + 2); indexArray.emplaceBack(offsetRight + y, offsetRight + y + 3, offsetRight + y + 1); indexArray.emplaceBack(offsetRight + y, offsetRight + y + 2, offsetRight + y + 3); } - this._mesh = new Mesh( + + const mesh = new Mesh( context.createVertexBuffer(vertexArray, pos3dAttributes.members), context.createIndexBuffer(indexArray), SegmentVector.simpleSegment(0, 0, vertexArray.length, indexArray.length) ); - return this._mesh; + this._meshCache[key] = mesh; + return mesh; } /** @@ -426,7 +451,7 @@ export class Terrain { */ getMeshFrameDelta(zoom: number): number { // divide by 5 is evaluated by trial & error to get a frame in the right height - return 2 * Math.PI * earthRadius / Math.pow(2, zoom) / 5; + return 2 * Math.PI * earthRadius / Math.pow(2, Math.max(zoom, 0)) / 5; } getMinTileElevationForLngLatZoom(lnglat: LngLat, zoom: number) { diff --git a/src/shaders/_prelude.vertex.glsl b/src/shaders/_prelude.vertex.glsl index e3eb359188..db871edbf3 100644 --- a/src/shaders/_prelude.vertex.glsl +++ b/src/shaders/_prelude.vertex.glsl @@ -145,6 +145,11 @@ float ele(vec2 pos) { // calculate the elevation with linear interpolation for a coordinate float get_elevation(vec2 pos) { #ifdef TERRAIN3D + #ifdef GLOBE + if ((pos.y < -32767.5) || (pos.y > 32766.5)) { + return 0.0; + } + #endif vec2 coord = (u_terrain_matrix * vec4(pos, 0.0, 1.0)).xy * u_terrain_dim + 1.0; vec2 f = fract(coord); vec2 c = (floor(coord) + 0.5) / (u_terrain_dim + 2.0); // get the pixel center diff --git a/src/shaders/_projection_globe.vertex.glsl b/src/shaders/_projection_globe.vertex.glsl index 48ed141d34..7f74bf9740 100644 --- a/src/shaders/_projection_globe.vertex.glsl +++ b/src/shaders/_projection_globe.vertex.glsl @@ -43,10 +43,13 @@ float projectLineThickness(float tileY) { } } -// get position inside the tile in range 0..8192 and project it onto the surface of a unit sphere -vec3 projectToSphere(vec2 posInTile, vec2 rawPos) { +// Get position inside the tile in range 0..8192 and project it onto the surface of a unit sphere. +// Additionally project special Y values to the poles. +// - translatedPos: tile-space vertex position, optionally with user-specified translation already applied +// - rawPos: the original tile-space vertex position *without translation* - needed because we would not be able to detect pole vertices from coordinates modified by translation. +vec3 projectToSphere(vec2 translatedPos, vec2 rawPos) { // Compute position in range 0..1 of the base tile of web mercator - vec2 mercator_pos = u_projection_tile_mercator_coords.xy + u_projection_tile_mercator_coords.zw * posInTile; + vec2 mercator_pos = u_projection_tile_mercator_coords.xy + u_projection_tile_mercator_coords.zw * translatedPos; // Now compute angular coordinates on the surface of a perfect sphere vec2 spherical; @@ -129,7 +132,7 @@ vec4 projectTile(vec2 posInTile) { return interpolateProjection(posInTile, projectToSphere(posInTile), 0.0); } -// A variant that supports special pole and planet center vertices. +// A variant that supports special pole vertices. vec4 projectTile(vec2 posInTile, vec2 rawPos) { return interpolateProjection(posInTile, projectToSphere(posInTile, rawPos), 0.0); } @@ -142,7 +145,8 @@ vec4 projectTileWithElevation(vec2 posInTile, float elevation) { } // Projects the tile coordinates+elevation while **preserving Z** value from multiplication with the projection matrix. +// Applies pole vertices. vec4 projectTileFor3D(vec2 posInTile, float elevation) { - vec3 spherePos = projectToSphere(posInTile); + vec3 spherePos = projectToSphere(posInTile, posInTile); return interpolateProjectionFor3D(posInTile, spherePos, elevation); } diff --git a/test/build/min.test.ts b/test/build/min.test.ts index 55b6568d45..735c4298f7 100644 --- a/test/build/min.test.ts +++ b/test/build/min.test.ts @@ -38,7 +38,7 @@ describe('test min build', () => { const decreaseQuota = 4096; // feel free to update this value after you've checked that it has changed on purpose :-) - const expectedBytes = 907610; + const expectedBytes = 907350; expect(actualBytes).toBeLessThan(expectedBytes + increaseQuota); expect(actualBytes).toBeGreaterThan(expectedBytes - decreaseQuota); diff --git a/test/integration/render/tests/projection/globe/terrain/fill-planet-pole/expected.png b/test/integration/render/tests/projection/globe/terrain/fill-planet-pole/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..0137ea4f97b2fde34fd3c7379a015ad27f0c39a9 GIT binary patch literal 43297 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�cs5EJtOF`mojZ}wGTWEwO={Gdk9e0|aFoX+RvuEO*m)Sa9UpT0iHxOb`caI4@9gTC^;>Tc8=6_Wc-NF zs+p5*kDz?g+Ht*x+I4}tyFxY$p`o4Ko<^?YbBRj@4)KCQZUjj6?`3}V0(c$j^kd+Y zrUphLVLfmYUHc<+ZOcG8=yM+L${cXj7TkD>m3TEw+6o)d%H_O7AkxalybTbHX29=A zfAOBJu7w45$$$RB8RVMZ9$lS=u~uV?#yuE|7jvaHad8@RJe-F!vWNTa(9HoM2Be7i zvkU4@)-Si<^xdFPm7A&b0h1qZ6+DX-fq84r<4vx64L*gk}*OU@Sdn_3!^Q+j*FG7!eqW7pN~wip3!}x60B61s2w* z9A*J@&@fZtN1cr=K>0jsX=TxfS4^m+_vlA~5n;i(@Xy#Le1{NgPP9Bma=)=4IZ& z&B;hqAqL|*gwC%!;{mOd7}9hV!D99*P(qHxj1>T8+C|V?u#^0n=^x4>q0_uFJ4=F< z7nfh|+ItP2TYk897iO|kQ@13Kn9BxH_f^k;^4f&?cO55k4c}t^%3?lrh?vq~Gx6VRds9Fc-7K{ETc4c8PLnvTv**k|YQAwxwb%;@1o9JYc5H`W6 zD4*f}juZ-=VMeBV8}WYOJ&zD}7v0M%_kJ{S#eY0&tn`R72vtr9R#<`(I~ZB(6fG?@ zk=N;U1fco3V`J6K2Ankrce-d3;TJ+Lfb^B0#7V8;2F&CJb#W3gq@R}6f4UCzpolo` z<73;o9~qltxA56c?x`Xq?h9K+ovsEptU`9!lR<5i&o=u$V${1_wjJyl8}Q5#RS41; zFY^C4qPe>GGH+FXh2$Piy4hLW56KR2sZrn*bcOLS!44@8wvP5zi{KTB@(b}+fg~s- zxXs_hAVJsPpHfcjQhhDX>AXjksc?6PnfBvffqeQAcGEC@b+JJ4{%b5#c)ZMZZ`|GP zH`~?GS$5gBV;H5f!v&zCN!B~swD#7mk@TGxkU{>r893;lW~Q_|pB!lI3~O#~#|vpF%Y->kTOsB-PRDm@Ttdz8r1T(Je1( z)DmDT(R%}Er(3_G=qhaOh7B;`IiFTNjvkIo)&*K(peB54&EV3Q%}UB4p5FQ0E{kc8 z(o}l92(2|a{zZNbJ@D}#Jr0%_eCv-g>Xyzu*|JULC!i29lP)K#=GZ7mX*2Qu@phq0 zfwVOlFm>uVIN64YcS?P6^zDuwZ!@y^p4-p>5h!uJJ$A-aa3@-GERI|{7%<3y7b)CX zAnncBo500!!pQ!U_%D6vxnCnkS7DHNx&4iBAC6oVifH`qD)!Kh^z^ts{kX|A!t-V( zN%RA0YFzAiyv*4tkRZV1&wpqQn#{cC_v)dmOL583Hj@<&nMjEyDWiU;=h^Q95HRWD zO+i#xE5nD^8;E;1k+cvrljXxfDQ2Wv%eF4O6;XJO$R)hX5JfZeC4HV_AJp)bI&DM#EnwAyRB3})Nw->G>U3snU zna`E&pHh=iQ5Y4~_R{0vs5`1Os=wGMI#=N3HD%EmHz!^-PuB01Dqby!rbcY$JPtxQ z8-7JZB|XYADhhba)MTK9eEzGK8}xymoyHY`)NLvUw)0`Az`?%&)=3(Ij&P(@`^ey^ zR%evfF`1F06|myq(R->y$2d8&%X|*H#8l|Qm$CCUnm%P}+7KZ$KunnLj-@`o_(V^` zxi?4d!>a)X#r#ZJS!t+-w$(8Wq>$bwq1O*3n0kzOJJ2e}ZL_pg7@B2k(COO6B3>TV z&bhcL*r8F`9>?afu)EXW3nZ?@E^2r`F){IF`N=>{3I!+L&9=4U?>=`|W1Hv^6@7=$qda#+BHN~;9h@EBDV3$;B3IVHKv^-2r?D15f6w%%B_6027nNHgaV^P9Uc zUs=*}2YLp4p7~fuZL7}pV{yh~aRs8Zy(sBoThJpTdHTa9>=~ZwYWB~Q zl%>Q_G7OcjPy||URa-k~Njp&X-|=0oAQ(&#q3z=@T;WD1&Z;70IYrgp8sf=zXY2g& z2M*Eo=GHup_VC0Uh_etrb%z@_9t-pK@^%U>7Co>y;77rSelAtbp z=(z|_v{718dd9Fd|2Uck;hjl@JihD$#0d?enez#8tl2?%BA8f!Q(31cDOC!K%vLzO zmW3RDH`hD3H}UXXG(sKp&04u%n`pTPrYl6c`py;!wwT7)Eog6hUD4JC?8VRWIxiLo zk#WH6`)vClf`v_CYYTFka$Qh3JO2sdgNnyzeF)+5gd#`X?TR(xs|bmN!O$rRWu)u3 zSHb97M{y_M^t1wVc>Jk1AEhl|%xE*gQLIOHMAP<^$;^o6mjmZj%LLY}j6%=KhPxhJ zUOu7Nmz?3-m^|l5j0h*Stk^#OSlB=t!LzooFotxU*g8NjH`kqBlL6h3J6KSkI1$Rx zY0P3_Tf}S34tn}HpS(x5b~hu}$ewe?FA@7uC9Dt*7dHo6#5^EdvvElqm-3lR-e8UH ztRz`3ud9!sMizN}!>L}UUK0ixpPGjP0v)c`q$S!*PzetCq8LJ9+ z4pPSf}y zYUIBmXEawu$j-|(X^uiIzlnGu7H#t*`-_SzpOvt^yiB^vQ>)@HO5Q=bE?*H=*Gjjtz~P+qv!DNbHOsf|GYk zi{X$(WSUm7d{l*vc!$VRH-vP=J6w3#ZgFA_Fu>Y=o$GB*m;-?VJnSe-Unj?lP;M#@ z+X9CHkv$b6UqAgG2umo%eZUe`v1s9MrN!tJ zP~CW2bpBH;H8KUy3NuiL)#O^mjDC^7*V``p*6FH&AvN+YamfsqZsO8{{5_JFy$e>s znN%cemU1LYfwZAbOeRi3$6|f5^-h01c1{n-rC{Le3@zM2vU4-y=$hsM;X^F@WmIfi z{dN)j8ddXL5sj3{!lbC(R1wy>4hxeJ;W`dx@dtZ9t=^TqR0tKPnPX1*0-LRQ6%iEn zsh!!?U*^FHC{e}gOfv=K*q@Sh>G;nwft^irv-K6=^~c_ZwEK7})G{KS1Teo0fF(}- z+=N`<&?P89jjVw~ej~Z4k>B^FUX{a5Tgo9v`x$Xcota5rjLj8a7W7&`uCaGrypZ!` zM`tizLf8{TBk8Q8e6JLfBtam6kI9WBY|UE~{*Adr3DR)5H&loPJEYdP*xDl-8T6SM wQx$5YpMZ>c!!v4h@mv~7*irxg{59)8U|6vIG1y|JD*Sw_l(e+8Aky6oCEZ=pDvXGfw6sWfmz08ZcY{a_-JS0q{~zOB z>#i$0Fmrw<_I~Q%FE1;GjY)+0-+%vMONfgo{`cQi`10z17&qaMy|;rW|NZA{E+HbM z{PxP)uiIz6KIbnkP^f|GYGoyaVrD6xB1=(LFKN#9MW=nI)_rV)TN6ujOSOytg_IVJkvL z_rjR@Dw#EAZ@o43f1f+*yEAFLw-~p#DfjP#;$9}^P^U{j`8T{E${rP^f1hgk(l!64 zIC>;{{0mh?)c;;~`hqeq{P#J-@`*WA|K9KDo@;*8za`eA+RfX3jMr16g^1ce=iR0Xk|V{zw;oED^srOzkkEu(NZ@+4L z-%78f)j==(bWe%w?Yn=kOTg=rGiTKMD=bEzu~$0T%!UKCU5qZz|2+t?b|RKaMD#!| zA@64AT!=#t|6q>TT=TF-y;o;kixe}h<8lK_i)}L@-T%J*bs`o$hwbAOv4K2dO{*rg zx(25a7K4w%;nWckUr=;oc4Fh@DsMOWqZpF)Ue%qb+{Bp|6a20~fjpcs+1BTAE>-+D zNS`)`St*&s&iOV~vmXBC;UGe`QBRk;T~gpcnU*|j;OxxNNhUvZ03gZsRe1f(F&d=H{@#Y?O+UKu({-87SuF&UrMEju9ZbM zXxeNy6Lb1cIj5-5BMEfpeQ=dcd*3w&xh~+#3QpaOMz7+qdScEKS%Dbd&H2=D)2Z0L z6z)I&IgbiaDW%(vXtP_kwubI4r}P$6C3#8CH9M|0OEDL{Ey6rM=_^Q*gqap2FB84k zx+VJp{S(if=yp+T?wlF%!u4L9pZ~1_!ZrV6EGv>$$#goNN&72{PhLg3gl(Uw z*~}kEMfX>-%p3>P!Cuf6jQigneA+YgG|9U=kPvgTuA_PrkyhnUHGdCZ$32KiyK;jk zm|HYiS1`wEK;{l%!=GOyZqM>G2MUtRsnB!z0JdY+j(xiH>{o-_BD=ZDMIsz-kuvm_ zmiJqzGS79g_~ByG{vd8>v}hQyyLdKFlbwftI-X}eDr__7OkHuiErN7`ByHL*b~BzN z&W~IspIE*`FSwIPVotMh=O6bOik=wW=quM=Z1R!02YO!&7;~823nGRwAShrA$qzdm zI9`?*ua(|c)A|)-0#9f)vC}UlozQNQG?x1jN2PKOr|#UU?BAhc3`d!N@jNu@eDsiM ze$ruiIsu90x+^p7F>rJDk5A1Bok4ST%U_MSIbTq9 zgPapv`vppfcIS!h#W?BM-^VB=gk)4-eLWE)`Z+$fIdCYSpD<{fho7vmrAx!CBkks% z(U%}LYhE>e^w^DCs~7aSNoyF>5T&^@F=O9OYaYn$09&s)2p?T+%-`{;VX<2@(XFfW$OTF*WD`ZaBGxSFAl(5#Vua=j0qm}&Pr$5cOWpNPF1s^hcKGEQR&0GA^(Ug_;gdPm9;25Si0(J?< z55c6|3lHj!Wr770-8YIfYR*`h>n$Vum1pI=6?4#K)lwJ=yW1KIY)SUC(unnn3==sb z&iPmin3sM<>*^ryi*Uhn|6f|A;4o z+u_A3Lw^K&TCQ|ie<^Li!|j12MV)S3@7CY`<_YKl20iYv`p-;qqMXF;y8A|!?V!Th z0<$4ul4tWnP5A;cQl7#AS&z$8!x%c*7w^vxQj}FhTcWF}G+amoDc5_SPDtYL`TKImx3j59Jdezd?{z1v}1!hb$^E4e-WPxYU zZZ}0oE9=Rj$%wXu5`KTgLPrdbO5R?JVE^|UR8*K6qOsY%wY*b56cqK-;IWHYFV1bs z6rou)xV1YFxBmGh9c!2uMBWodg~>Jb`x@D zST?1MXO>3ESB?PQO~bz;NFN;i9YY>x<$n{N>%&)ZcQD5!fy9MmcQLDQf0*4Oz2S+U zde+7H@=TJp3rt_0?a6W=iCKcUcHERtR9 zQj%C59+r$PwtaFq`6?>Z$UL|9uzZ@wIn_X{UpX%lJt;)4*7uLweO#1EyU){uq7wFXR#@0#Ekz z;;bIM_;Tf%=~%zf99Yb1-1$umH*V0PKtVPAxy3`?P0Lz$=4reciVe2 z#v0272L(~F7|aW&U9Zu!|2GkOX%Yabedn|?9r~>8oLm}_{EB-Xk6K2tEyTNX!p7m^ z*u17Mg^(XHYoR+gq^2TelGIg&LS!*k7*4(boPdfk`6`&S>78`Ei|=)2fUG|cQb>8m zSk@Lu*!Y!&?s(JNb%R?{ik4m}Q!RwWpz<$f4tjxkp7dCWxUc=f_4>)uqMpXC(#GtS z{M?hrrbZ|>8z1&@qIV)0f2+e#yDQ4BU!v5?qHMg}Xh|OV{u&`~lt#(hEg>XD@SC%@ z?d{@9#J^8BclQf+6E=IRDOj!b&Q{KS<%z7`cq%jItl1o#roqNBo?l(8e*+MKAw~$__wl8%@K?A-1-0Tz zDxL9d0nCc^0*!tH-*2dCC2zG-tW_5@h>>p(YYtC*xDoI4&|&ep?c;E2yX_{rF*l2D z!6eEe1fwPbjT$pmb|$GETS)g-j1taHXXqj#db9DPwZ5yGjYpUbJb1{QuJ;PP3F5k{ zH|>uX&`lyX+jdls-Krg%YpcgQj8e;!W3x7+H}y8xw74J6ux2>5Wi3avZhqL53+iBE zd9dxK11jO{prX`53`&4GlCOf0@04NYqI}6S|f6YohBdL2i zgUyCQy|_=_pa{TiQ&YPci6dgp9cbrnhQcJ@Yb zV1Wk`SKwReps13nsDyum_rJGUQi& z2w?gybj`xB`Hu6<6y18gpiS-TS~ogEmJb)_Lp;}RA@c0z9`q~YE2XP5o3&TkK~Ztv zXv?dxAJN8SGnQ9uSS={gM`EU><*EyrWjPf)(mJ4^SV4Cf)@0CbFP|tzC1SdE=c0R) zhG^9Ge!)Ny1uoxDnxstF6qtw8faO?C@iZ;X0)WszbJ->U*0^Y|yP-X7`YsHmp*X5da(zS>>fTWcH4;@kPOA7nf(v!W+Z~BSkABG@5{VG9c+YY=_(|7Y^ixySQi>7wC1-d}~NC zF=vsf?(2>{kJD2CGm(?-%)2Ou-7bJmLu#jrJ^U>#@#NS2Y%OcmW*nnh>*!#^b? zU5#1AkWiy}y<(u4Du_s-UZ8rT{WCtMOk7xcAc;iSXzIl_E~50!w!ZGlc8f~og&T1v zvCUR9F{VkpP=+ku)_)m^+0UIBZjnoy(I$B`>@5SY2_$sfundZf%qo0yWq)P6jRr=e zl+jYCY;0W@6Lt?U_3UT* zw`(l;0>>iAiWyajC@8Y2v=i1HiSFZ>M4X0wPh&ZaeqD{5A~Zq2P-5JdOK1e#XSKwV z&{Z~^da%GIXwr#*%@__9_kp^=c?5$}E9*l>;90sr@Wwn{R`Zl-V8m#0NMt_EN9G;R zP6drE(H&s{SkA6xJ3}z*Z?c~d;{ zQd`ZojsxlTz&?d*mRHv%6e%hwCIb_etJXW$a(N(VedWBy{JY#=IrOHV5G${fdcNr?)brDx?GxHMYQ4Q3< z9kN&q0N`y*nN37_9;TToE%wlKJmQko8+{(juF%Q~bW~DuX*ATvJMMMB(u^*?rcIZP zw?#<@U|OmXtwvN*c>3^ovY-7@vh>%Vx|fnsSqem4i#r|Mv)6Oj-8nUyXZ=bHZ%kV@0~{iz^ieQp+4I%K>kRoaZLc`l;t}_+1nm7=G?u6yB0U~07_}Ru7&Y%D${l6j{ z4GqXZvaVOSEXH?EH!RZnBZ^sh9N#otmz1({hOROC2UH4&cG|U)5IW;-!(UgYUH$YL zA8`hj^cdHlzx{JX$5Umtu5 zHM=++Q7i^Gp%fGoD$XUJkg%d0Gsoc4;ds#rLzN99+)SZC)Dh3~>NYu9n_OTLEn&~~#HaE_8(5n#(8 z0M3@rUGsz8R%oX^)n>Wslg*Saj^(DklK|Bw@&g!{jZ}L841Tv;X;dEzxOj2kVpj~i z#O!X5*|Zi?PH-Vis&f8b6obO3y_9uLs9vLT<%#*UM|c2pxg_A@V1Cu)+&};=Gl{Bs zrc(%{YF_0swRKG&U00k~6!0`UA}-@2TO@-LJ(Q#LFa}T)1TNIe(Av~~80td{x!RMC z+)#?(Kg2WNYU10%UAJH32lGeOpCRE*$0KxVTUnb!Oxo_@@5D3A>5OeL$Yn(>$PGmRAPr(eS4{y z$5|1kcJ0=pu z7~R=hJ^XZOz4iylrU0|vpT^UeXVSJ#J*u<>HccOK&dsA+)na~00HiL6u7_I$` zKE+BCNK`vLKxM0PI8R7Ym-#QR9*kF*98Tdw$Lgm9JhR*LkJ~EGPPqWUp?8{cV$hb1 zW-^SCM3b?FPBzzbC+jLC7W2G`ppry|wc~0!@IE#drV##S07^?K4bg8eT-^@K$AHM` zMeb-FDFzTYOjv0-6H-ylS4o~6qJRU|#Z&6diz6)x7UsjpTuq{wjLzOhg8ET0o&DV4 zW{+S`S~Q)<&TZJ0KR7n)<_&%EDo`@lYS@%AvgfN%M?(c)`Qu2Pf$>S87x%Eqm=xg(kIn$tVTIhWEGn)3JSSl?=%4t+sq+0l+H>sEta>wD%>_kL>Ts zYRn4-eD9O{;WRmvGK5^+<}zP@HXt#Bh;#H;^SC!&1oL(iwXu4gYNpF&7)jl{^QWYz z^3scAn60Nb9sAYC-dsX6Ni*78#2u^o&D z;E+DzQ`bANOmq)EST`F9&PXa(q@s#P&Vi49MbLt>lSafY--mA31C8(_5w3N!EWw6<^Vqs#H4gKRE?xq$)tieKr(^a~$n!%~ z(xu@TYjGg^ep)Pt0V)C78~?#KiTg;2@KGzSSWcDK=sG)dbhG~GhR>~uKLDV}+{9-C z*+B3Eh?bG~SMYMSn|FxErd~!P24uogo1Sk%b;^mmYbBTj+J=#UEO;LGAZ0eDkhdQ9!v~|X)uJ(x$ zvWmcF!x8ujU7n+zr|QDZ>wxX!9ldEje5lIBtV}guZjs5aPPrsCBwbqiK+iVM0zo_u zX}19W!%{`y(XT#kb=e@Y7z|F=m!~Eqt;+DFq5z$s*WY!GrF?qaO|$3&14Re= zGeB9W-b|Mx$1e`7m@yvFCVc)5=w=nl7p-v)vbr)^Iy2XIb}&QvU^o4VulC%nRMKmo zzBn-K9+Lmy&mSMxMM7XLtNAG|Hb`!VrCy=gJ~3$aNVcANU?#@I#M0HyfZ$D%WTG@^ zsHjNnKMA9^{I6SVmXEq(L(_*_4<<^^58wz!F{6C%k23C2+6(!`eG#&{`+kj}Y4Drdnl0+1X?PI|UmX7EW)4O6MdI{RLS4Om3 zoJMZ1KD#TNnGDv1ooGloVy?Mpe;B0KJcLG8BW^{TWffGg*z9@TOZ^c3+#+_Bqk$w# zJec$nW6*a!E~*M~U@H(&_8{R$iCxd^U?ft^3u)1CvVsa*$T)K-^(J2+%I*y-z$11o zRLSQ=MA+_j0aOqp%Mxx0R?ShOaXVCPWd*yy%afx!C1j_fzUXk8-AuT`daXD>_;90U z@17r7J7dL>;^_tyBdpcOFyeF=apc7gLEWjg#d?9a(Pk|z{ama?CJ?`q-J}@47-E}L z1q$LxwjSFS(mTY!Qq?JF;(tmpZ_oNc)vsP_IIL^w@dm!dcSurV0yP@c9>9_VGOFfh zZ)N!-XD(FLrJ!)2n_S*-Hoh2{S%SwLF=oY#br7k;9jU0^%+R3kYRqo?#i|=M;rZGs zI{~`3m*=oNGO=IM=_Vb+hk$|tabz&qGlf>5e$5}R!8i)u4bD3Bu-*!0O{=uR-EPNa z{cvJ_L|K1X4&4vuGz&HS#hwf^AfGa0-rnVtih08+w`$!>U`{O33pRU(%`z8m@=T{cT4e40S)hsim)p>edkekz`71oDxpd_=I-~LKGZ zTD?VSi(F6l#qKgiF|xMzw|4Su6zc0RFHgyt>slwP0?B(m-DNjxDAXI4=t%^ELLr7o z69Ij+-66TzV(4=RGZgIdiC{8*U-Ok|_bL>bz{S_uM(z_+MCqRdm&z47GS}a9W#+FB zH^9j8zU1Y1+v?B_Ga7CMi9Bw`_V?XkL`M_=R}et4^?zf)#B176btnS_v%K!gG>8d? z)afSH(4>l*-C|57M~dHL8!b`^1@q3+hu zK$5Jj5bv$6MlIJgXw7H=ResguAV$7x$^n-q$ucM+Vhc3-UpGL}8*bC{+YYj^T`QvW zCo=erAsYCnMQ~9}5X?PwTo{G9Ox#WzO{sYr;_V{gLuTq803T^m8l|7~8gu*4j@hlU zhhy0Mf=Tlt7rUTCtuCzOjOk->sQTeddhx<0LBMQvL;nT(nI>h$xmn*+;N7)0CLO;d zg-zH{Yy?{Q7o$7mve8T)N68KO)rtto#*ZYfl$w^w&8~m0STIOb?yKT(`)XRx=9V1w zcq@md8^#QoPedWHhTg*a6Sczo^Q=58mPT$&Y5V|FVX4oDFC+E$&D~$O&MpqMY_D`g zX;_3)XX!Uw&)I7v@BhJ(mIf1Waf*qqVI&^U8$V__*Ijzz2*%f6L>h#Y!K&DeXp`7u zq=>SZKd8Utub7sM;|wHf>P?2n1w#GY>>d=e!V#TGn9jsjs%YqzdCp|U#Y3b3mCt{v@4xP<(KB5yfPS|FQ?Vp`MXh!C2jEFbah7`h^_y8 zBsLxW;)CPy1;m;@fB=mVp@4auPTV1r zP7=sQhEfo6_nX)5;y?xMh$_;*L9hDUhD<2~VFGYJ3dXxxU(gIL)rB`~BSfR$sUjF- zl`ILo1K+L;WDHbuWhBXh=oAr2J865(W$LvbPN`J~0ZeX~u*B{96a2Ka;r2Efho4tK zEa#eTO>klLsxdbkW-#vhJLv$#9BpmznQXmT8A`D;h|E?0)frQ2_G)#Q-TXIwfh{Uw zut3fXj31?fL=dU~_jKd%K4Z}B4x`#zo|6J29+Xr74xF*ByGQM6l?RA^<+5nVJivaH z1)h#W3I{A-8y~coKQA9Ld`tCh4pP|}HRw!`ip@^-_J&d-Comf>_jV3jWu6;AZdL|@ z0(#l$Iv9n#>%U>eQzaszvRS~CQhM!k6Aa2*k(4(Gpb2wtJxCZ1MrREbcTvUlN;iAqR~6>8|6l zuo>-$ZcmLXi1gr}Roa1ZceEWy+!AA=sQ6tK6tC^MykUcoEErB?&DMvZc2;Buvzisy zSfJ<8rqW^)^`>Eg03mUE!lnn5lhUj%s2F+Cs0QPK!Y2U)6NaLJZ+=}36G?uJwL0G? zR<$Ep+{sgY>4l788*@^#uGdC_srEW*d#6J>{@Ea_hH=@-2rTA9hClSWpe8`^cH0N~ zPQ;<#_Y~QkFlHl|Ul&VR)P3*CAOesL8jEJ&&Rhz>0;`HfjZx-_KkK*L*T}Ql z=Tqfig;!A5o>PFJU^51SkLA?apEl_bqJk(DM~>*C_D7Bfk{AkfX- zT1tV5E9n_u!r_(1uvn`*t=trlsY4i+}OQM*0ID{2}wUjZ{!&M6m9Sa-&or9tk1NgGrU=DI%@r)>^!M1-z^ z9q{MpwYd-5{ze_3rO@qH@9C&kE*z@{5l|_IW4cMhTdcb&2-T? z0d0)3hS8#UZvn0uP|D0{0a)q%6%h?tyd?-m&JY~Mh^R2i>{eDd(kH7(c?;mm8if9M z*+G120n%}z;nX$z53vaBd-%`JH&;?a1pWpvD@$P$fdD;P6cL@%n@@UqUVvu~u6>*e zq+0&BSw3PPFLL3#?JK@mdk&_b;6>;yvd2B(o4W0Tm*KkmKs4AegdZ{sVb4NteLt**bB%C>P?}??oYyLy? zfsc@O7?6XxC*yy+!L35#&DTO+@EKe~`hrv&T@dW4z;yx%$swI%_}dk1B2f8;Cy)g8 zTfZEazkg-Q<_z9Z^8*oF|GbV}xV-a|uD+yFu^_B=V9T zx3Nd*+@q2M@)q@HRGz1-Z{A@pEPw!IHJ&*HE!iL>?KPIyE^#C% z0`G4XpKfG7V)cFU>KQE*fiD<(KIqKR+jFPYG>Q8#PU9}H10j1bD3Ql$Lk9L<*$5qp zOT5a;SU8;V<$mOp3xP0L)p`k#P0|28UR6_rMkW?Sd)N_qh^&3DOZVo$B2{!J04Af5 z@`zUzm^$QfFgSFc`j$c2F}7>MXHfqMHD^e5SR>#e10r=ejz6vu7nPNf8?C0BRujKt z-yiW28$=}#3^6zmPtl51gYj-B+uoX)&(g3=LT~0>IesIbcGf3@ME-cHv^_(@-lxPi z^<4|myM1EWwICjw$mubbShB+IX&F1N5iw^qk{i!>EZIHuM3zi$K8RZY7IczXD6~$z( z{T<8;9jo~(Z#1x4fKZt!zE01bbD7J!I5GXmq37GKWR;r!3gW^{9+pJ&{2_bzxqtuB zaqlaq%c)VEpKnG)-j4ez!(}(50v=L@H6+OD1wBvUMjss zW^{Zu@Y6Oq(-GO(U|vi4f;vf8?#nZp zYd5#b3W`vPfQxn)8$_MEx%V~;!ocPMG!4-4&wp-ve?Tvgr=SwXjz9@hq2FfQf*FVB z6I+imWHC}g%7r*An!)IXkr?+DkV^n!r{i9Gjt*ZiD1onC=LsUhlfg&+@;>ubg=0<| zkh;s6x6q~N$t!Z(2P5EkzhHSP?#ZjlHCE{DUtTRuCm40S-G1$LZqd!BH2NFFP;lqL zDERFUW-O46y#au{Bf8AKL{IK!SMd>KM?!aLdrh$2%{$z_v%qdCo|t31Q5A1@lR#S} zDyvW*S?C`bp$=`{b}4z%IS%BN&Km^1`3ZOspvn9Q)Ve&FPm!w8&!L%c7~#qd)cDg~ zI>`4p`;it;?U71F~3BLFm zt*dGULBF5x(X$>zRAd@j#%WLKGSvj{2^KP@K?|!B9sIS6tK{(Lflg;fdqW^fw{M%fO+-loM#P zuGXM&K(SgpoT|?GZlim0paOss>;QnDC;JcsI+#?-gS==UnM{rn$N<>z z{k4|kT}V0t)&uENUMF94bt1Y)AjQ=Isn^)*02KsGE-WT_*jPAxUtR|Q1LzSnfgtO> zRl_xPJ^q@rV$6=HP|BL)ba`wL@WQAXL?bYWUnXKjI&O9Y>Ga?RY&2#BWfs^HTEn>; z@Gy%5Q9i#`qN1RaAGSOYBcMHN;|*FOxHq!AGNYYgB6`*9@Y!$#cO=L>BVGp_b=e&4 zDe2t@1821Lo*pSWUh78!Dk-pImVZV1FN8s+G-u03-mcIZ_ozN&RxsrN8KB5C2 zi+mT=?bEeJfzxNuOkd#^U0w)hZr{^mgf~(IRjyA=Nl`xtR7Cf+WZRv#QtPgY`mRg` zOsME$V!S6k6R2gtIViWH0)dfleJN$R_kI1v-ykkuGFK5r0i^;m zC|tA1TCTS?eD&*}XUg-HOfl zx#tg`Y*PiMD&Li%EG55#btCg5Tgm9f9zlPRw-8VDR8thVZ`b;{h4hWkPYsj4+?ZY& zE*4i-;H;;c4wvW3S;8g85wsM_xsUc&`YMa2veiR7m{PR3yI=Sm?`l*8qY@3)5mn>v zo7>awI|-oTlzldhC}lV9Nw+hQIPNXfgOpzMVrQ~C3se}8$R38{T^D9VfGjTb=Ut|5 zl4-<4#9M@2mNYX_;a(+z`GJmVf`@qibp zzvpnibth!02AL|~B=`84;IeZxCoB_-7u2peR-CIzBSj%6J2Y z@aZK#wZJny~xEl-z$w=s=q3V?beyxb2hUGlTEwo5{)WhNpLhx8dj zSr`xF#{1spponKe{`V#w@4pThPg4(cnV$WC_2R_Tx>iL|V7JFxF%<)eIcAWf%3`1D z=yeu)x|w0Eo&5CmrzYR;3LkMznlQ%{ldsmFQzzgGe8CGSvLc3TAIHdZ$4p=Jo9S(6 z-F8|nc4mAXu(J^T;Mq$=ET7q`YIC4o=Oa)s#eIv7paFqu(tO7+^^*rJnaev;=SP<( z1dNDL8=!v8#K@BaDh%Jn9#r|nivx8Xk3J@qeChXBQ`02c8=45%j6UB1eeH;I zuN|GrcL$TYQ(2zIk1UptngUA9!lld18W}6(%X9BE2hD+KbM91ksgntty7C=1@!LyJ z=Z#c#7EYU}oU=J{VN^m3bN$va3cU=Xd`y0UgyDXFOZBW{a%`s5LOJet4%2DU&eSk$mA0zJ~Tl63^19lVg+5_y+xy(1H|F zNZ7NoYIcL=XB)1+f2Amr_%NhH4^lvFG!rHzCJqace8-f1nZ8e7t5=1cZiLJJ`k>`m z#-Nh<^77)hei*Al);)(sPdr zGJ+C06#lDEtRw0(J~F>vXKA~|zX_Q3@$N$A`o!{BxEMJVQJS#~Q+4MPnx}G5GOjm$ zhEpH!QS3RKd@V<<1GY`wk#Kr9|A_VLl(oq=!HXx$-Z!rFWuDXBOV;KcFQXt@Kqa}( z-}O52=dgIhA8V?tC_v!fTUpebmBDKJnAiDBEZxM(Ve}RVO9|~M~`E0XI);6e;4Ausls!3d0E1j^qWg8CbPyoqDDqAYOitB_*2ax|w=Bpe01 z{jDA0_4kgSAB0kTSNN^~?wr^8rxsFMnuOo69K!hYaPEe3c275PZr`m!z&Nn3epfiv z{`CRp>)Uwsz{j?&s{>++iox{Sv4WQojH@F`*%8v(j(6n*fwT7iD3iyt?PQs>_0e|w zhXxft`)MtA2+SvZIvC_6D6i-L|TNdu2w>7&J5u;{1 z+joTzKc5s>q3voz33tmbqW0+Mh!6+}j_ArI@Hj60jOB=6W_BDmD>bLmJGO5QOcuHQ zUEy{dryUr9hxPqgh)6n>7bp_1Bcby1{b=o#@ksrq$}{`q$6pvJ#M%|{3hh#~azwHJ z+CiGaWya}c*VkWxgg6p+tAzQO2#9!;m)_sPxQZx`$beY(<&od3;UF$n^9RheA}zti zR&%1`oQ?yVd3^> zP2<+=-YU)Vf1h4t{(Ma4HtF&X#v8*V!p}{bu!=Su=1@8QWQJr1z z`jIxL%XsVt$xC8xzc4eCj%lDtY8~7kaX8->7J6w;N1)r8Q*iIPbB?vPz~v+vt+IF` zB>y1Raf@7hyyvOC79SHXpc*V@LkI_Wg!$h`g2FW)POJ1$HsQsNcoiZ`@%npT@Hz9V z#U=Fi&2a=Lp8y;0?>C&N-c+n$g7UJ|7x?JOgxkS`&!P(mHj|xSw}iPSe};;+k3gj! zw^-+bnUv3dK%gVOK7MayIL$~3^WlTfO}-noa5ct|7Q^=@c9_syGXx}(ycO&Cpr7pa z>~6OljIIntFwn|r6u#`gf)`5h*Uq(-)Wvoo63T%`hAN|K{(Kva>#3Dr;M;hhPM+># z&O<5?Yr&^$je^TWlV8K-jAwRv-k%1NVD=-T1AatJU_E32r7#SS+BLV3(BrO+yWGVTJupeye7)ngq$ zoU>z^G|9H8A_L^jJCIca4G92`sRH3(PRsY#z~gJ(+J+<}zMv1IbDW0_O7_;^yDNj) zO`G*fKiGL)iamMrG_jo4%`3o(IarTj@p=51Xdxr%5pR@n*P7b;`1XjdJ-ESz=J*yP zin(8V0jr*F0{mHM7cP1v^f=*f6Cqcy6f-`e^2=_w!2q>{JFR~G=avN_ILIqsKn-*J zt}yKxZ9N4h<%gGb?5?b8+Ekj*|F*_V9M>gB@*&k0P7USvU>$O_L0r(tl=B%zG>e2A zI%85(#b3NOg!q{mT4(7n!4J=?yuzjB+@o3A5!H|Y`p zr0?U$7$nchy_VkjH-Wj3r9`Xf3wo5BQ!=2kj)yTTQxi;9<8Xwpzwd?EqcsUBujIJY z-BSj#Xfb#jr40Lq+hG?i5Op6?5zf;Dkl=yZ=`fn8nCUMdZ}gJ_kLvBxlVzZBDPs47 z?B{|=?0mK8$xvNf$35P@kWNU89<57w9iUz+-td|LQnv(JFMV$A3!&p zv*CHBsC2x_eCv0*%-(Wiroz2)8xfXi5F;{o$TW)2rC=Gg}N{%632o~rD*j%k;JkAfy z`-H)65su^9{dr9!MHnvmdGZLoEYkNlB*mwD@ohMNAyN%mxc$PvtYYYMSJosix(7k+ zQJhwvS|Hg3w_k7t9mTU%yRNW+P!vx=8{$7ov0dqtYpZwj&NpeomBHDX-O-vD{U*cS zQd*ff$SIm)hy(L*Ee`JWgRL>C(wg7N@U^ z^ug{9#c-MFdQAXz8!ikUqjr2_CGB2=Q^`V%PB^aiSNZ zP9Z(;T)*?tN1TN?n^edIC-4HG+N`4&%hi>eDE~cowyF!58i@&ydIPi2nK6JsDHS7H zS2mKa*yzv8n>Y~^=#iB(Xj1#2DR08#Z;DjFf-_T|>BKK~Whsf>?0YtlQDXaKqT;?k zXwW6bEY7(e7Uyo@_ofdH^6#K1Gy4mnkAva((=tX23%U zl1Ggz^kux~Z~g-Mwv`EC-A5ts_^?h zDc-A(cpW~+op_`ODt64vMZ1$$pfM-6+Vq}wIo=inoC7pOjvNR?7?si1*)B{~0}`qTP-?g}S;KvPs#ICn zdtdHL6uQvsdM&>@U1Ot`3ES#qW5u}onIOZ-B3sSn<@)F^{=+X}z&GI{7T{NM@2wVc zzDp=WSWR=e8nFA7${D;bB>KKv&U9lj+xGB>;S{qNK)1btX?wiDcUf}>Q5F`_@_HU- z`Pz45ndJRdjT-f(2qnt(_dlGFAXb8MS~+*L!RtDFehB1NSm@{e$nLP_*%5`%W957j zkZNDy-VK0TyYHd`BDKdpeHT&L{{`wLRqbsSWdb8NTFO`q!X*5vnTa#f__uv#o$OJr8C?HFd z8URLgAzooEl43c-)Pr>u&Zih@Qy?L`g(#rd_6S;!GZwhETVi~NUc<}=KK@;5s1RVR8orHuM=}gVqArrynh4WgQtE-p!r8+cLJfH&eF6yRce~u z@4IIg)mpR|psB;%s4C&1Y>=ibH4ERBbl)T5Rx}-FXZj(Ye>X%*QnFp>?yWvtLHVj; z5{JM34;Wgz6NHJm+W&w_eWWi@4R>Do6;p1)eL%*FR^|6saFVOR0DT=;I{B7 z#Pwj~0kQiv-v&9A7P1ZieS__hpp`&u=x_#PW(EXhvXK;o2E06PX`{Ns!ouv;e+vP9 z4It=HFlsL}4wB~I`VVdsn-QeTE);i+7B^XQmo&!X z|6uU>Mi3Vzv?a*>@yRk!>#eGOegIjiavPN3W#})ozMxkR{lsPohS6L6S6N885FSLop6yTPqPG zgCJSCRd|;Df_g=;^ZFyUkH37DhXVAQK8a*%ggdWis)qu=iX1E9Mv-Wk_k%hHV)bn? z($`(Fa2x2{_^$|fJj>UwKmz$>A0FjE@puQ$S{~vK8H3baZp&#tcdITUxHQpBOvol$ z4r26t+uo`eUhALJO<;>sMUNl`7D+dj_clJ_!Erl*ZlPlqf4N6hubM6hMnaFpATntb zE%8hv44arz%K>|?xlLITQ`cK&e+8~p5t@veK(IQm0`vTg?R7x0+5JfRj&Ft%oYufM zPv>pC=W2H02}}pA&rfHBEk+=|D|pe$T>snz2TUrEDl-+4vI$2E1i}2OnI5j-r)H)Y zn(doIloG)S zXsSH5zKKgsRHiwQv3oE9_w_tZXhCp?Wh-avhRKGo*oSv=0(v`!w_8Xkq~rwPW)=j( z;Mvo}$n?h9jk_Pv$-nz>W30&MZxh_1wwidR^>silLlm2-UMsQCz>jZztptKGjkp9S zf3eI*sL4Q>(ja30^e+S9U*WU$ZB*nhualZ%``h zJjV*raBYar9rEEsT+|$qrh_{4YQYu-ky$D^02m<&F#4QuZ;jRwkhm9b5HVaE5C+y< zk?%_pGT(@srLG_x%>=z9h)6<`C-ugaYq#$C7kcs{G28mLTP7&(ax-ASF;qx_C@>7h zp=V*z;rPNG9DNRpw|ff7A8u6b%7Vnb^~QZ6)`Aj{v$(`;dfeMntA9`v6JLK-74rdH z_R3a`OuI|5G^Kgd%q%tSw$)@Sv5h!5J;{A3kX$q$j>yT=WtOW(k>Lnx33tUpOH1Hk zabW_9)n%qH^)@!qb2oNSa35S3NjVtrPH43cK zui8WV&05$`76qYE&2oYYH7^Qkn@{#3DL3QYGv8)8Dc<-|I-lp96 z5pGrF6i7<)P`*wPNx6rKU#$Cj{>#(Xro(}Co@S$8I4r)h`-A;7b4iT>E9uY;*Q4Nu z$uu9G%HREwbu~CK>lIRO&+G`5^V%cT;CCQcPDw8JPkL4Nb|*}FatXajg8W69`E6`s z5M1oj29;gMb2Z@5Int?w^`-^LQwr}c)@*fIIK8PPiJU!FW*q)V`=PgA7gv`*FH=3XhNpEm<8j0ejAY;$Xtb+pKbYZ{ME0q#}O z>L!AZug$AkkS=^|6I~jymGe7+?kvXO z{P;xT*ui)Jl=L7jTV=fridg_N$#Yn%Yq(oKuU)^=_pIm-S~XdC?EY+g2nDj!sRgtO-KUn%x@Xj3Kjj1_WG$z~Lz%d71D~5Lrg)HW zwtJc))&cSQWIKac_Pak89&Y>yfV#4(n)tTC3ou^&h2-|%FxI{*wmi*_{&2bRwB7Ex zU|!Qc;i!+e(R+d*#z{!H!VMDpA(b89Pb8ckFDfP*PB#bg6CC06-oS$UjDV)oz^>Ee zx{0lS48KN1Z;A(A+U<#E1ZRG|qQfDUGfkE>iYZdQniGOU_4KOn8!sx4^e>KH^ zYNqQ+1x`tdXj^}4C}3o+8Qb+Tk8=)wH~E?unib<|^%wf1&o7RAX1w7y(75*Zr}aa$ z>2-iuO&i0DQHV8+WPKCn~1>uaQWMzsiV*9t~I|kB9@3b*{1^I6%ek zQmB_n-UQ8{D~|ijmecZ^HgC3C#v38$4N43{_)Qd$yc*1vh-NAt%pt%PWSGrNF&zmG zm(|}lr-f}K@WCUV zJ)xx?IXSTi<_*5QP)ocQdM#Zpnh|azl^DZ?!{IytE=s`5H>Ycko&r|xO$O&vx=A0@ zso}gTh}69h;z^TavHZ%n4kh&OZNM+oGHYtkQLzYi=EHHg|GDrW`i_}&K>dBhBAjWf z2Y1@~b?9{B5oPM-odU~!K0lmjRX&gC7&Kg$kZ{j?BLug3;4-upx2xiBA?Nu}sH~{? zSCmg3FaNKl>wu@aZ{OLQbL>5iJtB&P%wr`I3Xv6+8B%H6PD4gUWtUaTN=9WXTauFK zu^UFA63zd0djId|dEfWp9OwMT_j}*hecji6{eHLOn+IMxVoHP?+N&P^cl~_mJ@apj zaSM+uZzM5$V;a9Nvu9`^pIt=G9^^QNq7Npx9_iw~p~a^&%L^v5oyT{$UteT%T%px< zgK??%&kO)8ut^L^ZpeekUY;ieeGNDTXu} z$0^G!BfD6s)-7Y+%^cMZK>Cw6IUUXWc58i3EG4GG8+>xVDj|^#GKGKCK@0quLcA)y`}lqC4Xk+ zLKxH}6ln~}JWW`v1mF1QO#EH&K0sCoB72k@|J(rC1IDBw4Kp%&PIg*Y{IXUneOr&; zcHQ=m?yirAz9`LcAvr+=Gwfw`#tKN;snS>SPM@%}96_@~fW(U8tS0!=J58RadFO$ayNjZUE5`? zOfOa(Q-0uYe^2F6$3UlzMDW}kENBh7q|qWrX5vIZ%%1ycZ8xYI z_*!zDqHSnrCj*UquD)^QHE{T^oOu-_x14WOIlFR!-Ai3=*Sq@nCHCgVk+kGn8sC;X zc3w9obb2&zh~rFafkgkXA)(VQl6G}phAO%}sC`FTPrlz>#EvX+fGL?0W@oqHsO+fW z%Y9Xj<=CQ9^x|kNKyoU_13$~|BBebG52mk7*G+#Ix&U=@zo=OPqM@_jf38J#c1|^y z%@WpDtSl|B@2gMYmYoqHZp)*pRMLz-4nF>t{`QVrwp}5xcIfQdk_n4^4iE}@O^a^^ zPfjwRoQoBpbjSj%T;K*Ns;I~=reuF8+f?sU#J2CQ{o5UjNJJ_-RluK zGEh}m;0lugP{js+@@%C(La4%}C;5@EIZ$~2BOPz@LbT2?)YD$-a0DAHtp9yn{ETf8 z#%H^@uV@>mV~Txk+Gj4s3JxI2(tz6*F+aYcb&sy?!xP2(b^8t6bwD6qfuV& zm3(6cRE3|LYR&%(kIp?emHU^Mm6k`# z2V(fu&?_GtghuG&3)xw(*&Zt$3oOu$E;ZN*SWZ7zfl_M%p_eHz85sZbE{VI6D_vDq z*7U=lpHQxRczvLLmfv~bgB`|cN*Kj@c?aUJ4hgkM%$m+A-`R^HB`1i6#DLZ3MaMH9-Vrk;s&u;3MVm{S@$@A0yJyOQ&@lr!e}M_RA9zX zwvt2A(%4ZAAO|>sEbjYw=I{1rdeULkra062q%vcD544Zt8i-30o}LMD%n zgWM`_QjIpfr2RWAe>CX8dg$Cs9wb%F%8Pggx{_I+MfRkZ#k($5%4Sg_(E_eO4sFS-*LCWzw%ycf&cBCY&FI=zCKVj zR4yT=GmuXQY-5j_DoAwtDavzK9bmj+cZ7L~GluW`>1p5+Fm@Db^tSjf-O9h#i^Igj z4NK0QeH8X{5hHzH-dnv-cfq`=+|G%&C$4YlQhix!UTiaVsx%DVFWI`Wey^}SF~DBl zq+lP%z;^=tE&_xHnY7l_szDY~W{E{E zTl3Lv{$hPyiApEHxXSrH)dHX{Qa&fCzuLE;sJjNe#~pl-6IqZ;_G#uba-eR$@PwJx zZwM9Z(j&yIZxeRRHcN`R9I)GF~kzPaPaA!9-Wj=KL zq6~}58sCVQI$xbH&uF>G*PHvScAT3&B@{C6UrW)hJ|h}_!|59jJjM7GyD&LJb){N- zJA4e3_Jnr+T->_;hD9DCd6+-$E=?~`AuoV*#l#eHy;`HibqzG6+ApB%@NtkE;h-X7 zaTHcz-Dy{;)(Yai{n=GvU!UJ~Rm|p7cB+grOYr`f?!ruqe6{59kvfz9R<1fwr0H+} zGlLg*_)IUsfM&E7VuxgA;HKJfK*;0swc`te?H53WwR=@L+@xx(t9TFo|u{TX;S<$+Cw^`Umv=Cqo2hktez6uT%(>qRj?^R(;H-0^#-(rv#$~JSS@N7( zEimVjvq`OHQgW0Np3OR{z3$EQB$^8Y8+Z5nm;e6CWAIz%Ywll*Vt0f5SN9;d#w=?3 zMnzl0vXzlTklN5k7M%Ii@Ev{Ur|eYuS}Y|1?Fm-C0$l86ZOpyJaX^-U8sJ|Ciml-* zw@KXVLbXQdl2F=#Q@EynS?ECGzjp6V%xIoc<`Ah05JGxfnuL)1$;IQPo+d(QCXCew zj4AM5A}00>^Fz*ff_u1V zOxAi3pona&J;jVN!z>~Ey%>g=EMgM%y#{4IH8>vb;rCL1b#FS^e8CQCVG+6PxtAxW zSfI+dA_n|>8smK*24hj491ncgJJ}^)KgrmgcA!uAbm6(PjqB*&d(WXy_%Jm*>*N>j zx%auZcbk-b`!SC(y8i5c?qV7gv-MB9|H6fg&(ytI&==`yho;C(L&dp}JaFC#nU2vq z@~-jcj1rtcXS-8Y@;SxeAv5G)`G}ZoU7SUd;)mfCXfzIy!$TGy9?ruP=ep9qp&(Nd z+`OPs`byPL0Q*c7W}qXbe^$XIef-?5GbhnI9o2&V<|=zvcisY0+r zv7FnRi}erV6@pDs;eiiyjhQ&VXViQBV-({i2cr^F+VI=CRB}=zC45SdGte3+?mn>}8GK#DZyx9Wt3<0-1=gmwnQx!q|lsB>7 z+i#^}2H8xIsKGBo^pH)CzQ^bonk<=GS)mutY6Xd6*8lB^&}@nGD30W83cM}rF(PPN zo>OpU;$0?Mik7Dpytt@s4B!8y?&t6P} zjUD7fKP)gf!3_YmQ|Qj#*?!%{tN*hEfLF_}a3Ng$z|roSWAjkqA8GV_Zv&3w7BW=* zQRn+{YE7v&R0Uzd+3JHFRBg_ZxOkRq3h;OjUaF<6FS!)1RNw zsrt3ftJ+%=82SLr)ez;jJuF+8-rm`hvQpQbc70Q%S%S=BEaj|2-6lFl+ne-Y(&t}+ z2Z+Y((450I46Fh5;Fxvfb9-kq?9m4YTsSd)&T7ZS7&g^BBf6+&8lFo;dei~y z?|JAoFn3n)dm;No0ack+6_}|9IC{rn65WI$3dVZEeBmy+)HYk9e^zETr0>S_lH`I0 z-byY&&h(994sfNsX$m+K%L*8QWp+gjs{xd#&>^({hVJ?{y{U|@-m=Z>-A*)Co(N#T z=;uoc@#`n+7ez?(J?TVxjXed-Q2#g|s`Q8~C}_YiuJT@s4==4gz=`<3td&{JAJTlA z&Az z&A*6;(jyI65ALHuqOq(YKR&`V)h7eP4^WLN`Zl4X#lRMG>ifIi&9HxX*SF|+{+En*d@Qf#lEfmFmE%Z4`aSO^o8ip2-5EiIYGY65$6Ft9yTVsy*Q^%&p#tOL31 zV%>R0DJvHQ+`+3`o|f`bJNsu_?s=Oh7a@tVnjb#etB&E@t`saEXd1rp@hPw5{>4}p zT(bO>#B^*QDD5fj9_&$jQF&`%b+I?cn$Q_iy0D59D zbP}F*)g~o1bsBB-@!((o;V}8l4{FhwuFIl| zzG~!!Te_bM+zp(S_FRmlL!X~R1ktX@7j6{-I=_M+o{(pj`SnAYjenr#9<;46`g(Bj zh9(>%bxyonn-=562-ie380z0pKVy*4zuad`8zBPX(9=2-KOB4v-7sA(80de{4*yH57OVf zHQCBgp;AR|I7L}&cv+e(>2Y65byIj}fu(lgsbhynxQ$Ju&YwFx%5P_v=b%{jamiEr zj9~88BjS#NTRHo)A}z0i2B%zkD&3tS-!l@BloCau?Al=w@%9lsoI=9C?{8;dRJ*ZV z1V(@M7X>s}Ne%g8h@O=@GMxHhss+s-sU%=0znDr`?iEpZiUa=b~OwJo}>Y(Ip!us6c_tL&pUz1V#AdrPu3*tOmqj*~0Rb1z{Q zGYM{Brk?|3u=U&X26vqzDHcT!0$6-~Z69voRlRHyNvpl(2&cL_LFmHT1`|1Fey}ow{ZhX?XJWY(6=MKAKl#!JM-OT1&{kvAT#v8`6H@g3N(_pTvX#-3j-PAiaL z;MrMlq%qR2uv6p0g*p`#cBMU0ukLv^Z>X}~$$n;;L7XVeI)0uDSRuB03o0eiy=4#{ z)|b7{mA7YPkKmTgJ9?-tn1+~~={Ll@uh#4rMT(~;Aky#UlJAknGzlU+o4}IY2%U+T z?eTn0Iy}tDuNt%d1x$+G%|I8dX%#m7snTv*V-uo*S6$>qK8)KdI53}Djadpl<2L=2 zKCLD&KhQ-`n_!dOdQ0nwnO<*I^TFuuv=%|irD&g?iQ-(svj5TdtzB1fsc}iyXs#wj zn1pR{DCayeM)UkRC09t7KQVJNQ;2;}It=4Qx6z8}wr;EqPFtP^X#en%P1TLuu4Zc5 z!XzPiuD!iOI@EgeK}l5{gxgsdbH%tEd7`-gk@0XD{Iz;>6Di{tE=Dm)phjt_A{clO z>KQW=@_2<=Gt{P29(|50&W(GY)8_NQzwOsLWi9R0H>ii&p9zx7JSPlk-MnSKe&#B) zGHEzvTO}h%XP#(m$1Q5Wd3v=Oqg-$Z$`9IK;v(QT6md;ZZ)(Ar{L7}yl_H@*ac!#$ z8F;)cY>}0TGimlylfViX0tB1s zVM+!lAr%7D%hv&gRwy5?b)5USdu7%SMQizypWf!7-Q6x3>f<(&mFv8)= zC^Y=lzbwJ!ey+=Uqf@h{sd-zT5xjf_quUCtDuSiRX2xD5^pyA5P}YQ^>9f@jfN5}rAPCboFbgjzXukif^_f9i zOA3d_^B$60{*tVm_uA;ok zjEaib2{Sz%nj8|Gw{Ju1W}CNRssM3@LnL^#!gEuojI-Z@Q-#V5V@^12fEKyR)Q+3m zgI&Dp1PTwfTV|8h2_jus5>EWD13)Nl31l_D((H0%5;ZCymhD}^uutp=kdL)-OLnm0 zibl|My62qXPFL&L_%GzQHAg0GRdarKNewN68J$=6qGhcJUHlBJ;Aku&)ayR<3caqN zY5c*e6%>PG%Iu44OW%kJKq%)d|I}2T36pjxz1fwS8!Bw4zDA7IPcAr%uDpvqF^~?op<`RfI_!|QfnAJs`zgbC&Wgjtt$gB~3BpDR z!mvf@oInj`6OSLJgIX_HzkPmFUMX^0&kZ4?WtXL#2ec}0xnaG_Njg$TRErO_ka-CsZA zqaCm7@ZH%9_e;t1=gRzNcUbI*syra2!L8~VG2^YUUl`j_&N}bpQFJCm<*cKSO-z{3 zzN1hK7l1N$=^M$6l1TyX z(uU<_*Wvrmrc#66=DBPw!$N{Qf?b%Ni7Tb$VD$b+dFRi67?-%?7=NTuszg@aWPOF= zU7BcMMw>b*v9~<#hNhHU9Q*!9kZaRteIJjfCNm7tp6O%j>Iz;aVeKU9cUy0CVf?w;;$Pl!eKSFfplrni!Pb6qlDK&xN@7eJt9d=C+Ffi*4NbwU6?L-|%*)fi#}TIXy9DO8e&g zU$)t9h~_|~(%;qn6p^MJ@@91rXI4;b;w|I)kp4wcOHJU?@9(aYy+Te8SQ9HpngyfW z-af22xfyNQfRQMQWBb$A0!!O^4en<4zlf_a>0B7+()8zcIQ1>+?=L3dEfH(sQG*{} zKn{bE=o;N~qO5$R4=>9&GPjyMxwtf)ND0sKf&2q^cHq(0na)Uhnl=MbJqzS=k1p=0 z?jPSO&TW^Gg;6CqMfzAeCXcU&uc_1JE>9kGOm-jw9br_L>eKi*elf zl09tk$z;gEkM6^StOpBu?v8+kyjNj(*e2lT7d=munq%8K0`!KQ*6F-e} z+TzbBpk`d=ir@PB;z<`C&e)c&kD0r=kb{86>O+n83FH4OE0d&|u%84}o1a{QntP_# zvgqD^Hj%BZ2<~Bu`iDNbmN;^)_XO5TO%bCRjnb5WoTQ9;m$(3-KMpPp*&~*!xLVkr z{ux;Iv1XK-Y+MD8FGgwlPc+k%DZA@qu($4v(2sA?$hV)}>cWZV))@c-f1d*W1a9!0 z-I4XGRN(6(8{`;i0H*z-YwL$z*Ym7?isg}CI(h$4+rkKX#TY;sDBZ_LtW6MOqhpke znmiJq1)+iVN$&1cqacrQeL;QE;%t2mJcK4~{Cs?;#p_zGPYnXApW_D$u~~4-Nz$H^ z#;+ShAm*CCp(lhqcVF)G|a|Deie67VHt5F+C z=;9wg$41B0I`@*Ieb1Z=%QkslgVM=y_P6HHU6%b1o2z}X!rYF262;2z&!&u}s^csl z|JE8ROX%bfBDX7UK7>FLytau~InI%6)|#pa!2+j<7Dgy2uK7lEhX*#qahbRKG7`Jc z0r#A9`0$*rywqL7>~chgn{kwD-;IGf^{*f4Vp*k9sBfyy*$zGFwQW3pL(QeDpUtDj z7DixpL<&-;P^^xBih1pX1T^=uOkd{@&}It7Wo|e=!#!@YtxMz4aii~_ zDtviJDoz`=pC(Q5M^ow+(;Pikye)RZS#7Bf@brZoSyU&?usx8GxJ-Fbj4>=g1^wT= ziGJhad+$X}cO*-~3lZmuYHCU=ni4+r@EANUc3z9P5HF9l zUs!5ov#pQ}`Z>+@;jPHKK9eYi@kVHNNa8+(WR=||gx3Lefs@9E#{^mVV<^nw-}YEo znM9G_KK%EdLwL{T@J*M+6I>o1Yr{07C^ygKhutz3Tl``y(l=2o(uFoNnk7EHwIem+ zmU*(|?g~kgb1VLM{vZMF?M3$JO`zerE16He;5@w_k%_Muc*$kR$mU0)}h;IjVGnjtE(^l{9G5%#_05r7Z7uKcUM=EfdTcL ziRGvNoWy-R*dOyX3>9MxeO8Kr!PgIwZC^iX|N6?qF2Q-EDdB~e7X%!K-wNAg8J>Cl z=Qm=o5xMHgr?13(~N#)ZGnmM%uQw$$^_0QDPWjt~-{}Aw-sONf3-|ySfWA zMs+Hhd@P&RS6Y&!k~Yhe#19dOxyYZ0fqJWgs=lw-4?Z)a?d(xA!LsybiKeW@r1FAW z5I@bHF;o&sf2}yzOr}SW+KtNjm5I!B$X*H(uu$YQU!nQkw8a zjz9f5c2B9KqpDMbu(2`Jk83~t+qn?)F7X>Z@cZ9&Z0O4jd0oX2KkOb~vB|>vi9DYQ zv$UDv_fMc&hG9ucT@B7pB}p`jntZvMVG4Lk4E2@DU?~+>=7v*7JK0eePVHtS64mBk zvLWQJ%tpT`P8PYQClnt;k0v})C@~S2Jp6fcB!Qb2A#J#ZiSh5~A!IW$| z!}iltfFoKWDJ=8D{}wJ$P0?L^M_QCge6t{Sn#N>13lbTM;gC!tayuL9=9cIX+(W$P zO5maE%QVS1#wRQHUV{e(~AKK+qNgFbV1%Hc?bp0S$m=rNx0Aqhvw&)aDRD58mv;vKTNGj}p zLx%0L)C&b8EpSgk3UZ8%zqrAZT@jPo$Web~$ic!gaw+)Vw@%4gWlU8cU!0h+L^P_8 z#5V;v|L+yk7sV#uKWP^_s(ly}B9W5jnb}PK_qqEjHatAh;R}W(k`B+&0H^Y+4Y2qo z{r?}>1)lsP?i%+3oPlp^0zIeAW{wye6GARfuP68`w+6}WVmT)n5sACgq_p^pQPGHK zH4hdBF9@PI7f|E=ic2wi#9ZbDJBj25l&|7U%ff=E_4M9|Z9`@D^&^2h${u?%K4<&n zY{q0W4K8|Knluwh712N3@{|s`d5&mQ0d^JbiVu3*iN~w73SdIGkrE-$EOJdKGP!PER)i`hza1GFN;|XgnyI;9rf_IDK$M2C6bf{ zcIKcUshh3rn5gXV=p?LtbNujv35X+N^?fd;t-=;BQmDs1lDBu`HC=&p6jSvsbMihEd<_M*i7clDoOsrnF!VA_GHSy;TWQ_ro@ zV4;0DtXE_$a`*+K%B2WAqXvNwge^%GX)SzY{R_%I*r)Je5K84+hXl&^-pu&%8|riq z!;Gl;D>(o&k-gXHW_yccdlK27ec4nhBE$JHxB9|N+mKnkF{QZu-I{CtHIPS?M;<7?Cg(5K9 z$JTI~TJs&`K-si7dUd1Du_#pF`6gYd6lRc#Lk`f+SE%6M4E`d%Rg8FaaDqe2*y2b3 z{JCvDEe7`RzyAXC^3D5);J0sK*@F39fU$7?hZ1LpH@~InvUrAH;)GOuPD|q-dp>drt zo`DTsy`B7kCfpAHUKx-q^SIx#wu~lBL7`D?5a7A>4a1LvzRPZSqE}`jX&HbsfzrS@ zT|*u+!T0IkJatULjvnhr{eYwjJF$yIU8RVr6-VU}^Qb>8^=$<#-I>d&=}#g#_u{jp zYXYPDGV_61WiBC3ooUZLVO;KpJ4gNc_Wo?li+-JprFg63ZgQRcwx`6FMtG|kxhe^p zI6fxcBwQO2i+ZvJ#tfSnk^WL-rOY|6X%mUdw9ym`{tJ`{4WGQjyOBudUd1AbZrT9q z#7UhjlS$oihPWu#I**x}OOr-AaX0|ukQsu$Ax*X6Q^f}#C_^bjnqp!ESz;gW-<>N#Tt0y9asIY-_pgY~4CPcq>BFix2*#AKCgNl>HO^*XTZ)pQ94$2|2OfxRypCW*iVNN1TFg~zp zeVPmR1#G~dK~qzv(9)H`w25614~ZfDJHe@&A=49)OnD&($W)e-Jchskf?whs zg|bG(%@aA;8*yh3P8&NnB(g7#vPQk7JmP10S$QK0WXLib1lu7z#qp76gaK*gtO>~* zyqG=m^9kI>an)POFgkfzoMU|jqzN)IcbKuUGJBl;VfgkT;$o^A zqMFHJg_xKKAEWCU@P*_AkNIf~9TAHG2$M@3SQt5DtTH6G34vi)|Kj=cIJWgF=&CqN>Y!RYC+zrqD~8B#l%t zpg@JVmo+)rwt!hwH_oE@#wHpfk;#Pc$ZX62ofWkOLG&D<(?UslV{=} z%LJni~DGe0f#^C|Czy5SRV^hm8YN@OPw8`**Pd!7yTGKfM|O z`V5)&4j;`eYmt(@3GCpu?>bY~?)~_NXSooGUA%3Y7(EhFa*R7RpSN4uVpqp!xajfO z*%OytkY!NZl2A0sgMiM|GIAA_k)N&wd_tenIBW~)95gFnjz2x(A`&wMv%v^D5!x? z1(%L|#s*y4F(vHeL!AYzd>$|4;DewYPH4icy%WD9N^xSYW}xt8QI_=;DbkdBdUgu~ z__88vIFK#;moSbwkTSb6D(9)FNLee`eaoX4Yg@0is;z(GCdm{}xB#d83t~)&EF8PC zMOX#mqM3-xmIpeFFY&|Gi9`yjTv)r*!U0P1_YZWm^viv$%I0fECnk)@XZA)j0`!9~ zp#a2HO&?(o>dxS53SN>Neh?x}(hnR~Edd8X%y2sXE4szHaL1$og!p)Zt;x?-fb}|U zr$_vF)%mz9UacLAa))RWxjjJ3Vi!{;$LgX<`=K;d4*y~F=QMh*%x|i@Z6$!pX2$!> zo1E>GHP|(xB|#>;9vlgwW86C1%>ZH`RD(1{lY5qtLm1JJyN6R=a4hv7Wh1`}=kjBc z2?6-u5ovc#6b;y-CdoO)N(?cXeo9S~B-P4=PWosjUbQQfx{qzRlOY#;%;kjiJk~?W z?HoWmPJ$$$vyn;K=uG`}`ghOF$*!roTX$w(L_5s+cwOg2914`2)12r2iV;JeUjvTv zzTp!u!mg@wiWk4eNs(P0DkSl60DO+u$fR5}x;8QTXE8@aAa0eB#R^kQ7ZdmBEZ908 z6G?}<00);$!lT+K6z#sMHWPLmr^kXexpAPsOycW`igTj2pZ0ifLvCleWrh{7rH7MC zW32hdH#80)3^}G5z&!mFye=Yb`;!(&cPY|V%jHzYj-#;OJbah-` z!9@O+BQ|jq=GPDT{9a+6kC;3!s3%Ay7CRmHros4yhx0(qMou;XbbGcA<@_B|dWOA0*Nb(c*po$R`NdTDV~yvNFxOpONzRr;AaOs(5X%6qt#a82pN_ z=Sl#IhD57f@qEg8K32#y9wU=Y3;$FET66?-@(sHDaHP+4@QNZc_hx@V9)t9py9K^M;S zA$bz<7Aj|f=?-wM6pN&ag(W($1$6*mhjx8<#X)2trHh?IaVGwvT*Bcl^ZrL9lF`$u zwnTuNK=i(nrSV5q3rm|Bi6Nt_i~sw<1V6ZZ8lzYc@QOW^4HDM$XlDklqb4Lt?~%z4 zoSCog@#fBCD#1fNvR}A~t{B&It=mw46erVOCA|UPA^Y(oK^!QU-8vIr+*~DXh+l5( zy8(h=lOHdMyIDn-mSRMPghk|kKU~HSdmn3)xbyG|(9qZ_mbk@+ss(0S9F>&=Z?#`6 zg+*6^l3_aK zO5D_w$tBMj9r5#`=_*F#Us*o!9!UXP&*_12hV^G!OSI?L!;hzi-6zW)P0W`kH$h2U z_xm{IlF7gKY74f{&%KN;QGn7mQ+T^@Ir`V2U@QH{1oxJk0VnyydvBt2fUjj>o5F?J z7K$ha9YUNRbuL=$2`Xu z49T>Yed1l8NQ%Rf>#|^^`=c{LUS1Om&QaZ2+mHqbJkiv<#91#FUAK5e7fb0E>`OO= zZ!)?S>{tp*!rW`Az8XiyLW@ICzB07jlm1Q`p7QB zktT^I$J^ZaRhcVRgp`yv6sbFNvD;{RI72Q=kg@=~9}?ot%qCs3IG#8@(kKR2fK1=R*~M!@5Zbh1YFdg!yB`1W*kr@^ zB{np(?(9LFb~+Byg4Px6|6*;YHChY;>8c5 zaj*i!`Y50Hy1t2GFjSsxd2ZX=>Abu=UMk`FaO_Vm8hOh=?c@e87eHD*WfC=zaV|4Q z=YAZQc$#2RWq4H%y=jOf!aifn%(&PlJXRe_pLQ@aq1NeQASMlxx2hq8)rU$sm-y{L zT1U0EbWwFbOyY28Jyj-p-4jejHnHN{32K$k4 z>}whfU1qy?BcF{O7g-oj90mO^Yb8mdh5DjuAxY)X5|M$md9sbbAGbz1`xCwouj`U` zo}T3c3`J=dFJT4}9jC;{C{cMe zj2T_bWlxhhNH;;M+c@86#34wWGbE#Bt1IIoShYKv5j(Q>KUTn>HFP`k510efAxKO; s$+wl#4x^MJYrlCwp}1bfF3$YRWMk~vUixcbbp!rmX=+0*Gxmu3KVi*HEdT%j literal 0 HcmV?d00001 diff --git a/test/integration/render/tests/terrain/pitched-world/style.json b/test/integration/render/tests/terrain/pitched-world/style.json new file mode 100644 index 0000000000..7eddbaec3e --- /dev/null +++ b/test/integration/render/tests/terrain/pitched-world/style.json @@ -0,0 +1,50 @@ +{ + "version": 8, + "metadata": { + "test": {}, + "description": "Tests that globe's terrain meshes with poles are not used under mercator projection." + }, + "sky": { + "atmosphere-blend": 0.0 + }, + "zoom": -2.5, + "pitch": 60, + "bearing": 45, + "terrain": { + "source": "terrain", + "exaggeration": 2 + }, + "sources": { + "terrain": { + "type": "raster-dem", + "tiles": ["local://tiles/{z}-{x}-{y}.terrain.png"], + "maxzoom": 15, + "tileSize": 256 + }, + "vector_tiles": { + "type": "vector", + "maxzoom": 0, + "tiles": [ + "local://tiles/{z}-{x}-{y}.mvt" + ] + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "land", + "type": "fill", + "source": "vector_tiles", + "source-layer": "water", + "paint": { + "fill-color": "blue" + } + } + ] +}