UNPKG

gw-canvas

Version:

Library for rendering colorized bitmap fonts. Very fast, suitable for applications where the whole canvas needs frequent redrawing.

54 lines (53 loc) 1.99 kB
// Copy of: https://github.com/ondras/fastiles/blob/master/ts/utils.ts (v2.1.0) export const QUAD = [ 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 ]; export function createProgram(gl, ...sources) { const p = gl.createProgram(); [gl.VERTEX_SHADER, gl.FRAGMENT_SHADER].forEach((type, index) => { const shader = gl.createShader(type); gl.shaderSource(shader, sources[index]); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { throw new Error(gl.getShaderInfoLog(shader)); } gl.attachShader(p, shader); }); gl.linkProgram(p); if (!gl.getProgramParameter(p, gl.LINK_STATUS)) { throw new Error(gl.getProgramInfoLog(p)); } return p; } export function createTexture(gl) { let t = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, t); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); return t; } export function createGeometry(gl, attribs, width, height) { let tileCount = width * height; let positionData = new Uint16Array(tileCount * QUAD.length); let uvData = new Uint8Array(tileCount * QUAD.length); let i = 0; for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { QUAD.forEach(value => { positionData[i] = (i % 2 ? y : x) + value; uvData[i] = value; i++; }); } } const position = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, position); gl.vertexAttribIPointer(attribs["position"], 2, gl.UNSIGNED_SHORT, 0, 0); gl.bufferData(gl.ARRAY_BUFFER, positionData, gl.STATIC_DRAW); const uv = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, uv); gl.vertexAttribIPointer(attribs["uv"], 2, gl.UNSIGNED_BYTE, 0, 0); gl.bufferData(gl.ARRAY_BUFFER, uvData, gl.STATIC_DRAW); return { position, uv }; }