Webgl points / improve tests

Now testing with two features and adding a call to `prepareFrame`
without which the final render transform was off.
Also added a test with a pixelratio > 1.
This commit is contained in:
jahow
2019-07-07 21:03:47 +02:00
committed by Olivier Guyot
parent 7e3ed92ba6
commit a0ff08b734
+78 -34
View File
@@ -6,8 +6,20 @@ import WebGLPointsLayerRenderer from '../../../../../src/ol/renderer/webgl/Point
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'; import {POINT_VERTEX_STRIDE, WebGLWorkerMessageType} from '../../../../../src/ol/renderer/webgl/Layer.js';
import {create as createTransform, translate as translateTransform} from '../../../../../src/ol/transform.js'; import {create as createTransform, compose as composeTransform} from '../../../../../src/ol/transform.js';
const baseFrameState = {
viewHints: [],
viewState: {
projection: getProjection('EPSG:3857'),
resolution: 1,
rotation: 0,
center: [0, 0]
},
layerStatesArray: [{}],
layerIndex: 0,
pixelRatio: 1
};
describe('ol.renderer.webgl.PointsLayer', function() { describe('ol.renderer.webgl.PointsLayer', function() {
@@ -44,19 +56,10 @@ describe('ol.renderer.webgl.PointsLayer', function() {
source: new VectorSource() source: new VectorSource()
}); });
renderer = new WebGLPointsLayerRenderer(layer); renderer = new WebGLPointsLayerRenderer(layer);
const projection = getProjection('EPSG:3857'); frameState = Object.assign({
frameState = {
skippedFeatureUids: {},
viewHints: [],
viewState: {
projection: projection,
resolution: 1,
rotation: 0,
center: [0, 0]
},
size: [2, 2], size: [2, 2],
extent: [-100, -100, 100, 100] extent: [-100, -100, 100, 100]
}; }, baseFrameState);
}); });
it('calls WebGlHelper#prepareDraw', function() { it('calls WebGlHelper#prepareDraw', function() {
@@ -148,13 +151,14 @@ describe('ol.renderer.webgl.PointsLayer', function() {
}); });
describe('#forEachFeatureAtCoordinate', function() { describe('#forEachFeatureAtCoordinate', function() {
let layer, renderer, feature; let layer, renderer, feature, feature2;
beforeEach(function() { beforeEach(function() {
feature = new Feature(new Point([0, 0])); feature = new Feature({geometry: new Point([0, 0]), id: 1});
feature2 = new Feature({geometry: new Point([14, 14]), id: 2});
layer = new VectorLayer({ layer = new VectorLayer({
source: new VectorSource({ source: new VectorSource({
features: [feature] features: [feature, feature2]
}) })
}); });
renderer = new WebGLPointsLayerRenderer(layer, { renderer = new WebGLPointsLayerRenderer(layer, {
@@ -165,22 +169,12 @@ describe('ol.renderer.webgl.PointsLayer', function() {
}); });
it('correctly hit detects a feature', function(done) { it('correctly hit detects a feature', function(done) {
const transform = translateTransform(createTransform(), 20, 20); const transform = composeTransform(createTransform(), 20, 20, 1, -1, 0, 0, 0);
const projection = getProjection('EPSG:3857'); const frameState = Object.assign({
const frameState = {
viewState: {
projection: projection,
resolution: 1,
rotation: 0,
center: [0, 0]
},
layerStatesArray: [{}],
layerIndex: 0,
extent: [-20, -20, 20, 20], extent: [-20, -20, 20, 20],
size: [40, 40], size: [40, 40],
viewHints: [],
coordinateToPixelTransform: transform coordinateToPixelTransform: transform
}; }, baseFrameState);
let found; let found;
const cb = function(feature) { const cb = function(feature) {
found = feature; found = feature;
@@ -191,19 +185,69 @@ describe('ol.renderer.webgl.PointsLayer', function() {
if (!renderer.hitRenderInstructions_) { if (!renderer.hitRenderInstructions_) {
return; return;
} }
renderer.prepareFrame(frameState);
renderer.renderFrame(frameState); renderer.renderFrame(frameState);
function checkHit(x, y, expected) { function checkHit(x, y, expected) {
found = null; found = null;
renderer.forEachFeatureAtCoordinate([x, y], frameState, 0, cb, null); renderer.forEachFeatureAtCoordinate([x, y], frameState, 0, cb, null);
expect(found).to.be(expected ? feature : null); expect(found).to.be(expected);
} }
checkHit(0, 0, true); checkHit(0, 0, feature);
checkHit(1, -2, true); checkHit(1, -1, feature);
checkHit(-2, 1, true); checkHit(-2, 2, feature);
checkHit(2, 0, false); checkHit(2, 0, null);
checkHit(1, -3, false); checkHit(1, -3, null);
checkHit(14, 14, feature2);
checkHit(15, 13, feature2);
checkHit(12, 16, feature2);
checkHit(16, 14, null);
checkHit(13, 11, null);
done();
});
});
it('correctly hit detects with pixelratio != 1', function(done) {
const transform = composeTransform(createTransform(), 20, 20, 1, -1, 0, 0, 0);
const frameState = Object.assign({
pixelRatio: 3,
extent: [-20, -20, 20, 20],
size: [40, 40],
coordinateToPixelTransform: transform
}, baseFrameState);
let found;
const cb = function(feature) {
found = feature;
};
renderer.prepareFrame(frameState);
renderer.worker_.addEventListener('message', function() {
if (!renderer.hitRenderInstructions_) {
return;
}
renderer.prepareFrame(frameState);
renderer.renderFrame(frameState);
function checkHit(x, y, expected) {
found = null;
renderer.forEachFeatureAtCoordinate([x, y], frameState, 0, cb, null);
expect(found).to.be(expected);
}
checkHit(0, 0, feature);
checkHit(1, -1, feature);
checkHit(-2, 2, feature);
checkHit(2, 0, null);
checkHit(1, -3, null);
checkHit(14, 14, feature2);
checkHit(15, 13, feature2);
checkHit(12, 16, feature2);
checkHit(16, 14, null);
checkHit(13, 11, null);
done(); done();
}); });