Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
4ddb8c5
feat: preset & palette completion pass + review triage
tamirelazar Jun 20, 2026
5ed3ed1
refactor: single source of truth for palette identity
tamirelazar Jun 20, 2026
16f9f6a
refactor: single source of truth for preset identity
tamirelazar Jun 20, 2026
bf1ff6d
fix: stop config_builder from clobbering preset decay_gamma & diffuse…
tamirelazar Jun 21, 2026
3c95ab1
refactor: add PresetSimDefaults optional-override sim seam
tamirelazar Jun 21, 2026
0f3c9f2
feat: River and Ripple declare boundary-mode wrap
tamirelazar Jun 21, 2026
2f246ff
test: snapshot net for assembled preset configs
tamirelazar Jun 21, 2026
b890950
test: harden dump_assembled exit-status check
tamirelazar Jun 21, 2026
cd06d9c
refactor: port preset arms into declarative PresetSimDefaults
tamirelazar Jun 21, 2026
886fcc5
refactor: collapse Preset::apply into PresetSimDefaults shim
tamirelazar Jun 21, 2026
0d750be
fix: preserve preset wind/obstacles/background through assemble
tamirelazar Jun 21, 2026
e387b14
test: regen river + add petridish visual goldens
tamirelazar Jun 21, 2026
8f271be
feat: add afterglow fields to RenderArtDefaults
tamirelazar Jun 21, 2026
f2e72fe
feat: afterglow CLI flags become preset-layered Option
tamirelazar Jun 21, 2026
d23794f
feat: route afterglow through RenderArtDefaults
tamirelazar Jun 21, 2026
071f1da
feat: compute toggles clear EMA buffers on disable
tamirelazar Jun 21, 2026
416dcbf
feat: ResolvedRenderConfig + resolve_render_config merge
tamirelazar Jun 21, 2026
1962de5
fix: resolver color_aa falls back to per-charset default
tamirelazar Jun 21, 2026
ca42509
feat: apply_render_config shared render-apply helper
tamirelazar Jun 21, 2026
b4010d0
fix: apply_render_config palette fallback mirrors startup
tamirelazar Jun 21, 2026
7925a6e
refactor: startup + reset share apply_render_config baseline
tamirelazar Jun 21, 2026
dbdaeb6
fix: reset_to_defaults restores all per-charset color-AA slots
tamirelazar Jun 21, 2026
1b75774
feat: live preset-switch re-resolves full launch pipeline
tamirelazar Jun 21, 2026
13c873f
test: switch/reset/Model-B/toggle resolution matrix
tamirelazar Jun 21, 2026
4bed9ac
chore: remove stale dead_code allows, clarify reset/dump docs
tamirelazar Jun 21, 2026
f997cff
feat: PresetSimDefaults declares deposit_cap + 4 sim levers
tamirelazar Jun 21, 2026
d6c2779
fix: preset attractors and separate-trails survive empty-CLI assemble
tamirelazar Jun 21, 2026
0e5833c
test: snapshot net dumps the 4 new preset sim levers
tamirelazar Jun 21, 2026
4bbfacd
feat: Profile type unifies preset and config resolution
tamirelazar Jun 21, 2026
9d3feab
feat: resolve startup through Profile; track active_source
tamirelazar Jun 21, 2026
30f1e2b
fix: validate SimConfig in Profile::resolve_from_args
tamirelazar Jun 21, 2026
b0bc72f
refactor: switch_preset resolves through Profile::from_preset
tamirelazar Jun 21, 2026
3c8ca4d
feat: ProfileOverrides resolves byte-identically to ConfigBuilder + r…
tamirelazar Jun 21, 2026
f269958
fix: ProfileOverrides glyph merge + palette fallback match oracle ver…
tamirelazar Jun 21, 2026
d394a0f
fix: ProfileOverrides propagates render parse errors to match oracle
tamirelazar Jun 21, 2026
2f319a3
refactor: resolve through ProfileOverrides; delete ConfigBuilder
tamirelazar Jun 21, 2026
38f0d60
test: guard render two-body equivalence; cover brightness + high-FPS …
tamirelazar Jun 21, 2026
b329c34
perf: drop dead per-frame to_sim_config() in warmup loop
tamirelazar Jun 21, 2026
a05edf5
perf: narrow per-frame live reads instead of cloning SimConfig
tamirelazar Jun 21, 2026
84df0aa
feat: serde TOML schema for ProfileOverrides
tamirelazar Jun 21, 2026
adaa4ca
fix: serde Vec skip, custom-variant + lossy tests, palette err, AaStr…
tamirelazar Jun 21, 2026
8fcc87c
refactor: config_manager persists ProfileOverrides; delete SavedConfi…
tamirelazar Jun 21, 2026
3b7865a
fix: round-trip per-charset color_aa and population in saved configs
tamirelazar Jun 21, 2026
5d08745
chore: sweep stale config_builder/SavedConfig references after Phase B
tamirelazar Jun 21, 2026
dea8ac6
refactor: route headless render through Profile.render; delete cli re…
tamirelazar Jun 21, 2026
05a4f74
feat: add AppRuntimeConfig (warmup/auto_reset/grid) + init_mode to Pr…
tamirelazar Jun 21, 2026
6a1a660
feat: one total apply seam (renderer+sim+app+flags); config-load rest…
tamirelazar Jun 21, 2026
617e649
feat: Phase C Task 4 — preset-only from_preset, switch_preset seam, r…
tamirelazar Jun 21, 2026
b3f2981
test: add switch_preset_ignores_cli and reset_reproduces_active_overr…
tamirelazar Jun 21, 2026
3083b77
fix: capture palette flags+app+wind from live runtime; unify color_aa
tamirelazar Jun 21, 2026
400cad9
feat: dirty-state guard overlay blocks lossy swaps (canonical project…
tamirelazar Jun 21, 2026
a4f492d
chore: sweep stale comments and fix dashboard init_mode staleness
tamirelazar Jun 21, 2026
43d602c
fix: capture obstacles, attractors, terrain, and species in capture_o…
tamirelazar Jun 21, 2026
acbaf98
fix: exclude un-capturable trail_modulation from dirty projection
tamirelazar Jun 21, 2026
5cab8e0
fix: tolerate stale presets.toml so one bad file can't poison config …
tamirelazar Jun 22, 2026
909b416
fix: preserve trail_modulation through config save/load
tamirelazar Jun 22, 2026
a7db130
refactor: name AppRuntimeConfig default literals as config_defaults c…
tamirelazar Jun 22, 2026
daff5dc
fix: read live chrome on resize; carry resolved config through pendin…
tamirelazar Jun 22, 2026
dd60c30
test: delete dead apply_to_runtime_state, repoint tests to the shippi…
tamirelazar Jun 22, 2026
f434446
feat: add window_frame to PresetSimDefaults sim seam
tamirelazar Jun 22, 2026
aac4dda
feat: thread auto_normalize through the per-preset render membrane
tamirelazar Jun 22, 2026
42413de
feat: PresetAppDefaults seam — auto_reset preset-ownable + None-on-ab…
tamirelazar Jun 22, 2026
4fa6f5c
refactor: rename 4 presets; keep old names as CLI aliases
tamirelazar Jun 22, 2026
5c7d714
refactor: update stale lumen/ripple test names + preset doc comments
tamirelazar Jun 22, 2026
73eead7
feat: per-preset visual mods (network/organic/fire/slime/smoke/mold/v…
tamirelazar Jun 22, 2026
55673c6
feat: add Preset::Vinescii (ASCII-rendered vines)
tamirelazar Jun 22, 2026
6209a77
feat: Constellation re-rolls its init mode on every reset
tamirelazar Jun 22, 2026
e91c2ec
docs: update presets for rename pass; add visual coverage for organic…
tamirelazar Jun 22, 2026
a37ea8b
test: regenerate goldens for preset rename + visual mods; add organic…
tamirelazar Jun 22, 2026
f8c9801
docs: fix CHANGELOG section structure and stale zen preset example
tamirelazar Jun 22, 2026
9db62e1
test: drive auto_normalize precedence through resolve_render; fix vin…
tamirelazar Jun 22, 2026
a9bb501
fix: resolve preset collapse + divergence bugs; default launch routes…
tamirelazar Jun 22, 2026
b6159af
fix: disable entropy collapse detector for Constellation by default
tamirelazar Jun 22, 2026
dcedac1
feat: frame matte spacing, preset retunes, and collapse/bug fixes
tamirelazar Jun 22, 2026
f0f6a17
feat: launch quick-keys + custom keybinds
tamirelazar Jun 22, 2026
317619a
fix: prevent Mold preset wall-collapse via trail-dependent respawn
tamirelazar Jun 22, 2026
8cb41c2
fix: capture live time_scale in save-config overrides
tamirelazar Jun 22, 2026
e5245a9
fix: surface resolve errors in preset comparison overlay
tamirelazar Jun 22, 2026
8282e8c
fix: prevent usize underflow in draw_text_overlay_with_panel
tamirelazar Jun 22, 2026
53c0db5
fix: correct DirtyGuardOverlay vertical centering
tamirelazar Jun 22, 2026
17dc99b
fix: normalize Mold respawn trail so multiplier cap is meaningful
tamirelazar Jun 22, 2026
a0a4e21
fix: respawn_config round-trips through save/load
tamirelazar Jun 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,24 @@ versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

First public release.

### Added
- Physarum simulation (Jones 2010 model) with 30 presets and runtime parameter controls
- Terminal rendering: half-block, ASCII, braille, quadrant, shade, points, and sculpted charsets; OKLch-based color palettes
- Terminal rendering: half-block, ASCII, braille, quadrant, shade, points, and sculpted charsets; 22 OKLch-based color palettes
- Screensaver and interactive modes; pause, restart, preset/palette cycling at runtime
- GIF, PNG, and WebM export
- Window-frame display modes
- `vinescii` preset — the vines (flocking) pattern in pure ASCII
- Experimental: multi-species, choir audio, and GUI (feature-gated); WASM build (standalone crate)

### Changed
- Quick-keys `1`–`3` now switch the launch presets (Organic, Constellation, Vinescii).
- Preset pass: renamed pulse→slime, flocking→vines, ripple→smoke, lumen→mold
(old names still accepted as CLI aliases); per-preset visual tuning applied
(braille/quadrant charsets, palette assignments, auto-normalize, window frames);
constellation re-rolls its init layout on reset and auto-resets on collapse.
- Fixed the stale `--preset` help text (was listing removed presets).

### Added (Custom Keybinds)
- Custom key bindings via `~/.config/tslime/keybinds.toml`: bind keys `1`–`7` to any preset or
saved config; user binds override the defaults. A/B compare (`Shift+1`–`7`) works for bound
presets and configs. The `?` overlay shows live bindings.
68 changes: 54 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Some starting points:

```bash
tslime --preset lightning --palette heat # fast dendritic branching, warm colors
tslime --preset zen --palette ocean --fps 24 # slow and quiet
tslime --preset drift --palette ocean --fps 24 # slow and quiet
tslime --seed 42 --population 80000 # reproducible run, denser network
tslime --braille --palette mono # high-resolution monochrome
tslime --palette-cycles 3 --palette-cycle-mode mirror # banded contour coloring
Expand All @@ -69,7 +69,9 @@ lowercase increases and uppercase (Shift) decreases.
|---|---|
| `Space` | Pause / resume |
| `r` | Restart |
| `1`–`7` | Select preset (`Shift+1`–`7` to compare against current) |
| `1`–`3` | Switch preset (Organic / Constellation / Vinescii) |
| `4`–`7` | Custom binds — set in `~/.config/tslime/keybinds.toml` |
| `Shift+1`–`7` | Compare bound preset/config (A/B) |
| `8` | Randomize parameters |
| `0` | Reset to defaults |
| `+` / `-` | Time scale |
Expand Down Expand Up @@ -119,23 +121,61 @@ lowercase increases and uppercase (Shift) decreases.
| `q` | Quit |
| `Esc` | Close open overlay |

## Gallery
### Custom Keybinds

<!-- ws6: preset/palette showcase gifs -->
Customize quick-keys `1`–`7` by creating a `~/.config/tslime/keybinds.toml` file with the following format:

```toml
[[keybind]]
key = "4"
preset = "fire"

[[keybind]]
key = "5"
config = "my-night-config"
```

- **Keys**: Bind to any digit `1`–`7`. Keys `1`–`3` default to Organic, Constellation, and Vinescii; user entries override.
- **Targets**: Bind to either a `preset` (any of the 30 named presets) or a `config` (any saved configuration from `Ctrl+S`).
- **Comparison**: Press `Shift+1` through `Shift+7` to compare the bound preset or config against the current settings (A/B mode).
- **Invalid entries**: Silently ignored; the app launches normally and skips unparseable lines.
- **Live bindings**: The `?` overlay shows current key bindings and their targets.

There are 34 named presets: network, exploratory, tendrils, organic, minimal, moss,
cosmic, fire, zen, storm, river, ethereal, petri, vortex, lightning, crystal,
chaosedge, blob, worm, pulse, coral, flocking, maze, ripple, vortex36, chameleon,
dynamictendrils, morphingcoral, reactiveswarm, duelingmodulators, lumen, aurora,
bloom, and etching. Palettes and character sets are independent of the preset and
can be cycled at runtime.
## Gallery

Four showcase presets highlight specific visual levers:
<!-- ws6: preset/palette showcase gifs -->

- **lumen** — Bleuje-style front-lit veins: temporal-accent recolor of growing fronts.
- **aurora** — Luminous network glow: afterglow + soft diffusion + long faint tails.
- **bloom** — Banded coral depth via mirrored palette cycles.
There are 30 named presets: network, exploratory, tendrils, organic, fire, river,
petri, vortex, lightning, chaosedge, blob, slime, vines, vinescii, smoke, vortex36,
dynamictendrils, mold, etching, drift, constellation, mosaic, marble, prism, vellum,
forge, wane, gossamer, codex, and tide. The old names pulse, flocking, ripple, and
lumen are still accepted as CLI aliases. Palettes and character sets are independent of
the preset and can be cycled at runtime. Preset parameters are defined in
`src/simulation/config.rs` and `src/preset_sim_defaults.rs`.

Showcase presets highlight specific visual levers:

- **slime** — Pulsing network with strong deposits and the slime palette; auto-normalizes brightness.
- **vines** — Flocking-pattern filaments rendered without a window frame.
- **vinescii** — The vines pattern rendered in pure ASCII.
- **smoke** — Diffuse drift with the slate palette; auto-normalizes brightness.
- **mold** — Bleuje-style front-lit veins with the mold palette; auto-normalizes brightness.
- **etching** — Directional filament linework via Sobel glyph selection (Braille, TUI-only).
- **drift** — Color that shifts with motion direction (temporal Hue mode).
- **constellation** — Sparse star-map scatter via the Points charset; re-rolls layout on reset.
- **mosaic** — Posterized color bands: Quantize mapping + wrapped palette cycles.
- **marble** — Veined stone via heavy Gaussian diffusion + Perlin intensity mapping.
- **prism** — Maximum color resolution: HalfBlockDual charset + strong color anti-aliasing.
- **vellum** — Soft parchment density: Shade charset + logarithmic deposit curve.
- **forge** — Grainy molten thermal: exponential intensity mapping + afterglow.
- **wane** — Slow ghosting decay via low decay-gamma + power deposit curve.
- **gossamer** — Delicate Braille threads with brightness glyphs + power mapping.
- **codex** — Typographic engraving: custom ASCII charset + sigmoid contrast.
- **tide** — Living water with animated hue-shift over time.

Six new palettes accompany them: **jade** (mid-saturation green), **amber** (warm
earth), **slate** (cool stone grey), **pastel** (high-key airy), **ink** (duotone
ink-on-paper), and **copper** (oxidized rust-to-verdigris).

## How it works

Expand Down
2 changes: 0 additions & 2 deletions benches/diffusion_benchmark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,6 @@ fn bench_afterglow_ema_pass(c: &mut Criterion) {
use tslime::Simulation;

let config = SimConfig {
afterglow: 0.4,
afterglow_rate: 0.05,
species_configs: vec![SpeciesConfig {
count: 100,
..Default::default()
Expand Down
Loading
Loading