diff options
author | Mitya Selivanov <automainint@guattari.tech> | 2025-01-18 12:03:37 +0100 |
---|---|---|
committer | Mitya Selivanov <automainint@guattari.tech> | 2025-01-18 12:03:37 +0100 |
commit | 23edbfe1d413e3d6a6fa58a987f693729bc72eaf (patch) | |
tree | 3382ce019084782c48bdf2ff4d1eda383ea69745 /juliaset/index.htm | |
parent | 217863fac7f0ba1b47745e19a5bed2f3bc55a0cc (diff) | |
download | static-23edbfe1d413e3d6a6fa58a987f693729bc72eaf.zip |
Update Julia Set
Diffstat (limited to 'juliaset/index.htm')
-rw-r--r-- | juliaset/index.htm | 160 |
1 files changed, 132 insertions, 28 deletions
diff --git a/juliaset/index.htm b/juliaset/index.htm index 47d2a69..130e619 100644 --- a/juliaset/index.htm +++ b/juliaset/index.htm @@ -47,6 +47,7 @@ floor : Math.floor, ceil : Math.ceil, + trunc : Math.trunc, sqrt : Math.sqrt, cbrt : Math.cbrt, pow : Math.pow, @@ -75,7 +76,14 @@ this.sound_buffer_address = program.exports.js_sound_buffer(); this.pixels_address = program.exports.js_pixels(); - this.frames = new Float32Array(this.memory_buffer, this.sound_buffer_address, program.exports.js_max_num_sound_frames()); + this.max_drop_size = program.exports.js_max_drop_size(); + this.drop_address = program.exports.js_drop_buffer(); + + this.frames = new Float32Array( + this.memory_buffer, + this.sound_buffer_address, + program.exports.js_max_num_sound_frames() + ); let title_address = program.exports.js_title(); @@ -159,6 +167,50 @@ this.program.exports.js_keydown(ev.key, ev.mod, ev.ch); }, + + dragenter : (ev) => { + if (this.program === undefined) + return; + + this.program.exports.js_dragenter(); + }, + + dragleave : (ev) => { + if (this.program === undefined) + return; + + this.program.exports.js_dragenter(); + }, + + drop : (ev) => { + if (this.program === undefined) + return; + + for (let f of ev.files) { + if (f.name.byteLength + f.data.byteLength > this.max_drop_size) { + console.error("File too big"); + continue; + } + + new Uint8Array( + this.memory_buffer, + this.drop_address, + f.name.byteLength + ).set( + new Uint8Array(f.name) + ); + + new Uint8Array( + this.memory_buffer, + this.drop_address + f.name.byteLength, + f.data.byteLength + ).set( + new Uint8Array(f.data) + ); + + this.program.exports.js_drop(f.name.byteLength, f.data.byteLength); + } + }, }; this.port.onmessage = (ev) => { @@ -222,35 +274,26 @@ let program = await WebAssembly.instantiate( wasm, { - wasi_snapshot_preview1 : { - clock_time_get : () => {}, - args_sizes_get : () => {}, - args_get : () => {}, - proc_exit : () => {}, - fd_close : () => {}, - fd_write : () => {}, - fd_seek : () => {}, - }, env : { p_clipboard_write_impl : () => {}, p_time_impl : () => {}, - - floor : () => {}, - ceil : () => {}, - sqrt : () => {}, - cbrt : () => {}, - pow : () => {}, - log : () => {}, - log2 : () => {}, - log10 : () => {}, - exp : () => {}, - sin : () => {}, - cos : () => {}, - tan : () => {}, - asin : () => {}, - acos : () => {}, - atan : () => {}, - atan2 : () => {}, + floor : () => {}, + ceil : () => {}, + trunc : () => {}, + sqrt : () => {}, + cbrt : () => {}, + pow : () => {}, + log : () => {}, + log2 : () => {}, + log10 : () => {}, + exp : () => {}, + sin : () => {}, + cos : () => {}, + tan : () => {}, + asin : () => {}, + acos : () => {}, + atan : () => {}, + atan2 : () => {}, }, } ); @@ -567,7 +610,6 @@ }); window.addEventListener("wheel", (ev) => { - ev.preventDefault(); if (!sound_ready) return; @@ -591,6 +633,68 @@ ch : paste_ch, }); }); + + canvas.addEventListener("dragover", (ev) => { + ev.preventDefault(); + if (!sound_ready) { + ev.dataTransfer.dropEffect = "none"; + return; + } + + if (ev.clientX != undefined && ev.clientY != undefined) + sound_node.port.postMessage({ + id : "mousemove", + x : ev.clientX, + y : ev.clientY, + }); + }); + + canvas.addEventListener("dragenter", (ev) => { + ev.preventDefault(); + if (!sound_ready) + return; + + sound_node.port.postMessage({ + id : "dragenter", + }); + }); + + canvas.addEventListener("dragleave", (ev) => { + ev.preventDefault(); + if (!sound_ready) + return; + + sound_node.port.postMessage({ + id : "dragleave", + }); + }); + + canvas.addEventListener("drop", (ev) => { + ev.preventDefault(); + if (!sound_ready) + return; + + (async () => { + let files = []; + + for (let f of ev.dataTransfer.files) { + // Copy the buffer in case the underlaying buffer's size is larger. + let bytes = await f.bytes(); + let buffer = new ArrayBuffer(bytes.length); + new Uint8Array(buffer).set(bytes); + + files.push({ + name : new TextEncoder("utf8").encode(f.name), + data : buffer, + }); + } + + sound_node.port.postMessage({ + id : "drop", + files : files, + }); + })(); + }); } run({ |