From e63bb45e6f9af550fb90643a6fd30f33d4cb16f4 Mon Sep 17 00:00:00 2001 From: Olivier Guyot Date: Fri, 25 Oct 2019 15:11:29 +0200 Subject: [PATCH] Webgl points layer / allow disabling hit detection Having hit detection enabled has an overhead as it means continously generating additional render instructions and rendering to an offscreen canvas --- examples/filter-points-webgl.js | 3 ++- examples/webgl-points-layer.js | 3 ++- src/ol/layer/WebGLPoints.js | 14 ++++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/examples/filter-points-webgl.js b/examples/filter-points-webgl.js index 3c36fc973a..fa09676c8b 100644 --- a/examples/filter-points-webgl.js +++ b/examples/filter-points-webgl.js @@ -122,7 +122,8 @@ const map = new Map({ }), new WebGLPointsLayer({ style: style, - source: vectorSource + source: vectorSource, + disableHitDetection: true }) ], target: document.getElementById('map'), diff --git a/examples/webgl-points-layer.js b/examples/webgl-points-layer.js index 73b023f469..ae04790a71 100644 --- a/examples/webgl-points-layer.js +++ b/examples/webgl-points-layer.js @@ -117,7 +117,8 @@ function refreshLayer(newStyle) { const previousLayer = pointsLayer; pointsLayer = new WebGLPointsLayer({ source: vectorSource, - style: newStyle + style: newStyle, + disableHitDetection: true }); map.addLayer(pointsLayer); diff --git a/src/ol/layer/WebGLPoints.js b/src/ol/layer/WebGLPoints.js index 7c9327e234..c3bdb80b10 100644 --- a/src/ol/layer/WebGLPoints.js +++ b/src/ol/layer/WebGLPoints.js @@ -24,6 +24,8 @@ import Layer from './Layer.js'; * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will * be visible. * @property {import("../source/Vector.js").default} [source] Source. + * @property {boolean} [disableHitDetection] Setting this to true will provide a slight performance boost, but will + * prevent all hit detection on the layer. */ @@ -75,6 +77,12 @@ class WebGLPointsLayer extends Layer { * @type {import('../webgl/ShaderBuilder.js').StyleParseResult} */ this.parseResult_ = parseLiteralStyle(options.style); + + /** + * @private + * @type {boolean} + */ + this.hitDetectionDisabled_ = !!options.disableHitDetection; } /** @@ -84,8 +92,10 @@ class WebGLPointsLayer extends Layer { return new WebGLPointsLayerRenderer(this, { vertexShader: this.parseResult_.builder.getSymbolVertexShader(), fragmentShader: this.parseResult_.builder.getSymbolFragmentShader(), - hitVertexShader: this.parseResult_.builder.getSymbolVertexShader(true), - hitFragmentShader: this.parseResult_.builder.getSymbolFragmentShader(true), + hitVertexShader: !this.hitDetectionDisabled_ && + this.parseResult_.builder.getSymbolVertexShader(true), + hitFragmentShader: !this.hitDetectionDisabled_ && + this.parseResult_.builder.getSymbolFragmentShader(true), uniforms: this.parseResult_.uniforms, attributes: this.parseResult_.attributes });