mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Update wasm's runtime.js
This commit is contained in:
Vendored
+17
@@ -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 {
|
||||||
|
|||||||
Vendored
+104
-42
@@ -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,8 +1377,6 @@ 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 = {};
|
||||||
@@ -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);
|
||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user