diff --git a/CHANGELOG.md b/CHANGELOG.md index 27436f963..e83f6b6e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ ### 🐞 Bug fixes - *...Add new stuff here...* +- [core] Fix `ImageSource` not rendering across world copies ([#4508](https://github.com/maplibre/maplibre-native/issues/4508)). - [core] Repaint data-driven symbol paint properties after feature-state updates. - [core] Accept alpha values in legacy comma-separated `hsl()` colors ([#4434](https://github.com/maplibre/maplibre-native/issues/4434)). - [core] Fix thread-unsafe headless OpenGL display singleton initialization [#4332](https://github.com/maplibre/maplibre-native/pull/4332) diff --git a/metrics/cache-style.db b/metrics/cache-style.db index 681f0d9ce..71a5adc28 100644 Binary files a/metrics/cache-style.db and b/metrics/cache-style.db differ diff --git a/metrics/integration/image/world-wrap.png b/metrics/integration/image/world-wrap.png new file mode 100644 index 000000000..1586b0ecb Binary files /dev/null and b/metrics/integration/image/world-wrap.png differ diff --git a/metrics/integration/render-tests/image/world-wrap/expected.png b/metrics/integration/render-tests/image/world-wrap/expected.png new file mode 100644 index 000000000..b8b06cbfc Binary files /dev/null and b/metrics/integration/render-tests/image/world-wrap/expected.png differ diff --git a/metrics/integration/render-tests/image/world-wrap/style.json b/metrics/integration/render-tests/image/world-wrap/style.json new file mode 100644 index 000000000..282dd6edb --- /dev/null +++ b/metrics/integration/render-tests/image/world-wrap/style.json @@ -0,0 +1,56 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 256, + "height": 128 + } + }, + "center": [ + 180, + 0 + ], + "zoom": 1, + "sources": { + "image": { + "type": "image", + "coordinates": [ + [ + -180, + 85.05112878 + ], + [ + 180, + 85.05112878 + ], + [ + 180, + -85.05112878 + ], + [ + -180, + -85.05112878 + ] + ], + "url": "local://image/world-wrap.png" + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#ff00ff" + } + }, + { + "id": "image", + "type": "raster", + "source": "image", + "paint": { + "raster-fade-duration": 0, + "raster-resampling": "nearest" + } + } + ] +} diff --git a/src/mln/renderer/sources/render_image_source.cpp b/src/mln/renderer/sources/render_image_source.cpp index 83986c4a1..f25a0422b 100644 --- a/src/mln/renderer/sources/render_image_source.cpp +++ b/src/mln/renderer/sources/render_image_source.cpp @@ -13,6 +13,8 @@ #include #include +#include + namespace mln { using namespace style; @@ -142,15 +144,15 @@ void RenderImageSource::update(Immutable baseImpl_, static_cast(transformState.getZoom()), zoomRange); for (auto tile : idealTiles) { - if (tile.wrap != 0 && tileCover[0].canonical.isChildOf(tile.canonical)) { - tileIds.emplace_back(tile.wrap, tileCover[0].canonical); - hasVisibleTile = true; - } else if (!hasVisibleTile) { - for (auto coveringTile : tileCover) { - if (coveringTile.canonical == tile.canonical || coveringTile.canonical.isChildOf(tile.canonical) || - tile.canonical.isChildOf(coveringTile.canonical)) { - hasVisibleTile = true; + for (auto coveringTile : tileCover) { + if (coveringTile.canonical == tile.canonical || coveringTile.canonical.isChildOf(tile.canonical) || + tile.canonical.isChildOf(coveringTile.canonical)) { + hasVisibleTile = true; + const UnwrappedTileID wrappedTileID(tile.wrap, tileCover[0].canonical); + if (tile.wrap != 0 && std::find(tileIds.cbegin(), tileIds.cend(), wrappedTileID) == tileIds.cend()) { + tileIds.push_back(wrappedTileID); } + break; } } }