WebGL points / rebuild buffers only when extent changed

This commit is contained in:
Olivier Guyot
2019-05-14 15:18:42 +02:00
parent 523097903a
commit 75eb62363a
2 changed files with 20 additions and 1 deletions
+6 -1
View File
@@ -9,6 +9,7 @@ import WebGLLayerRenderer, {getBlankTexture, pushFeatureInBuffer} from './Layer'
import GeoJSON from '../../format/GeoJSON'; import GeoJSON from '../../format/GeoJSON';
import {getUid} from '../../util'; import {getUid} from '../../util';
import ViewHint from '../../ViewHint'; import ViewHint from '../../ViewHint';
import {createEmpty, equals} from '../../extent';
const VERTEX_SHADER = ` const VERTEX_SHADER = `
precision mediump float; precision mediump float;
@@ -240,6 +241,8 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer {
* @private * @private
*/ */
this.geojsonFeatureCache_ = {}; this.geojsonFeatureCache_ = {};
this.previousExtent_ = createEmpty();
} }
/** /**
@@ -288,8 +291,10 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer {
vectorSource.loadFeatures([-Infinity, -Infinity, Infinity, Infinity], resolution, projection); 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.rebuildBuffers_(frameState);
this.previousExtent_ = frameState.extent.slice();
} }
// write new data // write new data
@@ -107,6 +107,7 @@ describe('ol.renderer.webgl.PointsLayer', function() {
it('rebuilds the buffers only when not interacting or animating', function() { it('rebuilds the buffers only when not interacting or animating', function() {
const spy = sinon.spy(renderer, 'rebuildBuffers_'); const spy = sinon.spy(renderer, 'rebuildBuffers_');
frameState.viewHints[ViewHint.INTERACTING] = 1; frameState.viewHints[ViewHint.INTERACTING] = 1;
frameState.viewHints[ViewHint.ANIMATING] = 0; frameState.viewHints[ViewHint.ANIMATING] = 0;
renderer.prepareFrame(frameState); renderer.prepareFrame(frameState);
@@ -123,6 +124,19 @@ describe('ol.renderer.webgl.PointsLayer', function() {
expect(spy.called).to.be(true); 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);
});
}); });
}); });