Look ma! hot reload! (#16)

This commit is contained in:
Akash Shakdwipeea
2025-10-24 19:44:06 +05:30
committed by GitHub
parent 8addf60eea
commit 2a49f07d68
9 changed files with 126 additions and 37 deletions
+4
View File
@@ -42,3 +42,7 @@ target/
/wasm-pack.log /wasm-pack.log
.vscode/ .vscode/
.idea/ .idea/
# WASM build artifacts
.rsw/
static/level-editor/
+20 -18
View File
@@ -1,21 +1,36 @@
# yawn # yawn
yet another webgl ngine yet another webgl ngine
### Building
Run
```
npm run dev
```
- Open http://localhost:8080
- Write rust and see it in the browser
## accepted plans ## accepted plans
- most of the logic in service workers
- ts / webgl based - most of the logic in workers and wasm
- rust / wgpu based
- as declarative as possible - as declarative as possible
- no backwards compatibility until v1.0 - no backwards compatibility until v1.0
- as much geometric algebra as reasonable - as much geometric algebra as reasonable
## planned milestone ## planned milestone
- connect events from main thread to service worker - [done] connect events from main thread to worker
- share canvas b/w sw - [done] share canvas b/w worker
- render triangle - [done] render triangle
## Goal: All the good algorithms ## Goal: All the good algorithms
What algorithms are we planning to have, What algorithms are we planning to have,
- gpu picking? - gpu picking?
- HZB occlusion + frustum/portal culling? - HZB occlusion + frustum/portal culling?
- deferred + forward lighting? - deferred + forward lighting?
@@ -52,16 +67,3 @@ What algorithms are we planning to have,
- vr/ar? - vr/ar?
- dynamic textures? - dynamic textures?
- shadow casting? - shadow casting?
## are we gon use ogl or start from scratch?
## we need to decide architecture
- ECS?
- babylon-like
- threejs-like
- message passing?
- observables?
- events?
- runnable on a server?
- worker/main thread adaptable? or just worker?
+11
View File
@@ -13,6 +13,7 @@
"rimraf": "^5.0.1", "rimraf": "^5.0.1",
"rollup-plugin-copy": "^3.5.0", "rollup-plugin-copy": "^3.5.0",
"vite": "^7.1.10", "vite": "^7.1.10",
"vite-plugin-rsw": "^2.0.11",
"vite-plugin-wasm": "^3.3.0" "vite-plugin-wasm": "^3.3.0"
} }
}, },
@@ -3601,6 +3602,16 @@
} }
} }
}, },
"node_modules/vite-plugin-rsw": {
"version": "2.0.11",
"resolved": "https://registry.npmjs.org/vite-plugin-rsw/-/vite-plugin-rsw-2.0.11.tgz",
"integrity": "sha512-OqbGAtdDfK88gDoxA9wVdGowCmlzLSXEyRvD8CgTu9IP5O7tx8Tg2CtIzKOyOWZtHHZPhtdYiN+5Il6rTZCkzw==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"vite": ">2.8.0-0"
}
},
"node_modules/vite-plugin-wasm": { "node_modules/vite-plugin-wasm": {
"version": "3.5.0", "version": "3.5.0",
"resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.5.0.tgz", "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.5.0.tgz",
+14 -8
View File
@@ -4,10 +4,15 @@
"name": "basic", "name": "basic",
"version": "0.1.0", "version": "0.1.0",
"scripts": { "scripts": {
"wasm-dev": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' wasm-pack build --dev --out-name wasm-index --target web level-editor -- --features atomics,bulk-memory -Z build-std=panic_abort,std", "dev": "run-s rsw:build dev:watch",
"wasm-release": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' wasm-pack build --release --out-name wasm-index --target web level-editor -- --features atomics,bulk-memory -Z build-std=panic_abort,std", "dev:watch": "run-p rsw:watch dev:vite",
"wasm-renderer-dev": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' wasm-pack build --dev --out-name wasm-index --target web renderer -- --features atomics,bulk-memory -Z build-std=panic_abort,std", "dev:vite": "vite dev",
"wasm-renderer-release": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' wasm-pack build --release --out-name wasm-index --target web renderer -- --features atomics,bulk-memory -Z build-std=panic_abort,std", "rsw:watch": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' rsw watch",
"rsw:build": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' rsw build",
"wasm-dev": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' wasm-pack build --dev --target web level-editor -- --features atomics,bulk-memory -Z build-std=panic_abort,std",
"wasm-release": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' wasm-pack build --release --target web level-editor -- --features atomics,bulk-memory -Z build-std=panic_abort,std",
"wasm-renderer-dev": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' wasm-pack build --dev --target web renderer -- --features atomics,bulk-memory -Z build-std=panic_abort,std",
"wasm-renderer-release": "RUSTFLAGS='-C target-feature=+atomics,+bulk-memory,+mutable-globals -Clink-args=--shared-memory -Clink-args=--max-memory=1073741824 -Clink-args=--import-memory -Clink-args=--export=__wasm_init_tls -Clink-args=--export=__tls_size -Clink-args=--export=__tls_align -Clink-args=--export=__tls_base' wasm-pack build --release --target web renderer -- --features atomics,bulk-memory -Z build-std=panic_abort,std",
"bundle-dev": "vite build --mode development", "bundle-dev": "vite build --mode development",
"bundle-release": "vite build", "bundle-release": "vite build",
"build": "run-s clean wasm-dev bundle-dev", "build": "run-s clean wasm-dev bundle-dev",
@@ -20,10 +25,11 @@
}, },
"devDependencies": { "devDependencies": {
"@wasm-tool/wasm-pack-plugin": "^1.7.0", "@wasm-tool/wasm-pack-plugin": "^1.7.0",
"vite": "^7.1.10", "npm-run-all": "^4.1.5",
"vite-plugin-wasm": "^3.3.0",
"rollup-plugin-copy": "^3.5.0",
"rimraf": "^5.0.1", "rimraf": "^5.0.1",
"npm-run-all": "^4.1.5" "rollup-plugin-copy": "^3.5.0",
"vite": "^7.1.10",
"vite-plugin-rsw": "^2.0.11",
"vite-plugin-wasm": "^3.3.0"
} }
} }
@@ -1,6 +1,6 @@
// Generic worker that imports the app's WASM module relative to the generated pkg folder. // Generic worker that imports the app's WASM module relative to the generated pkg folder.
// Works for any application because the relative depth from this file to pkg is stable. // Works for any application because the relative depth from this file to pkg is stable.
import initWasm, { worker_entrypoint } from "../../../../../../wasm-index.js"; import initWasm, { worker_entrypoint } from "/level-editor/pkg/level_editor.js";
export function attachMain() {} export function attachMain() {}
+47
View File
@@ -0,0 +1,47 @@
name = "rsw"
version = "0.1.0"
#! time interval for file changes to trigger wasm-pack build, default `50` milliseconds
interval = 50
#! link
#! npm link @see https://docs.npmjs.com/cli/v8/commands/npm-link
#! yarn link @see https://classic.yarnpkg.com/en/docs/cli/link
#! pnpm link @see https://pnpm.io/cli/link
#! The link command will only be executed if `[[crates]] link = true`
#! cli: `npm` | `yarn` | `pnpm`, default is `npm`
cli = "npm"
#! ---------------------------
#! rsw new <name>
[new]
#! @see https://rustwasm.github.io/docs/wasm-pack/commands/new.html
#! using: `wasm-pack` | `rsw` | `user`, default is `wasm-pack`
#! 1. wasm-pack: `rsw new <name> --template <template> --mode <normal|noinstall|force>`
#! 2. rsw: `rsw new <name>`, built-in templates
#! 3. user: `rsw new <name>`, if `dir` is not configured, use `wasm-pack new <name>` to initialize the project
using = "wasm-pack"
#! this field needs to be configured when `using = "user"`
#! `using = "wasm-pack"` or `using = "rsw"`, this field will be ignored
#! copy all files in this directory
dir = "my-template"
#! ################# NPM Package #################
#! When there is only `name`, other fields will use the default configuration
[[crates]]
name = "level-editor"
root = "."
out-dir = "pkg"
target = "web"
link = false
[crates.watch]
run = true
profile = "dev"
[crates.build]
run = true
profile = "release"
+3 -3
View File
@@ -1,4 +1,4 @@
import wbg_init, { main } from "../level-editor/pkg/wasm-index.js"; import wbg_init, { main } from "../level-editor/pkg/level_editor.js";
const start = async () => { const start = async () => {
await wbg_init(); await wbg_init();
@@ -6,8 +6,8 @@ const start = async () => {
}; };
// Wait for DOM to be ready before starting // Wait for DOM to be ready before starting
if (document.readyState === 'loading') { if (document.readyState === "loading") {
document.addEventListener('DOMContentLoaded', start); document.addEventListener("DOMContentLoaded", start);
} else { } else {
start(); start();
} }
+20 -6
View File
@@ -1,5 +1,12 @@
import path from "node:path";
import { fileURLToPath } from "node:url";
import { defineConfig } from "vite"; import { defineConfig } from "vite";
import { ViteRsw } from "vite-plugin-rsw";
import wasm from "vite-plugin-wasm"; import wasm from "vite-plugin-wasm";
import copy from "rollup-plugin-copy";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default defineConfig({ export default defineConfig({
build: { build: {
@@ -20,10 +27,17 @@ export default defineConfig({
}, },
resolve: { resolve: {
alias: { alias: {
'pkg': 'pkg' pkg: path.resolve(__dirname, "level-editor/pkg"),
} },
}, },
plugins: [ plugins: [
copy({
targets: [
{ src: "level-editor/pkg/*", dest: "static/level-editor/pkg" },
],
hook: "buildStart",
}),
ViteRsw(),
// Makes us be able to use top level await for wasm. // Makes us be able to use top level await for wasm.
// Otherwise, we can restrict build.target to 'es2022', which allows top level await. // Otherwise, we can restrict build.target to 'es2022', which allows top level await.
wasm(), wasm(),
@@ -31,8 +45,8 @@ export default defineConfig({
server: { server: {
port: 8080, port: 8080,
headers: { headers: {
'Cross-Origin-Embedder-Policy': 'require-corp', "Cross-Origin-Embedder-Policy": "require-corp",
'Cross-Origin-Opener-Policy': 'same-origin', "Cross-Origin-Opener-Policy": "same-origin",
}, },
fs: { fs: {
strict: false, strict: false,
@@ -41,8 +55,8 @@ export default defineConfig({
preview: { preview: {
port: 8080, port: 8080,
headers: { headers: {
'Cross-Origin-Embedder-Policy': 'require-corp', "Cross-Origin-Embedder-Policy": "require-corp",
'Cross-Origin-Opener-Policy': 'same-origin', "Cross-Origin-Opener-Policy": "same-origin",
}, },
}, },
}); });
+6 -1
View File
@@ -1690,12 +1690,17 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0" spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0" spdx-expression-parse "^3.0.0"
vite-plugin-rsw@^2.0.11:
version "2.0.11"
resolved "https://registry.npmjs.org/vite-plugin-rsw/-/vite-plugin-rsw-2.0.11.tgz"
integrity sha512-OqbGAtdDfK88gDoxA9wVdGowCmlzLSXEyRvD8CgTu9IP5O7tx8Tg2CtIzKOyOWZtHHZPhtdYiN+5Il6rTZCkzw==
vite-plugin-wasm@^3.3.0: vite-plugin-wasm@^3.3.0:
version "3.5.0" version "3.5.0"
resolved "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.5.0.tgz" resolved "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.5.0.tgz"
integrity sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ== integrity sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==
"vite@^2 || ^3 || ^4 || ^5 || ^6 || ^7", vite@^7.1.10: "vite@^2 || ^3 || ^4 || ^5 || ^6 || ^7", vite@^7.1.10, vite@>2.8.0-0:
version "7.1.11" version "7.1.11"
resolved "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz" resolved "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz"
integrity sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg== integrity sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==