Using a union type instead of a string enum

This commit is contained in:
Tim Schaub
2022-07-21 14:08:16 -07:00
parent 7e424be66b
commit 01f3536d29
3 changed files with 28 additions and 36 deletions

View File

@@ -6,11 +6,8 @@ import TileLayer from '../src/ol/layer/WebGLTile.js';
import VectorSource from '../src/ol/source/Vector.js';
import View from '../src/ol/View.js';
import WebGLVectorLayerRenderer from '../src/ol/renderer/webgl/VectorLayer.js';
import {
DefaultAttributes,
packColor,
} from '../src/ol/renderer/webgl/shaders.js';
import {asArray} from '../src/ol/color.js';
import {packColor} from '../src/ol/renderer/webgl/shaders.js';
class WebGLLayer extends Layer {
createRenderer() {
@@ -18,27 +15,27 @@ class WebGLLayer extends Layer {
className: this.getClassName(),
fill: {
attributes: {
[DefaultAttributes.COLOR]: function (feature) {
color: function (feature) {
const color = asArray(feature.get('COLOR') || '#eee');
color[3] = 0.85;
return packColor(color);
},
[DefaultAttributes.OPACITY]: function () {
opacity: function () {
return 0.6;
},
},
},
stroke: {
attributes: {
[DefaultAttributes.COLOR]: function (feature) {
color: function (feature) {
const color = [...asArray(feature.get('COLOR') || '#eee')];
color.forEach((_, i) => (color[i] = Math.round(color[i] * 0.75))); // darken slightly
return packColor(color);
},
[DefaultAttributes.WIDTH]: function () {
width: function () {
return 1.5;
},
[DefaultAttributes.OPACITY]: function () {
opacity: function () {
return 1;
},
},

View File

@@ -9,8 +9,8 @@ import PolygonBatchRenderer from '../../render/webgl/PolygonBatchRenderer.js';
import VectorEventType from '../../source/VectorEventType.js';
import ViewHint from '../../ViewHint.js';
import WebGLLayerRenderer from './Layer.js';
import {DefaultUniform} from '../../webgl/Helper.js';
import {
DefaultAttributes,
FILL_FRAGMENT_SHADER,
FILL_VERTEX_SHADER,
POINT_FRAGMENT_SHADER,
@@ -19,7 +19,6 @@ import {
STROKE_VERTEX_SHADER,
packColor,
} from './shaders.js';
import {DefaultUniform} from '../../webgl/Helper.js';
import {buffer, createEmpty, equals, getWidth} from '../../extent.js';
import {create as createTransform} from '../../transform.js';
import {create as createWebGLWorker} from '../../worker/webgl.js';
@@ -35,7 +34,7 @@ import {listen, unlistenByKey} from '../../events.js';
* @typedef {Object} ShaderProgram An object containing both shaders (vertex and fragment) as well as the required attributes
* @property {string} [vertexShader] Vertex shader source (using the default one if unspecified).
* @property {string} [fragmentShader] Fragment shader source (using the default one if unspecified).
* @property {Object<string,CustomAttributeCallback>} attributes Custom attributes made available in the vertex shader.
* @property {Object<import("./shaders.js").DefaultAttributes,CustomAttributeCallback>} attributes Custom attributes made available in the vertex shader.
* Keys are the names of the attributes which are then accessible in the vertex shader using the `a_` prefix, e.g.: `a_opacity`.
* Default shaders rely on the attributes in {@link module:ol/render/webgl/shaders~DefaultAttributes}.
*/
@@ -50,6 +49,14 @@ import {listen, unlistenByKey} from '../../events.js';
* @property {Array<import("./Layer").PostProcessesOptions>} [postProcesses] Post-processes definitions
*/
/**
* @param {Object<import("./shaders.js").DefaultAttributes,CustomAttributeCallback>} obj Lookup of attribute getters.
* @return {Array<import("../../render/webgl/BatchRenderer").CustomAttribute>} An array of attribute descriptors.
*/
function toAttributesArray(obj) {
return Object.keys(obj).map((key) => ({name: key, callback: obj[key]}));
}
/**
* @classdesc
* Experimental WebGL vector renderer. Supports polygons, lines and points:
@@ -97,42 +104,38 @@ class WebGLVectorLayerRenderer extends WebGLLayerRenderer {
this.currentTransform_ = projectionMatrixTransform;
const fillAttributes = {
[DefaultAttributes.COLOR]: function () {
color: function () {
return packColor('#ddd');
},
[DefaultAttributes.OPACITY]: function () {
opacity: function () {
return 1;
},
...(options.fill && options.fill.attributes),
};
const strokeAttributes = {
[DefaultAttributes.COLOR]: function () {
color: function () {
return packColor('#eee');
},
[DefaultAttributes.OPACITY]: function () {
opacity: function () {
return 1;
},
[DefaultAttributes.WIDTH]: function () {
width: function () {
return 1.5;
},
...(options.stroke && options.stroke.attributes),
};
const pointAttributes = {
[DefaultAttributes.COLOR]: function () {
color: function () {
return packColor('#eee');
},
[DefaultAttributes.OPACITY]: function () {
opacity: function () {
return 1;
},
...(options.point && options.point.attributes),
};
function toAttributesArray(obj) {
return Object.keys(obj).map((key) => ({name: key, callback: obj[key]}));
}
this.fillVertexShader_ =
(options.fill && options.fill.vertexShader) || FILL_VERTEX_SHADER;
this.fillFragmentShader_ =

View File

@@ -3,19 +3,11 @@
*/
import {asArray} from '../../color.js';
/**
* Attribute names used in the default shaders.
* @enum {string}
*/
export const DefaultAttributes = {
COLOR: 'color',
OPACITY: 'opacity',
WIDTH: 'width',
};
/** @typedef {'color'|'opacity'|'width'} DefaultAttributes */
/**
* Packs red/green/blue channels of a color into a single float value; alpha is ignored.
* This is how DefaultAttributes.COLOR is expected to be computed.
* This is how the color is expected to be computed.
* @param {import("../../color.js").Color|string} color Color as array of numbers or string
* @return {number} Float value containing the color
*/
@@ -35,7 +27,7 @@ const DECODE_COLOR_EXPRESSION = `vec3(
/**
* Default polygon vertex shader.
* Relies on DefaultAttributes.COLOR and DefaultAttributes.OPACITY.
* Relies on the color and opacity attributes.
* @type {string}
*/
export const FILL_VERTEX_SHADER = `
@@ -68,7 +60,7 @@ export const FILL_FRAGMENT_SHADER = `
/**
* Default linestring vertex shader.
* Relies on DefaultAttributes.COLOR, DefaultAttributes.OPACITY and DefaultAttributes.WIDTH.
* Relies on color, opacity and width attributes.
* @type {string}
*/
export const STROKE_VERTEX_SHADER = `
@@ -163,7 +155,7 @@ export const STROKE_FRAGMENT_SHADER = `
/**
* Default point vertex shader.
* Relies on DefaultAttributes.COLOR and DefaultAttributes.OPACITY.
* Relies on color and opacity attributes.
* @type {string}
*/
export const POINT_VERTEX_SHADER = `