mirror of
https://github.com/storytold/effectcraft.git
synced 2026-11-11 02:41:57 -06:00
* Viewer exposure on the full float range of 32 bpc frames (#2797) 32 bpc viewer frames on the desktop are rendered without the HDR step (skip_hdr_step, #2916) and kept as half floats in the RAM preview. A display pass on egui-wgpu's device turns each frame into one RGBA8 texture with mips per viewer, in this order: decode, exposure in linear light, Compand / Tone Map, encode, display colour, Show Channel, rounding. Before, exposure was an 8-bit lookup applied after tone mapping, clamping and the display conversion, so -2 EV could not bring values above 1.0 back. - engine: viewer::DisplayPass describes the pass as data; its pixel() is the CPU fallback (no device) and the shader's reference. It replaces exposure_lut / display_transform. FrameEncoding records a frame's curve and the HDR step it still needs. 32 bpc snapshots are taken without the HDR step; snapshot_rgba8 applies it. - ui-egui: FrameImage::CpuF16 (half crate, F16C at run time), byte accounting at 8 bytes a pixel in the cache and the prefetch estimates; display_gpu.rs + display_gpu.wgsl; main viewer, snapshot and passive viewers draw through the pass; the 8-bit image other panels read is made on demand with the HDR step; the Info panel shows float values. - Half-float frames are not written to the disk cache yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Viewer display pass: f16 disk cache entries, window-device gating, review fixes - Disk cache: half-float frame entries (format byte in the entry header, byte planes + LZ4); 8-bit entries keep format 0 and stay valid. 32 bpc viewer frames are written and read again, and the timeline's disk bar sees them. A damaged half-float entry is deleted. - The display pass runs on the window's egui-wgpu device, with or without the GPU compositor (still building, failed, GL fallback). Its pipelines are made inside error scopes; a backend that rejects them gets the CPU pass instead of a blank viewer. - A new LUT of the same size (another ICC profile, Preserve RGB, another display) runs the pass again. - f32 to f16: one pass per L1-sized block, the NaN / infinity fix-up on the bits, no fill of the buffer (4K: 4.7 ms, as the 8-bit conversion). - Mips of odd-sized levels include the last column / row; the snapshot's half floats and texture go with the snapshot; no placeholder texture ids; u64 size checks. - Tests: LUT profiles and negative values against the shader, Bake reruns, the passive viewer's colour, f16 disk round trips; exact comparisons allow 1 LSB on software rasterizers. Docs: the display pass and the f16 disk entries in architecture.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Viewer f16 disk-cache test: temp dir removed on failure too, wait for the queued disk write Review points: the test's directory was only removed by its last statement (now tempfile::TempDir), and the frame is released before its disk write is queued, so flush() could return early (now waits for the entry). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Viewer: oversized half-float frames use the CPU display pass, so exposure/HDR come before the averaging down Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Viewer: fmt and a debug assert for the half-float upload path Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Disk cache: persist_missing also writes half-float frames Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Passive viewer: oversized half-float frames take the CPU display pass instead of leaving a stale texture Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
63 lines
2.3 KiB
TOML
63 lines
2.3 KiB
TOML
[package]
|
|
name = "effectcraft-ui-egui"
|
|
description = "The EffectCraft egui frontend (swappable): docking panels, composition viewer, timeline, effect controls, control channel"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
rust-version.workspace = true
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
craft-ui = { workspace = true }
|
|
craft-quit = { workspace = true, features = ["egui"] }
|
|
effectcraft-time = { workspace = true }
|
|
effectcraft-geom = { workspace = true }
|
|
effectcraft-color = { workspace = true }
|
|
effectcraft-keyframe = { workspace = true }
|
|
effectcraft-project = { workspace = true }
|
|
effectcraft-path = { workspace = true }
|
|
effectcraft-text = { workspace = true }
|
|
effectcraft-render = { workspace = true }
|
|
effectcraft-engine = { workspace = true }
|
|
effectcraft-gpu = { workspace = true }
|
|
egui = { workspace = true }
|
|
egui_extras = { workspace = true }
|
|
eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "clipboard"] }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
log = { workspace = true }
|
|
chrono = { workspace = true }
|
|
rayon = { workspace = true }
|
|
web-time = { workspace = true }
|
|
kurbo = { workspace = true }
|
|
image = { workspace = true }
|
|
# Half-float viewer frames of 32 bpc projects (F16C is picked at run time).
|
|
half = { workspace = true }
|
|
bytemuck = { workspace = true }
|
|
|
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
|
# Floating panels open in OS windows of their own on desktop; the web keeps them in the page.
|
|
craft-ui = { workspace = true, features = ["native-windows"] }
|
|
craft-update = { workspace = true }
|
|
# Waits for the display pass's error scopes (immediately ready on native wgpu).
|
|
pollster = { workspace = true }
|
|
sys-locale = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
# Fonts for kittest: the workspace `egui` features are what test roots resolve, but stating them
|
|
# here documents the requirement (kittest's own dev-dependencies do not propagate to consumers).
|
|
egui = { workspace = true, features = ["default_fonts", "monochrome_emoji_fonts"] }
|
|
egui_kittest = { workspace = true, features = ["eframe", "wgpu"] }
|
|
pollster = "1"
|
|
effectcraft-segment = { workspace = true }
|
|
effectcraft-host = { workspace = true }
|
|
effectcraft-media = { workspace = true }
|
|
exr = { workspace = true }
|
|
tempfile = { workspace = true }
|
|
|
|
[build-dependencies]
|
|
serde_json = { workspace = true }
|
|
toml = "1"
|