ol
Version:
OpenLayers mapping library
129 lines (113 loc) • 3.27 kB
JavaScript
/**
* @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<TileType>}
*/
class TileGeometry extends BaseTileRepresentation {
/**
* @param {import("./BaseTileRepresentation.js").TileRepresentationOptions<TileType>} options The tile texture options.
* @param {import("../render/webgl/VectorStyleRenderer.js").default} styleRenderer Vector style renderer
*/
constructor(options, styleRenderer) {
super(options);
/**
* @private
*/
this.batch_ = new MixedGeometryBatch();
/**
* @private
*/
this.styleRenderer_ = styleRenderer;
/**
* @type {import("../render/webgl/VectorStyleRenderer.js").WebGLBuffers}
*/
this.buffers = null;
/**
* 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,
);
this.styleRenderer_
.generateBuffers(this.batch_, transform)
.then((buffers) => {
this.buffers = buffers;
this.setReady();
});
}
/**
* @override
*/
disposeInternal() {
if (this.buffers) {
/**
* @param {Array<WebGLArrayBuffer>} typeBuffers Buffers
*/
const disposeBuffersOfType = (typeBuffers) => {
for (const buffer of typeBuffers) {
if (buffer) {
this.helper.deleteBuffer(buffer);
}
}
};
this.buffers.pointBuffers &&
disposeBuffersOfType(this.buffers.pointBuffers);
this.buffers.lineStringBuffers &&
disposeBuffersOfType(this.buffers.lineStringBuffers);
this.buffers.polygonBuffers &&
disposeBuffersOfType(this.buffers.polygonBuffers);
}
super.disposeInternal();
}
}
export default TileGeometry;