X-Git-Url: http://git.lukelau.me/?p=wasm.git;a=blobdiff_plain;f=main.js;fp=main.js;h=f12efc10b96760a876215bbd564024b7cf5a13fd;hp=3d573c1b03c717096b4c486ccfaba59356577a6d;hb=1f4d729cfaaed2c371065bad05fe1f345d3b26ee;hpb=54f82247de6f51a7e30a935d3a533745691bcbb6 diff --git a/main.js b/main.js index 3d573c1..f12efc1 100644 --- a/main.js +++ b/main.js @@ -33,6 +33,13 @@ function createBufferId() { return id } +const uniformLocMap = new Map() +var currentUniformLocId = 0 +function createUniformLocId() { + const id = currentUniformLocId + currentUniformLocId += 1 + return id +} var memory var decoder = new TextDecoder('utf-8') @@ -85,10 +92,8 @@ const imports = { }, glLinkProgram: (progId) => gl.linkProgram(programMap.get(progId)), glUseProgram: (progId) => gl.useProgram(programMap.get(progId)), - glGetAttribLocation: (progId, name) => { - const prog = programMap.get(progId) - return gl.getAttribLocation(prog, getString(name)) - }, + glGetAttribLocation: (progId, name) => + gl.getAttribLocation(programMap.get(progId), getString(name)), glEnableVertexAttribArray: (loc) => gl.enableVertexAttribArray(loc), glVertexAttribPointer: (loc, size, type, normalized, stride, offset) => { gl.vertexAttribPointer(loc, size, type, normalized, stride, offset) @@ -105,6 +110,17 @@ const imports = { glBufferData: (target, size, addr, usage) => { const data = new Float32Array(memory.buffer.slice(addr, addr + size * 4)) gl.bufferData(target, data, usage) + }, + glGetUniformLocation: (progId, name) => { + const id = createUniformLocId() + const loc = gl.getUniformLocation(programMap.get(progId), getString(name)) + uniformLocMap.set(id, loc) + return id + }, + glUniformMatrix4fv: (loc, count, transpose, addr) => { + if (count != 1) throw Error('count must be 1') + const vals = new Float32Array(memory.buffer.slice(addr, addr + 4 * 16)) + gl.uniformMatrix4fv(uniformLocMap.get(loc), transpose, vals) } } } @@ -114,6 +130,14 @@ sock.onmessage = function (e) { console.log(e.data) } +var instance + +function draw(tick) { + instance.exports.update(tick) + gl.drawArrays(gl.TRIANGLES, 0, 3) + requestAnimationFrame(draw); +} + function instantiate(bytes) { return WebAssembly.compile(bytes). then(m => { @@ -126,7 +150,8 @@ function instantiate(bytes) { fetch('test.wasm') .then(response => response.arrayBuffer()) .then(bytes => instantiate(bytes)) - .then(instance => { + .then(i => { + instance = i instance.exports.setup() - gl.drawArrays(gl.TRIANGLES, 0, 3) + requestAnimationFrame(draw); })