/**
* A collection of useful functions.
*
* @author rhess <robin.hess@awi.de>
*/
/**
* Create a WebGL Program with fragmentShader, vertexShader and
* store attributes and uniforms in an object for easy access
*
* @memberof vef.ui.webgl
*
* @param {WebGL} gl WebGL Context
* @param {string} vShader Source Code of the Vertex Shader
* @param {string} fShader Source COde of the Fragment Shader
* @param {string[]} attributes Array of attribute names
* @param {string[]} uniforms Array of uniforms names
*
* @return program data
*/
export function createProgram(gl, vShader, fShader, attributes, uniforms) {
// store relevant data in an object (will be returned)
const data = {
program: gl.createProgram(),
vShader: null,
fShader: null,
uniforms: {},
attributes: {},
gl: gl
};
// compile vertex shader
if (vShader) {
data.vShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(data.vShader, vShader);
gl.compileShader(data.vShader);
gl.attachShader(data.program, data.vShader);
}
// compile fragment shader
if (fShader) {
data.fShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(data.fShader, fShader);
gl.compileShader(data.fShader);
gl.attachShader(data.program, data.fShader);
}
gl.linkProgram(data.program);
// get attributes
if (Array.isArray(attributes)) {
for (let i = 0; i < attributes.length; ++i) {
const attr = attributes[i];
data.attributes[attr] = gl.getAttribLocation(data.program, attr);
}
}
// get uniforms
if (Array.isArray(uniforms)) {
for (let i = 0; i < uniforms.length; ++i) {
const uni = uniforms[i];
data.uniforms[uni] = gl.getUniformLocation(data.program, uni);
}
}
return data;
}
/**
* Create webgl texture from an image object
*
* @memberof vef.ui.webgl
*
* @param {WebGL} gl
* @param {Image} image
* @returns texture
*/
export function createTexture(gl, image) {
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
return texture;
}