918f60c498
HeadlessRenderer (Feature headless) baut Instance/Adapter/Device ohne Surface (Vulkan, kein Display-Server); render_to_image rendert in eine Rgba8Unorm-Texture (non-sRGB wie ColorMode::Web) und liest mit 256-Byte- Row-Padding zurueck. Draw-Code unveraendert geteilt mit dem Fenster-Pfad. CLI-Bin render_png (Demo-Szene, 990x630); Demo additiv um 45-Grad- Schraffur, Tuerblatt und Schwenkbogen erweitert, damit das Golden alle Pfade abdeckt. Golden-Test mit eingechecktem Referenzbild: 0/623700 Pixel Abweichung, bit-exakt reproduzierbar; bei Abweichung Diff-Dump nach target/. Doku in docs/design/engine-headless.md.
129 lines
5.7 KiB
TOML
129 lines
5.7 KiB
TOML
[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). 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 }
|
|
# Echte TrueType-Glyphen ueber einen GPU-Atlas (cosmic-text + etagere). Version
|
|
# an wgpu gekoppelt: die 0.6er-Reihe ist die zu wgpu 22 passende.
|
|
glyphon = { version = "0.6", 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 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 = "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"]
|