/** * @module ol/webgl/TileGeometry */ import MixedGeometryBatch from '../render/webgl/MixedGeometryBatch.js'; import { create as createTransform, translate as translateTransform, } from '../transform.js'; import {ARRAY_BUFFER, STATIC_DRAW} from '../webgl.js'; import BaseTileRepresentation from './BaseTileRepresentation.js'; import WebGLArrayBuffer from './Buffer.js'; /** * @typedef {import("../VectorRenderTile").default} TileType */ /** * @extends {BaseTileRepresentation} */ class TileGeometry extends BaseTileRepresentation { /** * @param {import("./BaseTileRepresentation.js").TileRepresentationOptions} options The tile texture options. * @param {Array} styleRenderers Array of vector style renderers */ constructor(options, styleRenderers) { super(options); /** * @private */ this.batch_ = new MixedGeometryBatch(); /** * @private */ this.styleRenderers_ = styleRenderers; /** * @type {Array} */ this.buffers = []; /** * Each geometry tile also has a mask which consisted of a quad (two triangles); this mask is intended to * be rendered to an offscreen buffer, and be used to correctly mask tiles according to their zoom level * during rendering */ this.maskVertices = new WebGLArrayBuffer(ARRAY_BUFFER, STATIC_DRAW); this.setTile(options.tile); } /** * @private */ generateMaskBuffer_() { const extent = this.tile.getSourceTiles()[0].extent; this.maskVertices.fromArray([ extent[0], extent[1], extent[2], extent[1], extent[2], extent[3], extent[0], extent[3], ]); this.helper.flushBufferData(this.maskVertices); } /** * @override */ uploadTile() { this.generateMaskBuffer_(); this.batch_.clear(); const sourceTiles = this.tile.getSourceTiles(); const features = sourceTiles.reduce( (accumulator, sourceTile) => accumulator.concat(sourceTile.getFeatures()), [], ); this.batch_.addFeatures(features); const tileOriginX = sourceTiles[0].extent[0]; const tileOriginY = sourceTiles[0].extent[1]; const transform = translateTransform( createTransform(), -tileOriginX, -tileOriginY, ); const generatePromises = this.styleRenderers_.map((renderer, i) => renderer.generateBuffers(this.batch_, transform).then((buffers) => { this.buffers[i] = buffers; }), ); Promise.all(generatePromises).then(() => { this.setReady(); }); } /** * @override */ disposeInternal() { this.buffers.forEach((buffers) => { this.disposeBuffers(buffers); }); super.disposeInternal(); } /** * Will release a set of Webgl buffers * @param {import('../render/webgl/VectorStyleRenderer.js').WebGLBuffers|null} buffers Buffers */ disposeBuffers(buffers) { if (!buffers) { return; } /** * @param {Array} typeBuffers Buffers */ const disposeBuffersOfType = (typeBuffers) => { for (const buffer of typeBuffers) { if (buffer) { this.helper.deleteBuffer(buffer); } } }; if (buffers.pointBuffers) { disposeBuffersOfType(buffers.pointBuffers); } if (buffers.lineStringBuffers) { disposeBuffersOfType(buffers.lineStringBuffers); } if (buffers.polygonBuffers) { disposeBuffersOfType(buffers.polygonBuffers); } } } export default TileGeometry;