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)
|
* 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
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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_ = [];
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user