2024-11-13 16:46:30 +01:00
|
|
|
var scale = 7;
|
|
|
|
|
|
|
|
var global_instance;
|
2024-11-14 11:05:49 +01:00
|
|
|
var global_memory;
|
|
|
|
|
|
|
|
function wasm_variable(name)
|
|
|
|
{
|
|
|
|
return global_memory[global_instance.exports[name].value / 4];
|
|
|
|
}
|
2024-11-15 12:29:27 +01:00
|
|
|
function wasm_set_variable(name, val)
|
|
|
|
{
|
|
|
|
return global_memory[global_instance.exports[name].value / 4] = val;
|
|
|
|
}
|
2024-11-14 11:05:49 +01:00
|
|
|
function wasm_function(name)
|
|
|
|
{
|
|
|
|
return global_instance.exports[name];
|
|
|
|
}
|
2024-10-14 21:42:29 +02:00
|
|
|
|
|
|
|
window.onload = () => {
|
|
|
|
var scale_but = document.getElementById("scaling");
|
|
|
|
var descale_but = document.getElementById("descaling");
|
|
|
|
var scale_p = document.getElementById("scale");
|
2024-11-13 16:46:30 +01:00
|
|
|
var reset_but = document.getElementById("reset");
|
2024-11-14 12:40:52 +01:00
|
|
|
var canvas = document.getElementById("demo-canvas");
|
2024-11-15 12:29:27 +01:00
|
|
|
var pengers_img = document.getElementsByClassName('penger-img');
|
2024-10-14 21:42:29 +02:00
|
|
|
scale_p.innerText = "scale: " + scale;
|
|
|
|
scale_but.onclick = () => {
|
|
|
|
scale++;
|
|
|
|
scale_p.innerText = "scale: " + scale;
|
|
|
|
}
|
|
|
|
descale_but.onclick = () => {
|
|
|
|
scale--;
|
|
|
|
scale_p.innerText = "scale: " + scale;
|
|
|
|
}
|
2024-11-13 16:46:30 +01:00
|
|
|
reset_but.onclick = () => {
|
2024-11-14 11:05:49 +01:00
|
|
|
wasm_function('set_velocity')(0, 0);
|
2024-11-13 16:46:30 +01:00
|
|
|
}
|
2024-11-14 12:40:52 +01:00
|
|
|
canvas.onmousemove = (e) => {
|
|
|
|
var r = canvas.getBoundingClientRect();
|
|
|
|
wasm_function('set_mouse')(e.clientX - r.x, e.clientY - r.y);
|
|
|
|
}
|
2024-11-15 12:29:27 +01:00
|
|
|
for (var i = 0; i < pengers_img.length; i++) {
|
|
|
|
pengers_img[i].onclick = (e) => {wasm_set_variable('id', e.target.getAttribute('penger-id'))}
|
|
|
|
}
|
2024-10-14 21:42:29 +02:00
|
|
|
};
|
|
|
|
|
2024-11-14 11:05:49 +01:00
|
|
|
(async() => {
|
|
|
|
|
|
|
|
// jsp, je l'ai pris de la: https://github.com/tsoding/olive.c
|
2024-10-14 21:42:29 +02:00
|
|
|
function make_environment(...envs) {
|
|
|
|
return new Proxy(envs, {
|
|
|
|
get(target, prop, receiver) {
|
|
|
|
for (let env of envs) {
|
|
|
|
if (env.hasOwnProperty(prop)) {
|
|
|
|
return env[prop];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (...args) => {console.error("NOT IMPLEMENTED: "+prop, args)}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const { instance } = await WebAssembly.instantiateStreaming(fetch("./app.wasm"), {
|
|
|
|
"env": make_environment({
|
2024-11-14 11:05:49 +01:00
|
|
|
// importer les fonctions dans le wasm
|
2024-10-14 21:42:29 +02:00
|
|
|
'random': Math.random,
|
2024-11-14 12:40:52 +01:00
|
|
|
'sqrtf': Math.sqrt,
|
2024-11-13 16:46:30 +01:00
|
|
|
'get_scale': () => {return scale},
|
2024-10-14 21:42:29 +02:00
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
const memory = new Uint32Array(instance.exports.memory.buffer);
|
|
|
|
|
2024-11-14 11:05:49 +01:00
|
|
|
global_instance = instance;
|
|
|
|
global_memory = memory;
|
|
|
|
|
|
|
|
const width = wasm_variable('width');
|
|
|
|
const height = wasm_variable('height');
|
2024-10-14 21:42:29 +02:00
|
|
|
|
|
|
|
const canvas = document.getElementById("demo-canvas");
|
|
|
|
canvas.width = width;
|
|
|
|
canvas.height = height;
|
|
|
|
|
2024-11-14 11:05:49 +01:00
|
|
|
// recup image de la memoire du wasm
|
2024-10-14 21:42:29 +02:00
|
|
|
const buffer_address = instance.exports.BUFFER.value;
|
|
|
|
const image = new ImageData(
|
|
|
|
new Uint8ClampedArray(
|
|
|
|
instance.exports.memory.buffer,
|
|
|
|
buffer_address,
|
|
|
|
4 * width * height,
|
|
|
|
),
|
|
|
|
width,
|
|
|
|
);
|
|
|
|
|
|
|
|
const ctx = canvas.getContext("2d");
|
|
|
|
|
2024-11-14 11:05:49 +01:00
|
|
|
wasm_function('init')();
|
2024-10-14 21:42:29 +02:00
|
|
|
|
|
|
|
let prev = null;
|
|
|
|
function first(timestamp) {
|
2024-11-15 12:29:27 +01:00
|
|
|
wasm_set_variable('id', Math.random() * document.getElementsByClassName('penger-img').length);
|
2024-10-14 21:42:29 +02:00
|
|
|
prev = timestamp;
|
2024-11-14 11:05:49 +01:00
|
|
|
wasm_function('draw')(0.16);
|
2024-10-14 21:42:29 +02:00
|
|
|
window.requestAnimationFrame(loop);
|
|
|
|
}
|
|
|
|
function loop(timestamp) {
|
|
|
|
const dt = timestamp - prev;
|
|
|
|
prev = timestamp;
|
|
|
|
|
2024-11-14 11:05:49 +01:00
|
|
|
wasm_function('draw')(dt/1000);
|
2024-10-14 21:42:29 +02:00
|
|
|
ctx.putImageData(image, 0, 0);
|
|
|
|
window.requestAnimationFrame(loop);
|
|
|
|
}
|
|
|
|
window.requestAnimationFrame(first);
|
|
|
|
|
2024-11-13 16:46:30 +01:00
|
|
|
addEventListener('keydown', (e) => {
|
2024-11-14 11:05:49 +01:00
|
|
|
wasm_function('key_pressed')(e.keyCode);
|
2024-11-15 12:47:56 +01:00
|
|
|
if(["Space","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].indexOf(e.code) > -1) {
|
|
|
|
e.preventDefault();
|
|
|
|
}
|
2024-11-13 16:46:30 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
addEventListener('keyup', (e) => {
|
2024-11-14 11:05:49 +01:00
|
|
|
wasm_function('key_released')(e.keyCode);
|
2024-11-13 16:46:30 +01:00
|
|
|
});
|
|
|
|
|
2024-10-14 21:42:29 +02:00
|
|
|
})()
|