Add uniforms master
authorLuke Lau <luke_lau@icloud.com>
Tue, 4 Dec 2018 20:21:25 +0000 (20:21 +0000)
committerLuke Lau <luke_lau@icloud.com>
Tue, 4 Dec 2018 20:21:25 +0000 (20:21 +0000)
Makefile
gles2.imports
main.js
test.cpp

index c2171a2157ad7d2973b800da9bcdf7e444f06303..40629adf7d9eb74d00b10ae2862ef33bcd117e5d 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -54,6 +54,7 @@ test.wasm: test.cpp sysroot
        toolchain/build/llvm/bin/clang++ \
                --target=wasm32-unknown-unknown-wasm -g -O3 \
                -fno-exceptions --sysroot=sysroot -nostartfiles \
-               -Wl,--export=setup,--demangle,--no-entry,--allow-undefined-file=gles2.imports \
+               -I/usr/local/include \
+               -Wl,--export=setup,--export=update,--demangle,--no-entry,--allow-undefined-file=gles2.imports \
                test.cpp -o test.wasm
 
index 0982053be653507f48cc2c40c6f8d4c8ccec9d12..39ff0a1f80cea910bd3a2168c3801821c5a2f366 100644 (file)
@@ -11,3 +11,5 @@ glBufferData
 glGetAttribLocation
 glEnableVertexAttribArray
 glVertexAttribPointer
+glGetUniformLocation
+glUniformMatrix4fv
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);
        })
index 065ed80de76182eded8aab8c084ba78751d82050..cbdf3707e6cd47a2a6259809024a112009c61135 100644 (file)
--- a/test.cpp
+++ b/test.cpp
@@ -1,11 +1,15 @@
 #include <GLES3/gl32.h>
 #include <string>
 #include <vector>
+#include <glm/glm.hpp>
+#include <glm/ext.hpp>
+#include <glm/gtc/type_ptr.hpp>
 
 const char* vertShaderSrc = R"(
 attribute vec4 vertPos;
+uniform mat4 model;
 void main() {
-       gl_Position = vertPos;
+       gl_Position = model * vertPos;
 }
 )";
 
@@ -15,6 +19,8 @@ void main() {
 }
 )";
 
+GLuint program;
+
 extern "C" void setup() {
        GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
        const char* sources[1] = { vertShaderSrc };
@@ -28,7 +34,7 @@ extern "C" void setup() {
                        new const GLint[1] { (GLint)strlen(fragShaderSrc) });
        glCompileShader(fragShader);
 
-       GLuint program = glCreateProgram();
+       program = glCreateProgram();
        glAttachShader(program, vertShader);
        glAttachShader(program, fragShader);
        glLinkProgram(program);
@@ -48,3 +54,9 @@ extern "C" void setup() {
        glEnableVertexAttribArray(vertPosLoc);
        glVertexAttribPointer(vertPosLoc, 3, GL_FLOAT, false, 0, 0);
 }
+
+extern "C" void update(int tick) {
+       GLuint modelLoc = glGetUniformLocation(program, "model");
+       const glm::mat4 model = glm::rotate(glm::mat4(1), (float)tick * 0.001f, glm::vec3(0, 0, 1));
+       glUniformMatrix4fv(modelLoc, 1, false, glm::value_ptr(model));
+}