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

View File

@@ -9,8 +9,8 @@ import PolygonBatchRenderer from '../../render/webgl/PolygonBatchRenderer.js';
import VectorEventType from '../../source/VectorEventType.js'; import VectorEventType from '../../source/VectorEventType.js';
import ViewHint from '../../ViewHint.js'; import ViewHint from '../../ViewHint.js';
import WebGLLayerRenderer from './Layer.js'; import WebGLLayerRenderer from './Layer.js';
import {DefaultUniform} from '../../webgl/Helper.js';
import { import {
DefaultAttributes,
FILL_FRAGMENT_SHADER, FILL_FRAGMENT_SHADER,
FILL_VERTEX_SHADER, FILL_VERTEX_SHADER,
POINT_FRAGMENT_SHADER, POINT_FRAGMENT_SHADER,
@@ -19,7 +19,6 @@ import {
STROKE_VERTEX_SHADER, STROKE_VERTEX_SHADER,
packColor, packColor,
} from './shaders.js'; } from './shaders.js';
import {DefaultUniform} from '../../webgl/Helper.js';
import {buffer, createEmpty, equals, getWidth} from '../../extent.js'; import {buffer, createEmpty, equals, getWidth} from '../../extent.js';
import {create as createTransform} from '../../transform.js'; import {create as createTransform} from '../../transform.js';
import {create as createWebGLWorker} from '../../worker/webgl.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 * @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} [vertexShader] Vertex shader source (using the default one if unspecified).
* @property {string} [fragmentShader] Fragment 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`. * 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}. * 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 * @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 * @classdesc
* Experimental WebGL vector renderer. Supports polygons, lines and points: * Experimental WebGL vector renderer. Supports polygons, lines and points:
@@ -97,42 +104,38 @@ class WebGLVectorLayerRenderer extends WebGLLayerRenderer {
this.currentTransform_ = projectionMatrixTransform; this.currentTransform_ = projectionMatrixTransform;
const fillAttributes = { const fillAttributes = {
[DefaultAttributes.COLOR]: function () { color: function () {
return packColor('#ddd'); return packColor('#ddd');
}, },
[DefaultAttributes.OPACITY]: function () { opacity: function () {
return 1; return 1;
}, },
...(options.fill && options.fill.attributes), ...(options.fill && options.fill.attributes),
}; };
const strokeAttributes = { const strokeAttributes = {
[DefaultAttributes.COLOR]: function () { color: function () {
return packColor('#eee'); return packColor('#eee');
}, },
[DefaultAttributes.OPACITY]: function () { opacity: function () {
return 1; return 1;
}, },
[DefaultAttributes.WIDTH]: function () { width: function () {
return 1.5; return 1.5;
}, },
...(options.stroke && options.stroke.attributes), ...(options.stroke && options.stroke.attributes),
}; };
const pointAttributes = { const pointAttributes = {
[DefaultAttributes.COLOR]: function () { color: function () {
return packColor('#eee'); return packColor('#eee');
}, },
[DefaultAttributes.OPACITY]: function () { opacity: function () {
return 1; return 1;
}, },
...(options.point && options.point.attributes), ...(options.point && options.point.attributes),
}; };
function toAttributesArray(obj) {
return Object.keys(obj).map((key) => ({name: key, callback: obj[key]}));
}
this.fillVertexShader_ = this.fillVertexShader_ =
(options.fill && options.fill.vertexShader) || FILL_VERTEX_SHADER; (options.fill && options.fill.vertexShader) || FILL_VERTEX_SHADER;
this.fillFragmentShader_ = this.fillFragmentShader_ =

View File

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