diff --git a/src/ol/render/Event.js b/src/ol/render/Event.js index dcfe5027e9..7f20aac9a2 100644 --- a/src/ol/render/Event.js +++ b/src/ol/render/Event.js @@ -17,7 +17,7 @@ class RenderEvent extends Event { /** * Transform from CSS pixels (relative to the top-left corner of the map viewport) - * to rendered pixels on this event's `context`. + * to rendered pixels on this event's `context`. Only available when a Canvas renderer is used, null otherwise. * @type {import("../transform.js").Transform|undefined} * @api */ diff --git a/src/ol/renderer/webgl/Layer.js b/src/ol/renderer/webgl/Layer.js index 9f3f008201..681b5be65d 100644 --- a/src/ol/renderer/webgl/Layer.js +++ b/src/ol/renderer/webgl/Layer.js @@ -2,6 +2,8 @@ * @module ol/renderer/webgl/Layer */ import LayerRenderer from '../Layer.js'; +import RenderEvent from '../../render/Event.js'; +import RenderEventType from '../../render/EventType.js'; import WebGLHelper from '../../webgl/Helper.js'; /** @@ -81,6 +83,36 @@ class WebGLLayerRenderer extends LayerRenderer { getShaderCompileErrors() { return this.helper.getShaderCompileErrors(); } + + /** + * @param {import("../../render/EventType.js").default} type Event type. + * @param {import("../../PluggableMap.js").FrameState} frameState Frame state. + * @private + */ + dispatchRenderEvent_(type, frameState) { + const layer = this.getLayer(); + if (layer.hasListener(type)) { + // RenderEvent does not get a context or an inversePixelTransform, because WebGL allows much less direct editing than Canvas2d does. + const event = new RenderEvent(type, null, frameState, null); + layer.dispatchEvent(event); + } + } + + /** + * @param {import("../../PluggableMap.js").FrameState} frameState Frame state. + * @protected + */ + preRender(frameState) { + this.dispatchRenderEvent_(RenderEventType.PRERENDER, frameState); + } + + /** + * @param {import("../../PluggableMap.js").FrameState} frameState Frame state. + * @protected + */ + postRender(frameState) { + this.dispatchRenderEvent_(RenderEventType.POSTRENDER, frameState); + } } const tmpArray_ = []; diff --git a/src/ol/renderer/webgl/PointsLayer.js b/src/ol/renderer/webgl/PointsLayer.js index a756fbb02e..7a16d585d6 100644 --- a/src/ol/renderer/webgl/PointsLayer.js +++ b/src/ol/renderer/webgl/PointsLayer.js @@ -409,6 +409,8 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer { * @return {HTMLElement} The rendered element. */ renderFrame(frameState) { + this.preRender(frameState); + const renderCount = this.indicesBuffer_.getSize(); this.helper.drawElements(0, renderCount); this.helper.finalizeDraw(frameState); @@ -425,6 +427,8 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer { this.hitRenderTarget_.clearCachedData(); } + this.postRender(frameState); + return canvas; }