Browse Source

Update wasm's runtime.js

gingerBill 11 months ago
parent
commit
02884207d5
2 changed files with 124 additions and 45 deletions
  1. 17 0
      vendor/wasm/js/dom.odin
  2. 107 45
      vendor/wasm/js/runtime.js

+ 17 - 0
vendor/wasm/js/dom.odin

@@ -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
vendor/wasm/js/runtime.js

@@ -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.storeUint(off(W), event_temp_data.id_len);
+				wmi.storeI32(off(W), event_temp.data.id_ptr);
+				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();
-					event_temp_data.id_ptr = id_ptr;
-					event_temp_data.id_len = id_len;
-					event_temp_data.event = e;
-					event_temp_data.name_code = name_code;
-					wasmMemoryInterface.exports.odin_dom_do_event_callback(data, callback, odin_ctx);
+					let event_data = {};
+					event_data.id_ptr = id_ptr;
+					event_data.id_len = id_len;
+					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;
+				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) {
-					event_temp_data.event.stopPropagation();
+				if (event_temp.data && event_temp.data.event) {
+					event_temp.data.event.stopPropagation();
 				}
 				}
 			},
 			},
 			event_stop_immediate_propagation: () => {
 			event_stop_immediate_propagation: () => {
-				if (event_temp_data && event_temp_data.event) {
-					event_temp_data.event.stopImmediatePropagation();
+				if (event_temp.data && event_temp.data.event) {
+					event_temp.data.event.stopImmediatePropagation();
 				}
 				}
 			},
 			},
 			event_prevent_default: () => {
 			event_prevent_default: () => {
-				if (event_temp_data && event_temp_data.event) {
-					event_temp_data.event.preventDefault();
+				if (event_temp.data && event_temp.data.event) {
+					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 {