Skip to content

Commit a1078db

Browse files
authored
fix: fix terrain tile mask clearing (#2778)
1 parent d803506 commit a1078db

File tree

4 files changed

+21
-15
lines changed

4 files changed

+21
-15
lines changed

packages/gl/src/layer/terrain/TerrainLayerRenderer.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -365,19 +365,13 @@ class TerrainLayerRenderer extends MaskRendererMixin(TileLayerRendererable(Layer
365365
const { info, image } = terrainTiles[i];
366366
this._prepareMask(info, image);
367367
this._debugTile(info, 'renderChildTerrainSkin');
368-
let cleared = false;
369368
if (this._prepareChildTerrainSkin(skinIndex, info, image, skinImagesToDel)) {
370369
const skinImages = image.skinImages[skinIndex];
371370
for (let j = 0; j < skinImages.length; j++) {
372371
const tileId = skinImages[j].tile.info.id;
373372

374373
// 检查是否存在重复的瓦片,重复的瓦片只需要绘制一次
375374
if (!visitedSkinTiles.has(tileId)) {
376-
if (!cleared && skinImages[j].layer.hasTerrainMask) {
377-
//FIXME 潜在bug: 如果skinLayers中有多个 hasTerrainMask 的图层,其中一个clearMask并更新mask后,其他的terrainMask图层并没有更新mask
378-
this._clearMask(image.mask);
379-
cleared = true;
380-
}
381375
skinImages[j].terrainMaskFBO = image.mask;
382376
layerSkinImages.push(skinImages[j]);
383377
visitedSkinTiles.add(tileId);
@@ -749,6 +743,17 @@ class TerrainLayerRenderer extends MaskRendererMixin(TileLayerRendererable(Layer
749743
const texture = regl.framebuffer(fboInfo)
750744
texture.colorTex = color;
751745
this._clearMask(texture);
746+
texture.clearTerrainMask = () => {
747+
if (!texture._timestamp) {
748+
texture._timestamp = 0;
749+
}
750+
const timestamp = this.getFrameTimestamp();
751+
if (timestamp > texture._timestamp) {
752+
TERRAIN_MASK_CLEAR.framebuffer = texture;
753+
regl.clear(TERRAIN_MASK_CLEAR);
754+
texture._timestamp = timestamp;
755+
}
756+
}
752757
// 单独创建的 color 必须要手动destroy回收,光destroy framebuffer,color是不会销毁的
753758
return texture;
754759
}

packages/vt/src/layer/layer/VectorTileLayer.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ class VectorTileLayer extends maptalks.TileLayer {
111111
VERSION: string;
112112
ready: boolean;
113113
isVectorTileLayer: boolean = true;
114-
hasTerrainMask: boolean = true;
115114

116115
//@internal
117116
_polygonOffset: number;

packages/vt/src/layer/plugins/PainterPlugin.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ function createPainterPlugin(type, Painter) {
273273
sr = layer.getSpatialReference ? layer.getSpatialReference() : map.getSpatialReference(),
274274
tileResolution = sr.getResolution(tileInfo.z),
275275
tileRatio = context.tileExtent / layer.getTileSize().width;
276+
geometry.properties.tile = tileInfo;
276277
geometry.properties.tileResolution = tileResolution;
277278
geometry.properties.tileRatio = tileRatio;
278279
geometry.properties.z = tileInfo.z;

packages/vt/src/layer/renderer/VectorTileLayerRenderer.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,8 +1514,10 @@ class VectorTileLayerRenderer extends CanvasCompatible(TileLayerRendererable(Lay
15141514
isRenderingTerrain,
15151515
isRenderingTerrainSkin: null,
15161516
renderTarget: null
1517+
};
1518+
if (isRenderingTerrain && parentContext && parentContext.terrainMaskFBO) {
1519+
parentContext.terrainMaskFBO.clearTerrainMask();
15171520
}
1518-
15191521
for (let i = 0, len = plugins.length; i < len; i++) {
15201522
const plugin = plugins[i];
15211523
const idx = i;
@@ -1546,15 +1548,14 @@ class VectorTileLayerRenderer extends CanvasCompatible(TileLayerRendererable(Lay
15461548
}
15471549
const isRenderingTerrainSkin = isRenderingTerrain && terrainSkinFilter(plugin);
15481550

1549-
renderContext.sceneConfig = null;
1550-
renderContext.pluginIndex = null;
1551-
renderContext.tileData = null;
1552-
renderContext.tileCache = null;
1553-
renderContext.tileTransform = null;
1554-
renderContext.isRenderingTerrainSkin = null;
1551+
// renderContext.sceneConfig = null;
1552+
// renderContext.pluginIndex = null;
1553+
// renderContext.tileData = null;
1554+
// renderContext.tileCache = null;
1555+
// renderContext.tileTransform = null;
1556+
// renderContext.isRenderingTerrainSkin = null;
15551557
renderContext.renderTarget = null;
15561558

1557-
15581559
renderContext.sceneConfig = plugin.config.sceneConfig;
15591560
renderContext.pluginIndex = idx;
15601561
renderContext.tileCache = tileCache[idx];

0 commit comments

Comments
 (0)