From 1f4d729cfaaed2c371065bad05fe1f345d3b26ee Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Tue, 4 Dec 2018 20:21:25 +0000 Subject: [PATCH] Add uniforms --- Makefile | 3 ++- gles2.imports | 2 ++ main.js | 37 +++++++++++++++++++++++++++++++------ test.cpp | 16 ++++++++++++++-- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index c2171a2..40629ad 100644 --- 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 diff --git a/gles2.imports b/gles2.imports index 0982053..39ff0a1 100644 --- a/gles2.imports +++ b/gles2.imports @@ -11,3 +11,5 @@ glBufferData glGetAttribLocation glEnableVertexAttribArray glVertexAttribPointer +glGetUniformLocation +glUniformMatrix4fv 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); }) diff --git a/test.cpp b/test.cpp index 065ed80..cbdf370 100644 --- a/test.cpp +++ b/test.cpp @@ -1,11 +1,15 @@ #include #include #include +#include +#include +#include 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)); +} -- 2.30.2