Implement preRender and postRender methods for WebGLLayerRenderer
This is required so that Renderers like WebGLPointsLayerRenderer can fire prerender and postrender events. Problem described in [issue 11463](https://github.com/openlayers/openlayers/issues/11463).
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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_ = [];
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user