render3d im Browser: WASM/WebGPU-3D-Viewport hinter ?engine=wasm

Feature web (wasm-bindgen) + cdylib analog render2d; WebModelRenderer
mit Canvas-Surface, set_model (walls/slabs wie der native Push) und
set_camera. Projektion liefert bereits [0,1]-Clip-Z, math.rs unveraendert.
wgpu-22-requestDevice-Shim in src/engine/requestDeviceShim.ts geteilt.
Neuer Hook useWasm3dRenderer + Wasm3DViewport (Orbit/Pan/Zoom wie three.js-
Sicht); Viewport3D dispatcht per ?engine=wasm bzw. localStorage, three.js
bleibt Default. Build-Script build:engine3d (wasm-pack, src/engine/pkg3d).
Verifiziert headful per scripts/probe-engine3d.mjs (37 % Geometrie-Pixel);
headless praesentiert Chromium keine WebGPU-Frames (auch bei render2d).
This commit is contained in:
2026-07-03 07:41:37 +02:00
parent 7ca5197b6b
commit c8a4188618
13 changed files with 914 additions and 2 deletions
+39
View File
@@ -15,6 +15,13 @@ description = "Nativer wgpu-3D-Renderer fuer die CAD-Modellsicht (Wand-Extrusion
# Workspace-Root INNERHALB des src-tauri-Baums Cargo mit "multiple workspace
# roots" abbrechen. Der Parent-`exclude` haelt die Crate trotzdem eigenstaendig.
# cdylib: von wasm-pack (Feature "web") fuer das .wasm-Modul benoetigt. rlib:
# damit die Crate weiterhin als Pfad-Abhaengigkeit (cad-tauri, Feature native3d)
# und im Test-/Bin-Build (spike3d) nutzbar bleibt. Der cdylib-Artefakt-Build auf
# nativen Zielen ist harmlos (leere Export-Oberflaeche ohne Feature "web").
[lib]
crate-type = ["cdylib", "rlib"]
[features]
# Standard: nur Mesh-Erzeugung (Wand-Extrusion) + Kamera/Matrizen + WGSL-Quellen.
# Diese Schicht ist serde-only, hat keine GPU-Abhaengigkeit und ist headless
@@ -30,8 +37,26 @@ render = ["dep:wgpu", "dep:bytemuck", "dep:pollster"]
# Wayland/X11 + eine Display-Session zur visuellen Verifikation.
window = ["render", "dep:winit", "dep:env_logger"]
# Browser-Bindings (wasm32 + WebGPU): dieselbe GPU-Schicht (`render`) hinter einer
# wasm-bindgen-Fassade (`web.rs`), die eine HTML-Canvas als wgpu-Surface bespielt.
# Baut NUR fuer target wasm32-unknown-unknown sinnvoll (wgpu waehlt dort das
# WebGPU-Backend). Die native Fensterschicht (`window`) bleibt davon unberuehrt.
# Muster: render2d/Cargo.toml (Feature "web").
web = [
"render",
"dep:wasm-bindgen",
"dep:wasm-bindgen-futures",
"dep:web-sys",
"dep:js-sys",
"dep:console_error_panic_hook",
"dep:serde_json",
]
[dependencies]
serde = { version = "1", features = ["derive"] }
# JSON-Modell (dieselbe Ableitung wie der native Push): im Web-Pfad zur Laufzeit
# geparst; optional, nur mit Feature "web".
serde_json = { version = "1", optional = true }
# --- GPU (nur mit Feature "render") ------------------------------------------
# Standard-Features von wgpu (wgsl, webgpu, dx12, metal). Die Linux-Backends
@@ -45,6 +70,20 @@ pollster = { version = "0.3", optional = true }
winit = { version = "0.30", optional = true }
env_logger = { version = "0.11", optional = true }
# --- Browser/WASM (nur mit Feature "web") ------------------------------------
# wasm-bindgen-Fassade + Canvas-Zugriff. Versionen bewusst breit ("0.2"/"0.3"),
# damit wasm-pack die passende wasm-bindgen-CLI selbst zieht.
wasm-bindgen = { version = "0.2", optional = true }
wasm-bindgen-futures = { version = "0.4", optional = true }
js-sys = { version = "0.3", optional = true }
console_error_panic_hook = { version = "0.1", optional = true }
web-sys = { version = "0.3", optional = true, features = [
"HtmlCanvasElement",
"Window",
"Document",
"console",
] }
[dev-dependencies]
serde_json = "1"
# naga validiert die WGSL-Quellen headless (Parser + Validator) im Test, ohne