ShaderBuilder / simplify check/parse code a bit
This commit is contained in:
@@ -142,8 +142,6 @@ export function isValueTypeColor(value) {
|
|||||||
* @param {import("../style/LiteralStyle").ExpressionValue} value Either literal or an operator.
|
* @param {import("../style/LiteralStyle").ExpressionValue} value Either literal or an operator.
|
||||||
*/
|
*/
|
||||||
export function check(value) {
|
export function check(value) {
|
||||||
const v = value;
|
|
||||||
|
|
||||||
// these will be used to validate types in the expressions
|
// these will be used to validate types in the expressions
|
||||||
function checkNumber(value) {
|
function checkNumber(value) {
|
||||||
if (!isValueTypeNumber(value)) {
|
if (!isValueTypeNumber(value)) {
|
||||||
@@ -171,7 +169,7 @@ export function check(value) {
|
|||||||
switch (value[0]) {
|
switch (value[0]) {
|
||||||
case 'get':
|
case 'get':
|
||||||
case 'var':
|
case 'var':
|
||||||
checkString(v[1]);
|
checkString(value[1]);
|
||||||
break;
|
break;
|
||||||
case 'time':
|
case 'time':
|
||||||
break;
|
break;
|
||||||
@@ -181,44 +179,42 @@ export function check(value) {
|
|||||||
case '-':
|
case '-':
|
||||||
case 'mod':
|
case 'mod':
|
||||||
case 'pow':
|
case 'pow':
|
||||||
checkNumber(v[1]);
|
checkNumber(value[1]);
|
||||||
checkNumber(v[2]);
|
checkNumber(value[2]);
|
||||||
break;
|
break;
|
||||||
case 'clamp':
|
case 'clamp':
|
||||||
checkNumber(v[1]);
|
checkNumber(value[1]);
|
||||||
checkNumber(v[2]);
|
checkNumber(value[2]);
|
||||||
checkNumber(v[3]);
|
checkNumber(value[3]);
|
||||||
break;
|
break;
|
||||||
case 'stretch':
|
case 'stretch':
|
||||||
checkNumber(v[1]);
|
checkNumber(value[1]);
|
||||||
checkNumber(v[2]);
|
checkNumber(value[2]);
|
||||||
checkNumber(v[3]);
|
checkNumber(value[3]);
|
||||||
checkNumber(v[4]);
|
checkNumber(value[4]);
|
||||||
checkNumber(v[5]);
|
checkNumber(value[5]);
|
||||||
break;
|
break;
|
||||||
case '>':
|
case '>':
|
||||||
case '>=':
|
case '>=':
|
||||||
case '<':
|
case '<':
|
||||||
case '<=':
|
case '<=':
|
||||||
case '==':
|
case '==':
|
||||||
checkNumber(v[1]);
|
checkNumber(value[1]);
|
||||||
checkNumber(v[2]);
|
checkNumber(value[2]);
|
||||||
break;
|
break;
|
||||||
case '!':
|
case '!':
|
||||||
checkNumber(v[1]);
|
checkNumber(value[1]);
|
||||||
break;
|
break;
|
||||||
case 'between':
|
case 'between':
|
||||||
checkNumber(v[1]);
|
checkNumber(value[1]);
|
||||||
checkNumber(v[2]);
|
checkNumber(value[2]);
|
||||||
checkNumber(v[3]);
|
checkNumber(value[3]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'interpolate':
|
case 'interpolate':
|
||||||
checkNumber(v[1]);
|
checkNumber(value[1]);
|
||||||
checkColor(v[2]);
|
checkColor(value[2]);
|
||||||
checkColor(v[3]);
|
checkColor(value[3]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: throw new Error(`Unrecognized operator in style expression: ${JSON.stringify(value)}`);
|
default: throw new Error(`Unrecognized operator in style expression: ${JSON.stringify(value)}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,7 +249,6 @@ export function check(value) {
|
|||||||
export function parse(value, attributes, attributePrefix, variables, typeHint) {
|
export function parse(value, attributes, attributePrefix, variables, typeHint) {
|
||||||
check(value);
|
check(value);
|
||||||
|
|
||||||
const v = value;
|
|
||||||
function p(value) {
|
function p(value) {
|
||||||
return parse(value, attributes, attributePrefix, variables);
|
return parse(value, attributes, attributePrefix, variables);
|
||||||
}
|
}
|
||||||
@@ -262,19 +257,19 @@ export function parse(value, attributes, attributePrefix, variables, typeHint) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// operator
|
// operator
|
||||||
if (Array.isArray(v) && typeof value[0] === 'string') {
|
if (Array.isArray(value) && typeof value[0] === 'string') {
|
||||||
switch (v[0]) {
|
switch (value[0]) {
|
||||||
// reading operators
|
// reading operators
|
||||||
case 'get':
|
case 'get':
|
||||||
if (attributes.indexOf(v[1]) === -1) {
|
if (attributes.indexOf(value[1]) === -1) {
|
||||||
attributes.push(v[1]);
|
attributes.push(value[1]);
|
||||||
}
|
}
|
||||||
return attributePrefix + v[1];
|
return attributePrefix + value[1];
|
||||||
case 'var':
|
case 'var':
|
||||||
if (variables.indexOf(v[1]) === -1) {
|
if (variables.indexOf(value[1]) === -1) {
|
||||||
variables.push(v[1]);
|
variables.push(value[1]);
|
||||||
}
|
}
|
||||||
return `u_${v[1]}`;
|
return `u_${value[1]}`;
|
||||||
case 'time':
|
case 'time':
|
||||||
return 'u_time';
|
return 'u_time';
|
||||||
|
|
||||||
@@ -283,20 +278,20 @@ export function parse(value, attributes, attributePrefix, variables, typeHint) {
|
|||||||
case '/':
|
case '/':
|
||||||
case '+':
|
case '+':
|
||||||
case '-':
|
case '-':
|
||||||
return `(${p(v[1])} ${v[0]} ${p(v[2])})`;
|
return `(${p(value[1])} ${value[0]} ${p(value[2])})`;
|
||||||
case 'clamp': return `clamp(${p(v[1])}, ${p(v[2])}, ${p(v[3])})`;
|
case 'clamp': return `clamp(${p(value[1])}, ${p(value[2])}, ${p(value[3])})`;
|
||||||
case 'stretch':
|
case 'stretch':
|
||||||
const low1 = p(v[2]);
|
const low1 = p(value[2]);
|
||||||
const high1 = p(v[3]);
|
const high1 = p(value[3]);
|
||||||
const low2 = p(v[4]);
|
const low2 = p(value[4]);
|
||||||
const high2 = p(v[5]);
|
const high2 = p(value[5]);
|
||||||
return `((clamp(${p(v[1])}, ${low1}, ${high1}) - ${low1}) * ((${high2} - ${low2}) / (${high1} - ${low1})) + ${low2})`;
|
return `((clamp(${p(value[1])}, ${low1}, ${high1}) - ${low1}) * ((${high2} - ${low2}) / (${high1} - ${low1})) + ${low2})`;
|
||||||
case 'mod': return `mod(${p(v[1])}, ${p(v[2])})`;
|
case 'mod': return `mod(${p(value[1])}, ${p(value[2])})`;
|
||||||
case 'pow': return `pow(${p(v[1])}, ${p(v[2])})`;
|
case 'pow': return `pow(${p(value[1])}, ${p(value[2])})`;
|
||||||
|
|
||||||
// color operators
|
// color operators
|
||||||
case 'interpolate':
|
case 'interpolate':
|
||||||
return `mix(${pC(v[2])}, ${pC(v[3])}, ${p(v[1])})`;
|
return `mix(${pC(value[2])}, ${pC(value[3])}, ${p(value[1])})`;
|
||||||
|
|
||||||
// logical operators
|
// logical operators
|
||||||
case '>':
|
case '>':
|
||||||
@@ -304,11 +299,11 @@ export function parse(value, attributes, attributePrefix, variables, typeHint) {
|
|||||||
case '<':
|
case '<':
|
||||||
case '<=':
|
case '<=':
|
||||||
case '==':
|
case '==':
|
||||||
return `(${p(v[1])} ${v[0]} ${p(v[2])} ? 1.0 : 0.0)`;
|
return `(${p(value[1])} ${value[0]} ${p(value[2])} ? 1.0 : 0.0)`;
|
||||||
case '!':
|
case '!':
|
||||||
return `(${p(v[1])} > 0.0 ? 0.0 : 1.0)`;
|
return `(${p(value[1])} > 0.0 ? 0.0 : 1.0)`;
|
||||||
case 'between':
|
case 'between':
|
||||||
return `(${p(v[1])} >= ${p(v[2])} && ${p(v[1])} <= ${p(v[3])} ? 1.0 : 0.0)`;
|
return `(${p(value[1])} >= ${p(value[2])} && ${p(value[1])} <= ${p(value[3])} ? 1.0 : 0.0)`;
|
||||||
|
|
||||||
default: throw new Error('Invalid style expression: ' + JSON.stringify(value));
|
default: throw new Error('Invalid style expression: ' + JSON.stringify(value));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user