mirror of https://gitee.com/antv-l7/antv-l7
155 lines
3.8 KiB
TypeScript
155 lines
3.8 KiB
TypeScript
import { AttributeType, gl, IEncodeFeature, ILayer } from '@l7/core';
|
|
import BaseLayer from '../core/BaseLayer';
|
|
import { LineTriangulation } from '../core/triangulation';
|
|
import line_frag from './shaders/line_frag.glsl';
|
|
import line_vert from './shaders/line_vert.glsl';
|
|
interface IPointLayerStyleOptions {
|
|
opacity: number;
|
|
}
|
|
export default class LineLayer extends BaseLayer<IPointLayerStyleOptions> {
|
|
public name: string = 'LineLayer';
|
|
|
|
protected getConfigSchema() {
|
|
return {
|
|
properties: {
|
|
opacity: {
|
|
type: 'number',
|
|
minimum: 0,
|
|
maximum: 1,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
protected renderModels() {
|
|
const { opacity } = this.getStyleOptions();
|
|
this.models.forEach((model) =>
|
|
model.draw({
|
|
uniforms: {
|
|
u_Opacity: opacity || 0,
|
|
},
|
|
}),
|
|
);
|
|
return this;
|
|
}
|
|
|
|
protected buildModels() {
|
|
this.registerBuiltinAttributes(this);
|
|
this.models = [
|
|
this.buildLayerModel({
|
|
moduleName: 'line',
|
|
vertexShader: line_vert,
|
|
fragmentShader: line_frag,
|
|
triangulation: LineTriangulation,
|
|
blend: {
|
|
enable: true,
|
|
func: {
|
|
srcRGB: gl.SRC_ALPHA,
|
|
srcAlpha: 1,
|
|
dstRGB: gl.ONE_MINUS_SRC_ALPHA,
|
|
dstAlpha: 1,
|
|
},
|
|
},
|
|
}),
|
|
];
|
|
}
|
|
|
|
private registerBuiltinAttributes(layer: ILayer) {
|
|
// point layer size;
|
|
layer.styleAttributeService.registerStyleAttribute({
|
|
name: 'size',
|
|
type: AttributeType.Attribute,
|
|
descriptor: {
|
|
name: 'a_Size',
|
|
buffer: {
|
|
// give the WebGL driver a hint that this buffer may change
|
|
usage: gl.DYNAMIC_DRAW,
|
|
data: [],
|
|
type: gl.FLOAT,
|
|
},
|
|
size: 1,
|
|
update: (
|
|
feature: IEncodeFeature,
|
|
featureIdx: number,
|
|
vertex: number[],
|
|
attributeIdx: number,
|
|
) => {
|
|
const { size } = feature;
|
|
return Array.isArray(size) ? [size[0]] : [size as number];
|
|
},
|
|
},
|
|
});
|
|
|
|
// point layer size;
|
|
layer.styleAttributeService.registerStyleAttribute({
|
|
name: 'normal',
|
|
type: AttributeType.Attribute,
|
|
descriptor: {
|
|
name: 'a_Normal',
|
|
buffer: {
|
|
// give the WebGL driver a hint that this buffer may change
|
|
usage: gl.STATIC_DRAW,
|
|
data: [],
|
|
type: gl.FLOAT,
|
|
},
|
|
size: 3,
|
|
update: (
|
|
feature: IEncodeFeature,
|
|
featureIdx: number,
|
|
vertex: number[],
|
|
attributeIdx: number,
|
|
normal: number[],
|
|
) => {
|
|
return normal;
|
|
},
|
|
},
|
|
});
|
|
|
|
layer.styleAttributeService.registerStyleAttribute({
|
|
name: 'miter',
|
|
type: AttributeType.Attribute,
|
|
descriptor: {
|
|
name: 'a_Miter',
|
|
buffer: {
|
|
// give the WebGL driver a hint that this buffer may change
|
|
usage: gl.DYNAMIC_DRAW,
|
|
data: [],
|
|
type: gl.FLOAT,
|
|
},
|
|
size: 1,
|
|
update: (
|
|
feature: IEncodeFeature,
|
|
featureIdx: number,
|
|
vertex: number[],
|
|
attributeIdx: number,
|
|
) => {
|
|
return [vertex[4]];
|
|
},
|
|
},
|
|
});
|
|
|
|
layer.styleAttributeService.registerStyleAttribute({
|
|
name: 'distance',
|
|
type: AttributeType.Attribute,
|
|
descriptor: {
|
|
name: 'a_Distance',
|
|
buffer: {
|
|
// give the WebGL driver a hint that this buffer may change
|
|
usage: gl.DYNAMIC_DRAW,
|
|
data: [],
|
|
type: gl.FLOAT,
|
|
},
|
|
size: 1,
|
|
update: (
|
|
feature: IEncodeFeature,
|
|
featureIdx: number,
|
|
vertex: number[],
|
|
attributeIdx: number,
|
|
) => {
|
|
return [vertex[3]];
|
|
},
|
|
},
|
|
});
|
|
}
|
|
}
|