WebGL points / rebuild buffers only when extent changed
This commit is contained in:
@@ -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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user