Update wasm's runtime.js

This commit is contained in:
gingerBill
2024-09-20 11:15:47 +01:00
parent b116e8ff55
commit 02884207d5
2 changed files with 124 additions and 45 deletions
+17
View File
@@ -8,9 +8,15 @@ foreign dom_lib {
get_element_value_f64 :: proc(id: string) -> f64 --- get_element_value_f64 :: proc(id: string) -> f64 ---
set_element_value_f64 :: proc(id: string, value: f64) --- set_element_value_f64 :: proc(id: string, value: f64) ---
get_element_key_f64 :: proc(id: string, key: string) -> f64 ---
set_element_key_f64 :: proc(id: string, key: string, value: f64) ---
set_element_value_string :: proc(id: string, value: string) --- set_element_value_string :: proc(id: string, value: string) ---
get_element_value_string_length :: proc(id: string) -> int --- get_element_value_string_length :: proc(id: string) -> int ---
set_element_key_string :: proc(id: string, key: string, value: string) ---
get_element_key_string_length :: proc(id: string, key: string, ) -> int ---
device_pixel_ratio :: proc() -> f64 --- device_pixel_ratio :: proc() -> f64 ---
window_set_scroll :: proc(x, y: f64) --- window_set_scroll :: proc(x, y: f64) ---
@@ -24,10 +30,21 @@ get_element_value_string :: proc "contextless" (id: string, buf: []byte) -> stri
} }
n := _get_element_value_string(id, buf) n := _get_element_value_string(id, buf)
return string(buf[:n]) return string(buf[:n])
}
get_element_key_string :: proc "contextless" (id: string, key: string, buf: []byte) -> string {
@(default_calling_convention="contextless")
foreign dom_lib {
@(link_name="get_element_key_string")
_get_element_key_string :: proc(id: string, key: string, buf: []byte) -> int ---
}
n := _get_element_key_string(id, key, buf)
return string(buf[:n])
} }
get_element_min_max :: proc "contextless" (id: string) -> (min, max: f64) { get_element_min_max :: proc "contextless" (id: string) -> (min, max: f64) {
@(default_calling_convention="contextless") @(default_calling_convention="contextless")
foreign dom_lib { foreign dom_lib {
+107 -45
View File
@@ -108,7 +108,7 @@ class WasmMemoryInterface {
const bytes = this.loadBytes(ptr, Number(len)); const bytes = this.loadBytes(ptr, Number(len));
return new TextDecoder().decode(bytes); return new TextDecoder().decode(bytes);
} }
loadCstring(ptr) { loadCstring(ptr) {
const start = this.loadPtr(ptr); const start = this.loadPtr(ptr);
if (start == 0) { if (start == 0) {
@@ -1259,7 +1259,7 @@ class WebGLInterface {
}; };
function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory, eventQueue, event_temp) {
const MAX_INFO_CONSOLE_LINES = 512; const MAX_INFO_CONSOLE_LINES = 512;
let infoConsoleLines = new Array(); let infoConsoleLines = new Array();
let currentLine = {}; let currentLine = {};
@@ -1377,10 +1377,8 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
info.scrollTop = info.scrollHeight; info.scrollTop = info.scrollHeight;
}; };
let event_temp_data = {};
let webglContext = new WebGLInterface(wasmMemoryInterface); let webglContext = new WebGLInterface(wasmMemoryInterface);
const env = {}; const env = {};
if (memory) { if (memory) {
@@ -1455,9 +1453,13 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
let wmi = wasmMemoryInterface; let wmi = wasmMemoryInterface;
let e = event_temp_data.event; if (!event_temp.data) {
return;
}
wmi.storeU32(off(4), event_temp_data.name_code); let e = event_temp.data.event;
wmi.storeU32(off(4), event_temp.data.name_code);
if (e.target == document) { if (e.target == document) {
wmi.storeU32(off(4), 1); wmi.storeU32(off(4), 1);
} else if (e.target == window) { } else if (e.target == window) {
@@ -1475,8 +1477,8 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
align(W); align(W);
wmi.storeI32(off(W), event_temp_data.id_ptr); wmi.storeI32(off(W), event_temp.data.id_ptr);
wmi.storeUint(off(W), event_temp_data.id_len); wmi.storeUint(off(W), event_temp.data.id_len);
align(8); align(8);
wmi.storeF64(off(8), e.timeStamp*1e-3); wmi.storeF64(off(8), e.timeStamp*1e-3);
@@ -1518,7 +1520,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
} else if (e instanceof KeyboardEvent) { } else if (e instanceof KeyboardEvent) {
// Note: those strings are constructed // Note: those strings are constructed
// on the native side from buffers that // on the native side from buffers that
// are filled later, so skip them // are filled later, so skip them
const keyPtr = off(W*2, W); const keyPtr = off(W*2, W);
const codePtr = off(W*2, W); const codePtr = off(W*2, W);
@@ -1552,12 +1554,30 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
} }
let listener = (e) => { let listener = (e) => {
const odin_ctx = wasmMemoryInterface.exports.default_context_ptr(); let event_data = {};
event_temp_data.id_ptr = id_ptr; event_data.id_ptr = id_ptr;
event_temp_data.id_len = id_len; event_data.id_len = id_len;
event_temp_data.event = e; event_data.event = e;
event_temp_data.name_code = name_code; event_data.name_code = name_code;
wasmMemoryInterface.exports.odin_dom_do_event_callback(data, callback, odin_ctx);
eventQueue.push({event_data: event_data, data: data, callback: callback});
};
wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener;
element.addEventListener(name, listener, !!use_capture);
return true;
},
add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => {
let name = wasmMemoryInterface.loadString(name_ptr, name_len);
let element = window;
let listener = (e) => {
let event_data = {};
event_data.id_ptr = 0;
event_data.id_len = 0;
event_data.event = e;
event_data.name_code = name_code;
eventQueue.push({event_data: event_data, data: data, callback: callback});
}; };
wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener; wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener;
element.addEventListener(name, listener, !!use_capture); element.addEventListener(name, listener, !!use_capture);
@@ -1579,24 +1599,6 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
element.removeEventListener(name, listener); element.removeEventListener(name, listener);
return true; return true;
}, },
add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => {
let name = wasmMemoryInterface.loadString(name_ptr, name_len);
let element = window;
let listener = (e) => {
const odin_ctx = wasmMemoryInterface.exports.default_context_ptr();
event_temp_data.id_ptr = 0;
event_temp_data.id_len = 0;
event_temp_data.event = e;
event_temp_data.name_code = name_code;
wasmMemoryInterface.exports.odin_dom_do_event_callback(data, callback, odin_ctx);
};
wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener;
element.addEventListener(name, listener, !!use_capture);
return true;
},
remove_window_event_listener: (name_ptr, name_len, data, callback) => { remove_window_event_listener: (name_ptr, name_len, data, callback) => {
let name = wasmMemoryInterface.loadString(name_ptr, name_len); let name = wasmMemoryInterface.loadString(name_ptr, name_len);
let element = window; let element = window;
@@ -1612,18 +1614,18 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
}, },
event_stop_propagation: () => { event_stop_propagation: () => {
if (event_temp_data && event_temp_data.event) { if (event_temp.data && event_temp.data.event) {
event_temp_data.event.stopPropagation(); event_temp.data.event.stopPropagation();
} }
}, },
event_stop_immediate_propagation: () => { event_stop_immediate_propagation: () => {
if (event_temp_data && event_temp_data.event) { if (event_temp.data && event_temp.data.event) {
event_temp_data.event.stopImmediatePropagation(); event_temp.data.event.stopImmediatePropagation();
} }
}, },
event_prevent_default: () => { event_prevent_default: () => {
if (event_temp_data && event_temp_data.event) { if (event_temp.data && event_temp.data.event) {
event_temp_data.event.preventDefault(); event_temp.data.event.preventDefault();
} }
}, },
@@ -1696,6 +1698,55 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
} }
}, },
get_element_key_f64: (id_ptr, id_len, key_ptr, key_len) => {
let id = wasmMemoryInterface.loadString(id_ptr, id_len);
let key = wasmMemoryInterface.loadString(key_ptr, key_len);
let element = getElement(id);
return element ? element[key] : 0;
},
get_element_key_string: (id_ptr, id_len, key_ptr, key_len, buf_ptr, buf_len) => {
let id = wasmMemoryInterface.loadString(id_ptr, id_len);
let key = wasmMemoryInterface.loadString(key_ptr, key_len);
let element = getElement(id);
if (element) {
let str = element[key];
if (buf_len > 0 && buf_ptr) {
let n = Math.min(buf_len, str.length);
str = str.substring(0, n);
this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(str))
return n;
}
}
return 0;
},
get_element_key_string_length: (id_ptr, id_len, key_ptr, key_len) => {
let id = wasmMemoryInterface.loadString(id_ptr, id_len);
let key = wasmMemoryInterface.loadString(key_ptr, key_len);
let element = getElement(id);
if (element && element[key]) {
return element[key].length;
}
return 0;
},
set_element_key_f64: (id_ptr, id_len, key_ptr, key_len, value) => {
let id = wasmMemoryInterface.loadString(id_ptr, id_len);
let key = wasmMemoryInterface.loadString(key_ptr, key_len);
let element = getElement(id);
if (element) {
element[key] = value;
}
},
set_element_key_string: (id_ptr, id_len, key_ptr, key_len, value_ptr, value_len) => {
let id = wasmMemoryInterface.loadString(id_ptr, id_len);
let key = wasmMemoryInterface.loadString(key_ptr, key_len);
let value = wasmMemoryInterface.loadString(value_ptr, value_len);
let element = getElement(id);
if (element) {
element[key] = value;
}
},
get_bounding_client_rect: (rect_ptr, id_ptr, id_len) => { get_bounding_client_rect: (rect_ptr, id_ptr, id_len) => {
let id = wasmMemoryInterface.loadString(id_ptr, id_len); let id = wasmMemoryInterface.loadString(id_ptr, id_len);
@@ -1750,7 +1801,10 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory
} }
wasmMemoryInterface.setIntSize(intSize); wasmMemoryInterface.setIntSize(intSize);
let imports = odinSetupDefaultImports(wasmMemoryInterface, consoleElement, wasmMemoryInterface.memory); let eventQueue = new Array();
let event_temp = {};
let imports = odinSetupDefaultImports(wasmMemoryInterface, consoleElement, wasmMemoryInterface.memory, eventQueue, event_temp);
let exports = {}; let exports = {};
if (extraForeignImports !== undefined) { if (extraForeignImports !== undefined) {
@@ -1775,14 +1829,14 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory
exports._start(); exports._start();
// Define a `@export step :: proc(dt: f32) -> (keep_going: bool) {` // Define a `@export step :: proc(current_type: f64) -> (keep_going: bool) {`
// in your app and it will get called every frame. // in your app and it will get called every frame.
// return `false` to stop the execution of the module. // return `false` to stop the execution of the module.
if (exports.step) { if (exports.step) {
const odin_ctx = exports.default_context_ptr(); const odin_ctx = exports.default_context_ptr();
let prevTimeStamp = undefined; let prevTimeStamp = undefined;
const step = (currTimeStamp) => { function step(currTimeStamp) {
if (prevTimeStamp == undefined) { if (prevTimeStamp == undefined) {
prevTimeStamp = currTimeStamp; prevTimeStamp = currTimeStamp;
} }
@@ -1790,13 +1844,21 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory
const dt = (currTimeStamp - prevTimeStamp)*0.001; const dt = (currTimeStamp - prevTimeStamp)*0.001;
prevTimeStamp = currTimeStamp; prevTimeStamp = currTimeStamp;
if (!exports.step(dt, odin_ctx)) { for (let i = 0; i < eventQueue.length; i++) {
let e = eventQueue[i];
event_temp.data = e.event_data;
exports.odin_dom_do_event_callback(e.data, e.callback, odin_ctx);
}
event_temp.data = null;
eventQueue.length = 0;
if (!exports.step(currTimeStamp*0.001, odin_ctx)) {
exports._end(); exports._end();
return; return;
} }
window.requestAnimationFrame(step); window.requestAnimationFrame(step);
}; }
window.requestAnimationFrame(step); window.requestAnimationFrame(step);
} else { } else {