[package] name = "render3d" version = "0.1.0" edition = "2021" description = "Nativer wgpu-3D-Renderer fuer die CAD-Modellsicht (Wand-Extrusion + Kamera + Pipeline)" # Bewusst NICHT Teil des src-tauri-Workspaces: die Mesh-Bibliothek soll unabhaengig # von Tauri baubar/testbar bleiben (headless, ohne Webview-Toolchain). Ausschluss # laeuft ueber `exclude = ["render3d"]` im uebergeordneten src-tauri/Cargo.toml. # Standalone (`cd render3d && cargo test/build`) bildet die Crate automatisch ihren # eigenen Ein-Paket-Workspace (eigene Cargo.lock) — Muster: render2d. # # KEIN eigener `[workspace]`-Block hier: sobald `cad-tauri` render3d per Pfad als # (optionale) Abhaengigkeit einbindet (Feature `native3d`), wuerde ein zweiter # 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 # vollstaendig per `cargo test` pruefbar. default = [] # GPU-Pipeline (wgpu). Baut auch headless (wgpu laedt Vulkan/GL erst zur Laufzeit # dynamisch), rendert aber nur mit einer aktiven Grafik-Session. Enthaelt Tiefen- # puffer, View-Projektions-Uniform und ein Directional-Light im Fragment-Shader. render = ["dep:wgpu", "dep:bytemuck", "dep:pollster"] # Fenster-Spike (winit) inkl. lauffaehigem Binary mit Orbit-Kamera. Braucht # 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 # Vulkan/GLES aktiviert wgpu selbst ueber seine target-spezifischen Defaults — # es gibt in wgpu 22 keine expliziten `vulkan`/`gles`-Feature-Namen. wgpu = { version = "22", optional = true } bytemuck = { version = "1", optional = true, features = ["derive"] } pollster = { version = "0.3", optional = true } # --- Fenster (nur mit Feature "window") -------------------------------------- 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 # GPU/Display. Version an wgpu 22 gekoppelt (transitiv ohnehin vorhanden). naga = { version = "22", features = ["wgsl-in"] } # Der Fenster-Spike ist nur mit Feature "window" verfuegbar; ohne das Feature # wird das Binary aus dem Build ausgeschlossen (required-features). [[bin]] name = "spike3d" path = "src/bin/spike3d.rs" required-features = ["window"]