ShaderBuilder / simplify check/parse code a bit

This commit is contained in:
Olivier Guyot
2019-10-23 09:22:12 +02:00
parent 1fe5a68e16
commit fc555241ea

View File

@@ -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));
} }