sketch out os api, binary stream writer in js, app sleep when no animation, local and universal time
This commit is contained in:
@@ -33,6 +33,33 @@
|
||||
</html>
|
||||
<script>
|
||||
|
||||
class stream_t {
|
||||
constructor(dataview, ptr, len) {
|
||||
this.dv = dataview;
|
||||
this.ptr = ptr;
|
||||
this.len = len;
|
||||
this.i = 0;
|
||||
}
|
||||
|
||||
write_u32(value) {
|
||||
if (this.i + 4 <= this.len) {
|
||||
this.dv.setUint32(this.ptr + this.i, value, true);
|
||||
this.i += 4;
|
||||
} else {
|
||||
console.log("reached end of buffer while stream writing");
|
||||
}
|
||||
}
|
||||
|
||||
write_u16(value) {
|
||||
if (this.i + 2 <= this.len) {
|
||||
this.dv.setUint16(this.ptr + this.i, value, true);
|
||||
this.i += 2;
|
||||
} else {
|
||||
console.log("reached end of buffer while stream writing");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class memory_t {
|
||||
exports = null; // this is set after wasm module created
|
||||
constructor(wasm_memory) {
|
||||
@@ -58,12 +85,16 @@ class memory_t {
|
||||
this.u8[ptr + i] = 0;
|
||||
}
|
||||
|
||||
write_string(temp, string) {
|
||||
write_string_to_cglobal(temp, string) {
|
||||
const ptr = this.exports[temp].value;
|
||||
const len = this.data_view.getInt32(this.exports[temp + "_len"].value, true);
|
||||
this.write_string_into_cmemory(ptr, len, string);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
stream_write(ptr, len) {
|
||||
return new stream_t(this.data_view, ptr, len);
|
||||
}
|
||||
}
|
||||
|
||||
const canvas = document.getElementById("canvas");
|
||||
@@ -78,7 +109,36 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
|
||||
|
||||
const request = await fetch('main.wasm');
|
||||
const binary = await request.arrayBuffer();
|
||||
const wasm_imports = {
|
||||
|
||||
const wasm_os_imports = {
|
||||
wasm_local_time_now: (ptr, len) => {
|
||||
const date = new Date();
|
||||
const stream = mem.stream_write(ptr, len);
|
||||
stream.write_u16(date.getMilliseconds());
|
||||
stream.write_u16(date.getSeconds());
|
||||
stream.write_u16(date.getMinutes());
|
||||
stream.write_u16(date.getHours());
|
||||
stream.write_u16(date.getDate());
|
||||
stream.write_u16(date.getMonth());
|
||||
stream.write_u16(date.getFullYear());
|
||||
},
|
||||
|
||||
wasm_universal_time_now: (ptr, len) => {
|
||||
const date = new Date();
|
||||
const stream = mem.stream_write(ptr, len);
|
||||
stream.write_u16(date.getUTCMilliseconds());
|
||||
stream.write_u16(date.getUTCSeconds());
|
||||
stream.write_u16(date.getUTCMinutes());
|
||||
stream.write_u16(date.getUTCHours());
|
||||
stream.write_u16(date.getUTCDate());
|
||||
stream.write_u16(date.getUTCMonth());
|
||||
stream.write_u16(date.getUTCFullYear());
|
||||
},
|
||||
|
||||
wasm_milliseconds_now: () => { return performance.now(); },
|
||||
};
|
||||
|
||||
let wasm_app_imports = {
|
||||
|
||||
// core
|
||||
memory: mem.mem,
|
||||
@@ -86,7 +146,6 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
|
||||
wasm_alert: (str, len) => { alert(mem.read_cstr(str,len)); },
|
||||
wasm_trap: () => { throw new Error(); },
|
||||
wasm_write_to_console: (str, len) => { console.log(mem.read_cstr(str, len)); },
|
||||
wasm_get_milliseconds: () => { return performance.now(); },
|
||||
|
||||
// gfx
|
||||
wasm_draw_text: (str, len, x, y, font_str, font_len, font_size, r, g, b, a) => {
|
||||
@@ -125,37 +184,59 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
|
||||
|
||||
};
|
||||
|
||||
const program = await WebAssembly['instantiate'](binary, { "env": wasm_imports });
|
||||
Object.assign(wasm_app_imports, wasm_os_imports);
|
||||
|
||||
const program = await WebAssembly['instantiate'](binary, { "env": wasm_app_imports });
|
||||
const instance = program['instance'];
|
||||
const wasm_exports = instance['exports'];
|
||||
mem.exports = wasm_exports;
|
||||
wasm_exports['wasm_init']();
|
||||
|
||||
addEventListener("keydown", (event) => {
|
||||
wasm_exports["wasm_key_down"](mem.write_string("wasm_temp_buff1", event.key), event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
});
|
||||
addEventListener("keyup", (event) => {
|
||||
wasm_exports["wasm_key_up"](mem.write_string("wasm_temp_buff1", event.key), event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
});
|
||||
addEventListener("mousemove", (event) => {
|
||||
wasm_exports["wasm_mouse_move"](event.clientX, event.clientY, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
});
|
||||
addEventListener("mousedown", (event) => {
|
||||
wasm_exports["wasm_mouse_down"](event.clientX, event.clientY, event.button, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
});
|
||||
addEventListener("mouseup", (event) => {
|
||||
wasm_exports["wasm_mouse_up"](event.clientX, event.clientY, event.button, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
});
|
||||
addEventListener("wheel", (event) => {
|
||||
wasm_exports["wasm_mouse_wheel"](event.clientX, event.clientY, event.deltaX, event.deltaY, event.deltaZ, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
});
|
||||
let awake = false;
|
||||
|
||||
requestAnimationFrame(function update(time) {
|
||||
function wasm_update(time) {
|
||||
const dpr = window.devicePixelRatio;
|
||||
canvas.width = canvas.getBoundingClientRect().width * dpr;
|
||||
canvas.height = canvas.getBoundingClientRect().height * dpr;
|
||||
wasm_exports['wasm_update'](canvas.width, canvas.height, dpr);
|
||||
requestAnimationFrame(update);
|
||||
let animating = wasm_exports['wasm_update'](time, canvas.width, canvas.height, dpr);
|
||||
if (animating) {
|
||||
requestAnimationFrame(wasm_update);
|
||||
} else {
|
||||
awake = false;
|
||||
}
|
||||
}
|
||||
|
||||
function wake_up() {
|
||||
if (awake) return;
|
||||
awake = true;
|
||||
window.requestAnimationFrame(wasm_update);
|
||||
}
|
||||
|
||||
addEventListener("keydown", (event) => {
|
||||
wasm_exports["wasm_key_down"](mem.write_string_to_cglobal("wasm_temp_buff1", event.key), event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
wake_up();
|
||||
});
|
||||
addEventListener("keyup", (event) => {
|
||||
wasm_exports["wasm_key_up"](mem.write_string_to_cglobal("wasm_temp_buff1", event.key), event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
wake_up();
|
||||
});
|
||||
addEventListener("mousemove", (event) => {
|
||||
wasm_exports["wasm_mouse_move"](event.clientX, event.clientY, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
wake_up();
|
||||
});
|
||||
addEventListener("mousedown", (event) => {
|
||||
wasm_exports["wasm_mouse_down"](event.clientX, event.clientY, event.button, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
wake_up();
|
||||
});
|
||||
addEventListener("mouseup", (event) => {
|
||||
wasm_exports["wasm_mouse_up"](event.clientX, event.clientY, event.button, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
wake_up();
|
||||
});
|
||||
addEventListener("wheel", (event) => {
|
||||
wasm_exports["wasm_mouse_wheel"](event.clientX, event.clientY, event.deltaX, event.deltaY, event.deltaZ, event.ctrlKey, event.shiftKey, event.altKey, event.metaKey);
|
||||
wake_up();
|
||||
});
|
||||
|
||||
requestAnimationFrame(wasm_update);
|
||||
})()
|
||||
</script>
|
||||
Reference in New Issue
Block a user