webgl-sketch
Advanced tools
Comparing version 0.4.1 to 0.5.0-pre1
{ | ||
"name": "webgl-sketch", | ||
"version": "0.4.1", | ||
"version": "0.5.0-pre1", | ||
"description": "A WebGL canvas—shader wrapper library", | ||
@@ -18,7 +18,9 @@ "keywords": [ | ||
"devDependencies": { | ||
"eslint": "^7.4.0", | ||
"eslint-config-prettier": "^6.11.0", | ||
"eslint-plugin-prettier": "^3.1.4", | ||
"prettier": "^2.0.5" | ||
"prettier": "2.8.4" | ||
}, | ||
"prettier": { | ||
"semi": false, | ||
"singleQuote": true, | ||
"trailingComma": "none" | ||
} | ||
} |
125
src/index.js
@@ -1,28 +0,28 @@ | ||
const positions = new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]); | ||
const texcoords = new Float32Array([0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1]); | ||
const positions = new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]) | ||
const texcoords = new Float32Array([0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1]) | ||
function attachArrayBuffer(gl, program, key, data) { | ||
const location = gl.getAttribLocation(program, key); | ||
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()); | ||
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW); | ||
gl.enableVertexAttribArray(location); | ||
gl.vertexAttribPointer(location, 2, gl.FLOAT, false, 0, 0); | ||
const location = gl.getAttribLocation(program, key) | ||
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()) | ||
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW) | ||
gl.enableVertexAttribArray(location) | ||
gl.vertexAttribPointer(location, 2, gl.FLOAT, false, 0, 0) | ||
} | ||
export function create(options = {}) { | ||
const canvas = options.canvas || document.createElement("canvas"); | ||
const [width, height] = options.size || [200, 200]; | ||
const isDynamic = Boolean(options.dynamic); | ||
const uniforms = options.uniforms || {}; | ||
const canvas = options.canvas || document.createElement('canvas') | ||
const [width, height] = options.size || [200, 200] | ||
const isDynamic = Boolean(options.dynamic) | ||
const uniforms = options.uniforms || {} | ||
canvas.setAttribute("height", height); | ||
canvas.setAttribute("width", width); | ||
canvas.setAttribute('height', height) | ||
canvas.setAttribute('width', width) | ||
const gl = canvas.getContext("webgl", { | ||
const gl = canvas.getContext('webgl', { | ||
antialias: false, | ||
preserveDrawingBuffer: true, | ||
}); | ||
preserveDrawingBuffer: true | ||
}) | ||
if (!gl) { | ||
throw "A WebGL rendering context could not be initialized."; | ||
throw 'A WebGL rendering context could not be initialized.' | ||
} | ||
@@ -34,3 +34,3 @@ | ||
options.vertexShaderSource | ||
); | ||
) | ||
@@ -41,59 +41,59 @@ const fragmentShader = createShader( | ||
options.fragmentShaderSource | ||
); | ||
) | ||
const program = gl.createProgram(); | ||
gl.attachShader(program, vertexShader); | ||
gl.attachShader(program, fragmentShader); | ||
gl.linkProgram(program); | ||
const program = gl.createProgram() | ||
gl.attachShader(program, vertexShader) | ||
gl.attachShader(program, fragmentShader) | ||
gl.linkProgram(program) | ||
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { | ||
const info = gl.getProgramInfoLog(program); | ||
throw `Could not compile WebGL program.\n\n${info}`; | ||
const info = gl.getProgramInfoLog(program) | ||
throw `Could not compile WebGL program.\n\n${info}` | ||
} | ||
gl.useProgram(program); | ||
gl.useProgram(program) | ||
gl.deleteShader(vertexShader); | ||
gl.deleteShader(fragmentShader); | ||
gl.deleteShader(vertexShader) | ||
gl.deleteShader(fragmentShader) | ||
attachArrayBuffer(gl, program, "a_texcoord", texcoords); | ||
attachArrayBuffer(gl, program, "a_position", positions); | ||
attachArrayBuffer(gl, program, 'a_texcoord', texcoords) | ||
attachArrayBuffer(gl, program, 'a_position', positions) | ||
const setUniform = makeSetUniform(gl, program); | ||
setUniform("resolution", [width, height]); | ||
const setUniform = makeSetUniform(gl, program) | ||
setUniform('resolution', [width, height]) | ||
Object.keys(uniforms).forEach((key) => { | ||
setUniform(key, uniforms[key]); | ||
}); | ||
setUniform(key, uniforms[key]) | ||
}) | ||
const start = Date.now(); | ||
const start = Date.now() | ||
const render = isDynamic | ||
? () => { | ||
setUniform("time", (Date.now() - start) * 0.001); | ||
gl.drawArrays(gl.TRIANGLES, 0, 6); | ||
window.requestAnimationFrame(render); | ||
setUniform('time', (Date.now() - start) * 0.001) | ||
gl.drawArrays(gl.TRIANGLES, 0, 6) | ||
window.requestAnimationFrame(render) | ||
} | ||
: () => { | ||
gl.drawArrays(gl.TRIANGLES, 0, 6); | ||
}; | ||
gl.drawArrays(gl.TRIANGLES, 0, 6) | ||
} | ||
const rendered = new Promise((resolve) => { | ||
window.requestAnimationFrame(render); | ||
resolve(); | ||
}); | ||
window.requestAnimationFrame(render) | ||
resolve() | ||
}) | ||
return { canvas, gl, program, render, rendered, setUniform }; | ||
return { canvas, gl, program, render, rendered, setUniform } | ||
} | ||
function createShader(gl, type, source) { | ||
const shader = gl.createShader(type); | ||
gl.shaderSource(shader, source); | ||
gl.compileShader(shader); | ||
const shader = gl.createShader(type) | ||
gl.shaderSource(shader, source) | ||
gl.compileShader(shader) | ||
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { | ||
const info = gl.getShaderInfoLog(shader); | ||
throw `Could not compile WebGL program.\n\n${info}`; | ||
const info = gl.getShaderInfoLog(shader) | ||
throw `Could not compile WebGL program.\n\n${info}` | ||
} | ||
return shader; | ||
return shader | ||
} | ||
@@ -103,23 +103,24 @@ | ||
return (basicName, value) => { | ||
const isArray = Array.isArray(value); | ||
const method = isArray ? `${value.length}f` : "1f"; | ||
const name = `u_${basicName}`; | ||
const isArray = Array.isArray(value) | ||
const type = Number.isInteger(value) ? 'i' : 'f' | ||
const method = isArray ? `${value.length}${type}` : `1${type}` | ||
const name = `u_${basicName}` | ||
if (!(name in uniforms)) { | ||
uniforms[name] = {}; | ||
uniforms[name] = {} | ||
} | ||
const uniform = uniforms[name]; | ||
const change = uniform.value !== value; | ||
const uniformMethod = `uniform${method}`; | ||
const location = gl.getUniformLocation(program, name); | ||
const uniform = uniforms[name] | ||
const change = uniform.value !== value | ||
const uniformMethod = `uniform${method}` | ||
const location = gl.getUniformLocation(program, name) | ||
if ( | ||
change || | ||
typeof location === "undefined" || | ||
typeof value === "undefined" | ||
typeof location === 'undefined' || | ||
typeof value === 'undefined' | ||
) { | ||
gl[uniformMethod].apply(gl, [location].concat(value)); | ||
gl[uniformMethod].apply(gl, [location].concat(value)) | ||
} | ||
}; | ||
} | ||
} |
1
99
7379