From 1b3c4f596e1826fb0ea3f9743feb9879573bb9c1 Mon Sep 17 00:00:00 2001 From: Hitalo Souza <63821277+enghitalo@users.noreply.github.com> Date: Mon, 11 Dec 2023 08:10:06 -0400 Subject: [PATCH] examples: serve the wasm mandelbrot project using a v web server (#19937) --- cmd/tools/modules/testing/common.v | 4 +- examples/wasm/mandelbrot/README.md | 18 ++-- examples/wasm/mandelbrot/main.v | 29 ++++++ examples/wasm/mandelbrot/mandelbrot.html | 89 ++++++++++--------- .../{mandelbrot.v => mandelbrot.wasm.v} | 0 5 files changed, 92 insertions(+), 48 deletions(-) create mode 100644 examples/wasm/mandelbrot/main.v rename examples/wasm/mandelbrot/{mandelbrot.v => mandelbrot.wasm.v} (100%) diff --git a/cmd/tools/modules/testing/common.v b/cmd/tools/modules/testing/common.v index 77209bdac87243..5448eba9b82c4d 100644 --- a/cmd/tools/modules/testing/common.v +++ b/cmd/tools/modules/testing/common.v @@ -277,8 +277,8 @@ pub fn new_test_session(_vargs string, will_compile bool) TestSession { skip_files << 'examples/sokol/sounds/wav_player.v' skip_files << 'examples/sokol/sounds/simple_sin_tones.v' } - // examples/wasm/mandelbrot/mandelbrot.v requires special compilation flags: `-b wasm -os browser`, skip it for now: - skip_files << 'examples/wasm/mandelbrot/mandelbrot.v' + // examples/wasm/mandelbrot/mandelbrot.wasm.v requires special compilation flags: `-b wasm -os browser`, skip it for now: + skip_files << 'examples/wasm/mandelbrot/mandelbrot.wasm.v' } vargs := _vargs.replace('-progress', '') vexe := pref.vexe_path() diff --git a/examples/wasm/mandelbrot/README.md b/examples/wasm/mandelbrot/README.md index 9c4cb6c4af7994..9b7f0dda5f75f0 100644 --- a/examples/wasm/mandelbrot/README.md +++ b/examples/wasm/mandelbrot/README.md @@ -1,12 +1,20 @@ -# V Mandelbrot Example +# Run V Mandelbrot Example + +## Using only V + +``` +v run main.v +``` + +## Using Python or Emscripten 1. First, create `mandelbrot.wasm`. Compile with `-os browser`. ``` -v -b wasm -os browser mandelbrot.v +v -b wasm -os browser mandelbrot.wasm.v ``` 2. Then, open the `mandelbrot.html` file in the browser. - - CORS errors do not allow `mandelbrot.wasm` to be loaded. - - Use `python -m http.server 8080` - - Use `emrun mandelbrot.html` \ No newline at end of file + - CORS errors do not allow `mandelbrot.wasm` to be loaded. + - Use `python -m http.server 8080` + - Use `emrun mandelbrot.html` diff --git a/examples/wasm/mandelbrot/main.v b/examples/wasm/mandelbrot/main.v new file mode 100644 index 00000000000000..a3a8988ca7d81a --- /dev/null +++ b/examples/wasm/mandelbrot/main.v @@ -0,0 +1,29 @@ +module main + +import vweb +import os + +const http_port = 3001 + +struct App { + vweb.Context +} + +fn main() { + vweb.run(new_app(), http_port) +} + +fn new_app() &App { + mut app := &App{} + + os.execute_or_panic('v -b wasm -os browser mandelbrot.wasm.v') + + app.mount_static_folder_at(os.resource_abs_path('./'), '/') + return app +} + +@['/'; get] +pub fn (mut app App) controller_mandelbrot() !vweb.Result { + file := os.read_file('mandelbrot.html') or { panic(err) } + return app.html(file) +} diff --git a/examples/wasm/mandelbrot/mandelbrot.html b/examples/wasm/mandelbrot/mandelbrot.html index 7d65a3070756c2..5bc8c53d574033 100644 --- a/examples/wasm/mandelbrot/mandelbrot.html +++ b/examples/wasm/mandelbrot/mandelbrot.html @@ -1,47 +1,54 @@ - - - - - V Mandelbrot WebAssembly Example - - - - - - \ No newline at end of file + const env = { + canvas_x: () => canvas.width, + canvas_y: () => canvas.height, + setpixel: (x, y, c) => { + ctx.fillStyle = "rgba(1,1,1," + c / 255 + ")"; + ctx.fillRect(x, y, 1, 1); + }, + __writeln: (ptr, len) => { + console.log(get_string(ptr, len)); + }, + __panic_abort: (ptr, len) => { + throw get_string(ptr, len); + }, + }; + + WebAssembly.instantiateStreaming(fetch("mandelbrot.wasm"), { + env: env, + }).then((res) => { + memory = res.instance.exports["memory"]; + + console.time("main.main"); + res.instance.exports["main.main"](); + console.timeEnd("main.main"); + }); + + + diff --git a/examples/wasm/mandelbrot/mandelbrot.v b/examples/wasm/mandelbrot/mandelbrot.wasm.v similarity index 100% rename from examples/wasm/mandelbrot/mandelbrot.v rename to examples/wasm/mandelbrot/mandelbrot.wasm.v