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
+1 -1
View File
@@ -17,7 +17,7 @@ class RenderEvent extends Event {
/** /**
* Transform from CSS pixels (relative to the top-left corner of the map viewport) * 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} * @type {import("../transform.js").Transform|undefined}
* @api * @api
*/ */
+32
View File
@@ -2,6 +2,8 @@
* @module ol/renderer/webgl/Layer * @module ol/renderer/webgl/Layer
*/ */
import LayerRenderer from '../Layer.js'; import LayerRenderer from '../Layer.js';
import RenderEvent from '../../render/Event.js';
import RenderEventType from '../../render/EventType.js';
import WebGLHelper from '../../webgl/Helper.js'; import WebGLHelper from '../../webgl/Helper.js';
/** /**
@@ -81,6 +83,36 @@ class WebGLLayerRenderer extends LayerRenderer {
getShaderCompileErrors() { getShaderCompileErrors() {
return this.helper.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_ = []; const tmpArray_ = [];
+4
View File
@@ -409,6 +409,8 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer {
* @return {HTMLElement} The rendered element. * @return {HTMLElement} The rendered element.
*/ */
renderFrame(frameState) { renderFrame(frameState) {
this.preRender(frameState);
const renderCount = this.indicesBuffer_.getSize(); const renderCount = this.indicesBuffer_.getSize();
this.helper.drawElements(0, renderCount); this.helper.drawElements(0, renderCount);
this.helper.finalizeDraw(frameState); this.helper.finalizeDraw(frameState);
@@ -425,6 +427,8 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer {
this.hitRenderTarget_.clearCachedData(); this.hitRenderTarget_.clearCachedData();
} }
this.postRender(frameState);
return canvas; return canvas;
} }