diff --git a/src/ol/renderer/webgl/PointsLayer.js b/src/ol/renderer/webgl/PointsLayer.js index d4525cd9f3..02fb4eb1dc 100644 --- a/src/ol/renderer/webgl/PointsLayer.js +++ b/src/ol/renderer/webgl/PointsLayer.js @@ -9,6 +9,7 @@ import WebGLLayerRenderer, {getBlankTexture, pushFeatureInBuffer} from './Layer' import GeoJSON from '../../format/GeoJSON'; import {getUid} from '../../util'; import ViewHint from '../../ViewHint'; +import {createEmpty, equals} from '../../extent'; const VERTEX_SHADER = ` precision mediump float; @@ -240,6 +241,8 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer { * @private */ this.geojsonFeatureCache_ = {}; + + this.previousExtent_ = createEmpty(); } /** @@ -288,8 +291,10 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer { vectorSource.loadFeatures([-Infinity, -Infinity, Infinity, Infinity], resolution, projection); } - if (!frameState.viewHints[ViewHint.ANIMATING] && !frameState.viewHints[ViewHint.INTERACTING]) { + if (!frameState.viewHints[ViewHint.ANIMATING] && !frameState.viewHints[ViewHint.INTERACTING] && + !equals(this.previousExtent_, frameState.extent)) { this.rebuildBuffers_(frameState); + this.previousExtent_ = frameState.extent.slice(); } // write new data diff --git a/test/spec/ol/renderer/webgl/pointslayer.test.js b/test/spec/ol/renderer/webgl/pointslayer.test.js index a54339d228..367fd2696f 100644 --- a/test/spec/ol/renderer/webgl/pointslayer.test.js +++ b/test/spec/ol/renderer/webgl/pointslayer.test.js @@ -107,6 +107,7 @@ describe('ol.renderer.webgl.PointsLayer', function() { it('rebuilds the buffers only when not interacting or animating', function() { const spy = sinon.spy(renderer, 'rebuildBuffers_'); + frameState.viewHints[ViewHint.INTERACTING] = 1; frameState.viewHints[ViewHint.ANIMATING] = 0; renderer.prepareFrame(frameState); @@ -123,6 +124,19 @@ describe('ol.renderer.webgl.PointsLayer', function() { expect(spy.called).to.be(true); }); + it('rebuilds the buffers only when the frame extent changed', function() { + const spy = sinon.spy(renderer, 'rebuildBuffers_'); + + renderer.prepareFrame(frameState); + expect(spy.callCount).to.be(1); + + renderer.prepareFrame(frameState); + expect(spy.callCount).to.be(1); + + frameState.extent = [10, 20, 30, 40]; + renderer.prepareFrame(frameState); + expect(spy.callCount).to.be(2); + }); }); });