GL.CreateProgram = function(identifier, uniforms, attribs, textures)
{
var p = gl.createProgram();
var program =
{
identifier: identifier,
program: p,
attribs: []
};
var vsh = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vsh, document.getElementById('vsh' + identifier).text);
gl.compileShader(vsh);
if (gl.getShaderParameter(vsh, gl.COMPILE_STATUS) !== true)
Sys.Error('Error compiling shader: ' + gl.getShaderInfoLog(vsh));
var fsh = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fsh, document.getElementById('fsh' + identifier).text);
gl.compileShader(fsh);
if (gl.getShaderParameter(fsh, gl.COMPILE_STATUS) !== true)
Sys.Error('Error compiling shader: ' + gl.getShaderInfoLog(fsh));
gl.attachShader(p, vsh);
gl.attachShader(p, fsh);
gl.linkProgram(p);
if (gl.getProgramParameter(p, gl.LINK_STATUS) !== true)
Sys.Error('Error linking program: ' + gl.getProgramInfoLog(p));
gl.useProgram(p);
var i;
for (i = 0; i < uniforms.length; ++i)
program[uniforms[i]] = gl.getUniformLocation(p, uniforms[i]);
for (i = 0; i < attribs.length; ++i)
{
program.attribs[program.attribs.length] = attribs[i];
program[attribs[i]] = gl.getAttribLocation(p, attribs[i]);
}
for (i = 0; i < textures.length; ++i)
{
program[textures[i]] = gl.TEXTURE0 + i;
gl.uniform1i(gl.getUniformLocation(p, textures[i]), i);
}
GL.programs[GL.programs.length] = program;
};
GL.UseProgram = function(identifier)
{
var i, j;
var program = GL.currentprogram;
if (program != null)
{
if (program.identifier === identifier)
return program;
for (i = 0; i < program.attribs.length; ++i)
gl.disableVertexAttribArray(program[program.attribs[i]]);
}
for (i = 0; i < GL.programs.length; ++i)
{
program = GL.programs[i];
if (program.identifier === identifier)
{
GL.currentprogram = program;
gl.useProgram(program.program);
for (j = 0; j < program.attribs.length; ++j)
gl.enableVertexAttribArray(program[program.attribs[j]]);
return program;
}
}
};