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')
},
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)
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)
}
}
}
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 => {
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);
})