From eb334ecb5bcedd6820fa96bfdd214ba6663596c0 Mon Sep 17 00:00:00 2001 From: Isaac Besora Vilardaga Date: Fri, 22 Nov 2024 17:12:34 +0100 Subject: [PATCH] Fix flickering on lines (#5094) * Fix * Add comment * Add test * Add changelog * Lint fix * Inline test data * Inline test data * Undo fix to make test fail * Update test expected image * Fix again * Rename function --- CHANGELOG.md | 1 + src/render/draw_fill.ts | 2 +- src/render/draw_hillshade.ts | 2 +- src/render/draw_line.ts | 10 ++- src/render/draw_raster.ts | 2 +- src/render/painter.ts | 5 +- .../render/tests/line-overlap/expected.png | Bin 0 -> 46388 bytes .../render/tests/line-overlap/style.json | 69 ++++++++++++++++++ 8 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 test/integration/render/tests/line-overlap/expected.png create mode 100644 test/integration/render/tests/line-overlap/style.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 248fc33a15..dce153dc6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - _...Add new stuff here..._ ### 🐞 Bug fixes +- Fixes line flickering problem ([#5094](https://github.com/maplibre/maplibre-gl-js/pull/5094)) - _...Add new stuff here..._ ## 5.0.0-pre.7 diff --git a/src/render/draw_fill.ts b/src/render/draw_fill.ts index 9cd030a49d..193d20a66b 100644 --- a/src/render/draw_fill.ts +++ b/src/render/draw_fill.ts @@ -131,7 +131,7 @@ function drawFillTiles( let stencil: StencilMode; if (painter.renderPass === 'translucent' && isRenderingToTexture) { - const [stencilModes] = painter.stencilConfigForOverlap(coords); + const [stencilModes] = painter.getStencilConfigForOverlapAndUpdateStencilID(coords); stencil = stencilModes[coord.overscaledZ]; } else { stencil = painter.stencilModeForClipping(coord); diff --git a/src/render/draw_hillshade.ts b/src/render/draw_hillshade.ts index 6f7395cbc2..89729ebc5b 100644 --- a/src/render/draw_hillshade.ts +++ b/src/render/draw_hillshade.ts @@ -38,7 +38,7 @@ export function drawHillshade(painter: Painter, sourceCache: SourceCache, layer: renderHillshade(painter, sourceCache, layer, coords, stencilBorders, depthMode, colorMode, true, isRenderingToTexture); // draw with borders } else { // Simple rendering - const [stencil, coords] = painter.stencilConfigForOverlap(tileIDs); + const [stencil, coords] = painter.getStencilConfigForOverlapAndUpdateStencilID(tileIDs); renderHillshade(painter, sourceCache, layer, coords, stencil, depthMode, colorMode, false, isRenderingToTexture); } } diff --git a/src/render/draw_line.ts b/src/render/draw_line.ts index ee30039ce7..02b1d8e011 100644 --- a/src/render/draw_line.ts +++ b/src/render/draw_line.ts @@ -16,6 +16,7 @@ import type {OverscaledTileID} from '../source/tile_id'; import {clamp, nextPowerOfTwo} from '../util/util'; import {renderColorRamp} from '../util/color_ramp'; import {EXTENT} from '../data/extent'; +import {StencilMode} from '../gl/stencil_mode'; export function drawLine(painter: Painter, sourceCache: SourceCache, layer: LineStyleLayer, coords: Array, renderOptions: RenderOptions) { if (painter.renderPass !== 'translucent') return; @@ -124,8 +125,13 @@ export function drawLine(painter: Painter, sourceCache: SourceCache, layer: Line gradientTexture.bind(layer.stepInterpolant ? gl.NEAREST : gl.LINEAR, gl.CLAMP_TO_EDGE); } - const [stencilModes] = painter.stencilConfigForOverlap(coords); - const stencil = isRenderingToTexture ? stencilModes[coord.overscaledZ] : painter.stencilModeForClipping(coord); + let stencil: StencilMode; + if (isRenderingToTexture) { + const [stencilModes] = painter.getStencilConfigForOverlapAndUpdateStencilID(coords); + stencil = stencilModes[coord.overscaledZ]; + } else { + stencil = painter.stencilModeForClipping(coord); + } program.draw(context, gl.TRIANGLES, depthMode, stencil, colorMode, CullFaceMode.disabled, uniformValues, terrainData, projectionData, diff --git a/src/render/draw_raster.ts b/src/render/draw_raster.ts index d8796f5df2..ec122153dc 100644 --- a/src/render/draw_raster.ts +++ b/src/render/draw_raster.ts @@ -56,7 +56,7 @@ export function drawRaster(painter: Painter, sourceCache: SourceCache, layer: Ra drawTiles(painter, sourceCache, layer, coords, stencilBorders, true, true, cornerCoords, false, isRenderingToTexture); // draw with borders } else { // Simple rendering - const [stencil, coords] = painter.stencilConfigForOverlap(tileIDs); + const [stencil, coords] = painter.getStencilConfigForOverlapAndUpdateStencilID(tileIDs); drawTiles(painter, sourceCache, layer, coords, stencil, false, true, cornerCoords, false, isRenderingToTexture); } } diff --git a/src/render/painter.ts b/src/render/painter.ts index 853375a14f..7fcc64a46b 100644 --- a/src/render/painter.ts +++ b/src/render/painter.ts @@ -377,9 +377,12 @@ export class Painter { * mask area of tile overlapped by children tiles. * Stencil ref values continue range used in _tileClippingMaskIDs. * + * Attention: This function changes this.nextStencilID even if the result of it + * is not used, which might cause problems when rendering due to invalid stencil + * values. * Returns [StencilMode for tile overscaleZ map, sortedCoords]. */ - stencilConfigForOverlap(tileIDs: Array): [{ + getStencilConfigForOverlapAndUpdateStencilID(tileIDs: Array): [{ [_: number]: Readonly; }, Array] { const gl = this.context.gl; diff --git a/test/integration/render/tests/line-overlap/expected.png b/test/integration/render/tests/line-overlap/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..e979ee7ae7fce7e047a2d83d9590acfc57171cc8 GIT binary patch literal 46388 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%0DrgIi-Q>1 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