Allow WebGL tile layers to be constructed without a source
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
* @module ol/layer/WebGLTile
|
* @module ol/layer/WebGLTile
|
||||||
*/
|
*/
|
||||||
import BaseTileLayer from './BaseTile.js';
|
import BaseTileLayer from './BaseTile.js';
|
||||||
|
import LayerProperty from '../layer/Property.js';
|
||||||
import WebGLTileLayerRenderer, {
|
import WebGLTileLayerRenderer, {
|
||||||
Attributes,
|
Attributes,
|
||||||
Uniforms,
|
Uniforms,
|
||||||
@@ -298,14 +299,28 @@ class WebGLTileLayer extends BaseTileLayer {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
this.styleVariables_ = this.style_.variables || {};
|
this.styleVariables_ = this.style_.variables || {};
|
||||||
|
|
||||||
|
this.addChangeListener(LayerProperty.SOURCE, this.handleSourceUpdate_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
handleSourceUpdate_() {
|
||||||
|
this.setStyle(this.style_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @return {number} The number of source bands.
|
||||||
|
*/
|
||||||
|
getSourceBandCount_() {
|
||||||
|
const source = this.getSource();
|
||||||
|
return source && 'bandCount' in source ? source.bandCount : 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
createRenderer() {
|
createRenderer() {
|
||||||
const source = this.getSource();
|
const parsedStyle = parseStyle(this.style_, this.getSourceBandCount_());
|
||||||
const parsedStyle = parseStyle(
|
|
||||||
this.style_,
|
|
||||||
'bandCount' in source ? source.bandCount : 4
|
|
||||||
);
|
|
||||||
|
|
||||||
return new WebGLTileLayerRenderer(this, {
|
return new WebGLTileLayerRenderer(this, {
|
||||||
vertexShader: parsedStyle.vertexShader,
|
vertexShader: parsedStyle.vertexShader,
|
||||||
@@ -323,11 +338,7 @@ class WebGLTileLayer extends BaseTileLayer {
|
|||||||
*/
|
*/
|
||||||
setStyle(style) {
|
setStyle(style) {
|
||||||
this.style_ = style;
|
this.style_ = style;
|
||||||
const source = this.getSource();
|
const parsedStyle = parseStyle(this.style_, this.getSourceBandCount_());
|
||||||
const parsedStyle = parseStyle(
|
|
||||||
this.style_,
|
|
||||||
'bandCount' in source ? source.bandCount : 4
|
|
||||||
);
|
|
||||||
const renderer = this.getRenderer();
|
const renderer = this.getRenderer();
|
||||||
renderer.reset({
|
renderer.reset({
|
||||||
vertexShader: parsedStyle.vertexShader,
|
vertexShader: parsedStyle.vertexShader,
|
||||||
|
|||||||
@@ -339,4 +339,38 @@ describe('ol/layer/WebGLTile', function () {
|
|||||||
}
|
}
|
||||||
expect(incorrectStyle).to.throwException(); // missing 'blue' in styleVariables
|
expect(incorrectStyle).to.throwException(); // missing 'blue' in styleVariables
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('works if the layer is constructed without a source', (done) => {
|
||||||
|
const sourceless = new WebGLTileLayer({
|
||||||
|
className: 'testlayer',
|
||||||
|
style: {
|
||||||
|
variables: {
|
||||||
|
r: 0,
|
||||||
|
g: 255,
|
||||||
|
b: 0,
|
||||||
|
},
|
||||||
|
color: ['color', ['var', 'r'], ['var', 'g'], ['var', 'b']],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
map.addLayer(sourceless);
|
||||||
|
|
||||||
|
sourceless.setSource(
|
||||||
|
new DataTileSource({
|
||||||
|
loader(z, x, y) {
|
||||||
|
return new ImageData(256, 256);
|
||||||
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
let called = false;
|
||||||
|
layer.on('postrender', (event) => {
|
||||||
|
called = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
map.once('rendercomplete', () => {
|
||||||
|
expect(called).to.be(true);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user