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:
Langbein, Michael
2020-08-30 13:17:16 +02:00
parent 17a5015750
commit a70ce2ca06
3 changed files with 37 additions and 1 deletions

View File

@@ -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
*/

View File

@@ -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_ = [];

View File

@@ -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;
}