[package] name = "render2d" version = "0.1.0" edition = "2021" description = "Nativer wgpu-2D-Renderer fuer den CAD-Grundriss (Tessellierung + Pipelines)" # cdylib: von wasm-pack (Feature "web") fuer das .wasm-Modul benoetigt. rlib: # damit die Crate weiterhin als Pfad-Abhaengigkeit (cad-tauri, Feature native2d) # und im Test-/Bin-Build (spike) nutzbar bleibt. Der cdylib-Artefakt-Build auf # nativen Zielen ist harmlos (leere Export-Oberflaeche ohne Feature "web"). [lib] crate-type = ["cdylib", "rlib"] # Bewusst NICHT Teil des src-tauri-Workspaces: die Tessellierungs-Bibliothek soll # unabhaengig von Tauri baubar/testbar bleiben (headless, ohne Webview-Toolchain). # Ausschluss laeuft ueber `exclude = ["render2d"]` im uebergeordneten # src-tauri/Cargo.toml. Standalone (`cd render2d && cargo test/build`) bildet die # Crate automatisch ihren eigenen Ein-Paket-Workspace (eigene Cargo.lock). # # KEIN eigener `[workspace]`-Block hier: sobald `cad-tauri` render2d per Pfad als # (optionale) Abhaengigkeit einbindet (Feature `native2d`), wuerde ein zweiter # Workspace-Root INNERHALB des src-tauri-Baums Cargo mit "multiple workspace # roots" abbrechen. Der Parent-`exclude` haelt die Crate trotzdem eigenstaendig. [features] # Standard: nur die reine Tessellierung + Szene + Ortho-Matrix + WGSL-Quellen. # Diese Schicht ist serde-only, hat keine GPU-Abhaengigkeit und ist headless # vollstaendig per `cargo test` pruefbar. default = [] # GPU-Pipelines (wgpu). Baut auch headless (wgpu laedt Vulkan/GL erst zur # Laufzeit dynamisch), rendert aber nur mit einer aktiven Grafik-Session. # glyphon = GPU-Glyphen-Atlas fuer ECHTE TrueType-Schrift (cosmic-text) — # gehoert bewusst in die GPU-Schicht, die serde-only-Default-Schicht bleibt fontfrei. render = ["dep:wgpu", "dep:bytemuck", "dep:pollster", "dep:glyphon"] # Fenster-Spike (winit) inkl. lauffaehigem Binary. 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. web = [ "render", "dep:wasm-bindgen", "dep:wasm-bindgen-futures", "dep:web-sys", "dep:js-sys", "dep:console_error_panic_hook", "dep:serde_json", ] # Offscreen-Renderpfad (kein Fenster/Surface): Adapter/Device ohne Surface, # Render-Target ist eine `wgpu::Texture` statt einer Surface-Textur, Ergebnis als # PNG kodiert (`image`-Crate). Fuer Golden-Image-Tests und headlessen PNG-Export # (Engine-Nordstern, siehe docs/design/engine-headless.md). Bewusst NICHT Teil von # `render`/`web`: die `image`-Abhaengigkeit soll den wasm-Build nicht belasten. headless = ["render", "dep:image"] [dependencies] serde = { version = "1", features = ["derive"] } # JSON-Szene (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 + target-spezifisch # Vulkan/GLES auf Linux). wgpu 30 ist bereits erschienen, aber glyphon 0.11 # pinnt `wgpu ^29` — 29 ist damit die neueste Version, bei der beide zusammenpassen. wgpu = { version = "29", optional = true } bytemuck = { version = "1", optional = true, features = ["derive"] } pollster = { version = "0.4", optional = true } # Echte TrueType-Glyphen ueber einen GPU-Atlas (cosmic-text + etagere). Version # an wgpu gekoppelt: die 0.11er-Reihe ist die zu wgpu 29 passende. glyphon = { version = "0.11", optional = true } # --- Headless-PNG-Export (nur mit Feature "headless") ------------------------ # Nur der PNG-Codec noetig (kein volles Format-Universum) -> default-features aus. image = { version = "0.25", optional = true, default-features = false, features = [ "png", ] } # --- 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 gekoppelt (transitiv ohnehin vorhanden). naga = { version = "29", 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 = "spike" path = "src/bin/spike.rs" required-features = ["window"] # Headless-CLI-Beweis: rendert die Demo-Szene ohne Fenster/Surface nach PNG. # Nur mit Feature "headless" verfuegbar (siehe Cargo-Feature-Kommentar oben). [[bin]] name = "render_png" path = "src/bin/render_png.rs" required-features = ["headless"] # Golden-Image-Test des Headless-Renderpfads. Nur mit Feature "headless" gebaut # (der Vergleich laedt das Referenzbild ueber `headless::RgbaImage::decode_png`). [[test]] name = "golden" path = "tests/golden.rs" required-features = ["headless"]