From 903dedafd1cfe741956aae5144ff0fc3049acbb1 Mon Sep 17 00:00:00 2001 From: Xevion Date: Sun, 14 Apr 2024 01:35:42 -0500 Subject: [PATCH] Strip to hello-world repo --- .cargo/config.toml | 2 +- .github/workflows/deploy.yaml | 2 +- Cargo.toml | 2 +- scripts/build-wasm.sh | 13 --- scripts/build.sh | 45 +++++++++ scripts/serve-wasm.sh | 8 -- src/main.rs | 178 ++++++++-------------------------- 7 files changed, 91 insertions(+), 159 deletions(-) delete mode 100755 scripts/build-wasm.sh create mode 100755 scripts/build.sh delete mode 100755 scripts/serve-wasm.sh diff --git a/.cargo/config.toml b/.cargo/config.toml index 91cc6cc..c65e3bb 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -4,7 +4,7 @@ rustflags = [ # "-O", "-C", "link-args=-O2 --profiling", #"-C", "link-args=-O3 --closure 1", # "-C", "link-args=-sASYNCIFY -sALLOW_MEMORY_GROWTH=1", - "-C", "link-args=-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS=['png']", + # "-C", "link-args=-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS=['png']", # USE_OGG, USE_VORBIS for OGG/VORBIS usage # "-C", "link-args=--preload-file assets/", ] diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index c01786b..b20dce3 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -26,7 +26,7 @@ jobs: uses: Swatinem/rust-cache@v1 - name: Build # build - run: ./scripts/build-wasm.sh + run: ./scripts/build.sh -r - name: Upload Artifact uses: actions/upload-pages-artifact@v2 diff --git a/Cargo.toml b/Cargo.toml index 1941064..7e6df01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,6 @@ colors-transform = "0.2.11" lazy_static = "1.4.0" sdl2 = { version = "0.36", features = ["image", "ttf", "mixer"] } spin_sleep = "1.1.1" -tracing = { version = "0.1.37", features = ["max_level_debug", "release_max_level_warn"]} +tracing = { version = "0.1.37", features = ["max_level_debug", "release_max_level_debug"]} tracing-error = "0.2.0" tracing-subscriber = {version = "0.3.17", features = ["env-filter"]} diff --git a/scripts/build-wasm.sh b/scripts/build-wasm.sh deleted file mode 100755 index f0b95e2..0000000 --- a/scripts/build-wasm.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# set -eu - -echo "Building WASM with Emscripten" -cargo build --target=wasm32-unknown-emscripten --release - -echo "Copying release files to dist/" -mkdir -p dist -output_folder="target/wasm32-unknown-emscripten/release" -cp $output_folder/pacman.wasm dist -cp $output_folder/pacman.js dist -cp $output_folder/deps/pacman.data dist -cp assets/index.html dist \ No newline at end of file diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..6ad8956 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,45 @@ +#!/bin/bash +set -eu + +release='false' +serve='false' + +print_usage() { + printf "Usage: -r RELEASE -d DEBUG -s SERVE\n" +} + +while getopts 'rds' flag; do + case "${flag}" in + r) release='true' ;; + d) release='false' ;; + s) serve='true' ;; + *) print_usage + exit 1 ;; + esac +done + +echo "Activating Emscripten" +./../emsdk/emsdk activate latest +source ../emsdk/emsdk_env.sh +export EMCC_CFLAGS="-s USE_SDL=2" + +echo "Building WASM with Emscripten" +build_type='debug' +if [ "$release" = 'true' ]; then + cargo build --target=wasm32-unknown-emscripten --release + build_type='release' +else + cargo build --target=wasm32-unknown-emscripten +fi + +echo "Copying WASM files" +mkdir -p dist +output_folder="target/wasm32-unknown-emscripten/$build_type" +cp assets/index.html dist +cp $output_folder/pacman.wasm dist +cp $output_folder/pacman.js dist + +if [ "$serve" = 'true' ]; then +echo "Serving WASM with Emscripten" + python3 -m http.server -d ./dist/ 8080 +fi \ No newline at end of file diff --git a/scripts/serve-wasm.sh b/scripts/serve-wasm.sh deleted file mode 100755 index c070980..0000000 --- a/scripts/serve-wasm.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -set -eu - -echo "Building WASM with Emscripten" -./scripts/build-wasm.sh - -echo "Serving WASM with Emscripten" -python3 -m http.server -d ./dist/ 8080 \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 40f8749..73f6e43 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,153 +1,61 @@ -use sdl2::event::{Event, WindowEvent}; -use std::time::{Duration, Instant}; -use tracing::event; -use tracing_error::ErrorLayer; -use tracing_subscriber::layer::SubscriberExt; +use std::cell::RefCell; +use std::rc::Rc; -#[cfg(target_family = "wasm")] -pub mod emscripten; +use sdl2::rect::Rect; -pub fn main() { +use pacman::main_loop; + +// Resources +// https://developer.mozilla.org/en-US/docs/WebAssembly/Rust_to_Wasm +// https://puddleofcode.com/story/definitive-guide-to-rust-sdl2-and-emscriptem/ + +// To build locally: +// cargo run + +// To build for the web: +// rustup target add asmjs-unknown-emscripten +// export EMCC_CFLAGS="-s USE_SDL=2" +// cargo build --target asmjs-unknown-emscripten && open index.html +fn main() { let ctx = sdl2::init().unwrap(); - let video = ctx.video().unwrap(); + let video_ctx = ctx.video().unwrap(); - // Setup tracing - let subscriber = tracing_subscriber::fmt() - .with_ansi(cfg!(not(target_os = "emscripten"))) - .with_max_level(tracing::Level::DEBUG) - .finish() - .with(ErrorLayer::default()); - - tracing::subscriber::set_global_default(subscriber).expect("Could not set global default"); - - let window = video - .window("SDL2 Test", 800, 800) + let window = match video_ctx + .window("Hello, Rust / SDL2 / WASM!", 640, 480) .position_centered() .opengl() - .build() - .expect("Could not initialize window"); - - let mut canvas = window - .into_canvas() - .present_vsync() - .build() - .expect("Could not build canvas"); - - canvas - .set_logical_size(800, 800) - .expect("Could not set logical size"); - - // let texture_creator = canvas.texture_creator(); - - let mut event_pump = ctx - .event_pump() - .expect("Could not get SDL EventPump"); - - let loop_time = Duration::from_secs(1) / 60; - let mut shown = true; - - // The start of a period of time over which we average the frame time. - let mut sleep_time = Duration::ZERO; - - let mut main_loop = move || { - let start = Instant::now(); - - // TODO: Fix key repeat delay issues by using VecDeque for instant key repeat - // for event in event_pump.poll_iter() { - // match event { - // Event::Window { win_event, .. } => match win_event { - // WindowEvent::Hidden => { - // event!(tracing::Level::WARN, "Window hidden"); - // shown = false; - // } - // WindowEvent::Shown => { - // event!(tracing::Level::WARN, "Window shown"); - // shown = true; - // } - // _ => {} - // }, - // // Handle quitting keys or window close - // Event::KeyDown { - // keycode: Some(sdl2::keyboard::Keycode::Escape), - // .. - // } - // | Event::Quit { .. } => { - // event!(tracing::Level::INFO, "Exit requested. Exiting..."); - // return; - // } - // _ => { - // event!(tracing::Level::WARN, "Unhandled event: {:?}", event); - // } - // } - // } - - if shown { - // Set background to black - canvas.set_draw_color(sdl2::pixels::Color::RGB(0, 0, 0)); - canvas.clear(); - - // // Draw a square under the mouse - // let mouse_state = event_pump.mouse_state(); - // let mouse_x = mouse_state.x(); - // let mouse_y = mouse_state.y(); - // let square = sdl2::rect::Rect::new(mouse_x - 25, mouse_y - 25, 50, 50); - - // canvas.set_draw_color(sdl2::pixels::Color::RGB(0, 255, 255)); - // canvas.fill_rect(square).unwrap(); - - // canvas.set_draw_color(sdl2::pixels::Color::RGBA(255, 255, 255, 50)); - // canvas - // .draw_line( - // sdl2::rect::Point::new(0, 0), - // sdl2::rect::Point::new(mouse_x, mouse_y), - // ) - // .unwrap(); - - canvas.present(); - - event!( - tracing::Level::WARN, - "Loop took: {:?} (max {:?})", - start.elapsed(), - loop_time - ); - - if start.elapsed() < loop_time { - let time = loop_time.saturating_sub(start.elapsed()); - if time != Duration::ZERO { - #[cfg(not(target_os = "emscripten"))] - { - spin_sleep::sleep(time); - } - #[cfg(target_os = "emscripten")] - { - std::thread::sleep(time); - } - } - sleep_time += time; - } else { - event!( - tracing::Level::WARN, - "Game loop behind schedule by: {:?}", - start.elapsed() - loop_time - ); - } - } + .build() { + Ok(window) => window, + Err(err) => panic!("failed to create window: {}", err) }; - #[cfg(target_family = "wasm")] - use crate::emscripten; + let canvas = match window + .into_canvas() + .present_vsync() + .build() { + Ok(canvas) => canvas, + Err(err) => panic!("failed to create canvas: {}", err) + }; + + let rect = Rect::new(0, 0, 10, 10); + + let ctx = Rc::new(RefCell::new(ctx)); + let rect = Rc::new(RefCell::new(rect)); + let canvas = Rc::new(RefCell::new(canvas)); #[cfg(target_family = "wasm")] - emscripten::set_main_loop_callback(main_loop); + use pacman::emscripten; + + #[cfg(target_family = "wasm")] + emscripten::set_main_loop_callback(main_loop(Rc::clone(&ctx), Rc::clone(&rect), Rc::clone(&canvas))); #[cfg(not(target_family = "wasm"))] { use std::thread::sleep; + use std::time::Duration; loop { - // main_loop(Rc::clone(&ctx), Rc::clone(&rect), Rc::clone(&canvas))(); - main_loop(); + main_loop(Rc::clone(&ctx), Rc::clone(&rect), Rc::clone(&canvas))(); sleep(Duration::from_millis(10)) } } -} +} \ No newline at end of file