Skip to content

feat: per-preset tone curves via render/art-defaults payload (#32) - #40

Merged
tamirelazar merged 5 commits into
devfrom
feat/per-preset-tone-curves
Jun 18, 2026
Merged

feat: per-preset tone curves via render/art-defaults payload (#32)#40
tamirelazar merged 5 commits into
devfrom
feat/per-preset-tone-curves

Conversation

@tamirelazar

Copy link
Copy Markdown
Owner

Closes #32 (lever 5).

What

Establishes a per-preset render/art-defaults payload (RenderArtDefaults) and routes the existing intensity_mapping render parameter through it — without changing any output.

This is deliberately pure plumbing. Every preset's default tone curve stays at the current global log10; tasteful per-preset values are deferred to the showcase-presets issue (#36), which extends this same payload. The point of #32 is the clean render-layer seam that later render levers (#33 palette cycles, #6 gradient modes, #10 glyph selection) plug into without re-plumbing call sites.

Changes

  • RenderArtDefaults { intensity_mapping } in src/render_art_defaults.rs, resolved per Preset via From<Preset> + Default (log10 for all presets).
  • --intensity-mapping is now Option<String> (no clap default) so "absent → per-preset default" is distinguishable from "explicit override". Bare run still resolves to log10.
  • Args::to_render_art_defaults() resolves the per-preset default, overriding only when the flag is explicitly set (mirrors the deposit-curve override pattern).
  • The render call sites (runner.rs startup + four export/preview paths in app/mod.rs) read the resolved payload, preserving each site's existing error-handling semantics.
  • intensity_mapping is a render parameter — it stays out of SimConfig.
  • SavedConfig.intensity_mapping: Option<String> already round-tripped with serde back-compat; untouched.

Back-compat proof

  • All 47 visual-regression goldens unchanged (no UPDATE_GOLDEN).
  • Empirical same-seed capture (seed 42, 20 frames): default (Organic) and Vortex frames are byte-identical to origin/dev; --intensity-mapping linear differs from log (override works).

Test plan

  • cargo fmt --check, cargo clippy --all-targets --all-features -- -D warnings — clean.
  • cargo test (805 lib + 5 cli_integration + 47 visual_regression + 19 integration_app) — green.
  • cargo test --all-features --lib (816) — green.

@tamirelazar
tamirelazar merged commit 56e972a into dev Jun 18, 2026
3 checks passed
@tamirelazar
tamirelazar deleted the feat/per-preset-tone-curves branch June 18, 2026 20:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant