Skip to content

Commit

Permalink
Allow token replacement in shaders
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas Wojciechowski committed Apr 6, 2016
1 parent b7d2847 commit 75dc9f1
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 11 deletions.
4 changes: 3 additions & 1 deletion js/render/draw_circle.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ function drawCircles(painter, source, layer, coords) {

var gl = painter.gl;

var program = painter.useProgram('circle');
var program = painter.useProgram('circle', {
colorType: 'attribute'
});

painter.setDepthSublayer(0);
painter.depthMask(false);
Expand Down
28 changes: 19 additions & 9 deletions js/render/painter/use_program.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,19 @@ var definitions = {
}
};

module.exports._createProgram = function(name) {
module.exports._createProgram = function(name, tokens) {
var gl = this.gl;
var program = gl.createProgram();
var definition = definitions[name];

var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, definition.fragmentSource);
gl.shaderSource(fragmentShader, applyTokens(definition.fragmentSource, tokens));
gl.compileShader(fragmentShader);
assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader));
gl.attachShader(program, fragmentShader);

var vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, definition.vertexSource);
gl.shaderSource(vertexShader, applyTokens(definition.vertexSource, tokens));
gl.compileShader(vertexShader);
assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader));
gl.attachShader(program, vertexShader);
Expand Down Expand Up @@ -103,18 +103,19 @@ module.exports._createProgram = function(name) {
}, attributes, uniforms);
};

module.exports._createProgramCached = function(name) {
module.exports._createProgramCached = function(name, tokens) {
this.cache = this.cache || {};
if (!this.cache[name]) {
this.cache[name] = this._createProgram(name);
var key = JSON.stringify({name: name, tokens: tokens});
if (!this.cache[key]) {
this.cache[key] = this._createProgram(name, tokens);
}
return this.cache[name];
return this.cache[key];
};

module.exports.useProgram = function (nextProgramName) {
module.exports.useProgram = function (nextProgramName, tokens) {
var gl = this.gl;

var nextProgram = this._createProgramCached(nextProgramName);
var nextProgram = this._createProgramCached(nextProgramName, tokens);
var previousProgram = this.currentProgram;

if (previousProgram !== nextProgram) {
Expand All @@ -140,3 +141,12 @@ module.exports.useProgram = function (nextProgramName) {

return nextProgram;
};

function applyTokens(string, tokens) {
tokens = tokens || {};
for (var key in tokens) {
var value = tokens[key];
string = string.replace('{{' + key + '}}', value);
}
return string;
}
3 changes: 2 additions & 1 deletion shaders/circle.vertex.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ uniform mat4 u_exmatrix;
uniform mediump float u_size;

attribute vec2 a_pos;
attribute lowp vec4 a_color;

{{colorType}} lowp vec4 a_color;

varying vec2 v_extrude;
varying lowp vec4 v_color;
Expand Down

0 comments on commit 75dc9f1

Please sign in to comment.