feat(gioser): chacana mística stepped, nubes/estrellas/meteoros, tilt 35°
- gioser-geom: ChacanaSpec paramétrica con `steps` (default 2). bounding box cuadrado (no cruz alargada), centro 6s×6s, brazos cortos de 2 niveles que adelgazan hacia la punta. arm_extent = 0.65 con thickness=0.13. - gioser-shaders: nubes FBM 5× más rápidas, 3 estratos de estrellas con twinkle independiente, 4 meteoros procedurales con cola/cabeza y vida cíclica. Chacana SDF rediseñada para 2 escalones, aro doble (interior + exterior), 12 rayos angulares y 4 marcas cardinales animadas. - gioser-canvas-web: MAX_TILT 22°→35°, WORLD_SCALE 0.92→1.45, spring 1.8 Hz / ζ=0.62 (más languido). uniform `u_center_half` agregado. Las puntas DOM se desplazan visiblemente con el tilt. - README: fix wasm-bindgen-cli 0.2.99 → 0.2.121 + `--locked`. 13 tests pasan (6 geom + 4 palette + 3 physics). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -35,32 +35,127 @@ se enchufa al runtime equivalente a `yahweh_launcher::launch_app`.
|
||||
- **Botones:** DOM real (accesibles, navegables por teclado, deep-link
|
||||
por hash) proyectados desde 3D al viewport cada frame.
|
||||
|
||||
## Build
|
||||
---
|
||||
|
||||
Requiere el target `wasm32-unknown-unknown` y `wasm-bindgen-cli`.
|
||||
## Requisitos
|
||||
|
||||
- **Rust** con el target `wasm32-unknown-unknown` instalado.
|
||||
- Con `rustup`: `rustup target add wasm32-unknown-unknown`.
|
||||
- En Artix/Arch con Rust del sistema: el target suele venir incluido en
|
||||
`/usr/lib/rustlib/wasm32-unknown-unknown` (verificá con
|
||||
`ls /usr/lib/rustlib | grep wasm`). Si falta: `pacman -S rust-wasm`
|
||||
(no existe — el target viene con el paquete `rust` base).
|
||||
- **wasm-bindgen-cli** (versión exacta 0.2.121, debe matchear la dep del
|
||||
`Cargo.lock`). Verificá con
|
||||
`grep -A1 '^name = "wasm-bindgen"$' Cargo.lock | head` antes de instalar.
|
||||
|
||||
```sh
|
||||
# Una vez (si no los tenés):
|
||||
rustup target add wasm32-unknown-unknown
|
||||
cargo install wasm-bindgen-cli --version 0.2.99
|
||||
|
||||
# Build:
|
||||
cargo build -p gioser-web --release --target wasm32-unknown-unknown
|
||||
|
||||
# Generar bindings JS:
|
||||
wasm-bindgen \
|
||||
target/wasm32-unknown-unknown/release/gioser_web.wasm \
|
||||
--out-dir crates/apps/gioser-web/pkg \
|
||||
--target web
|
||||
|
||||
# Servir (cualquier static server vale):
|
||||
python3 -m http.server -d crates/apps/gioser-web 8080
|
||||
# → http://localhost:8080/
|
||||
# Una sola vez:
|
||||
cargo install wasm-bindgen-cli --version 0.2.121 --locked
|
||||
```
|
||||
|
||||
Si usás `rust-toolchain.toml` con Rust del sistema (Artix/Arch), instalá
|
||||
el target con tu package manager (`pacman -S rust-wasm` o equivalente) o
|
||||
montá rustup en un perfil aparte.
|
||||
> La versión del CLI **debe** coincidir con la del crate `wasm-bindgen`
|
||||
> en `Cargo.lock`. Si no coincide, el output JS no carga el `.wasm`
|
||||
> generado. Si actualizás el workspace y wasm-bindgen sube de versión,
|
||||
> reinstalá el CLI con la nueva versión.
|
||||
|
||||
- Un static server para probar local: `python3 -m http.server` alcanza.
|
||||
|
||||
---
|
||||
|
||||
## Flujo rápido (un comando)
|
||||
|
||||
Hay un wrapper que hace cargo build + wasm-bindgen + copia salida:
|
||||
|
||||
```sh
|
||||
# Dev — sin optimización, build rápido (~10 s).
|
||||
./scripts/build-gioser-web.sh dev
|
||||
|
||||
# Release — opt-level=3, lto, strip, ~30 s pero binario pequeño.
|
||||
./scripts/build-gioser-web.sh release
|
||||
```
|
||||
|
||||
El output queda en `crates/apps/gioser-web/pkg/`:
|
||||
```
|
||||
pkg/
|
||||
├── gioser_web.js ← bindings JS (referenciados por index.html)
|
||||
├── gioser_web_bg.wasm ← binario WASM
|
||||
└── gioser_web.d.ts ← typings (no se usan en runtime, son para IDE)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Probarlo local
|
||||
|
||||
```sh
|
||||
./scripts/build-gioser-web.sh dev
|
||||
python3 -m http.server -d crates/apps/gioser-web 8080
|
||||
# Abrir http://localhost:8080/
|
||||
```
|
||||
|
||||
Si cambiás Rust: re-ejecutar el script y refrescar el browser.
|
||||
Si cambiás `index.html` / `styles.css`: alcanza con refrescar.
|
||||
|
||||
---
|
||||
|
||||
## Build release y deploy
|
||||
|
||||
```sh
|
||||
./scripts/build-gioser-web.sh release
|
||||
```
|
||||
|
||||
El binario release optimiza:
|
||||
- `opt-level = 3`, `lto = "thin"`, `codegen-units = 1`,
|
||||
`panic = "abort"`, `strip = "symbols"` (del perfil `[profile.release]`
|
||||
del workspace).
|
||||
- WASM resultante típico: **~120 KB** (canvas + shaders + bindings) sin
|
||||
comprimir, **~50 KB** gzippeado. wasm-bindgen pasa por
|
||||
`wasm-opt` automáticamente si lo encontrás en `$PATH` (instalable via
|
||||
`binaryen`).
|
||||
|
||||
Para deploy, los **artefactos a subir al host estático** son sólo
|
||||
cuatro archivos:
|
||||
|
||||
```
|
||||
crates/apps/gioser-web/
|
||||
├── index.html ← entry point
|
||||
├── styles.css ← estilos
|
||||
└── pkg/
|
||||
├── gioser_web.js
|
||||
└── gioser_web_bg.wasm
|
||||
```
|
||||
|
||||
Funciona en cualquier static host (Nginx, GitHub Pages, S3+CloudFront,
|
||||
Caddy, netlify, fly, Vercel static). **Importante:**
|
||||
|
||||
- El server debe servir `.wasm` con `Content-Type: application/wasm`.
|
||||
Nginx/Caddy lo hacen por default; algunos hosts muy viejos no — fijate.
|
||||
- `index.html` referencia `./pkg/gioser_web.js` con `type="module"`,
|
||||
o sea que el browser usa el ES module loader. Eso requiere servir por
|
||||
HTTP/HTTPS (no `file://`).
|
||||
- Fonts de Google: el `<link>` apunta a `fonts.googleapis.com`. Para uso
|
||||
offline o sin tracking, descargá las fuentes y servilas locales.
|
||||
|
||||
### Comando deploy "tar + scp"
|
||||
|
||||
```sh
|
||||
./scripts/build-gioser-web.sh release
|
||||
tar czf gioser-web-dist.tar.gz \
|
||||
-C crates/apps/gioser-web \
|
||||
index.html styles.css pkg/
|
||||
|
||||
# Subir al server:
|
||||
scp gioser-web-dist.tar.gz user@host:/var/www/gioser/
|
||||
ssh user@host 'cd /var/www/gioser && tar xzf gioser-web-dist.tar.gz'
|
||||
```
|
||||
|
||||
### GitHub Pages / gitea pages
|
||||
|
||||
Configurá la branch de pages a apuntar a un directorio que contenga
|
||||
sólo los 4 archivos. Un workflow CI que corra el script y commitee el
|
||||
`pkg/` a la branch de deploy hace el trabajo.
|
||||
|
||||
---
|
||||
|
||||
## Routing
|
||||
|
||||
@@ -68,10 +163,35 @@ Los `<a href="#aire|fuego|tierra|agua">` apuntan a anchors locales.
|
||||
Cuando definamos rutas reales (otras páginas, sub-apps, etc.), basta con
|
||||
cambiar el `href` en `index.html` o interceptar el click desde JS.
|
||||
|
||||
## Tests
|
||||
---
|
||||
|
||||
Los crates agnósticos tienen tests unitarios:
|
||||
## Tests de los crates agnósticos
|
||||
|
||||
Los cuatro crates sin gpui/web tienen tests unitarios estándar:
|
||||
|
||||
```sh
|
||||
cargo test -p gioser-geom -p gioser-physics -p gioser-palette
|
||||
cargo test -p gioser-geom -p gioser-physics -p gioser-palette -p gioser-shaders
|
||||
```
|
||||
|
||||
`gioser-canvas-web` no tiene tests (depende de WebGL2 que sólo existe
|
||||
en browser).
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Pantalla en blanco + error en consola "no link/binding found"**
|
||||
→ Versión de `wasm-bindgen-cli` no coincide con la del `Cargo.lock`.
|
||||
Reinstalá con `cargo install wasm-bindgen-cli --version <X.Y.Z>`
|
||||
donde `<X.Y.Z>` sale de `grep '^version' Cargo.lock` cerca de la entrada
|
||||
`wasm-bindgen`.
|
||||
|
||||
**"WebGL2 not supported"** en algunos navegadores viejos
|
||||
→ No hay fallback. WebGL2 es soporte universal en navegadores modernos
|
||||
(Chrome/Edge/Firefox/Safari desde 2017). Para targets ancestrales habría
|
||||
que escribir un renderer WebGL1, no contemplado por ahora.
|
||||
|
||||
**Build muy lento por las deps de web-sys**
|
||||
→ Las features de web-sys están minimizadas en el Cargo.toml; sólo se
|
||||
importan las que el renderer usa. El primer build sí es lento (~1 min),
|
||||
los incrementales son rápidos.
|
||||
|
||||
Reference in New Issue
Block a user