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
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);
})
#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;
}
)";
}
)";
+GLuint program;
+
extern "C" void setup() {
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
const char* sources[1] = { vertShaderSrc };
new const GLint[1] { (GLint)strlen(fragShaderSrc) });
glCompileShader(fragShader);
- GLuint program = glCreateProgram();
+ program = glCreateProgram();
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
glLinkProgram(program);
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));
+}