@snap/camera-kit
Version:
Camera Kit Web
87 lines • 3.6 kB
JavaScript
import { webGLError } from "../namedErrors";
const webGLEntityCreationError = (name) => webGLError(`Could not create ${name}.`);
export function createProgram(gl, vertexSource, fragmentSource) {
const vertexShader = createShader(gl, vertexSource, gl.VERTEX_SHADER);
const fragmentShader = createShader(gl, fragmentSource, gl.FRAGMENT_SHADER);
const program = gl.createProgram();
if (!program)
throw webGLEntityCreationError("WebGLProgram");
gl.attachShader(program, vertexShader);
gl.deleteShader(vertexShader);
gl.attachShader(program, fragmentShader);
gl.deleteShader(fragmentShader);
gl.linkProgram(program);
const success = gl.getProgramParameter(program, gl.LINK_STATUS);
if (!success) {
const message = gl.getProgramInfoLog(program);
gl.deleteProgram(program);
throw webGLError(`WebGLProgram linking failed with status: ${message}.`);
}
return program;
}
export function createShader(gl, source, type) {
const shader = gl.createShader(type);
if (!shader)
throw webGLEntityCreationError(`WebGLShader (type ${type})`);
gl.shaderSource(shader, source);
gl.compileShader(shader);
const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if (!success) {
const message = gl.getShaderInfoLog(shader);
gl.deleteShader(shader);
throw webGLError(`WebGLShader (type ${type}) compilation failed with status: ${message}.`);
}
return shader;
}
export function createTexture(gl, width, height) {
const texture = gl.createTexture();
if (!texture)
throw webGLEntityCreationError("WebGLTexture");
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
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.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
return texture;
}
export function createFramebuffer(gl, texture) {
const framebuffer = gl.createFramebuffer();
if (!framebuffer)
throw webGLEntityCreationError("WebGLFramebuffer");
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
return framebuffer;
}
export function setUniform1i(gl, program, name, data) {
gl.uniform1i(gl.getUniformLocation(program, name), data);
}
export function setUniform4f(gl, program, name, data) {
gl.uniform4f(gl.getUniformLocation(program, name), ...data);
}
export function promiseSync(gl) {
const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
if (!sync)
throw webGLEntityCreationError("WebGLSync");
gl.flush();
return new Promise((resolve, reject) => {
const waitForSync = () => {
const glEnum = gl.clientWaitSync(sync, 0, 0);
switch (glEnum) {
case gl.TIMEOUT_EXPIRED:
setTimeout(waitForSync);
return;
case gl.WAIT_FAILED:
gl.deleteSync(sync);
return reject();
case gl.ALREADY_SIGNALED:
case gl.CONDITION_SATISFIED:
gl.deleteSync(sync);
return resolve();
}
};
waitForSync();
});
}
//# sourceMappingURL=webglUtils.js.map