Add uniforms
[wasm.git] / main.js
diff --git a/main.js b/main.js
index 3d573c1b03c717096b4c486ccfaba59356577a6d..f12efc10b96760a876215bbd564024b7cf5a13fd 100644 (file)
--- 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);
        })