Webgl points / fix unit tests

This commit is contained in:
Olivier Guyot
2019-05-18 18:29:10 +02:00
parent 03e70bd10e
commit 698816030e
2 changed files with 27 additions and 12 deletions

View File

@@ -383,7 +383,7 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer {
const features = vectorSource.getFeatures(); const features = vectorSource.getFeatures();
const totalInstructionsCount = POINT_INSTRUCTIONS_COUNT * features.length; const totalInstructionsCount = POINT_INSTRUCTIONS_COUNT * features.length;
if (this.renderInstructions_.length !== totalInstructionsCount) { if (!this.renderInstructions_ || this.renderInstructions_.length !== totalInstructionsCount) {
this.renderInstructions_ = new Float32Array(totalInstructionsCount); this.renderInstructions_ = new Float32Array(totalInstructionsCount);
} }
@@ -427,6 +427,7 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer {
message['projectionTransform'] = projectionTransform; message['projectionTransform'] = projectionTransform;
this.worker_.postMessage(message, [this.renderInstructions_.buffer]); this.worker_.postMessage(message, [this.renderInstructions_.buffer]);
this.renderInstructions_ = null;
} }

View File

@@ -5,6 +5,7 @@ import VectorSource from '../../../../../src/ol/source/Vector.js';
import WebGLPointsLayerRenderer from '../../../../../src/ol/renderer/webgl/PointsLayer.js'; import WebGLPointsLayerRenderer from '../../../../../src/ol/renderer/webgl/PointsLayer.js';
import {get as getProjection} from '../../../../../src/ol/proj.js'; import {get as getProjection} from '../../../../../src/ol/proj.js';
import ViewHint from '../../../../../src/ol/ViewHint.js'; import ViewHint from '../../../../../src/ol/ViewHint.js';
import {POINT_VERTEX_STRIDE, WebGLWorkerMessageType} from '../../../../../src/ol/renderer/webgl/Layer.js';
describe('ol.renderer.webgl.PointsLayer', function() { describe('ol.renderer.webgl.PointsLayer', function() {
@@ -63,7 +64,7 @@ describe('ol.renderer.webgl.PointsLayer', function() {
expect(spy.called).to.be(true); expect(spy.called).to.be(true);
}); });
it('fills up a buffer with 2 triangles per point', function() { it('fills up a buffer with 2 triangles per point', function(done) {
layer.getSource().addFeature(new Feature({ layer.getSource().addFeature(new Feature({
geometry: new Point([10, 20]) geometry: new Point([10, 20])
})); }));
@@ -73,16 +74,23 @@ describe('ol.renderer.webgl.PointsLayer', function() {
renderer.prepareFrame(frameState); renderer.prepareFrame(frameState);
const attributePerVertex = POINT_VERTEX_STRIDE; const attributePerVertex = POINT_VERTEX_STRIDE;
expect(renderer.verticesBuffer_.getArray().length).to.eql(2 * 4 * attributePerVertex);
expect(renderer.indicesBuffer_.getArray().length).to.eql(2 * 6);
expect(renderer.verticesBuffer_.getArray()[0]).to.eql(10); renderer.worker_.addEventListener('message', function(event) {
expect(renderer.verticesBuffer_.getArray()[1]).to.eql(20); if (event.data.type !== WebGLWorkerMessageType.GENERATE_BUFFERS) {
expect(renderer.verticesBuffer_.getArray()[4 * attributePerVertex + 0]).to.eql(30); return;
expect(renderer.verticesBuffer_.getArray()[4 * attributePerVertex + 1]).to.eql(40); }
expect(renderer.verticesBuffer_.getArray().length).to.eql(2 * 4 * attributePerVertex);
expect(renderer.indicesBuffer_.getArray().length).to.eql(2 * 6);
expect(renderer.verticesBuffer_.getArray()[0]).to.eql(10);
expect(renderer.verticesBuffer_.getArray()[1]).to.eql(20);
expect(renderer.verticesBuffer_.getArray()[4 * attributePerVertex + 0]).to.eql(30);
expect(renderer.verticesBuffer_.getArray()[4 * attributePerVertex + 1]).to.eql(40);
done();
});
}); });
it('clears the buffers when the features are gone', function() { it('clears the buffers when the features are gone', function(done) {
const source = layer.getSource(); const source = layer.getSource();
source.addFeature(new Feature({ source.addFeature(new Feature({
geometry: new Point([10, 20]) geometry: new Point([10, 20])
@@ -93,9 +101,15 @@ describe('ol.renderer.webgl.PointsLayer', function() {
})); }));
renderer.prepareFrame(frameState); renderer.prepareFrame(frameState);
const attributePerVertex = 12; renderer.worker_.addEventListener('message', function(event) {
expect(renderer.verticesBuffer_.getArray().length).to.eql(4 * attributePerVertex); if (event.data.type !== WebGLWorkerMessageType.GENERATE_BUFFERS) {
expect(renderer.indicesBuffer_.getArray().length).to.eql(6); return;
}
const attributePerVertex = 12;
expect(renderer.verticesBuffer_.getArray().length).to.eql(4 * attributePerVertex);
expect(renderer.indicesBuffer_.getArray().length).to.eql(6);
done();
});
}); });
it('rebuilds the buffers only when not interacting or animating', function() { it('rebuilds the buffers only when not interacting or animating', function() {