Expressions / store the variables & attributes in the context
This commit is contained in:
@@ -115,7 +115,9 @@ export function getValueType(value) {
|
|||||||
/**
|
/**
|
||||||
* Context available during the parsing of an expression.
|
* Context available during the parsing of an expression.
|
||||||
* @typedef {Object} ParsingContext
|
* @typedef {Object} ParsingContext
|
||||||
* @property {boolean} inFragmentShader If false, means the expression output should be made for a vertex shader
|
* @property {boolean} [inFragmentShader] If false, means the expression output should be made for a vertex shader
|
||||||
|
* @property {Array<string>} variables List of variables used in the expression; contains **unprefixed names**
|
||||||
|
* @property {Array<string>} attributes List of attributes used in the expression; contains **unprefixed names**
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -239,10 +241,14 @@ export const Operators = {
|
|||||||
return ValueTypes.ANY;
|
return ValueTypes.ANY;
|
||||||
},
|
},
|
||||||
toGlsl: function(context, args) {
|
toGlsl: function(context, args) {
|
||||||
const prefix = context.inFragmentShader ? 'v_' : 'a_';
|
|
||||||
assertArgsCount(args, 1);
|
assertArgsCount(args, 1);
|
||||||
assertString(args[0]);
|
assertString(args[0]);
|
||||||
return prefix + expressionToGlsl(context, args[0]);
|
const value = expressionToGlsl(context, args[0]);
|
||||||
|
if (context.attributes.indexOf(value) === -1) {
|
||||||
|
context.attributes.push(value);
|
||||||
|
}
|
||||||
|
const prefix = context.inFragmentShader ? 'v_' : 'a_';
|
||||||
|
return prefix + value;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'var': {
|
'var': {
|
||||||
@@ -252,7 +258,11 @@ export const Operators = {
|
|||||||
toGlsl: function(context, args) {
|
toGlsl: function(context, args) {
|
||||||
assertArgsCount(args, 1);
|
assertArgsCount(args, 1);
|
||||||
assertString(args[0]);
|
assertString(args[0]);
|
||||||
return `u_${expressionToGlsl(context, args[0])}`;
|
const value = expressionToGlsl(context, args[0]);
|
||||||
|
if (context.variables.indexOf(value) === -1) {
|
||||||
|
context.variables.push(value);
|
||||||
|
}
|
||||||
|
return `u_${value}`;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'time': {
|
'time': {
|
||||||
|
|||||||
@@ -114,7 +114,10 @@ describe('ol.style.expressions', function() {
|
|||||||
let context;
|
let context;
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
context = {};
|
context = {
|
||||||
|
variables: [],
|
||||||
|
attributes: []
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
it('correctly converts expressions to GLSL', function() {
|
it('correctly converts expressions to GLSL', function() {
|
||||||
@@ -137,6 +140,21 @@ describe('ol.style.expressions', function() {
|
|||||||
'mix(vec4(1.0, 1.0, 1.0, 1.0), vec4(0.0, 0.0, 0.0, 0.0), a_attr4)');
|
'mix(vec4(1.0, 1.0, 1.0, 1.0), vec4(0.0, 0.0, 0.0, 0.0), a_attr4)');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('correctly adapts output for fragment shaders', function() {
|
||||||
|
context.inFragmentShader = true;
|
||||||
|
expect(expressionToGlsl(context, ['get', 'myAttr'])).to.eql('v_myAttr');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('correctly adapts output for fragment shaders', function() {
|
||||||
|
expressionToGlsl(context, ['get', 'myAttr']);
|
||||||
|
expressionToGlsl(context, ['var', 'myVar']);
|
||||||
|
expressionToGlsl(context, ['clamp', ['get', 'attr2'], ['get', 'attr2'], ['get', 'myAttr']]);
|
||||||
|
expressionToGlsl(context, ['*', ['get', 'attr2'], ['var', 'myVar']]);
|
||||||
|
expressionToGlsl(context, ['*', ['get', 'attr3'], ['var', 'myVar2']]);
|
||||||
|
expect(context.attributes).to.eql(['myAttr', 'attr2', 'attr3']);
|
||||||
|
expect(context.variables).to.eql(['myVar', 'myVar2']);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user