• v1.2.0 299fc592bb

    jkaindl released this 2026-05-25 11:11:15 +00:00 | 359 commits to main since this release

    Engine

    • Free audio routing → 10 modulation targets. Pre-1.2 only knew
      moveSpeed, turnSpeed, depositAmount. Adds sensorDistance,
      rhythmAmplitude, chaosStrength on the agent side and exposure,
      bloomIntensity, saturation, contrast on the post side, so audio
      pulses can drive visually-loud parameters and not just motion.
    • Blend modes. New blendMode preset param picks how agents
      compose over the background. additive (default) keeps the
      historical glow-y look; paint alpha-composites agents over the bg
      in display space so dark inks on a bright paper look right
      (additive saturates everything to white at high bg brightness).
    • Long-exposure agent-head highlight. New headIntensity slider
      (0..3) overlays a bright stamp at each agent's current position on
      top of the persistent pheromone trail. Combined with high decayRate
      this gives a comet-head / long-exposure photography feel that the
      trail-only renderer couldn't produce. Backed by a dedicated heads
      buffer cleared every tick.
    • Kaleidoscope mode. New kaleidoscope slider (0 off, 1-6 mirror
      axes) folds the composite output into N-fold rotational symmetry.
    • Sim-speed multiplier. New simSpeed preset param (1-8×) runs
      multiple physics steps per rendered frame for faster pattern
      evolution without dropping render rate. Trade-off: ~N× GPU load.

    Editor & library

    • Collapsible sections in the editor with per-section reset
      buttons
      , so you can experiment in one area without losing edits
      elsewhere. All sections except Global start collapsed.
    • Per-parameter help tooltips (?) on every slider / colour / select.
      Renders via Portal so it's not clipped by section card boundaries.
    • Spawn-pattern respawn button next to the dropdown — re-seeds
      agents on demand without the R hotkey.
    • Last-selected preset persists across page reloads (localStorage).
    • Pre-baked thumbnails ship for every built-in preset
      (public/preset-thumbs/<id>.png). Re-generate via
      npm run bake:thumbnails. Custom presets still use the runtime
      per-session snapshot.
    • All 19 built-in presets re-characterised — each now owns a
      distinct post-processing fingerprint (bloom, feedback, vignette,
      saturation, contrast). Two new paint-mode presets demonstrate the
      ink-on-paper aesthetic; two new presets demo the head-highlight and
      kaleidoscope features (Comet Trail, Mandala).

    Bug fixes

    • Slider edits no longer trigger spurious resets. The seed-respawn
      effect was firing on any species-array replacement because
      on([…])-form deps don't dedup at the primitive level. Wrapped each
      in createMemo. Also stops the preset switch from respawning twice
      (immediate + 250 ms debounced).
    • Background color no longer saturates the agents. Was added in
      the scene shader, where the feedback loop amplified it by
      1/(1-feedbackAmount) ×20 at default settings. Moved to the
      composite pass — bg is now applied once per frame, not accumulated.
    • Bloom threshold slider actually does something across its whole
      range
      (was dead past ~0.2 because it operated on un-exposure-scaled
      HDR values). Now exposure-scaled in the bright pass.
    • Paint blend mode visible for dark inks. Was using max-channel
      brightness as alpha, so charcoal-coloured agents on white bg stayed
      invisible. Now uses a colour-agnostic density channel.
    • Tooltip popovers no longer clipped by the editor section card's
      overflow:hidden. Rendered via Portal with position:fixed.
    • Preset card names readable. They were inheriting the browser's
      ButtonText system colour on dark surfaces.
    • Population-share slider hidden in the All tab. Setting the same
      share on all three species just normalises to 1/3 / 1/3 / 1/3
      regardless of value — was effectively a "reset to equal" button.

    Refactor

    • Drop legacy global attractionStrength + repulsionStrength.
      Their effect is folded into the per-pair interaction matrix at
      preset-load time (schema preprocess) and at source-literal level
      (mk() helper) — exactly matches old behaviour, removes a redundant
      knob that overlapped the matrix.
    • Single-source respawn coordinator (src/ui/respawnCoordinator.ts)
      funnels nonce / preset-switch / debounced-seed-edit through one
      performRespawn callback, replacing three competing effects.

    Tooling

    • npm run bake:thumbnails runs the Playwright-based renderer that
      captures preset thumbnails. Requires headed Chromium (macOS headless
      Chrome doesn't expose WebGPU).
    • ?preset=<id> and ?bare=1 URL params for direct preset selection +
      UI-overlay-free screenshot bakes.
    • vitest now resolves solid-js to the client (reactive) build via
      resolve.conditions, so reactivity is actually testable in env: node.
    Downloads