Merge pull request #13212 from ahocevar/multisource-webgl
Support multiple sources for WebGL tile layers
This commit is contained in:
@@ -110,15 +110,17 @@ class CompositeMapRenderer extends MapRenderer {
|
||||
for (let i = 0, ii = layerStatesArray.length; i < ii; ++i) {
|
||||
const layerState = layerStatesArray[i];
|
||||
frameState.layerIndex = i;
|
||||
|
||||
const layer = layerState.layer;
|
||||
const sourceState = layer.getSourceState();
|
||||
if (
|
||||
!inView(layerState, viewState) ||
|
||||
(layerState.sourceState != SourceState.READY &&
|
||||
layerState.sourceState != SourceState.UNDEFINED)
|
||||
(sourceState != SourceState.READY &&
|
||||
sourceState != SourceState.UNDEFINED)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const layer = layerState.layer;
|
||||
const element = layer.render(frameState, previousElement);
|
||||
if (!element) {
|
||||
continue;
|
||||
|
||||
@@ -161,7 +161,7 @@ class WebGLLayerRenderer extends LayerRenderer {
|
||||
* @return {boolean} Layer is ready to be rendered.
|
||||
*/
|
||||
prepareFrame(frameState) {
|
||||
if (this.getLayer().getSource()) {
|
||||
if (this.getLayer().getRenderSource()) {
|
||||
let incrementGroup = true;
|
||||
let groupNumber = -1;
|
||||
let className;
|
||||
|
||||
@@ -20,7 +20,6 @@ import {
|
||||
} from '../../vec/mat4.js';
|
||||
import {
|
||||
createOrUpdate as createTileCoord,
|
||||
getKeyZXY,
|
||||
getKey as getTileCoordKey,
|
||||
} from '../../tilecoord.js';
|
||||
import {fromUserExtent} from '../../proj.js';
|
||||
@@ -98,7 +97,7 @@ function getRenderExtent(frameState, extent) {
|
||||
);
|
||||
}
|
||||
const source =
|
||||
/** {import("../../source/Tile.js").default} */ layerState.layer.getSource();
|
||||
/** {import("../../source/Tile.js").default} */ layerState.layer.getRenderSource();
|
||||
if (!source.getWrapX()) {
|
||||
const gridExtent = source
|
||||
.getTileGridForProjection(frameState.viewState.projection)
|
||||
@@ -110,6 +109,10 @@ function getRenderExtent(frameState, extent) {
|
||||
return extent;
|
||||
}
|
||||
|
||||
function getCacheKey(source, tileCoord) {
|
||||
return `${source.getKey()},${getTileCoordKey(tileCoord)}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef {Object} Options
|
||||
* @property {string} vertexShader Vertex shader source.
|
||||
@@ -140,6 +143,12 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
uniforms: options.uniforms,
|
||||
});
|
||||
|
||||
/**
|
||||
* The last call to `renderFrame` was completed with all tiles loaded
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.renderComplete = false;
|
||||
|
||||
/**
|
||||
* This transform converts tile i, j coordinates to screen coordinates.
|
||||
* @type {import("../../transform.js").Transform}
|
||||
@@ -273,7 +282,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
*/
|
||||
prepareFrameInternal(frameState) {
|
||||
const layer = this.getLayer();
|
||||
const source = layer.getSource();
|
||||
const source = layer.getRenderSource();
|
||||
if (!source) {
|
||||
return false;
|
||||
}
|
||||
@@ -293,7 +302,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
enqueueTiles(frameState, extent, z, tileTexturesByZ) {
|
||||
const viewState = frameState.viewState;
|
||||
const tileLayer = this.getLayer();
|
||||
const tileSource = tileLayer.getSource();
|
||||
const tileSource = tileLayer.getRenderSource();
|
||||
const tileGrid = tileSource.getTileGridForProjection(viewState.projection);
|
||||
const tileTextureCache = this.tileTextureCache_;
|
||||
const tileRange = tileGrid.getTileRangeForExtentAndZ(
|
||||
@@ -314,7 +323,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
for (let x = tileRange.minX; x <= tileRange.maxX; ++x) {
|
||||
for (let y = tileRange.minY; y <= tileRange.maxY; ++y) {
|
||||
const tileCoord = createTileCoord(z, x, y, this.tempTileCoord_);
|
||||
const tileCoordKey = getTileCoordKey(tileCoord);
|
||||
const cacheKey = getCacheKey(tileSource, tileCoord);
|
||||
|
||||
/**
|
||||
* @type {TileTexture}
|
||||
@@ -326,8 +335,8 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
*/
|
||||
let tile;
|
||||
|
||||
if (tileTextureCache.containsKey(tileCoordKey)) {
|
||||
tileTexture = tileTextureCache.get(tileCoordKey);
|
||||
if (tileTextureCache.containsKey(cacheKey)) {
|
||||
tileTexture = tileTextureCache.get(cacheKey);
|
||||
tile = tileTexture.tile;
|
||||
}
|
||||
if (!tileTexture || tileTexture.tile.key !== tileSource.getKey()) {
|
||||
@@ -340,7 +349,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
);
|
||||
if (!tileTexture) {
|
||||
tileTexture = new TileTexture(tile, tileGrid, this.helper);
|
||||
tileTextureCache.set(tileCoordKey, tileTexture);
|
||||
tileTextureCache.set(cacheKey, tileTexture);
|
||||
} else {
|
||||
if (this.isDrawableTile_(tile)) {
|
||||
tileTexture.setTile(tile);
|
||||
@@ -379,12 +388,13 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
* @return {HTMLElement} The rendered element.
|
||||
*/
|
||||
renderFrame(frameState) {
|
||||
this.renderComplete = true;
|
||||
const gl = this.helper.getGL();
|
||||
this.preRender(gl, frameState);
|
||||
|
||||
const viewState = frameState.viewState;
|
||||
const tileLayer = this.getLayer();
|
||||
const tileSource = tileLayer.getSource();
|
||||
const tileSource = tileLayer.getRenderSource();
|
||||
const tileGrid = tileSource.getTileGridForProjection(viewState.projection);
|
||||
const extent = getRenderExtent(frameState, frameState.extent);
|
||||
const z = tileGrid.getZForResolution(
|
||||
@@ -438,6 +448,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
const tileCoordKey = getTileCoordKey(tileCoord);
|
||||
alphaLookup[tileCoordKey] = alpha;
|
||||
}
|
||||
this.renderComplete = false;
|
||||
|
||||
// first look for child tiles (at z + 1)
|
||||
const coveredByChildren = this.findAltTiles_(
|
||||
@@ -635,9 +646,10 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
|
||||
|
||||
let covered = true;
|
||||
const tileTextureCache = this.tileTextureCache_;
|
||||
const source = this.getLayer().getRenderSource();
|
||||
for (let x = tileRange.minX; x <= tileRange.maxX; ++x) {
|
||||
for (let y = tileRange.minY; y <= tileRange.maxY; ++y) {
|
||||
const cacheKey = getKeyZXY(altZ, x, y);
|
||||
const cacheKey = getCacheKey(source, [altZ, x, y]);
|
||||
let loaded = false;
|
||||
if (tileTextureCache.containsKey(cacheKey)) {
|
||||
const tileTexture = tileTextureCache.get(cacheKey);
|
||||
|
||||
Reference in New Issue
Block a user